mirror of
				https://github.com/filegator/filegator.git
				synced 2025-10-27 04:51:29 +01:00 
			
		
		
		
	deploy: c9cb5afa91
				
					
				
			This commit is contained in:
		
							
								
								
									
										94
									
								
								frontend/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								frontend/App.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| <template> | ||||
|   <div v-if="$store.state.initialized" id="wrapper"> | ||||
|     <Login v-if="is('guest') && ! can('write') && ! can('read') && ! can('upload')" /> | ||||
|     <div v-else id="inner"> | ||||
|       <router-view /> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Login from './views/Login' | ||||
|  | ||||
| export default { | ||||
|   name: 'App', | ||||
|   components: { Login } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| @import "~bulma/sass/utilities/_all"; | ||||
|  | ||||
| // Primary color | ||||
| $primary: #34B891; | ||||
| $primary-invert: findColorInvert($primary); | ||||
|  | ||||
| $colors: ( | ||||
|     "primary": ($primary, $primary-invert), | ||||
|     "info": ($info, $info-invert), | ||||
|     "success": ($success, $success-invert), | ||||
|     "warning": ($warning, $warning-invert), | ||||
|     "danger": ($danger, $danger-invert), | ||||
| ); | ||||
|  | ||||
| // Links | ||||
| $link: $primary; | ||||
| $link-invert: $primary-invert; | ||||
| $link-focus-border: $primary; | ||||
|  | ||||
| // Disable the widescreen breakpoint | ||||
| $widescreen-enabled: false; | ||||
|  | ||||
| // Disable the fullhd breakpoint | ||||
| $fullhd-enabled: false; | ||||
|  | ||||
| @import "~bulma"; | ||||
| @import "~buefy/src/scss/buefy"; | ||||
|  | ||||
| // Custom styles | ||||
| html, body, #wrapper, #inner, .container { | ||||
|   height: 100%; | ||||
| } | ||||
|  | ||||
| .container { | ||||
|   margin: 0 auto; | ||||
| } | ||||
|  | ||||
| .is-justify-between { | ||||
|   justify-content: space-between; | ||||
| } | ||||
|  | ||||
| .is-justify-start { | ||||
|   justify-content: flex-start; | ||||
| } | ||||
|  | ||||
| .is-justify-end { | ||||
|   justify-content: flex-end; | ||||
| } | ||||
|  | ||||
| .upload-draggable { | ||||
|   display: flex!important; | ||||
|   flex-direction: column; | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
| } | ||||
|  | ||||
| .upload input[type=file] { | ||||
|   z-index: -10; | ||||
| } | ||||
|  | ||||
| .modal-card-foot { | ||||
|   justify-content: flex-end; | ||||
| } | ||||
|  | ||||
| @media all and (max-width: 1088px) { | ||||
|   .container { | ||||
|     padding: 20px; | ||||
|   } | ||||
| } | ||||
|  | ||||
| </style> | ||||
|  | ||||
							
								
								
									
										216
									
								
								frontend/api/api.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								frontend/api/api.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| import axios from 'axios' | ||||
