This commit is contained in:
alcalbg
2022-10-12 10:49:45 +00:00
parent 78a77cc193
commit 21497025de
217 changed files with 49804 additions and 0 deletions

94
frontend/App.vue Normal file
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

69
frontend/main.js Normal file
View 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
View 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

View 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
View 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
View 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: {
}
})

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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
View 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
View 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
View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>
&nbsp;
<!-- 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>

View 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>

View 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>