]>
git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blob - frontend/js/app.js
4 function login(username
, password
) {
5 username
= username
|| app
.loginData
.username
;
6 password
= password
|| app
.loginData
.password
;
10 superagent
.get('/api/files/').query({ username: username
, password: password
}).end(function (error
, result
) {
13 if (error
) return console
.error(error
);
14 if (result
.statusCode
=== 401) return console
.error('Invalid credentials');
16 app
.session
.valid
= true;
17 app
.session
.username
= username
;
18 app
.session
.password
= password
;
20 // clearly not the best option
21 localStorage
.username
= username
;
22 localStorage
.password
= password
;
24 loadDirectory(window
.location
.hash
.slice(1));
29 app
.session
.valid
= false;
30 app
.session
.username
= null;
31 app
.session
.password
= null;
33 delete localStorage
.username
;
34 delete localStorage
.password
;
37 function sanitize(filePath
) {
38 filePath
= '/' + filePath
;
39 return filePath
.replace(/\/+/g, '/');
42 function encode(filePath
) {
43 return filePath
.split('/').map(encodeURIComponent
).join('/');
46 function decode(filePath
) {
47 return filePath
.split('/').map(decodeURIComponent
).join('/');
51 images: [ '.png', '.jpg', '.jpeg', '.tiff', '.gif' ],
52 text: [ '.txt', '.md' ],
54 html: [ '.html', '.htm', '.php' ],
55 video: [ '.mp4', '.mpg', '.mpeg', '.ogg', '.mkv' ]
58 function getPreviewUrl(entry
, basePath
) {
59 var path
= '/_admin/img/';
61 if (entry
.isDirectory
) return path
+ 'directory.png';
62 if (mimeTypes
.images
.some(function (e
) { return entry
.filePath
.endsWith(e
); })) return sanitize(basePath
+ '/' + entry
.filePath
);
63 if (mimeTypes
.text
.some(function (e
) { return entry
.filePath
.endsWith(e
); })) return path
+'text.png';
64 if (mimeTypes
.pdf
.some(function (e
) { return entry
.filePath
.endsWith(e
); })) return path
+ 'pdf.png';
65 if (mimeTypes
.html
.some(function (e
) { return entry
.filePath
.endsWith(e
); })) return path
+ 'html.png';
66 if (mimeTypes
.video
.some(function (e
) { return entry
.filePath
.endsWith(e
); })) return path
+ 'video.png';
68 return path
+ 'unknown.png';
72 loadDirectory(app
.path
);
75 function loadDirectory(filePath
) {
78 filePath
= filePath
? sanitize(filePath
) : '/';
80 superagent
.get('/api/files/' + encode(filePath
)).query({ username: app
.session
.username
, password: app
.session
.password
}).end(function (error
, result
) {
83 if (result
&& result
.statusCode
=== 401) return logout();
84 if (error
) return console
.error(error
);
86 result
.body
.entries
.sort(function (a
, b
) { return a
.isDirectory
&& b
.isFile
? -1 : 1; });
87 app
.entries
= result
.body
.entries
.map(function (entry
) {
88 entry
.previewUrl
= getPreviewUrl(entry
, filePath
);
92 app
.pathParts
= decode(filePath
).split('/').filter(function (e
) { return !!e
; }).map(function (e
, i
, a
) {
95 link: '#' + sanitize('/' + a
.slice(0, i
).join('/') + '/' + e
)
99 // update in case this was triggered from code
100 window
.location
.hash
= app
.path
;
102 Vue
.nextTick(function () {
104 $('[data-toggle="tooltip"]').tooltip();
110 function open(entry
) {
111 var path
= sanitize(app
.path
+ '/' + entry
.filePath
);
113 if (entry
.isDirectory
) {
114 window
.location
.hash
= path
;
118 window
.open(encode(path
));
122 window
.location
.hash
= sanitize(app
.path
.split('/').slice(0, -1).filter(function (p
) { return !!p
; }).join('/'));
126 $(app
.$els
.upload
).on('change', function () {
128 // detach event handler
129 $(app
.$els
.upload
).off('change');
133 count: app
.$els
.upload
.files
.length
,
138 function uploadFile(file
) {
139 var path
= encode(sanitize(app
.path
+ '/' + file
.name
));
141 var formData
= new FormData();
142 formData
.append('file', file
);
144 superagent
.post('/api/files' + path
).query({ username: app
.session
.username
, password: app
.session
.password
}).send(formData
).end(function (error
, result
) {
145 if (result
&& result
.statusCode
=== 401) return logout();
146 if (result
&& result
.statusCode
!== 201) console
.error('Error uploading file: ', result
.statusCode
);
147 if (error
) console
.error(error
);
149 app
.uploadStatus
.done
+= 1;
150 app
.uploadStatus
.percentDone
= Math
.round(app
.uploadStatus
.done
/ app
.uploadStatus
.count
* 100);
152 if (app
.uploadStatus
.done
>= app
.uploadStatus
.count
) {
165 for(var i
= 0; i
< app
.uploadStatus
.count
; ++i
) {
166 uploadFile(app
.$els
.upload
.files
[i
]);
170 // reset the form first to make the change handler retrigger even on the same file selected
171 $('#fileUploadForm')[0].reset();
173 app
.$els
.upload
.click();
176 function delAsk(entry
) {
177 $('#modalDelete').modal('show');
178 app
.deleteData
= entry
;
181 function del(entry
) {
184 var path
= encode(sanitize(app
.path
+ '/' + entry
.filePath
));
186 superagent
.del('/api/files' + path
).query({ username: app
.session
.username
, password: app
.session
.password
, recursive: true }).end(function (error
, result
) {
189 if (result
&& result
.statusCode
=== 401) return logout();
190 if (result
&& result
.statusCode
!== 200) return console
.error('Error deleting file: ', result
.statusCode
);
191 if (error
) return console
.error(error
);
195 $('#modalDelete').modal('hide');
199 function renameAsk(entry
) {
200 app
.renameData
.entry
= entry
;
201 app
.renameData
.error
= null;
202 app
.renameData
.newFilePath
= entry
.filePath
;
204 $('#modalRename').modal('show');
207 function rename(data
) {
210 var path
= encode(sanitize(app
.path
+ '/' + data
.entry
.filePath
));
211 var newFilePath
= sanitize(app
.path
+ '/' + data
.newFilePath
);
213 superagent
.put('/api/files' + path
).query({ username: app
.session
.username
, password: app
.session
.password
}).send({ newFilePath: newFilePath
}).end(function (error
, result
) {
216 if (result
&& result
.statusCode
=== 401) return logout();
217 if (result
&& result
.statusCode
!== 200) return console
.error('Error renaming file: ', result
.statusCode
);
218 if (error
) return console
.error(error
);
222 $('#modalRename').modal('hide');
226 function createDirectoryAsk() {
227 $('#modalcreateDirectory').modal('show');
228 app
.createDirectoryData
= '';
229 app
.createDirectoryError
= null;
232 function createDirectory(name
) {
234 app
.createDirectoryError
= null;
236 var path
= encode(sanitize(app
.path
+ '/' + name
));
238 superagent
.post('/api/files' + path
).query({ username: app
.session
.username
, password: app
.session
.password
, directory: true }).end(function (error
, result
) {
241 if (result
&& result
.statusCode
=== 401) return logout();
242 if (result
&& result
.statusCode
=== 403) {
243 app
.createDirectoryError
= 'Name not allowed';
246 if (result
&& result
.statusCode
=== 409) {
247 app
.createDirectoryError
= 'Directory already exists';
250 if (result
&& result
.statusCode
!== 201) return console
.error('Error creating directory: ', result
.statusCode
);
251 if (error
) return console
.error(error
);
253 app
.createDirectoryData
= '';
256 $('#modalcreateDirectory').modal('hide');
260 Vue
.filter('prettyDate', function (value
) {
261 var d
= new Date(value
);
262 return d
.toDateString();
265 Vue
.filter('prettyFileSize', function (value
) {
266 return filesize(value
);
291 createDirectoryData: '',
292 createDirectoryError: null,
298 loadDirectory: loadDirectory
,
304 renameAsk: renameAsk
,
306 createDirectoryAsk: createDirectoryAsk
,
307 createDirectory: createDirectory
313 login(localStorage
.username
, localStorage
.password
);
315 $(window
).on('hashchange', function () {
316 loadDirectory(window
.location
.hash
.slice(1));
319 // setup all the dialog focus handling
320 ['modalcreateDirectory'].forEach(function (id
) {
321 $('#' + id
).on('shown.bs.modal', function () {
322 $(this).find("[autofocus]:first").focus();