X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=frontend%2Fjs%2Fapp.js;h=6303a892984868c4d496b92efe04c556033e0028;hb=f43b3c162f5a0857d9fd56f4d8005763fcdca4cc;hp=d659b180c86a1c7b3972dc4d31254228af5718b2;hpb=13df9f95b03daec6f2ce4d5a5d2a62657e814d0d;p=perso%2FImmae%2FProjets%2FNodejs%2FSurfer.git diff --git a/frontend/js/app.js b/frontend/js/app.js index d659b18..6303a89 100644 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -1,6 +1,23 @@ (function () { 'use strict'; +// poor man's async +function asyncForEach(items, handler, callback) { + var cur = 0; + + if (items.length === 0) return callback(); + + (function iterator() { + handler(items[cur], function (error) { + if (error) return callback(error); + if (cur >= items.length-1) return callback(); + ++cur; + + iterator(); + }); + })(); +} + function getProfile(accessToken, callback) { callback = callback || function (error) { if (error) console.error(error); }; @@ -18,7 +35,13 @@ function getProfile(accessToken, callback) { app.session.username = result.body.username; app.session.valid = true; - callback(); + superagent.get('/api/settings').query({ access_token: localStorage.accessToken }).end(function (error, result) { + if (error) console.error(error); + + app.folderListingEnabled = !!result.body.folderListingEnabled; + + callback(); + }); }); } @@ -107,21 +130,15 @@ function open(row, event, column) { window.open(encode(path)); } -function up() { - window.location.hash = sanitize(app.path.split('/').slice(0, -1).filter(function (p) { return !!p; }).join('/')); -} - function uploadFiles(files) { if (!files || !files.length) return; - app.uploadStatus = { - busy: true, - count: files.length, - done: 0, - percentDone: 0 - }; + app.uploadStatus.busy = true; + app.uploadStatus.count = files.length; + app.uploadStatus.done = 0; + app.uploadStatus.percentDone = 0; - function uploadFile(file) { + asyncForEach(files, function (file, callback) { var path = encode(sanitize(app.path + '/' + file.name)); var formData = new FormData(); @@ -129,28 +146,24 @@ function uploadFiles(files) { superagent.post('/api/files' + path).query({ access_token: localStorage.accessToken }).send(formData).end(function (error, result) { if (result && result.statusCode === 401) return logout(); - if (result && result.statusCode !== 201) console.error('Error uploading file: ', result.statusCode); - if (error) console.error(error); + if (result && result.statusCode !== 201) return callback('Error uploading file: ', result.statusCode); + if (error) return callback(error); app.uploadStatus.done += 1; app.uploadStatus.percentDone = Math.round(app.uploadStatus.done / app.uploadStatus.count * 100); - if (app.uploadStatus.done >= app.uploadStatus.count) { - app.uploadStatus = { - busy: false, - count: 0, - done: 0, - percentDone: 100 - }; - - refresh(); - } + callback(); }); - } + }, function (error) { + if (error) console.error(error); - for(var i = 0; i < app.uploadStatus.count; ++i) { - uploadFile(files[i]); - } + app.uploadStatus.busy = false; + app.uploadStatus.count = 0; + app.uploadStatus.done = 0; + app.uploadStatus.percentDone = 100; + + refresh(); + }); } function dragOver(event) { @@ -204,7 +217,9 @@ var app = new Vue({ }, onOptionsMenu: function (command) { if (command === 'folderListing') { - console.log('Not implemented'); + superagent.put('/api/settings').send({ folderListingEnabled: this.folderListingEnabled }).query({ access_token: localStorage.accessToken }).end(function (error) { + if (error) console.error(error); + }); } else if (command === 'about') { this.$msgbox({ title: 'About Surfer', @@ -317,7 +332,9 @@ var app = new Vue({ return filesize(cellValue); }, loadDirectory: loadDirectory, - up: up, + onUp: function () { + window.location.hash = sanitize(app.path.split('/').slice(0, -1).filter(function (p) { return !!p; }).join('/')); + }, open: open, drop: drop, dragOver: dragOver