@@ -22,18 +22,17 @@
diff --git a/frontend/src/components/settings/Commands.vue b/frontend/src/components/settings/Commands.vue
index 62a4ea25..73799fce 100644
--- a/frontend/src/components/settings/Commands.vue
+++ b/frontend/src/components/settings/Commands.vue
@@ -1,28 +1,30 @@
-
{{ $t('settings.userCommands') }}
-
{{ $t('settings.userCommandsHelp') }} git svn hg .
-
+
{{ $t("settings.userCommands") }}
+
+ {{ $t("settings.userCommandsHelp") }} git svn hg .
+
+
diff --git a/frontend/src/components/settings/Languages.vue b/frontend/src/components/settings/Languages.vue
index 39c699e8..08f64749 100644
--- a/frontend/src/components/settings/Languages.vue
+++ b/frontend/src/components/settings/Languages.vue
@@ -1,46 +1,50 @@
- {{ $t('languages.' + language) }}
+
+ {{ $t("languages." + language) }}
+
diff --git a/frontend/src/components/settings/Permissions.vue b/frontend/src/components/settings/Permissions.vue
index 20603737..13d2b936 100644
--- a/frontend/src/components/settings/Permissions.vue
+++ b/frontend/src/components/settings/Permissions.vue
@@ -1,41 +1,65 @@
diff --git a/frontend/src/components/settings/Rules.vue b/frontend/src/components/settings/Rules.vue
index 36f952c4..8f3c45eb 100644
--- a/frontend/src/components/settings/Rules.vue
+++ b/frontend/src/components/settings/Rules.vue
@@ -1,57 +1,63 @@
diff --git a/frontend/src/components/settings/Themes.vue b/frontend/src/components/settings/Themes.vue
index 48a663bd..a2ccfa6b 100644
--- a/frontend/src/components/settings/Themes.vue
+++ b/frontend/src/components/settings/Themes.vue
@@ -1,18 +1,18 @@
- {{ $t('settings.themes.light') }}
- {{ $t('settings.themes.dark') }}
+ {{ $t("settings.themes.light") }}
+ {{ $t("settings.themes.dark") }}
\ No newline at end of file
+ change(event) {
+ this.$emit("update:theme", event.target.value);
+ },
+ },
+};
+
diff --git a/frontend/src/components/settings/UserForm.vue b/frontend/src/components/settings/UserForm.vue
index 8082d5e1..15504a11 100644
--- a/frontend/src/components/settings/UserForm.vue
+++ b/frontend/src/components/settings/UserForm.vue
@@ -1,67 +1,92 @@
diff --git a/frontend/src/i18n/index.js b/frontend/src/i18n/index.js
index 25e1dc2b..5babbd13 100644
--- a/frontend/src/i18n/index.js
+++ b/frontend/src/i18n/index.js
@@ -1,116 +1,116 @@
-import Vue from 'vue'
-import VueI18n from 'vue-i18n'
+import Vue from "vue";
+import VueI18n from "vue-i18n";
-import ar from './ar.json'
-import de from './de.json'
-import en from './en.json'
-import es from './es.json'
-import fr from './fr.json'
-import is from './is.json'
-import it from './it.json'
-import ja from './ja.json'
-import ko from './ko.json'
-import nlBE from './nl-be.json'
-import pl from './pl.json'
-import pt from './pt.json'
-import ptBR from './pt-br.json'
-import ro from './ro.json'
-import ru from './ru.json'
-import svSE from './sv-se.json'
-import zhCN from './zh-cn.json'
-import zhTW from './zh-tw.json'
+import ar from "./ar.json";
+import de from "./de.json";
+import en from "./en.json";
+import es from "./es.json";
+import fr from "./fr.json";
+import is from "./is.json";
+import it from "./it.json";
+import ja from "./ja.json";
+import ko from "./ko.json";
+import nlBE from "./nl-be.json";
+import pl from "./pl.json";
+import pt from "./pt.json";
+import ptBR from "./pt-br.json";
+import ro from "./ro.json";
+import ru from "./ru.json";
+import svSE from "./sv-se.json";
+import zhCN from "./zh-cn.json";
+import zhTW from "./zh-tw.json";
-Vue.use(VueI18n)
+Vue.use(VueI18n);
-export function detectLocale () {
- let locale = (navigator.language || navigator.browserLangugae).toLowerCase()
+export function detectLocale() {
+ let locale = (navigator.language || navigator.browserLangugae).toLowerCase();
switch (true) {
case /^ar.*/i.test(locale):
- locale = 'ar'
- break
+ locale = "ar";
+ break;
case /^es.*/i.test(locale):
- locale = 'es'
- break
+ locale = "es";
+ break;
case /^en.*/i.test(locale):
- locale = 'en'
- break
+ locale = "en";
+ break;
case /^it.*/i.test(locale):
- locale = 'it'
- break
+ locale = "it";
+ break;
case /^fr.*/i.test(locale):
- locale = 'fr'
- break
+ locale = "fr";
+ break;
case /^pt.*/i.test(locale):
- locale = 'pt'
- break
+ locale = "pt";
+ break;
case /^pt-BR.*/i.test(locale):
- locale = 'pt-br'
- break
+ locale = "pt-br";
+ break;
case /^ja.*/i.test(locale):
- locale = 'ja'
- break
+ locale = "ja";
+ break;
case /^zh-CN/i.test(locale):
- locale = 'zh-cn'
- break
+ locale = "zh-cn";
+ break;
case /^zh-TW/i.test(locale):
- locale = 'zh-tw'
- break
+ locale = "zh-tw";
+ break;
case /^zh.*/i.test(locale):
- locale = 'zh-cn'
- break
+ locale = "zh-cn";
+ break;
case /^de.*/i.test(locale):
- locale = 'de'
- break
+ locale = "de";
+ break;
case /^ru.*/i.test(locale):
- locale = 'ru'
- break
+ locale = "ru";
+ break;
case /^pl.*/i.test(locale):
- locale = 'pl'
- break
+ locale = "pl";
+ break;
case /^ko.*/i.test(locale):
- locale = 'ko'
- break
+ locale = "ko";
+ break;
default:
- locale = 'en'
+ locale = "en";
}
- return locale
+ return locale;
}
const removeEmpty = (obj) =>
- Object.keys(obj)
- .filter((k) => obj[k] !== null && obj[k] !== undefined && obj[k] !== '') // Remove undef. and null and empty.string.
- .reduce(
- (newObj, k) =>
- typeof obj[k] === 'object'
- ? Object.assign(newObj, { [k]: removeEmpty(obj[k]) }) // Recurse.
- : Object.assign(newObj, { [k]: obj[k] }), // Copy value.
- {},
- );
+ Object.keys(obj)
+ .filter((k) => obj[k] !== null && obj[k] !== undefined && obj[k] !== "") // Remove undef. and null and empty.string.
+ .reduce(
+ (newObj, k) =>
+ typeof obj[k] === "object"
+ ? Object.assign(newObj, { [k]: removeEmpty(obj[k]) }) // Recurse.
+ : Object.assign(newObj, { [k]: obj[k] }), // Copy value.
+ {}
+ );
const i18n = new VueI18n({
locale: detectLocale(),
- fallbackLocale: 'en',
+ fallbackLocale: "en",
messages: {
- 'ar': removeEmpty(ar),
- 'de': removeEmpty(de),
- 'en': en,
- 'es': removeEmpty(es),
- 'fr': removeEmpty(fr),
- 'is': removeEmpty(is),
- 'it': removeEmpty(it),
- 'ja': removeEmpty(ja),
- 'ko': removeEmpty(ko),
- 'nl-be': removeEmpty(nlBE),
- 'pl': removeEmpty(pl),
- 'pt-br': removeEmpty(ptBR),
- 'pt': removeEmpty(pt),
- 'ru': removeEmpty(ru),
- 'ro': removeEmpty(ro),
- 'sv-se': removeEmpty(svSE),
- 'zh-cn': removeEmpty(zhCN),
- 'zh-tw': removeEmpty(zhTW)
- }
-})
+ ar: removeEmpty(ar),
+ de: removeEmpty(de),
+ en: en,
+ es: removeEmpty(es),
+ fr: removeEmpty(fr),
+ is: removeEmpty(is),
+ it: removeEmpty(it),
+ ja: removeEmpty(ja),
+ ko: removeEmpty(ko),
+ "nl-be": removeEmpty(nlBE),
+ pl: removeEmpty(pl),
+ "pt-br": removeEmpty(ptBR),
+ pt: removeEmpty(pt),
+ ru: removeEmpty(ru),
+ ro: removeEmpty(ro),
+ "sv-se": removeEmpty(svSE),
+ "zh-cn": removeEmpty(zhCN),
+ "zh-tw": removeEmpty(zhTW),
+ },
+});
-export default i18n
+export default i18n;
diff --git a/frontend/src/main.js b/frontend/src/main.js
index 520bb8d7..035c32eb 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -1,43 +1,43 @@
-import { sync } from 'vuex-router-sync'
-import store from '@/store'
-import router from '@/router'
-import i18n from '@/i18n'
-import Vue from '@/utils/vue'
-import { recaptcha, loginPage } from '@/utils/constants'
-import { login, validateLogin } from '@/utils/auth'
-import App from '@/App'
+import { sync } from "vuex-router-sync";
+import store from "@/store";
+import router from "@/router";
+import i18n from "@/i18n";
+import Vue from "@/utils/vue";
+import { recaptcha, loginPage } from "@/utils/constants";
+import { login, validateLogin } from "@/utils/auth";
+import App from "@/App";
-sync(store, router)
+sync(store, router);
-async function start () {
+async function start() {
if (loginPage) {
- await validateLogin()
+ await validateLogin();
} else {
- await login('', '', '')
+ await login("", "", "");
}
if (recaptcha) {
- await new Promise (resolve => {
+ await new Promise((resolve) => {
const check = () => {
- if (typeof window.grecaptcha === 'undefined') {
- setTimeout(check, 100)
+ if (typeof window.grecaptcha === "undefined") {
+ setTimeout(check, 100);
} else {
- resolve()
+ resolve();
}
- }
+ };
- check()
- })
+ check();
+ });
}
new Vue({
- el: '#app',
+ el: "#app",
store,
router,
i18n,
- template: '
',
- components: { App }
- })
+ template: "
",
+ components: { App },
+ });
}
-start()
+start();
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
index 367a73e1..0b77cdf2 100644
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -1,166 +1,166 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import Login from '@/views/Login'
-import Layout from '@/views/Layout'
-import Files from '@/views/Files'
-import Share from '@/views/Share'
-import Users from '@/views/settings/Users'
-import User from '@/views/settings/User'
-import Settings from '@/views/Settings'
-import GlobalSettings from '@/views/settings/Global'
-import ProfileSettings from '@/views/settings/Profile'
-import Shares from '@/views/settings/Shares'
-import Errors from '@/views/Errors'
-import store from '@/store'
-import { baseURL } from '@/utils/constants'
+import Vue from "vue";
+import Router from "vue-router";
+import Login from "@/views/Login";
+import Layout from "@/views/Layout";
+import Files from "@/views/Files";
+import Share from "@/views/Share";
+import Users from "@/views/settings/Users";
+import User from "@/views/settings/User";
+import Settings from "@/views/Settings";
+import GlobalSettings from "@/views/settings/Global";
+import ProfileSettings from "@/views/settings/Profile";
+import Shares from "@/views/settings/Shares";
+import Errors from "@/views/Errors";
+import store from "@/store";
+import { baseURL } from "@/utils/constants";
-Vue.use(Router)
+Vue.use(Router);
const router = new Router({
base: baseURL,
- mode: 'history',
+ mode: "history",
routes: [
{
- path: '/login',
- name: 'Login',
+ path: "/login",
+ name: "Login",
component: Login,
beforeEnter: (to, from, next) => {
if (store.getters.isLogged) {
- return next({ path: '/files' })
+ return next({ path: "/files" });
}
- document.title = 'Login'
- next()
- }
+ document.title = "Login";
+ next();
+ },
},
{
- path: '/*',
+ path: "/*",
component: Layout,
children: [
{
- path: '/share/*',
- name: 'Share',
- component: Share
+ path: "/share/*",
+ name: "Share",
+ component: Share,
},
{
- path: '/files/*',
- name: 'Files',
+ path: "/files/*",
+ name: "Files",
component: Files,
meta: {
- requiresAuth: true
- }
+ requiresAuth: true,
+ },
},
{
- path: '/settings',
- name: 'Settings',
+ path: "/settings",
+ name: "Settings",
component: Settings,
redirect: {
- path: '/settings/profile'
+ path: "/settings/profile",
},
meta: {
- requiresAuth: true
+ requiresAuth: true,
},
children: [
{
- path: '/settings/profile',
- name: 'Profile Settings',
- component: ProfileSettings
+ path: "/settings/profile",
+ name: "Profile Settings",
+ component: ProfileSettings,
},
{
- path: '/settings/shares',
- name: 'Shares',
- component: Shares
+ path: "/settings/shares",
+ name: "Shares",
+ component: Shares,
},
{
- path: '/settings/global',
- name: 'Global Settings',
+ path: "/settings/global",
+ name: "Global Settings",
component: GlobalSettings,
meta: {
- requiresAdmin: true
- }
+ requiresAdmin: true,
+ },
},
{
- path: '/settings/users',
- name: 'Users',
+ path: "/settings/users",
+ name: "Users",
component: Users,
meta: {
- requiresAdmin: true
- }
+ requiresAdmin: true,
+ },
},
{
- path: '/settings/users/*',
- name: 'User',
+ path: "/settings/users/*",
+ name: "User",
component: User,
meta: {
- requiresAdmin: true
- }
- }
- ]
+ requiresAdmin: true,
+ },
+ },
+ ],
},
{
- path: '/403',
- name: 'Forbidden',
+ path: "/403",
+ name: "Forbidden",
component: Errors,
props: {
errorCode: 403,
- showHeader: true
- }
+ showHeader: true,
+ },
},
{
- path: '/404',
- name: 'Not Found',
+ path: "/404",
+ name: "Not Found",
component: Errors,
props: {
errorCode: 404,
- showHeader: true
- }
+ showHeader: true,
+ },
},
{
- path: '/500',
- name: 'Internal Server Error',
+ path: "/500",
+ name: "Internal Server Error",
component: Errors,
props: {
errorCode: 500,
- showHeader: true
- }
+ showHeader: true,
+ },
},
{
- path: '/files',
+ path: "/files",
redirect: {
- path: '/files/'
- }
+ path: "/files/",
+ },
},
{
- path: '/*',
- redirect: to => `/files${to.path}`
- }
- ]
- }
- ]
-})
+ path: "/*",
+ redirect: (to) => `/files${to.path}`,
+ },
+ ],
+ },
+ ],
+});
router.beforeEach((to, from, next) => {
- document.title = to.name
+ document.title = to.name;
- if (to.matched.some(record => record.meta.requiresAuth)) {
+ if (to.matched.some((record) => record.meta.requiresAuth)) {
if (!store.getters.isLogged) {
next({
- path: '/login',
- query: { redirect: to.fullPath }
- })
+ path: "/login",
+ query: { redirect: to.fullPath },
+ });
- return
+ return;
}
- if (to.matched.some(record => record.meta.requiresAdmin)) {
+ if (to.matched.some((record) => record.meta.requiresAdmin)) {
if (!store.state.user.perm.admin) {
- next({ path: '/403' })
- return
+ next({ path: "/403" });
+ return;
}
}
}
- next()
-})
+ next();
+});
-export default router
+export default router;
diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js
index 0c466f9d..8f1a8a4c 100644
--- a/frontend/src/store/getters.js
+++ b/frontend/src/store/getters.js
@@ -1,16 +1,16 @@
const getters = {
- isLogged: state => state.user !== null,
- isFiles: state => !state.loading && state.route.name === 'Files',
+ isLogged: (state) => state.user !== null,
+ isFiles: (state) => !state.loading && state.route.name === "Files",
isListing: (state, getters) => getters.isFiles && state.req.isDir,
- selectedCount: state => state.selected.length,
- progress : state => {
+ selectedCount: (state) => state.selected.length,
+ progress: (state) => {
if (state.upload.progress.length == 0) {
return 0;
}
- let sum = state.upload.progress.reduce((acc, val) => acc + val)
- return Math.ceil(sum / state.upload.size * 100);
- }
-}
+ let sum = state.upload.progress.reduce((acc, val) => acc + val);
+ return Math.ceil((sum / state.upload.size) * 100);
+ },
+};
-export default getters
+export default getters;
diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js
index 937f4266..1da37f64 100644
--- a/frontend/src/store/index.js
+++ b/frontend/src/store/index.js
@@ -1,20 +1,20 @@
-import Vue from 'vue'
-import Vuex from 'vuex'
-import mutations from './mutations'
-import getters from './getters'
-import upload from './modules/upload'
+import Vue from "vue";
+import Vuex from "vuex";
+import mutations from "./mutations";
+import getters from "./getters";
+import upload from "./modules/upload";
-Vue.use(Vuex)
+Vue.use(Vuex);
const state = {
user: null,
req: {},
oldReq: {},
clipboard: {
- key: '',
- items: []
+ key: "",
+ items: [],
},
- jwt: '',
+ jwt: "",
progress: 0,
loading: false,
reload: false,
@@ -22,13 +22,13 @@ const state = {
multiple: false,
show: null,
showShell: false,
- showConfirm: null
-}
+ showConfirm: null,
+};
export default new Vuex.Store({
strict: true,
state,
getters,
mutations,
- modules: { upload }
-})
+ modules: { upload },
+});
diff --git a/frontend/src/store/modules/upload.js b/frontend/src/store/modules/upload.js
index 6552dd01..b1a59bc8 100644
--- a/frontend/src/store/modules/upload.js
+++ b/frontend/src/store/modules/upload.js
@@ -1,7 +1,7 @@
-import Vue from 'vue'
-import { files as api } from '@/api'
-import throttle from 'lodash.throttle'
-import buttons from '@/utils/buttons'
+import Vue from "vue";
+import { files as api } from "@/api";
+import throttle from "lodash.throttle";
+import buttons from "@/utils/buttons";
const UPLOADS_LIMIT = 5;
@@ -10,93 +10,100 @@ const state = {
size: 0,
progress: [],
queue: [],
- uploads: {}
-}
+ uploads: {},
+};
const mutations = {
setProgress(state, { id, loaded }) {
- Vue.set(state.progress, id, loaded)
+ Vue.set(state.progress, id, loaded);
},
reset: (state) => {
- state.id = 0
- state.size = 0
- state.progress = []
+ state.id = 0;
+ state.size = 0;
+ state.progress = [];
},
addJob: (state, item) => {
- state.queue.push(item)
- state.size += item.file.size
- state.id++
+ state.queue.push(item);
+ state.size += item.file.size;
+ state.id++;
},
moveJob(state) {
- const item = state.queue[0]
- state.queue.shift()
- Vue.set(state.uploads, item.id, item)
+ const item = state.queue[0];
+ state.queue.shift();
+ Vue.set(state.uploads, item.id, item);
},
removeJob(state, id) {
- delete state.uploads[id]
- }
-}
+ delete state.uploads[id];
+ },
+};
const beforeUnload = (event) => {
- event.preventDefault()
- event.returnValue = ''
-}
+ event.preventDefault();
+ event.returnValue = "";
+};
const actions = {
upload: (context, item) => {
let uploadsCount = Object.keys(context.state.uploads).length;
- let isQueueEmpty = context.state.queue.length == 0
- let isUploadsEmpty = uploadsCount == 0
+ let isQueueEmpty = context.state.queue.length == 0;
+ let isUploadsEmpty = uploadsCount == 0;
if (isQueueEmpty && isUploadsEmpty) {
- window.addEventListener('beforeunload', beforeUnload)
- buttons.loading('upload')
+ window.addEventListener("beforeunload", beforeUnload);
+ buttons.loading("upload");
}
- context.commit('addJob', item)
- context.dispatch('processUploads')
+ context.commit("addJob", item);
+ context.dispatch("processUploads");
},
finishUpload: (context, item) => {
- context.commit('setProgress', { id: item.id, loaded: item.file.size })
- context.commit('removeJob', item.id)
- context.dispatch('processUploads')
+ context.commit("setProgress", { id: item.id, loaded: item.file.size });
+ context.commit("removeJob", item.id);
+ context.dispatch("processUploads");
},
processUploads: async (context) => {
let uploadsCount = Object.keys(context.state.uploads).length;
- let isBellowLimit = uploadsCount < UPLOADS_LIMIT
- let isQueueEmpty = context.state.queue.length == 0
- let isUploadsEmpty = uploadsCount == 0
+ let isBellowLimit = uploadsCount < UPLOADS_LIMIT;
+ let isQueueEmpty = context.state.queue.length == 0;
+ let isUploadsEmpty = uploadsCount == 0;
- let isFinished = isQueueEmpty && isUploadsEmpty
- let canProcess = isBellowLimit && !isQueueEmpty
+ let isFinished = isQueueEmpty && isUploadsEmpty;
+ let canProcess = isBellowLimit && !isQueueEmpty;
if (isFinished) {
- window.removeEventListener('beforeunload', beforeUnload)
- buttons.success('upload')
- context.commit('reset')
- context.commit('setReload', true, { root: true })
+ window.removeEventListener("beforeunload", beforeUnload);
+ buttons.success("upload");
+ context.commit("reset");
+ context.commit("setReload", true, { root: true });
}
if (canProcess) {
const item = context.state.queue[0];
- context.commit('moveJob')
+ context.commit("moveJob");
if (item.file.isDir) {
- await api.post(item.path).catch(Vue.prototype.$showError)
+ await api.post(item.path).catch(Vue.prototype.$showError);
} else {
let onUpload = throttle(
- (event) => context.commit('setProgress', { id: item.id, loaded: event.loaded }),
- 100, { leading: true, trailing: false }
- )
+ (event) =>
+ context.commit("setProgress", {
+ id: item.id,
+ loaded: event.loaded,
+ }),
+ 100,
+ { leading: true, trailing: false }
+ );
- await api.post(item.path, item.file, item.overwrite, onUpload).catch(Vue.prototype.$showError)
+ await api
+ .post(item.path, item.file, item.overwrite, onUpload)
+ .catch(Vue.prototype.$showError);
}
- context.dispatch('finishUpload', item)
+ context.dispatch("finishUpload", item);
}
- }
-}
+ },
+};
-export default { state, mutations, actions, namespaced: true }
\ No newline at end of file
+export default { state, mutations, actions, namespaced: true };
diff --git a/frontend/src/store/mutations.js b/frontend/src/store/mutations.js
index 9e3d98d1..b60973b7 100644
--- a/frontend/src/store/mutations.js
+++ b/frontend/src/store/mutations.js
@@ -1,83 +1,87 @@
-import * as i18n from '@/i18n'
-import moment from 'moment'
+import * as i18n from "@/i18n";
+import moment from "moment";
const mutations = {
- closeHovers: state => {
- state.show = null
- state.showConfirm = null
+ closeHovers: (state) => {
+ state.show = null;
+ state.showConfirm = null;
},
toggleShell: (state) => {
- state.showShell = !state.showShell
+ state.showShell = !state.showShell;
},
showHover: (state, value) => {
- if (typeof value !== 'object') {
- state.show = value
- return
+ if (typeof value !== "object") {
+ state.show = value;
+ return;
}
- state.show = value.prompt
- state.showConfirm = value.confirm
+ state.show = value.prompt;
+ state.showConfirm = value.confirm;
},
showError: (state) => {
- state.show = 'error'
+ state.show = "error";
},
showSuccess: (state) => {
- state.show = 'success'
+ state.show = "success";
+ },
+ setLoading: (state, value) => {
+ state.loading = value;
+ },
+ setReload: (state, value) => {
+ state.reload = value;
},
- setLoading: (state, value) => { state.loading = value },
- setReload: (state, value) => { state.reload = value },
setUser: (state, value) => {
if (value === null) {
- state.user = null
- return
+ state.user = null;
+ return;
}
- let locale = value.locale
+ let locale = value.locale;
- if (locale === '') {
- locale = i18n.detectLocale()
+ if (locale === "") {
+ locale = i18n.detectLocale();
}
- moment.locale(locale)
- i18n.default.locale = locale
- state.user = value
+ moment.locale(locale);
+ i18n.default.locale = locale;
+ state.user = value;
},
setJWT: (state, value) => (state.jwt = value),
multiple: (state, value) => (state.multiple = value),
- addSelected: (state, value) => (state.selected.push(value)),
+ addSelected: (state, value) => state.selected.push(value),
removeSelected: (state, value) => {
- let i = state.selected.indexOf(value)
- if (i === -1) return
- state.selected.splice(i, 1)
+ let i = state.selected.indexOf(value);
+ if (i === -1) return;
+ state.selected.splice(i, 1);
},
resetSelected: (state) => {
- state.selected = []
+ state.selected = [];
},
updateUser: (state, value) => {
- if (typeof value !== 'object') return
+ if (typeof value !== "object") return;
for (let field in value) {
- if (field === 'locale') {
- moment.locale(value[field])
- i18n.default.locale = value[field]
+ if (field === "locale") {
+ moment.locale(value[field]);
+ i18n.default.locale = value[field];
}
- state.user[field] = value[field]
+ state.user[field] = value[field];
}
},
updateRequest: (state, value) => {
- state.oldReq = state.req
- state.req = value
+ state.oldReq = state.req;
+ state.req = value;
},
updateClipboard: (state, value) => {
- state.clipboard.key = value.key
- state.clipboard.items = value.items
- state.clipboard.path = value.path
+ state.clipboard.key = value.key;
+ state.clipboard.items = value.items;
+ state.clipboard.path = value.path;
},
resetClipboard: (state) => {
- state.clipboard.key = ''
- state.clipboard.items = []
- }
-}
+ state.clipboard.key = "";
+ state.clipboard.items = [];
+ },
+};
-export default mutations
+export default mutations;
diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js
index 7ae6c1fe..c174d772 100644
--- a/frontend/src/utils/auth.js
+++ b/frontend/src/utils/auth.js
@@ -1,88 +1,88 @@
-import store from '@/store'
-import router from '@/router'
-import { Base64 } from 'js-base64'
-import { baseURL } from '@/utils/constants'
+import store from "@/store";
+import router from "@/router";
+import { Base64 } from "js-base64";
+import { baseURL } from "@/utils/constants";
-export function parseToken (token) {
- const parts = token.split('.')
+export function parseToken(token) {
+ const parts = token.split(".");
if (parts.length !== 3) {
- throw new Error('token malformed')
+ throw new Error("token malformed");
}
- const data = JSON.parse(Base64.decode(parts[1]))
+ const data = JSON.parse(Base64.decode(parts[1]));
- localStorage.setItem('jwt', token)
- store.commit('setJWT', token)
- store.commit('setUser', data.user)
+ localStorage.setItem("jwt", token);
+ store.commit("setJWT", token);
+ store.commit("setUser", data.user);
}
-export async function validateLogin () {
+export async function validateLogin() {
try {
- if (localStorage.getItem('jwt')) {
- await renew(localStorage.getItem('jwt'))
+ if (localStorage.getItem("jwt")) {
+ await renew(localStorage.getItem("jwt"));
}
} catch (_) {
console.warn('Invalid JWT token in storage') // eslint-disable-line
}
}
-export async function login (username, password, recaptcha) {
- const data = { username, password, recaptcha }
+export async function login(username, password, recaptcha) {
+ const data = { username, password, recaptcha };
const res = await fetch(`${baseURL}/api/login`, {
- method: 'POST',
+ method: "POST",
headers: {
- 'Content-Type': 'application/json'
+ "Content-Type": "application/json",
},
- body: JSON.stringify(data)
- })
+ body: JSON.stringify(data),
+ });
- const body = await res.text()
+ const body = await res.text();
if (res.status === 200) {
- parseToken(body)
+ parseToken(body);
} else {
- throw new Error(body)
+ throw new Error(body);
}
}
-export async function renew (jwt) {
+export async function renew(jwt) {
const res = await fetch(`${baseURL}/api/renew`, {
- method: 'POST',
+ method: "POST",
headers: {
- 'X-Auth': jwt,
- }
- })
+ "X-Auth": jwt,
+ },
+ });
- const body = await res.text()
+ const body = await res.text();
if (res.status === 200) {
- parseToken(body)
+ parseToken(body);
} else {
- throw new Error(body)
+ throw new Error(body);
}
}
-export async function signup (username, password) {
- const data = { username, password }
+export async function signup(username, password) {
+ const data = { username, password };
const res = await fetch(`${baseURL}/api/signup`, {
- method: 'POST',
+ method: "POST",
headers: {
- 'Content-Type': 'application/json'
+ "Content-Type": "application/json",
},
- body: JSON.stringify(data)
- })
+ body: JSON.stringify(data),
+ });
if (res.status !== 200) {
- throw new Error(res.status)
+ throw new Error(res.status);
}
}
-export function logout () {
- store.commit('setJWT', '')
- store.commit('setUser', null)
- localStorage.setItem('jwt', null)
- router.push({path: '/login'})
+export function logout() {
+ store.commit("setJWT", "");
+ store.commit("setUser", null);
+ localStorage.setItem("jwt", null);
+ router.push({ path: "/login" });
}
diff --git a/frontend/src/utils/buttons.js b/frontend/src/utils/buttons.js
index 9f699db3..bf123878 100644
--- a/frontend/src/utils/buttons.js
+++ b/frontend/src/utils/buttons.js
@@ -1,70 +1,70 @@
-function loading (button) {
- let el = document.querySelector(`#${button}-button > i`)
+function loading(button) {
+ let el = document.querySelector(`#${button}-button > i`);
if (el === undefined || el === null) {
console.log('Error getting button ' + button) // eslint-disable-line
- return
+ return;
}
- if (el.innerHTML == 'autorenew' || el.innerHTML == 'done') {
- return
+ if (el.innerHTML == "autorenew" || el.innerHTML == "done") {
+ return;
}
- el.dataset.icon = el.innerHTML
- el.style.opacity = 0
+ el.dataset.icon = el.innerHTML;
+ el.style.opacity = 0;
setTimeout(() => {
- el.classList.add('spin')
- el.innerHTML = 'autorenew'
- el.style.opacity = 1
- }, 100)
+ el.classList.add("spin");
+ el.innerHTML = "autorenew";
+ el.style.opacity = 1;
+ }, 100);
}
-function done (button) {
- let el = document.querySelector(`#${button}-button > i`)
+function done(button) {
+ let el = document.querySelector(`#${button}-button > i`);
if (el === undefined || el === null) {
console.log('Error getting button ' + button) // eslint-disable-line
- return
+ return;
}
- el.style.opacity = 0
+ el.style.opacity = 0;
setTimeout(() => {
- el.classList.remove('spin')
- el.innerHTML = el.dataset.icon
- el.style.opacity = 1
- }, 100)
+ el.classList.remove("spin");
+ el.innerHTML = el.dataset.icon;
+ el.style.opacity = 1;
+ }, 100);
}
-function success (button) {
- let el = document.querySelector(`#${button}-button > i`)
+function success(button) {
+ let el = document.querySelector(`#${button}-button > i`);
if (el === undefined || el === null) {
console.log('Error getting button ' + button) // eslint-disable-line
- return
+ return;
}
- el.style.opacity = 0
+ el.style.opacity = 0;
setTimeout(() => {
- el.classList.remove('spin')
- el.innerHTML = 'done'
- el.style.opacity = 1
+ el.classList.remove("spin");
+ el.innerHTML = "done";
+ el.style.opacity = 1;
setTimeout(() => {
- el.style.opacity = 0
+ el.style.opacity = 0;
setTimeout(() => {
- el.innerHTML = el.dataset.icon
- el.style.opacity = 1
- }, 100)
- }, 500)
- }, 100)
+ el.innerHTML = el.dataset.icon;
+ el.style.opacity = 1;
+ }, 100);
+ }, 500);
+ }, 100);
}
export default {
loading,
done,
- success
-}
+ success,
+};
diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js
index d4a8fd79..9761339b 100644
--- a/frontend/src/utils/constants.js
+++ b/frontend/src/utils/constants.js
@@ -1,19 +1,19 @@
-const name = window.FileBrowser.Name || 'File Browser'
-const disableExternal = window.FileBrowser.DisableExternal
-const baseURL = window.FileBrowser.BaseURL
-const staticURL = window.FileBrowser.StaticURL
-const recaptcha = window.FileBrowser.ReCaptcha
-const recaptchaKey = window.FileBrowser.ReCaptchaKey
-const signup = window.FileBrowser.Signup
-const version = window.FileBrowser.Version
-const logoURL = `${staticURL}/img/logo.svg`
-const noAuth = window.FileBrowser.NoAuth
-const authMethod = window.FileBrowser.AuthMethod
-const loginPage = window.FileBrowser.LoginPage
-const theme = window.FileBrowser.Theme
-const enableThumbs = window.FileBrowser.EnableThumbs
-const resizePreview = window.FileBrowser.ResizePreview
-const enableExec = window.FileBrowser.EnableExec
+const name = window.FileBrowser.Name || "File Browser";
+const disableExternal = window.FileBrowser.DisableExternal;
+const baseURL = window.FileBrowser.BaseURL;
+const staticURL = window.FileBrowser.StaticURL;
+const recaptcha = window.FileBrowser.ReCaptcha;
+const recaptchaKey = window.FileBrowser.ReCaptchaKey;
+const signup = window.FileBrowser.Signup;
+const version = window.FileBrowser.Version;
+const logoURL = `${staticURL}/img/logo.svg`;
+const noAuth = window.FileBrowser.NoAuth;
+const authMethod = window.FileBrowser.AuthMethod;
+const loginPage = window.FileBrowser.LoginPage;
+const theme = window.FileBrowser.Theme;
+const enableThumbs = window.FileBrowser.EnableThumbs;
+const resizePreview = window.FileBrowser.ResizePreview;
+const enableExec = window.FileBrowser.EnableExec;
export {
name,
@@ -30,5 +30,5 @@ export {
theme,
enableThumbs,
resizePreview,
- enableExec
-}
+ enableExec,
+};
diff --git a/frontend/src/utils/cookie.js b/frontend/src/utils/cookie.js
index 5004b602..72d59be4 100644
--- a/frontend/src/utils/cookie.js
+++ b/frontend/src/utils/cookie.js
@@ -1,4 +1,6 @@
export default function (name) {
- let re = new RegExp('(?:(?:^|.*;\\s*)' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$')
- return document.cookie.replace(re, '$1')
+ let re = new RegExp(
+ "(?:(?:^|.*;\\s*)" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$"
+ );
+ return document.cookie.replace(re, "$1");
}
diff --git a/frontend/src/utils/css.js b/frontend/src/utils/css.js
index 15ab99fe..405c0dd2 100644
--- a/frontend/src/utils/css.js
+++ b/frontend/src/utils/css.js
@@ -1,28 +1,28 @@
-export default function getRule (rules) {
+export default function getRule(rules) {
for (let i = 0; i < rules.length; i++) {
- rules[i] = rules[i].toLowerCase()
+ rules[i] = rules[i].toLowerCase();
}
- let result = null
- let find = Array.prototype.find
+ let result = null;
+ let find = Array.prototype.find;
- find.call(document.styleSheets, styleSheet => {
- result = find.call(styleSheet.cssRules, cssRule => {
- let found = false
+ find.call(document.styleSheets, (styleSheet) => {
+ result = find.call(styleSheet.cssRules, (cssRule) => {
+ let found = false;
if (cssRule instanceof window.CSSStyleRule) {
for (let i = 0; i < rules.length; i++) {
if (cssRule.selectorText.toLowerCase() === rules[i]) {
- found = true
+ found = true;
}
}
}
- return found
- })
+ return found;
+ });
- return result != null
- })
+ return result != null;
+ });
- return result
+ return result;
}
diff --git a/frontend/src/utils/upload.js b/frontend/src/utils/upload.js
index a43f5787..1ab4bb65 100644
--- a/frontend/src/utils/upload.js
+++ b/frontend/src/utils/upload.js
@@ -1,124 +1,127 @@
-import store from '@/store'
-import url from '@/utils/url'
+import store from "@/store";
+import url from "@/utils/url";
export function checkConflict(files, items) {
- if (typeof items === 'undefined' || items === null) {
- items = []
+ if (typeof items === "undefined" || items === null) {
+ items = [];
}
- let folder_upload = files[0].fullPath !== undefined
+ let folder_upload = files[0].fullPath !== undefined;
- let conflict = false
+ let conflict = false;
for (let i = 0; i < files.length; i++) {
- let file = files[i]
- let name = file.name
+ let file = files[i];
+ let name = file.name;
if (folder_upload) {
- let dirs = file.fullPath.split("/")
+ let dirs = file.fullPath.split("/");
if (dirs.length > 1) {
- name = dirs[0]
+ name = dirs[0];
}
}
let res = items.findIndex(function hasConflict(element) {
- return (element.name === this)
- }, name)
+ return element.name === this;
+ }, name);
if (res >= 0) {
- conflict = true
- break
+ conflict = true;
+ break;
}
}
- return conflict
+ return conflict;
}
export function scanFiles(dt) {
return new Promise((resolve) => {
- let reading = 0
- const contents = []
+ let reading = 0;
+ const contents = [];
if (dt.items !== undefined) {
for (let item of dt.items) {
- if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
- const entry = item.webkitGetAsEntry()
- readEntry(entry)
+ if (
+ item.kind === "file" &&
+ typeof item.webkitGetAsEntry === "function"
+ ) {
+ const entry = item.webkitGetAsEntry();
+ readEntry(entry);
}
}
} else {
- resolve(dt.files)
+ resolve(dt.files);
}
function readEntry(entry, directory = "") {
if (entry.isFile) {
- reading++
- entry.file(file => {
- reading--
+ reading++;
+ entry.file((file) => {
+ reading--;
- file.fullPath = `${directory}${file.name}`
- contents.push(file)
+ file.fullPath = `${directory}${file.name}`;
+ contents.push(file);
if (reading === 0) {
- resolve(contents)
+ resolve(contents);
}
- })
+ });
} else if (entry.isDirectory) {
const dir = {
isDir: true,
size: 0,
- fullPath: `${directory}${entry.name}`
- }
+ fullPath: `${directory}${entry.name}`,
+ };
- contents.push(dir)
+ contents.push(dir);
- readReaderContent(entry.createReader(), `${directory}${entry.name}`)
+ readReaderContent(entry.createReader(), `${directory}${entry.name}`);
}
}
function readReaderContent(reader, directory) {
- reading++
+ reading++;
reader.readEntries(function (entries) {
- reading--
+ reading--;
if (entries.length > 0) {
for (const entry of entries) {
- readEntry(entry, `${directory}/`)
+ readEntry(entry, `${directory}/`);
}
- readReaderContent(reader, `${directory}/`)
+ readReaderContent(reader, `${directory}/`);
}
if (reading === 0) {
- resolve(contents)
+ resolve(contents);
}
- })
+ });
}
- })
+ });
}
export function handleFiles(files, base, overwrite = false) {
for (let i = 0; i < files.length; i++) {
- let id = store.state.upload.id
- let path = base
- let file = files[i]
+ let id = store.state.upload.id;
+ let path = base;
+ let file = files[i];
if (file.fullPath !== undefined) {
- path += url.encodePath(file.fullPath)
+ path += url.encodePath(file.fullPath);
} else {
- path += url.encodeRFC5987ValueChars(file.name)
+ path += url.encodeRFC5987ValueChars(file.name);
}
if (file.isDir) {
- path += '/'
+ path += "/";
}
const item = {
id,
path,
file,
- overwrite
- }
+ overwrite,
+ };
- store.dispatch('upload/upload', item);
+ store.dispatch("upload/upload", item);
}
-}
\ No newline at end of file
+}
diff --git a/frontend/src/utils/url.js b/frontend/src/utils/url.js
index 30e0a658..8346bb03 100644
--- a/frontend/src/utils/url.js
+++ b/frontend/src/utils/url.js
@@ -1,31 +1,36 @@
-function removeLastDir (url) {
- var arr = url.split('/')
- if (arr.pop() === '') {
- arr.pop()
+function removeLastDir(url) {
+ var arr = url.split("/");
+ if (arr.pop() === "") {
+ arr.pop();
}
- return arr.join('/')
+ return arr.join("/");
}
// this code borrow from mozilla
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent#Examples
function encodeRFC5987ValueChars(str) {
- return encodeURIComponent(str).
+ return (
+ encodeURIComponent(str)
// Note that although RFC3986 reserves "!", RFC5987 does not,
// so we do not need to escape it
- replace(/['()]/g, escape). // i.e., %27 %28 %29
- replace(/\*/g, '%2A').
- // The following are not required for percent-encoding per RFC5987,
- // so we can allow for a little better readability over the wire: |`^
- replace(/%(?:7C|60|5E)/g, unescape);
+ .replace(/['()]/g, escape) // i.e., %27 %28 %29
+ .replace(/\*/g, "%2A")
+ // The following are not required for percent-encoding per RFC5987,
+ // so we can allow for a little better readability over the wire: |`^
+ .replace(/%(?:7C|60|5E)/g, unescape)
+ );
}
function encodePath(str) {
- return str.split('/').map(v => encodeURIComponent(v)).join('/')
+ return str
+ .split("/")
+ .map((v) => encodeURIComponent(v))
+ .join("/");
}
export default {
encodeRFC5987ValueChars: encodeRFC5987ValueChars,
removeLastDir: removeLastDir,
- encodePath: encodePath
-}
+ encodePath: encodePath,
+};
diff --git a/frontend/src/utils/vue.js b/frontend/src/utils/vue.js
index 313b60dd..74df7acc 100644
--- a/frontend/src/utils/vue.js
+++ b/frontend/src/utils/vue.js
@@ -1,58 +1,66 @@
-import Vue from 'vue'
-import Noty from 'noty'
-import VueLazyload from 'vue-lazyload'
-import i18n from '@/i18n'
-import { disableExternal } from '@/utils/constants'
+import Vue from "vue";
+import Noty from "noty";
+import VueLazyload from "vue-lazyload";
+import i18n from "@/i18n";
+import { disableExternal } from "@/utils/constants";
-Vue.use(VueLazyload)
+Vue.use(VueLazyload);
-Vue.config.productionTip = true
+Vue.config.productionTip = true;
const notyDefault = {
- type: 'info',
- layout: 'bottomRight',
+ type: "info",
+ layout: "bottomRight",
timeout: 1000,
- progressBar: true
-}
+ progressBar: true,
+};
Vue.prototype.$noty = (opts) => {
- new Noty(Object.assign({}, notyDefault, opts)).show()
-}
+ new Noty(Object.assign({}, notyDefault, opts)).show();
+};
Vue.prototype.$showSuccess = (message) => {
- new Noty(Object.assign({}, notyDefault, {
- text: message,
- type: 'success'
- })).show()
-}
+ new Noty(
+ Object.assign({}, notyDefault, {
+ text: message,
+ type: "success",
+ })
+ ).show();
+};
Vue.prototype.$showError = (error, displayReport = true) => {
let btns = [
- Noty.button(i18n.t('buttons.close'), '', function () {
- n.close()
- })
- ]
+ Noty.button(i18n.t("buttons.close"), "", function () {
+ n.close();
+ }),
+ ];
if (!disableExternal && displayReport) {
- btns.unshift(Noty.button(i18n.t('buttons.reportIssue'), '', function () {
- window.open('https://github.com/filebrowser/filebrowser/issues/new/choose')
- }))
+ btns.unshift(
+ Noty.button(i18n.t("buttons.reportIssue"), "", function () {
+ window.open(
+ "https://github.com/filebrowser/filebrowser/issues/new/choose"
+ );
+ })
+ );
}
- let n = new Noty(Object.assign({}, notyDefault, {
- text: error.message || error,
- type: 'error',
- timeout: null,
- buttons: btns
- }))
+ let n = new Noty(
+ Object.assign({}, notyDefault, {
+ text: error.message || error,
+ type: "error",
+ timeout: null,
+ buttons: btns,
+ })
+ );
- n.show()
-}
+ n.show();
+};
-Vue.directive('focus', {
+Vue.directive("focus", {
inserted: function (el) {
- el.focus()
- }
-})
+ el.focus();
+ },
+});
-export default Vue
+export default Vue;
diff --git a/frontend/src/views/Errors.vue b/frontend/src/views/Errors.vue
index 8926f9e5..5efe83ec 100644
--- a/frontend/src/views/Errors.vue
+++ b/frontend/src/views/Errors.vue
@@ -10,37 +10,34 @@
\ No newline at end of file
+ message: this.$t(errors[this.errorCode].message),
+ };
+ },
+};
+
diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue
index 5b247cbb..c49a1c5c 100644
--- a/frontend/src/views/Files.vue
+++ b/frontend/src/views/Files.vue
@@ -8,137 +8,137 @@
- {{ $t('files.loading') }}
+ {{ $t("files.loading") }}
diff --git a/frontend/src/views/Layout.vue b/frontend/src/views/Layout.vue
index 6dc935f7..e9f306dc 100644
--- a/frontend/src/views/Layout.vue
+++ b/frontend/src/views/Layout.vue
@@ -13,30 +13,31 @@
diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue
index a3f1df5d..50d4392d 100644
--- a/frontend/src/views/Login.vue
+++ b/frontend/src/views/Login.vue
@@ -1,97 +1,127 @@
diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue
index 50c58165..82e6782a 100644
--- a/frontend/src/views/Settings.vue
+++ b/frontend/src/views/Settings.vue
@@ -5,10 +5,35 @@
@@ -18,17 +43,17 @@
diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue
index c5a463d8..a60af1c8 100644
--- a/frontend/src/views/Share.vue
+++ b/frontend/src/views/Share.vue
@@ -3,8 +3,18 @@