X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=frontend%2Fjs%2Fapp.js;h=9a6251b37d036e1d84427d22a6748ce27c16430a;hb=ca5a757fab6de89ff0ee49983797e136c2b2a747;hp=26791878faa55370ca31b1902019129069ea9040;hpb=5c17272a887a2b5ff4810c64c68a2bbc49825291;p=perso%2FImmae%2FProjets%2FNodejs%2FSurfer.git diff --git a/frontend/js/app.js b/frontend/js/app.js index 2679187..9a6251b 100644 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -1,6 +1,11 @@ (function () { 'use strict'; +/* global superagent */ +/* global Vue */ +/* global $ */ +/* global filesize */ + // poor man's async function asyncForEach(items, handler, callback) { var cur = 0; @@ -60,7 +65,7 @@ var mimeTypes = { text: [ '.txt', '.md' ], pdf: [ '.pdf' ], html: [ '.html', '.htm', '.php' ], - video: [ '.mp4', '.mpg', '.mpeg', '.ogg', '.mkv' ] + video: [ '.mp4', '.mpg', '.mpeg', '.ogg', '.mkv', '.avi', '.mov' ] }; function getPreviewUrl(entry, basePath) { @@ -86,6 +91,16 @@ function refresh() { loadDirectory(app.path); } +function logout() { + superagent.post('/api/logout').query({ access_token: localStorage.accessToken }).end(function (error) { + if (error) console.error(error); + + app.session.valid = false; + + delete localStorage.accessToken; + }); +} + function loadDirectory(filePath) { app.busy = true; @@ -101,6 +116,8 @@ function loadDirectory(filePath) { app.entries = result.body.entries.map(function (entry) { entry.previewUrl = getPreviewUrl(entry, filePath); entry.extension = getExtension(entry); + entry.rename = false; + entry.filePathNew = entry.filePath; return entry; }); app.path = filePath; @@ -117,6 +134,9 @@ function loadDirectory(filePath) { } function open(row, event, column) { + // ignore item open on row clicks if we are renaming this entry + if (row.rename) return; + var path = sanitize(app.path + '/' + row.filePath); if (row.isDirectory) { @@ -146,12 +166,18 @@ function uploadFiles(files) { var formData = new FormData(); formData.append('file', file); + var finishedUploadSize = app.uploadStatus.done; + superagent.post('/api/files' + path) .query({ access_token: localStorage.accessToken }) .send(formData) .on('progress', function (event) { - app.uploadStatus.done += event.loaded; - app.uploadStatus.percentDone = Math.round(app.uploadStatus.done / app.uploadStatus.size * 100); + // only handle upload events + if (!(event.target instanceof XMLHttpRequestUpload)) return; + + app.uploadStatus.done = finishedUploadSize + event.loaded; + var tmp = Math.round(app.uploadStatus.done / app.uploadStatus.size * 100); + app.uploadStatus.percentDone = tmp > 100 ? 100 : tmp; }).end(function (error, result) { if (result && result.statusCode === 401) return logout(); if (result && result.statusCode !== 201) return callback('Error uploading file: ', result.statusCode); @@ -233,6 +259,7 @@ var app = new Vue({ data: { ready: false, busy: false, + origin: window.location.origin, uploadStatus: { busy: false, count: 0, @@ -268,13 +295,11 @@ var app = new Vue({ getProfile(result.body.accessToken, function (error) { if (error) return console.error(error); - loadDirectory(window.location.hash.slice(1)); + loadDirectory(decode(window.location.hash.slice(1))); }); }); }, onOptionsMenu: function (command) { - var that = this; - if (command === 'folderListing') { superagent.put('/api/settings').send({ folderListingEnabled: this.folderListingEnabled }).query({ access_token: localStorage.accessToken }).end(function (error) { if (error) console.error(error); @@ -290,13 +315,7 @@ var app = new Vue({ center: true }).then(function () {}).catch(function () {}); } else if (command === 'logout') { - superagent.post('/api/logout').query({ access_token: localStorage.accessToken }).end(function (error) { - if (error) console.error(error); - - that.session.valid = false; - - delete localStorage.accessToken; - }); + logout(); } }, onDownload: function (entry) { @@ -345,22 +364,42 @@ var app = new Vue({ }); }).catch(function () {}); }, - onRename: function (entry) { + onRename: function (entry, scope) { + if (entry.rename) return entry.rename = false; + + entry.rename = true; + + Vue.nextTick(function () { + var elem = document.getElementById('filePathRenameInputId-' + scope.$index); + elem.focus(); + + if (typeof elem.selectionStart != "undefined") { + elem.selectionStart = 0; + elem.selectionEnd = entry.filePath.lastIndexOf('.'); + } + }); + }, + onRenameEnd: function (entry) { + entry.rename = false; + entry.filePathNew = entry.filePath; + }, + onRenameSubmit: function (entry) { var that = this; - var title = 'Rename ' + entry.filePath; - this.$prompt('', title, { confirmButtonText: 'Yes', cancelButtonText: 'No', inputPlaceholder: 'new filename', inputValue: entry.filePath }).then(function (data) { - var path = encode(sanitize(that.path + '/' + entry.filePath)); - var newFilePath = sanitize(that.path + '/' + data.value); + entry.rename = false; - superagent.put('/api/files' + path).query({ access_token: localStorage.accessToken }).send({ newFilePath: newFilePath }).end(function (error, result) { - if (result && result.statusCode === 401) return logout(); - if (result && result.statusCode !== 200) return that.$message.error('Error renaming file: ' + result.statusCode); - if (error) return that.$message.error(error.message); + if (entry.filePathNew === entry.filePath) return; - refresh(); - }); - }).catch(function () {}); + var path = encode(sanitize(this.path + '/' + entry.filePath)); + var newFilePath = sanitize(this.path + '/' + entry.filePathNew); + + superagent.put('/api/files' + path).query({ access_token: localStorage.accessToken }).send({ newFilePath: newFilePath }).end(function (error, result) { + if (result && result.statusCode === 401) return logout(); + if (result && result.statusCode !== 200) return that.$message.error('Error renaming file: ' + result.statusCode); + if (error) return that.$message.error(error.message); + + entry.filePath = entry.filePathNew; + }); }, onNewFolder: function () { var that = this; @@ -416,11 +455,11 @@ var app = new Vue({ getProfile(localStorage.accessToken, function (error) { if (error) return console.error(error); - loadDirectory(window.location.hash.slice(1)); + loadDirectory(decode(window.location.hash.slice(1))); }); $(window).on('hashchange', function () { - loadDirectory(window.location.hash.slice(1)); + loadDirectory(decode(window.location.hash.slice(1))); }); })();