| import { Base64 } from 'js-base64' | ||||
|  | ||||
| const api = { | ||||
|   getConfig() { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.get('getconfig') | ||||
|         .then(res => resolve(res)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   getUser() { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.get('getuser') | ||||
|         .then(res => { | ||||
|           // set/update csrf token | ||||
|           axios.defaults.headers.common['x-csrf-token'] = res.headers['x-csrf-token'] | ||||
|           resolve(res.data.data) | ||||
|         }) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   login(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('login', { | ||||
|         username: params.username, | ||||
|         password: params.password, | ||||
|       }) | ||||
|         .then( | ||||
|           res => { | ||||
|             resolve(res.data.data) | ||||
|           }, | ||||
|           error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   logout() { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('logout') | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   changeDir(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('changedir', { | ||||
|         to: params.to, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   getDir(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('getdir', { | ||||
|         dir: params.dir, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   copyItems(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('copyitems', { | ||||
|         destination: params.destination, | ||||
|         items: params.items, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   moveItems(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('moveitems', { | ||||
|         destination: params.destination, | ||||
|         items: params.items, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   renameItem(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('renameitem', { | ||||
|         from: params.from, | ||||
|         to: params.to, | ||||
|         destination: params.destination, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   batchDownload (params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('batchdownload', { | ||||
|         items: params.items, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   zipItems(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('zipitems', { | ||||
|         name: params.name, | ||||
|         items: params.items, | ||||
|         destination: params.destination, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   unzipItem(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('unzipitem', { | ||||
|         item: params.item, | ||||
|         destination: params.destination, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   removeItems(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('deleteitems', { | ||||
|         items: params.items, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   createNew(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('createnew', { | ||||
|         type: params.type, | ||||
|         name: params.name, | ||||
|         destination: params.destination, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   listUsers() { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.get('listusers') | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   deleteUser(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('deleteuser/'+params.username) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   storeUser(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('storeuser', { | ||||
|         role: params.role, | ||||
|         name: params.name, | ||||
|         username: params.username, | ||||
|         homedir: params.homedir, | ||||
|         password: params.password, | ||||
|         permissions: params.permissions, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   updateUser(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('updateuser/'+params.key, { | ||||
|         role: params.role, | ||||
|         name: params.name, | ||||
|         username: params.username, | ||||
|         homedir: params.homedir, | ||||
|         password: params.password, | ||||
|         permissions: params.permissions, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   changePassword(params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('changepassword', { | ||||
|         oldpassword: params.oldpassword, | ||||
|         newpassword: params.newpassword, | ||||
|       }) | ||||
|         .then(res => resolve(res.data.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   downloadItem (params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.get('download&path='+encodeURIComponent(Base64.encode(params.path)), | ||||
|         { | ||||
|           transformResponse: [data => data], | ||||
|         }) | ||||
|         .then(res => resolve(res.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
|   saveContent (params) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|       axios.post('savecontent', { | ||||
|         name: params.name, | ||||
|         content: params.content, | ||||
|       }) | ||||
|         .then(res => resolve(res.data)) | ||||
|         .catch(error => reject(error)) | ||||
|     }) | ||||
|   }, | ||||
| } | ||||
|  | ||||
| export default api | ||||
							
								
								
									
										
											BIN
										
									
								
								frontend/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 13 KiB | 
							
								
								
									
										69
									
								
								frontend/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								frontend/main.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| import Vue from 'vue' | ||||
| import App from './App.vue' | ||||
| import router from './router' | ||||
| import store from './store' | ||||
| import Buefy from 'buefy' | ||||
| import shared from './mixins/shared' | ||||
| import axios from 'axios' | ||||
| import api from './api/api' | ||||
| import VueLazyload from 'vue-lazyload' | ||||
| import '@fortawesome/fontawesome-free/css/all.css' | ||||
| import '@fortawesome/fontawesome-free/css/fontawesome.css' | ||||
|  | ||||
| //TODO: import './registerServiceWorker' | ||||
|  | ||||
| Vue.config.productionTip = false | ||||
|  | ||||
| /* eslint-disable-next-line */ | ||||
| Vue.config.baseURL = process.env.VUE_APP_API_ENDPOINT ? process.env.VUE_APP_API_ENDPOINT : window.location.origin+window.location.pathname+'?r=' | ||||
|  | ||||
| axios.defaults.withCredentials = true | ||||
| axios.defaults.baseURL = Vue.config.baseURL | ||||
|  | ||||
| axios.defaults.headers['Content-Type'] = 'application/json' | ||||
|  | ||||
| Vue.use(Buefy, { | ||||
|   defaultIconPack: 'fas', | ||||
| }) | ||||
|  | ||||
| Vue.use(VueLazyload, { | ||||
|   preLoad: 1.3, | ||||
| }) | ||||
|  | ||||
|  | ||||
| Vue.mixin(shared) | ||||
|  | ||||
| new Vue({ | ||||
|   router, | ||||
|   store, | ||||
|   created: function() { | ||||
|  | ||||
|     api.getConfig() | ||||
|       .then(ret => { | ||||
|         this.$store.commit('setConfig', ret.data.data) | ||||
|         api.getUser() | ||||
|           .then((user) => { | ||||
|             this.$store.commit('initialize') | ||||
|             this.$store.commit('setUser', user) | ||||
|             this.$router.push('/').catch(() => {}) | ||||
|           }) | ||||
|           .catch(() => { | ||||
|             this.$notification.open({ | ||||
|               message: this.lang('Something went wrong'), | ||||
|               type: 'is-danger', | ||||
|               queue: false, | ||||
|               indefinite: true, | ||||
|             }) | ||||
|           }) | ||||
|       }) | ||||
|       .catch(() => { | ||||
|         this.$notification.open({ | ||||
|           message: this.lang('Something went wrong'), | ||||
|           type: 'is-danger', | ||||
|           queue: false, | ||||
|           indefinite: true, | ||||
|         }) | ||||
|       }) | ||||
|   }, | ||||
|   render: h => h(App), | ||||
| }).$mount('#app') | ||||
							
								
								
									
										176
									
								
								frontend/mixins/shared.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								frontend/mixins/shared.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| import Vue from 'vue' | ||||
| import moment from 'moment' | ||||
| import store from '../store.js' | ||||
| import api from '../api/api' | ||||
| import { Base64 } from 'js-base64' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| import english from '../translations/english' | ||||
| import spanish from '../translations/spanish' | ||||
| import german from '../translations/german' | ||||
| import indonesian from '../translations/indonesian' | ||||
| import turkish from '../translations/turkish' | ||||
| import lithuanian from '../translations/lithuanian' | ||||
| import portuguese from '../translations/portuguese' | ||||
| import dutch from '../translations/dutch' | ||||
| import chinese from '../translations/chinese' | ||||
| import bulgarian from '../translations/bulgarian' | ||||
| import serbian from '../translations/serbian' | ||||
| import french from '../translations/french' | ||||
| import slovak from '../translations/slovak' | ||||
| import polish from '../translations/polish' | ||||
| import italian from '../translations/italian' | ||||
| import korean from '../translations/korean' | ||||
| import czech from '../translations/czech' | ||||
| import galician from '../translations/galician' | ||||
| import russian from '../translations/russian' | ||||
| import hungarian from '../translations/hungarian' | ||||
| import swedish from '../translations/swedish' | ||||
| import japanese from '../translations/japanese' | ||||
| import slovenian from '../translations/slovenian' | ||||
| import hebrew from '../translations/hebrew' | ||||
| import romanian from '../translations/romanian' | ||||
| import arabic from '../translations/arabic' | ||||
| import portuguese_br from '../translations/portuguese_br' | ||||
| import persian from '../translations/persian' | ||||
|  | ||||
| const funcs = { | ||||
|   methods: { | ||||
|  | ||||
|     /** | ||||
|      * example: | ||||
|      *      lang("{0} is dead, but {1} is alive! {0} {2}", "HTML", "HTML5") | ||||
|      * output: | ||||
|      *      HTML is dead, but HTML5 is alive! HTML {2} | ||||
|      **/ | ||||
|     lang(term, ...rest) { | ||||
|  | ||||
|       let available_languages = { | ||||
|         'english': english, | ||||
|         'spanish': spanish, | ||||
|         'german': german, | ||||
|         'indonesian': indonesian, | ||||
|         'turkish': turkish, | ||||
|         'lithuanian': lithuanian, | ||||
|         'portuguese': portuguese, | ||||
|         'dutch': dutch, | ||||
|         'chinese': chinese, | ||||
|         'bulgarian': bulgarian, | ||||
|         'serbian': serbian, | ||||
|         'french': french, | ||||
|         'slovak': slovak, | ||||
|         'polish': polish, | ||||
|         'italian': italian, | ||||
|         'korean': korean, | ||||
|         'czech': czech, | ||||
|         'galician': galician, | ||||
|         'russian': russian, | ||||
|         'hungarian': hungarian, | ||||
|         'swedish': swedish, | ||||
|         'japanese': japanese, | ||||
|         'slovenian': slovenian, | ||||
|         'hebrew': hebrew, | ||||
|         'romanian': romanian, | ||||
|         'arabic': arabic, | ||||
|         'portuguese_br': portuguese_br, | ||||
|         'persian': persian, | ||||
|       } | ||||
|  | ||||
|       let language = store.state.config.language | ||||
|  | ||||
|       let args = rest | ||||
|       if(!available_languages[language] || available_languages[language][term] == undefined) { | ||||
|         // translation required | ||||
|         return term | ||||
|       } | ||||
|       return available_languages[language][term].replace(/{(\d+)}/g, function(match, number) { | ||||
|         return typeof args[number] != 'undefined' | ||||
|           ? args[number] | ||||
|           : match | ||||
|       }) | ||||
|     }, | ||||
|     is(role) { | ||||
|       return this.$store.state.user.role == role | ||||
|     }, | ||||
|     can(permissions) { | ||||
|       return this.$store.getters.hasPermissions(permissions) | ||||
|     }, | ||||
|     formatBytes(bytes, decimals = 2) { | ||||
|       if (bytes === 0) return '0 Bytes' | ||||
|  | ||||
|       const k = 1024 | ||||
|       const dm = decimals < 0 ? 0 : decimals | ||||
|       const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] | ||||
|  | ||||
|       const i = Math.floor(Math.log(bytes) / Math.log(k)) | ||||
|  | ||||
|       return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i] | ||||
|     }, | ||||
|     formatDate(timestamp) { | ||||
|       return moment.unix(timestamp).format(store.state.config.date_format ? store.state.config.date_format : 'YY/MM/DD hh:mm:ss') | ||||
|     }, | ||||
|     checkUser() { | ||||
|       api.getUser() | ||||
|         .then((user) => { | ||||
|           if (user.username !== store.state.user.username) { | ||||
|             this.$store.commit('destroyUser', user) | ||||
|             this.$toast.open({ | ||||
|               message: this.lang('Please log in'), | ||||
|               type: 'is-danger', | ||||
|             }) | ||||
|           } | ||||
|         }) | ||||
|         .catch(() => { | ||||
|           this.$toast.open({ | ||||
|             message: this.lang('Please log in'), | ||||
|             type: 'is-danger', | ||||
|           }) | ||||
|         }) | ||||
|     }, | ||||
|     handleError(error) { | ||||
|       this.checkUser() | ||||
|  | ||||
|       if (typeof error == 'string') { | ||||
|         this.$toast.open({ | ||||
|           message: this.lang(error), | ||||
|           type: 'is-danger', | ||||
|           duration: 5000, | ||||
|         }) | ||||
|         return | ||||
|       } else if (error && error.response && error.response.data && error.response.data.data) { | ||||
|         this.$toast.open({ | ||||
|           message: this.lang(error.response.data.data), | ||||
|           type: 'is-danger', | ||||
|           duration: 5000, | ||||
|         }) | ||||
|         return | ||||
|       } | ||||
|  | ||||
|       this.$toast.open({ | ||||
|         message: this.lang('Unknown error'), | ||||
|         type: 'is-danger', | ||||
|         duration: 5000, | ||||
|       }) | ||||
|     }, | ||||
|     getDownloadLink(path) { | ||||
|       return Vue.config.baseURL+'/download&path='+encodeURIComponent(Base64.encode(path)) | ||||
|     }, | ||||
|     hasPreview(name) { | ||||
|       return this.isText(name) || this.isImage(name) | ||||
|     }, | ||||
|     isText(name) { | ||||
|       return this.hasExtension(name, store.state.config.editable) | ||||
|     }, | ||||
|     isImage(name) { | ||||
|       return this.hasExtension(name, ['.jpg', '.jpeg', '.gif', '.png', '.bmp', '.svg', '.tiff', '.tif']) | ||||
|     }, | ||||
|     hasExtension(name, exts) { | ||||
|       return !_.isEmpty(exts) && (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$', 'i')).test(name) | ||||
|     }, | ||||
|     capitalize(string) { | ||||
|       return string.charAt(0).toUpperCase() + string.slice(1) | ||||
|     }, | ||||
|   } | ||||
| } | ||||
|  | ||||
| export default funcs | ||||
							
								
								
									
										32
									
								
								frontend/registerServiceWorker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								frontend/registerServiceWorker.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| /* eslint-disable */ | ||||
|  | ||||
| import { register } from 'register-service-worker' | ||||
|  | ||||
| if (process.env.NODE_ENV === 'production') { | ||||
|   register(`${process.env.BASE_URL}service-worker.js`, { | ||||
|     ready () { | ||||
|       console.log( | ||||
|         'App is being served from cache by a service worker.\n' + | ||||
|         'For more details, visit https://goo.gl/AFskqB' | ||||
|       ) | ||||
|     }, | ||||
|     registered () { | ||||
|       console.log('Service worker has been registered.') | ||||
|     }, | ||||
|     cached () { | ||||
|       console.log('Content has been cached for offline use.') | ||||
|     }, | ||||
|     updatefound () { | ||||
|       console.log('New content is downloading.') | ||||
|     }, | ||||
|     updated () { | ||||
|       console.log('New content is available; please refresh.') | ||||
|     }, | ||||
|     offline () { | ||||
|       console.log('No internet connection found. App is running in offline mode.') | ||||
|     }, | ||||
|     error (error) { | ||||
|       console.error('Error during service worker registration:', error) | ||||
|     } | ||||
|   }) | ||||
| } | ||||
							
								
								
									
										34
									
								
								frontend/router.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								frontend/router.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| import Vue from 'vue' | ||||
| import Router from 'vue-router' | ||||
| import Browser from './views/Browser.vue' | ||||
| import Users from './views/Users.vue' | ||||
| import Login from './views/Login.vue' | ||||
| import store from './store' | ||||
|  | ||||
| Vue.use(Router) | ||||
|  | ||||
| export default new Router({ | ||||
|   mode: 'hash', | ||||
|   routes: [ | ||||
|     { | ||||
|       path: '/', | ||||
|       name: 'browser', | ||||
|       component: Browser, | ||||
|     }, | ||||
|     { | ||||
|       path: '/login', | ||||
|       name: 'login', | ||||
|       component: Login, | ||||
|     }, | ||||
|     { | ||||
|       path: '/users', | ||||
|       name: 'users', | ||||
|       component: Users, | ||||
|       beforeEnter: (to, from, next) => { | ||||
|         if (store.state.user.role == 'admin') { | ||||
|           next() | ||||
|         } | ||||
|       }, | ||||
|     }, | ||||
|   ] | ||||
| }) | ||||
							
								
								
									
										98
									
								
								frontend/store.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								frontend/store.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| import Vue from 'vue' | ||||
| import Vuex from 'vuex' | ||||
| import shared from './mixins/shared' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| Vue.use(Vuex) | ||||
|  | ||||
| export default new Vuex.Store({ | ||||
|   state: { | ||||
|     initialized: false, | ||||
|     config: [], | ||||
|     user: { | ||||
|       role: 'guest', | ||||
|       permissions: [], | ||||
|       name: '', | ||||
|       username: '' | ||||
|     }, | ||||
|     cwd: { | ||||
|       location: '/', | ||||
|       content: [], | ||||
|     }, | ||||
|     tree: {}, | ||||
|   }, | ||||
|   getters: { | ||||
|     hasPermissions: (state) => (permissions) => { | ||||
|       if (_.isArray(permissions)) { | ||||
|         return _.intersection(state.user.permissions, permissions).length == permissions.length | ||||
|       } | ||||
|       return _.find(state.user.permissions, p => p == permissions) ? true : false | ||||
|     } | ||||
|   }, | ||||
|   mutations: { | ||||
|     initialize(state) { | ||||
|       state.initialized = true | ||||
|       this.commit('resetCwd') | ||||
|       this.commit('resetTree') | ||||
|       this.commit('destroyUser') | ||||
|     }, | ||||
|     resetCwd(state) { | ||||
|       state.cwd = { | ||||
|         location: '/', | ||||
|         content: [], | ||||
|       } | ||||
|     }, | ||||
|     resetTree(state) { | ||||
|       state.tree = { | ||||
|         path: '/', | ||||
|         name: shared.methods.lang('Home'), | ||||
|         children: [], | ||||
|       } | ||||
|     }, | ||||
|     setConfig(state, data) { | ||||
|       state.config = data | ||||
|     }, | ||||
|     setUser(state, data) { | ||||
|       state.user = data | ||||
|     }, | ||||
|     destroyUser(state) { | ||||
|       state.user = { | ||||
|         role: 'guest', | ||||
|         permissions: [], | ||||
|         name: '', | ||||
|         username: '', | ||||
|       } | ||||
|     }, | ||||
|     setCwd(state, data) { | ||||
|  | ||||
|       state.cwd.location = data.location | ||||
|       state.cwd.content = [] | ||||
|  | ||||
|       _.forEach(_.sortBy(data.content, [function(o) { return _.toLower(o.type) }]), (o) => { | ||||
|         state.cwd.content.push(o) | ||||
|       }) | ||||
|  | ||||
|     }, | ||||
|     updateTreeNode(state, data) { | ||||
|       let traverse = function (object) { | ||||
|         for (let property in object) { | ||||
|           if (object.hasOwnProperty(property)) { | ||||
|             if (property === 'path' && object[property] === data.path) { | ||||
|               Object.assign(object, { | ||||
|                 path: data.path, | ||||
|                 children: data.children, | ||||
|               }) | ||||
|               return | ||||
|             } | ||||
|             if (typeof object[property] === 'object') { | ||||
|               traverse(object[property]) | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       traverse(state.tree) | ||||
|     }, | ||||
|   }, | ||||
|   actions: { | ||||
|   } | ||||
| }) | ||||
							
								
								
									
										81
									
								
								frontend/translations/arabic.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/arabic.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'المحدد: {0} من {1}', | ||||
|   'Uploading files': 'تحميل {0}% من {1}', | ||||
|   'File size error': '{0} كبير جدًا ، يرجى تحميل ملفات أقل من {1}', | ||||
|   'Upload failed': '{0} فشل التحميل', | ||||
|   'Per page': '{0} لكل صفحة', | ||||
|   'Folder': 'مجلد', | ||||
|   'Login failed, please try again': 'فشل تسجيل الدخول, يرجى المحاولة مرة أخرى', | ||||
|   'Already logged in': 'قمت بتسجيل الدخول بالفعل.', | ||||
|   'Please enter username and password': 'الرجاء إدخال اسم المستخدم وكلمة المرور.', | ||||
|   'Not Found': 'غير موجود', | ||||
|   'Not Allowed': 'غير مسموح', | ||||
|   'Please log in': 'يرجى تسجيل الدخول', | ||||
|   'Unknown error': 'خطأ غير معروف', | ||||
|   'Add files': 'إضافة ملفات', | ||||
|   'New': 'جديد', | ||||
|   'New name': 'اسم جديد', | ||||
|   'Username': 'اسم المستخدم', | ||||
|   'Password': 'كلمة المرور', | ||||
|   'Login': 'تسجيل الدخول', | ||||
|   'Logout': 'تسجيل الخروج', | ||||
|   'Profile': 'الملف الشخصي', | ||||
|   'No pagination': 'لا ترقم الصفحات', | ||||
|   'Time': 'الوقت', | ||||
|   'Name': 'الإسم', | ||||
|   'Size': 'الحجم', | ||||
|   'Home': 'الرئيسية', | ||||
|   'Copy': 'نسخ', | ||||
|   'Move': 'نقل', | ||||
|   'Rename': 'إعادة التسمية', | ||||
|   'Required': 'هذا الحقل مطلوب', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'تحميل جماعي', | ||||
|   'Unzip': 'استخراج', | ||||
|   'Delete': 'حذف', | ||||
|   'Download': 'تنزيل', | ||||
|   'Copy link': 'نسخ الرابط', | ||||
|   'Done': 'تم', | ||||
|   'File': 'ملف', | ||||
|   'Drop files to upload': 'قم بإسقاط الملفات لتحميلها', | ||||
|   'Close': 'إغلاق', | ||||
|   'Select Folder': 'تحديد المجلد', | ||||
|   'Users': 'المستخدمين', | ||||
|   'Files': 'الملفات', | ||||
|   'Role': 'قاعدة', | ||||
|   'Cancel': 'إلغاء', | ||||
|   'Paused': 'إيقاف', | ||||
|   'Confirm': 'تأكيد', | ||||
|   'Create': 'إنشاء', | ||||
|   'User': 'المستخدم', | ||||
|   'Admin': 'المدير', | ||||
|   'Save': 'حفظ', | ||||
|   'Read': 'قراءة', | ||||
|   'Write': 'كتابة', | ||||
|   'Upload': 'رفع', | ||||
|   'Permissions': 'أذونات', | ||||
|   'Homedir': 'المجلد الرئيسي', | ||||
|   'Leave blank for no change': 'اتركه فارغا بدون تغيير', | ||||
|   'Are you sure you want to do this?': 'هل انت متأكد من أنك تريد أن تفعل هذا؟', | ||||
|   'Are you sure you want to allow access to everyone?': 'هل أنت متأكد من أنك تريد إتاحة الوصول للجميع؟', | ||||
|   'Are you sure you want to stop all uploads?': 'هل أنت متأكد أنك تريد إيقاف جميع عمليات التحميل؟', | ||||
|   'Something went wrong': 'هناك خطأ ما', | ||||
|   'Invalid directory': 'مجلد غير صالح', | ||||
|   'This field is required': 'هذا الحقل مطلوب', | ||||
|   'Username already taken': 'الاسم مستخدم بالفعل', | ||||
|   'User not found': 'لم يتم العثور على هذا المستخدم', | ||||
|   'Old password': 'كلمة المرور القديمة', | ||||
|   'New password': 'كلمة المرور الجديدة', | ||||
|   'Wrong password': 'كلمة مرور خاطئة', | ||||
|   'Updated': 'تم التحديث', | ||||
|   'Deleted': 'تم الحذف', | ||||
|   'Your file is ready': 'ملفك جاهز', | ||||
|   'View': 'عرض', | ||||
|   'Search': 'البحث', | ||||
|   'Download permission': 'صلاحيات التنزيل', | ||||
|   'Guest': 'زائر', | ||||
|   'Show hidden': 'إظهار المخفي', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/bulgarian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/bulgarian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Избрани: {0} от {1}', | ||||
|   'Uploading files': 'Качване {0}% от {1}', | ||||
|   'File size error': '{0} е твърде голям, моля, качете файлове по-малко от {1}', | ||||
|   'Upload failed': '{0} Грещка при качване', | ||||
|   'Per page': '{0} На страница', | ||||
|   'Folder': 'Папка', | ||||
|   'Login failed, please try again': 'Грешка при вписване, опитайте отново', | ||||
|   'Already logged in': 'Вече сте влезли.', | ||||
|   'Please enter username and password': 'Моля въведете потребителско име и парола.', | ||||
|   'Not Found': 'Не е намерено', | ||||
|   'Not Allowed': 'Не е позволено', | ||||
|   'Please log in': 'Моля впишете се', | ||||
|   'Unknown error': 'Неизвестна грешка', | ||||
|   'Add files': 'Добаве файлове', | ||||
|   'New': 'Ново', | ||||
|   'New name': 'Ново име', | ||||
|   'Username': 'Потребителско име', | ||||
|   'Password': 'Парола', | ||||
|   'Login': 'Вписване', | ||||
|   'Logout': 'Изход', | ||||
|   'Profile': 'Профил', | ||||
|   'No pagination': 'Няма пагинация', | ||||
|   'Time': 'Дата', | ||||
|   'Name': 'Име', | ||||
|   'Size': 'Размер', | ||||
|   'Home': 'Начало', | ||||
|   'Copy': 'Копиране', | ||||
|   'Move': 'Изрежи', | ||||
|   'Rename': 'Преименуване', | ||||
|   'Required': 'Моля, попълнете това поле', | ||||
|   'Zip': 'Архив', | ||||
|   'Batch Download': 'Пакетно изтегляне', | ||||
|   'Unzip': 'Разархивирай', | ||||
|   'Delete': 'Изтриване', | ||||
|   'Download': 'Изтегляне', | ||||
|   'Copy link': 'Копирай линк', | ||||
|   'Done': 'Завършено', | ||||
|   'File': 'Файл', | ||||
|   'Drop files to upload': 'Пускане на файлове за качване', | ||||
|   'Close': 'Затвори', | ||||
|   'Select Folder': 'Избери папка', | ||||
|   'Users': 'Потребител', | ||||
|   'Files': 'Файлове', | ||||
|   'Role': 'Права', | ||||
|   'Cancel': 'Отказ', | ||||
|   'Paused': 'Пауза', | ||||
|   'Confirm': 'Потвърждение', | ||||
|   'Create': 'Създай', | ||||
|   'User': 'Потребител', | ||||
|   'Admin': 'Администратор', | ||||
|   'Save': 'Запази', | ||||
|   'Read': 'Чете', | ||||
|   'Write': 'Записва', | ||||
|   'Upload': 'Качи', | ||||
|   'Permissions': 'Разрешения', | ||||
|   'Homedir': 'Главна директория', | ||||
|   'Leave blank for no change': 'Оставете празно, за да няма промяна', | ||||
|   'Are you sure you want to do this?': 'Сигурни ли сте, че искате да направите това?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Сигурни ли сте, че искате да разрешите достъп на всички?', | ||||
|   'Are you sure you want to stop all uploads?': 'Сигурни ли сте, че искате да спрете всички качвания?', | ||||
|   'Something went wrong': 'Нещо се обърка', | ||||
|   'Invalid directory': 'Невалидна директория', | ||||
|   'This field is required': 'Това поле е задължително', | ||||
|   'Username already taken': 'Потребителско име вече е заето', | ||||
|   'User not found': 'Потребителя не е намерен', | ||||
|   'Old password': 'Стара парола', | ||||
|   'New password': 'Нова парола', | ||||
|   'Wrong password': 'Грешна парола', | ||||
|   'Updated': 'Обновено', | ||||
|   'Deleted': 'Изтрити', | ||||
|   'Your file is ready': 'Вашия файл е готов', | ||||
|   'View': 'Преглед', | ||||
|   'Search': 'Търси', | ||||
|   'Download permission': 'Свали', | ||||
|   'Guest': 'Гост', | ||||
|   'Show hidden': 'Показване на скрито', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/chinese.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/chinese.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': '已选择: {1} 个文件中的 {0} 个', | ||||
|   'Uploading files': '已上传 {1} 中的 {0}%', | ||||
|   'File size error': '{0} 尺寸过大, 您最大只可上传 {1}', | ||||
|   'Upload failed': '{0} 上传失败', | ||||
|   'Per page': '每页 {0} 个', | ||||
|   'Folder': '文件夹', | ||||
|   'Login failed, please try again': '登录失败, 请重试', | ||||
|   'Already logged in': '已登录。', | ||||
|   'Please enter username and password': '请输入用户名和密码。', | ||||
|   'Not Found': '未找到', | ||||
|   'Not Allowed': '不允许', | ||||
|   'Please log in': '请登录', | ||||
|   'Unknown error': '未知错误', | ||||
|   'Add files': '上传文件', | ||||
|   'New': '新建', | ||||
|   'New name': '新名称', | ||||
|   'Username': '用户名', | ||||
|   'Password': '密码', | ||||
|   'Login': '登录', | ||||
|   'Logout': '退出', | ||||
|   'Profile': '更改信息', | ||||
|   'No pagination': '不分页', | ||||
|   'Time': '时间', | ||||
|   'Name': '名称', | ||||
|   'Size': '大小', | ||||
|   'Home': '主页', | ||||
|   'Copy': '复制', | ||||
|   'Move': '移动', | ||||
|   'Rename': '重命名', | ||||
|   'Required': '请填写此字段', | ||||
|   'Zip': '压缩', | ||||
|   'Batch Download': '批量下载', | ||||
|   'Unzip': '解压缩', | ||||
|   'Delete': '删除', | ||||
|   'Download': '下载', | ||||
|   'Copy link': '复制链接', | ||||
|   'Done': '完成', | ||||
|   'File': '文件', | ||||
|   'Drop files to upload': '拖放文件即可上传', | ||||
|   'Close': '关闭', | ||||
|   'Select Folder': '选择文件夹', | ||||
|   'Users': '用户', | ||||
|   'Files': '文件', | ||||
|   'Role': '角色', | ||||
|   'Cancel': '取消', | ||||
|   'Paused': '暂停', | ||||
|   'Confirm': '确认', | ||||
|   'Create': '创建', | ||||
|   'User': '用户', | ||||
|   'Admin': '管理员', | ||||
|   'Save': '保存', | ||||
|   'Read': '读取', | ||||
|   'Write': '写入', | ||||
|   'Upload': '上传', | ||||
|   'Permissions': '权限', | ||||
|   'Homedir': '根目录', | ||||
|   'Leave blank for no change': '留空表示不更改', | ||||
|   'Are you sure you want to do this?': '你确定要干这事?', | ||||
|   'Are you sure you want to allow access to everyone?': '你确定要让任何人随意访问?', | ||||
|   'Are you sure you want to stop all uploads?': '你确定要停止所有上传任务?', | ||||
|   'Something went wrong': '有啥坏了', | ||||
|   'Invalid directory': '目录无效', | ||||
|   'This field is required': '必须填写这个字段', | ||||
|   'Username already taken': '用户名已被注册', | ||||
|   'User not found': '未找到用户', | ||||
|   'Old password': '旧密码', | ||||
|   'New password': '新密码', | ||||
|   'Wrong password': '密码错误', | ||||
|   'Updated': '已更新', | ||||
|   'Deleted': '已删除', | ||||
|   'Your file is ready': '您的文件已备妥', | ||||
|   'View': '查看', | ||||
|   'Search': '搜索', | ||||
|   'Download permission': '下载', | ||||
|   'Guest': '游客', | ||||
|   'Show hidden': '显示隐藏', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/czech.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/czech.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Vybrané: {0} z {1}', | ||||
|   'Uploading files': 'Nahrávám {0}% z {1}', | ||||
|   'File size error': '{0} je příliš velký, nahrávejte soubory menší jak {1}', | ||||
|   'Upload failed': '{0} se nepodařilo nahrát', | ||||
|   'Per page': '{0} na stránku', | ||||
|   'Folder': 'Adresář', | ||||
|   'Login failed, please try again': 'Přihlášení neúspěšné, zkuste to znova', | ||||
|   'Already logged in': 'Už jste přihlášený.', | ||||
|   'Please enter username and password': 'Zadejte přihlašovací jméno a heslo.', | ||||
|   'Not Found': 'Nenalezeno', | ||||
|   'Not Allowed': 'Nepovolené', | ||||
|   'Please log in': 'Přihlaste se', | ||||
|   'Unknown error': 'Neznámá chyba', | ||||
|   'Add files': 'Nahrát soubory', | ||||
|   'New': 'Nový', | ||||
|   'New name': 'Nové jméno', | ||||
|   'Username': 'Přihlašovací jméno', | ||||
|   'Password': 'Heslo', | ||||
|   'Login': 'Přihlásit se', | ||||
|   'Logout': 'Odhlásit se', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Bez stránkování', | ||||
|   'Time': 'Čas', | ||||
|   'Name': 'Jméno', | ||||
|   'Size': 'Velikost', | ||||
|   'Home': 'Hlavní adresář', | ||||
|   'Copy': 'Kopírovat', | ||||
|   'Move': 'Přesunout', | ||||
|   'Rename': 'Přejmenovat', | ||||
|   'Required': 'Vyplňte toto pole', | ||||
|   'Zip': 'Archivovat do zip', | ||||
|   'Batch Download': 'Hromadné stahování', | ||||
|   'Unzip': 'Rozbalit zip archív', | ||||
|   'Delete': 'Smazat', | ||||
|   'Download': 'Stáhnout', | ||||
|   'Copy link': 'Zkopírovat odkaz', | ||||
|   'Done': 'Hotovo', | ||||
|   'File': 'Soubor', | ||||
|   'Drop files to upload': 'Pro nahrání přesuňte soubory sem', | ||||
|   'Close': 'Zavřít', | ||||
|   'Select Folder': 'Vyberte adresář', | ||||
|   'Users': 'Uživatelé', | ||||
|   'Files': 'Soubory', | ||||
|   'Role': 'Typ účtu', | ||||
|   'Cancel': 'Zrušit', | ||||
|   'Paused': 'Pozastavené', | ||||
|   'Confirm': 'Potvrdit', | ||||
|   'Create': 'Vytvořit', | ||||
|   'User': 'Uživatel', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Uložit', | ||||
|   'Read': 'Čtení', | ||||
|   'Write': 'Zapisování', | ||||
|   'Upload': 'Nahrávání', | ||||
|   'Permissions': 'Oprávnění', | ||||
|   'Homedir': 'Hlavní adresář', | ||||
|   'Leave blank for no change': 'Pokud nechcete změnit, nechejte prázdné', | ||||
|   'Are you sure you want to do this?': 'Skutečně to chcete udělat?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Skutečně chcete povolit přístup bez hesla?', | ||||
|   'Are you sure you want to stop all uploads?': 'Skutečně chcete zastavit všechna nahrávání?', | ||||
|   'Something went wrong': 'Něco se pokazilo', | ||||
|   'Invalid directory': 'Neplatný adresář', | ||||
|   'This field is required': 'Toto pole je povinné', | ||||
|   'Username already taken': 'Toto přihlašovací jméno se už používá', | ||||
|   'User not found': 'Uživatel se nenašel', | ||||
|   'Old password': 'Staré heslo', | ||||
|   'New password': 'Nové heslo', | ||||
|   'Wrong password': 'Špatné heslo', | ||||
|   'Updated': 'Aktualizované', | ||||
|   'Deleted': 'Smazané', | ||||
|   'Your file is ready': 'Váš soubor je připravený', | ||||
|   'View': 'Zobrazit', | ||||
|   'Search': 'Vyhledávání', | ||||
|   'Download permission': 'Stahování', | ||||
|   'Guest': 'Host', | ||||
|   'Show hidden': 'Zobrazit skryté', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/dutch.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/dutch.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Geselecteerd: {0} van {1}', | ||||
|   'Uploading files': 'Geüpload: {0}% van {1}', | ||||
|   'File size error': '{0} is te groot, maximale grootte is {1}', | ||||
|   'Upload failed': '{0} upload mislukt', | ||||
|   'Per page': '{0} per pagina', | ||||
|   'Folder': 'Map', | ||||
|   'Login failed, please try again': 'Login mislukt, probeer het nog eens...', | ||||
|   'Already logged in': 'U bent al ingelogd...', | ||||
|   'Please enter username and password': 'Geef gebruikersnaam en wachtwoord', | ||||
|   'Not Found': 'Niet gevonden', | ||||
|   'Not Allowed': 'Niet toegestaan', | ||||
|   'Please log in': 'Log eerst in', | ||||
|   'Unknown error': 'Onbekende fout', | ||||
|   'Add files': 'Bestanden toevoegen', | ||||
|   'New': 'Nieuw', | ||||
|   'New name': 'Nieuwe naam', | ||||
|   'Username': 'Gebruikersnaam', | ||||
|   'Password': 'Wachtwoord', | ||||
|   'Login': 'Log in', | ||||
|   'Logout': 'Log uit', | ||||
|   'Profile': 'Profiel', | ||||
|   'No pagination': 'Geen onderverdeling in pagina\'s', | ||||
|   'Time': 'Tijd', | ||||
|   'Name': 'Naam', | ||||
|   'Size': 'Grootte', | ||||
|   'Home': 'Thuismap', | ||||
|   'Copy': 'Kopieer', | ||||
|   'Move': 'Verplaats', | ||||
|   'Rename': 'Hernoem', | ||||
|   'Required': 'Vereist veld', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Groepsdownload', | ||||
|   'Unzip': 'Uitpakken', | ||||
|   'Delete': 'Verwijder', | ||||
|   'Download': 'Download', | ||||
|   'Copy link': 'Kopieer link', | ||||
|   'Done': 'Klaar', | ||||
|   'File': 'Bestand', | ||||
|   'Drop files to upload': 'Sleep bestanden hierheen om ze te uploaden', | ||||
|   'Close': 'Sluiten', | ||||
|   'Select Folder': 'Selecteer Map', | ||||
|   'Users': 'Gebruikers', | ||||
|   'Files': 'Bestanden', | ||||
|   'Role': 'Rol', | ||||
|   'Cancel': 'Afbreken', | ||||
|   'Paused': 'Gepauseerd', | ||||
|   'Confirm': 'Bevestig', | ||||
|   'Create': 'Nieuw', | ||||
|   'User': 'Gebruiker', | ||||
|   'Admin': 'Beheerder', | ||||
|   'Save': 'Opslaan', | ||||
|   'Read': 'Lezen', | ||||
|   'Write': 'Schrijven', | ||||
|   'Upload': 'Uploaden', | ||||
|   'Permissions': 'Permissies', | ||||
|   'Homedir': 'Thuismap', | ||||
|   'Leave blank for no change': 'Laat leeg om ongewijzigd te laten', | ||||
|   'Are you sure you want to do this?': 'Weet u het zeker?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Weet u zeker dat u iedereen toegang wil geven?', | ||||
|   'Are you sure you want to stop all uploads?': 'Weet u zeker dat u alle uploads wil stoppen?', | ||||
|   'Something went wrong': 'Er is iets foutgegaan', | ||||
|   'Invalid directory': 'Ongeldige map', | ||||
|   'This field is required': 'This field is required', | ||||
|   'Username already taken': 'Naam is al in gebruik', | ||||
|   'User not found': 'Gebruiker niet gevonden', | ||||
|   'Old password': 'Oud wachtwoord', | ||||
|   'New password': 'Nieuw wachtwoord', | ||||
|   'Wrong password': 'Fout wachtwoord', | ||||
|   'Updated': 'Aangepast', | ||||
|   'Deleted': 'Verwijderd', | ||||
|   'Your file is ready': 'Uw bestand is verwerkt', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Download', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Verborgen weergeven', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/english.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/english.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Selected: {0} of {1}', | ||||
|   'Uploading files': 'Uploading {0}% of {1}', | ||||
|   'File size error': '{0} is too large, please upload files less than {1}', | ||||
|   'Upload failed': '{0} failed to upload', | ||||
|   'Per page': '{0} Per Page', | ||||
|   'Folder': 'Folder', | ||||
|   'Login failed, please try again': 'Login failed, please try again', | ||||
|   'Already logged in': 'Already logged in.', | ||||
|   'Please enter username and password': 'Please enter username and password.', | ||||
|   'Not Found': 'Not Found', | ||||
|   'Not Allowed': 'Not Allowed', | ||||
|   'Please log in': 'Please log in', | ||||
|   'Unknown error': 'Unknown error', | ||||
|   'Add files': 'Add files', | ||||
|   'New': 'New', | ||||
|   'New name': 'New name', | ||||
|   'Username': 'Username', | ||||
|   'Password': 'Password', | ||||
|   'Login': 'Log in', | ||||
|   'Logout': 'Log out', | ||||
|   'Profile': 'Profile', | ||||
|   'No pagination': 'No pagination', | ||||
|   'Time': 'Time', | ||||
|   'Name': 'Name', | ||||
|   'Size': 'Size', | ||||
|   'Home': 'Home', | ||||
|   'Copy': 'Copy', | ||||
|   'Move': 'Move', | ||||
|   'Rename': 'Rename', | ||||
|   'Required': 'Please fill out this field', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Batch Download', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Delete', | ||||
|   'Download': 'Download', | ||||
|   'Copy link': 'Copy link', | ||||
|   'Done': 'Done', | ||||
|   'File': 'File', | ||||
|   'Drop files to upload': 'Drop files to upload', | ||||
|   'Close': 'Close', | ||||
|   'Select Folder': 'Select Folder', | ||||
|   'Users': 'Users', | ||||
|   'Files': 'Files', | ||||
|   'Role': 'Role', | ||||
|   'Cancel': 'Cancel', | ||||
|   'Paused': 'Paused', | ||||
|   'Confirm': 'Confirm', | ||||
|   'Create': 'Create', | ||||
|   'User': 'User', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Save', | ||||
|   'Read': 'Read', | ||||
|   'Write': 'Write', | ||||
|   'Upload': 'Upload', | ||||
|   'Permissions': 'Permissions', | ||||
|   'Homedir': 'Home Folder', | ||||
|   'Leave blank for no change': 'Leave blank for no change', | ||||
|   'Are you sure you want to do this?': 'Are you sure you want to do this?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Are you sure you want to allow access to everyone?', | ||||
|   'Are you sure you want to stop all uploads?': 'Are you sure you want to stop all uploads?', | ||||
|   'Something went wrong': 'Something went wrong', | ||||
|   'Invalid directory': 'Invalid directory', | ||||
|   'This field is required': 'This field is required', | ||||
|   'Username already taken': 'Username already taken', | ||||
|   'User not found': 'User not found', | ||||
|   'Old password': 'Old password', | ||||
|   'New password': 'New password', | ||||
|   'Wrong password': 'Wrong password', | ||||
|   'Updated': 'Updated', | ||||
|   'Deleted': 'Deleted', | ||||
|   'Your file is ready': 'Your file is ready', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Download', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Show hidden', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/french.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/french.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Selectionné : {0} sur {1}', | ||||
|   'Uploading files': 'Upload {0}% sur {1}', | ||||
|   'File size error': '{0} est trop volumineux, merci d\'uploader des fichiers inférieurs à {1}', | ||||
|   'Upload failed': '{0} échec(s) d\'envoi', | ||||
|   'Per page': '{0} par page', | ||||
|   'Folder': 'Dossier', | ||||
|   'Login failed, please try again': 'Identification échoué, veuillez réessayer...', | ||||
|   'Already logged in': 'Vous êtes déjà connecté.', | ||||
|   'Please enter username and password': 'Saisissez votre nom d\'utilisateur et votre mot de passe.', | ||||
|   'Not Found': 'Introuvable', | ||||
|   'Not Allowed': 'Non autorisé', | ||||
|   'Please log in': 'Merci de vous connecter', | ||||
|   'Unknown error': 'Erreur inconnue', | ||||
|   'Add files': 'Ajout de fichier', | ||||
|   'New': 'Nouveau', | ||||
|   'New name': 'Nouveau nom', | ||||
|   'Username': 'Nom d\'utilisateur', | ||||
|   'Password': 'Mot de passe', | ||||
|   'Login': 'Connexion', | ||||
|   'Logout': 'Déconnexion', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Pas de pagination', | ||||
|   'Time': 'Date', | ||||
|   'Name': 'Nom', | ||||
|   'Size': 'Taille', | ||||
|   'Home': 'Accueil', | ||||
|   'Copy': 'Copier', | ||||
|   'Move': 'Déplacer', | ||||
|   'Rename': 'Renommer', | ||||
|   'Required': 'Merci de remplir ce champ', | ||||
|   'Zip': 'Compresser', | ||||
|   'Batch Download': 'Télécharger par lot', | ||||
|   'Unzip': 'Décompresser', | ||||
|   'Delete': 'Supprimer', | ||||
|   'Download': 'Télécharger', | ||||
|   'Copy link': 'Copier le lien', | ||||
|   'Done': 'Fait', | ||||
|   'File': 'Fichier', | ||||
|   'Drop files to upload': 'Glisser votre fichier pour l\'uploader', | ||||
|   'Close': 'Fermer', | ||||
|   'Select Folder': 'Selectionner le dossier', | ||||
|   'Users': 'Utilisateur', | ||||
|   'Files': 'Fichiers', | ||||
|   'Role': 'Rôle', | ||||
|   'Cancel': 'Annuler', | ||||
|   'Paused': 'En pause', | ||||
|   'Confirm': 'Confirmer', | ||||
|   'Create': 'Créer', | ||||
|   'User': 'Utilisateur', | ||||
|   'Admin': 'Administrateur', | ||||
|   'Save': 'Enregistrer', | ||||
|   'Read': 'Lire', | ||||
|   'Write': 'Écrire', | ||||
|   'Upload': 'Uploader', | ||||
|   'Permissions': 'Permissions', | ||||
|   'Homedir': 'Dossier principal', | ||||
|   'Leave blank for no change': 'Laisser vide si pas de modification', | ||||
|   'Are you sure you want to do this?': 'Êtes-vous sûr de vouloir faire ceci ?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Êtes-vous sûr de vouloir autoriser l\'accès à tout le monde ?', | ||||
|   'Are you sure you want to stop all uploads?': 'Êtes-vous sûr de vouloir arrêter tous vos envois ?', | ||||
|   'Something went wrong': 'Quelque chose a mal tourné', | ||||
|   'Invalid directory': 'Dossier invalide', | ||||
|   'This field is required': 'Ce champ est obligatoire', | ||||
|   'Username already taken': 'Nom d\'utilisateur déjà utilisé', | ||||
|   'User not found': 'Utilisateur introuvable', | ||||
|   'Old password': 'Ancien mot de passe', | ||||
|   'New password': 'Nouveau mot de passe', | ||||
|   'Wrong password': 'Mot de passe incorrect', | ||||
|   'Updated': 'Mis à jour', | ||||
|   'Deleted': 'Supprimé', | ||||
|   'Your file is ready': 'Votre fichier est prêt', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Télécharger', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Afficher masqué', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										77
									
								
								frontend/translations/galician.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								frontend/translations/galician.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| const data = { | ||||
|   'Selected': 'Seleccionados: {0} de {1}', | ||||
|   'Uploading files': 'Subindo arquivo {0}% de {1}', | ||||
|   'File size error': '{0} O arquivo é demasiado grande. Por favor, cargue arquivos de menos de {1}', | ||||
|   'Upload failed': '{0} Erro ao subir', | ||||
|   'Per page': '{0} Por páxina', | ||||
|   'Folder': 'Cartafol', | ||||
|   'Login failed, please try again': 'Houbo un erro no acceso, proba de novo.', | ||||
|   'Already logged in': 'Xa iniciaches sesión.', | ||||
|   'Please enter username and password': 'Por favor, insire usuario e contrasinal.', | ||||
|   'Not Found': 'Non se atopou', | ||||
|   'Not Allowed': 'Non permitido', | ||||
|   'Please log in': 'Por favor, inicie sesión', | ||||
|   'Unknown error': 'Erro descoñecido', | ||||
|   'Add files': 'Engadir Arquivos', | ||||
|   'New': 'Novo', | ||||
|   'New name': 'Novo nome', | ||||
|   'Username': 'Usuario', | ||||
|   'Password': 'Contrasinal', | ||||
|   'Login': 'Iniciar sesión', | ||||
|   'Logout': 'Saír', | ||||
|   'Profile': 'Perfil', | ||||
|   'No pagination': 'Sen paxinación', | ||||
|   'Time': 'Hora', | ||||
|   'Name': 'Nome', | ||||
|   'Size': 'Tamaño', | ||||
|   'Home': 'Inicio', | ||||
|   'Copy': 'Copiar', | ||||
|   'Move': 'Mover', | ||||
|   'Rename': 'Renomear', | ||||
|   'Required': 'Por favor, encha este campo', | ||||
|   'Zip': 'Arquivo comprimido', | ||||
|   'Batch Download': 'Descarga en lotes', | ||||
|   'Unzip': 'Descomprimir', | ||||
|   'Delete': 'Eliminar', | ||||
|   'Download': 'Baixar', | ||||
|   'Copy link': 'Copiar ligazón', | ||||
|   'Done': 'Feito', | ||||
|   'File': 'Arquivo', | ||||
|   'Drop files to upload': 'Arrastra e solta os arquivos para carregar', | ||||
|   'Close': 'Pechar', | ||||
|   'Select Folder': 'Escoller Cartafol', | ||||
|   'Users': 'Usuarios', | ||||
|   'Files': 'Arquivos', | ||||
|   'Role': 'Privilexio', | ||||
|   'Cancel': 'Cancelar', | ||||
|   'Paused': 'Pausado', | ||||
|   'Confirm': 'Confirmar', | ||||
|   'Create': 'Crear', | ||||
|   'User': 'Usuario', | ||||
|   'Admin': 'Administrador', | ||||
|   'Save': 'Gardar', | ||||
|   'Read': 'Ler', | ||||
|   'Write': 'Escribir', | ||||
|   'Upload': 'Carregar', | ||||
|   'Permissions': 'Permisos', | ||||
|   'Homedir': 'Cartafol de Inicio', | ||||
|   'Leave blank for no change': 'Deixa en branco para non facer cambios', | ||||
|   'Are you sure you want to do this?': 'Estás seguro de que queres facer isto?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Estás seguro de que queres darlle acceso a calquera?', | ||||
|   'Are you sure you want to stop all uploads?': 'Estás seguro de que queres deter todas as cargas?', | ||||
|   'Something went wrong': 'Algo saíu mal', | ||||
|   'Invalid directory': 'Dirección non válida', | ||||
|   'This field is required': 'Este campo é obrigatorio', | ||||
|   'Username already taken': 'O usuario xa existe', | ||||
|   'User not found': 'Non se atopou o usuario', | ||||
|   'Old password': 'Contrasinal antiga', | ||||
|   'New password': 'Nova contrasinal', | ||||
|   'Wrong password': 'Contrasinal errada', | ||||
|   'Updated': 'Actualizado', | ||||
|   'Deleted': 'Eliminado', | ||||
|   'Your file is ready': 'O teu arquivo está listo', | ||||
|   'View': 'Ver', | ||||
|   'Show hidden': 'Amosar oculto', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										80
									
								
								frontend/translations/german.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/german.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Ausgewählt: {0} von {1}', | ||||
|   'Uploading files': 'Hochladen: {0}% von {1}', | ||||
|   'File size error': '{0} ist zu groß, bitte nur Dateien hochladen, die kleiner als {1} sind.', | ||||
|   'Upload failed': '{0} wurde(n) nicht hochgeladen', | ||||
|   'Per page': '{0} pro Seite', | ||||
|   'Folder': 'Ordner', | ||||
|   'Login failed, please try again': 'Anmeldung fehlgeschlagen, bitte nochmal versuchen.', | ||||
|   'Already logged in': 'Bereits angemeldet', | ||||
|   'Please enter username and password': 'Bitte Benutzername und Passwort eingeben.', | ||||
|   'Not Found': 'Nicht gefunden', | ||||
|   'Not Allowed': 'Nicht erlaubt', | ||||
|   'Please log in': 'Bitte anmelden', | ||||
|   'Unknown error': 'Unbekannter Fehler', | ||||
|   'Add files': 'Dateien hinzufügen', | ||||
|   'New': 'Neu', | ||||
|   'New name': 'Neuer Name', | ||||
|   'Username': 'Benutzername', | ||||
|   'Password': 'Passwort', | ||||
|   'Login': 'Anmelden', | ||||
|   'Logout': 'Abmelden', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Kein Seitenumbruch', | ||||
|   'Time': 'Zeitpunkt', | ||||
|   'Name': 'Name', | ||||
|   'Size': 'Größe', | ||||
|   'Home': 'Home', | ||||
|   'Copy': 'Kopieren', | ||||
|   'Move': 'Verschieben', | ||||
|   'Rename': 'Umbenennen', | ||||
|   'Required': 'Bitte dieses Feld ausfüllen', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Batch Download', | ||||
|   'Unzip': 'Entpacken', | ||||
|   'Delete': 'Löschen', | ||||
|   'Download': 'Herunterladen', | ||||
|   'Copy link': 'Link kopieren', | ||||
|   'Done': 'Fertig', | ||||
|   'File': 'Datei', | ||||
|   'Drop files to upload': 'Dateien zum Hochladen hier ablegen', | ||||
|   'Close': 'Schließen', | ||||
|   'Select Folder': 'Ordner auswählen', | ||||
|   'Users': 'Benutzer', | ||||
|   'Files': 'Dateien', | ||||
|   'Role': 'Rolle', | ||||
|   'Cancel': 'Abbrechen', | ||||
|   'Paused': 'Pausiert', | ||||
|   'Confirm': 'Bestätigen', | ||||
|   'Create': 'Erstellen', | ||||
|   'User': 'Benutzer', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Speichern', | ||||
|   'Read': 'Lesen', | ||||
|   'Write': 'Schreiben', | ||||
|   'Upload': 'Hochladen', | ||||
|   'Permissions': 'Berechtigungen', | ||||
|   'Homedir': 'Home Ordner', | ||||
|   'Leave blank for no change': 'Leer lassen, um keine Änderung vorzunehmen', | ||||
|   'Are you sure you want to do this?': 'Sind Sie sicher, dass Sie das tun wollen?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Sind Sie sicher, dass Sie jedem den Zugang ermöglichen wollen?', | ||||
|   'Are you sure you want to stop all uploads?': 'Sind Sie sicher, dass Sie alle Uploads stoppen wollen?', | ||||
|   'Something went wrong': 'Etwas ist schief gelaufen', | ||||
|   'Invalid directory': 'Ungültiges Verzeichnis', | ||||
|   'This field is required': 'Dieses Feld ist erforderlich', | ||||
|   'Username already taken': 'Benutzername bereits vergeben', | ||||
|   'User not found': 'Benutzer nicht gefunden', | ||||
|   'Old password': 'Altes Passwort', | ||||
|   'New password': 'Neues Passwort', | ||||
|   'Wrong password': 'Falsches Passwort', | ||||
|   'Updated': 'Aktualisiert', | ||||
|   'Deleted': 'Gelöscht', | ||||
|   'Your file is ready': 'Ihre Datei ist fertig', | ||||
|   'View': 'Ansicht', | ||||
|   'Search': 'Suche', | ||||
|   'Download permission': 'Herunterladen', | ||||
|   'Guest': 'Gast', | ||||
|   'Show hidden': 'Verborgenes zeigen', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										80
									
								
								frontend/translations/hebrew.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/hebrew.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'נבחרו: {0} מתוך {1}', | ||||
|   'Uploading files': 'העלאה {0}% מתוך {1}', | ||||
|   'File size error': '{0} הוא קובץ גדול מדי. אנא העלו עד לגודל של {1}', | ||||
|   'Upload failed': '{0} לא הועלה כמו שצריך. אנא נסו שנית', | ||||
|   'Per page': '{0} לעמוד', | ||||
|   'Folder': 'תיקייה', | ||||
|   'Login failed, please try again': 'הכניסה נכשלה, אנא בידקו שם משתמש וסיסמה', | ||||
|   'Already logged in': 'אתם כבר מחוברים לאתר.', | ||||
|   'Please enter username and password': 'לכניסה למערכת הקלידו שם משתמש וסיסמה.', | ||||
|   'Not Found': 'לא נמצא', | ||||
|   'Not Allowed': 'הפעולה לא מותרת', | ||||
|   'Please log in': 'אנא בצעו כניסה לאתר', | ||||
|   'Unknown error': 'שגיאה', | ||||
|   'Add files': 'הוספת קבצים', | ||||
|   'New': 'חדש', | ||||
|   'New name': 'שם חדש', | ||||
|   'Username': 'שם משתמש', | ||||
|   'Password': 'סיסמה', | ||||
|   'Login': 'כניסה למערכת', | ||||
|   'Logout': 'התנתקות', | ||||
|   'Profile': 'פרופיל', | ||||
|   'No pagination': 'ללא דפדוף בין עמודים', | ||||
|   'Time': 'זמן', | ||||
|   'Name': 'שם', | ||||
|   'Size': 'גודל', | ||||
|   'Home': 'ראשי', | ||||
|   'Copy': 'העתקה', | ||||
|   'Move': 'העברה', | ||||
|   'Rename': 'שינוי שם', | ||||
|   'Required': 'נא למלא חלק זה', | ||||
|   'Zip': 'כיווץ זיפ', | ||||
|   'Batch Download': 'הורדה מרובת קבצים', | ||||
|   'Unzip': 'פריסת קובץ זיפ', | ||||
|   'Delete': 'מחיקה', | ||||
|   'Download': 'הורדה', | ||||
|   'Copy link': 'העתקת קישור', | ||||
|   'Done': 'סיום', | ||||
|   'File': 'קובץ', | ||||
|   'Drop files to upload': 'גררו קבצים לכאן כדי להעלותם', | ||||
|   'Close': 'סגירה', | ||||
|   'Select Folder': 'בחירת תיקייה', | ||||
|   'Users': 'משתמשים', | ||||
|   'Files': 'קבצים', | ||||
|   'Role': 'הרשאות', | ||||
|   'Cancel': 'ביטול', | ||||
|   'Paused': 'מוקפא', | ||||
|   'Confirm': 'אישור', | ||||
|   'Create': 'יצירה', | ||||
|   'User': 'שם משתמש', | ||||
|   'Admin': 'ניהול', | ||||
|   'Save': 'שמירה', | ||||
|   'Read': 'קריאה', | ||||
|   'Write': 'כתיבה', | ||||
|   'Upload': 'העלאה', | ||||
|   'Permissions': 'הרשאות', | ||||
|   'Homedir': 'תיקייה ראשית', | ||||
|   'Leave blank for no change': 'השאירו ריק כדי להותיר ללא שינוי', | ||||
|   'Are you sure you want to do this?': 'האם אתם בטוחים שברצונכם לעשות פעולה זו?', | ||||
|   'Are you sure you want to allow access to everyone?': 'האם אתם בטוחים שתרצו לאפשר גישה לכולם?', | ||||
|   'Are you sure you want to stop all uploads?': 'האם אתם בטוחים שתרצו לעצור את כל ההעלאות?', | ||||
|   'Something went wrong': 'משהו השתבש', | ||||
|   'Invalid directory': 'תיקייה שגויה', | ||||
|   'This field is required': 'חובה למלא חלק זה', | ||||
|   'Username already taken': 'שם המשתמש הזה כבר קיים', | ||||
|   'User not found': 'המשתמש לא נמצא', | ||||
|   'Old password': 'הסיסמה הישנה', | ||||
|   'New password': 'הסיסמה החדשה', | ||||
|   'Wrong password': 'סיסמה שגויה', | ||||
|   'Updated': 'עודכן', | ||||
|   'Deleted': 'נמחק', | ||||
|   'Your file is ready': 'הקובץ שלכם מוכן!', | ||||
|   'View': 'צפייה', | ||||
|   'Search': 'חיפוש', | ||||
|   'Download permission': 'הורדה', | ||||
|   'Guest': 'אורח/ת', | ||||
|   'Show hidden': 'הצגת קבצים מוסתרים', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/hungarian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/hungarian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Kijelölés: {0} Kijelölve {1}', | ||||
|   'Uploading files': 'Feltöltés {0}% Feltöltve {1}', | ||||
|   'File size error': '{0} Túl nagy fájl {1}', | ||||
|   'Upload failed': '{0} Sikertelen feltöltés', | ||||
|   'Per page': '{0} Oldalanként', | ||||
|   'Folder': 'Mappa', | ||||
|   'Login failed, please try again': 'Sikertelen belépés, próbálja újra', | ||||
|   'Already logged in': 'Bejelentkezve.', | ||||
|   'Please enter username and password': 'Kérjük, adja meg a felhasználónevét és jelszavát.', | ||||
|   'Not Found': 'Nem található', | ||||
|   'Not Allowed': 'Nem megengedett', | ||||
|   'Please log in': 'Kérjük jelentkezzen be', | ||||
|   'Unknown error': 'Ismeretlen hiba', | ||||
|   'Add files': 'Fájl hozzáadása', | ||||
|   'New': 'Új', | ||||
|   'New name': 'Új felhasználó', | ||||
|   'Username': 'Felhasználónév', | ||||
|   'Password': 'Jelszó', | ||||
|   'Login': 'Belépés', | ||||
|   'Logout': 'Kilépés', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Nincs lap', | ||||
|   'Time': 'Idő', | ||||
|   'Name': 'Név', | ||||
|   'Size': 'Méret', | ||||
|   'Home': 'Főkönyvtár', | ||||
|   'Copy': 'Másol', | ||||
|   'Move': 'Áthelyez', | ||||
|   'Rename': 'Átnevez', | ||||
|   'Required': 'Kérem töltse ki ezt a mezőt', | ||||
|   'Zip': 'Becsomagol', | ||||
|   'Batch Download': 'Kötegelt letöltés', | ||||
|   'Unzip': 'Kicsomagolás', | ||||
|   'Delete': 'Törlés', | ||||
|   'Download': 'Letöltés', | ||||
|   'Copy link': 'Link másolása', | ||||
|   'Done': 'Kész', | ||||
|   'File': 'Fájl', | ||||
|   'Drop files to upload': 'Dobja el a feltöltendő fájlokat', | ||||
|   'Close': 'Bezár', | ||||
|   'Select Folder': 'Mappa kijelölése', | ||||
|   'Users': 'Felhasználók', | ||||
|   'Files': 'Fájlok', | ||||
|   'Role': 'Szerep', | ||||
|   'Cancel': 'Mégse', | ||||
|   'Paused': 'Szünetel', | ||||
|   'Confirm': 'Megerősít', | ||||
|   'Create': 'Létrehoz', | ||||
|   'User': 'Felhasználó', | ||||
|   'Admin': 'Adminisztrátor', | ||||
|   'Save': 'Mentés', | ||||
|   'Read': 'Olvasás', | ||||
|   'Write': 'Írás', | ||||
|   'Upload': 'Feltöltés', | ||||
|   'Permissions': 'Engedélyek', | ||||
|   'Homedir': 'Fő mappa', | ||||
|   'Leave blank for no change': 'Hagyja üresen változtatás nélkül', | ||||
|   'Are you sure you want to do this?': 'Biztosan meg akarja változtatni?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Biztos, hogy mindenkinek engedélyezi a hozzáférést?', | ||||
|   'Are you sure you want to stop all uploads?': 'Biztosan leállítja az összes feltöltést?', | ||||
|   'Something went wrong': 'Valami elromlott', | ||||
|   'Invalid directory': 'Érvénytelen mappa', | ||||
|   'This field is required': 'Mező kitöltése kötelező', | ||||
|   'Username already taken': 'A felhasználónév már foglalt', | ||||
|   'User not found': 'Felhasználó nem található', | ||||
|   'Old password': 'Régi jelszó', | ||||
|   'New password': 'Új jelszó', | ||||
|   'Wrong password': 'Rossz jelszó', | ||||
|   'Updated': 'Feltöltés', | ||||
|   'Deleted': 'Törlés', | ||||
|   'Your file is ready': 'Your file is ready', | ||||
|   'View': 'Nézet', | ||||
|   'Search': 'Keresés', | ||||
|   'Download permission': 'Letöltés engedélyezés', | ||||
|   'Guest': 'Vendég', | ||||
|   'Show hidden': 'Rejtett megjelenítése', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/indonesian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/indonesian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Terpilih: {0} of {1}', | ||||
|   'Uploading files': 'Mengunggah {0}% of {1}', | ||||
|   'File size error': '{0} file terlalu besar, harap unggah file lebih kecil dari {1}', | ||||
|   'Upload failed': '{0} gagal diunggah', | ||||
|   'Per page': '{0} Per halaman', | ||||
|   'Folder': 'Berkas', | ||||
|   'Login failed, please try again': 'Gagal masuk, silakan coba lagi', | ||||
|   'Already logged in': 'Telah masuk.', | ||||
|   'Please enter username and password': 'Silahkan masukan nama pengguna dan kata sandi.', | ||||
|   'Not Found': 'Tidak ditemukan', | ||||
|   'Not Allowed': 'Tidak dibolehkan', | ||||
|   'Please log in': 'Silahkan masuk', | ||||
|   'Unknown error': 'Kesalahan tidak dikenal', | ||||
|   'Add files': 'Tambahkan berkas', | ||||
|   'New': 'Baru', | ||||
|   'New name': 'Nama baru', | ||||
|   'Username': 'Nama pengguna', | ||||
|   'Password': 'Kata sandi', | ||||
|   'Login': 'Masuk', | ||||
|   'Logout': 'Keluar', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Tidak ada halaman', | ||||
|   'Time': 'Waktu', | ||||
|   'Name': 'Nama', | ||||
|   'Size': 'Ukuran', | ||||
|   'Home': 'Beranda', | ||||
|   'Copy': 'Salin', | ||||
|   'Move': 'Pindah', | ||||
|   'Rename': 'Ubah nama', | ||||
|   'Required': 'Bidang diperlukan', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Unduh Batch', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Hapus', | ||||
|   'Download': 'Unduh', | ||||
|   'Copy link': 'Salin tautan', | ||||
|   'Done': 'Selesai', | ||||
|   'File': 'File', | ||||
|   'Drop files to upload': 'Letakkan file untuk diunggah', | ||||
|   'Close': 'Tutup', | ||||
|   'Select Folder': 'Pilih Berkas', | ||||
|   'Users': 'Pengguna', | ||||
|   'Files': 'Arsip', | ||||
|   'Role': 'Peran', | ||||
|   'Cancel': 'Batal', | ||||
|   'Paused': 'Dijeda', | ||||
|   'Confirm': 'Konfirmasi', | ||||
|   'Create': 'Buat', | ||||
|   'User': 'Pengguna', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Simpan', | ||||
|   'Read': 'Baca', | ||||
|   'Write': 'Tulis', | ||||
|   'Upload': 'Unggah', | ||||
|   'Permissions': 'Izin', | ||||
|   'Homedir': 'Direktori beranda', | ||||
|   'Leave blank for no change': 'Biarkan kosong tanpa perubahan', | ||||
|   'Are you sure you want to do this?': 'Anda yakin ingin melakukan ini?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Apakah anda yakin untuk mengizinkan akses ke semua pengguna?', | ||||
|   'Are you sure you want to stop all uploads?': 'Apakah anda yakin ingin menghentikan semua unggahan?', | ||||
|   'Something went wrong': 'Ada kesalahan', | ||||
|   'Invalid directory': 'Direktori salah', | ||||
|   'This field is required': 'Bagian ini diperlukan', | ||||
|   'Username already taken': 'Nama pengguna sudah digunakan', | ||||
|   'User not found': 'Pengguna tidak ditemukan', | ||||
|   'Old password': 'Kata sandi lama', | ||||
|   'New password': 'Kata sandi baru', | ||||
|   'Wrong password': 'Kata sandi salah', | ||||
|   'Updated': 'Diperbarui', | ||||
|   'Deleted': 'Dihapus', | ||||
|   'Your file is ready': 'File Anda sudah siap', | ||||
|   'View': 'Lihat', | ||||
|   'Search': 'Cari', | ||||
|   'Download permission': 'Unduh', | ||||
|   'Guest': 'Tamu', | ||||
|   'Show hidden': 'Tampilkan berkas tersembunyi', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/italian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/italian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Selezionati: {0} di {1}', | ||||
|   'Uploading files': 'Caricamento {0}% di {1}', | ||||
|   'File size error': '{0} File troppo grande. Dimensione massima consentita {1}', | ||||
|   'Upload failed': '{0} Caricamento fallito', | ||||
|   'Per page': '{0} per pagina', | ||||
|   'Folder': 'Cartella', | ||||
|   'Login failed, please try again': 'Username o password non corretti', | ||||
|   'Already logged in': 'Sei già connesso', | ||||
|   'Please enter username and password': 'Inserisci username e password', | ||||
|   'Not Found': 'Nessun risultato', | ||||
|   'Not Allowed': 'Non consentito', | ||||
|   'Please log in': 'Per cortesia autenticati', | ||||
|   'Unknown error': 'Errore sconosciuto', | ||||
|   'Add files': 'Aggiungi files', | ||||
|   'New': 'Nuovo', | ||||
|   'New name': 'Nuovo nome', | ||||
|   'Username': 'Username', | ||||
|   'Password': 'Password', | ||||
|   'Login': 'Entra', | ||||
|   'Logout': 'Esci', | ||||
|   'Profile': 'Cambia password', | ||||
|   'No pagination': 'Uno per pagina', | ||||
|   'Time': 'Data', | ||||
|   'Name': 'Nome', | ||||
|   'Size': 'Dimensione', | ||||
|   'Home': 'Cartella principale', | ||||
|   'Copy': 'Copia', | ||||
|   'Move': 'Sposta', | ||||
|   'Rename': 'Rinomina', | ||||
|   'Required': 'Campo obbligatorio', | ||||
|   'Zip': 'Comprimi', | ||||
|   'Batch Download': 'Scarica batch', | ||||
|   'Unzip': 'Estrai', | ||||
|   'Delete': 'Elimina', | ||||
|   'Download': 'Scarica', | ||||
|   'Copy link': 'Copia collegamento', | ||||
|   'Done': 'Completato', | ||||
|   'File': 'File', | ||||
|   'Drop files to upload': 'Trascina i files che vuoi caricare', | ||||
|   'Close': 'Chiudi', | ||||
|   'Select Folder': 'Seleziona cartella', | ||||
|   'Users': 'Utenti', | ||||
|   'Files': 'Files', | ||||
|   'Role': 'Ruolo', | ||||
|   'Cancel': 'Annulla', | ||||
|   'Paused': 'Sospeso', | ||||
|   'Confirm': 'Conferma', | ||||
|   'Create': 'Crea', | ||||
|   'User': 'Utente', | ||||
|   'Admin': 'Amministratore', | ||||
|   'Save': 'Salva', | ||||
|   'Read': 'Lettura', | ||||
|   'Write': 'Scrittura', | ||||
|   'Upload': 'Caricamento', | ||||
|   'Permissions': 'Permessi', | ||||
|   'Homedir': 'Cartella principale', | ||||
|   'Leave blank for no change': 'Lascia in bianco per non effettuare modifiche', | ||||
|   'Are you sure you want to do this?': 'Sei sicuro di voler eliminare gli elementi selezionati?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Sei sicuro di voler consentire libero accesso a tutti?', | ||||
|   'Are you sure you want to stop all uploads?': 'Vuoi sospendere tutti i caricamenti?', | ||||
|   'Something went wrong': 'Qualcosa é andato storto', | ||||
|   'Invalid directory': 'Cartella non corretta', | ||||
|   'This field is required': 'Questo campo é obbligatorio', | ||||
|   'Username already taken': 'Username giá esistente', | ||||
|   'User not found': 'Utente non trovato', | ||||
|   'Old password': 'Vecchia password', | ||||
|   'New password': 'Nuova password', | ||||
|   'Wrong password': 'Password errata', | ||||
|   'Updated': 'Aggiornato', | ||||
|   'Deleted': 'Eliminato', | ||||
|   'Your file is ready': 'Il tuo file è disponibile', | ||||
|   'View': 'Leggi', | ||||
|   'Search': 'Cerca', | ||||
|   'Download permission': 'Scarica', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Mostra nascosto', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										76
									
								
								frontend/translations/japanese.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								frontend/translations/japanese.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| const data = { | ||||
|   'Selected': '{0}個中{1}個を選択中', | ||||
|   'Uploading files': '{1}中{0}%をアップロードしています…', | ||||
|   'File size error': '{0}が大きすぎます。{1}未満のファイルのみアップロードできます。', | ||||
|   'Upload failed': '{0}のアップロードに失敗しました。', | ||||
|   'Per page': '{0}個表示', | ||||
|   'Folder': 'フォルダ', | ||||
|   'Login failed, please try again': 'ログインに失敗しました。もう1度お試しください。', | ||||
|   'Already logged in': '既にログインしています。', | ||||
|   'Please enter username and password': 'ユーザー名とパスワードを入力してください。', | ||||
|   'Not Found': '見つかりません。', | ||||
|   'Not Allowed': '許可されていません。', | ||||
|   'Please log in': 'ログインしてください', | ||||
|   'Unknown error': '不明なエラー', | ||||
|   'Add files': 'アップロード', | ||||
|   'New': '新規', | ||||
|   'New name': '新しい名前', | ||||
|   'Username': 'ユーザー名', | ||||
|   'Password': 'パスワード', | ||||
|   'Login': 'ログイン', | ||||
|   'Logout': 'ログアウト', | ||||
|   'Profile': 'プロフィール', | ||||
|   'No pagination': 'ページネーションなし', | ||||
|   'Time': '更新日', | ||||
|   'Name': '名前', | ||||
|   'Size': 'サイズ', | ||||
|   'Home': 'ホーム', | ||||
|   'Copy': 'コピー', | ||||
|   'Move': '移動', | ||||
|   'Rename': '名前の変更', | ||||
|   'Required': 'このフィールドを記入してください。', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'バッチダウンロード', | ||||
|   'Unzip': 'Zipを解凍', | ||||
|   'Delete': '削除', | ||||
|   'Download': 'ダウンロード', | ||||
|   'Copy link': 'リンクをコピー', | ||||
|   'Done': '完了', | ||||
|   'File': 'ファイル', | ||||
|   'Drop files to upload': 'アップロードするファイルをドロップしてください。', | ||||
|   'Close': '閉じる', | ||||
|   'Select Folder': 'フォルダを選択', | ||||
|   'Users': 'ユーザー', | ||||
|   'Files': 'ファイル', | ||||
|   'Role': 'ロール', | ||||
|   'Cancel': 'キャンセル', | ||||
|   'Paused': '一時停止', | ||||
|   'Confirm': '確認', | ||||
|   'Create': '作成', | ||||
|   'User': 'ユーザー', | ||||
|   'Admin': '管理者', | ||||
|   'Save': '保存', | ||||
|   'Read': '読み込み', | ||||
|   'Write': '書き込み', | ||||
|   'Upload': 'アップロード', | ||||
|   'Permissions': '権限', | ||||
|   'Homedir': 'ホームフォルダ', | ||||
|   'Leave blank for no change': '変更しない場合は空白のままにしてください', | ||||
|   'Are you sure you want to do this?': '実行してもよろしいですか?', | ||||
|   'Are you sure you want to allow access to everyone?': '全員にアクセスを許可してよろしいですか?', | ||||
|   'Are you sure you want to stop all uploads?': '全てのアップロードを中止してよろしいですか?', | ||||
|   'Something went wrong': '問題が発生したようです。', | ||||
|   'Invalid directory': '無効なフォルダ', | ||||
|   'This field is required': 'この項目は必須です。', | ||||
|   'Username already taken': 'ユーザー名が既に使用されています。', | ||||
|   'User not found': 'ユーザーが見つかりません。', | ||||
|   'Old password': '以前のパスワード', | ||||
|   'New password': '新しいパスワード', | ||||
|   'Wrong password': 'パスワードが間違っています。', | ||||
|   'Updated': '更新しました。', | ||||
|   'Deleted': '削除しました。', | ||||
|   'Your file is ready': 'ファイルの準備ができました。', | ||||
|   'View': '表示', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/korean.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/korean.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': '선택된 항목: {0}/{1}', | ||||
|   'Uploading files': '{1} 중 {0}% 업로드 진행', | ||||
|   'File size error': '{1} 이하의 파일만 업로드가 가능합니다.', | ||||
|   'Upload failed': '{0} 업로드 실패', | ||||
|   'Per page': '{0}개씩 보기', | ||||
|   'Folder': '폴더', | ||||
|   'Login failed, please try again': '로그인 실패, 다시 시도하십시오.', | ||||
|   'Already logged in': '이미 로그인되었습니다.', | ||||
|   'Please enter username and password': '사용자 이름과 비밀번호를 입력하십시오.', | ||||
|   'Not Found': '찾을 수 없음', | ||||
|   'Not Allowed': '허용되지 않음', | ||||
|   'Please log in': '로그인하십시오.', | ||||
|   'Unknown error': '알 수 없는 오류', | ||||
|   'Add files': '업로드', | ||||
|   'New': '생성', | ||||
|   'New name': '변경할 이름', | ||||
|   'Username': '사용자 이름', | ||||
|   'Password': '비밀번호', | ||||
|   'Login': '로그인', | ||||
|   'Logout': '로그아웃', | ||||
|   'Profile': '프로필', | ||||
|   'No pagination': '전체 보기', | ||||
|   'Time': '수정한 날짜', | ||||
|   'Name': '이름', | ||||
|   'Size': '크기', | ||||
|   'Home': '홈', | ||||
|   'Copy': '복사', | ||||
|   'Move': '이동', | ||||
|   'Rename': '이름 변경', | ||||
|   'Required': '이 필드를 작성하십시오.', | ||||
|   'Zip': '압축', | ||||
|   'Batch Download': '일괄 다운로드', | ||||
|   'Unzip': '압축 해제', | ||||
|   'Delete': '삭제', | ||||
|   'Download': '다운로드', | ||||
|   'Copy link': '링크 복사', | ||||
|   'Done': '완료', | ||||
|   'File': '파일', | ||||
|   'Drop files to upload': '업로드할 파일을 끌어서 놓으십시오.', | ||||
|   'Close': '닫기', | ||||
|   'Select Folder': '폴더 선택', | ||||
|   'Users': '사용자', | ||||
|   'Files': '파일', | ||||
|   'Role': '역할', | ||||
|   'Cancel': '취소', | ||||
|   'Paused': '일시중지됨', | ||||
|   'Confirm': '확인', | ||||
|   'Create': '생성', | ||||
|   'User': '사용자', | ||||
|   'Admin': '관리자', | ||||
|   'Save': '저장', | ||||
|   'Read': '읽기', | ||||
|   'Write': '쓰기', | ||||
|   'Upload': '업로드', | ||||
|   'Permissions': '권한', | ||||
|   'Homedir': '홈 폴더', | ||||
|   'Leave blank for no change': '변경하지 않으려면 비워 두십시오.', | ||||
|   'Are you sure you want to do this?': '이 작업을 수행하시겠습니까?', | ||||
|   'Are you sure you want to allow access to everyone?': '방문자에게 접근을 허용하시겠습니까?', | ||||
|   'Are you sure you want to stop all uploads?': '모든 업로드를 중지하시겠습니까?', | ||||
|   'Something went wrong': '오류가 발생했습니다.', | ||||
|   'Invalid directory': '잘못된 폴더', | ||||
|   'This field is required': '이 필드는 필수입니다.', | ||||
|   'Username already taken': '이미 사용 중인 사용자 이름입니다.', | ||||
|   'User not found': '사용자를 찾을 수 없습니다.', | ||||
|   'Old password': '현재 비밀번호', | ||||
|   'New password': '새 비밀번호', | ||||
|   'Wrong password': '잘못된 비밀번호', | ||||
|   'Updated': '업데이트됨', | ||||
|   'Deleted': '삭제됨', | ||||
|   'Your file is ready': '파일이 준비되었습니다.', | ||||
|   'View': '보기', | ||||
|   'Search': '검색', | ||||
|   'Download permission': '다운로드', | ||||
|   'Guest': '방문자', | ||||
|   'Show hidden': '숨김 표시', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/lithuanian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/lithuanian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Pasirinkta: {0} iš {1}', | ||||
|   'Uploading files': 'Įkeliama {0}% iš {1}', | ||||
|   'File size error': '{0} yra per didelis, prašome įkelti mažesnius failus nei {1}', | ||||
|   'Upload failed': '{0} nepavyko įkelti', | ||||
|   'Per page': '{0} puslapyje', | ||||
|   'Folder': 'Aplankas', | ||||
|   'Login failed, please try again': 'Nepavyko prisijungti, bandykite dar kartą', | ||||
|   'Already logged in': 'Jau esate prisijungęs.', | ||||
|   'Please enter username and password': 'Prašome įvesti prisijungimo vardą ir slaptažodį.', | ||||
|   'Not Found': 'Nerasta', | ||||
|   'Not Allowed': 'Neleidžiama', | ||||
|   'Please log in': 'Prašome prisijungti', | ||||
|   'Unknown error': 'Nežinoma klaida', | ||||
|   'Add files': 'Įkelti failus', | ||||
|   'New': 'Naujas', | ||||
|   'New name': 'Naujas pavadinimas', | ||||
|   'Username': 'Prisijungimo vardas', | ||||
|   'Password': 'Slaptažodis', | ||||
|   'Login': 'Prisijungti', | ||||
|   'Logout': 'Atsijungti', | ||||
|   'Profile': 'Profilis', | ||||
|   'No pagination': 'Nepuslapiuoti', | ||||
|   'Time': 'Laikas', | ||||
|   'Name': 'Pavadinimas', | ||||
|   'Size': 'Dydis', | ||||
|   'Home': 'Pradžia', | ||||
|   'Copy': 'Kopijuoti', | ||||
|   'Move': 'Perkelti', | ||||
|   'Rename': 'Pervadinti', | ||||
|   'Required': 'Prašome užpildyti šį lauką', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Atsiųsti paketą', | ||||
|   'Unzip': 'Išpakuoti', | ||||
|   'Delete': 'Pašalinti', | ||||
|   'Download': 'Atsiųsti', | ||||
|   'Copy link': 'Kopijuoti nuorodą', | ||||
|   'Done': 'Atlikta', | ||||
|   'File': 'Failas', | ||||
|   'Drop files to upload': 'Nutempti failus įkėlimui', | ||||
|   'Close': 'Užverti', | ||||
|   'Select Folder': 'Pasirinkite aplanką', | ||||
|   'Users': 'Vartotojai', | ||||
|   'Files': 'Failai', | ||||
|   'Role': 'Vaidmuo', | ||||
|   'Cancel': 'Atšaukti', | ||||
|   'Paused': 'Pristabdytas', | ||||
|   'Confirm': 'Patvirtinti', | ||||
|   'Create': 'Sukurti', | ||||
|   'User': 'Vartotojas', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Išsaugoti', | ||||
|   'Read': 'Nuskaityti', | ||||
|   'Write': 'Įrašyti', | ||||
|   'Upload': 'Įkelti', | ||||
|   'Permissions': 'Leidimai', | ||||
|   'Homedir': 'Pradžios aplankas', | ||||
|   'Leave blank for no change': 'Palikite tuščią, jei nenorite nieko keisti', | ||||
|   'Are you sure you want to do this?': 'Ar Jūs įsitikinęs, kad norite tai atlikti?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Ar Jūs įsitikinęs, kad norite atverti prieigą prie failų bet kam?', | ||||
|   'Are you sure you want to stop all uploads?': 'Ar Jūs įsitikinęs, kad norite sustabdyti visus įkėlimus?', | ||||
|   'Something went wrong': 'Kažkas negerai', | ||||
|   'Invalid directory': 'Neteisingas aplankas', | ||||
|   'This field is required': 'Šį lauką privalote užpildyti', | ||||
|   'Username already taken': 'Toks prisijungimo vardas jau egzistuoja', | ||||
|   'User not found': 'Vartotojas nerastas', | ||||
|   'Old password': 'Senas slaptažodis', | ||||
|   'New password': 'Naujas slaptažodis', | ||||
|   'Wrong password': 'Klaidingas slaptažodis', | ||||
|   'Updated': 'Atnaujintas', | ||||
|   'Deleted': 'Ištrintas', | ||||
|   'Your file is ready': 'Jūsų failas paruoštas', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Atsiųsti', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Rodyti paslėptą', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										80
									
								
								frontend/translations/persian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/persian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'انتخاب شده: {0} از {1}', | ||||
|   'Uploading files': 'در حال آپلود {0}% از {1}', | ||||
|   'File size error': '{0} حجم فایل زیاد است, لطفا با حجم کمتر از انتخاب نمایید {1}', | ||||
|   'Upload failed': '{0} آپلود ناموفق', | ||||
|   'Per page': '{0} از صفحه', | ||||
|   'Folder': 'پوشه', | ||||
|   'Login failed, please try again': 'ورود ناموفق، لطفا مجددا تلاش کنید', | ||||
|   'Already logged in': 'شما داخل می باشید..', | ||||
|   'Please enter username and password': 'لطفا نام کاربری و کلمه عبور خود را وارد نمایید.', | ||||
|   'Not Found': 'پیدا نشد', | ||||
|   'Not Allowed': 'غیرمجاز', | ||||
|   'Please log in': 'لطفا وارد شوید', | ||||
|   'Unknown error': 'پیغام نامشخص', | ||||
|   'Add files': 'افزودن فایل', | ||||
|   'New': 'جدید', | ||||
|   'New name': 'نام جدید', | ||||
|   'Username': 'نام کاربری', | ||||
|   'Password': 'کلمه عبور', | ||||
|   'Login': 'وارد شدن', | ||||
|   'Logout': 'خارج شدن', | ||||
|   'Profile': 'پروفایل', | ||||
|   'No pagination': 'صفحه گذاری نشده', | ||||
|   'Time': 'زمان', | ||||
|   'Name': 'نام', | ||||
|   'Size': 'حجم', | ||||
|   'Home': 'خانه', | ||||
|   'Copy': 'کپی', | ||||
|   'Move': 'انتقال', | ||||
|   'Rename': 'تغییر نام', | ||||
|   'Required': 'لطفا این فیلد را کامل نمایید', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'دانلود گروهی', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'حذف', | ||||
|   'Download': 'دانلود', | ||||
|   'Copy link': 'کپی کردن لینک', | ||||
|   'Done': 'انجام شد', | ||||
|   'File': 'فایل', | ||||
|   'Drop files to upload': 'برای آپلود فایل ها را اینجا رها کنید', | ||||
|   'Close': 'بستن', | ||||
|   'Select Folder': 'انتخاب پوشه', | ||||
|   'Users': 'کاربران', | ||||
|   'Files': 'فایل ها', | ||||
|   'Role': 'نقش', | ||||
|   'Cancel': 'انصراف', | ||||
|   'Paused': 'متوقف شده', | ||||
|   'Confirm': 'تائید', | ||||
|   'Create': 'ایجاد', | ||||
|   'User': 'کاربر', | ||||
|   'Admin': 'ادمین', | ||||
|   'Save': 'ذخیره', | ||||
|   'Read': 'خواندن', | ||||
|   'Write': 'نوشتن', | ||||
|   'Upload': 'آپلود', | ||||
|   'Permissions': 'دسترسی ها', | ||||
|   'Homedir': 'پوشه ی اصلی', | ||||
|   'Leave blank for no change': 'برای تغییر نکردن خالی بماند', | ||||
|   'Are you sure you want to do this?': 'مطمئن هستید ؟؟', | ||||
|   'Are you sure you want to allow access to everyone?': 'مطمئنید میخواید همه دسترسی پیدا کنند ؟؟', | ||||
|   'Are you sure you want to stop all uploads?': 'تمام آپلود ها کنسل شود ؟؟', | ||||
|   'Something went wrong': 'اشتباهی رخ داده است !', | ||||
|   'Invalid directory': 'مسیر نادرست', | ||||
|   'This field is required': 'پر کردن این فیلد اجباریست', | ||||
|   'Username already taken': 'نام کاربری تکراریست', | ||||
|   'User not found': 'کاربر پیدا نشد', | ||||
|   'Old password': 'کلمه عبور قدیمی', | ||||
|   'New password': 'کلمه عبور جدید', | ||||
|   'Wrong password': 'کلمه عبور اشتباه است', | ||||
|   'Updated': 'بروز شد', | ||||
|   'Deleted': 'حذف شد', | ||||
|   'Your file is ready': 'فایل شما آماده است.', | ||||
|   'View': 'نمایش', | ||||
|   'Search': 'جست و جو', | ||||
|   'Download permission': 'دانلود', | ||||
|   'Guest': 'مهمان', | ||||
|   'Show hidden': 'نمایش مخفی ها', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										80
									
								
								frontend/translations/polish.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/polish.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Wybrano: {0} z {1}', | ||||
|   'Uploading files': 'Przesyłanie {0}% z {1}', | ||||
|   'Błąd rozmiaru pliku': '{0} jest za duży, prześlij mniejszy plik {1}', | ||||
|   'Upload failed': '{0} plików nie udało się przesłać', | ||||
|   'Per page': '{0} Na stronę', | ||||
|   'Folder': 'Folder', | ||||
|   'Login failed, please try again': 'Zły login lub hasło.', | ||||
|   'Already logged in': 'Already logged in.', | ||||
|   'Please enter username and password': 'Wpisz login i hasło.', | ||||
|   'Not Found': 'Nie znaleziono', | ||||
|   'Not Allowed': 'Nie dozwolony', | ||||
|   'Please log in': 'Proszę się zalogować', | ||||
|   'Unknown error': 'Nieznany błąd', | ||||
|   'Add files': 'Dodaj plik', | ||||
|   'New': 'Nowy', | ||||
|   'New name': 'Nowa nazwa', | ||||
|   'Username': 'Login', | ||||
|   'Password': 'Hasło', | ||||
|   'Login': 'Zaloguj', | ||||
|   'Logout': 'Wyloguj', | ||||
|   'Profile': 'Profile', | ||||
|   'No pagination': 'Brak podziału na strony', | ||||
|   'Time': 'Czas', | ||||
|   'Name': 'Nazwa', | ||||
|   'Size': 'Rozmiar', | ||||
|   'Home': 'Folder główny', | ||||
|   'Copy': 'Kopiuj', | ||||
|   'Move': 'Przenieś', | ||||
|   'Rename': 'Zmień nazwę', | ||||
|   'Required': 'Proszę wypełnić to pole', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Pobieranie zbiorcze', | ||||
|   'Unzip': 'Rozpakuj', | ||||
|   'Delete': 'Usuń', | ||||
|   'Download': 'Download', | ||||
|   'Copy link': 'Kopiuj link', | ||||
|   'Done': 'Done', | ||||
|   'File': 'Plik', | ||||
|   'Drop files to upload': 'Upuść pliki do przesłania', | ||||
|   'Close': 'Zamknij', | ||||
|   'Select Folder': 'Wybierz katalog', | ||||
|   'Users': 'Użytkownik', | ||||
|   'Files': 'Pliki', | ||||
|   'Role': 'Role', | ||||
|   'Cancel': 'Anuluj', | ||||
|   'Paused': 'Pauza', | ||||
|   'Confirm': 'Potwierdź', | ||||
|   'Create': 'Stwórz', | ||||
|   'User': 'Użytkownik', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Zapisz', | ||||
|   'Read': 'Podgląd', | ||||
|   'Write': 'Zapisz', | ||||
|   'Upload': 'Upload', | ||||
|   'Permissions': 'Uprawnienia', | ||||
|   'Homedir': 'Folder Główny', | ||||
|   'Leave blank for no change': 'Pozostaw puste, bez zmian', | ||||
|   'Are you sure you want to do this?': 'Jesteś pewny że chcesz to zrobić?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Czy na pewno chcesz zezwolić na dostęp wszystkim?', | ||||
|   'Are you sure you want to stop all uploads?': 'Czy na pewno chcesz zatrzymać wszystkie przesyłane pliki?', | ||||
|   'Something went wrong': 'Coś poszło nie tak', | ||||
|   'Invalid directory': 'Nieprawidłowy katalog', | ||||
|   'This field is required': 'To pole jest wymagane', | ||||
|   'Username already taken': 'Nazwa użytkownika zajęta', | ||||
|   'User not found': 'Użytkownik nie znaleziony', | ||||
|   'Old password': 'Stare hasło', | ||||
|   'New password': 'Nowe hasło', | ||||
|   'Wrong password': 'Nieprawidłowe hasło', | ||||
|   'Updated': 'Zaktualizowano', | ||||
|   'Deleted': 'Usunięte', | ||||
|   'Your file is ready': 'Twój plik jest gotowy', | ||||
|   'View': 'Podgląd', | ||||
|   'Search': 'Szukaj', | ||||
|   'Download permission': 'Download', | ||||
|   'Guest': 'Gość', | ||||
|   'Show hidden': 'Pokaż ukryte', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/portuguese.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/portuguese.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Selecionado: {0} de {1}', | ||||
|   'Uploading files': 'Fazendo o upload {0}% de {1}', | ||||
|   'File size error': '{0} é muito grande, por favor faça upload de arquivos menores que {1}', | ||||
|   'Upload failed': '{0} falhou ao fazer o upload', | ||||
|   'Per page': '{0} Por página', | ||||
|   'Folder': 'Diretório', | ||||
|   'Login failed, please try again': 'Login falhou, por favor tente novamente', | ||||
|   'Already logged in': 'Já está logado', | ||||
|   'Please enter username and password': 'Por favor entre com o nome de usuário e a senha', | ||||
|   'Not Found': 'Não encontrado', | ||||
|   'Not Allowed': 'Não autorizado', | ||||
|   'Please log in': 'Por favor faça o login', | ||||
|   'Unknown error': 'Erro desconhecido', | ||||
|   'Add files': 'Adicionar arquivos', | ||||
|   'New': 'Novo', | ||||
|   'New name': 'Novo nome', | ||||
|   'Username': 'Nome de usuário', | ||||
|   'Password': 'Senha', | ||||
|   'Login': 'Entrar', | ||||
|   'Logout': 'Sair', | ||||
|   'Profile': 'Perfil', | ||||
|   'No pagination': 'Sem paginação', | ||||
|   'Time': 'Data', | ||||
|   'Name': 'Nome', | ||||
|   'Size': 'Tamanho', | ||||
|   'Home': 'Página inicial', | ||||
|   'Copy': 'Copiar', | ||||
|   'Move': 'Mover', | ||||
|   'Rename': 'Renomear', | ||||
|   'Required': 'Por favor preencha este campo', | ||||
|   'Zip': 'Comprimir', | ||||
|   'Batch Download': 'Download em lote', | ||||
|   'Unzip': 'Descomprimir', | ||||
|   'Delete': 'Deletar', | ||||
|   'Download': 'Download', | ||||
|   'Copy link': 'Copiar link', | ||||
|   'Done': 'Finalizado', | ||||
|   'File': 'Arquivo', | ||||
|   'Drop files to upload': 'Arraste arquivos para fazer o upload', | ||||
|   'Close': 'Fechar', | ||||
|   'Select Folder': 'Selecionar diretório', | ||||
|   'Users': 'Usuários', | ||||
|   'Files': 'Arquivos', | ||||
|   'Role': 'Perfil', | ||||
|   'Cancel': 'Cancelar', | ||||
|   'Paused': 'Pausado', | ||||
|   'Confirm': 'Confirmar', | ||||
|   'Create': 'Criar', | ||||
|   'User': 'Usuário', | ||||
|   'Admin': 'Administrador', | ||||
|   'Save': 'Salvar', | ||||
|   'Read': 'Ler', | ||||
|   'Write': 'Escrever', | ||||
|   'Upload': 'Upload', | ||||
|   'Permissions': 'Permissões', | ||||
|   'Homedir': 'Página inicial', | ||||
|   'Leave blank for no change': 'Deixe em branco para não fazer nenhuma alteração', | ||||
|   'Are you sure you want to do this?': 'Tem certeza que deseja fazer isto?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Tem certeza que deseja permitir o acesso a todos?', | ||||
|   'Are you sure you want to stop all uploads?': 'Tem certeza que deseja parar todos os uploads?', | ||||
|   'Something went wrong': 'Algo deu errado', | ||||
|   'Invalid directory': 'Diretório inválido', | ||||
|   'This field is required': 'Este campo é obrigatório', | ||||
|   'Username already taken': 'O nome de usuário já existe', | ||||
|   'User not found': 'Usuário não encontrado', | ||||
|   'Old password': 'Senha atual', | ||||
|   'New password': 'Nova senha', | ||||
|   'Wrong password': 'Senha inválida', | ||||
|   'Updated': 'Atualizado', | ||||
|   'Deleted': 'Excluído', | ||||
|   'Your file is ready': 'Seu arquivo está pronto', | ||||
|   'View': 'Visualizar', | ||||
|   'Search': 'Procurar', | ||||
|   'Download permission': 'Download', | ||||
|   'Guest': 'Convidado', | ||||
|   'Show hidden': 'Mostrar ocultos', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/portuguese_br.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/portuguese_br.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Selecionado: {0} de {1}', | ||||
|   'Uploading files': 'Fazendo o upload {0}% de {1}', | ||||
|   'File size error': '{0} é muito grande, por favor faça o upload de ficheiros menores do que {1}', | ||||
|   'Upload failed': '{0} falhou ao fazer o upload', | ||||
|   'Per page': '{0} Por Página', | ||||
|   'Folder': 'Pasta', | ||||
|   'Login failed, please try again': 'Login falhou, por favor, tente novamente.', | ||||
|   'Already logged in': 'Já está logado.', | ||||
|   'Please enter username and password': 'Por favor, entre com o nome de utilizador e senha.', | ||||
|   'Not Found': 'Não Encontrado', | ||||
|   'Not Allowed': 'Não Autorizado', | ||||
|   'Please log in': 'Por favor, faça o login', | ||||
|   'Unknown error': 'Erro desconhecido', | ||||
|   'Add files': 'Adicionar ficheiros', | ||||
|   'New': 'Novo', | ||||
|   'New name': 'Novo nome', | ||||
|   'Username': 'Nome de utilizador', | ||||
|   'Password': 'Senha', | ||||
|   'Login': 'Entrar', | ||||
|   'Logout': 'Sair', | ||||
|   'Profile': 'Perfil', | ||||
|   'No pagination': 'Sem Paginação', | ||||
|   'Time': 'Tempo', | ||||
|   'Name': 'Nome', | ||||
|   'Size': 'Tamanho', | ||||
|   'Home': 'Página inicial', | ||||
|   'Copy': 'Copiar', | ||||
|   'Move': 'Mover', | ||||
|   'Rename': 'Renomear', | ||||
|   'Required': 'Por favor, preencha este campo', | ||||
|   'Zip': 'Comprimir', | ||||
|   'Batch Download': 'Download em lotes', | ||||
|   'Unzip': 'Descomprimir', | ||||
|   'Delete': 'Apagar', | ||||
|   'Download': 'Download', | ||||
|   'Copy link': 'Copiar link', | ||||
|   'Done': 'Finalizado', | ||||
|   'File': 'Ficheiro', | ||||
|   'Drop files to upload': 'Arraste ficheiros para fazer o upload', | ||||
|   'Close': 'Fechar', | ||||
|   'Select Folder': 'Selecionar Pasta', | ||||
|   'Users': 'Utilizadores', | ||||
|   'Files': 'Ficheiros', | ||||
|   'Role': 'Posição', | ||||
|   'Cancel': 'Cancelar', | ||||
|   'Paused': 'Parado', | ||||
|   'Confirm': 'Confirmar', | ||||
|   'Create': 'Criar', | ||||
|   'User': 'Utilizador', | ||||
|   'Admin': 'Administrador', | ||||
|   'Save': 'Guardar', | ||||
|   'Read': 'Ler', | ||||
|   'Write': 'Escrever', | ||||
|   'Upload': 'Upload', | ||||
|   'Permissions': 'Permissões', | ||||
|   'Homedir': 'Pasta da página inicial', | ||||
|   'Leave blank for no change': 'Deixe em branco para não fazer nenhuma alteração', | ||||
|   'Are you sure you want to do this?': 'Tem a certeza que deseja fazer isto?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Tem a certeza que deseja permitir o acesso a todos?', | ||||
|   'Are you sure you want to stop all uploads?': 'Tem a certeza que deseja parar todos os uploads?', | ||||
|   'Something went wrong': 'Algo deu errado', | ||||
|   'Invalid directory': 'Pasta inválida', | ||||
|   'This field is required': 'Este ficheiro é obrigatório', | ||||
|   'Username already taken': 'O nome de utilizador já existe', | ||||
|   'User not found': 'Utilizador não encontrado', | ||||
|   'Old password': 'Senha atual', | ||||
|   'New password': 'Nova senha', | ||||
|   'Wrong password': 'Senha inválida', | ||||
|   'Updated': 'Atualizado', | ||||
|   'Deleted': 'Excluído', | ||||
|   'Your file is ready': 'O seu ficheiro está pronto', | ||||
|   'View': 'Vista', | ||||
|   'Search': 'Pesquisar', | ||||
|   'Download permission': 'Transferir', | ||||
|   'Guest': 'Convidado', | ||||
|   'Show hidden': 'Mostrar ocultos' | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/romanian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/romanian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Marcat: {0} din {1}', | ||||
|   'Uploading files': 'Se încarcă {0}% din {1}', | ||||
|   'File size error': '{0} este prea mare, încărcați fișiere mai mici decât {1}', | ||||
|   'Upload failed': '{0} a eșuat să se încarce', | ||||
|   'Per page': '{0} Per Pagină', | ||||
|   'Folder': 'Dosar', | ||||
|   'Login failed, please try again': 'Autentificare eșuată, încercați din nou', | ||||
|   'Already logged in': 'Deja autentificat.', | ||||
|   'Please enter username and password': 'Introduceți numele de utilizator și parola.', | ||||
|   'Not Found': 'Negăsit', | ||||
|   'Not Allowed': 'Nepermis', | ||||
|   'Please log in': 'Autentificați-vă', | ||||
|   'Unknown error': 'Eroare necunoscută', | ||||
|   'Add files': 'Adaugă fișiere', | ||||
|   'New': 'Nou', | ||||
|   'New name': 'Nume nou', | ||||
|   'Username': 'Nume utilizator', | ||||
|   'Password': 'Parola', | ||||
|   'Login': 'Autentificare', | ||||
|   'Logout': 'Deconectare', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Fără paginare', | ||||
|   'Time': 'Timp', | ||||
|   'Name': 'Nume', | ||||
|   'Size': 'Dimensiune', | ||||
|   'Home': 'Acasă', | ||||
|   'Copy': 'Copiere', | ||||
|   'Move': 'Mutare', | ||||
|   'Rename': 'Redenumire', | ||||
|   'Required': 'Completați acest câmp', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Descărcare grupată', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Ștergere', | ||||
|   'Download': 'Descărcare', | ||||
|   'Copy link': 'Copiere adresă', | ||||
|   'Done': 'Finalizat', | ||||
|   'File': 'Fișier', | ||||
|   'Drop files to upload': 'Aruncați aici fișierul pentru încărcare', | ||||
|   'Close': 'Închidere', | ||||
|   'Select Folder': 'Alege dosar', | ||||
|   'Users': 'Utilizatori', | ||||
|   'Files': 'Fișiere', | ||||
|   'Role': 'Rol', | ||||
|   'Cancel': 'Anulare', | ||||
|   'Paused': 'Suspendat', | ||||
|   'Confirm': 'Confirmare', | ||||
|   'Create': 'Creare', | ||||
|   'User': 'Utilizator', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Salvare', | ||||
|   'Read': 'Citire', | ||||
|   'Write': 'Scriere', | ||||
|   'Upload': 'Încărcare', | ||||
|   'Permissions': 'Permisiuni', | ||||
|   'Homedir': 'Dosar acasă', | ||||
|   'Leave blank for no change': 'Lăsați liber pentru nici o schimbare', | ||||
|   'Are you sure you want to do this?': 'Sunteți sigur că doriți să faceți asta?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Sunteți sigur că doriți să permiteți accesul tuturor?', | ||||
|   'Are you sure you want to stop all uploads?': 'Sunteți sigur că doriți oprirea tuturor încărcărilor?', | ||||
|   'Something went wrong': 'Ceva a mers greșit', | ||||
|   'Invalid directory': 'Dosar invalid', | ||||
|   'This field is required': 'Acest câmp este obligatoriu', | ||||
|   'Username already taken': 'Nume de utilizator deja luat', | ||||
|   'User not found': 'Utilizator negăsit', | ||||
|   'Old password': 'Parola veche', | ||||
|   'New password': 'Parola nouă', | ||||
|   'Wrong password': 'Parolă greșită', | ||||
|   'Updated': 'Modificat', | ||||
|   'Deleted': 'Șters', | ||||
|   'Your file is ready': 'Fișierul este pregătit', | ||||
|   'View': 'Vizualizare', | ||||
|   'Search': 'Căutare', | ||||
|   'Download permission': 'Descărcare', | ||||
|   'Guest': 'Oaspete', | ||||
|   'Show hidden': 'Arată ascunse', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/russian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/russian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Выбрано: {0} из {1}', | ||||
|   'Uploading files': 'Загрузка {0}% of {1}', | ||||
|   'File size error': '{0} слишком большой, пожалуйста, загрузите файл меньше {1}', | ||||
|   'Upload failed': '{0} не удалось загрузить', | ||||
|   'Per page': '{0} На страницу', | ||||
|   'Folder': 'Папка', | ||||
|   'Login failed, please try again': 'Вход не выполнен. Пожалуйста попробуйте еще раз', | ||||
|   'Already logged in': 'Уже авторизован.', | ||||
|   'Please enter username and password': 'Пожалуйста, введите имя пользователя и пароль.', | ||||
|   'Not Found': 'Не найдено', | ||||
|   'Not Allowed': 'Не разрешено', | ||||
|   'Please log in': 'Пожалуйста, войдите', | ||||
|   'Unknown error': 'Неизвестная ошибка', | ||||
|   'Add files': 'Добавить файлы', | ||||
|   'New': 'Создать', | ||||
|   'New name': 'Новое имя', | ||||
|   'Username': 'Имя пользователя', | ||||
|   'Password': 'Пароль', | ||||
|   'Login': 'Вход', | ||||
|   'Logout': 'Выход', | ||||
|   'Profile': 'Профиль', | ||||
|   'No pagination': 'Без разбивки на страницы', | ||||
|   'Time': 'Время', | ||||
|   'Name': 'Имя', | ||||
|   'Size': 'Размер', | ||||
|   'Home': 'Главная', | ||||
|   'Copy': 'Копировать', | ||||
|   'Move': 'Переместить', | ||||
|   'Rename': 'Переименовать', | ||||
|   'Required': 'Пожалуйста, заполните это поле', | ||||
|   'Zip': 'Архивировать zip', | ||||
|   'Batch Download': 'Пакетная загрузка', | ||||
|   'Unzip': 'Разархивировать zip архив', | ||||
|   'Delete': 'Удалить', | ||||
|   'Download': 'Скачать', | ||||
|   'Copy link': 'Скопировать ссылку', | ||||
|   'Done': 'Готово', | ||||
|   'File': 'Файл', | ||||
|   'Drop files to upload': 'Перетащите файлы для загрузки', | ||||
|   'Close': 'Закрыть', | ||||
|   'Select Folder': 'Выберите папку', | ||||
|   'Users': 'Пользователи', | ||||
|   'Files': 'Файлы', | ||||
|   'Role': 'Роли', | ||||
|   'Cancel': 'Отмена', | ||||
|   'Paused': 'Приостановлено', | ||||
|   'Confirm': 'Подтвердить', | ||||
|   'Create': 'Создать', | ||||
|   'User': 'Пользователь', | ||||
|   'Admin': 'Админ', | ||||
|   'Save': 'Сохранить', | ||||
|   'Read': 'Чтение', | ||||
|   'Write': 'Запись', | ||||
|   'Upload': 'Загрузка', | ||||
|   'Permissions': 'Разрешения', | ||||
|   'Homedir': 'Домашняя папка', | ||||
|   'Leave blank for no change': 'Оставьте поле пустым, чтобы оставить без изменений', | ||||
|   'Are you sure you want to do this?': 'Вы уверены, что хотите выполнить это действие?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Вы уверены, что хотите предоставить доступ всем?', | ||||
|   'Are you sure you want to stop all uploads?': 'Вы уверены, что хотите остановить все загрузки?', | ||||
|   'Something went wrong': 'Что-то пошло не так', | ||||
|   'Invalid directory': 'Недействительная папка', | ||||
|   'This field is required': 'Это поле обязательное', | ||||
|   'Username already taken': 'Имя пользователя уже занято', | ||||
|   'User not found': 'Пользователь не найден', | ||||
|   'Old password': 'Старый пароль', | ||||
|   'New password': 'Новый пароль', | ||||
|   'Wrong password': 'Неверный пароль', | ||||
|   'Updated': 'Обновлено', | ||||
|   'Deleted': 'Удалено', | ||||
|   'Your file is ready': 'Ваш файл готов', | ||||
|   'View': 'Просмотр', | ||||
|   'Search': 'Поиск', | ||||
|   'Download permission': 'Скачивание', | ||||
|   'Guest': 'Гость', | ||||
|   'Show hidden': 'Показать скрытое', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/serbian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/serbian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Izabrano: {0} od {1}', | ||||
|   'Uploading files': 'Slanje {0}% od {1}', | ||||
|   'File size error': '{0} fajl je preveliki, molim pošaljite fajl manji od {1}', | ||||
|   'Upload failed': '{0} greška kod slanja', | ||||
|   'Per page': '{0} Po strani', | ||||
|   'Folder': 'Folder', | ||||
|   'Login failed, please try again': 'Neuspešna prijava, probajte ponovo', | ||||
|   'Already logged in': 'Već prijavljen.', | ||||
|   'Please enter username and password': 'Unesite korisničko ime i lozinku.', | ||||
|   'Not Found': 'Nije pronađen', | ||||
|   'Not Allowed': 'Nije dozvoljeno', | ||||
|   'Please log in': 'Molim prijavite se', | ||||
|   'Unknown error': 'Nepoznata greška', | ||||
|   'Add files': 'Dodaj fajlove', | ||||
|   'New': 'Novi', | ||||
|   'New name': 'Novo ime', | ||||
|   'Username': 'Korisničko ime', | ||||
|   'Password': 'Lozinka', | ||||
|   'Login': 'Prijavi se', | ||||
|   'Logout': 'Odjavi se', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Bez listanja po strani', | ||||
|   'Time': 'Vreme', | ||||
|   'Name': 'Ime', | ||||
|   'Size': 'Veličina', | ||||
|   'Home': 'Početna', | ||||
|   'Copy': 'Kopiraj', | ||||
|   'Move': 'Premesti', | ||||
|   'Rename': 'Promeni ime', | ||||
|   'Required': 'Ovo polje je obavezno', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Grupno preuzimanje', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Obriši', | ||||
|   'Download': 'Preuzmi', | ||||
|   'Copy link': 'Kopiraj link', | ||||
|   'Done': 'Gotovo', | ||||
|   'File': 'Fajl', | ||||
|   'Drop files to upload': 'Spusti fajlove za slanje', | ||||
|   'Close': 'Zatvori', | ||||
|   'Select Folder': 'Izaberi folder', | ||||
|   'Users': 'Korisnici', | ||||
|   'Files': 'Fajlovi', | ||||
|   'Role': 'Prava', | ||||
|   'Cancel': 'Otkaži', | ||||
|   'Paused': 'Pauzirano', | ||||
|   'Confirm': 'Potvrdi', | ||||
|   'Create': 'Kreiraj', | ||||
|   'User': 'Korisnik', | ||||
|   'Admin': 'Administrator', | ||||
|   'Save': 'Sačuvaj', | ||||
|   'Read': 'Čitanje', | ||||
|   'Write': 'Upis', | ||||
|   'Upload': 'Slanje', | ||||
|   'Permissions': 'Prava pristupa', | ||||
|   'Homedir': 'Početni folder', | ||||
|   'Leave blank for no change': 'Ostavi prazno da ne promeniš', | ||||
|   'Are you sure you want to do this?': 'Da li ste sigurni?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Da li ste sigurni da želite da dozvolite pristup svima?', | ||||
|   'Are you sure you want to stop all uploads?': 'Da li ste sigurni da želite da prekinete sva slanja?', | ||||
|   'Something went wrong': 'Dogodila se nepoznata greška', | ||||
|   'Invalid directory': 'Pogrešan folder', | ||||
|   'This field is required': 'Ovo polje je obavezno', | ||||
|   'Username already taken': 'Korisničko ime već postoji', | ||||
|   'User not found': 'Korisnik nije pronađen', | ||||
|   'Old password': 'Stara lozinka', | ||||
|   'New password': 'Nova lozinka', | ||||
|   'Wrong password': 'Pogrešna lozinka', | ||||
|   'Updated': 'Izmenjeno', | ||||
|   'Deleted': 'Obrisano', | ||||
|   'Your file is ready': 'Vaš fajl je spreman', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Preuzimanje', | ||||
|   'Guest': 'Gost', | ||||
|   'Show hidden': 'Prikaži skriveno', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/slovak.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/slovak.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Vybrané: {0} z {1}', | ||||
|   'Uploading files': 'Nahrávam {0}% z {1}', | ||||
|   'File size error': '{0} je príliš veľký, nahrávajte súbory menšie ako {1}', | ||||
|   'Upload failed': '{0} sa nepodarilo nahrať', | ||||
|   'Per page': '{0} na stránku', | ||||
|   'Folder': 'Adresár', | ||||
|   'Login failed, please try again': 'Prihlásenie neúspešné, skúste to znova', | ||||
|   'Already logged in': 'Už ste prihlásený.', | ||||
|   'Please enter username and password': 'Zadajte prihlasovacie meno a heslo.', | ||||
|   'Not Found': 'Nenájdené', | ||||
|   'Not Allowed': 'Nepovolené', | ||||
|   'Please log in': 'Prihláste sa', | ||||
|   'Unknown error': 'Neznáma chyba', | ||||
|   'Add files': 'Pridať súbory', | ||||
|   'New': 'Nový', | ||||
|   'New name': 'Nové meno', | ||||
|   'Username': 'Prihlasovacie meno', | ||||
|   'Password': 'Heslo', | ||||
|   'Login': 'Prihlásiť sa', | ||||
|   'Logout': 'Odhlásiť sa', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Bez stránkovania', | ||||
|   'Time': 'Čas', | ||||
|   'Name': 'Meno', | ||||
|   'Size': 'Veľkosť', | ||||
|   'Home': 'Hlavný adresár', | ||||
|   'Copy': 'Kopírovať', | ||||
|   'Move': 'Presunúť', | ||||
|   'Rename': 'Premenovať', | ||||
|   'Required': 'Vyplňte toto pole', | ||||
|   'Zip': 'Archivovať do zip', | ||||
|   'Batch Download': 'Hromadné sťahovanie', | ||||
|   'Unzip': 'Rozbaliť zip archív', | ||||
|   'Delete': 'Vymazať', | ||||
|   'Download': 'Stiahnuť', | ||||
|   'Copy link': 'Skopírovať odkaz', | ||||
|   'Done': 'Hotovo', | ||||
|   'File': 'Súbor', | ||||
|   'Drop files to upload': 'Pre nahratie presuňte súbory sem', | ||||
|   'Close': 'Zavrieť', | ||||
|   'Select Folder': 'Vyberte adresár', | ||||
|   'Users': 'Používatelia', | ||||
|   'Files': 'Súbory', | ||||
|   'Role': 'Typ účtu', | ||||
|   'Cancel': 'Zrušiť', | ||||
|   'Paused': 'Pozastavené', | ||||
|   'Confirm': 'Potvrdiť', | ||||
|   'Create': 'Vytvoriť', | ||||
|   'User': 'Používateľ', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Uložiť', | ||||
|   'Read': 'Čítanie', | ||||
|   'Write': 'Zapisovanie', | ||||
|   'Upload': 'Nahrávanie', | ||||
|   'Permissions': 'Oprávnenia', | ||||
|   'Homedir': 'Hlavný adresár', | ||||
|   'Leave blank for no change': 'Ak nechcete zmeniť nechajte prázdne', | ||||
|   'Are you sure you want to do this?': 'Naozaj to chcete urobiť?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Naozaj chcete povoliť prístup bez hesla?', | ||||
|   'Are you sure you want to stop all uploads?': 'Naozaj chcete zastaviť všetky nahrávania?', | ||||
|   'Something went wrong': 'Niečo sa pokazilo', | ||||
|   'Invalid directory': 'Neplatný adresár', | ||||
|   'This field is required': 'Toto pole je povinné', | ||||
|   'Username already taken': 'Toto prihlasovacie meno sa už používa', | ||||
|   'User not found': 'Používateľ sa nenašiel', | ||||
|   'Old password': 'Staré heslo', | ||||
|   'New password': 'Nové heslo', | ||||
|   'Wrong password': 'Zlé heslo', | ||||
|   'Updated': 'Aktualizované', | ||||
|   'Deleted': 'Vymazané', | ||||
|   'Your file is ready': 'Váš súbor je pripravený', | ||||
|   'View': 'Zobraziť', | ||||
|   'Search': 'Vyhľadávanie', | ||||
|   'Download permission': 'Sťahovanie', | ||||
|   'Guest': 'Hosť', | ||||
|   'Show hidden': 'Zobraziť skryté', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/slovenian.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/slovenian.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Izabrano: {0} od {1}', | ||||
|   'Uploading files': 'Nalaganje {0}% od {1}', | ||||
|   'File size error': '{0} datoteka je prevelika, prosimo, naložite datoteko, manjšo od {1}', | ||||
|   'Upload failed': '{0} napaka med nalaganjem', | ||||
|   'Per page': '{0} Na stran', | ||||
|   'Folder': 'Mapa', | ||||
|   'Login failed, please try again': 'Neuspešna prijava, prosimo, poskusite ponovno', | ||||
|   'Already logged in': 'Ste že prijavljeni.', | ||||
|   'Please enter username and password': 'Vnesite uporabniško ime in geslo.', | ||||
|   'Not Found': 'Ni najdeno', | ||||
|   'Not Allowed': 'Ni dovoljeno', | ||||
|   'Please log in': 'Prosimo, prijavite se', | ||||
|   'Unknown error': 'Neznana napaka', | ||||
|   'Add files': 'Dodaj datoteke', | ||||
|   'New': 'Nov', | ||||
|   'New name': 'Novo ime', | ||||
|   'Username': 'Uporabniško ime', | ||||
|   'Password': 'Geslo', | ||||
|   'Login': 'Prijavi se', | ||||
|   'Logout': 'Odjavi se', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Brez listanja po strani', | ||||
|   'Time': 'Čas', | ||||
|   'Name': 'Ime', | ||||
|   'Size': 'Velikost', | ||||
|   'Home': 'Začetna stran', | ||||
|   'Copy': 'Kopiraj', | ||||
|   'Move': 'Premakni', | ||||
|   'Rename': 'Preimenuj', | ||||
|   'Required': 'To polje je obvezno', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Skupinsko nalaganje', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Izbriši', | ||||
|   'Download': 'Prenesi', | ||||
|   'Copy link': 'Kopiraj link', | ||||
|   'Done': 'Narejeno', | ||||
|   'File': 'Datoteka', | ||||
|   'Drop files to upload': 'Spusti datoteke za nalaganje', | ||||
|   'Close': 'Zapri', | ||||
|   'Select Folder': 'Izberi mapo', | ||||
|   'Users': 'Uporabniki', | ||||
|   'Files': 'Datotele', | ||||
|   'Role': 'Pravice', | ||||
|   'Cancel': 'Prekliči', | ||||
|   'Paused': 'Prekini', | ||||
|   'Confirm': 'Potrdi', | ||||
|   'Create': 'Ustvari', | ||||
|   'User': 'Uporabnik', | ||||
|   'Admin': 'Administrator', | ||||
|   'Save': 'Shrani', | ||||
|   'Read': 'Branje', | ||||
|   'Write': 'Pisanje', | ||||
|   'Upload': 'Nalaganje', | ||||
|   'Permissions': 'Pravice dostopa', | ||||
|   'Homedir': 'Začetna', | ||||
|   'Leave blank for no change': 'Pustite prazno, če ne želite spremeniti', | ||||
|   'Are you sure you want to do this?': 'Ste prepričani?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Ste prepričani, da želite dovoliti dostop vsem?', | ||||
|   'Are you sure you want to stop all uploads?': 'Ste prepričani, da želite prekiniti vse prenose?', | ||||
|   'Something went wrong': 'Neznana napaka', | ||||
|   'Invalid directory': 'Napačna mapa', | ||||
|   'This field is required': 'To polje je obvezno', | ||||
|   'Username already taken': 'Uporabniško ime že obstaja', | ||||
|   'User not found': 'Uporabnik ni bil najden', | ||||
|   'Old password': 'Staro geslo', | ||||
|   'New password': 'Novo geslo', | ||||
|   'Wrong password': 'Napačno geslo', | ||||
|   'Updated': 'Posodobljeno', | ||||
|   'Deleted': 'Zbrisano', | ||||
|   'Your file is ready': 'Datoteka je pripravljena', | ||||
|   'View': 'Poglej', | ||||
|   'Search': 'Išči', | ||||
|   'Download permission': 'Prenos', | ||||
|   'Guest': 'Gost', | ||||
|   'Show hidden': 'Prikaži skrito', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										80
									
								
								frontend/translations/spanish.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								frontend/translations/spanish.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| const data = { | ||||
|   'Selected': 'Seleccionados: {0} de {1}', | ||||
|   'Uploading files': 'Subiendo {0}% de {1}', | ||||
|   'File size error': '{0} es demasiado grande, por favor suba ficheros menores a {1}', | ||||
|   'Upload failed': '{0} no se pudo subir', | ||||
|   'Per page': '{0} por página', | ||||
|   'Folder': 'Carpeta', | ||||
|   'Login failed, please try again': 'Inicio de sesión incorrecto, por favor pruebe de nuevo', | ||||
|   'Already logged in': 'Ya había iniciado sesión.', | ||||
|   'Please enter username and password': 'Por favor, escriba nombre de usuario y contraseña.', | ||||
|   'Not Found': 'No encontrado', | ||||
|   'Not Allowed': 'No permitido', | ||||
|   'Please log in': 'Por favor, inicie sesión', | ||||
|   'Unknown error': 'Error desconocido', | ||||
|   'Add files': 'Añadir ficheros', | ||||
|   'New': 'Nuevo', | ||||
|   'New name': 'Nuevo nombre', | ||||
|   'Username': 'Nombre de usuario', | ||||
|   'Password': 'Contraseña', | ||||
|   'Login': 'Iniciar sesión', | ||||
|   'Logout': 'Salir', | ||||
|   'Profile': 'Perfil', | ||||
|   'No pagination': 'Sin paginación', | ||||
|   'Time': 'Fecha', | ||||
|   'Name': 'Nombre', | ||||
|   'Size': 'Tamaño', | ||||
|   'Home': 'Carpeta principal', | ||||
|   'Copy': 'Copiar', | ||||
|   'Move': 'Mover', | ||||
|   'Rename': 'Renombrar', | ||||
|   'Required': 'Por favor, rellene este campo', | ||||
|   'Zip': 'Comprimir', | ||||
|   'Batch Download': 'Descarga por lotes', | ||||
|   'Unzip': 'Descomprimir', | ||||
|   'Delete': 'Eliminar', | ||||
|   'Download': 'Descargar', | ||||
|   'Copy link': 'Copiar enlace', | ||||
|   'Done': 'Hecho', | ||||
|   'File': 'Archivo', | ||||
|   'Drop files to upload': 'Soltar archivos para subir', | ||||
|   'Close': 'Cerrar', | ||||
|   'Select Folder': 'Seleccionar carpeta', | ||||
|   'Users': 'Usuarios', | ||||
|   'Files': 'Ficheros', | ||||
|   'Role': 'Rol', | ||||
|   'Cancel': 'Cancelar', | ||||
|   'Paused': 'Pausado', | ||||
|   'Confirm': 'Confirmar', | ||||
|   'Create': 'Crear', | ||||
|   'User': 'Usuario', | ||||
|   'Admin': 'Administrador', | ||||
|   'Save': 'Guardar', | ||||
|   'Read': 'Leer', | ||||
|   'Write': 'Escribir', | ||||
|   'Upload': 'Subir', | ||||
|   'Permissions': 'Permisos', | ||||
|   'Homedir': 'Carpeta inicial', | ||||
|   'Leave blank for no change': 'Dejar en blanco para no cambiar', | ||||
|   'Are you sure you want to do this?': '¿Seguro que quiere hacer esto?', | ||||
|   'Are you sure you want to allow access to everyone?': '¿Seguro que quiere permitir el acceso a todo el mundo?', | ||||
|   'Are you sure you want to stop all uploads?': '¿Seguro que quiere parar todas las subidas?', | ||||
|   'Something went wrong': 'Algo ha ido mal', | ||||
|   'Invalid directory': 'Carpeta incorrecta', | ||||
|   'This field is required': 'Este campo es obligatorio', | ||||
|   'Username already taken': 'El nombre de usuario ya existe', | ||||
|   'User not found': 'Usuario no encontrado', | ||||
|   'Old password': 'Contraseña anterior', | ||||
|   'New password': 'Nueva contraseña', | ||||
|   'Wrong password': 'Contraseña incorrecta', | ||||
|   'Updated': 'Actualizado', | ||||
|   'Deleted': 'Eliminado', | ||||
|   'Your file is ready': 'Su fichero está listo', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'Descargar', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Mostrar oculto', | ||||
| } | ||||
|  | ||||
| export default data | ||||
							
								
								
									
										81
									
								
								frontend/translations/swedish.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/swedish.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Vald: {0} of {1}', | ||||
|   'Uploading files': 'Laddar upp {0}% of {1}', | ||||
|   'File size error': '{0} är för stor, max filstorlek är {1}', | ||||
|   'Upload failed': '{0} uppladdning misslyckades', | ||||
|   'Per page': '{0} Per sida', | ||||
|   'Folder': 'Mapp', | ||||
|   'Login failed, please try again': 'Inloggning misslyckades, försök igen.', | ||||
|   'Already logged in': 'Redan inloggad.', | ||||
|   'Please enter username and password': 'Ange användarnamn och lösenord.', | ||||
|   'Not Found': 'Ej funnen', | ||||
|   'Not Allowed': 'Ej tillåten', | ||||
|   'Please log in': 'Var vanlig logga in.', | ||||
|   'Unknown error': 'Okänt fel', | ||||
|   'Add files': 'Lägg till filer', | ||||
|   'New': 'Ny', | ||||
|   'New name': 'Nytt namn', | ||||
|   'Username': 'Användarnamn', | ||||
|   'Password': 'Lösenord', | ||||
|   'Login': 'Logga in', | ||||
|   'Logout': 'Logga ut', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Sidhantering', | ||||
|   'Time': 'Tid', | ||||
|   'Name': 'Namn', | ||||
|   'Size': 'Storlek', | ||||
|   'Home': 'Hem', | ||||
|   'Copy': 'Kopiera', | ||||
|   'Move': 'Flytta', | ||||
|   'Rename': 'Byt namn', | ||||
|   'Required': 'Vänligen fyll i detta fält', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Batch nedladdning', | ||||
|   'Unzip': 'Unzip', | ||||
|   'Delete': 'Borttag', | ||||
|   'Download': 'Ladda ned', | ||||
|   'Copy link': 'Kopiera länk', | ||||
|   'Done': 'Klar', | ||||
|   'File': 'Fil', | ||||
|   'Drop files to upload': 'Släpp filer för uppladdning', | ||||
|   'Close': 'Stäng', | ||||
|   'Select Folder': 'Välj mapp', | ||||
|   'Users': 'Användare', | ||||
|   'Files': 'Filer', | ||||
|   'Role': 'Roll', | ||||
|   'Cancel': 'Avbryt', | ||||
|   'Paused': 'Pausad', | ||||
|   'Confirm': 'Godkänn', | ||||
|   'Create': 'Skapa', | ||||
|   'User': 'Användare', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Spara', | ||||
|   'Read': 'Läs', | ||||
|   'Write': 'Skriv', | ||||
|   'Upload': 'Ladda upp', | ||||
|   'Permissions': 'Behörigheter', | ||||
|   'Homedir': 'Hem mapp', | ||||
|   'Leave blank for no change': 'Lämna blankt för ingen ändring', | ||||
|   'Are you sure you want to do this?': 'Är du säker på att du vill göra detta?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Vill du verkligen ge access till alla?', | ||||
|   'Are you sure you want to stop all uploads?': 'Vill du stoppa alla uppladdningar?', | ||||
|   'Something went wrong': 'Något gick fel', | ||||
|   'Invalid directory': 'Ogiltig mapp', | ||||
|   'This field is required': 'Detta fält krävs', | ||||
|   'Username already taken': 'Användarnamnet finns redan', | ||||
|   'User not found': 'Användaren hittas inte', | ||||
|   'Old password': 'Gammalt lösenord', | ||||
|   'New password': 'Nytt lösenord', | ||||
|   'Wrong password': 'fel lösenord', | ||||
|   'Updated': 'Uppdaterad', | ||||
|   'Deleted': 'Borttagen', | ||||
|   'Your file is ready': 'Din fil är klar', | ||||
|   'View': 'Visa', | ||||
|   'Search': 'Sök', | ||||
|   'Download permission': 'Ladda ned', | ||||
|   'Guest': 'Gäst', | ||||
|   'Show hidden': 'Visa dold', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										81
									
								
								frontend/translations/turkish.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								frontend/translations/turkish.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| const data = { | ||||
|   'Selected': 'Seçilen: {0} - {1}', | ||||
|   'Uploading files': 'Yükleniyor {0}% - {1}', | ||||
|   'File size error': '{0} çok büyük, lütfen {1} den küçük dosya yükleyin', | ||||
|   'Upload failed': '{0} yüklenemedi', | ||||
|   'Per page': 'Sayfa başına {0} tane', | ||||
|   'Folder': 'Klasör', | ||||
|   'Login failed, please try again': 'Giriş başarısız. Lütfen tekrar deneyin', | ||||
|   'Already logged in': 'Zaten giriş yapılmış.', | ||||
|   'Please enter username and password': 'Lütfen kullanıcı adınızı ve şifrenizi giriniz.', | ||||
|   'Not Found': 'Bulunamadı', | ||||
|   'Not Allowed': 'İzin verilmedi', | ||||
|   'Please log in': 'Lütfen giriş yapın', | ||||
|   'Unknown error': 'Bilinmeyen hata', | ||||
|   'Add files': 'Dosya Ekle', | ||||
|   'New': 'Yeni', | ||||
|   'New name': 'Yeni Ad', | ||||
|   'Username': 'Kullanıcı Adı', | ||||
|   'Password': 'Parola', | ||||
|   'Login': 'Giriş', | ||||
|   'Logout': 'Çıkış', | ||||
|   'Profile': 'Profil', | ||||
|   'No pagination': 'Sayfa Yok', | ||||
|   'Time': 'Zaman', | ||||
|   'Name': 'Ad', | ||||
|   'Size': 'Boyut', | ||||
|   'Home': 'Anasayfa', | ||||
|   'Copy': 'Kopyala', | ||||
|   'Move': 'Taşı', | ||||
|   'Rename': 'Yeniden adlandır', | ||||
|   'Required': 'Lütfen bu alanı doldurun', | ||||
|   'Zip': 'Zip', | ||||
|   'Batch Download': 'Batch İndirme', | ||||
|   'Unzip': 'Zipi çıkart', | ||||
|   'Delete': 'Sil', | ||||
|   'Download': 'İndir', | ||||
|   'Copy link': 'Bağlantıyı Kopyala', | ||||
|   'Done': 'Tamam', | ||||
|   'File': 'Dosya', | ||||
|   'Drop files to upload': 'Yüklemek için dosyayı sürükle', | ||||
|   'Close': 'Kapat', | ||||
|   'Select Folder': 'Klasör Seç', | ||||
|   'Users': 'Kullanıcılar', | ||||
|   'Files': 'Dosyalar', | ||||
|   'Role': 'Rol', | ||||
|   'Cancel': 'İptal', | ||||
|   'Paused': 'Durduruldu', | ||||
|   'Confirm': 'Onayla', | ||||
|   'Create': 'Oluştur', | ||||
|   'User': 'Kullanıcı', | ||||
|   'Admin': 'Admin', | ||||
|   'Save': 'Kaydet', | ||||
|   'Read': 'Okuma', | ||||
|   'Write': 'Yazma', | ||||
|   'Upload': 'Yükleme', | ||||
|   'Permissions': 'İzimler', | ||||
|   'Homedir': 'Ana Klasör', | ||||
|   'Leave blank for no change': 'Değişiklik yapmamak için boş bırakın', | ||||
|   'Are you sure you want to do this?': 'Bunu yapmak istediğinizden emin misiniz?', | ||||
|   'Are you sure you want to allow access to everyone?': 'Herkese erişime izin vermek istediğinizinden emin misiniz?', | ||||
|   'Are you sure you want to stop all uploads?': 'Tüm yüklemeleri durdurmak istediğinizden emin misiniz?', | ||||
|   'Something went wrong': 'Bir şeyler yanlış gitti', | ||||
|   'Invalid directory': 'Geçersiz dizin', | ||||
|   'This field is required': 'Bu alan gereklidir', | ||||
|   'Username already taken': 'Kullanıcı adı önceden alınmış', | ||||
|   'User not found': 'Kullanıcı bulunamadı', | ||||
|   'Old password': 'Eski parola', | ||||
|   'New password': 'Yeni parola', | ||||
|   'Wrong password': 'parola hatalı', | ||||
|   'Updated': 'Güncellendi', | ||||
|   'Deleted': 'Silindi', | ||||
|   'Your file is ready': 'Dosyanız Hazır', | ||||
|   'View': 'View', | ||||
|   'Search': 'Search', | ||||
|   'Download permission': 'İndir', | ||||
|   'Guest': 'Guest', | ||||
|   'Show hidden': 'Gizlenenleri göster', | ||||
| } | ||||
|  | ||||
| export default data | ||||
|  | ||||
							
								
								
									
										653
									
								
								frontend/views/Browser.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										653
									
								
								frontend/views/Browser.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,653 @@ | ||||
| <template> | ||||
|   <div id="dropzone" class="container" | ||||
|        @dragover="dropZone = can('upload') && ! isLoading ? true : false" | ||||
|        @dragleave="dropZone = false" | ||||
|        @drop="dropZone = false" | ||||
|   > | ||||
|     <div v-if="isLoading" id="loading" /> | ||||
|  | ||||
|     <Upload v-if="can('upload')" v-show="dropZone == false" :files="files" :drop-zone="dropZone" /> | ||||
|  | ||||
|     <b-upload v-if="dropZone && ! isLoading" multiple drag-drop> | ||||
|       <b class="drop-info">{{ lang('Drop files to upload') }}</b> | ||||
|     </b-upload> | ||||
|  | ||||
|     <div v-if="!dropZone" class="container"> | ||||
|       <Menu /> | ||||
|  | ||||
|       <div id="browser"> | ||||
|         <div v-if="can('read')" class="is-flex is-justify-between"> | ||||
|           <div class="breadcrumb" aria-label="breadcrumbs"> | ||||
|             <ul> | ||||
|               <li v-for="(item, index) in breadcrumbs" :key="index"> | ||||
|                 <a @click="goTo(item.path)">{{ item.name }}</a> | ||||
|               </li> | ||||
|             </ul> | ||||
|           </div> | ||||
|           <div> | ||||
|             <a id="search" class="search-btn" @click="search"> | ||||
|               <b-icon icon="search" size="is-small" /> | ||||
|             </a> | ||||
|             <a id="sitemap" class="is-paddingless" @click="selectDir"> | ||||
|               <b-icon icon="sitemap" size="is-small" /> | ||||
|             </a> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <section id="multi-actions" class="is-flex is-justify-between"> | ||||
|           <div> | ||||
|             <b-field v-if="can('upload') && ! checked.length" class="file is-inline-block"> | ||||
|               <b-upload multiple native @input="files = $event"> | ||||
|                 <a v-if="! checked.length" class="is-inline-block"> | ||||
|                   <b-icon icon="upload" size="is-small" /> {{ lang('Add files') }} | ||||
|                 </a> | ||||
|               </b-upload> | ||||
|             </b-field> | ||||
|             <a v-if="can(['read', 'write']) && ! checked.length" class="add-new is-inline-block"> | ||||
|               <b-dropdown :disabled="checked.length > 0" aria-role="list"> | ||||
|                 <span slot="trigger"> | ||||
|                   <b-icon icon="plus" size="is-small" /> {{ lang('New') }} | ||||
|                 </span> | ||||
|  | ||||
|                 <b-dropdown-item aria-role="listitem" @click="create('dir')"> | ||||
|                   <b-icon icon="folder" size="is-small" /> {{ lang('Folder') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item aria-role="listitem" @click="create('file')"> | ||||
|                   <b-icon icon="file" size="is-small" /> {{ lang('File') }} | ||||
|                 </b-dropdown-item> | ||||
|  | ||||
|               </b-dropdown> | ||||
|             </a> | ||||
|             <a v-if="can('batchdownload') && checked.length" class="is-inline-block" @click="batchDownload"> | ||||
|               <b-icon icon="download" size="is-small" /> {{ lang('Download') }} | ||||
|             </a> | ||||
|             <a v-if="can('write') && checked.length" class="is-inline-block" @click="copy"> | ||||
|               <b-icon icon="copy" size="is-small" /> {{ lang('Copy') }} | ||||
|             </a> | ||||
|             <a v-if="can('write') && checked.length" class="is-inline-block" @click="move"> | ||||
|               <b-icon icon="external-link-square-alt" size="is-small" /> {{ lang('Move') }} | ||||
|             </a> | ||||
|             <a v-if="can(['write', 'zip']) && checked.length" class="is-inline-block" @click="zip"> | ||||
|               <b-icon icon="file-archive" size="is-small" /> {{ lang('Zip') }} | ||||
|             </a> | ||||
|             <a v-if="can('write') && checked.length" class="is-inline-block" @click="remove"> | ||||
|               <b-icon icon="trash-alt" size="is-small" /> {{ lang('Delete') }} | ||||
|             </a> | ||||
|           </div> | ||||
|           <div id="pagination" v-if="can('read')"> | ||||
|             <Pagination :perpage="perPage" @selected="perPage = $event" /> | ||||
|           </div> | ||||
|         </section> | ||||
|  | ||||
|         <b-table v-if="can('read')" | ||||
|                  :data="content" | ||||
|                  :default-sort="defaultSort" | ||||
|                  :paginated="perPage > 0" | ||||
|                  :per-page="perPage" | ||||
|                  :current-page.sync="currentPage" | ||||
|                  :hoverable="true" | ||||
|                  :is-row-checkable="(row) => row.type != 'back'" | ||||
|                  :row-class="(row) => 'file-row type-'+row.type" | ||||
|                  :checked-rows.sync="checked" | ||||
|                  :loading="isLoading" | ||||
|                  :checkable="can('batchdownload') || can('write') || can('zip')" | ||||
|                  @contextmenu="rightClick" | ||||
|         > | ||||
|           <template slot-scope="props"> | ||||
|             <b-table-column :label="lang('Name')" :custom-sort="sortByName" field="data.name" sortable> | ||||
|               <a class="is-block name" @click="itemClick(props.row)"> | ||||
|                 {{ props.row.name }} | ||||
|               </a> | ||||
|             </b-table-column> | ||||
|  | ||||
|             <b-table-column :label="lang('Size')" :custom-sort="sortBySize" field="data.size" sortable numeric width="150"> | ||||
|               {{ props.row.type == 'back' || props.row.type == 'dir' ? lang('Folder') : formatBytes(props.row.size) }} | ||||
|             </b-table-column> | ||||
|  | ||||
|             <b-table-column :label="lang('Time')" :custom-sort="sortByTime" field="data.time" sortable numeric width="200"> | ||||
|               {{ props.row.time ? formatDate(props.row.time) : '' }} | ||||
|             </b-table-column> | ||||
|  | ||||
|             <b-table-column id="single-actions" width="51"> | ||||
|               <b-dropdown v-if="props.row.type != 'back'" :disabled="checked.length > 0" aria-role="list" position="is-bottom-left"> | ||||
|                 <button :ref="'ref-single-action-button-'+props.row.path" slot="trigger" class="button is-small"> | ||||
|                   <b-icon icon="ellipsis-h" size="is-small" /> | ||||
|                 </button> | ||||
|  | ||||
|                 <b-dropdown-item v-if="props.row.type == 'file' && can('download')" aria-role="listitem" @click="download(props.row)"> | ||||
|                   <b-icon icon="download" size="is-small" /> {{ lang('Download') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="props.row.type == 'file' && can(['download']) && hasPreview(props.row.path)" aria-role="listitem" @click="preview(props.row)"> | ||||
|                   <b-icon icon="file-alt" size="is-small" /> {{ lang('View') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can('write')" aria-role="listitem" @click="copy($event, props.row)"> | ||||
|                   <b-icon icon="copy" size="is-small" /> {{ lang('Copy') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can('write')" aria-role="listitem" @click="move($event, props.row)"> | ||||
|                   <b-icon icon="external-link-square-alt" size="is-small" /> {{ lang('Move') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can('write')" aria-role="listitem" @click="rename($event, props.row)"> | ||||
|                   <b-icon icon="file-signature" size="is-small" /> {{ lang('Rename') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can(['write', 'zip']) && isArchive(props.row)" aria-role="listitem" @click="unzip($event, props.row)"> | ||||
|                   <b-icon icon="file-archive" size="is-small" /> {{ lang('Unzip') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can(['write', 'zip']) && ! isArchive(props.row)" aria-role="listitem" @click="zip($event, props.row)"> | ||||
|                   <b-icon icon="file-archive" size="is-small" /> {{ lang('Zip') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="can('write')" aria-role="listitem" @click="remove($event, props.row)"> | ||||
|                   <b-icon icon="trash-alt" size="is-small" /> {{ lang('Delete') }} | ||||
|                 </b-dropdown-item> | ||||
|                 <b-dropdown-item v-if="props.row.type == 'file' && can('download')" v-clipboard:copy="getDownloadLink(props.row.path)" aria-role="listitem"> | ||||
|                   <b-icon icon="clipboard" size="is-small" /> {{ lang('Copy link') }} | ||||
|                 </b-dropdown-item> | ||||
|               </b-dropdown> | ||||
|             </b-table-column> | ||||
|           </template> | ||||
|         </b-table> | ||||
|  | ||||
|         <section id="bottom-info" class="is-flex is-justify-between"> | ||||
|           <div> | ||||
|             <span>{{ lang('Selected', checked.length, totalCount) }}</span> | ||||
|           </div> | ||||
|           <div v-if="(showAllEntries || hasFilteredEntries) "> | ||||
|             <input type="checkbox" id="checkbox" @click="toggleHidden"> | ||||
|             <label for="checkbox"> {{ lang('Show hidden') }}</label> | ||||
|           </div> | ||||
|         </section> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Vue from 'vue' | ||||
| import Menu from './partials/Menu' | ||||
| import Tree from './partials/Tree' | ||||
| import Editor from './partials/Editor' | ||||
| import Gallery from './partials/Gallery' | ||||
| import Search from './partials/Search' | ||||
| import Pagination from './partials/Pagination' | ||||
| import Upload from './partials/Upload' | ||||
| import api from '../api/api' | ||||
| import VueClipboard from 'vue-clipboard2' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| Vue.use(VueClipboard) | ||||
|  | ||||
| export default { | ||||
|   name: 'Browser', | ||||
|   components: { Menu, Pagination, Upload }, | ||||
|   data() { | ||||
|     return { | ||||
|       dropZone: false, | ||||
|       perPage: '', | ||||
|       currentPage: 1, | ||||
|       checked: [], | ||||
|       isLoading: false, | ||||
|       defaultSort: ['data.name', 'asc'], | ||||
|       files: [], | ||||
|       hasFilteredEntries: false, | ||||
|       showAllEntries: false, | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     breadcrumbs() { | ||||
|       let path = '' | ||||
|       let breadcrumbs = [{name: this.lang('Home'), path: '/'}] | ||||
|  | ||||
|       _.forEach(_.split(this.$store.state.cwd.location, '/'), (dir) => { | ||||
|         path += dir + '/' | ||||
|         breadcrumbs.push({ | ||||
|           name: dir, | ||||
|           path: path, | ||||
|         }) | ||||
|       }) | ||||
|  | ||||
|       return _.filter(breadcrumbs, o => o.name) | ||||
|     }, | ||||
|     content() { | ||||
|       return this.$store.state.cwd.content | ||||
|     }, | ||||
|     totalCount() { | ||||
|       return Number(_.sumBy(this.$store.state.cwd.content, (o) => { | ||||
|         return o.type == 'file' || o.type == 'dir' | ||||
|       })) | ||||
|     }, | ||||
|   }, | ||||
|   watch: { | ||||
|     '$route' (to) { | ||||
|       this.isLoading = true | ||||
|       this.checked = [] | ||||
|       this.currentPage = 1 | ||||
|       api.changeDir({ | ||||
|         to: to.query.cd | ||||
|       }) | ||||
|         .then(ret => { | ||||
|           this.$store.commit('setCwd', { | ||||
|             content: this.filterEntries(ret.files), | ||||
|             location: ret.location, | ||||
|           }) | ||||
|           this.isLoading = false | ||||
|         }) | ||||
|         .catch(error => { | ||||
|           this.isLoading = false | ||||
|           this.handleError(error) | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     if (this.can('read')) { | ||||
|       this.loadFiles() | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleHidden() { | ||||
|       this.showAllEntries = !this.showAllEntries | ||||
|       this.loadFiles() | ||||
|       this.checked = [] | ||||
|     }, | ||||
|     filterEntries(files){ | ||||
|       var filter_entries = this.$store.state.config.filter_entries | ||||
|       this.hasFilteredEntries = false | ||||
|       if (!this.showAllEntries && typeof filter_entries !== 'undefined' && filter_entries.length > 0){ | ||||
|         let filteredFiles = [] | ||||
|         _.forEach(files, (file) => { | ||||
|           let filterContinue = false | ||||
|           _.forEach(filter_entries, (ffilter_Entry) => { | ||||
|             if (typeof ffilter_Entry !== 'undefined' && ffilter_Entry.length > 0){ | ||||
|               let filter_Entry = ffilter_Entry | ||||
|               let filterEntry_type = filter_Entry.endsWith('/')? 'dir':'file' | ||||
|               filter_Entry = filter_Entry.replace(/\/$/, '') | ||||
|               let filterEntry_isFullPath = filter_Entry.startsWith('/') | ||||
|               let filterEntry_tmpName  = filterEntry_isFullPath? '/'+file.path : file.name | ||||
|               filter_Entry             = filterEntry_isFullPath? '/'+filter_Entry : filter_Entry | ||||
|               filter_Entry = filter_Entry.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.$&') | ||||
|               let thisRegex = new RegExp('^'+filter_Entry+'$', 'iu') | ||||
|               if(file.type == filterEntry_type && thisRegex.test(filterEntry_tmpName)) | ||||
|               { | ||||
|                 filterContinue = true | ||||
|                 this.hasFilteredEntries = true | ||||
|                 return false | ||||
|               } | ||||
|             } | ||||
|           }) | ||||
|           if(!filterContinue){ | ||||
|             filteredFiles.push(file) | ||||
|           } | ||||
|         }) | ||||
|         return filteredFiles | ||||
|       } | ||||
|       return files | ||||
|     }, | ||||
|     loadFiles() { | ||||
|       api.getDir({ | ||||
|         to: '', | ||||
|       }) | ||||
|         .then(ret => { | ||||
|           this.$store.commit('setCwd', { | ||||
|             content: this.filterEntries(ret.files), | ||||
|             location: ret.location, | ||||
|           }) | ||||
|         }) | ||||
|         .catch(error => this.handleError(error)) | ||||
|     }, | ||||
|     goTo(path) { | ||||
|       this.$router.push({ name: 'browser', query: { 'cd': path }}).catch(() => {}) | ||||
|     }, | ||||
|     getSelected() { | ||||
|       return _.reduce(this.checked, function(result, value) { | ||||
|         result.push(value) | ||||
|         return result | ||||
|       }, []) | ||||
|     }, | ||||
|     itemClick(item) { | ||||
|       if (item.type == 'dir' || item.type == 'back') { | ||||
|         this.goTo(item.path) | ||||
|       } else if (this.can(['download']) && this.hasPreview(item.path)) { | ||||
|         this.preview(item) | ||||
|       } else if (this.can(['download'])) { | ||||
|         this.download(item) | ||||
|       } | ||||
|     }, | ||||
|     rightClick(row, event) { | ||||
|       if (row.type == 'back') { | ||||
|         return | ||||
|       } | ||||
|       event.preventDefault() | ||||
|       this.$refs['ref-single-action-button-'+row.path].click() | ||||
|     }, | ||||
|     selectDir() { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Tree, | ||||
|         events: { | ||||
|           selected: dir => { | ||||
|             this.goTo(dir.path) | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     copy(event, item) { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Tree, | ||||
|         events: { | ||||
|           selected: dir => { | ||||
|             this.isLoading = true | ||||
|             api.copyItems({ | ||||
|               destination: dir.path, | ||||
|               items: item ? [item] : this.getSelected(), | ||||
|             }) | ||||
|               .then(() => { | ||||
|                 this.isLoading = false | ||||
|                 this.loadFiles() | ||||
|               }) | ||||
|               .catch(error => { | ||||
|                 this.isLoading = false | ||||
|                 this.handleError(error) | ||||
|               }) | ||||
|             this.checked = [] | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     move(event, item) { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Tree, | ||||
|         events: { | ||||
|           selected: dir => { | ||||
|             this.isLoading = true | ||||
|             api.moveItems({ | ||||
|               destination: dir.path, | ||||
|               items: item ? [item] : this.getSelected(), | ||||
|             }) | ||||
|               .then(() => { | ||||
|                 this.isLoading = false | ||||
|                 this.loadFiles() | ||||
|               }) | ||||
|               .catch(error => { | ||||
|                 this.isLoading = false | ||||
|                 this.handleError(error) | ||||
|               }) | ||||
|             this.checked = [] | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     batchDownload() { | ||||
|       let items = this.getSelected() | ||||
|  | ||||
|       this.isLoading = true | ||||
|       api.batchDownload({ | ||||
|         items: items, | ||||
|       }) | ||||
|         .then(ret => { | ||||
|           this.isLoading = false | ||||
|           this.$dialog.alert({ | ||||
|             message: this.lang('Your file is ready'), | ||||
|             confirmText: this.lang('Download'), | ||||
|             onConfirm: () => { | ||||
|               window.open(Vue.config.baseURL+'/batchdownload&uniqid='+ret.uniqid, '_blank') | ||||
|             } | ||||
|           }) | ||||
|         }) | ||||
|         .catch(error => { | ||||
|           this.isLoading = false | ||||
|           this.handleError(error) | ||||
|         }) | ||||
|     }, | ||||
|     download(item) { | ||||
|       window.open(this.getDownloadLink(item.path), '_blank') | ||||
|     }, | ||||
|     search() { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Search, | ||||
|         events: { | ||||
|           selected: item => { | ||||
|             this.goTo(item.dir) | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     preview(item) { | ||||
|       let modal = null | ||||
|       if (this.isImage(item.path)) { | ||||
|         modal = Gallery | ||||
|       } | ||||
|       if (this.isText(item.path)) { | ||||
|         modal = Editor | ||||
|       } | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         props: { item: item }, | ||||
|         hasModalCard: true, | ||||
|         component: modal, | ||||
|       }) | ||||
|     }, | ||||
|     isArchive(item) { | ||||
|       return item.type == 'file' && item.name.split('.').pop() == 'zip' | ||||
|     }, | ||||
|     unzip(event, item) { | ||||
|       this.$dialog.confirm({ | ||||
|         message: this.lang('Are you sure you want to do this?'), | ||||
|         type: 'is-danger', | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Unzip'), | ||||
|         onConfirm: () => { | ||||
|           this.isLoading = true | ||||
|           api.unzipItem({ | ||||
|             item: item.path, | ||||
|             destination: this.$store.state.cwd.location, | ||||
|           }) | ||||
|             .then(() => { | ||||
|               this.isLoading = false | ||||
|               this.loadFiles() | ||||
|             }) | ||||
|             .catch(error => { | ||||
|               this.isLoading = false | ||||
|               this.handleError(error) | ||||
|             }) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     zip(event, item) { | ||||
|       this.$dialog.prompt({ | ||||
|         message: this.lang('Name'), | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Create'), | ||||
|         inputAttrs: { | ||||
|           value: this.$store.state.config.default_archive_name, | ||||
|           placeholder: this.$store.state.config.default_archive_name, | ||||
|           maxlength: 100, | ||||
|           required: false, | ||||
|         }, | ||||
|         onConfirm: (value) => { | ||||
|           if (! value) { | ||||
|             return | ||||
|           } | ||||
|           this.isLoading = true | ||||
|           api.zipItems({ | ||||
|             name: value, | ||||
|             items: item ? [item] : this.getSelected(), | ||||
|             destination: this.$store.state.cwd.location, | ||||
|           }) | ||||
|             .then(() => { | ||||
|               this.isLoading = false | ||||
|               this.loadFiles() | ||||
|             }) | ||||
|             .catch(error => { | ||||
|               this.isLoading = false | ||||
|               this.handleError(error) | ||||
|             }) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     rename(event, item) { | ||||
|       this.$dialog.prompt({ | ||||
|         message: this.lang('New name'), | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Rename'), | ||||
|         inputAttrs: { | ||||
|           value: item ? item.name : this.getSelected()[0].name, | ||||
|           maxlength: 100, | ||||
|           required: false, | ||||
|         }, | ||||
|         onConfirm: (value) => { | ||||
|           this.isLoading = true | ||||
|           api.renameItem({ | ||||
|             from: item.name, | ||||
|             to: value, | ||||
|             destination: this.$store.state.cwd.location, | ||||
|           }) | ||||
|             .then(() => { | ||||
|               this.isLoading = false | ||||
|               this.loadFiles() | ||||
|             }) | ||||
|             .catch(error => { | ||||
|               this.isLoading = false | ||||
|               this.handleError(error) | ||||
|             }) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     create(type) { | ||||
|       this.$dialog.prompt({ | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Create'), | ||||
|         inputAttrs: { | ||||
|           placeholder: type == 'dir' ? 'MyFolder' : 'file.txt', | ||||
|           maxlength: 100, | ||||
|           required: false, | ||||
|         }, | ||||
|         onConfirm: (value) => { | ||||
|           this.isLoading = true | ||||
|           api.createNew({ | ||||
|             type: type, | ||||
|             name: value, | ||||
|             destination: this.$store.state.cwd.location, | ||||
|           }) | ||||
|           // TODO: cors is triggering this too early? | ||||
|             .then(() => { | ||||
|               this.isLoading = false | ||||
|               this.loadFiles() | ||||
|             }) | ||||
|             .catch(error => { | ||||
|               this.isLoading = false | ||||
|               this.handleError(error) | ||||
|             }) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     remove(event, item) { | ||||
|       this.$dialog.confirm({ | ||||
|         message: this.lang('Are you sure you want to do this?'), | ||||
|         type: 'is-danger', | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Delete'), | ||||
|         onConfirm: () => { | ||||
|           this.isLoading = true | ||||
|           api.removeItems({ | ||||
|             items: item ? [item] : this.getSelected(), | ||||
|           }) | ||||
|             .then(() => { | ||||
|               this.isLoading = false | ||||
|               this.loadFiles() | ||||
|             }) | ||||
|             .catch(error => { | ||||
|               this.isLoading = false | ||||
|               this.handleError(error) | ||||
|             }) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     sortByName(a, b, order) { | ||||
|       return this.customSort(a, b, !order, 'name') | ||||
|     }, | ||||
|     sortBySize(a, b, order) { | ||||
|       return this.customSort(a, b, !order, 'size') | ||||
|     }, | ||||
|     sortByTime(a, b, order) { | ||||
|       return this.customSort(a, b, !order, 'time') | ||||
|     }, | ||||
|     customSort(a, b, order, param) { | ||||
|       if (a.type == 'back') return -1 | ||||
|       if (b.type == 'back') return 1 | ||||
|  | ||||
|       if (a.type == 'dir' && b.type != 'dir') return -1 | ||||
|       if (b.type == 'dir' && a.type != 'dir') return 1 | ||||
|  | ||||
|       if (b.type == a.type) { | ||||
|         if (a[param] === b[param]) return this.customSort(a, b, false, 'name') | ||||
|  | ||||
|         if (_.isString(a[param])) return (a[param].localeCompare(b[param])) * (order ? -1 : 1) | ||||
|         else return ((a[param] < b[param]) ? -1 : 1) * (order ? -1 : 1) | ||||
|       } | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| #loading { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   position: fixed; | ||||
|   z-index: 1000; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   user-drag: none; | ||||
|   user-select: none; | ||||
|   -moz-user-select: none; | ||||
|   -webkit-user-drag: none; | ||||
|   -webkit-user-select: none; | ||||
|   -ms-user-select: none; | ||||
| } | ||||
| #dropzone { | ||||
|   padding: 0; | ||||
| } | ||||
| #browser { | ||||
|   margin: 50px auto 100px auto; | ||||
| } | ||||
| .breadcrumb a { | ||||
|   font-weight: bold; | ||||
| } | ||||
| #multi-actions { | ||||
|   min-height: 55px; | ||||
| } | ||||
| #multi-actions a { | ||||
|   margin: 0 15px 15px 0; | ||||
| } | ||||
| #bottom-info { | ||||
|   padding: 15px 0; | ||||
| } | ||||
| .file-row a { | ||||
|   color: #373737; | ||||
| } | ||||
| .file-row a.name { | ||||
|   word-break: break-all; | ||||
| } | ||||
| .file-row.type-dir a.name { | ||||
|   font-weight: bold | ||||
| } | ||||
| #single-actions { | ||||
|   padding: 6px 12px; | ||||
| } | ||||
| .drop-info { | ||||
|   margin: 20% auto; | ||||
| } | ||||
| .search-btn { | ||||
|   margin-right: 10px; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										101
									
								
								frontend/views/Login.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								frontend/views/Login.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| <template> | ||||
|   <div v-if="!$store.state.config.guest_redirection"> | ||||
|     <a v-if="can('read')" id="back-arrow" @click="$router.push('/').catch(() => {})"> | ||||
|       <b-icon icon="times" /> | ||||
|     </a> | ||||
|  | ||||
|     <div id="login" class="columns is-centered"> | ||||
|       <div class="column is-narrow"> | ||||
|         <form @submit.prevent="login"> | ||||
|           <div class="box"> | ||||
|             <div class="has-text-centered"> | ||||
|               <img :src="$store.state.config.logo" class="logo"> | ||||
|             </div> | ||||
|             <br> | ||||
|             <b-field :label="lang('Username')"> | ||||
|               <b-input v-model="username" name="username" required @input="error = ''" ref="username" /> | ||||
|             </b-field> | ||||
|             <b-field :label="lang('Password')"> | ||||
|               <b-input v-model="password" type="password" name="password" required @input="error = ''" password-reveal /> | ||||
|             </b-field> | ||||
|  | ||||
|             <div class="is-flex is-justify-end"> | ||||
|               <button class="button is-primary"> | ||||
|                 {{ lang('Login') }} | ||||
|               </button> | ||||
|             </div> | ||||
|  | ||||
|             <div v-if="error"> | ||||
|               <code>{{ error }}</code> | ||||
|             </div> | ||||
|           </div> | ||||
|         </form> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import api from '../api/api' | ||||
|  | ||||
| export default { | ||||
|   name: 'Login', | ||||
|   data() { | ||||
|     return { | ||||
|       username: '', | ||||
|       password: '', | ||||
|       error: '', | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     if (this.$store.state.config.guest_redirection) { | ||||
|       window.location.href = this.$store.state.config.guest_redirection | ||||
|       return | ||||
|     } | ||||
|     this.$refs.username.focus() | ||||
|   }, | ||||
|   methods: { | ||||
|     login() { | ||||
|       api.login({ | ||||
|         username: this.username, | ||||
|         password: this.password, | ||||
|       }) | ||||
|         .then(user => { | ||||
|           this.$store.commit('setUser', user) | ||||
|           api.changeDir({ | ||||
|             to: '/' | ||||
|           }).then(() => this.$router.push('/').catch(() => {})) | ||||
|         }) | ||||
|         .catch(error => { | ||||
|           if (error.response && error.response.data) { | ||||
|             this.error = this.lang(error.response.data.data) | ||||
|           } else { | ||||
|             this.handleError(error) | ||||
|           } | ||||
|           this.password = '' | ||||
|         }) | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| .logo { | ||||
|   width: 300px; | ||||
|   display: inline-block; | ||||
| } | ||||
|  | ||||
| .box { | ||||
|   padding: 30px; | ||||
| } | ||||
|  | ||||
| #login { | ||||
|   padding: 120px 20px; | ||||
| } | ||||
| #back-arrow { | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   right: 0; | ||||
|   margin: 20px; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										146
									
								
								frontend/views/Users.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								frontend/views/Users.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| <template> | ||||
|   <div class="container"> | ||||
|     <Menu /> | ||||
|  | ||||
|     <section class="actions is-flex is-justify-between"> | ||||
|       <div> | ||||
|         <a @click="addUser"> | ||||
|           <b-icon icon="plus" size="is-small" /> {{ lang('New') }} | ||||
|         </a> | ||||
|       </div> | ||||
|       <div> | ||||
|         <Pagination :perpage="perPage" @selected="perPage = $event" /> | ||||
|       </div> | ||||
|     </section> | ||||
|  | ||||
|     <b-table | ||||
|       :data="users" | ||||
|       :default-sort="defaultSort" | ||||
|       :paginated="perPage > 0" | ||||
|       :per-page="perPage" | ||||
|       :current-page.sync="currentPage" | ||||
|       :hoverable="true" | ||||
|       :loading="isLoading" | ||||
|     > | ||||
|       <template slot-scope="props"> | ||||
|         <b-table-column :label="lang('Name')" field="name" sortable> | ||||
|           <a @click="editUser(props.row)"> | ||||
|             {{ props.row.name }} | ||||
|           </a> | ||||
|         </b-table-column> | ||||
|  | ||||
|         <b-table-column :label="lang('Username')" field="username" sortable> | ||||
|           <a @click="editUser(props.row)"> | ||||
|             {{ props.row.username }} | ||||
|           </a> | ||||
|         </b-table-column> | ||||
|  | ||||
|         <b-table-column :label="lang('Permissions')" field="role"> | ||||
|           {{ permissions(props.row.permissions) }} | ||||
|         </b-table-column> | ||||
|  | ||||
|         <b-table-column :label="lang('Role')" field="role" sortable> | ||||
|           {{ lang(capitalize(props.row.role)) }} | ||||
|         </b-table-column> | ||||
|  | ||||
|         <b-table-column> | ||||
|           <a v-if="props.row.role != 'guest'" @click="remove(props.row)"> | ||||
|             <b-icon icon="trash-alt" size="is-small" /> | ||||
|           </a> | ||||
|         </b-table-column> | ||||
|       </template> | ||||
|     </b-table> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import UserEdit from './partials/UserEdit' | ||||
| import Menu from './partials/Menu' | ||||
| import Pagination from './partials/Pagination' | ||||
| import api from '../api/api' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'Users', | ||||
|   components: { Menu, Pagination }, | ||||
|   data() { | ||||
|     return { | ||||
|       perPage: '', | ||||
|       currentPage: 1, | ||||
|       isLoading: false, | ||||
|       defaultSort: ['name', 'desc'], | ||||
|       users: [], | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     api.listUsers() | ||||
|       .then(ret => { | ||||
|         this.users = ret | ||||
|       }) | ||||
|       .catch(error => this.handleError(error)) | ||||
|   }, | ||||
|   methods: { | ||||
|     remove(user) { | ||||
|       this.$dialog.confirm({ | ||||
|         message: this.lang('Are you sure you want to do this?'), | ||||
|         type: 'is-danger', | ||||
|         cancelText: this.lang('Cancel'), | ||||
|         confirmText: this.lang('Confirm'), | ||||
|         onConfirm: () => { | ||||
|           api.deleteUser({ | ||||
|             username: user.username | ||||
|           }) | ||||
|             .then(() => { | ||||
|               this.users = _.reject(this.users, u => u.username == user.username) | ||||
|               this.$toast.open({ | ||||
|                 message: this.lang('Deleted'), | ||||
|                 type: 'is-success', | ||||
|               }) | ||||
|             }) | ||||
|             .catch(error => this.handleError(error)) | ||||
|           this.checked = [] | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     permissions(array) { | ||||
|       return _.join(array, ', ') | ||||
|     }, | ||||
|     addUser() { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         props: { user: { role: 'user'}, action: 'add' }, | ||||
|         hasModalCard: true, | ||||
|         component: UserEdit, | ||||
|         events: { | ||||
|           updated: ret => { | ||||
|             this.users.push(ret) | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     editUser(user) { | ||||
|       if (! user.username) { | ||||
|         this.handleError('Missing username') | ||||
|         return | ||||
|       } | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         props: { user: user, action: 'edit' }, | ||||
|         hasModalCard: true, | ||||
|         component: UserEdit, | ||||
|         events: { | ||||
|           updated: ret => { | ||||
|             this.users.splice(_.findIndex(this.users, {username: ret.username}), 1, ret) | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| .actions { | ||||
|   margin: 50px 0 30px 0; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										84
									
								
								frontend/views/partials/Editor.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								frontend/views/partials/Editor.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <div class="modal-card"> | ||||
|       <header class="modal-card-head"> | ||||
|         <p class="modal-card-title"> | ||||
|           {{ currentItem.name }} | ||||
|         </p> | ||||
|       </header> | ||||
|       <section class="modal-card-body preview"> | ||||
|         <template> | ||||
|           <prism-editor v-model="content" language="md" :readonly="!can('write')" :line-numbers="lineNumbers" /> | ||||
|         </template> | ||||
|       </section> | ||||
|       <footer class="modal-card-foot"> | ||||
|         <button v-if="can('write')" class="button" type="button" @click="saveFile()"> | ||||
|           {{ lang('Save') }} | ||||
|         </button> | ||||
|         <button class="button" type="button" @click="$parent.close()"> | ||||
|           {{ lang('Close') }} | ||||
|         </button> | ||||
|       </footer> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import api from '../../api/api' | ||||
| import 'prismjs' | ||||
| import 'prismjs/themes/prism.css' | ||||
| import 'vue-prism-editor/dist/VuePrismEditor.css' | ||||
| import PrismEditor from 'vue-prism-editor' | ||||
|  | ||||
| export default { | ||||
|   name: 'Editor', | ||||
|   components: { PrismEditor }, | ||||
|   props: [ 'item' ], | ||||
|   data() { | ||||
|     return { | ||||
|       content: '', | ||||
|       currentItem: '', | ||||
|       lineNumbers: true, | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.currentItem = this.item | ||||
|     api.downloadItem({ | ||||
|       path: this.item.path, | ||||
|     }) | ||||
|       .then((res) => { | ||||
|         this.content = res | ||||
|       }) | ||||
|       .catch(error => this.handleError(error)) | ||||
|   }, | ||||
|   methods: { | ||||
|     saveFile() { | ||||
|       api.saveContent({ | ||||
|         name: this.item.name, | ||||
|         content: this.content, | ||||
|       }) | ||||
|         .then(() => { | ||||
|           this.$toast.open({ | ||||
|             message: this.lang('Updated'), | ||||
|             type: 'is-success', | ||||
|           }) | ||||
|           this.$parent.close() | ||||
|         }) | ||||
|         .catch(error => this.handleError(error)) | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| @media (min-width: 1100px) { | ||||
|   .modal-card { | ||||
|     width: 100%; | ||||
|     min-width: 640px; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .preview { | ||||
|   min-height: 450px; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										85
									
								
								frontend/views/partials/Gallery.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								frontend/views/partials/Gallery.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <div class="modal-card"> | ||||
|       <div class="modal-card-body preview"> | ||||
|         <strong>{{ currentItem.name }}</strong> | ||||
|         <div class="columns is-mobile"> | ||||
|           <div class="column mainbox"> | ||||
|             <img :src="imageSrc(currentItem.path)" class="mainimg"> | ||||
|           </div> | ||||
|           <div v-if="images.length > 1" class="column is-one-fifth sidebox"> | ||||
|             <ul> | ||||
|               <li v-for="(image, index) in images" :key="index"> | ||||
|                 <img v-lazy="imageSrc(image.path)" @click="currentItem = image"> | ||||
|               </li> | ||||
|             </ul> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'Gallery', | ||||
|   props: [ 'item' ], | ||||
|   data() { | ||||
|     return { | ||||
|       content: '', | ||||
|       currentItem: '', | ||||
|       lineNumbers: true, | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     images() { | ||||
|       return _.filter(this.$store.state.cwd.content, o => this.isImage(o.name)) | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.currentItem = this.item | ||||
|   }, | ||||
|   methods: { | ||||
|     imageSrc(path) { | ||||
|       return this.getDownloadLink(path) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| @media (min-width: 1100px) { | ||||
|   .modal-card { | ||||
|     width: 100%; | ||||
|     min-width: 640px; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .mainbox { | ||||
|   height: 70vh; | ||||
|   display:flex; | ||||
|   justify-content:center; | ||||
|   align-items:center; | ||||
| } | ||||
|  | ||||
| .mainimg { | ||||
|   max-width:100%; | ||||
|   max-height:100%; | ||||
| } | ||||
|  | ||||
| .sidebox { | ||||
|   overflow-y:auto; | ||||
|   height: 70vh; | ||||
| } | ||||
|  | ||||
| .sidebox { | ||||
|   border-left: 1px solid #dbdbdb; | ||||
| } | ||||
|  | ||||
| .sidebox img { | ||||
|   padding: 5px 0 5px 0; | ||||
| } | ||||
|  | ||||
| </style> | ||||
							
								
								
									
										109
									
								
								frontend/views/partials/Menu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								frontend/views/partials/Menu.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| <template> | ||||
|   <nav class="navbar" role="navigation" aria-label="main navigation"> | ||||
|     <div class="navbar-brand"> | ||||
|       <a class="navbar-item logo" @click="$router.push('/').catch(() => {})"> | ||||
|         <img :src="this.$store.state.config.logo"> | ||||
|       </a> | ||||
|  | ||||
|       <a :class="[navbarActive ? 'is-active' : '', 'navbar-burger burger']" role="button" aria-label="menu" aria-expanded="false" @click="navbarActive = !navbarActive"> | ||||
|         <span aria-hidden="true" /> | ||||
|         <span aria-hidden="true" /> | ||||
|         <span aria-hidden="true" /> | ||||
|       </a> | ||||
|     </div> | ||||
|  | ||||
|     <div :class="[navbarActive ? 'is-active' : '', 'navbar-menu']"> | ||||
|       <div class="navbar-end"> | ||||
|         <a v-if="is('admin')" class="navbar-item files" @click="$router.push('/').catch(() => {})"> | ||||
|           {{ lang('Files') }} | ||||
|         </a> | ||||
|         <a v-if="is('admin')" class="navbar-item users" @click="$router.push('/users').catch(() => {})"> | ||||
|           {{ lang('Users') }} | ||||
|         </a> | ||||
|         <a v-if="is('guest')" class="navbar-item login" @click="login"> | ||||
|           {{ lang('Login') }} | ||||
|         </a> | ||||
|         <a v-if="!is('guest')" class="navbar-item profile" @click="profile"> | ||||
|           {{ this.$store.state.user.name }} | ||||
|         </a> | ||||
|         <a v-if="!is('guest')" class="navbar-item logout" @click="logout"> | ||||
|           {{ lang('Logout') }} | ||||
|         </a> | ||||
|       </div> | ||||
|     </div> | ||||
|   </nav> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Profile from './Profile' | ||||
| import api from '../../api/api' | ||||
|  | ||||
| export default { | ||||
|   name: 'Menu', | ||||
|   data() { | ||||
|     return { | ||||
|       navbarActive: false, | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     if (this.$store.state.user.firstlogin) { | ||||
|       this.profile() | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     logout() { | ||||
|       api.logout() | ||||
|         .then(() => { | ||||
|           this.$store.commit('initialize') | ||||
|           api.getUser() | ||||
|             .then(user => { | ||||
|               this.$store.commit('setUser', user) | ||||
|               this.$router.push('/').catch(() => {}) | ||||
|             }) | ||||
|             .catch(() => { | ||||
|               this.$store.commit('initialize') | ||||
|             }) | ||||
|         }) | ||||
|         .catch(error => { | ||||
|           this.$store.commit('initialize') | ||||
|           this.handleError(error) | ||||
|         }) | ||||
|     }, | ||||
|     login() { | ||||
|       this.$router.push('/login').catch(() => {}) | ||||
|     }, | ||||
|     profile() { | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Profile, | ||||
|       }) | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| .navbar { | ||||
|   z-index: 10; | ||||
| } | ||||
| @media all and (max-width: 1088px) { | ||||
|   .logo { | ||||
|     padding: 0; | ||||
|   } | ||||
|   .logo img { | ||||
|     max-height: 3rem; | ||||
|   } | ||||
| } | ||||
| @media all and (min-width: 1088px) { | ||||
|   .navbar { | ||||
|     padding: 1rem 0; | ||||
|   } | ||||
|   .logo { | ||||
|     padding: 0 0 0 12px; | ||||
|   } | ||||
|   .logo img { | ||||
|     max-height: 2.5rem; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										27
									
								
								frontend/views/partials/Pagination.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								frontend/views/partials/Pagination.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <b-select :value="perpage" size="is-small" @input="$emit('selected', $event)"> | ||||
|       <option value=""> | ||||
|         {{ lang('No pagination') }} | ||||
|       </option> | ||||
|       <option value="5"> | ||||
|         {{ lang('Per page', 5) }} | ||||
|       </option> | ||||
|       <option value="10"> | ||||
|         {{ lang('Per page', 10) }} | ||||
|       </option> | ||||
|       <option value="15"> | ||||
|         {{ lang('Per page', 15) }} | ||||
|       </option> | ||||
|     </b-select> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
|  | ||||
| export default { | ||||
|   name: 'Pagination', | ||||
|   props: [ 'perpage' ] | ||||
| } | ||||
| </script> | ||||
|  | ||||
							
								
								
									
										71
									
								
								frontend/views/partials/Profile.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								frontend/views/partials/Profile.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| <template> | ||||
|   <div class="modal-card"> | ||||
|     <header class="modal-card-head"> | ||||
|       <p class="modal-card-title"> | ||||
|         {{ lang('Profile') }} | ||||
|       </p> | ||||
|     </header> | ||||
|     <section class="modal-card-body"> | ||||
|       <form @submit="save"> | ||||
|         <b-field :label="lang('Old password')" :type="formErrors.oldpassword ? 'is-danger' : ''" :message="formErrors.oldpassword"> | ||||
|           <b-input v-model="oldpassword" password-reveal required @keydown.native="formErrors.oldpassword = ''" /> | ||||
|         </b-field> | ||||
|  | ||||
|         <b-field :label="lang('New password')" :type="formErrors.newpassword ? 'is-danger' : ''" :message="formErrors.newpassword"> | ||||
|           <b-input v-model="newpassword" password-reveal required @keydown.native="formErrors.newpassword = ''" /> | ||||
|         </b-field> | ||||
|       </form> | ||||
|     </section> | ||||
|     <footer class="modal-card-foot"> | ||||
|       <button class="button" type="button" @click="$parent.close()"> | ||||
|         {{ lang('Close') }} | ||||
|       </button> | ||||
|       <button class="button is-primary" type="button" @click="save"> | ||||
|         {{ lang('Save') }} | ||||
|       </button> | ||||
|     </footer> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import api from '../../api/api' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'Profile', | ||||
|   data() { | ||||
|     return { | ||||
|       oldpassword: '', | ||||
|       newpassword: '', | ||||
|       formErrors: {}, | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     save() { | ||||
|       api.changePassword({ | ||||
|         oldpassword: this.oldpassword, | ||||
|         newpassword: this.newpassword, | ||||
|       }) | ||||
|         .then(() => { | ||||
|           this.$toast.open({ | ||||
|             message: this.lang('Updated'), | ||||
|             type: 'is-success', | ||||
|           }) | ||||
|           this.$parent.close() | ||||
|           this.$router.go() | ||||
|         }) | ||||
|         .catch(errors => { | ||||
|           if (typeof errors.response.data.data != 'object') { | ||||
|             this.handleError(errors) | ||||
|           } | ||||
|           _.forEach(errors.response.data, err => { | ||||
|             _.forEach(err, (val, key) => { | ||||
|               this.formErrors[key] = this.lang(val) | ||||
|               this.$forceUpdate() | ||||
|             }) | ||||
|           }) | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										104
									
								
								frontend/views/partials/Search.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								frontend/views/partials/Search.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| <template> | ||||
|   <div class="modal-card"> | ||||
|     <header class="modal-card-head"> | ||||
|       <p class="modal-card-title"> | ||||
|         {{ lang('Search') }} | ||||
|       </p> | ||||
|       <b-loading :is-full-page="false" :active.sync="searching" /> | ||||
|     </header> | ||||
|     <section class="modal-card-body"> | ||||
|       <b-input ref="input" v-model="term" @input="searchFiles" :placeholder="lang('Name')" /> | ||||
|       <br> | ||||
|       <ul ref="results"> | ||||
|         <li v-for="(item, index) in results" :key="index"> | ||||
|           <a @click="select(item)">{{ item.file.path }}</a> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </section> | ||||
|     <footer class="modal-card-foot"> | ||||
|       <button class="button" type="button" @click="$parent.close()"> | ||||
|         {{ lang('Close') }} | ||||
|       </button> | ||||
|     </footer> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import api from '../../api/api' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'Search', | ||||
|   data() { | ||||
|     return { | ||||
|       active: false, | ||||
|       searching: false, | ||||
|       pending_getdirs: 0, | ||||
|       term: '', | ||||
|       results: [], | ||||
|     } | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.active = true | ||||
|     this.searching = false | ||||
|     this.pending_getdirs = 0 | ||||
|     this.$refs.input.focus() | ||||
|     if (!this.$store.state.config.search_simultaneous) { | ||||
|       this.$store.state.config.search_simultaneous = 5 | ||||
|     } | ||||
|  | ||||
|   }, | ||||
|   beforeDestroy() { | ||||
|     this.active = false | ||||
|     this.searching = false | ||||
|   }, | ||||
|   methods: { | ||||
|     select(item) { | ||||
|       this.$emit('selected', item) | ||||
|       this.$parent.close() | ||||
|     }, | ||||
|     searchFiles: _.debounce(function(val) { | ||||
|       this.results = [] | ||||
|       if (val.length > 0) { | ||||
|         this.searching = true | ||||
|         this.getDirLimited('/') | ||||
|       } | ||||
|     }, 1000), | ||||
|     getDirLimited(path) { | ||||
|       let interval = setInterval(() => { | ||||
|         if (this.active && this.pending_getdirs < this.$store.state.config.search_simultaneous) { | ||||
|           this.pending_getdirs++ | ||||
|           clearInterval(interval) | ||||
|           this.getDir(path) | ||||
|         } | ||||
|       }, 200) | ||||
|     }, | ||||
|     getDir(path) { | ||||
|       this.searching = true | ||||
|       api.getDir({ | ||||
|         dir: path | ||||
|       }) | ||||
|         .then(ret => { | ||||
|           this.searching = false | ||||
|           this.pending_getdirs-- | ||||
|           _.forEach(ret.files, item => { | ||||
|             if (item.name.toLowerCase().indexOf(this.term.toLowerCase()) > -1) { | ||||
|               this.results.push({ | ||||
|                 file: item, | ||||
|                 dir: path, | ||||
|               }) | ||||
|             } | ||||
|           }) | ||||
|           _.forEach(_.filter(ret.files, ['type', 'dir']), subdir => { | ||||
|             this.getDirLimited(subdir.path) | ||||
|           }) | ||||
|         }) | ||||
|         .catch(error => this.handleError(error)) | ||||
|  | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
| </style> | ||||
							
								
								
									
										41
									
								
								frontend/views/partials/Tree.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								frontend/views/partials/Tree.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <template> | ||||
|   <div class="modal-card"> | ||||
|     <header class="modal-card-head"> | ||||
|       <p class="modal-card-title"> | ||||
|         {{ lang('Select Folder') }} | ||||
|       </p> | ||||
|     </header> | ||||
|     <section class="modal-card-body"> | ||||
|       <div class="tree"> | ||||
|         <ul class="tree-list"> | ||||
|           <TreeNode :node="$store.state.tree" @selected="$emit('selected', $event) && $parent.close()" /> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </section> | ||||
|     <footer class="modal-card-foot"> | ||||
|       <button class="button" type="button" @click="$parent.close()"> | ||||
|         {{ lang('Close') }} | ||||
|       </button> | ||||
|     </footer> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import TreeNode from './TreeNode' | ||||
|  | ||||
| export default { | ||||
|   name: 'Tree', | ||||
|   components: { TreeNode }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style> | ||||
| .tree { | ||||
|   min-height: 450px | ||||
| } | ||||
|  | ||||
| .tree-list ul li { | ||||
|   padding-left: 20px; | ||||
|   margin: 6px 0; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										84
									
								
								frontend/views/partials/TreeNode.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								frontend/views/partials/TreeNode.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <template> | ||||
|   <li class="node-tree"> | ||||
|     <b-button :type="button_type" size="is-small" @click="toggleButton(node)"> | ||||
|       <span class="icon"><i :class="icon" /></span> | ||||
|     </b-button> | ||||
|       | ||||
|     <!-- eslint-disable-next-line --> | ||||
|     <a @click="$emit('selected', node)">{{ node.name }}</a> | ||||
|  | ||||
|     <ul v-if="node.children && node.children.length"> | ||||
|       <TreeNode v-for="(child, index) in node.children" :key="index" :node="child" @selected="$emit('selected', $event)" /> | ||||
|     </ul> | ||||
|   </li> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import api from '../../api/api' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'TreeNode', | ||||
|   props: { | ||||
|     node: { | ||||
|       type: Object, | ||||
|       required: true | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       active: false, | ||||
|       button_type: 'is-primary' | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     icon() { | ||||
|       return { | ||||
|         'fas': true, | ||||
|         'mdi-24px': true, | ||||
|         'fa-plus': ! this.active, | ||||
|         'fa-minus': this.active, | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     if (this.node.path == '/') { | ||||
|       this.$store.commit('resetTree') | ||||
|       this.toggleButton(this.node) | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleButton(node) { | ||||
|       if (! this.active) { | ||||
|         this.active = true | ||||
|         this.button_type = 'is-primary is-loading' | ||||
|         api.getDir({ | ||||
|           dir: node.path | ||||
|         }) | ||||
|           .then(ret => { | ||||
|             this.$store.commit('updateTreeNode', { | ||||
|               children: _.filter(ret.files, ['type', 'dir']), | ||||
|               path: node.path, | ||||
|             }) | ||||
|             this.$forceUpdate() | ||||
|             this.button_type = 'is-primary' | ||||
|           }) | ||||
|           .catch(error => this.handleError(error)) | ||||
|       } else { | ||||
|         this.active = false | ||||
|         this.$store.commit('updateTreeNode', { | ||||
|           children: [], | ||||
|           path: node.path, | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| a { | ||||
|   color: #373737; | ||||
|   font-weight: bold; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										201
									
								
								frontend/views/partials/Upload.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								frontend/views/partials/Upload.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <div v-if="visible && dropZone == false" class="progress-box"> | ||||
|       <div class="box"> | ||||
|         <div> | ||||
|           <div class="is-flex is-justify-between"> | ||||
|             <div class="is-flex"> | ||||
|               <a @click="toggleWindow"> | ||||
|                 <b-icon :icon="progressVisible ? 'angle-down' : 'angle-up'" /> | ||||
|               </a> | ||||
|               <span v-if="activeUploads"> | ||||
|                 {{ lang('Uploading files', resumable.getSize() > 0 ? Math.round(resumable.progress()*100) : 100, formatBytes(resumable.getSize())) }} | ||||
|               </span> | ||||
|               <span v-if="activeUploads && paused"> | ||||
|                 ({{ lang('Paused') }}) | ||||
|               </span> | ||||
|               <span v-if="! activeUploads"> | ||||
|                 {{ lang('Done') }} | ||||
|               </span> | ||||
|             </div> | ||||
|             <div class="is-flex"> | ||||
|               <a v-if="activeUploads" @click="togglePause()"> | ||||
|                 <b-icon :icon="paused ? 'play-circle' : 'pause-circle'" /> | ||||
|               </a> | ||||
|               <a class="progress-icon" @click="closeWindow()"> | ||||
|                 <b-icon icon="times" /> | ||||
|               </a> | ||||
|             </div> | ||||
|           </div> | ||||
|           <hr> | ||||
|         </div> | ||||
|         <div v-if="progressVisible" class="progress-items"> | ||||
|           <div v-for="(file, index) in resumable.files.slice().reverse()" :key="index"> | ||||
|             <div> | ||||
|               <div>{{ file.relativePath != '/' ? file.relativePath : '' }}/{{ file.fileName }}</div> | ||||
|               <div class="is-flex is-justify-between"> | ||||
|                 <progress :class="[file.file.uploadingError ? 'is-danger' : 'is-primary', 'progress is-large']" :value="file.size > 0 ? file.progress()*100 : 100" max="100" /> | ||||
|                 <a v-if="! file.isUploading() && file.file.uploadingError" class="progress-icon" @click="file.retry()"> | ||||
|                   <b-icon icon="redo" type="is-danger" /> | ||||
|                 </a> | ||||
|                 <a v-else class="progress-icon" @click="file.cancel()"> | ||||
|                   <b-icon :icon="file.isComplete() ? 'check' : 'times'" /> | ||||
|                 </a> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Resumable from 'resumablejs' | ||||
| import Vue from 'vue' | ||||
| import api from '../../api/api' | ||||
| import axios from 'axios' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'Upload', | ||||
|   props: [ 'files', 'dropZone' ], | ||||
|   data() { | ||||
|     return { | ||||
|       resumable: {}, | ||||
|       visible: false, | ||||
|       paused: false, | ||||
|       progressVisible: false, | ||||
|       progress: 0, | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     activeUploads() { | ||||
|       return this.resumable.files.length > 0 && this.resumable.progress() < 1 | ||||
|     }, | ||||
|   }, | ||||
|   watch: { | ||||
|     'files' (files) { | ||||
|       _.forEach(files, file => { | ||||
|         this.resumable.addFile(file) | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.resumable = new Resumable({ | ||||
|       target: Vue.config.baseURL+'/upload', | ||||
|       headers: { | ||||
|         'x-csrf-token': axios.defaults.headers.common['x-csrf-token'] | ||||
|       }, | ||||
|       withCredentials: true, | ||||
|       simultaneousUploads: this.$store.state.config.upload_simultaneous, | ||||
|       minFileSize: 0, | ||||
|       chunkSize: this.$store.state.config.upload_chunk_size, | ||||
|       maxFileSize: this.$store.state.config.upload_max_size, | ||||
|       maxFileSizeErrorCallback: (file) => { | ||||
|         this.$notification.open({ | ||||
|           message: this.lang('File size error', file.name, this.formatBytes(this.$store.state.config.upload_max_size)), | ||||
|           type: 'is-danger', | ||||
|           queue: false, | ||||
|           indefinite: true, | ||||
|         }) | ||||
|       } | ||||
|     }) | ||||
|  | ||||
|     if (!this.resumable.support) { | ||||
|       this.$dialog.alert({ | ||||
|         type: 'is-danger', | ||||
|         message: this.lang('Browser not supported.'), | ||||
|       }) | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     this.resumable.assignDrop(document.getElementById('dropzone')) | ||||
|  | ||||
|     this.resumable.on('fileAdded', (file) => { | ||||
|       this.visible = true | ||||
|       this.progressVisible = true | ||||
|  | ||||
|       if(file.relativePath === undefined || file.relativePath === null || file.relativePath == file.fileName) file.relativePath = this.$store.state.cwd.location | ||||
|       else file.relativePath = [this.$store.state.cwd.location, file.relativePath].join('/').replace('//', '/').replace(file.fileName, '').replace(/\/$/, '') | ||||
|  | ||||
|       if (!this.paused) { | ||||
|         this.resumable.upload() | ||||
|       } | ||||
|  | ||||
|     }) | ||||
|  | ||||
|     this.resumable.on('fileSuccess', (file) => { | ||||
|       file.file.uploadingError = false | ||||
|       this.$forceUpdate() | ||||
|       if (this.can('read')) { | ||||
|         api.getDir({ | ||||
|           to: '', | ||||
|         }) | ||||
|           .then(ret => { | ||||
|             this.$store.commit('setCwd', { | ||||
|               content: ret.files, | ||||
|               location: ret.location, | ||||
|             }) | ||||
|           }) | ||||
|           .catch(error => this.handleError(error)) | ||||
|       } | ||||
|     }) | ||||
|     this.resumable.on('fileError', (file) => { | ||||
|       file.file.uploadingError = true | ||||
|     }) | ||||
|   }, | ||||
|   methods: { | ||||
|     closeWindow() { | ||||
|       if (this.activeUploads) { | ||||
|         this.$dialog.confirm({ | ||||
|           message: this.lang('Are you sure you want to stop all uploads?'), | ||||
|           type: 'is-danger', | ||||
|           cancelText: this.lang('Cancel'), | ||||
|           confirmText: this.lang('Confirm'), | ||||
|           onConfirm: () => { | ||||
|             this.resumable.cancel() | ||||
|             this.visible = false | ||||
|           } | ||||
|         }) | ||||
|       } else { | ||||
|         this.visible = false | ||||
|         this.resumable.cancel() | ||||
|       } | ||||
|     }, | ||||
|     toggleWindow() { | ||||
|       this.progressVisible = ! this.progressVisible | ||||
|     }, | ||||
|     togglePause() { | ||||
|       if (this.paused) { | ||||
|         this.resumable.upload() | ||||
|         this.paused = false | ||||
|       } else { | ||||
|         this.resumable.pause() | ||||
|         this.paused = true | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped> | ||||
| .progress-icon { | ||||
|   margin-left: 15px; | ||||
| } | ||||
| .progress-box { | ||||
|   position: fixed; | ||||
|   width: 100%; | ||||
|   bottom: -30px; | ||||
|   left: 0; | ||||
|   padding: 25px; | ||||
|   max-height: 50%; | ||||
|   z-index: 1; | ||||
| } | ||||
| .progress-items { | ||||
|   overflow-y: scroll; | ||||
|   margin-right: -100px; | ||||
|   padding-right: 100px; | ||||
|   max-height: 300px; /* fix this */ | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										212
									
								
								frontend/views/partials/UserEdit.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								frontend/views/partials/UserEdit.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,212 @@ | ||||
| <template> | ||||
|   <div class="modal-card"> | ||||
|     <header class="modal-card-head"> | ||||
|       <p class="modal-card-title"> | ||||
|         {{ user.name }} | ||||
|       </p> | ||||
|     </header> | ||||
|     <section class="modal-card-body"> | ||||
|       <form @submit.prevent="save"> | ||||
|         <div v-if="user.role == 'user' || user.role == 'admin'" class="field"> | ||||
|           <b-field :label="lang('Role')"> | ||||
|             <b-select v-model="formFields.role" :placeholder="lang('Role')" expanded required> | ||||
|               <option key="user" value="user"> | ||||
|                 {{ lang('User') }} | ||||
|               </option> | ||||
|               <option key="admin" value="admin"> | ||||
|                 {{ lang('Admin') }} | ||||
|               </option> | ||||
|             </b-select> | ||||
|           </b-field> | ||||
|  | ||||
|           <b-field :label="lang('Username')" :type="formErrors.username ? 'is-danger' : ''" :message="formErrors.username"> | ||||
|             <b-input v-model="formFields.username" @keydown.native="formErrors.username = ''" /> | ||||
|           </b-field> | ||||
|  | ||||
|           <b-field :label="lang('Name')" :type="formErrors.name ? 'is-danger' : ''" :message="formErrors.name"> | ||||
|             <b-input v-model="formFields.name" @keydown.native="formErrors.name = ''" /> | ||||
|           </b-field> | ||||
|  | ||||
|           <b-field :label="lang('Password')" :type="formErrors.password ? 'is-danger' : ''" :message="formErrors.password"> | ||||
|             <b-input v-model="formFields.password" :placeholder="action == 'edit' ? lang('Leave blank for no change') : ''" password-reveal @keydown.native="formErrors.password = ''" /> | ||||
|           </b-field> | ||||
|         </div> | ||||
|  | ||||
|         <b-field :label="lang('Homedir')" :type="formErrors.homedir ? 'is-danger' : ''" :message="formErrors.homedir"> | ||||
|           <b-input v-model="formFields.homedir" @focus="selectDir" /> | ||||
|         </b-field> | ||||
|  | ||||
|         <b-field :label="lang('Permissions')"> | ||||
|           <div class="block"> | ||||
|             <b-checkbox v-model="permissions.read"> | ||||
|               {{ lang('Read') }} | ||||
|             </b-checkbox> | ||||
|             <b-checkbox v-model="permissions.write"> | ||||
|               {{ lang('Write') }} | ||||
|             </b-checkbox> | ||||
|             <b-checkbox v-model="permissions.upload"> | ||||
|               {{ lang('Upload') }} | ||||
|             </b-checkbox> | ||||
|             <b-checkbox v-model="permissions.download"> | ||||
|               {{ lang('Download permission') }} | ||||
|             </b-checkbox> | ||||
|             <b-checkbox v-model="permissions.batchdownload"> | ||||
|               {{ lang('Batch Download') }} | ||||
|             </b-checkbox> | ||||
|             <b-checkbox v-model="permissions.zip"> | ||||
|               {{ lang('Zip') }} | ||||
|             </b-checkbox> | ||||
|           </div> | ||||
|         </b-field> | ||||
|       </form> | ||||
|     </section> | ||||
|     <footer class="modal-card-foot"> | ||||
|       <button class="button" type="button" @click="$parent.close()"> | ||||
|         {{ lang('Close') }} | ||||
|       </button> | ||||
|       <button class="button is-primary" type="button" @click="confirmSave"> | ||||
|         {{ lang('Save') }} | ||||
|       </button> | ||||
|     </footer> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Tree from './Tree' | ||||
| import api from '../../api/api' | ||||
| import _ from 'lodash' | ||||
|  | ||||
| export default { | ||||
|   name: 'UserEdit', | ||||
|   props: [ 'user', 'action' ], | ||||
|   data() { | ||||
|     return { | ||||
|       formFields: { | ||||
|         role: this.user.role, | ||||
|         name: this.user.name, | ||||
|         username: this.user.username, | ||||
|         homedir: this.user.homedir, | ||||
|         password: '', | ||||
|       }, | ||||
|       formErrors: {}, | ||||
|       permissions: { | ||||
|         read: _.find(this.user.permissions, p => p == 'read') ? true : false, | ||||
|         write: _.find(this.user.permissions, p => p == 'write') ? true : false, | ||||
|         upload: _.find(this.user.permissions, p => p == 'upload') ? true : false, | ||||
|         download: _.find(this.user.permissions, p => p == 'download') ? true : false, | ||||
|         batchdownload: _.find(this.user.permissions, p => p == 'batchdownload') ? true : false, | ||||
|         zip: _.find(this.user.permissions, p => p == 'zip') ? true : false, | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|   }, | ||||
|   watch: { | ||||
|     'permissions.read' (val) { | ||||
|       if (!val) { | ||||
|         this.permissions.write = false | ||||
|         this.permissions.batchdownload = false | ||||
|         this.permissions.zip = false | ||||
|       } | ||||
|     }, | ||||
|     'permissions.write' (val) { | ||||
|       if (val) { | ||||
|         this.permissions.read = true | ||||
|       } else { | ||||
|         this.permissions.zip = false | ||||
|       } | ||||
|     }, | ||||
|     'permissions.download' (val) { | ||||
|       if (!val) { | ||||
|         this.permissions.batchdownload = false | ||||
|       } | ||||
|     }, | ||||
|     'permissions.batchdownload' (val) { | ||||
|       if (val) { | ||||
|         this.permissions.read = true | ||||
|         this.permissions.download = true | ||||
|       } | ||||
|     }, | ||||
|     'permissions.zip' (val) { | ||||
|       if (val) { | ||||
|         this.permissions.read = true | ||||
|         this.permissions.write = true | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     selectDir() { | ||||
|       this.formErrors.homedir = '' | ||||
|  | ||||
|       this.$modal.open({ | ||||
|         parent: this, | ||||
|         hasModalCard: true, | ||||
|         component: Tree, | ||||
|         events: { | ||||
|           selected: dir => { | ||||
|             this.formFields.homedir = dir.path | ||||
|           } | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|     getPermissionsArray() { | ||||
|       return _.reduce(this.permissions, (result, value, key) => { | ||||
|         if (value == true) { | ||||
|           result.push(key) | ||||
|         } | ||||
|         return result | ||||
|       }, []) | ||||
|     }, | ||||
|     confirmSave() { | ||||
|  | ||||
|       if (this.formFields.role == 'guest' && this.getPermissionsArray().length) { | ||||
|         this.$dialog.confirm({ | ||||
|           message: this.lang('Are you sure you want to allow access to everyone?'), | ||||
|           type: 'is-danger', | ||||
|           cancelText: this.lang('Cancel'), | ||||
|           confirmText: this.lang('Confirm'), | ||||
|           onConfirm: () => { | ||||
|             this.save() | ||||
|           } | ||||
|         }) | ||||
|       } else { | ||||
|         this.save() | ||||
|       } | ||||
|     }, | ||||
|     save() { | ||||
|  | ||||
|       let method = this.action == 'add' ? api.storeUser : api.updateUser | ||||
|  | ||||
|       method({ | ||||
|         key: this.user.username, | ||||
|         role: this.formFields.role, | ||||
|         name: this.formFields.name, | ||||
|         username: this.formFields.username, | ||||
|         homedir: this.formFields.homedir, | ||||
|         password: this.formFields.password, | ||||
|         permissions: this.getPermissionsArray(), | ||||
|       }) | ||||
|         .then(res => { | ||||
|           this.$toast.open({ | ||||
|             message: this.lang('Updated'), | ||||
|             type: 'is-success', | ||||
|           }) | ||||
|           this.$emit('updated', res) | ||||
|           this.$parent.close() | ||||
|         }) | ||||
|         .catch(errors => { | ||||
|           if (typeof errors.response.data.data != 'object') { | ||||
|             this.handleError(errors) | ||||
|           } | ||||
|           _.forEach(errors.response.data, err => { | ||||
|             _.forEach(err, (val, key) => { | ||||
|               this.formErrors[key] = this.lang(val) | ||||
|               this.$forceUpdate() | ||||
|             }) | ||||
|           }) | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user