-
-
- {{ file.filename }}
+ v-on:dblclick="selectAction(file.path, file.extension)"
+ v-on:contextmenu.prevent="contextMenu(file, $event)"
+ >
+ |
+
+ {{ file.filename ? file.filename : file.basename }}
|
{{ bytesToHuman(file.size) }} |
@@ -86,75 +85,81 @@
diff --git a/src/components/manager/Thumbnail.vue b/src/components/manager/Thumbnail.vue
new file mode 100644
index 0000000..243fbc9
--- /dev/null
+++ b/src/components/manager/Thumbnail.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/manager/mixins/manager.js b/src/components/manager/mixins/manager.js
new file mode 100644
index 0000000..96ff1e0
--- /dev/null
+++ b/src/components/manager/mixins/manager.js
@@ -0,0 +1,205 @@
+// Event bus
+import EventBus from '../../../emitter';
+
+export default {
+ computed: {
+ /**
+ * Selected disk for this manager
+ * @returns {*}
+ */
+ selectedDisk() {
+ return this.$store.state.fm[this.manager].selectedDisk;
+ },
+
+ /**
+ * Selected directory for this manager
+ * @returns {any}
+ */
+ selectedDirectory() {
+ return this.$store.state.fm[this.manager].selectedDirectory;
+ },
+
+ /**
+ * Files list for selected directory
+ * @returns {*}
+ */
+ files() {
+ return this.$store.getters[`fm/${this.manager}/files`];
+ },
+
+ /**
+ * Directories list for selected directory
+ * @returns {*}
+ */
+ directories() {
+ return this.$store.getters[`fm/${this.manager}/directories`];
+ },
+
+ /**
+ * Selected files and folders
+ * @returns {*}
+ */
+ selected() {
+ return this.$store.state.fm[this.manager].selected;
+ },
+
+ /**
+ * ACL On/Off
+ */
+ acl() {
+ return this.$store.state.fm.settings.acl;
+ },
+
+ /**
+ * Check if current path is at root level
+ * @return {boolean}
+ */
+ isRootPath() {
+ return this.$store.state.fm[this.manager].selectedDirectory === null;
+ },
+ },
+ methods: {
+ /**
+ * Load selected directory and show files
+ * @param path
+ */
+ selectDirectory(path) {
+ this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path, history: true });
+ },
+
+ /**
+ * Level up directory
+ */
+ levelUp() {
+ // if this a not root directory
+ if (this.selectedDirectory) {
+ // calculate up directory path
+ const pathUp = this.selectedDirectory.split('/').slice(0, -1).join('/');
+
+ // load directory
+ this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path: pathUp || null, history: true });
+ }
+ },
+
+ /**
+ * Check item - selected
+ * @param type
+ * @param path
+ */
+ checkSelect(type, path) {
+ return this.selected[type].includes(path);
+ },
+
+ /**
+ * Select items in list (files + folders)
+ * @param type
+ * @param path
+ * @param event
+ */
+ selectItem(type, path, event) {
+ // search in selected array
+ const alreadySelected = this.selected[type].includes(path);
+
+ // if pressed Ctrl -> multi select
+ if (event.ctrlKey || event.metaKey) {
+ if (!alreadySelected) {
+ // add new selected item
+ this.$store.commit(`fm/${this.manager}/setSelected`, { type, path });
+ } else {
+ // remove selected item
+ this.$store.commit(`fm/${this.manager}/removeSelected`, { type, path });
+ }
+ }
+
+ // single select
+ if (!event.ctrlKey && !alreadySelected && !event.metaKey) {
+ this.$store.commit(`fm/${this.manager}/changeSelected`, { type, path });
+ }
+ },
+
+ /**
+ * Show context menu
+ * @param item
+ * @param event
+ */
+ contextMenu(item, event) {
+ // el type
+ const type = item.type === 'dir' ? 'directories' : 'files';
+ // search in selected array
+ const alreadySelected = this.selected[type].includes(item.path);
+
+ // select this element
+ if (!alreadySelected) {
+ // select item
+ this.$store.commit(`fm/${this.manager}/changeSelected`, {
+ type,
+ path: item.path,
+ });
+ }
+
+ // create event
+ EventBus.emit('contextMenu', event);
+ },
+
+ /**
+ * Select and Action
+ * @param path
+ * @param extension
+ */
+ selectAction(path, extension) {
+ // if is set fileCallback
+ if (this.$store.state.fm.fileCallback) {
+ this.$store
+ .dispatch('fm/url', {
+ disk: this.selectedDisk,
+ path,
+ })
+ .then((response) => {
+ if (response.data.result.status === 'success') {
+ this.$store.state.fm.fileCallback(response.data.url);
+ }
+ });
+
+ return;
+ }
+
+ // if extension not defined
+ if (!extension) {
+ return;
+ }
+
+ // show, play..
+ if (this.$store.state.fm.settings.imageExtensions.includes(extension.toLowerCase())) {
+ // show image
+ this.$store.commit('fm/modal/setModalState', {
+ modalName: 'PreviewModal',
+ show: true,
+ });
+ } else if (Object.keys(this.$store.state.fm.settings.textExtensions).includes(extension.toLowerCase())) {
+ // show text file
+ this.$store.commit('fm/modal/setModalState', {
+ modalName: 'TextEditModal',
+ show: true,
+ });
+ } else if (this.$store.state.fm.settings.audioExtensions.includes(extension.toLowerCase())) {
+ // show player modal
+ this.$store.commit('fm/modal/setModalState', {
+ modalName: 'AudioPlayerModal',
+ show: true,
+ });
+ } else if (this.$store.state.fm.settings.videoExtensions.includes(extension.toLowerCase())) {
+ // show player modal
+ this.$store.commit('fm/modal/setModalState', {
+ modalName: 'VideoPlayerModal',
+ show: true,
+ });
+ } else if (extension.toLowerCase() === 'pdf') {
+ // show pdf document
+ this.$store.dispatch('fm/openPDF', {
+ disk: this.selectedDisk,
+ path,
+ });
+ }
+ },
+ },
+};
diff --git a/src/components/modals/About.vue b/src/components/modals/About.vue
deleted file mode 100644
index 0865c65..0000000
--- a/src/components/modals/About.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- {{ lang.modal.about.name }}
-
-
- - {{ lang.modal.about.version }}:
- - 1.0.0
-
- - {{ lang.modal.about.developer }}:
- - Aleksandr Manekin - alexusmai@gmail.com
-
- - GitHub:
- -
- Frontend
- Backend
-
-
- - {{ lang.modal.about.site }}:
- - webmai.ru
-
-
-
-
-
-
-
diff --git a/src/components/modals/Clipboard.vue b/src/components/modals/Clipboard.vue
deleted file mode 100644
index e577dd6..0000000
--- a/src/components/modals/Clipboard.vue
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
- {{ lang.clipboard.actionType }} - {{ lang.clipboard[clipboard.type] }}
-
- {{ clipboard.disk }}
-
-
-
-
- {{ dir.name }}
-
-
-
-
-
-
-
-
-
- {{ file.name }}
-
-
-
-
-
-
-
-
- {{ lang.clipboard.none }}
-
-
-
-
-
-
-
-
-
diff --git a/src/components/modals/Delete.vue b/src/components/modals/Delete.vue
deleted file mode 100644
index f426b0a..0000000
--- a/src/components/modals/Delete.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
- {{ item.basename }}
-
-
-
- {{ item.basename }}
-
-
-
- {{ bytesToHuman(item.size) }}
-
-
-
-
-
- {{ lang.modal.delete.confirmText }}
-
-
-
-
-
-
-
- {{ lang.modal.delete.noSelected }}
-
-
-
-
-
-
-
-
-
diff --git a/src/components/modals/Modal.vue b/src/components/modals/Modal.vue
deleted file mode 100644
index 4d1e592..0000000
--- a/src/components/modals/Modal.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/components/modals/ModalBlock.vue b/src/components/modals/ModalBlock.vue
new file mode 100644
index 0000000..0e9f9d9
--- /dev/null
+++ b/src/components/modals/ModalBlock.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/NewFolder.vue b/src/components/modals/NewFolder.vue
deleted file mode 100644
index 03b6026..0000000
--- a/src/components/modals/NewFolder.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
diff --git a/src/components/modals/Preview.vue b/src/components/modals/Preview.vue
deleted file mode 100644
index e648670..0000000
--- a/src/components/modals/Preview.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
- ![]()
-
-
-
-
-
diff --git a/src/components/modals/Properties.vue b/src/components/modals/Properties.vue
deleted file mode 100644
index ca7c0b0..0000000
--- a/src/components/modals/Properties.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
- - {{ lang.modal.properties.disk }}:
- - {{ selectedDisk }}
-
- - {{ lang.modal.properties.name }}:
- - {{ selectedItem.basename }}
-
- - {{ lang.modal.properties.path }}:
- - {{ selectedItem.path }}
-
-
- - {{ lang.modal.properties.size }}:
- - {{ bytesToHuman(selectedItem.size) }}
-
-
-
- - {{ lang.modal.properties.modified }}:
- - {{ timestampToDate(selectedItem.timestamp) }}
-
-
-
-
-
-
-
-
diff --git a/src/components/modals/Rename.vue b/src/components/modals/Rename.vue
deleted file mode 100644
index 879ba91..0000000
--- a/src/components/modals/Rename.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
diff --git a/src/components/modals/Status.vue b/src/components/modals/Status.vue
deleted file mode 100644
index ea896f3..0000000
--- a/src/components/modals/Status.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
- -
- {{ item.status }} - {{ item.message }}
-
-
-
-
- {{ lang.modal.status.noErrors }}
-
-
-
-
-
-
-
diff --git a/src/components/modals/Upload.vue b/src/components/modals/Upload.vue
deleted file mode 100644
index c391bea..0000000
--- a/src/components/modals/Upload.vue
+++ /dev/null
@@ -1,205 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.name }}
-
-
- {{ bytesToHuman(item.size) }}
-
-
-
-
-
- {{ lang.modal.upload.selected }}
- {{ newFiles.length }}
-
-
- {{ lang.modal.upload.size }}
- {{ allFilesSize }}
-
-
-
-
-
- {{ lang.modal.upload.ifExist }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ lang.modal.upload.noSelected }}
-
-
-
-
- {{ progressBar }}%
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/modals/additions/CropperModule.vue b/src/components/modals/additions/CropperModule.vue
new file mode 100644
index 0000000..a7e3c11
--- /dev/null
+++ b/src/components/modals/additions/CropperModule.vue
@@ -0,0 +1,326 @@
+
+
+
+
+ ![]()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/additions/SelectedFileList.vue b/src/components/modals/additions/SelectedFileList.vue
new file mode 100644
index 0000000..3096577
--- /dev/null
+++ b/src/components/modals/additions/SelectedFileList.vue
@@ -0,0 +1,41 @@
+
+
+
+
+ {{ item.basename }}
+
+ {{ item.basename }}
+
+
+
+ {{ bytesToHuman(item.size) }}
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/mixins/modal.js b/src/components/modals/mixins/modal.js
new file mode 100644
index 0000000..b1247d7
--- /dev/null
+++ b/src/components/modals/mixins/modal.js
@@ -0,0 +1,32 @@
+export default {
+ directives: {
+ /**
+ * AutoFocus for inputs
+ */
+ focus: {
+ inserted(el) {
+ el.focus();
+ },
+ },
+ },
+ computed: {
+ /**
+ * Active manager
+ * @returns {any}
+ */
+ activeManager() {
+ return this.$store.state.fm.activeManager;
+ },
+ },
+ methods: {
+ /**
+ * Hide modal window
+ */
+ hideModal() {
+ this.$store.commit('fm/modal/setModalState', {
+ modalName: null,
+ show: false,
+ });
+ },
+ },
+};
diff --git a/src/components/modals/views/AboutModal.vue b/src/components/modals/views/AboutModal.vue
new file mode 100644
index 0000000..ca3faca
--- /dev/null
+++ b/src/components/modals/views/AboutModal.vue
@@ -0,0 +1,49 @@
+
+
+
+
+ {{ lang.modal.about.name }}
+
+
+ - {{ lang.modal.about.version }}:
+ - {{ version }}
+
+ - {{ lang.modal.about.developer }}:
+ - Aleksandr Manekin (alexusmai@gmail.com)
+
+ - GitHub:
+ -
+
+ alexusmai/laravel-file-manager
+
+
+
+ alexusmai/vue-laravel-file-manager
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/AudioPlayerModal.vue b/src/components/modals/views/AudioPlayerModal.vue
new file mode 100644
index 0000000..84692ff
--- /dev/null
+++ b/src/components/modals/views/AudioPlayerModal.vue
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+ {{ index }}.
+ {{ item.basename }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/ClipboardModal.vue b/src/components/modals/views/ClipboardModal.vue
new file mode 100644
index 0000000..2db0f5c
--- /dev/null
+++ b/src/components/modals/views/ClipboardModal.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+ {{ clipboard.disk }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ dir.name }}
+
+
+
+
+
+
+
+ {{ file.name }}
+
+
+
+
+
+
+
+ {{ lang.clipboard.none }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/DeleteModal.vue b/src/components/modals/views/DeleteModal.vue
new file mode 100644
index 0000000..e6cb475
--- /dev/null
+++ b/src/components/modals/views/DeleteModal.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+ {{ lang.modal.delete.noSelected }}
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/NewFileModal.vue b/src/components/modals/views/NewFileModal.vue
new file mode 100644
index 0000000..38197ee
--- /dev/null
+++ b/src/components/modals/views/NewFileModal.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
diff --git a/src/components/modals/views/NewFolderModal.vue b/src/components/modals/views/NewFolderModal.vue
new file mode 100644
index 0000000..111d100
--- /dev/null
+++ b/src/components/modals/views/NewFolderModal.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
diff --git a/src/components/modals/views/PreviewModal.vue b/src/components/modals/views/PreviewModal.vue
new file mode 100644
index 0000000..3a3567c
--- /dev/null
+++ b/src/components/modals/views/PreviewModal.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/PropertiesModal.vue b/src/components/modals/views/PropertiesModal.vue
new file mode 100644
index 0000000..01fb8df
--- /dev/null
+++ b/src/components/modals/views/PropertiesModal.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+ {{ lang.modal.properties.disk }}:
+ {{ selectedDisk }}
+
+
+
+
+
+ {{ lang.modal.properties.name }}:
+ {{ selectedItem.basename }}
+
+
+
+
+
+ {{ lang.modal.properties.path }}:
+ {{ selectedItem.path }}
+
+
+
+
+
+
+ {{ lang.modal.properties.size }}:
+ {{ bytesToHuman(selectedItem.size) }}
+
+
+
+
+
+ {{ lang.modal.properties.url }}:
+
+ {{ url }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.modal.properties.modified }}:
+ {{ timestampToDate(selectedItem.timestamp) }}
+
+
+
+
+
+
+
+ {{ lang.modal.properties.access }}:
+ {{ lang.modal.properties['access_' + selectedItem.acl] }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/RenameModal.vue b/src/components/modals/views/RenameModal.vue
new file mode 100644
index 0000000..fa1d5c7
--- /dev/null
+++ b/src/components/modals/views/RenameModal.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
diff --git a/src/components/modals/views/StatusModal.vue b/src/components/modals/views/StatusModal.vue
new file mode 100644
index 0000000..699a665
--- /dev/null
+++ b/src/components/modals/views/StatusModal.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+ - {{ item.status }} - {{ item.message }}
+
+
+
+ {{ lang.modal.status.noErrors }}
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/TextEditModal.vue b/src/components/modals/views/TextEditModal.vue
new file mode 100644
index 0000000..6b062af
--- /dev/null
+++ b/src/components/modals/views/TextEditModal.vue
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/UnzipModal.vue b/src/components/modals/views/UnzipModal.vue
new file mode 100644
index 0000000..f695891
--- /dev/null
+++ b/src/components/modals/views/UnzipModal.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+ {{ lang.modal.unzip.fieldRadioName }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.modal.unzip.warning }}
+
+
+
+
+
+
diff --git a/src/components/modals/views/UploadModal.vue b/src/components/modals/views/UploadModal.vue
new file mode 100644
index 0000000..a238298
--- /dev/null
+++ b/src/components/modals/views/UploadModal.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ bytesToHuman(item.size) }}
+
+
+
+
+
+ {{ lang.modal.upload.selected }}
+ {{ newFiles.length }}
+
+
+ {{ lang.modal.upload.size }}
+ {{ allFilesSize }}
+
+
+
+
+
+ {{ lang.modal.upload.ifExist }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.modal.upload.noSelected }}
+
+
+
+
+
+ {{ progressBar }}%
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/VideoPlayerModal.vue b/src/components/modals/views/VideoPlayerModal.vue
new file mode 100644
index 0000000..a634ddc
--- /dev/null
+++ b/src/components/modals/views/VideoPlayerModal.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
diff --git a/src/components/modals/views/ZipModal.vue b/src/components/modals/views/ZipModal.vue
new file mode 100644
index 0000000..ec6df60
--- /dev/null
+++ b/src/components/modals/views/ZipModal.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tree/Branch.vue b/src/components/tree/Branch.vue
deleted file mode 100644
index 4329816..0000000
--- a/src/components/tree/Branch.vue
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/components/tree/FolderTree.vue b/src/components/tree/FolderTree.vue
index b28814d..a18a52c 100644
--- a/src/components/tree/FolderTree.vue
+++ b/src/components/tree/FolderTree.vue
@@ -1,47 +1,46 @@
-
- {{ selectedDisk }}
-
-
+ {{ selectedDisk }}
+
diff --git a/src/components/tree/TreeBranch.vue b/src/components/tree/TreeBranch.vue
new file mode 100644
index 0000000..52133c1
--- /dev/null
+++ b/src/components/tree/TreeBranch.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
diff --git a/src/emitter.js b/src/emitter.js
new file mode 100644
index 0000000..907d3b6
--- /dev/null
+++ b/src/emitter.js
@@ -0,0 +1,3 @@
+import mitt from 'mitt';
+
+export default mitt();
diff --git a/src/eventBus.js b/src/eventBus.js
deleted file mode 100644
index f304ad6..0000000
--- a/src/eventBus.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import Vue from 'vue';
-
-// EventBus
-const EventBus = new Vue();
-
-export default EventBus;
diff --git a/src/http/axios-settings.js b/src/http/axios-settings.js
deleted file mode 100644
index 91b08d0..0000000
--- a/src/http/axios-settings.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* eslint-disable no-console */
-import axios from 'axios';
-
-// CSRF token
-const token = document.head.querySelector('meta[name="csrf-token"]');
-
-if (!token) {
- console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
-}
-
-const HTTP = axios.create({
- baseURL: `${location.protocol}//${location.hostname}/file-manager/`,
- headers: {
- 'X-Requested-With': 'XMLHttpRequest',
- 'X-CSRF-TOKEN': token.content,
- },
-});
-
-export default HTTP;
diff --git a/src/http/axios.js b/src/http/axios.js
new file mode 100644
index 0000000..e4118fd
--- /dev/null
+++ b/src/http/axios.js
@@ -0,0 +1,4 @@
+import axios from 'axios';
+
+// set new axios instance
+export default axios.create();
diff --git a/src/http/get-queries.js b/src/http/get-queries.js
deleted file mode 100644
index b00d341..0000000
--- a/src/http/get-queries.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import HTTP from './axios-settings';
-
-const getQueries = {
- /**
- * Get configuration data from server
- * @returns {AxiosPromise}
- */
- initialize() {
- return HTTP.get('initialize');
- },
-
- /**
- * Get directories for the tree (upper level)
- * @param disk
- * @param path
- * @returns {AxiosPromise}
- */
- tree(disk, path) {
- return HTTP.get('tree', {
- params: {
- disk,
- path,
- },
- });
- },
-
- /**
- * Select disk
- * @param disk
- * @returns {AxiosPromise}
- */
- selectDisk(disk) {
- return HTTP.get('select-disk', {
- params: { disk },
- });
- },
-
- /**
- * Get content (files and folders)
- * @param disk
- * @param path
- * @returns {AxiosPromise}
- */
- content(disk, path) {
- return HTTP.get('content', {
- params: {
- disk,
- path,
- },
- });
- },
-
- /**
- * Item properties
- * @param disk
- * @param path
- * @returns {AxiosPromise}
- */
- properties(disk, path) {
- return HTTP.get('properties', {
- params: {
- disk,
- path,
- },
- });
- },
-
- url(http://github.com/disk,%20path) {
- return HTTP.get('url', {
- params: {
- disk,
- path,
- },
- });
- },
-};
-
-export default getQueries;
diff --git a/src/http/get.js b/src/http/get.js
new file mode 100644
index 0000000..93764d4
--- /dev/null
+++ b/src/http/get.js
@@ -0,0 +1,119 @@
+import HTTP from './axios';
+
+export default {
+ /**
+ * Get configuration data from server
+ * @returns {*}
+ */
+ initialize() {
+ return HTTP.get('initialize');
+ },
+
+ /**
+ * Get directories for the tree (upper level)
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ tree(disk, path) {
+ return HTTP.get('tree', { params: { disk, path } });
+ },
+
+ /**
+ * Select disk
+ * @param disk
+ * @returns {*}
+ */
+ selectDisk(disk) {
+ return HTTP.get('select-disk', { params: { disk } });
+ },
+
+ /**
+ * Get content (files and folders)
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ content(disk, path) {
+ return HTTP.get('content', { params: { disk, path } });
+ },
+
+ /**
+ * Item properties
+ */
+ /* properties(disk, path) {
+ return HTTP.get('properties', { params: { disk, path } });
+ }, */
+
+ /**
+ * URL
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ url(http://github.com/disk,%20path) {
+ return HTTP.get('url', { params: { disk, path } });
+ },
+
+ /**
+ * Get file to editing or showing
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ getFile(disk, path) {
+ return HTTP.get('download', { params: { disk, path } });
+ },
+
+ /**
+ * Get file - ArrayBuffer
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ getFileArrayBuffer(disk, path) {
+ return HTTP.get('download', {
+ responseType: 'arraybuffer',
+ params: { disk, path },
+ });
+ },
+
+ /**
+ * Image thumbnail
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ thumbnail(disk, path) {
+ return HTTP.get('thumbnails', {
+ responseType: 'arraybuffer',
+ params: { disk, path },
+ });
+ },
+
+ /**
+ * Image preview
+ * @param disk
+ * @param path
+ * @return {*}
+ */
+ preview(disk, path) {
+ return HTTP.get('preview', {
+ responseType: 'arraybuffer',
+ params: { disk, path },
+ });
+ },
+
+ /**
+ * Download file
+ * @param disk
+ * @param path
+ * @return {*}
+ */
+ download(disk, path) {
+ return HTTP.get('download', {
+ responseType: 'arraybuffer',
+ params: { disk, path },
+ });
+ },
+};
diff --git a/src/http/post-queries.js b/src/http/post-queries.js
deleted file mode 100644
index 894e08f..0000000
--- a/src/http/post-queries.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import HTTP from './axios-settings';
-
-const postQueries = {
- /**
- * Create new directory
- * @param disk
- * @param path
- * @param name
- * @returns {AxiosPromise}
- */
- createDirectory(disk, path, name) {
- return HTTP.post('create-directory', {
- disk,
- path,
- name,
- });
- },
-
- /**
- * Upload file
- * @param formData
- * @param config
- * @returns {AxiosPromise}
- */
- upload(formData, config) {
- return HTTP.post('upload', formData, config);
- },
-
- /**
- * Delete selected items
- * @param disk
- * @param items
- * @returns {AxiosPromise}
- */
- delete(disk, items) {
- return HTTP.post('delete',
- {
- disk,
- items,
- },
- );
- },
-
- /**
- * Rename file or folder
- * @param disk
- * @param newName
- * @param oldName
- * @returns {AxiosPromise}
- */
- rename(disk, newName, oldName) {
- return HTTP.post('rename',
- {
- disk,
- newName,
- oldName,
- },
- );
- },
-
- /**
- * Copy / Cut files and folders
- * @param disk
- * @param path
- * @param clipboard
- * @returns {AxiosPromise}
- */
- paste(disk, path, clipboard) {
- return HTTP.post('paste', {
- disk,
- path,
- clipboard,
- });
- },
-};
-
-export default postQueries;
diff --git a/src/http/post.js b/src/http/post.js
new file mode 100644
index 0000000..052a8dd
--- /dev/null
+++ b/src/http/post.js
@@ -0,0 +1,87 @@
+import HTTP from './axios';
+
+export default {
+ /**
+ * Create new file
+ * @param disk
+ * @param path
+ * @param name
+ * @returns {Promise>}
+ */
+ createFile(disk, path, name) {
+ return HTTP.post('create-file', { disk, path, name });
+ },
+
+ /**
+ * Update file
+ * @param formData
+ * @returns {*}
+ */
+ updateFile(formData) {
+ return HTTP.post('update-file', formData);
+ },
+
+ /**
+ * Create new directory
+ * @param data
+ * @returns {*}
+ */
+ createDirectory(data) {
+ return HTTP.post('create-directory', data);
+ },
+
+ /**
+ * Upload file
+ * @param data
+ * @param config
+ * @returns {Promise>}
+ */
+ upload(data, config) {
+ return HTTP.post('upload', data, config);
+ },
+
+ /**
+ * Delete selected items
+ * @param data
+ * @returns {*}
+ */
+ delete(data) {
+ return HTTP.post('delete', data);
+ },
+
+ /**
+ * Rename file or folder
+ * @param data
+ * @returns {*}
+ */
+ rename(data) {
+ return HTTP.post('rename', data);
+ },
+
+ /**
+ * Copy / Cut files and folders
+ * @param data
+ * @returns {*}
+ */
+ paste(data) {
+ return HTTP.post('paste', data);
+ },
+
+ /**
+ * Zip
+ * @param data
+ * @returns {*}
+ */
+ zip(data) {
+ return HTTP.post('zip', data);
+ },
+
+ /**
+ * Unzip
+ * @returns {*}
+ * @param data
+ */
+ unzip(data) {
+ return HTTP.post('unzip', data);
+ },
+};
diff --git a/src/init.js b/src/init.js
index ac43331..9c4a10e 100644
--- a/src/init.js
+++ b/src/init.js
@@ -1,15 +1,13 @@
-/* eslint-disable no-console */
-import fm from './store/file-manager';
-import FileManager from './FileManager';
+import store from './store';
+import FileManager from './FileManager.vue';
-function install(Vue, options = {}) {
- if (!options.store) console.error('Please provide a store!!');
-
- Vue.component('file-manager', FileManager);
+export default {
+ install: (app, options) => {
+ // eslint-disable-next-line no-console
+ if (!options.store) console.error('Please provide a vuex store!!');
- options.store.registerModule('fm', fm);
-}
+ app.component('file-manager', FileManager);
-export default {
- install,
+ options.store.registerModule('fm', store);
+ },
};
diff --git a/src/lang/ar.js b/src/lang/ar.js
index f46fe5c..d3ce198 100644
--- a/src/lang/ar.js
+++ b/src/lang/ar.js
@@ -3,115 +3,188 @@
* @type Object
*/
const ar = {
- btn: {
- about: 'حول',
- back: 'رجوع',
- cancel: 'الغاء',
- clear: 'مسح',
- copy: 'نسخ',
- cut: 'قص',
- delete: 'حذف',
- edit: 'تعديل',
- forward: 'الى الامام',
- folder: 'مجلد جديد',
- fullScreen: 'ملء الشاشة',
- grid: 'شبكة',
- paste: 'لصق',
- refresh: 'تحديث',
- submit: 'ارسال',
- table: 'جدول',
- upload: 'رفع',
- uploadSelect: 'اختر الملفات',
- },
- clipboard: {
- actionType: 'نوع',
- copy: 'نسخ',
- cut: 'قص',
- none: 'لا شيء محدد',
- title: 'ذاكرة النصوص',
- },
- contextMenu: {
- copy: 'نسخ',
- cut: 'قص',
- delete: 'حذف',
- download: 'تحميل',
- info: 'اختير:',
- open: 'فتح',
- paste: 'لصق',
- properties: 'الخصائص',
- rename: 'اعادة تسمية',
- select: 'اختيار',
- view: 'عرض',
- zip: 'ضغط',
- },
- info: {
- directories: 'المجلدات:',
- files: 'الملفات:',
- selected: 'أختيرت:',
- selectedSize: 'حجم الملفات:',
- size: 'حجم الملفات:',
- },
- manager: {
- table: {
- date: 'تأريخ',
- folder: 'مجلد',
- name: 'أسم',
- size: 'حجم',
- type: 'نوع',
+ btn: {
+ about: 'حول',
+ back: 'رجوع',
+ cancel: 'الغاء',
+ clear: 'مسح',
+ copy: 'نسخ',
+ cut: 'قص',
+ delete: 'حذف',
+ edit: 'تعديل',
+ forward: 'الى الامام',
+ folder: 'مجلد جديد',
+ file: 'ملف جديد',
+ fullScreen: 'ملء الشاشة',
+ grid: 'شبكة',
+ paste: 'لصق',
+ refresh: 'تحديث',
+ submit: 'ارسال',
+ table: 'جدول',
+ upload: 'رفع',
+ uploadSelect: 'اختر الملفات',
+ hidden: 'الملفات المخفية',
},
- },
- modal: {
- about: {
- developer: 'مطور',
- name: 'Laravel File Manager',
- site: 'موقع',
- title: 'حول',
- version: 'الإصدار',
+ clipboard: {
+ actionType: 'نوع',
+ copy: 'نسخ',
+ cut: 'قص',
+ none: 'لا شيء محدد',
+ title: 'ذاكرة النصوص',
},
- delete: {
- confirmText: 'تأكيد الحذف!',
- confirmLabel: 'حذف!',
- noSelected: 'لا شيء محدد!',
- title: 'حذف',
+ contextMenu: {
+ copy: 'نسخ',
+ cut: 'قص',
+ delete: 'حذف',
+ download: 'تحميل',
+ info: 'اختير:',
+ open: 'فتح',
+ paste: 'لصق',
+ properties: 'الخصائص',
+ rename: 'اعادة تسمية',
+ select: 'اختيار',
+ view: 'عرض',
+ zip: 'ضغط',
+ unzip: 'أستخراج',
+ edit: 'تعديل',
+ audioPlay: 'تشغيل',
+ videoPlay: 'تشغيل',
},
- newFolder: {
- fieldName: 'أسم المجلد',
- fieldFeedback: 'المجلد موجود!',
- title: 'انشاء مجلد جديد',
+ info: {
+ directories: 'المجلدات:',
+ files: 'الملفات:',
+ selected: 'أختيرت:',
+ selectedSize: 'حجم الملفات:',
+ size: 'حجم الملفات:',
},
- preview: {
- title: 'عرض',
+ manager: {
+ table: {
+ date: 'تأريخ',
+ folder: 'مجلد',
+ name: 'أسم',
+ size: 'حجم',
+ type: 'نوع',
+ },
},
- properties: {
- disk: 'قرص',
- modified: 'تم التعديل',
- name: 'أسم',
- path: 'مسار',
- size: 'حجم',
- title: 'خصائص',
- type: 'نوع',
+ modal: {
+ about: {
+ developer: 'مطور',
+ name: 'Laravel File Manager',
+ title: 'حول',
+ version: 'الإصدار',
+ },
+ delete: {
+ noSelected: 'لا شيء محدد!',
+ title: 'حذف',
+ },
+ newFile: {
+ fieldName: 'أسم الملف',
+ fieldFeedback: 'الملف موجود!',
+ title: 'أنشاء ملف جديد',
+ },
+ newFolder: {
+ fieldName: 'أسم المجلد',
+ fieldFeedback: 'المجلد موجود!',
+ title: 'انشاء مجلد جديد',
+ },
+ preview: {
+ title: 'عرض',
+ },
+ properties: {
+ disk: 'قرص',
+ modified: 'تم التعديل',
+ name: 'أسم',
+ path: 'مسار',
+ size: 'حجم',
+ title: 'خصائص',
+ type: 'نوع',
+ url: 'رابط',
+ access: 'التمكن من',
+ access_0: 'تم الرفض',
+ access_1: 'قراءة فقط',
+ access_2: 'اقرا و اكتب',
+ },
+ rename: {
+ directoryExist: 'المجلد موجود',
+ fieldName: 'ادخال اسم جديد',
+ fieldFeedback: 'اسم خاطئ',
+ fileExist: 'الملف موجود',
+ title: 'اعادة تسمية',
+ },
+ status: {
+ noErrors: 'لايوجد خطأ!',
+ title: 'الحالة',
+ },
+ upload: {
+ ifExist: 'اذا الملف موجود:',
+ noSelected: 'لا توجد ملفات مختارة!',
+ overwrite: 'اعادة الكتابة!',
+ selected: 'المختارة:',
+ size: 'الحجم:',
+ skip: 'تخطي',
+ title: 'رفع الملفات',
+ },
+ editor: {
+ title: 'محرر',
+ },
+ audioPlayer: {
+ title: 'مشغل الاصوات',
+ },
+ videoPlayer: {
+ title: 'مشغل الفيديو',
+ },
+ zip: {
+ title: 'أنشاء أرشيف',
+ fieldName: 'أسم الارشيف',
+ fieldFeedback: 'الارشيف موجود!',
+ },
+ unzip: {
+ title: 'فك الارشيف',
+ fieldName: 'أسم المجلد',
+ fieldRadioName: 'أستخراج الى:',
+ fieldRadio1: 'الى المجلد الحالي',
+ fieldRadio2: 'في مجلد جديد',
+ fieldFeedback: 'المجلد موجود!',
+ warning: 'تحذير! اذا تشابهت الاسماء, سيتم استبدال الملفات!',
+ },
+ cropper: {
+ title: 'قص',
+ apply: 'تطبيق',
+ reset: 'اعادة تعين',
+ save: 'حفظ',
+ },
},
- rename: {
- directoryExist: 'المجلد موجود',
- fieldName: 'ادخال اسم جديد',
- fieldFeedback: 'اسم خاطئ',
- fileExist: 'الملف موجود',
- title: 'اعادة تسمية',
+ notifications: {
+ cutToClipboard: 'قص إلى الحافظة!',
+ copyToClipboard: 'نسخ إلى الحافظة!',
},
- status: {
- noErrors: 'لايوجد خطأ!',
- title: 'الحالة',
+ response: {
+ noConfig: 'الاعدادت غير متوفرة!',
+ notFound: 'غير متوفر!',
+ diskNotFound: 'القرص غير موجود!',
+ pathNotFound: 'مسار غير موجود!',
+ diskSelected: 'تم اختيار القرص!',
+ // files
+ fileExist: 'الملف موجود بالفعل!',
+ fileCreated: 'تم إنشاء الملف!',
+ fileUpdated: 'تم تحديث الملف!',
+ fileNotFound: 'الملف غير موجود!',
+ // directories
+ dirExist: 'المجلد موجود بالفعل!',
+ dirCreated: 'تم أنشاء المجلد!',
+ dirNotFound: 'المجلد غير موجود',
+ // actions
+ uploaded: 'تم تحديث كل الملفات!',
+ notAllUploaded: 'بعض الملفات غير المحملة!',
+ delNotFound: 'بعض الملفات غير موجودة! تحديث!',
+ deleted: 'تم الحذف!',
+ renamed: 'أعيدت تسميتها!',
+ copied: 'تم النسخ بنجاح!',
+ // zip
+ zipError: 'خطأ في إنشاء الأرشيف!',
+ // acl
+ aclError: 'تم الرفض!',
},
- upload: {
- ifExist: 'اذا الملف موجود:',
- noSelected: 'لا توجد ملفات مختارة!',
- overwrite: 'اعادة الكتابة!',
- selected: 'المختارة:',
- size: 'الحجم:',
- skip: 'تخطي',
- title: 'رفع الملفات',
- },
- },
};
export default ar;
diff --git a/src/lang/cs.js b/src/lang/cs.js
new file mode 100644
index 0000000..77a7831
--- /dev/null
+++ b/src/lang/cs.js
@@ -0,0 +1,191 @@
+/**
+ * Czech translate
+ * Aleš Nejdr - mige
+ * @type Object
+ */
+const cs = {
+ btn: {
+ about: 'O aplikaci',
+ back: 'Zpět',
+ cancel: 'Zrušit',
+ clear: 'Vymazat',
+ copy: 'Kopírovat',
+ cut: 'Vyjmout',
+ delete: 'Smazat',
+ edit: 'Upravit',
+ forward: 'Vpřed',
+ folder: 'Nová složka',
+ file: 'Nový soubor',
+ fullScreen: 'Celá obrazovka',
+ grid: 'Mřížka',
+ paste: 'Vložit',
+ refresh: 'Obnovit',
+ submit: 'Odeslat',
+ table: 'Tabulka',
+ upload: 'Nahrát',
+ uploadSelect: 'Vybrat soubory',
+ hidden: ' Skryté soubory',
+ },
+ clipboard: {
+ actionType: 'Typ',
+ copy: 'Kopírovat',
+ cut: 'Vyjmout',
+ none: 'Nic nevybráno',
+ title: 'Schránka',
+ },
+ contextMenu: {
+ copy: 'Kopírovat',
+ cut: 'Vyjmout',
+ delete: 'Smazat',
+ download: 'Stáhnout',
+ info: 'Vybráno:',
+ open: 'Otevřit',
+ paste: 'Vložit',
+ properties: 'Vlastnosti',
+ rename: 'Přejmenovat',
+ select: 'Vybrat',
+ view: 'Zobrazit',
+ zip: 'Zabalit (Zip)',
+ unzip: 'Rozbalit (Zip)',
+ edit: 'Upravit',
+ audioPlay: 'Přehrát',
+ videoPlay: 'Přehrát',
+ },
+ info: {
+ directories: 'Složky:',
+ files: 'Soubory:',
+ selected: 'Vybráno:',
+ selectedSize: 'Velikost souborů:',
+ size: 'Velikost souborů:',
+ },
+ manager: {
+ table: {
+ date: 'Změněno',
+ folder: 'Složka',
+ name: 'Název',
+ size: 'Velikost',
+ type: 'Typ',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Vývojář',
+ name: 'Laravel File Manager',
+ title: 'O aplikaci',
+ version: 'Verze',
+ },
+ delete: {
+ noSelected: 'Nic nevybráno!',
+ title: 'Smazat',
+ },
+ newFile: {
+ fieldName: 'Název souboru',
+ fieldFeedback: 'Soubor již existuje!',
+ title: 'Vytvořit nový soubor',
+ },
+ newFolder: {
+ fieldName: 'Název složky',
+ fieldFeedback: 'Složka již existuje!',
+ title: 'Vytvořit novou složku',
+ },
+ preview: {
+ title: 'Náhled',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'Změněno',
+ name: 'Název',
+ path: 'Cesta',
+ size: 'Velikost',
+ title: 'Vlastnosti',
+ type: 'Typ',
+ url: 'URL',
+ access: 'Přístup',
+ access_0: 'Přístup odepřen',
+ access_1: 'Pouze ke čtení',
+ access_2: 'Čtení a zápis',
+ },
+ rename: {
+ directoryExist: 'Složka již existuje',
+ fieldName: 'Vložte nové jméno',
+ fieldFeedback: 'Neplatné jméno',
+ fileExist: 'Soubor již existuje',
+ title: 'Přejmenovat',
+ },
+ status: {
+ noErrors: 'Žádná chyba!',
+ title: 'Stav',
+ },
+ upload: {
+ ifExist: 'Pokud soubor již existuje:',
+ noSelected: 'Nevybrány žádné soubory!',
+ overwrite: 'Přepsat!',
+ selected: 'Vybráno:',
+ size: 'Velikost:',
+ skip: 'Přeskočit',
+ title: 'Nahrát soubory',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Audio přehrávač',
+ },
+ videoPlayer: {
+ title: 'Video přehrávač',
+ },
+ zip: {
+ title: 'Vytvořit archiv',
+ fieldName: 'Název archivu',
+ fieldFeedback: 'Archiv již existuje!',
+ },
+ unzip: {
+ title: 'Rozbalit archiv',
+ fieldName: 'Název složky',
+ fieldRadioName: 'Rozbalit do:',
+ fieldRadio1: 'Do aktuální složky',
+ fieldRadio2: 'Do nové složky',
+ fieldFeedback: 'Složka již existuje!',
+ warning: 'Pozor! Pokud se jména shodují, budou soubory přepsány!',
+ },
+ cropper: {
+ title: 'Oříznutí',
+ apply: 'Aplikovat',
+ reset: 'Obnovit',
+ save: 'Uložit',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Vyjmuto do schránky!',
+ copyToClipboard: 'Zkopírováno do schránky!',
+ },
+ response: {
+ noConfig: 'Konfigurace nebyla nalezena!',
+ notFound: 'Nenalezeno!',
+ diskNotFound: 'Disk nebyla nalezen!',
+ pathNotFound: 'Cesta nebyla nalezena!',
+ diskSelected: 'Disk byl vybrán!',
+ // files
+ fileExist: 'Soubor již existuje!',
+ fileCreated: 'Soubor byl vytvořen!',
+ fileUpdated: 'Soubor byl aktualizován!',
+ fileNotFound: 'Soubor nebyl nalezen!',
+ // directories
+ dirExist: 'Složka již existuje!',
+ dirCreated: 'Složka byla vytvořena!',
+ dirNotFound: 'Složka nebyla nalezena',
+ // actions
+ uploaded: 'Všechny soubory byly nahrány!',
+ notAllUploaded: 'Některé soubory nebyly nahrány!',
+ delNotFound: 'Některé položky nebyly nalezeny!',
+ deleted: 'Smazáno!',
+ renamed: 'Přejmenováno!',
+ copied: 'Úspěšně zkopírováno!',
+ // zip
+ zipError: 'Chyba při vytváření archivu!',
+ // acl
+ aclError: 'Přístup odepřen!',
+ },
+};
+
+export default cs;
diff --git a/src/lang/de.js b/src/lang/de.js
new file mode 100644
index 0000000..86b149f
--- /dev/null
+++ b/src/lang/de.js
@@ -0,0 +1,190 @@
+/**
+ * German translate
+ * @type Object
+ */
+const de = {
+ btn: {
+ about: 'Über',
+ back: 'Zurück',
+ cancel: 'Abbrechen',
+ clear: 'Leeren',
+ copy: 'Kopieren',
+ cut: 'Ausschneiden',
+ delete: 'Löschen',
+ edit: 'Bearbeiten',
+ forward: 'Weiter',
+ folder: 'Neuer Order',
+ file: 'Neue Datei',
+ fullScreen: 'Vollbildschirm',
+ grid: 'Raster',
+ paste: 'Einfügen',
+ refresh: 'Neu laden',
+ submit: 'Bestätigen',
+ table: 'Detailansicht',
+ upload: 'Hochladen',
+ uploadSelect: 'Auswählen',
+ hidden: ' Versteckte Dateien',
+ },
+ clipboard: {
+ actionType: 'Type',
+ copy: 'Kopieren',
+ cut: 'Ausschneiden',
+ none: 'Nichts ausgewählt',
+ title: 'Zwischenablage',
+ },
+ contextMenu: {
+ copy: 'Kopieren',
+ cut: 'Ausschneiden',
+ delete: 'Löschen',
+ download: 'Herunterladen',
+ info: 'Ausgewählt:',
+ open: 'Öffnen',
+ paste: 'Einfügen',
+ properties: 'Einstellungen',
+ rename: 'Umbenennen',
+ select: 'Wählen',
+ view: 'Vorschau',
+ zip: 'Zip',
+ unzip: 'Unzip',
+ edit: 'Bearbeiten',
+ audioPlay: 'Abspielen',
+ videoPlay: 'Abspielen',
+ },
+ info: {
+ directories: 'Ordner:',
+ files: 'Dateien:',
+ selected: 'Ausgewählt:',
+ selectedSize: 'Dateigröße:',
+ size: 'Dateigröße:',
+ },
+ manager: {
+ table: {
+ date: 'Datum',
+ folder: 'Ordner',
+ name: 'Name',
+ size: 'Größe',
+ type: 'Type',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Entwickler',
+ name: 'Laravel File Manager',
+ title: 'Über',
+ version: 'Version',
+ },
+ delete: {
+ noSelected: 'Nichts ausgewählt!',
+ title: 'Löschen',
+ },
+ newFile: {
+ fieldName: 'Dateiname',
+ fieldFeedback: 'Datei existiert!',
+ title: 'Neue Datei erstellen',
+ },
+ newFolder: {
+ fieldName: 'Ordnername',
+ fieldFeedback: 'Ordner existiert!',
+ title: 'Neuen Ordner erstellen',
+ },
+ preview: {
+ title: 'Vorschau',
+ },
+ properties: {
+ disk: 'Festplatte',
+ modified: 'Geändert',
+ name: 'Name',
+ path: 'Pfad',
+ size: 'Größe',
+ title: 'Eigenschaften',
+ type: 'Type',
+ url: 'URL',
+ access: 'Zugang',
+ access_0: 'Zugriff verweigert',
+ access_1: 'Nur Lesezugriff',
+ access_2: 'Lesen- und Schreibenzugriff',
+ },
+ rename: {
+ directoryExist: 'Verzeichnis ist vorhanden',
+ fieldName: 'Neuen Namen eingeben',
+ fieldFeedback: 'Ungültiger Name',
+ fileExist: 'Datei ist vorhanden',
+ title: 'Umbenennen',
+ },
+ status: {
+ noErrors: 'Keine Fehler!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Datei existiert:',
+ noSelected: 'Keine Dateien selektiert!',
+ overwrite: 'Überschreiben!',
+ selected: 'Ausgewählt:',
+ size: 'Größe:',
+ skip: 'Überspringen',
+ title: 'Hochladen von Dateien',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Audio-Player',
+ },
+ videoPlayer: {
+ title: 'Video-Player',
+ },
+ zip: {
+ title: 'Archiv erzeugen',
+ fieldName: 'Archiv Name',
+ fieldFeedback: 'Archiv existiert!',
+ },
+ unzip: {
+ title: 'Archiv entpacken',
+ fieldName: 'Ordnername',
+ fieldRadioName: 'Extrahieren in:',
+ fieldRadio1: 'Zum aktuellen Verzeichnis',
+ fieldRadio2: 'In einem neuen Ordner',
+ fieldFeedback: 'Ordner ist vorhanden!',
+ warning: 'Achtung! Wenn die Namen übereinstimmen, werden die Dateien überschrieben!',
+ },
+ cropper: {
+ title: 'Beschneiden',
+ apply: 'Übernehmen',
+ reset: 'Zurücksetzen',
+ save: 'Speichern',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Ausgeschnitten in die Zwischenablage!',
+ copyToClipboard: 'Kopiert in die Zwischenablage!',
+ },
+ response: {
+ noConfig: 'Konfiguration nicht gefunden!',
+ notFound: 'Nicht gefunden!',
+ diskNotFound: 'Festplatte nicht gefunden!',
+ pathNotFound: 'Pfad nicht gefunden!',
+ diskSelected: 'Festplatte ausgewählt!',
+ // files
+ fileExist: 'Datei existiert bereits!',
+ fileCreated: 'Datei erstellt!',
+ fileUpdated: 'Datei wurde aktualisiert!',
+ fileNotFound: 'Datei nicht gefunden!',
+ // directories
+ dirExist: 'Ordner existiert bereits!',
+ dirCreated: 'Ordner angelegt!',
+ dirNotFound: 'Ordner nicht gefunden',
+ // actions
+ uploaded: 'Alle Dateien wurden hochgeladen!',
+ notAllUploaded: 'Einige Dateien wurden nicht hochgeladen!',
+ delNotFound: 'Einige Dateien wurden nicht gefunden!',
+ deleted: 'Gelöscht!',
+ renamed: 'Umbenannt!',
+ copied: 'Erfolgreich kopiert!',
+ // zip
+ zipError: 'Fehler bei der Erstellung des Archivs!',
+ // acl
+ aclError: 'Zugriff verweigert!',
+ },
+};
+
+export default de;
diff --git a/src/lang/en.js b/src/lang/en.js
index c066a96..b117c3b 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -3,115 +3,188 @@
* @type Object
*/
const en = {
- btn: {
- about: 'About',
- back: 'Back',
- cancel: 'Cancel',
- clear: 'Clear',
- copy: 'Copy',
- cut: 'Cut',
- delete: 'Delete',
- edit: 'Edit',
- forward: 'Forward',
- folder: 'New folder',
- fullScreen: 'Full screen',
- grid: 'Grid',
- paste: 'Paste',
- refresh: 'Refresh',
- submit: 'Submit',
- table: 'Table',
- upload: 'Upload',
- uploadSelect: 'Select files',
- },
- clipboard: {
- actionType: 'Type',
- copy: 'Copy',
- cut: 'Cut',
- none: 'Nothing selected',
- title: 'Clipboard',
- },
- contextMenu: {
- copy: 'Copy',
- cut: 'Cut',
- delete: 'Delete',
- download: 'Download',
- info: 'Selected:',
- open: 'Open',
- paste: 'Paste',
- properties: 'Properties',
- rename: 'Rename',
- select: 'Select',
- view: 'View',
- zip: 'Compress',
- },
- info: {
- directories: 'Folders:',
- files: 'Files:',
- selected: 'Selected:',
- selectedSize: 'Files size:',
- size: 'Files size:',
- },
- manager: {
- table: {
- date: 'Date',
- folder: 'Folder',
- name: 'Name',
- size: 'Size',
- type: 'Type',
+ btn: {
+ about: 'About',
+ back: 'Back',
+ cancel: 'Cancel',
+ clear: 'Clear',
+ copy: 'Copy',
+ cut: 'Cut',
+ delete: 'Delete',
+ edit: 'Edit',
+ forward: 'Forward',
+ folder: 'New folder',
+ file: 'New file',
+ fullScreen: 'Full screen',
+ grid: 'Grid',
+ paste: 'Paste',
+ refresh: 'Refresh',
+ submit: 'Submit',
+ table: 'Table',
+ upload: 'Upload',
+ uploadSelect: 'Select files',
+ hidden: ' Hidden files',
},
- },
- modal: {
- about: {
- developer: 'Developer',
- name: 'Laravel File Manager',
- site: 'Site',
- title: 'About',
- version: 'Version',
+ clipboard: {
+ actionType: 'Type',
+ copy: 'Copy',
+ cut: 'Cut',
+ none: 'Nothing selected',
+ title: 'Clipboard',
},
- delete: {
- confirmText: 'Confirm delete!',
- confirmLabel: 'Delete!',
- noSelected: 'Nothing selected!',
- title: 'Delete',
+ contextMenu: {
+ copy: 'Copy',
+ cut: 'Cut',
+ delete: 'Delete',
+ download: 'Download',
+ info: 'Selected:',
+ open: 'Open',
+ paste: 'Paste',
+ properties: 'Properties',
+ rename: 'Rename',
+ select: 'Select',
+ view: 'View',
+ zip: 'Zip',
+ unzip: 'Unzip',
+ edit: 'Edit',
+ audioPlay: 'Play',
+ videoPlay: 'Play',
},
- newFolder: {
- fieldName: 'Folder name',
- fieldFeedback: 'Folder exists!',
- title: 'Create new folder',
+ info: {
+ directories: 'Folders:',
+ files: 'Files:',
+ selected: 'Selected:',
+ selectedSize: 'Files size:',
+ size: 'Files size:',
},
- preview: {
- title: 'Preview',
+ manager: {
+ table: {
+ date: 'Date',
+ folder: 'Folder',
+ name: 'Name',
+ size: 'Size',
+ type: 'Type',
+ },
},
- properties: {
- disk: 'Disk',
- modified: 'Modified',
- name: 'Name',
- path: 'Path',
- size: 'Size',
- title: 'Properties',
- type: 'Type',
+ modal: {
+ about: {
+ developer: 'Developer',
+ name: 'Laravel File Manager',
+ title: 'About',
+ version: 'Version',
+ },
+ delete: {
+ noSelected: 'Nothing selected!',
+ title: 'Delete',
+ },
+ newFile: {
+ fieldName: 'File name',
+ fieldFeedback: 'File exists!',
+ title: 'Create new file',
+ },
+ newFolder: {
+ fieldName: 'Folder name',
+ fieldFeedback: 'Folder exists!',
+ title: 'Create new folder',
+ },
+ preview: {
+ title: 'Preview',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'Modified',
+ name: 'Name',
+ path: 'Path',
+ size: 'Size',
+ title: 'Properties',
+ type: 'Type',
+ url: 'URL',
+ access: 'Access',
+ access_0: 'Access denied',
+ access_1: 'Only Read',
+ access_2: 'Read and Write',
+ },
+ rename: {
+ directoryExist: 'Directory exists',
+ fieldName: 'Enter new name',
+ fieldFeedback: 'Invalid name',
+ fileExist: 'File exists',
+ title: 'Rename',
+ },
+ status: {
+ noErrors: 'No errors!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'If file exist:',
+ noSelected: 'No files selected!',
+ overwrite: 'Overwrite!',
+ selected: 'Selected:',
+ size: 'Size:',
+ skip: 'Skip',
+ title: 'Upload files',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Audio player',
+ },
+ videoPlayer: {
+ title: 'Video player',
+ },
+ zip: {
+ title: 'Create archive',
+ fieldName: 'Archive name',
+ fieldFeedback: 'Archive exists!',
+ },
+ unzip: {
+ title: 'Unpack archive',
+ fieldName: 'Folder name',
+ fieldRadioName: 'Extract to:',
+ fieldRadio1: 'To current folder',
+ fieldRadio2: 'In a new folder',
+ fieldFeedback: 'Folder exists!',
+ warning: 'Attention! If the names match, the files will be overwritten!',
+ },
+ cropper: {
+ title: 'Cropping',
+ apply: 'Apply',
+ reset: 'Reset',
+ save: 'Save',
+ },
},
- rename: {
- directoryExist: 'Directory exists',
- fieldName: 'Enter new name',
- fieldFeedback: 'Invalid name',
- fileExist: 'File exists',
- title: 'Rename',
+ notifications: {
+ cutToClipboard: 'Cut to clipboard!',
+ copyToClipboard: 'Copied to clipboard!',
},
- status: {
- noErrors: 'No errors!',
- title: 'Status',
+ response: {
+ noConfig: 'Config not found!',
+ notFound: 'Not found!',
+ diskNotFound: 'Disk not found!',
+ pathNotFound: 'Path not found!',
+ diskSelected: 'Disk selected!',
+ // files
+ fileExist: 'File already exists!',
+ fileCreated: 'File created!',
+ fileUpdated: 'File updated!',
+ fileNotFound: 'File not found!',
+ // directories
+ dirExist: 'Directory already exists!',
+ dirCreated: 'Directory created!',
+ dirNotFound: 'Directory not found',
+ // actions
+ uploaded: 'All files uploaded!',
+ notAllUploaded: "Some files weren't uploaded!",
+ delNotFound: "Some items weren't founded!",
+ deleted: 'Deleted!',
+ renamed: 'Renamed!',
+ copied: 'Copied successfully!',
+ // zip
+ zipError: 'Error creating archive!',
+ // acl
+ aclError: 'Access denied!',
},
- upload: {
- ifExist: 'If file exist:',
- noSelected: 'No files selected!',
- overwrite: 'Overwrite!',
- selected: 'Selected:',
- size: 'Size:',
- skip: 'Skip',
- title: 'Upload files',
- },
- },
};
export default en;
diff --git a/src/lang/es.js b/src/lang/es.js
new file mode 100644
index 0000000..7899ac6
--- /dev/null
+++ b/src/lang/es.js
@@ -0,0 +1,192 @@
+/**
+ * Spanish translate
+ * Marc Garcia Torrent - https://github.com/mgarcia96
+ * @type Object
+ */
+const es = {
+ btn: {
+ about: 'Acerca de',
+ back: 'Atras',
+ cancel: 'Cancelar',
+ clear: 'Limpiar',
+ copy: 'Copiar',
+ cut: 'Cortar',
+ delete: 'Eliminar',
+ edit: 'Editar',
+ forward: 'Siguiente',
+ folder: 'Nueva carpeta',
+ file: 'Crear archivo',
+ fullScreen: 'Pantalla completa',
+ grid: 'Cuadrícula',
+ paste: 'Pegar',
+ refresh: 'Actualizar',
+ submit: 'Guardar',
+ table: 'Tabla',
+ upload: 'Subir',
+ uploadSelect: 'Seleccionar archivos',
+ hidden: ' Archivos ocultos',
+ },
+ clipboard: {
+ actionType: 'Tipo',
+ copy: 'Copiar',
+ cut: 'Cortar',
+ none: 'Nada seleccionado',
+ title: 'Portapapeles',
+ },
+ contextMenu: {
+ copy: 'Copiar',
+ cut: 'Cortar',
+ delete: 'Eliminar',
+ download: 'Descargar',
+ info: 'Seleccionar:',
+ open: 'Abrir',
+ paste: 'Pegar',
+ properties: 'Propiedades',
+ rename: 'Renombrar',
+ select: 'Seleccionar',
+ view: 'Vista',
+ zip: 'Zip',
+ unzip: 'Unzip',
+ edit: 'Editar',
+ audioPlay: 'Play',
+ videoPlay: 'Play',
+ },
+ info: {
+ directories: 'Carpetas:',
+ files: 'Archivos:',
+ selected: 'Seleccionar:',
+ selectedSize: 'Tamaño archivos:',
+ size: 'Tamaño archivos:',
+ },
+ manager: {
+ table: {
+ date: 'Fecha',
+ folder: 'Carpeta',
+ name: 'Nombre',
+ size: 'Tamaño',
+ type: 'Tipo',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Developer',
+ name: 'Laravel File Manager',
+ title: 'About',
+ version: 'Version',
+ },
+ delete: {
+ noSelected: 'Nada seleccionado',
+ title: 'Eliminar',
+ },
+ newFile: {
+ fieldName: 'Nombre del archivo',
+ fieldFeedback: 'El archivo ya existe',
+ title: 'Crear nuevo archivo',
+ },
+ newFolder: {
+ fieldName: 'Nombre de la carpeta',
+ fieldFeedback: 'La carpeta ya existe',
+ title: 'Crear nueva carpeta',
+ },
+ preview: {
+ title: 'Preview',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'Modificado',
+ name: 'Nombre',
+ path: 'Path',
+ size: 'Tamaño',
+ title: 'Propiedades',
+ type: 'Tipo',
+ url: 'URL',
+ access: 'Acceso',
+ access_0: 'Access denied',
+ access_1: 'Only Read',
+ access_2: 'Read and Write',
+ },
+ rename: {
+ directoryExist: 'Ya existe el directorio',
+ fieldName: 'Nuevo nombre',
+ fieldFeedback: 'Nombre invalido',
+ fileExist: 'Ya existe el archivo',
+ title: 'Renombrar',
+ },
+ status: {
+ noErrors: 'No errors!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Si el archivo ya existe:',
+ noSelected: 'No has seleccionado nada!',
+ overwrite: 'Sobreescribir',
+ selected: 'Seleccionar:',
+ size: 'Size:',
+ skip: 'Omitir',
+ title: 'Subir archivos',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Audio player',
+ },
+ videoPlayer: {
+ title: 'Video player',
+ },
+ zip: {
+ title: 'Crear archivo',
+ fieldName: 'Nombre del archivo',
+ fieldFeedback: 'Ya existe!',
+ },
+ unzip: {
+ title: 'Descomprimir',
+ fieldName: 'Nombre del directorio',
+ fieldRadioName: 'Extraer en:',
+ fieldRadio1: 'Carpeta actual',
+ fieldRadio2: 'Nueva carpeta',
+ fieldFeedback: 'Carpeta existente!',
+ warning: 'Attention! If the names match, the files will be overwritten!',
+ },
+ cropper: {
+ title: 'Cropping',
+ apply: 'Aceptar',
+ reset: 'Reset',
+ save: 'Guardar',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Copiado!',
+ copyToClipboard: 'Copiado!',
+ },
+ // todo - need to translate
+ response: {
+ noConfig: 'Configuración no encontrada!',
+ notFound: 'Extraviado!',
+ diskNotFound: 'Disco no encontrado!',
+ pathNotFound: 'Camino no encontrado!',
+ diskSelected: 'Disco seleccionado!',
+ // files
+ fileExist: 'El archivo ya existe!',
+ fileCreated: 'Archivo creado!',
+ fileUpdated: 'Archivo actualizado!',
+ fileNotFound: 'Archivo no encontrado!',
+ // directories
+ dirExist: 'El directorio ya existe!',
+ dirCreated: 'Directorio creado!',
+ dirNotFound: 'Directorio no encontrado',
+ // actions
+ uploaded: 'Todos los archivos cargados!',
+ notAllUploaded: 'Algunos archivos no fueron subidos!',
+ delNotFound: 'Algunos artículos no fueron encontrados!',
+ deleted: 'Eliminado!',
+ renamed: 'Renombrado!',
+ copied: 'Copiado exitosamente!',
+ // zip
+ zipError: 'Error al crear archivo!',
+ // acl
+ aclError: 'Acceso denegado!',
+ },
+};
+
+export default es;
diff --git a/src/lang/fa.js b/src/lang/fa.js
new file mode 100644
index 0000000..f4a482c
--- /dev/null
+++ b/src/lang/fa.js
@@ -0,0 +1,191 @@
+/**
+ * Farsi translate
+ * vahidalvandi
+ * @type Object
+ */
+const fa = {
+ btn: {
+ about: 'درباره',
+ back: 'عقب',
+ cancel: 'لغو',
+ clear: 'پاک کردن',
+ copy: 'رونوشت',
+ cut: 'برش',
+ delete: 'حذف',
+ edit: 'ویرایش',
+ forward: 'ارسال به دیگری',
+ folder: 'پوشه جدید',
+ file: 'فایل جدید',
+ fullScreen: 'تمام صفحه',
+ grid: 'شبکه',
+ paste: 'جانمایی/چسباندن/جاگذاری',
+ refresh: 'تازه کردن صفحه',
+ submit: 'تایید و ارسال',
+ table: 'جدول',
+ upload: 'بارگذاری',
+ uploadSelect: 'انتخاب فایل',
+ hidden: ' فایل های مخفی',
+ },
+ clipboard: {
+ actionType: 'نوع',
+ copy: 'رونوشت',
+ cut: 'برش',
+ none: 'چیزی انتخاب نشده است',
+ title: 'کلیپ بورد',
+ },
+ contextMenu: {
+ copy: 'رونوشت',
+ cut: 'برش',
+ delete: 'حذف',
+ download: 'دانلود',
+ info: 'انتخاب شده:',
+ open: 'باز کردن',
+ paste: 'جاگذاری',
+ properties: 'ویژگی ها',
+ rename: 'تغییر نام',
+ select: 'انتخاب',
+ view: 'مشاهده',
+ zip: 'فشرده کردن',
+ unzip: 'از حالت فشرده خارج کردن',
+ edit: 'ویرایش',
+ audioPlay: 'پخش',
+ videoPlay: 'نمایش',
+ },
+ info: {
+ directories: 'پوشه ها:',
+ files: 'فایل ها:',
+ selected: 'انتخاب شده ها:',
+ selectedSize: 'اندازه فایل ها:',
+ size: 'اندازه فایل ها:',
+ },
+ manager: {
+ table: {
+ date: 'تاریخ',
+ folder: 'پوشه',
+ name: 'نام',
+ size: 'اندازه',
+ type: 'نوع',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'توسعه دهنده',
+ name: 'مدیریت فایل',
+ title: 'درباره',
+ version: 'نسخه',
+ },
+ delete: {
+ noSelected: 'چیزی انتخاب نشده است',
+ title: 'حذف',
+ },
+ newFile: {
+ fieldName: 'نام فایل',
+ fieldFeedback: 'فایل وجود دارد!',
+ title: 'فایل جدید ایجاد کنید',
+ },
+ newFolder: {
+ fieldName: 'نام پوشه',
+ fieldFeedback: 'پوشه وجود دارد!',
+ title: 'پوشه جدید ایجاد کنید',
+ },
+ preview: {
+ title: 'پیش نمایش',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'اصلاح شده',
+ name: 'نام',
+ path: 'مسیر',
+ size: 'اندازه',
+ title: 'ویژگی ها',
+ type: 'نوع',
+ url: 'آدرس اینترنتی',
+ access: 'دسترسی',
+ access_0: 'دسترسی امکان پذیر نیست',
+ access_1: 'فقط خواندن',
+ access_2: 'خواندن و نوشتن',
+ },
+ rename: {
+ directoryExist: 'فهرست وجود دارد',
+ fieldName: 'نام جدید را وارد نمایید',
+ fieldFeedback: 'نام نامعتبر است',
+ fileExist: 'فایل وجود دارد',
+ title: 'تغییر نام',
+ },
+ status: {
+ noErrors: 'خطایی وجود ندارد!',
+ title: 'وضعیت',
+ },
+ upload: {
+ ifExist: 'اگر فایل وجود دارد:',
+ noSelected: 'هیچ فایلی انتخاب نشده است!',
+ overwrite: 'بازنویسی!',
+ selected: 'انتخاب شده ها/انتخاب شده است:',
+ size: 'اندازه:',
+ skip: 'رد شدن',
+ title: 'بارگزاری فایل ها',
+ },
+ editor: {
+ title: 'ویرایشگر',
+ },
+ audioPlayer: {
+ title: 'پخش کننده فایل صوتی',
+ },
+ videoPlayer: {
+ title: 'نمایش دهنده ویدیو',
+ },
+ zip: {
+ title: 'ایجاد بایگانی',
+ fieldName: 'نام بایگانی',
+ fieldFeedback: 'بایگانی وجود دارد',
+ },
+ unzip: {
+ title: 'باز کردن بایگانی',
+ fieldName: 'نام پوشه',
+ fieldRadioName: 'استخراج شود به:',
+ fieldRadio1: 'به پوشه فعلی',
+ fieldRadio2: 'در یک پوشه جدید',
+ fieldFeedback: 'پوشه وجود دارد!',
+ warning: 'توجه! اگر نام ها تکراری باشند، فایل های قدیمی با فایل های جدید جایگزین خواهند شد',
+ },
+ cropper: {
+ title: 'کوچک کردن',
+ apply: 'اجرا',
+ reset: 'تنظیم مجدد',
+ save: 'ذخیره',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'برش یه کلیپ بورد!',
+ copyToClipboard: 'رونوشت به کلیپ بورد!',
+ },
+ response: {
+ noConfig: 'پیکربندی یافت نشد',
+ notFound: 'یافت نشد',
+ diskNotFound: 'دیسک یافت نشد !',
+ pathNotFound: 'مسیر یافت نشد!',
+ diskSelected: 'دیسک انتخاب شد !',
+ // files
+ fileExist: ' در حال حاضر فایل مورد نظر وجود دارد!',
+ fileCreated: 'فایل ایجاد شد!',
+ fileUpdated: 'فایل بروزرسانی شد!',
+ fileNotFound: 'فایل یافت نشد!',
+ // directories
+ dirExist: 'در حال حاضر پیکربندی مورد نظر وجود دارد!',
+ dirCreated: 'پیکربندی ایجاد شد!',
+ dirNotFound: 'پیکربندی یافت نشد',
+ // actions
+ uploaded: 'همه فایل ها بارگذاری شده اند!',
+ notAllUploaded: 'برخی از فایل ها بارگذاری نشده اند!',
+ delNotFound: 'برخی از بخش ها یافت نشد!',
+ deleted: 'حذف شد!',
+ renamed: 'تغییر نام یافت!',
+ copied: 'رونوشت با موفقیت انجام شد!',
+ // zip
+ zipError: 'خطای ایجاد بایگانی! zip',
+ // acl
+ aclError: 'دسترسی امکان پذیر نیست!',
+ },
+};
+
+export default fa;
diff --git a/src/lang/fr.js b/src/lang/fr.js
new file mode 100644
index 0000000..d79fb4e
--- /dev/null
+++ b/src/lang/fr.js
@@ -0,0 +1,190 @@
+/**
+ * French translate
+ * @type Object
+ */
+const fr = {
+ btn: {
+ about: 'À propos',
+ back: 'Retour',
+ cancel: 'Annuler',
+ clear: 'Effacer',
+ copy: 'Copier',
+ cut: 'Couper',
+ delete: 'Supprimer',
+ edit: 'Modifier',
+ forward: 'Suivant',
+ folder: 'Nouveau dossier',
+ file: 'Nouveau fichier',
+ fullScreen: 'Plein écran',
+ grid: 'Grille',
+ paste: 'Coller',
+ refresh: 'Rafraîchir',
+ submit: 'Envoyer',
+ table: 'Tableau',
+ upload: 'Télécharger',
+ uploadSelect: 'Sélectionner fichiers',
+ hidden: ' Masquer fichiers',
+ },
+ clipboard: {
+ actionType: 'Type',
+ copy: 'Copier',
+ cut: 'Coller',
+ none: 'Aucune sélection',
+ title: 'Clipboard',
+ },
+ contextMenu: {
+ copy: 'Copier',
+ cut: 'Coller',
+ delete: 'Supprimer',
+ download: 'Télécharger',
+ info: 'Sélectionné:',
+ open: 'Ouvrir',
+ paste: 'Coller',
+ properties: 'Propriétés',
+ rename: 'Renommer',
+ select: 'Sélectionner',
+ view: 'Voir',
+ zip: 'Zipper',
+ unzip: 'Dézipper',
+ edit: 'Modifier',
+ audioPlay: 'Lire',
+ videoPlay: 'Lire',
+ },
+ info: {
+ directories: 'Dossiers:',
+ files: 'Fichiers:',
+ selected: 'Sélectionné:',
+ selectedSize: 'Taille fichiers:',
+ size: 'Taille fichiers:',
+ },
+ manager: {
+ table: {
+ date: 'Date',
+ folder: 'Dossier',
+ name: 'Nom',
+ size: 'Taille',
+ type: 'Type',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Développeur',
+ name: 'Laravel File Manager',
+ title: 'À propos',
+ version: 'Version',
+ },
+ delete: {
+ noSelected: 'Aucune sélection!',
+ title: 'Supprimer',
+ },
+ newFile: {
+ fieldName: 'Nom du fichier',
+ fieldFeedback: 'Ce fichier existe!',
+ title: 'Créer un fichier',
+ },
+ newFolder: {
+ fieldName: 'Nom du dossier',
+ fieldFeedback: 'Ce dossier existe!',
+ title: 'Créer un dossier',
+ },
+ preview: {
+ title: 'Prévisualisation',
+ },
+ properties: {
+ disk: 'Disque',
+ modified: 'Modifié',
+ name: 'Nom',
+ path: 'Chemin',
+ size: 'Taille',
+ title: 'Propriétés',
+ type: 'Type',
+ url: 'URL',
+ access: 'Accès',
+ access_0: 'Accès refusé',
+ access_1: 'Lecture seul',
+ access_2: 'Lecture/écriture',
+ },
+ rename: {
+ directoryExist: 'Dossier existant',
+ fieldName: 'Entrer un nom',
+ fieldFeedback: 'Nom invalide',
+ fileExist: 'Fichier existant',
+ title: 'Renommer',
+ },
+ status: {
+ noErrors: 'Aucune erreurs!',
+ title: 'Statut',
+ },
+ upload: {
+ ifExist: 'Si le fichier existe:',
+ noSelected: 'Aucun fichier sélectionné!',
+ overwrite: 'Écraser!',
+ selected: 'Sélectionné:',
+ size: 'Taille:',
+ skip: 'Passer',
+ title: 'Télécharger fichiers',
+ },
+ editor: {
+ title: 'Editeur',
+ },
+ audioPlayer: {
+ title: 'Lecteur audio',
+ },
+ videoPlayer: {
+ title: 'Lecteur video',
+ },
+ zip: {
+ title: 'Créer une archive',
+ fieldName: 'Nom archive',
+ fieldFeedback: 'Archive existante!',
+ },
+ unzip: {
+ title: "Extraite l'archive",
+ fieldName: 'Nom du dossier',
+ fieldRadioName: 'Extraire vers:',
+ fieldRadio1: 'Dossier actuel',
+ fieldRadio2: 'Dans un nouveau dossier',
+ fieldFeedback: 'Dossier existant!',
+ warning: 'Attention! Si le nom correspond, les fichiers seront écrasés!',
+ },
+ cropper: {
+ title: 'Recadrer',
+ apply: 'Appliquer',
+ reset: 'Réinitialisé',
+ save: 'Sauvegarder',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Coller dans le presse-papier!',
+ copyToClipboard: 'Copied dans le presse-papier!',
+ },
+ response: {
+ noConfig: 'Configuration introuvable!',
+ notFound: 'Introuvable!',
+ diskNotFound: 'Disque introuvable!',
+ pathNotFound: 'Chemin introuvable!',
+ diskSelected: 'Disque sélectionné!',
+ // files
+ fileExist: 'Fichier existant!',
+ fileCreated: 'Fichier créé!',
+ fileUpdated: 'Fichier téléchargé!',
+ fileNotFound: 'Fichier introuvable!',
+ // directories
+ dirExist: 'Dossier existant!',
+ dirCreated: 'Dossier créé!',
+ dirNotFound: 'Dossier introuvable',
+ // actions
+ uploaded: 'Tous les fichiers ont été téléchargés!',
+ notAllUploaded: "Certains fichiers n'ont pas été téléchargés!",
+ delNotFound: "Certains éléments n'ont pas été trouvés!",
+ deleted: 'Supprimé!',
+ renamed: 'Renommé!',
+ copied: 'Copié!',
+ // zip
+ zipError: "Erreur dans la création de l'archive!",
+ // acl
+ aclError: 'Accès refusé!',
+ },
+};
+
+export default fr;
diff --git a/src/lang/hu.js b/src/lang/hu.js
new file mode 100644
index 0000000..2a49f99
--- /dev/null
+++ b/src/lang/hu.js
@@ -0,0 +1,191 @@
+/**
+ * Hungarian translation
+ * https://github.com/gazben
+ * @type Object
+ */
+const hu = {
+ btn: {
+ about: 'Rólunk',
+ back: 'Vissza',
+ cancel: 'Mégse',
+ clear: 'Törlés',
+ copy: 'Másolás',
+ cut: 'Kivágás',
+ delete: 'Törlés',
+ edit: 'Szerkesztés',
+ forward: 'Továbbítás',
+ folder: 'Új mappa',
+ file: 'Új fájl',
+ fullScreen: 'Teljes képernyő',
+ grid: 'Rács nézet',
+ paste: 'Beillesztés',
+ refresh: 'Frissítés',
+ submit: 'Mentés',
+ table: 'Táblázat nézet',
+ upload: 'Feltöltés',
+ uploadSelect: 'Fájlok kiválasztása',
+ hidden: ' Rejtett fájlok',
+ },
+ clipboard: {
+ actionType: 'Típus',
+ copy: 'Másolás',
+ cut: 'Kivágás',
+ none: 'Nincs kiválasztás',
+ title: 'Vágólap',
+ },
+ contextMenu: {
+ copy: 'Másolás',
+ cut: 'Kivágás',
+ delete: 'Törlés',
+ download: 'Letöltés',
+ info: 'Kiválasztva:',
+ open: 'Megnyitás',
+ paste: 'Beillesztés',
+ properties: 'Tulajdonságok',
+ rename: 'Átnevezés',
+ select: 'Kiválaszt',
+ view: 'Megnyitás',
+ zip: 'Becsomagolás',
+ unzip: 'Kicsomagolás',
+ edit: 'Szerkesztés',
+ audioPlay: 'Lejátszás',
+ videoPlay: 'Lejátszás',
+ },
+ info: {
+ directories: 'Mappák:',
+ files: 'Fájlok:',
+ selected: 'Kiválasztva:',
+ selectedSize: 'Fájlméret:',
+ size: 'Fájlok mérete:',
+ },
+ manager: {
+ table: {
+ date: 'Dátum',
+ folder: 'Mappa',
+ name: 'Név',
+ size: 'Méret',
+ type: 'Típus',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Developer',
+ name: 'Laravel File Manager',
+ title: 'About',
+ version: 'Version',
+ },
+ delete: {
+ noSelected: 'Nincs kiválsztva semmi!',
+ title: 'Törlés',
+ },
+ newFile: {
+ fieldName: 'Fájlnév',
+ fieldFeedback: 'A fájl létezik!',
+ title: 'Új fájl létrehozása',
+ },
+ newFolder: {
+ fieldName: 'Mappa neve',
+ fieldFeedback: 'A mappa létezik!',
+ title: 'Új mappa létrehozása',
+ },
+ preview: {
+ title: 'Előlnézet',
+ },
+ properties: {
+ disk: 'Lemez',
+ modified: 'Módsítva',
+ name: 'Név',
+ path: 'Útvonal',
+ size: 'Méret',
+ title: 'Tulajdonságok',
+ type: 'Típus',
+ url: 'URL',
+ access: 'Hozzáférés',
+ access_0: 'Hozzáférés megtagadva',
+ access_1: 'Csak olvasás',
+ access_2: 'Olvasás és írás',
+ },
+ rename: {
+ directoryExist: 'A mappa létezik',
+ fieldName: 'Új név',
+ fieldFeedback: 'Érvénytelen név',
+ fileExist: 'Fájl létezik',
+ title: 'Átnevezés',
+ },
+ status: {
+ noErrors: 'Nincs hiba',
+ title: 'Státusz',
+ },
+ upload: {
+ ifExist: 'A fájl létezik:',
+ noSelected: 'Nincs fájl kiválasztva!',
+ overwrite: 'Felülírás!',
+ selected: 'Kiválasztva:',
+ size: 'Méret:',
+ skip: 'Kihagyás',
+ title: 'Fájlok feltöltése',
+ },
+ editor: {
+ title: 'Szerkesztő',
+ },
+ audioPlayer: {
+ title: 'Hagfájl lejátszó',
+ },
+ videoPlayer: {
+ title: 'Videófájl lejátszó',
+ },
+ zip: {
+ title: 'Becsomagolás',
+ fieldName: 'Archívum neve',
+ fieldFeedback: 'Archívum már létezik!',
+ },
+ unzip: {
+ title: 'Kicsomagolás',
+ fieldName: 'Mappa neve',
+ fieldRadioName: 'Kicsomagolás:',
+ fieldRadio1: 'Jelenlegi mappába',
+ fieldRadio2: 'Új mappába',
+ fieldFeedback: 'Mappa létezik!',
+ warning: 'Vigyázz! Amennyiben a nevek egyeznek akkor a fájlok felülírásra kerülnek!',
+ },
+ cropper: {
+ title: 'Kivágás',
+ apply: 'Apply',
+ reset: 'Visszaállítás',
+ save: 'Mentés',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Kivágás a vágólapra!',
+ copyToClipboard: 'Másolás a vágólapra!',
+ },
+ response: {
+ noConfig: 'Konfiguráció nem található!',
+ notFound: 'Nem találáható!',
+ diskNotFound: 'Lemez nem található!',
+ pathNotFound: 'Útvonal nem található!',
+ diskSelected: 'Lemez kiválasztva!',
+ // files
+ fileExist: 'Fájl már létezik!',
+ fileCreated: 'Fájl létrehozva!',
+ fileUpdated: 'Fájl frissítve!',
+ fileNotFound: 'Fájl nem található!',
+ // directories
+ dirExist: 'Mappa már létezik!',
+ dirCreated: 'Mappa létrehozva!',
+ dirNotFound: 'Mappa nem található',
+ // actions
+ uploaded: 'Minden fájl feltöltve!',
+ notAllUploaded: 'Néhány fájl nem került feltöltésre!',
+ delNotFound: 'Néhány fájl nem található!',
+ deleted: 'Törölve!',
+ renamed: 'Átnevezve!',
+ copied: 'Sikeres másolás!',
+ // zip
+ zipError: 'Hiba becsomagolás közben!',
+ // acl
+ aclError: 'Hozzáférés megtagadva!',
+ },
+};
+
+export default hu;
diff --git a/src/lang/it.js b/src/lang/it.js
new file mode 100644
index 0000000..3008272
--- /dev/null
+++ b/src/lang/it.js
@@ -0,0 +1,191 @@
+/**
+ * Italian translate
+ * Ezio
+ * @type Object
+ */
+const it = {
+ btn: {
+ about: 'Informazioni',
+ back: 'Indietro',
+ cancel: 'Annulla',
+ clear: 'Pulisci',
+ copy: 'Copia',
+ cut: 'Taglia',
+ delete: 'Elimina',
+ edit: 'Modifica',
+ forward: 'Inoltra',
+ folder: 'Nuova Cartella',
+ file: 'Nuovo File',
+ fullScreen: 'Visualizzazione a schermo intero',
+ grid: 'Griglia',
+ paste: 'Incolla',
+ refresh: 'Ricarica',
+ submit: 'Conferma',
+ table: 'Tabella',
+ upload: 'Upload',
+ uploadSelect: 'Seleziona files',
+ hidden: ' Files Nascosti',
+ },
+ clipboard: {
+ actionType: 'Tipo',
+ copy: 'Copia',
+ cut: 'Taglia',
+ none: 'Nessun elemento selezionato',
+ title: 'Appunti',
+ },
+ contextMenu: {
+ copy: 'Copia',
+ cut: 'Taglia',
+ delete: 'Elimina',
+ download: 'Scarica',
+ info: 'Selezionati:',
+ open: 'Apri',
+ paste: 'Incolla',
+ properties: 'Proprietà',
+ rename: 'Rinomina',
+ select: 'Seleziona',
+ view: 'Anteprima',
+ zip: 'Zip',
+ unzip: 'Estrai zip',
+ edit: 'Modifica',
+ audioPlay: 'Play',
+ videoPlay: 'Play',
+ },
+ info: {
+ directories: 'Cartelle:',
+ files: 'Files:',
+ selected: 'Selezionati:',
+ selectedSize: 'Dimensione files:',
+ size: 'Dimensione files:',
+ },
+ manager: {
+ table: {
+ date: 'Data',
+ folder: 'Cartella',
+ name: 'Nome',
+ size: 'Dim.',
+ type: 'Tipo',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Developer',
+ name: 'Laravel File Manager',
+ title: 'Informazioni',
+ version: 'Versione',
+ },
+ delete: {
+ noSelected: 'Nessuna selezione!',
+ title: 'Elimina',
+ },
+ newFile: {
+ fieldName: 'Nome del file',
+ fieldFeedback: 'Il file esiste!',
+ title: 'Crea nuovo file',
+ },
+ newFolder: {
+ fieldName: 'Nome cartella',
+ fieldFeedback: 'La cartella esiste!',
+ title: 'Crea nuova cartella',
+ },
+ preview: {
+ title: 'Anteprima',
+ },
+ properties: {
+ disk: 'Disco',
+ modified: 'Mod.',
+ name: 'Nome',
+ path: 'Percorso',
+ size: 'Dim.',
+ title: 'Proprietà',
+ type: 'Tipo',
+ url: 'URL',
+ access: 'Accesso',
+ access_0: 'Accesso negato',
+ access_1: 'Sola lettura',
+ access_2: 'Lettura e Scrittura',
+ },
+ rename: {
+ directoryExist: 'La cartella esiste',
+ fieldName: 'Inserisci il nome',
+ fieldFeedback: 'Nome non valido',
+ fileExist: 'Il file esiste',
+ title: 'Rinomina',
+ },
+ status: {
+ noErrors: 'Nessun errore!',
+ title: 'Stato',
+ },
+ upload: {
+ ifExist: 'Il file esiste:',
+ noSelected: 'Nessun files selezionato!',
+ overwrite: 'Sovrascrivi!',
+ selected: 'Selezionato:',
+ size: 'Dim.:',
+ skip: 'Salta',
+ title: 'Carica files',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Player Audio',
+ },
+ videoPlayer: {
+ title: 'Player Video',
+ },
+ zip: {
+ title: 'Crea Archivio',
+ fieldName: 'Nome Archivio',
+ fieldFeedback: 'Archivio esistente!',
+ },
+ unzip: {
+ title: 'Estrai archivio',
+ fieldName: 'Nom cartella',
+ fieldRadioName: 'Estrai in:',
+ fieldRadio1: 'Nella cartella corrente',
+ fieldRadio2: 'In una nuova cartella',
+ fieldFeedback: 'Cartella esistente!',
+ warning: 'Attenzione! se i nomi dei file coincidono i file presenti verranno sovrascritti!',
+ },
+ cropper: {
+ title: 'Ritaglia',
+ apply: 'Applica',
+ reset: 'Reset',
+ save: 'Salva',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Tagliato e salvato negli appunti!',
+ copyToClipboard: 'Copiato negli appunti!',
+ },
+ response: {
+ noConfig: 'File di configuraizone non trovato!',
+ notFound: 'Non trovato!',
+ diskNotFound: 'Disco non trovato!',
+ pathNotFound: 'Cartella non trovata!',
+ diskSelected: 'Disco selezionato!',
+ // files
+ fileExist: 'File già esistente!',
+ fileCreated: 'File creato!',
+ fileUpdated: 'File caricato!',
+ fileNotFound: 'File non trovato!',
+ // directories
+ dirExist: 'La cartella è già presente!',
+ dirCreated: 'Cartella creata!',
+ dirNotFound: 'Cartella non trovata',
+ // actions
+ uploaded: 'Tutti i file sono stati caricati!',
+ notAllUploaded: 'Alcuni file NON sono stati caricati!',
+ delNotFound: 'Alcuni elementi NON sono stati trovati!',
+ deleted: 'Eliminato!',
+ renamed: 'Rinominato!',
+ copied: 'Copiato con successo!',
+ // zip
+ zipError: "Errore dirante la creazione dell'archivio!",
+ // acl
+ aclError: 'Accesso negato!',
+ },
+};
+
+export default it;
diff --git a/src/lang/nl.js b/src/lang/nl.js
new file mode 100644
index 0000000..6282405
--- /dev/null
+++ b/src/lang/nl.js
@@ -0,0 +1,194 @@
+/**
+ * Dutch (Netherlands) translate
+ * Sibren - https://github.com/siebsie23
+ * Laurens - https://github.com/Laussii078
+ * @type Object
+ */
+const nl = {
+ // todo - need to translate
+ btn: {
+ about: 'Over',
+ back: 'Terug',
+ cancel: 'Annuleren',
+ clear: 'Legen',
+ copy: 'Kopiëren',
+ cut: 'Knippen',
+ delete: 'Verwijderen',
+ edit: 'Bewerken',
+ forward: 'Volgende',
+ folder: 'Nieuwe map',
+ file: 'Nieuw bestand',
+ fullScreen: 'Volledig scherm',
+ grid: 'Raster',
+ paste: 'Plakken',
+ refresh: 'Ververs',
+ submit: 'Indienen',
+ table: 'Tabel',
+ upload: 'Uploaden',
+ uploadSelect: 'Selecteer bestanden',
+ hidden: ' Verborgen bestanden',
+ },
+ clipboard: {
+ actionType: 'Type',
+ copy: 'Kopiëren',
+ cut: 'Knippen',
+ none: 'Niks geselecteerd',
+ title: 'Klembord',
+ },
+ contextMenu: {
+ copy: 'Kopiëren',
+ cut: 'Knippen',
+ delete: 'Verwijderen',
+ download: 'Download',
+ info: 'Geselecteerd:',
+ open: 'Open',
+ paste: 'Plak',
+ properties: 'Eigenschappen',
+ rename: 'Hernoem',
+ select: 'Selecteerd',
+ view: 'Bekijken',
+ zip: 'Inpakken',
+ unzip: 'Uitpakken',
+ edit: 'Bewerken',
+ audioPlay: 'Afspelen',
+ videoPlay: 'Afspelen',
+ },
+ info: {
+ directories: 'Mappen:',
+ files: 'Bestanden:',
+ selected: 'Geselecteerd:',
+ selectedSize: 'Bestand grootte:',
+ size: 'Bestand grootte:',
+ },
+ manager: {
+ table: {
+ date: 'Datum',
+ folder: 'Map',
+ name: 'Naam',
+ size: 'Grootte',
+ type: 'Type',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Ontwikkelaar',
+ name: 'Laravel File Manager',
+ title: 'Over',
+ version: 'Versie',
+ },
+ delete: {
+ noSelected: 'Niks geselecteerd!',
+ title: 'Verwijderen',
+ },
+ newFile: {
+ fieldName: 'Bestandsnaam',
+ fieldFeedback: 'Bestand bestaat!',
+ title: 'Nieuw bestand maken',
+ },
+ newFolder: {
+ fieldName: 'Mapnaam',
+ fieldFeedback: 'Map bestaat!',
+ title: 'Nieuwe map maken',
+ },
+ preview: {
+ title: 'Voorbeeld',
+ },
+ properties: {
+ disk: 'Schijf',
+ modified: 'Bewerkt',
+ name: 'Naam',
+ path: 'Pad',
+ size: 'Grootte',
+ title: 'EigenSchappen',
+ type: 'Type',
+ url: 'URL',
+ access: 'Toegang',
+ access_0: 'Geen toegang',
+ access_1: 'Alleen Lezen',
+ access_2: 'Lezen en Schrijven',
+ },
+ rename: {
+ directoryExist: 'Bestand bestaat',
+ fieldName: 'Nieuwe naam invoeren',
+ fieldFeedback: 'Ongeldige naam',
+ fileExist: 'Bestand bestaat',
+ title: 'Hernoemen',
+ },
+ status: {
+ noErrors: 'Geen errors!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Als het bestand bestaat:',
+ noSelected: 'Geen bestanden geselecteerd!',
+ overwrite: 'Overschrijven!',
+ selected: 'Geselecteerd:',
+ size: 'Grootte:',
+ skip: 'Overslaan',
+ title: 'Bestanden uploaden',
+ },
+ editor: {
+ title: 'Bewerker',
+ },
+ audioPlayer: {
+ title: 'Audiospeler',
+ },
+ videoPlayer: {
+ title: 'Videospeler',
+ },
+ zip: {
+ title: 'Archief maken',
+ fieldName: 'Archief naam',
+ fieldFeedback: 'Archief bestaat!',
+ },
+ unzip: {
+ title: 'Archief uitpakken',
+ fieldName: 'Mapnaam',
+ fieldRadioName: 'Uitpakken naar:',
+ fieldRadio1: 'Naar huidige map',
+ fieldRadio2: 'In een nieuwe map',
+ fieldFeedback: 'Map bestaat!',
+ warning: 'Attentie! Als bestandsnamen hetzelfde zijn worden de bestanden overschreven!',
+ },
+ cropper: {
+ title: 'Bijsnijden',
+ apply: 'Toepassen',
+ reset: 'Resetten',
+ save: 'Opslaan',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Knippen naar klembord!',
+ copyToClipboard: 'Kopiëren naar klembord!',
+ },
+ // todo - need to translate - end
+ response: {
+ noConfig: 'Configuratie niet gevonden!',
+ notFound: 'Niet gevonden!',
+ diskNotFound: 'Schijf niet gevonden!',
+ pathNotFound: 'Pad niet gevonden!',
+ diskSelected: 'Schijf geselecteerd!',
+ // files
+ fileExist: 'Bestand bestaat al!',
+ fileCreated: 'Bestand aangemaakt!',
+ fileUpdated: 'Bestand bijgewerkt!',
+ fileNotFound: 'Bestand niet gevonden!',
+ // directories
+ dirExist: 'Map bestaat al!',
+ dirCreated: 'Map aangemaakt!',
+ dirNotFound: 'Map niet gevonden',
+ // actions
+ uploaded: 'Alle bestanden zijn geüpload!',
+ notAllUploaded: 'Sommige bestanden zijn niet geüpload!',
+ delNotFound: 'Sommige bestanden konden niet worden gevonden!',
+ deleted: 'Verwijderd!',
+ renamed: 'Hernoemd!',
+ copied: 'Succesvol gekopieerd!',
+ // zip
+ zipError: 'Fout bij het maken van archief!',
+ // acl
+ aclError: 'Toegang geweigerd!',
+ },
+};
+
+export default nl;
diff --git a/src/lang/pl.js b/src/lang/pl.js
new file mode 100644
index 0000000..b9e463c
--- /dev/null
+++ b/src/lang/pl.js
@@ -0,0 +1,190 @@
+/**
+ * Polish
+ * @type Object
+ */
+const pl = {
+ btn: {
+ about: 'O Programie',
+ back: 'Wstecz',
+ cancel: 'Anuluj',
+ clear: 'Wyczyść',
+ copy: 'Kopiuj',
+ cut: 'Wytnij',
+ delete: 'Usuń',
+ edit: 'Edycja',
+ forward: 'Do przodu',
+ folder: 'Nowy folder',
+ file: 'Nowy plik',
+ fullScreen: 'Pełny ekran',
+ grid: 'Siatka',
+ paste: 'Wklej',
+ refresh: 'Odśwież',
+ submit: 'Zatwierdź',
+ table: 'Tabela',
+ upload: 'Wyślij plik',
+ uploadSelect: 'Wybierz pliki',
+ hidden: 'Ukryte pliki',
+ },
+ clipboard: {
+ actionType: 'Rodzaj',
+ copy: 'Kopiuj',
+ cut: 'Przytnij',
+ none: 'Nic nie zostało zaznaczone',
+ title: 'Schowek',
+ },
+ contextMenu: {
+ copy: 'Kopiuj',
+ cut: 'Przytnij',
+ delete: 'Usuń',
+ download: 'Pobierz',
+ info: 'Wybrano:',
+ open: 'Otwórz',
+ paste: 'Wklej',
+ properties: 'Właściwości',
+ rename: 'Zmień nazwę',
+ select: 'Wybierz',
+ view: 'Widok',
+ zip: 'Spakuj',
+ unzip: 'Rozpakuj',
+ edit: 'Edycja',
+ audioPlay: 'Odtwórz',
+ videoPlay: 'Odtwórz',
+ },
+ info: {
+ directories: 'Katalogi',
+ files: 'Pliki:',
+ selected: 'Wybrany:',
+ selectedSize: 'Rozmiar plików:',
+ size: 'Rozmiar plików:',
+ },
+ manager: {
+ table: {
+ date: 'Data',
+ folder: 'Folder',
+ name: 'Nazwa',
+ size: 'Rozmiar',
+ type: 'Rodzaj',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Deweloper',
+ name: 'Menedżer plików',
+ title: 'O',
+ version: 'Wersja',
+ },
+ delete: {
+ noSelected: 'Nic nie zostało zaznaczone!',
+ title: 'Usuń',
+ },
+ newFile: {
+ fieldName: 'Nazwa pliku',
+ fieldFeedback: 'Plik istnieje!',
+ title: 'Utwórz nowy plik',
+ },
+ newFolder: {
+ fieldName: 'Nazwa folderu',
+ fieldFeedback: 'Katalog istnieje!',
+ title: 'Stwórz nowy folder',
+ },
+ preview: {
+ title: 'Podgląd',
+ },
+ properties: {
+ disk: 'Dysk',
+ modified: 'Zmodyfikowano',
+ name: 'Nazwa',
+ path: 'Ścieżka',
+ size: 'Rozmiar',
+ title: 'Właściwości',
+ type: 'Rodzaj',
+ url: 'URL',
+ access: 'Dostęp',
+ access_0: 'Brak dostępu',
+ access_1: 'Tylko do odczytu',
+ access_2: 'Odczyt i zapis',
+ },
+ rename: {
+ directoryExist: 'Katalog istnieje',
+ fieldName: 'Wpisz nową nazwę',
+ fieldFeedback: 'Błędna nazwa',
+ fileExist: 'Plik istnieje',
+ title: 'Zmień nazwę',
+ },
+ status: {
+ noErrors: 'Bez błędów!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Jeśli plik istnieje:',
+ noSelected: 'Nie wybrano plików!',
+ overwrite: 'Nadpisz',
+ selected: 'Wybrano:',
+ size: 'Rozmiar:',
+ skip: 'Pomiń',
+ title: 'Prześlij pliki',
+ },
+ editor: {
+ title: 'Edytor',
+ },
+ audioPlayer: {
+ title: 'Odtwarzacz muzyki',
+ },
+ videoPlayer: {
+ title: 'Odtwarzacz wideo',
+ },
+ zip: {
+ title: 'Utwórz archiwum',
+ fieldName: 'Nazwa archiwum',
+ fieldFeedback: 'Archiwum istnieje!',
+ },
+ unzip: {
+ title: 'Rozpakuj archiwum',
+ fieldName: 'Nazwa folderu',
+ fieldRadioName: 'Wypakować do:',
+ fieldRadio1: 'Do bieżącego folderu',
+ fieldRadio2: 'W nowym folderze',
+ fieldFeedback: 'Katalog istnieje!',
+ warning: 'Uwaga! Przy identycznej nazwie, pliki zostaną nadpisane!',
+ },
+ cropper: {
+ title: 'Przycinanie',
+ apply: 'Zastosuj',
+ reset: 'Reset',
+ save: 'Zapisz',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Wytnij do schowka!',
+ copyToClipboard: 'Skopiowane do schowka!',
+ },
+ response: {
+ noConfig: 'Nie znaleziono konfiguracji!',
+ notFound: 'Nie znaleziono!',
+ diskNotFound: 'Nie znaleziono dysku!',
+ pathNotFound: 'Ścieżka nie znaleziona!',
+ diskSelected: 'Dysk wybrany!',
+ // files
+ fileExist: 'Plik już istnieje!',
+ fileCreated: 'Plik utworzony!',
+ fileUpdated: 'Plik zaktualizowany!',
+ fileNotFound: 'Nie znaleziono pliku!',
+ // directories
+ dirExist: 'Katalog już istnieje!',
+ dirCreated: 'Katalog utworzony!',
+ dirNotFound: 'Nie znaleziono katalogu',
+ // actions
+ uploaded: 'Przesłano wszystkie pliki!',
+ notAllUploaded: 'Niektóre pliki nie zostały przesłane!',
+ delNotFound: 'Niektóre pozycje nie zostały znalezione!',
+ deleted: 'Usunięto!',
+ renamed: 'Zmieniono nazwę!',
+ copied: 'Skopiowano pomyślnie!',
+ // zip
+ zipError: 'Błąd podczas tworzenia archiwum!',
+ // acl
+ aclError: 'Brak dostępu!',
+ },
+};
+
+export default pl;
diff --git a/src/lang/pt_BR.js b/src/lang/pt_BR.js
new file mode 100644
index 0000000..9aae575
--- /dev/null
+++ b/src/lang/pt_BR.js
@@ -0,0 +1,191 @@
+/**
+ * Portuguese Brazilian translate
+ * @type Object
+ */
+/* eslint camelcase: 0 */
+const pt_BR = {
+ btn: {
+ about: 'Sobre',
+ back: 'Voltar',
+ cancel: 'Cancelar',
+ clear: 'Limpar',
+ copy: 'Copiar',
+ cut: 'Recortar',
+ delete: 'Apagar',
+ edit: 'Editar',
+ forward: 'Avançar',
+ folder: 'Nova pasta',
+ file: 'Novo arquivo',
+ fullScreen: 'Tela cheia',
+ grid: 'Grade',
+ paste: 'Colar',
+ refresh: 'Atualizar',
+ submit: 'Criar',
+ table: 'Tabela',
+ upload: 'Upload',
+ uploadSelect: 'Selecionar arquivos',
+ hidden: ' Arquivos ocultos',
+ },
+ clipboard: {
+ actionType: 'Formato',
+ copy: 'Copiar',
+ cut: 'Recortar',
+ none: 'Nada selecionado',
+ title: 'Área de transferência',
+ },
+ contextMenu: {
+ copy: 'Copiar',
+ cut: 'Recortar',
+ delete: 'Apagar',
+ download: 'Download',
+ info: 'Selecionado:',
+ open: 'Abrir',
+ paste: 'Colar',
+ properties: 'Propriedades',
+ rename: 'Renomear',
+ select: 'Selecionar',
+ view: 'Visualizar',
+ zip: 'Compactar',
+ unzip: 'Descompactar',
+ edit: 'Editar',
+ audioPlay: 'Play',
+ videoPlay: 'Play',
+ },
+ info: {
+ directories: 'Pastas:',
+ files: 'Arquivos:',
+ selected: 'Selecionado:',
+ selectedSize: 'Tamanho dos arquivos:',
+ size: 'Tamanho dos arquivos:',
+ },
+ manager: {
+ table: {
+ date: 'Data',
+ folder: 'Pasta',
+ name: 'Nome',
+ size: 'Tamanho',
+ type: 'Tipo',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Desenvolvedor',
+ name: 'Laravel File Manager',
+ title: 'Sobre',
+ version: 'Versão',
+ },
+ delete: {
+ noSelected: 'Nada selecionado!',
+ title: 'Apagar',
+ },
+ newFile: {
+ fieldName: 'Nome do arquivo',
+ fieldFeedback: 'Arquivo existente!',
+ title: 'Criar novo arquivo',
+ },
+ newFolder: {
+ fieldName: 'Nome da pasta',
+ fieldFeedback: 'Pasta existente!',
+ title: 'Criar nova pasta',
+ },
+ preview: {
+ title: 'Visualizar',
+ },
+ properties: {
+ disk: 'Disco',
+ modified: 'Modificado',
+ name: 'Nome',
+ path: 'Caminho',
+ size: 'Tamanho',
+ title: 'Propriedades',
+ type: 'Tipo',
+ url: 'URL',
+ access: 'Acesso',
+ access_0: 'Acesso negado',
+ access_1: 'Apenas leitura',
+ access_2: 'Leitura e escrita',
+ },
+ rename: {
+ directoryExist: 'Pasta existente',
+ fieldName: 'Digite o novo nome',
+ fieldFeedback: 'Nome inválido',
+ fileExist: 'Arquivo existente',
+ title: 'Renomear',
+ },
+ status: {
+ noErrors: 'Nenhum erro!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Se arquivo já existir:',
+ noSelected: 'Nenhum arquivo selecionado!',
+ overwrite: 'Substituir!',
+ selected: 'Selecionado:',
+ size: 'Tamanho:',
+ skip: 'Pular',
+ title: 'Upload de arquivos',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Áudio player',
+ },
+ videoPlayer: {
+ title: 'Video player',
+ },
+ zip: {
+ title: 'Compactar arquivo',
+ fieldName: 'Nome do arquivo',
+ fieldFeedback: 'Arquivo existente!',
+ },
+ unzip: {
+ title: 'Descompactar arquivo',
+ fieldName: 'Nome da pasta',
+ fieldRadioName: 'Extrair para:',
+ fieldRadio1: 'Pasta atual',
+ fieldRadio2: 'Nova pasta',
+ fieldFeedback: 'Pasta existente!',
+ warning: 'Atenção! Se os nomes forem idênticos, os arquivos serão substituídos!',
+ },
+ cropper: {
+ title: 'Cortar',
+ apply: 'Aplicar',
+ reset: 'Resetar',
+ save: 'Salvar',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Recortado para área de transferência!',
+ copyToClipboard: 'Copiado para área de transferência!',
+ },
+ response: {
+ noConfig: 'Configuração não encontrada!',
+ notFound: 'Não encontrado!',
+ diskNotFound: 'Disco não encontrado!',
+ pathNotFound: 'Caminho não encontrado!',
+ diskSelected: 'Disco selecionado!',
+ // files
+ fileExist: 'Arquivo já existe!',
+ fileCreated: 'Arquivo criado!',
+ fileUpdated: 'Arquivo atualizado!',
+ fileNotFound: 'Arquivo não encontrado!',
+ // directories
+ dirExist: 'Pasta já existe!',
+ dirCreated: 'Pasta criada!',
+ dirNotFound: 'Pasta não encontrada',
+ // actions
+ uploaded: 'Todos os arquivos realizaram o upload!',
+ notAllUploaded: 'Alguns arquivos não realizaram o upload!',
+ delNotFound: 'Alguns itens não foram encontrados!',
+ deleted: 'Deletado!',
+ renamed: 'Renomeado!',
+ copied: 'Copiado com sucesso!',
+ // zip
+ zipError: 'Erro ao compactar!',
+ // acl
+ aclError: 'Acesso negado!',
+ },
+};
+
+export default pt_BR;
diff --git a/src/lang/ru.js b/src/lang/ru.js
index fd35030..7c0f64b 100644
--- a/src/lang/ru.js
+++ b/src/lang/ru.js
@@ -3,115 +3,188 @@
* @type Object
*/
const ru = {
- btn: {
- about: 'О программе',
- back: 'Назад',
- cancel: 'Отменить',
- clear: 'Очистить',
- copy: 'Копировать',
- cut: 'Вырезать',
- delete: 'Удалить',
- edit: 'Редактировать',
- forward: 'Вперед',
- folder: 'Новая папка',
- fullScreen: 'На весь экран',
- grid: 'Сетка',
- paste: 'Вставить',
- refresh: 'Обновить',
- submit: 'Отправить',
- table: 'Таблица',
- upload: 'Загрузить',
- uploadSelect: 'Выбрать файлы',
- },
- clipboard: {
- actionType: 'Тип операции',
- copy: 'Копировать',
- cut: 'Вырезать',
- none: 'Ничего не выбрано',
- title: 'Буфер обмена',
- },
- contextMenu: {
- copy: 'Копировать',
- cut: 'Вырезать',
- delete: 'Удалить',
- download: 'Скачать',
- info: 'Выбрано:',
- open: 'Открыть',
- paste: 'Вставить',
- properties: 'Свойства',
- rename: 'Переименовать',
- select: 'Выбрать',
- view: 'Просмотр',
- zip: 'Сжать',
- },
- info: {
- directories: 'Папок:',
- files: 'Файлов:',
- selected: 'Выбрано:',
- selectedSize: 'Размер:',
- size: 'Размер файлов:',
- },
- manager: {
- table: {
- date: 'Дата',
- folder: 'Папка',
- name: 'Имя',
- size: 'Размер',
- type: 'Тип',
+ btn: {
+ about: 'О программе',
+ back: 'Назад',
+ cancel: 'Отменить',
+ clear: 'Очистить',
+ copy: 'Копировать',
+ cut: 'Вырезать',
+ delete: 'Удалить',
+ edit: 'Редактировать',
+ forward: 'Вперед',
+ folder: 'Новая папка',
+ file: 'Новый файл',
+ fullScreen: 'На весь экран',
+ grid: 'Сетка',
+ paste: 'Вставить',
+ refresh: 'Обновить',
+ submit: 'Отправить',
+ table: 'Таблица',
+ upload: 'Загрузить',
+ uploadSelect: 'Выбрать файлы',
+ hidden: 'Скрытые файлы',
},
- },
- modal: {
- about: {
- developer: 'Разработчик',
- name: 'Laravel File Manager',
- site: 'Сайт',
- title: 'О программе',
- version: 'Версия',
+ clipboard: {
+ actionType: 'Тип операции',
+ copy: 'Копировать',
+ cut: 'Вырезать',
+ none: 'Ничего не выбрано',
+ title: 'Буфер обмена',
},
- delete: {
- confirmText: 'Подтвердите удаление!',
- confirmLabel: 'Удалить!',
- noSelected: 'Ничего не выбрано!',
- title: 'Удалить',
+ contextMenu: {
+ copy: 'Копировать',
+ cut: 'Вырезать',
+ delete: 'Удалить',
+ download: 'Скачать',
+ info: 'Выбрано:',
+ open: 'Открыть',
+ paste: 'Вставить',
+ properties: 'Свойства',
+ rename: 'Переименовать',
+ select: 'Выбрать',
+ view: 'Просмотр',
+ zip: 'Архивировать',
+ unzip: 'Разархивировать',
+ edit: 'Редактировать',
+ audioPlay: 'Воспроизвести',
+ videoPlay: 'Воспроизвести',
},
- newFolder: {
- fieldName: 'Имя папки',
- fieldFeedback: 'Такакя папка уже существует!',
- title: 'Создать новую папку',
+ info: {
+ directories: 'Папок:',
+ files: 'Файлов:',
+ selected: 'Выбрано:',
+ selectedSize: 'Размер:',
+ size: 'Размер файлов:',
},
- preview: {
- title: 'Предпросмотр',
+ manager: {
+ table: {
+ date: 'Дата',
+ folder: 'Папка',
+ name: 'Имя',
+ size: 'Размер',
+ type: 'Тип',
+ },
},
- properties: {
- disk: 'Диск',
- modified: 'Изменен',
- name: 'Имя',
- path: 'Путь',
- size: 'Размер',
- title: 'Свойства',
- type: 'Тип',
+ modal: {
+ about: {
+ developer: 'Разработчик',
+ name: 'Laravel File Manager',
+ title: 'О программе',
+ version: 'Версия',
+ },
+ delete: {
+ noSelected: 'Ничего не выбрано!',
+ title: 'Удалить',
+ },
+ newFile: {
+ fieldName: 'Имя файла',
+ fieldFeedback: 'Такой файл уже существует!',
+ title: 'Создать новый файл',
+ },
+ newFolder: {
+ fieldName: 'Имя папки',
+ fieldFeedback: 'Такакя папка уже существует!',
+ title: 'Создать новую папку',
+ },
+ preview: {
+ title: 'Предпросмотр',
+ },
+ properties: {
+ disk: 'Диск',
+ modified: 'Изменен',
+ name: 'Имя',
+ path: 'Путь',
+ size: 'Размер',
+ title: 'Свойства',
+ type: 'Тип',
+ url: 'URL',
+ access: 'Доступ',
+ access_0: 'Нет доступа',
+ access_1: 'Только чтение',
+ access_2: 'Чтение и Запись',
+ },
+ rename: {
+ directoryExist: 'Папка существует',
+ fieldName: 'Введите новое имя',
+ fieldFeedback: 'Некорректное имя',
+ fileExist: 'Файл существует',
+ title: 'Переименовать',
+ },
+ status: {
+ noErrors: 'Ошибок нет!',
+ title: 'Состояние',
+ },
+ upload: {
+ ifExist: 'Если файл существует:',
+ noSelected: 'Ни одного файла не выбрано!',
+ overwrite: 'Перезаписать!',
+ selected: 'Выбрано:',
+ size: 'Размер:',
+ skip: 'Пропустить',
+ title: 'Загрузить файлы',
+ },
+ editor: {
+ title: 'Редактор',
+ },
+ audioPlayer: {
+ title: 'Аудиоплеер',
+ },
+ videoPlayer: {
+ title: 'Видеоплеер',
+ },
+ zip: {
+ title: 'Создать архив',
+ fieldName: 'Имя архива',
+ fieldFeedback: 'Такой файл уже существует!',
+ },
+ unzip: {
+ title: 'Распаковать архив',
+ fieldName: 'Имя папки',
+ fieldRadioName: 'Извлечь в:',
+ fieldRadio1: 'В текущую папку',
+ fieldRadio2: 'В новую папку',
+ fieldFeedback: 'Папка существует!',
+ warning: 'Внимание! При совпадении имен файлы будут перезаписаны!',
+ },
+ cropper: {
+ title: 'Обрезка',
+ apply: 'Применить',
+ reset: 'Сбросить',
+ save: 'Сохранить',
+ },
},
- rename: {
- directoryExist: 'Папка существует',
- fieldName: 'Введите новое имя',
- fieldFeedback: 'Некорректное имя',
- fileExist: 'Файл существует',
- title: 'Переименовать',
+ notifications: {
+ cutToClipboard: 'Вырезано!',
+ copyToClipboard: 'Скопировано!',
},
- status: {
- noErrors: 'Ошибок нет!',
- title: 'Состояние',
+ response: {
+ noConfig: 'Конфигурация не найдена!',
+ notFound: 'Не найдено!',
+ diskNotFound: 'Диск не найден!',
+ pathNotFound: 'Путь не существует!',
+ diskSelected: 'Диск выбран!',
+ // files
+ fileExist: 'Файл существует!',
+ fileCreated: 'Файл создан!',
+ fileUpdated: 'Файл обновлен!',
+ fileNotFound: 'Файл не найден!',
+ // directories
+ dirExist: 'Директория существует!',
+ dirCreated: 'Директория создана!',
+ dirNotFound: 'Директория не найдена',
+ // actions
+ uploaded: 'Все файлы загружены!',
+ notAllUploaded: 'Не все файлы загружены!',
+ delNotFound: 'Не все элементы найдены!',
+ deleted: 'Удалено!',
+ renamed: 'Переименовано!',
+ copied: 'Скопировано!',
+ // zip
+ zipError: 'Ошибка создания архива!',
+ // acl
+ aclError: 'В доступе отказано!',
},
- upload: {
- ifExist: 'Если файл существует:',
- noSelected: 'Ни одного файла не выбрано!',
- overwrite: 'Перезаписать!',
- selected: 'Выбрано:',
- size: 'Размер:',
- skip: 'Пропустить',
- title: 'Загрузить файлы',
- },
- },
};
export default ru;
diff --git a/src/lang/sr.js b/src/lang/sr.js
new file mode 100644
index 0000000..ffd1401
--- /dev/null
+++ b/src/lang/sr.js
@@ -0,0 +1,191 @@
+/**
+ * Serbian translate
+ * Aleksandar Stevanović - aleks989
+ * @type Object
+ */
+const sr = {
+ btn: {
+ about: 'O Nama',
+ back: 'Nazad',
+ cancel: 'Otkaži',
+ clear: 'Očisti',
+ copy: 'Kopiraj',
+ cut: 'Iseci',
+ delete: 'Obriši',
+ edit: 'Izmeni',
+ forward: 'Napred',
+ folder: 'Novi direktorijum',
+ file: 'Nova datoteka',
+ fullScreen: 'Ceo ekran',
+ grid: 'Mrežasti prikaz',
+ paste: 'Nalepi',
+ refresh: 'Osveži',
+ submit: 'Potvrdi',
+ table: 'Tabela',
+ upload: 'Upload',
+ uploadSelect: 'Izaberi datoteke',
+ hidden: ' Skrivene datoteke',
+ },
+ clipboard: {
+ actionType: 'Tip operacije',
+ copy: 'Kopiraj',
+ cut: 'Iseci',
+ none: 'Ništa niste izabrali!',
+ title: 'Clipboard',
+ },
+ contextMenu: {
+ copy: 'Kopiraj',
+ cut: 'Iseci',
+ delete: 'Obriši',
+ download: 'Preuzimanje',
+ info: 'Izabrano:',
+ open: 'Otvori',
+ paste: 'Nalepi',
+ properties: 'Svojstva',
+ rename: 'Preimenuj',
+ select: 'Izaberi',
+ view: 'Pregledaj',
+ zip: 'Arhiviraj',
+ unzip: 'Izbaci iz arhive',
+ edit: 'Izmeni',
+ audioPlay: 'Reprodukuj',
+ videoPlay: 'Reprodukuj',
+ },
+ info: {
+ directories: 'Direktorijumi:',
+ files: 'Datoteke:',
+ selected: 'Izabrano:',
+ selectedSize: 'Veličina fajla:',
+ size: 'Veličina fajla:',
+ },
+ manager: {
+ table: {
+ date: 'Datum',
+ folder: 'Datoteka',
+ name: 'Naziv',
+ size: 'Veličina',
+ type: 'Vrsta',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Razvio',
+ name: 'Laravel File Manager',
+ title: 'O Nama',
+ version: 'Verzija',
+ },
+ delete: {
+ noSelected: 'Ništa niste izabrali!',
+ title: 'Obriši',
+ },
+ newFile: {
+ fieldName: 'Naziv datoteke',
+ fieldFeedback: 'Datoteka već postoji!',
+ title: 'Kreiraj novu datoteku',
+ },
+ newFolder: {
+ fieldName: 'Naziv direktorijuma',
+ fieldFeedback: 'Direktorijum već postoji!',
+ title: 'Kreiraj novi direktorijum',
+ },
+ preview: {
+ title: 'Pregled',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'Izmenjen',
+ name: 'Naziv',
+ path: 'Lokacija',
+ size: 'Veličina',
+ title: 'Svojstva',
+ type: 'Tip datoteke',
+ url: 'URL',
+ access: 'Pristup',
+ access_0: 'Pristup odbijen',
+ access_1: 'Samo za čitanje',
+ access_2: 'Pristup za čitanje i pisanje',
+ },
+ rename: {
+ directoryExist: 'Direktorijum postoji',
+ fieldName: 'Unesite novi naziv',
+ fieldFeedback: 'Neispravan naziv',
+ fileExist: 'Datoteka već postoji',
+ title: 'Preimenuj',
+ },
+ status: {
+ noErrors: 'Nema Grešaka!',
+ title: 'Status',
+ },
+ upload: {
+ ifExist: 'Ako datoteka postoji:',
+ noSelected: 'Nema izabranih fajlova!',
+ overwrite: 'Zameni!',
+ selected: 'Izabrano:',
+ size: 'Veličina:',
+ skip: 'Preskoči',
+ title: 'DOdaj fajlove',
+ },
+ editor: {
+ title: 'Editor',
+ },
+ audioPlayer: {
+ title: 'Audio plejer',
+ },
+ videoPlayer: {
+ title: 'Video plejer',
+ },
+ zip: {
+ title: 'Napravi arhivu',
+ fieldName: 'Naziv Arhive',
+ fieldFeedback: 'Arhiva Postoji!',
+ },
+ unzip: {
+ title: 'Otpakuj arhivu',
+ fieldName: 'Naziv direktorijuma',
+ fieldRadioName: 'Otpakuj u:',
+ fieldRadio1: 'U aktivni direktorijum',
+ fieldRadio2: 'U novi direktorijum',
+ fieldFeedback: 'Direktorijum Postoji!',
+ warning: 'Pažnja! Ako se nazivi poklapaju, datoteke će biti prepisane!',
+ },
+ cropper: {
+ title: 'Orezivanje',
+ apply: 'Primeni',
+ reset: 'Resetuj',
+ save: 'Sačuvaj',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Isečeno u klipbord!',
+ copyToClipboard: 'Kopirano u klipbord!',
+ },
+ response: {
+ noConfig: 'Nema konfiguracije!',
+ notFound: 'Nije pronađeno!',
+ diskNotFound: 'Disk nije pronađen!',
+ pathNotFound: 'Putanja nije pronađena!',
+ diskSelected: 'Disk izabran!',
+ // files
+ fileExist: 'Datoteka već postoji!',
+ fileCreated: 'Nova datoteka napravljena!',
+ fileUpdated: 'Datoteka izmenjena!',
+ fileNotFound: 'Datoteka nije pronadjena!',
+ // directories
+ dirExist: 'Direktorijum već postoji!',
+ dirCreated: 'Novi direktorijum napravljen!',
+ dirNotFound: 'Direktorijum nije pronađen',
+ // actions
+ uploaded: 'Sve datoteke poslate!',
+ notAllUploaded: "Some files weren't uploaded!",
+ delNotFound: 'Nekoliko stavki nije pronađeno! Osvežite!',
+ deleted: 'Obrisano!',
+ renamed: 'Preimenovano!',
+ copied: 'Uspešno kopirano!',
+ // zip
+ zipError: 'Greška u pravljenju arhive!',
+ // acl
+ aclError: 'Pristup odbijen!',
+ },
+};
+
+export default sr;
diff --git a/src/lang/tr.js b/src/lang/tr.js
new file mode 100644
index 0000000..84a1c31
--- /dev/null
+++ b/src/lang/tr.js
@@ -0,0 +1,190 @@
+/**
+ * Turkish translate
+ * @type Object
+ */
+const tr = {
+ btn: {
+ about: 'Hakkında',
+ back: 'Geri',
+ cancel: 'İptal',
+ clear: 'Temizle',
+ copy: 'Kopyala',
+ cut: 'Kes',
+ delete: 'Sil',
+ edit: 'Düzenle',
+ forward: 'İleri',
+ folder: 'Yeni klasör',
+ file: 'Yeni dosya',
+ fullScreen: 'Tam ekran',
+ grid: 'Izgara',
+ paste: 'Yapıştır',
+ refresh: 'Yenile',
+ submit: 'Gönder',
+ table: 'Tablo',
+ upload: 'Yükle',
+ uploadSelect: 'Dosyaları seç',
+ hidden: ' Gizli dosyalar',
+ },
+ clipboard: {
+ actionType: 'İşlem türü',
+ copy: 'Kopyala',
+ cut: 'Yapıştır',
+ none: 'Hiç bir şey seçilmedi',
+ title: 'Pano',
+ },
+ contextMenu: {
+ copy: 'Kopyala',
+ cut: 'Yapıştır',
+ delete: 'Sil',
+ download: 'İndir',
+ info: 'Seçilenler:',
+ open: 'Aç',
+ paste: 'Yapıştır',
+ properties: 'Özellikler',
+ rename: 'Yeniden adlandır',
+ select: 'Seç',
+ view: 'Gör',
+ zip: 'Zip',
+ unzip: 'Zip aç',
+ edit: 'Düzenle',
+ audioPlay: 'Oynat',
+ videoPlay: 'Oynat',
+ },
+ info: {
+ directories: 'Klasörler:',
+ files: 'Dosyalar:',
+ selected: 'Seçilenler:',
+ selectedSize: 'Dosyaların boyutu:',
+ size: 'Dosyaların boyutu:',
+ },
+ manager: {
+ table: {
+ date: 'Tarih',
+ folder: 'Klasör',
+ name: 'İsim',
+ size: 'Boyut',
+ type: 'Tür',
+ },
+ },
+ modal: {
+ about: {
+ developer: 'Geliştirici',
+ name: 'Laravel File Manager',
+ title: 'Hakkında',
+ version: 'Sürüm',
+ },
+ delete: {
+ noSelected: 'Hiç bir şey seçilmedi!',
+ title: 'Sil',
+ },
+ newFile: {
+ fieldName: 'Dosya adı',
+ fieldFeedback: 'Aynı isimli dosya var!',
+ title: 'Yeni dosya yarat',
+ },
+ newFolder: {
+ fieldName: 'Klasör adı',
+ fieldFeedback: 'Aynı isimli klasör var!',
+ title: 'Yeni klasör yarat',
+ },
+ preview: {
+ title: 'Önizleme',
+ },
+ properties: {
+ disk: 'Disk',
+ modified: 'Değiştirilme',
+ name: 'İsim',
+ path: 'Yol',
+ size: 'Boyut',
+ title: 'Özellikler',
+ type: 'Tür',
+ url: 'URL',
+ access: 'Erişim',
+ access_0: 'Erişim engellendi',
+ access_1: 'Salt okunur',
+ access_2: 'Okuma ve yazma',
+ },
+ rename: {
+ directoryExist: 'Klasör mevcut',
+ fieldName: 'Yeni isim girin',
+ fieldFeedback: 'Geçersiz isim',
+ fileExist: 'Dosya mevcut',
+ title: 'Yeniden adlandır',
+ },
+ status: {
+ noErrors: 'Hata yok!',
+ title: 'Durum',
+ },
+ upload: {
+ ifExist: 'Eğer dosya mevcutsa:',
+ noSelected: 'Hiç bir dosya seçilmedi!',
+ overwrite: 'Üzerine yaz!',
+ selected: 'Seçilen:',
+ size: 'Boyut:',
+ skip: 'Atla',
+ title: 'Dosyaları yükle',
+ },
+ editor: {
+ title: 'Editör',
+ },
+ audioPlayer: {
+ title: 'Ses oynatıcı',
+ },
+ videoPlayer: {
+ title: 'Video oynatıcı',
+ },
+ zip: {
+ title: 'Arşiv yarat',
+ fieldName: 'Arşiv adı',
+ fieldFeedback: 'Arşiv mevcut!',
+ },
+ unzip: {
+ title: 'Arşivi aç',
+ fieldName: 'Klasör adı',
+ fieldRadioName: 'Hedef:',
+ fieldRadio1: 'Şu anki klasör',
+ fieldRadio2: 'Yeni klasör',
+ fieldFeedback: 'Klasör mevcut!',
+ warning: 'Dikkat! Eğer dosya isimleri aynı olursa, üzerine yazılacak!',
+ },
+ cropper: {
+ title: 'Kırpma',
+ apply: 'Uygula',
+ reset: 'Sıfırla',
+ save: 'Kaydet',
+ },
+ },
+ notifications: {
+ cutToClipboard: 'Panoya kesildi!',
+ copyToClipboard: 'Panoya kopyalandı!',
+ },
+ response: {
+ noConfig: 'Ayarlar bulunamadı!',
+ notFound: 'Bulunamadı!',
+ diskNotFound: 'Disk bulunamadı!',
+ pathNotFound: 'Yol bulunamadı!',
+ diskSelected: 'Disk seçildi!',
+ // files
+ fileExist: 'Dosya zaten var!',
+ fileCreated: 'Dosya yaratıldı!',
+ fileUpdated: 'Dosya güncellendi!',
+ fileNotFound: 'Dosya bulunamadı!',
+ // directories
+ dirExist: 'Klasör zaten var!',
+ dirCreated: 'Klasör yaratıldı!',
+ dirNotFound: 'Klasör bulunamadı',
+ // actions
+ uploaded: 'Tüm dosyalar yüklendi!',
+ notAllUploaded: 'Bazı dosyalar yüklenemedi!',
+ delNotFound: 'Bazı öğeler bulunamadı!',
+ deleted: 'Silindi!',
+ renamed: 'Yeniden adlandırıldı!',
+ copied: 'Başarıyla kopyalandı!',
+ // zip
+ zipError: 'Arşiv yaratılırken hata oluştu!',
+ // acl
+ aclError: 'Erişim engellendi!',
+ },
+};
+
+export default tr;
diff --git a/src/lang/zh_CN.js b/src/lang/zh_CN.js
new file mode 100644
index 0000000..93ebcac
--- /dev/null
+++ b/src/lang/zh_CN.js
@@ -0,0 +1,193 @@
+/**
+ * zh_CN translate
+ * osindex - https://github.com/osindex
+ * @type Object
+ */
+/* eslint camelcase: 0 */
+const zh_CN = {
+ btn: {
+ about: '关于',
+ back: '返回',
+ cancel: '取消',
+ clear: '清除',
+ copy: '复制',
+ cut: '剪切',
+ delete: '删除',
+ edit: '编辑',
+ forward: '前进',
+ folder: '创建目录',
+ file: '创建文件',
+ fullScreen: '全屏',
+ grid: '网格',
+ paste: '粘贴',
+ refresh: '刷新',
+ submit: '提交',
+ table: '表格',
+ upload: '上传',
+ uploadSelect: '选择文件',
+ hidden: ' 隐藏文件',
+ },
+ clipboard: {
+ actionType: '类型',
+ copy: '复制',
+ cut: '剪切',
+ none: '未选中文件',
+ title: '剪切板',
+ },
+ contextMenu: {
+ copy: '复制',
+ cut: '剪切',
+ delete: '删除',
+ download: '下载',
+ info: '选择:',
+ open: '打开',
+ paste: '粘贴',
+ properties: '属性',
+ rename: '重命名',
+ select: '选择',
+ view: '查看',
+ zip: '压缩',
+ unzip: '解压',
+ edit: '编辑',
+ audioPlay: '播放',
+ videoPlay: '播放',
+ },
+ info: {
+ directories: '目录:',
+ files: '文件:',
+ selected: '已选择:',
+ selectedSize: '已选择文件大小:',
+ size: '文件大小:',
+ },
+ manager: {
+ table: {
+ date: '日期',
+ folder: '目录',
+ name: '名称',
+ size: '大小',
+ type: '类型',
+ },
+ },
+ modal: {
+ about: {
+ developer: '开发者信息',
+ name: '文件管理页',
+ title: '关于',
+ version: '版本',
+ },
+ delete: {
+ noSelected: '暂无选中!',
+ title: '删除',
+ },
+ newFile: {
+ fieldName: '文件名',
+ fieldFeedback: '文件已存在!',
+ title: '创建文件',
+ },
+ newFolder: {
+ fieldName: '目录名',
+ fieldFeedback: '目录已存在!',
+ title: '创建目录',
+ },
+ preview: {
+ title: '预览',
+ },
+ properties: {
+ disk: '模块',
+ modified: '时间',
+ name: '名称',
+ path: '路径',
+ size: '大小',
+ title: '属性',
+ type: '类型',
+ url: '网址',
+ access: '授权',
+ access_0: '禁止访问',
+ access_1: '只读',
+ access_2: '读写',
+ },
+ rename: {
+ directoryExist: '目录存在',
+ fieldName: '输入名称',
+ fieldFeedback: '名称不可用',
+ fileExist: '文件存在',
+ title: '重命名',
+ },
+ status: {
+ noErrors: '暂无错误!',
+ title: '状态',
+ },
+ upload: {
+ ifExist: '如果文件存在:',
+ noSelected: '暂无选中!',
+ overwrite: '覆盖',
+ selected: '已选择:',
+ size: '大小:',
+ skip: '忽略',
+ title: '上传文件',
+ },
+ editor: {
+ title: '编辑',
+ },
+ audioPlayer: {
+ title: '播放音频',
+ },
+ videoPlayer: {
+ title: '播放视频',
+ },
+ zip: {
+ title: '归档文件',
+ fieldName: '归档名称',
+ fieldFeedback: '文件存在!',
+ },
+ unzip: {
+ title: '解压',
+ fieldName: '目录名称',
+ fieldRadioName: '解压到:',
+ fieldRadio1: '当前目录',
+ fieldRadio2: '输入目录',
+ fieldFeedback: '目录存在!',
+ warning: '注意!如果文件存在将会被覆盖!',
+ },
+ cropper: {
+ title: '裁剪',
+ apply: '应用',
+ reset: '重置',
+ save: '保存',
+ },
+ },
+ notifications: {
+ cutToClipboard: '剪切到粘贴板!',
+ copyToClipboard: '复制到粘贴板!',
+ },
+ // todo - need to translate
+ response: {
+ noConfig: 'Config not found!',
+ notFound: 'Not found!',
+ diskNotFound: 'Disk not found!',
+ pathNotFound: 'Path not found!',
+ diskSelected: 'Disk selected!',
+ // files
+ fileExist: 'File already exists!',
+ fileCreated: 'File created!',
+ fileUpdated: 'File updated!',
+ fileNotFound: 'File not found!',
+ // directories
+ dirExist: 'Directory already exists!',
+ dirCreated: 'Directory created!',
+ dirNotFound: 'Directory not found',
+ // actions
+ uploaded: 'All files uploaded!',
+ notAllUploaded: "Some files weren't uploaded!",
+ delNotFound: "Some items weren't founded!",
+ deleted: 'Deleted!',
+ renamed: 'Renamed!',
+ copied: 'Copied successfully!',
+ // zip
+ zipError: 'Error creating archive!',
+ // acl
+ aclError: 'Access denied!',
+ },
+};
+
+export default zh_CN;
diff --git a/src/lang/zh_TW.js b/src/lang/zh_TW.js
new file mode 100644
index 0000000..235645d
--- /dev/null
+++ b/src/lang/zh_TW.js
@@ -0,0 +1,191 @@
+/**
+ * zh_TW translate
+ * @type Object
+ */
+/* eslint camelcase: 0 */
+const zh_TW = {
+ btn: {
+ about: '關於',
+ back: '返回',
+ cancel: '取消',
+ clear: '清除',
+ copy: '複製',
+ cut: '剪下',
+ delete: '刪除',
+ edit: '編輯',
+ forward: '前進',
+ folder: '新增目錄',
+ file: '新增文件',
+ fullScreen: '全螢幕',
+ grid: '網格',
+ paste: '貼上',
+ refresh: '重新整理',
+ submit: '送出',
+ table: '表格',
+ upload: '上傳',
+ uploadSelect: '選擇文件',
+ hidden: ' 隱藏文件',
+ },
+ clipboard: {
+ actionType: '類型',
+ copy: '複製',
+ cut: '剪下',
+ none: '未選取',
+ title: '剪貼簿',
+ },
+ contextMenu: {
+ copy: '複製',
+ cut: '剪下',
+ delete: '刪除',
+ download: '下載',
+ info: '選擇:',
+ open: '打開',
+ paste: '貼上',
+ properties: '屬性',
+ rename: '重新命名',
+ select: '選擇',
+ view: '查看',
+ zip: '壓縮',
+ unzip: '解壓縮',
+ edit: '編輯',
+ audioPlay: '播放',
+ videoPlay: '播放',
+ },
+ info: {
+ directories: '目錄:',
+ files: '文件:',
+ selected: '已選擇:',
+ selectedSize: '已選擇文件大小:',
+ size: '文件大小:',
+ },
+ manager: {
+ table: {
+ date: '日期',
+ folder: '目錄',
+ name: '名稱',
+ size: '大小',
+ type: '類型',
+ },
+ },
+ modal: {
+ about: {
+ developer: '開發者資訊',
+ name: '文件管理頁',
+ title: '關於',
+ version: '版本',
+ },
+ delete: {
+ noSelected: '暫無選中!',
+ title: '刪除',
+ },
+ newFile: {
+ fieldName: '文件名',
+ fieldFeedback: '文件已存在!',
+ title: '新增文件',
+ },
+ newFolder: {
+ fieldName: '目錄名',
+ fieldFeedback: '目錄已存在!',
+ title: '新增目錄',
+ },
+ preview: {
+ title: '預覽',
+ },
+ properties: {
+ disk: '磁碟',
+ modified: '時間',
+ name: '名稱',
+ path: '路徑',
+ size: '大小',
+ title: '屬性',
+ type: '類型',
+ url: '網址',
+ access: '授權',
+ access_0: '禁止訪問',
+ access_1: '唯獨',
+ access_2: '讀寫',
+ },
+ rename: {
+ directoryExist: '目錄存在',
+ fieldName: '輸入名稱',
+ fieldFeedback: '名稱不可用',
+ fileExist: '文件存在',
+ title: '重命名',
+ },
+ status: {
+ noErrors: '暫無錯誤!',
+ title: '狀態',
+ },
+ upload: {
+ ifExist: '如果文件存在:',
+ noSelected: '暫無選中!',
+ overwrite: '覆蓋',
+ selected: '已選擇:',
+ size: '大小:',
+ skip: '忽略',
+ title: '上傳文件',
+ },
+ editor: {
+ title: '編輯',
+ },
+ audioPlayer: {
+ title: '播放音樂',
+ },
+ videoPlayer: {
+ title: '播放影片',
+ },
+ zip: {
+ title: '壓縮文件',
+ fieldName: '壓縮名稱',
+ fieldFeedback: '文件存在!',
+ },
+ unzip: {
+ title: '解壓縮',
+ fieldName: '目錄名稱',
+ fieldRadioName: '解壓到:',
+ fieldRadio1: '當前目錄',
+ fieldRadio2: '輸入目錄',
+ fieldFeedback: '目錄存在!',
+ warning: '注意!如果文件存在將會被覆蓋!',
+ },
+ cropper: {
+ title: '裁剪',
+ apply: '套用',
+ reset: '重設',
+ save: '儲存',
+ },
+ },
+ notifications: {
+ cutToClipboard: '剪下到剪貼簿!',
+ copyToClipboard: '複製到剪貼簿!',
+ },
+ response: {
+ noConfig: '找不到設定檔!',
+ notFound: '找不到項目!',
+ diskNotFound: '找不到磁碟!',
+ pathNotFound: '找不到路徑!',
+ diskSelected: '磁碟已選取!',
+ // files
+ fileExist: '文件已存在!',
+ fileCreated: '文件已建立!',
+ fileUpdated: '文件已更新!',
+ fileNotFound: '找不到文件!',
+ // directories
+ dirExist: '目錄已存在!',
+ dirCreated: '目錄已存在!',
+ dirNotFound: '找不到目錄',
+ // actions
+ uploaded: '全部文件已上傳完畢!',
+ notAllUploaded: '部分文件未上傳!',
+ delNotFound: '部分項目未被找到!',
+ deleted: '已刪除!',
+ renamed: '已重新命名!',
+ copied: '已複製完成!',
+ // zip
+ zipError: '壓縮檔建立失敗!',
+ // acl
+ aclError: '存取拒絕!',
+ },
+};
+
+export default zh_TW;
diff --git a/src/main.js b/src/main.js
index 4e22bd4..6511758 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,24 +1,14 @@
-/* eslint-disable no-new,import/prefer-default-export */
-import Vue from 'vue';
-import Vuex from 'vuex';
-
-// main store module
-import fm from './store/file-manager';
-
-// main component
-import FileManager from './FileManager';
-
-Vue.use(Vuex);
-
-const store = new Vuex.Store({
- modules: { fm },
+import { createApp } from 'vue';
+import { createStore } from 'vuex';
+// store
+import fm from './store';
+// App
+import App from './FileManager.vue';
+
+// create new store
+const store = createStore({
+ strict: import.meta.env.DEV,
+ modules: { fm },
});
-Vue.config.productionTip = false;
-
-window.fm = new Vue({
- el: '#fm',
- store,
- components: { FileManager },
- template: '',
-});
+window.fm = createApp(App).use(store).mount('#fm');
diff --git a/src/mixins/helper.js b/src/mixins/helper.js
index 80fa3d5..00ccb64 100644
--- a/src/mixins/helper.js
+++ b/src/mixins/helper.js
@@ -1,232 +1,218 @@
export default {
- computed: {
- /**
- * Selected translate
- * @returns {*}
- */
- lang() {
- // If selected translations exists
- if (Object.prototype.hasOwnProperty.call(
- this.$store.state.fm.settings.translations,
- this.$store.state.fm.settings.lang)
- ) {
- return this.$store.state.fm.settings.translations[
- this.$store.state.fm.settings.lang
- ];
- }
- // default translate - en
- return this.$store.state.fm.settings.translations.en;
+ methods: {
+ /**
+ * Bytes to KB, MB, ..
+ * @param bytes
+ * @returns {string}
+ */
+ bytesToHuman(bytes) {
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
+
+ if (bytes === 0) return '0 Bytes';
+
+ const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
+
+ if (i === 0) return `${bytes} ${sizes[i]}`;
+
+ return `${(bytes / 1024 ** i).toFixed(1)} ${sizes[i]}`;
+ },
+
+ /**
+ * Timestamp to date
+ * @param timestamp
+ * @returns {string}
+ */
+ timestampToDate(timestamp) {
+ // if date not defined
+ if (timestamp === undefined || timestamp === null) return '-';
+
+ const date = new Date(timestamp * 1000);
+
+ return date.toLocaleString(this.$store.state.fm.settings.lang);
+ },
+
+ /**
+ * Mime type to icon
+ * @param mime
+ * @returns {*}
+ */
+ mimeToIcon(mime) {
+ // mime types
+ const mimeTypes = {
+ // image
+ 'image/gif': 'bi-file-earmark-image',
+ 'image/png': 'bi-file-earmark-image',
+ 'image/jpeg': 'bi-file-earmark-image',
+ 'image/bmp': 'bi-file-earmark-image',
+ 'image/webp': 'bi-file-earmark-image',
+ 'image/tiff': 'bi-file-earmark-image',
+ 'image/svg+xml': 'bi-file-earmark-image',
+
+ // text
+ 'text/plain': 'bi-file-earmark-font',
+
+ // code
+ 'text/javascript': 'bi-file-earmark-code',
+ 'application/json': 'bi-file-earmark-code',
+ 'text/markdown': 'bi-file-earmark-code',
+ 'text/html': 'bi-file-earmark-code',
+ 'text/css': 'bi-file-earmark-code',
+
+ // audio
+ 'audio/midi': 'bi-file-earmark-music',
+ 'audio/mpeg': 'bi-file-earmark-music',
+ 'audio/webm': 'bi-file-earmark-music',
+ 'audio/ogg': 'bi-file-earmark-music',
+ 'audio/wav': 'bi-file-earmark-music',
+ 'audio/aac': 'bi-file-earmark-music',
+ 'audio/x-wav': 'bi-file-earmark-music',
+ 'audio/mp4': 'bi-file-earmark-music',
+
+ // video
+ 'video/webm': 'bi-file-earmark-play',
+ 'video/ogg': 'bi-file-earmark-play',
+ 'video/mpeg': 'bi-file-earmark-play',
+ 'video/3gpp': 'bi-file-earmark-play',
+ 'video/x-flv': 'bi-file-earmark-play',
+ 'video/mp4': 'bi-file-earmark-play',
+ 'video/quicktime': 'bi-file-earmark-play',
+ 'video/x-msvideo': 'bi-file-earmark-play',
+ 'video/vnd.dlna.mpeg-tts': 'bi-file-earmark-play',
+
+ // archive
+ 'application/x-bzip': 'bi-file-earmark-zip',
+ 'application/x-bzip2': 'bi-file-earmark-zip',
+ 'application/x-tar': 'bi-file-earmark-zip',
+ 'application/gzip': 'bi-file-earmark-zip',
+ 'application/zip': 'bi-file-earmark-zip',
+ 'application/x-7z-compressed': 'bi-file-earmark-zip',
+ 'application/x-rar-compressed': 'bi-file-earmark-zip',
+
+ // application
+ 'application/pdf': 'bi-file-earmark-pdf',
+ 'application/rtf': 'bi-file-earmark-word',
+ 'application/msword': 'bi-file-earmark-word',
+
+ 'application/vnd.ms-word': 'bi-file-earmark-word',
+ 'application/vnd.ms-excel': 'bi-file-earmark-excel',
+ 'application/vnd.ms-powerpoint': 'bi-file-earmark-ppt',
+
+ 'application/vnd.oasis.opendocument.text': 'bi-file-earmark-word',
+ 'application/vnd.oasis.opendocument.spreadsheet': 'bi-file-earmark-excel',
+ 'application/vnd.oasis.opendocument.presentation': 'bi-file-earmark-ppt',
+
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml': 'bi-file-earmark-word',
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml': 'bi-file-earmark-excel',
+ 'application/vnd.openxmlformats-officedocument.presentationml': 'bi-file-earmark-ppt',
+ };
+
+ if (mimeTypes[mime] !== undefined) {
+ return mimeTypes[mime];
+ }
+
+ // file blank
+ return 'bi-file-earmark';
+ },
+
+ /**
+ * File extension to icon (font awesome)
+ * @returns {*}
+ * @param extension
+ */
+ extensionToIcon(extension) {
+ // files extensions
+ const extensionTypes = {
+ // images
+ gif: 'bi-file-earmark-image',
+ png: 'bi-file-earmark-image',
+ jpeg: 'bi-file-earmark-image',
+ jpg: 'bi-file-earmark-image',
+ bmp: 'bi-file-earmark-image',
+ psd: 'bi-file-earmark-image',
+ svg: 'bi-file-earmark-image',
+ ico: 'bi-file-earmark-image',
+ ai: 'bi-file-earmark-image',
+ tif: 'bi-file-earmark-image',
+ tiff: 'bi-file-earmark-image',
+ webp: 'bi-file-earmark-image',
+
+ // text
+ txt: 'bi-file-earmark-font',
+ json: 'bi-file-earmark-font',
+ log: 'bi-file-earmark-font',
+ ini: 'bi-file-earmark-font',
+ xml: 'bi-file-earmark-font',
+ md: 'bi-file-earmark-font',
+ env: 'bi-file-earmark-font',
+
+ // code
+ js: 'bi-file-earmark-code',
+ php: 'bi-file-earmark-code',
+ css: 'bi-file-earmark-code',
+ cpp: 'bi-file-earmark-code',
+ class: 'bi-file-earmark-code',
+ h: 'bi-file-earmark-code',
+ java: 'bi-file-earmark-code',
+ sh: 'bi-file-earmark-code',
+ swift: 'bi-file-earmark-code',
+
+ // audio
+ aif: 'bi-file-earmark-music',
+ cda: 'bi-file-earmark-music',
+ mid: 'bi-file-earmark-music',
+ mp3: 'bi-file-earmark-music',
+ mpa: 'bi-file-earmark-music',
+ ogg: 'bi-file-earmark-music',
+ wav: 'bi-file-earmark-music',
+ wma: 'bi-file-earmark-music',
+
+ // video
+ wmv: 'bi-file-earmark-play',
+ avi: 'bi-file-earmark-play',
+ mpeg: 'bi-file-earmark-play',
+ mpg: 'bi-file-earmark-play',
+ flv: 'bi-file-earmark-play',
+ mp4: 'bi-file-earmark-play',
+ mkv: 'bi-file-earmark-play',
+ mov: 'bi-file-earmark-play',
+ ts: 'bi-file-earmark-play',
+ '3gpp': 'bi-file-earmark-play',
+
+ // archive
+ zip: 'bi-file-earmark-zip',
+ arj: 'bi-file-earmark-zip',
+ deb: 'bi-file-earmark-zip',
+ pkg: 'bi-file-earmark-zip',
+ rar: 'bi-file-earmark-zip',
+ rpm: 'bi-file-earmark-zip',
+ '7z': 'bi-file-earmark-zip',
+ 'tar.gz': 'bi-file-earmark-zip',
+
+ // application
+ pdf: 'bi-file-earmark-pdf',
+
+ rtf: 'bi-file-earmark-word',
+ doc: 'bi-file-earmark-word',
+ docx: 'bi-file-earmark-word',
+ odt: 'bi-file-earmark-word',
+
+ xlr: 'bi-file-earmark-excel',
+ xls: 'bi-file-earmark-excel',
+ xlsx: 'bi-file-earmark-excel',
+
+ ppt: 'bi-file-earmark-ppt',
+ pptx: 'bi-file-earmark-ppt',
+ pptm: 'bi-file-earmark-ppt',
+ xps: 'bi-file-earmark-ppt',
+ potx: 'bi-file-earmark-ppt',
+ };
+
+ if (extension && extensionTypes[extension.toLowerCase()] !== undefined) {
+ return extensionTypes[extension.toLowerCase()];
+ }
+
+ // blank file
+ return 'bi-file-earmark';
+ },
},
- },
- methods: {
- /**
- * Bytes to KB, MB, ..
- * @param bytes
- * @returns {string}
- */
- bytesToHuman(bytes) {
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
-
- if (bytes === 0) return 'n/a';
-
- const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
-
- if (i === 0) return `${bytes} ${sizes[i]}`;
-
- return `${(bytes / (1024 ** i)).toFixed(1)} ${sizes[i]}`;
- },
-
- /**
- * Timestamp to date
- * @param timestamp
- * @returns {string}
- */
- timestampToDate(timestamp) {
- // if date not defined
- if (timestamp === undefined) return '-';
-
- const date = new Date(timestamp * 1000);
-
- return date.toLocaleString();
- },
-
- /**
- * Mime type to icon
- * @param mime
- * @returns {*}
- */
- mimeToIcon(mime) {
- // mime types
- const mimeTypes = {
-
- // image
- 'image/gif': 'fa-file-image',
- 'image/png': 'fa-file-image',
- 'image/jpeg': 'fa-file-image',
- 'image/bmp': 'fa-file-image',
- 'image/webp': 'fa-file-image',
- 'image/tiff': 'fa-file-image',
- 'image/svg+xml': 'fa-file-image',
-
- // text
- 'text/plain': 'fa-file-alt',
-
- // code
- 'text/javascript': 'fa-file-code',
- 'application/json': 'fa-file-code',
- 'text/markdown': 'fa-file-code',
- 'text/html': 'fa-file-code',
- 'text/css': 'fa-file-code',
-
- // audio
- 'audio/midi': 'fa-file-audio',
- 'audio/mpeg': 'fa-file-audio',
- 'audio/webm': 'fa-file-audio',
- 'audio/ogg': 'fa-file-audio',
- 'audio/wav': 'fa-file-audio',
- 'audio/aac': 'fa-file-audio',
- 'audio/x-wav': 'fa-file-audio',
- 'audio/mp4': 'fa-file-audio',
-
- // video
- 'video/webm': 'fa-file-video',
- 'video/ogg': 'fa-file-video',
- 'video/mpeg': 'fa-file-video',
- 'video/3gpp': 'fa-file-video',
- 'video/x-flv': 'fa-file-video',
- 'video/mp4': 'fa-file-video',
- 'video/quicktime': 'fa-file-video',
- 'video/x-msvideo': 'fa-file-video',
- 'video/vnd.dlna.mpeg-tts': 'fa-file-video',
-
- // archive
- 'application/x-bzip': 'fa-file-archive',
- 'application/x-bzip2': 'fa-file-archive',
- 'application/x-tar': 'fa-file-archive',
- 'application/gzip': 'fa-file-archive',
- 'application/zip': 'fa-file-archive',
- 'application/x-7z-compressed': 'fa-file-archive',
- 'application/x-rar-compressed': 'fa-file-archive',
-
- // application
- 'application/pdf': 'fa-file-pdf',
- 'application/rtf': 'fa-file-word',
- 'application/msword': 'fa-file-word',
-
- 'application/vnd.ms-word': 'fa-file-word',
- 'application/vnd.ms-excel': 'fa-file-excel',
- 'application/vnd.ms-powerpoint': 'fa-file-powerpoint',
-
- 'application/vnd.oasis.opendocument.text': 'fa-file-word',
- 'application/vnd.oasis.opendocument.spreadsheet': 'fa-file-excel',
- 'application/vnd.oasis.opendocument.presentation': 'fa-file-powerpoint',
-
- 'application/vnd.openxmlformats-officedocument.wordprocessingml': 'fa-file-word',
- 'application/vnd.openxmlformats-officedocument.spreadsheetml': 'fa-file-excel',
- 'application/vnd.openxmlformats-officedocument.presentationml': 'fa-file-powerpoint',
- };
-
- if (mimeTypes[mime] !== undefined) {
- return mimeTypes[mime];
- }
-
- // file blank
- return 'fa-file';
- },
-
- /**
- * File extension to icon (font awesome)
- * @returns {*}
- * @param extension
- */
- extensionToIcon(extension) {
- // files extensions
- const extensionTypes = {
-
- // images
- gif: 'fa-file-image',
- png: 'fa-file-image',
- jpeg: 'fa-file-image',
- jpg: 'fa-file-image',
- bmp: 'fa-file-image',
- psd: 'fa-file-image',
- svg: 'fa-file-image',
- ico: 'fa-file-image',
- ai: 'fa-file-image',
- tif: 'fa-file-image',
- tiff: 'fa-file-image',
-
- // text
- txt: 'fa-file-alt',
-
- // code
- js: 'fa-file-code',
- php: 'fa-file-code',
- css: 'fa-file-code',
- cpp: 'fa-file-code',
- class: 'fa-file-code',
- h: 'fa-file-code',
- java: 'fa-file-code',
- sh: 'fa-file-code',
- swift: 'fa-file-code',
-
- // audio
- aif: 'fa-file-audio',
- cda: 'fa-file-audio',
- mid: 'fa-file-audio',
- mp3: 'fa-file-audio',
- mpa: 'fa-file-audio',
- ogg: 'fa-file-audio',
- wav: 'fa-file-audio',
- wma: 'fa-file-audio',
-
- // video
- wmv: 'fa-file-video',
- avi: 'fa-file-video',
- mpeg: 'fa-file-video',
- mpg: 'fa-file-video',
- flv: 'fa-file-video',
- mp4: 'fa-file-video',
- mkv: 'fa-file-video',
- mov: 'fa-file-video',
- ts: 'fa-file-video',
- '3gpp': 'fa-file-video',
-
- // archive
- zip: 'fa-file-archive',
- arj: 'fa-file-archive',
- deb: 'fa-file-archive',
- pkg: 'fa-file-archive',
- rar: 'fa-file-archive',
- rpm: 'fa-file-archive',
- '7z': 'fa-file-archive',
- 'tar.gz': 'fa-file-archive',
-
- // application
- pdf: 'fa-file-pdf',
-
- rtf: 'fa-file-word',
- doc: 'fa-file-word',
- docx: 'fa-file-word',
- odt: 'fa-file-word',
-
- xlr: 'fa-file-excel',
- xls: 'fa-file-excel',
- xlsx: 'fa-file-excel',
-
- ppt: 'fa-file-powerpoint',
- pptx: 'fa-file-powerpoint',
- pptm: 'fa-file-powerpoint',
- xps: 'fa-file-powerpoint',
- potx: 'fa-file-powerpoint',
- };
-
- if (extension && extensionTypes[extension.toLowerCase()] !== undefined) {
- return extensionTypes[extension.toLowerCase()];
- }
-
- // blank file
- return 'fa-file';
- },
- },
};
diff --git a/src/mixins/manager.js b/src/mixins/manager.js
deleted file mode 100644
index a2352ad..0000000
--- a/src/mixins/manager.js
+++ /dev/null
@@ -1,109 +0,0 @@
-// Event bus
-import EventBus from './../eventBus';
-
-export default {
- computed: {
- selectedDisk() {
- return this.$store.state.fm[this.manager].selectedDisk;
- },
-
- // Selected directory
- selectedDirectory() {
- return this.$store.state.fm[this.manager].selectedDirectory;
- },
-
- // files list for selected directory
- files() {
- return this.$store.state.fm[this.manager].files;
- },
-
- // directories list for selected directory
- directories() {
- return this.$store.state.fm[this.manager].directories;
- },
-
- // selected files and folders
- selected() {
- return this.$store.state.fm[this.manager].selected;
- },
- },
- methods: {
- /**
- * Load selected directory and show files
- * @param path
- */
- selectDirectory(path) {
- this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path, history: true });
- },
-
- // Level up directory
- levelUp() {
- // if this a not root directory
- if (this.selectedDirectory) {
- // calculate up directory path
- const pathUp = this.selectedDirectory.split('/').slice(0, -1).join('/');
-
- // load directory
- this.$store.dispatch(`fm/${this.manager}/selectDirectory`, { path: pathUp || null, history: true });
- }
- },
-
- /**
- * Check item - selected
- * @param type
- * @param path
- */
- checkSelect(type, path) {
- return this.selected[type].includes(path);
- },
-
- /**
- * Select items in list (files + folders)
- * @param type
- * @param path
- * @param event
- */
- selectItem(type, path, event) {
- // search in selected array
- const alreadySelected = this.selected[type].includes(path);
-
- // if pressed Ctrl -> multi select
- if (event.ctrlKey) {
- if (!alreadySelected) {
- // add new selected item
- this.$store.commit(`fm/${this.manager}/setSelected`, { type, path });
- } else {
- // remove selected item
- this.$store.commit(`fm/${this.manager}/removeSelected`, { type, path });
- }
- }
-
- // single select
- if (!event.ctrlKey && !alreadySelected) this.$store.commit(`fm/${this.manager}/changeSelected`, { type, path });
- },
-
- /**
- * Show context menu
- * @param item
- * @param event
- */
- contextMenu(item, event) {
- // el type
- const type = item.type === 'dir' ? 'directories' : 'files';
- // search in selected array
- const alreadySelected = this.selected[type].includes(item.path);
-
- // select this element
- if (!alreadySelected) {
- // select item
- this.$store.commit(`fm/${this.manager}/changeSelected`, {
- type,
- path: item.path,
- });
- }
-
- // create event
- EventBus.$emit('contextMenu', event);
- },
- },
-};
diff --git a/src/mixins/modal.js b/src/mixins/modal.js
deleted file mode 100644
index 1253e77..0000000
--- a/src/mixins/modal.js
+++ /dev/null
@@ -1,30 +0,0 @@
-export default {
- directives: {
- /**
- * AutoFocus for inputs
- */
- focus: {
- inserted(el) {
- el.focus();
- },
- },
- },
- computed: {
- // active manager
- activeManager() {
- return this.$store.state.fm.activeManager;
- },
- },
- methods: {
- /**
- * Hide modal window
- */
- hideModal() {
- this.$store.commit('fm/modal/setModalState', {
- modalName: null,
- show: false,
- });
- },
-
- },
-};
diff --git a/src/mixins/translate.js b/src/mixins/translate.js
new file mode 100644
index 0000000..007a95c
--- /dev/null
+++ b/src/mixins/translate.js
@@ -0,0 +1,21 @@
+export default {
+ computed: {
+ /**
+ * Selected translate
+ * @returns {*}
+ */
+ lang() {
+ // If selected translations exists
+ if (
+ Object.prototype.hasOwnProperty.call(
+ this.$store.state.fm.settings.translations,
+ this.$store.state.fm.settings.lang
+ )
+ ) {
+ return this.$store.state.fm.settings.translations[this.$store.state.fm.settings.lang];
+ }
+ // default translate - en
+ return this.$store.state.fm.settings.translations.en;
+ },
+ },
+};
diff --git a/src/store.js b/src/store.js
new file mode 100644
index 0000000..346dde3
--- /dev/null
+++ b/src/store.js
@@ -0,0 +1,27 @@
+// store modules
+import tree from './store/tree/store';
+import modal from './store/modal/store';
+import settings from './store/settings/store';
+import manager from './store/manager/store';
+import messages from './store/messages/store';
+// main store
+import state from './store/state';
+import mutations from './store/mutations';
+import getters from './store/getters';
+import actions from './store/actions';
+
+export default {
+ namespaced: true,
+ modules: {
+ settings,
+ left: manager,
+ right: manager,
+ tree,
+ modal,
+ messages,
+ },
+ state,
+ mutations,
+ actions,
+ getters,
+};
diff --git a/src/store/actions.js b/src/store/actions.js
index c50b007..0e59211 100644
--- a/src/store/actions.js
+++ b/src/store/actions.js
@@ -1,373 +1,584 @@
-/* eslint-disable max-len */
-import GET from '../http/get-queries';
-import POST from '../http/post-queries';
+/* eslint-disable max-len,prefer-destructuring,object-curly-newline */
+import GET from '../http/get';
+import POST from '../http/post';
export default {
- /**
- * Get init data from server
- * @param context
- */
- initializeApp(context) {
- GET.initialize().then((response) => {
- if (response.data.result.status === 'success') {
- // set app settings
- context.commit('settings/initSettings', response.data.config);
-
- // set disk list
- context.commit('setDiskList', response.data.config.diskList);
-
- const leftDisk = response.data.config.leftDisk
- ? response.data.config.leftDisk
- : response.data.config.diskList[0];
-
- const rightDisk = response.data.config.rightDisk
- ? response.data.config.rightDisk
- : response.data.config.diskList[0];
-
- // left manager - set default disk
- context.commit('left/setDisk', leftDisk);
-
- // load content to the left file manager
- context.dispatch('getLoadContent', {
- manager: 'left',
- disk: leftDisk,
- path: null,
+ /**
+ * Get initiation data from server
+ * @param state
+ * @param commit
+ * @param getters
+ * @param dispatch
+ */
+ initializeApp({ state, commit, getters, dispatch }) {
+ GET.initialize().then((response) => {
+ if (response.data.result.status === 'success') {
+ commit('settings/initSettings', response.data.config);
+ commit('setDisks', response.data.config.disks);
+
+ let leftDisk = response.data.config.leftDisk ? response.data.config.leftDisk : getters.diskList[0];
+
+ let rightDisk = response.data.config.rightDisk ? response.data.config.rightDisk : getters.diskList[0];
+
+ // paths
+ let leftPath = response.data.config.leftPath;
+ let rightPath = response.data.config.rightPath;
+
+ // find disk and path settings in the URL
+ if (window.location.search) {
+ const params = new URLSearchParams(window.location.search);
+
+ if (params.get('leftDisk')) {
+ leftDisk = params.get('leftDisk');
+ }
+
+ if (params.get('rightDisk')) {
+ rightDisk = params.get('rightDisk');
+ }
+
+ if (params.get('leftPath')) {
+ leftPath = params.get('leftPath');
+ }
+
+ if (params.get('rightPath')) {
+ rightPath = params.get('rightPath');
+ }
+ }
+
+ commit('left/setDisk', leftDisk);
+
+ // if leftPath not null
+ if (leftPath) {
+ commit('left/setSelectedDirectory', leftPath);
+ commit('left/addToHistory', leftPath);
+ }
+
+ dispatch('getLoadContent', {
+ manager: 'left',
+ disk: leftDisk,
+ path: leftPath,
+ });
+
+ // if selected left and right managers
+ if (state.settings.windowsConfig === 3) {
+ commit('right/setDisk', rightDisk);
+
+ // if rightPath not null
+ if (rightPath) {
+ commit('right/setSelectedDirectory', rightPath);
+ commit('right/addToHistory', rightPath);
+ }
+
+ dispatch('getLoadContent', {
+ manager: 'right',
+ disk: rightDisk,
+ path: rightPath,
+ });
+ } else if (state.settings.windowsConfig === 2) {
+ // if selected left manager and directories tree
+ // init directories tree
+ dispatch('tree/initTree', leftDisk).then(() => {
+ if (leftPath) {
+ // reopen folders if path not null
+ dispatch('tree/reopenPath', leftPath);
+ }
+ });
+ }
+ }
});
+ },
+
+ /**
+ * Download files and folders to the selected file manager
+ * @param context
+ * @param manager
+ * @param disk
+ * @param path
+ */
+ getLoadContent(context, { manager, disk, path }) {
+ GET.content(disk, path).then((response) => {
+ if (response.data.result.status === 'success') {
+ context.commit(`${manager}/setDirectoryContent`, response.data);
+ }
+ });
+ },
+
+ /**
+ * Select disk
+ * @param state
+ * @param commit
+ * @param dispatch
+ * @param disk
+ * @param manager
+ */
+ selectDisk({ state, commit, dispatch }, { disk, manager }) {
+ GET.selectDisk(disk).then((response) => {
+ // if disk exist => change disk
+ if (response.data.result.status === 'success') {
+ // set disk name
+ commit(`${manager}/setDisk`, disk);
+
+ // reset history
+ commit(`${manager}/resetHistory`);
+
+ // reinitialize tree if directories tree is shown
+ if (state.settings.windowsConfig === 2) {
+ dispatch('tree/initTree', disk);
+ }
+
+ // download content for root path
+ dispatch(`${manager}/selectDirectory`, { path: null, history: false });
+ }
+ });
+ },
+
+ /**
+ * Create new file
+ * @param getters
+ * @param dispatch
+ * @param fileName
+ * @returns {Promise}
+ */
+ createFile({ getters, dispatch }, fileName) {
+ // directory for new file
+ const selectedDirectory = getters.selectedDirectory;
+
+ // create new file, server side
+ return POST.createFile(getters.selectedDisk, selectedDirectory, fileName).then((response) => {
+ // update file list
+ dispatch('updateContent', {
+ response,
+ oldDir: selectedDirectory,
+ commitName: 'addNewFile',
+ type: 'file',
+ });
- // initialize the app depending on the settings
- if (context.state.settings.windowsConfig === 3) {
- // if selected left and right managers
- context.commit('right/setDisk', rightDisk);
-
- // load content to the right file manager
- context.dispatch('getLoadContent', {
- manager: 'right',
- disk: rightDisk,
- path: null,
- });
- } else if (context.state.settings.windowsConfig === 2) {
- // if selected left manager and directories tree
- // init directories tree
- context.dispatch('tree/initTree', leftDisk);
- }
- }
- });
- },
-
- /**
- * Download files and folders to the selected file manager
- * @param context
- * @param manager
- * @param disk
- * @param path
- */
- getLoadContent(context, { manager, disk, path }) {
- GET.content(disk, path).then((response) => {
- if (response.data.result.status === 'success') {
- context.commit(`${manager}/setDirectoryContent`, response.data);
- }
- });
- },
-
-
- /**
- * SelectDisk
- * @param context
- * @param disk
- * @param manager
- */
- selectDisk(context, { disk, manager }) {
- GET.selectDisk(disk).then((response) => {
- // if disk exist => change disk
- if (response.data.result.status === 'success') {
- // set disk name
- context.commit(`${manager}/setDisk`, disk);
-
- // reset history
- context.commit(`${manager}/resetHistory`);
-
- // reinitialize tree if directories tree is shown
- if (context.state.settings.windowsConfig === 2) {
- context.dispatch('tree/initTree', disk);
- }
+ return response;
+ });
+ },
+
+ /**
+ * Get file content
+ * @param context
+ * @param disk
+ * @param path
+ * @returns {*}
+ */
+ getFile(context, { disk, path }) {
+ return GET.getFile(disk, path);
+ },
+
+ /**
+ * Update file
+ * @param getters
+ * @param dispatch
+ * @param formData
+ * @returns {PromiseLike | Promise}
+ */
+ updateFile({ getters, dispatch }, formData) {
+ return POST.updateFile(formData).then((response) => {
+ // update file list
+ dispatch('updateContent', {
+ response,
+ oldDir: getters.selectedDirectory,
+ commitName: 'updateFile',
+ type: 'file',
+ });
- // download content for root path
- context.dispatch(`${manager}/selectDirectory`, { path: null, history: false });
- }
- });
- },
-
- /**
- * Refresh All
- * @param context
- */
- refreshAll(context) {
- if (context.state.settings.windowsConfig === 2) {
- // refresh tree
- return context.dispatch('tree/initTree', context.state.left.selectedDisk).then(() => Promise.all([
- // reopen folders if need
- context.dispatch('tree/reopenPath', context.getters.selectedDirectory),
- // refresh manager/s
- context.dispatch('refreshManagers'),
- ]));
- }
- // refresh manager/s
- return context.dispatch('refreshManagers');
- },
-
- /**
- * Refresh content in the manager/s
- * @param context
- */
- refreshManagers(context) {
- // select what needs to be an updated
- if (context.rootState.fm.settings.windowsConfig === 3) {
- return Promise.all([
- // left manager
- context.dispatch('left/refreshDirectory'),
- // right manager
- context.dispatch('right/refreshDirectory'),
- ]);
- }
-
- // only left manager
- return context.dispatch('left/refreshDirectory');
- },
-
- /**
- * Create new directory
- * @param context
- * @param folderName
- */
- createDirectory(context, folderName) {
- // directory for new folder
- const selectedDirectory = context.getters.selectedDirectory;
-
- // create new directory, server side
- return POST.createDirectory(
- context.getters.selectedDisk,
- selectedDirectory,
- folderName,
- ).then((response) => {
- // if folder created successfully
- if (
- response.data.result.status === 'success'
- && selectedDirectory === context.getters.selectedDirectory
- ) {
- // active manager name
- const activeManager = context.state.activeManager;
-
- // add new folder in to the folders list
- context.commit(
- `${activeManager}/addNewDirectory`,
- response.data.directory,
- );
-
- // repeat sort
- context.dispatch(`${activeManager}/sortBy`, {
- field: context.state[activeManager].sort.field,
- direction: context.state[activeManager].sort.direction,
+ return response;
});
+ },
+
+ /**
+ * Create new directory
+ * @param getters
+ * @param dispatch
+ * @param name
+ * @returns {*}
+ */
+ createDirectory({ getters, dispatch }, name) {
+ // directory for new folder
+ const selectedDirectory = getters.selectedDirectory;
+
+ // create new directory, server side
+ return POST.createDirectory({
+ disk: getters.selectedDisk,
+ path: selectedDirectory,
+ name,
+ }).then((response) => {
+ // update file list
+ dispatch('updateContent', {
+ response,
+ oldDir: selectedDirectory,
+ commitName: 'addNewDirectory',
+ type: 'directory',
+ });
- // if tree module is showing
- if (context.state.settings.windowsConfig === 2) {
- // update tree module
- context.dispatch('tree/addToTree',
- {
- parentPath: selectedDirectory,
- newDirectory: response.data.tree,
+ return response;
+ });
+ },
+
+ /**
+ * Upload file or files
+ * @param getters
+ * @param commit
+ * @param dispatch
+ * @param files
+ * @param overwrite
+ * @returns {Promise}
+ */
+ upload({ getters, commit, dispatch }, { files, overwrite }) {
+ // directory where files will be uploaded
+ const selectedDirectory = getters.selectedDirectory;
+
+ // create new form data
+ const data = new FormData();
+ data.append('disk', getters.selectedDisk);
+ data.append('path', selectedDirectory || '');
+ data.append('overwrite', overwrite);
+ // add file or files
+ for (let i = 0; i < files.length; i += 1) {
+ data.append('files[]', files[i]);
+ }
+
+ // axios config - progress bar
+ const config = {
+ onUploadProgress(progressEvent) {
+ const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);
+ commit('messages/setProgress', progress);
+ },
+ };
+
+ // upload files
+ return POST.upload(data, config)
+ .then((response) => {
+ // clear progress
+ commit('messages/clearProgress');
+
+ if (response.data.result.status === 'success' && selectedDirectory === getters.selectedDirectory) {
+ dispatch('refreshManagers');
+ }
+
+ return response;
+ })
+ .catch(() => {
+ commit('messages/clearProgress');
+ });
+ },
+
+ /**
+ * Delete selected files and folders
+ * @param state
+ * @param getters
+ * @param dispatch
+ * @param items
+ * @returns {*}
+ */
+ delete({ state, getters, dispatch }, items) {
+ return POST.delete({
+ disk: getters.selectedDisk,
+ items,
+ }).then((response) => {
+ // if all items deleted successfully
+ if (response.data.result.status === 'success') {
+ dispatch('refreshManagers');
+
+ // delete directories from tree
+ if (state.settings.windowsConfig === 2) {
+ const onlyDir = items.filter((item) => item.type === 'dir');
+ dispatch('tree/deleteFromTree', onlyDir);
+ }
+ }
+
+ return response;
+ });
+ },
+
+ /**
+ * Paste files and folders
+ * @param state
+ * @param commit
+ * @param getters
+ * @param dispatch
+ */
+ paste({ state, commit, getters, dispatch }) {
+ POST.paste({
+ disk: getters.selectedDisk,
+ path: getters.selectedDirectory,
+ clipboard: state.clipboard,
+ }).then((response) => {
+ // if the action was successful
+ if (response.data.result.status === 'success') {
+ dispatch('refreshAll');
+
+ // if action - cut - clear clipboard
+ if (state.clipboard.type === 'cut') {
+ commit('resetClipboard');
+ }
+ }
+ });
+ },
+
+ /**
+ * Rename file or folder
+ * @param getters
+ * @param dispatch
+ * @param type
+ * @param newName
+ * @param oldName
+ * @returns {Promise}
+ */
+ rename({ getters, dispatch }, { type, newName, oldName }) {
+ return POST.rename({
+ disk: getters.selectedDisk,
+ newName,
+ oldName,
+ type,
+ }).then((response) => {
+ if (type === 'dir') {
+ dispatch('refreshAll');
+ } else {
+ dispatch('refreshManagers');
+ }
+
+ return response;
+ });
+ },
+
+ /**
+ * Get file url
+ * @param store
+ * @param disk
+ * @param path
+ * @returns {Promise}
+ */
+ url(http://github.com/store,%20%7B%20disk,%20path%20%7D) {
+ return GET.url(http://github.com/disk,%20path);
+ },
+
+ /**
+ * Zip files and folders
+ * @param state
+ * @param getters
+ * @param dispatch
+ * @param name
+ * @returns {*|PromiseLike|Promise}
+ */
+ zip({ state, getters, dispatch }, name) {
+ const selectedDirectory = getters.selectedDirectory;
+
+ return POST.zip({
+ disk: getters.selectedDisk,
+ path: selectedDirectory,
+ name,
+ elements: state[state.activeManager].selected,
+ }).then((response) => {
+ // if zipped successfully
+ if (response.data.result.status === 'success' && selectedDirectory === getters.selectedDirectory) {
+ dispatch('refreshManagers');
+ }
+
+ return response;
+ });
+ },
+
+ /**
+ * Unzip selected archive
+ * @param getters
+ * @param dispatch
+ * @param folder
+ * @returns {*}
+ */
+ unzip({ getters, dispatch }, folder) {
+ const selectedDirectory = getters.selectedDirectory;
+
+ return POST.unzip({
+ disk: getters.selectedDisk,
+ path: getters.selectedItems[0].path,
+ folder,
+ }).then((response) => {
+ // if unzipped successfully
+ if (response.data.result.status === 'success' && selectedDirectory === getters.selectedDirectory) {
+ // refresh
+ dispatch('refreshAll');
+ }
+
+ return response;
+ });
+ },
+
+ /**
+ * Add selected items to clipboard
+ * @param state
+ * @param commit
+ * @param getters
+ * @param type
+ */
+ toClipboard({ state, commit, getters }, type) {
+ // if files are selected
+ if (getters[`${state.activeManager}/selectedCount`]) {
+ commit('setClipboard', {
+ type,
+ disk: state[state.activeManager].selectedDisk,
+ directories: state[state.activeManager].selected.directories.slice(0),
+ files: state[state.activeManager].selected.files.slice(0),
});
+ }
+ },
+
+ /**
+ * Refresh content in the manager/s
+ * @param dispatch
+ * @param state
+ * @returns {*}
+ */
+ refreshManagers({ dispatch, state }) {
+ // select what needs to be an updated
+ if (state.settings.windowsConfig === 3) {
+ return Promise.all([
+ // left manager
+ dispatch('left/refreshDirectory'),
+ // right manager
+ dispatch('right/refreshDirectory'),
+ ]);
+ }
- // if showing two window manager
- } else if (context.state.settings.windowsConfig === 3) {
- // add a new folder if in the another manager showing the same folder
- if (context.state.left.selectedDirectory === context.state.right.selectedDirectory
- && context.state.left.selectedDisk === context.state.right.selectedDisk) {
- // add new folder in folders list (inactive manager)
- context.commit(
- `${context.getters.inactiveManager}/addNewDirectory`,
- response.data.directory,
+ // only left manager
+ return dispatch('left/refreshDirectory');
+ },
+
+ /**
+ * Refresh All
+ * @param state
+ * @param getters
+ * @param dispatch
+ * @returns {*}
+ */
+ refreshAll({ state, getters, dispatch }) {
+ if (state.settings.windowsConfig === 2) {
+ // refresh tree
+ return dispatch('tree/initTree', state.left.selectedDisk).then(() =>
+ Promise.all([
+ // reopen folders if need
+ dispatch('tree/reopenPath', getters.selectedDirectory),
+ // refresh manager/s
+ dispatch('refreshManagers'),
+ ])
);
- }
}
- }
-
- return response;
- });
- },
-
- /**
- * Upload file or files
- * @param context
- * @param files
- * @param overwrite
- */
- upload(context, { files, overwrite }) {
- // create new form data
- const data = new FormData();
- // directory where files will be uploaded
- const selectedDirectory = context.getters.selectedDirectory;
-
- // add disk name
- data.append('disk', context.getters.selectedDisk);
-
- // add path name
- data.append('path', selectedDirectory || '');
-
- // upload settings
- data.append('overwrite', overwrite);
-
- // add file or files
- for (let i = 0; i < files.length; i += 1) {
- data.append('files[]', files[i]);
- }
-
- // axios config - progress bar
- const config = {
- onUploadProgress(progressEvent) {
- const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);
- context.commit('messages/setProgress', progress);
- },
- };
-
- // upload files
- return POST.upload(data, config).then((response) => {
- // clear progress
- context.commit('messages/clearProgress');
-
- // if files uploaded successfully
- if (
- response.data.result.status === 'success'
- && selectedDirectory === context.getters.selectedDirectory
- ) {
- // refresh content
- context.dispatch('refreshManagers');
- }
-
- return response;
- }).catch(() => {
- // clear progress
- context.commit('messages/clearProgress');
- });
- },
-
- /**
- * Delete selected files and folders
- * @param context
- * @param items
- */
- delete(context, items) {
- return POST.delete(
- context.getters.selectedDisk,
- items,
- ).then((response) => {
- // if all items deleted successfully
- if (response.data.result.status === 'success') {
- // refresh content
- context.dispatch('refreshManagers');
-
- // delete directories from tree
- if (context.state.settings.windowsConfig === 2) {
- const onlyDir = items.filter(item => item.type === 'dir');
- context.dispatch('tree/deleteFromTree', onlyDir);
+ // refresh manager/s
+ return dispatch('refreshManagers');
+ },
+
+ /**
+ * Repeat sorting
+ * @param state
+ * @param dispatch
+ * @param manager
+ */
+ repeatSort({ state, dispatch }, manager) {
+ dispatch(`${manager}/sortBy`, {
+ field: state[manager].sort.field,
+ direction: state[manager].sort.direction,
+ });
+ },
+
+ /**
+ * Update content - files, folders after create or update
+ * @param state
+ * @param commit
+ * @param getters
+ * @param dispatch
+ * @param response
+ * @param oldDir
+ * @param commitName
+ * @param type
+ */
+ updateContent({ state, commit, getters, dispatch }, { response, oldDir, commitName, type }) {
+ // if operation success
+ if (response.data.result.status === 'success' && oldDir === getters.selectedDirectory) {
+ // add/update file/folder in to the files/folders list
+ commit(`${state.activeManager}/${commitName}`, response.data[type]);
+ // repeat sort
+ dispatch('repeatSort', state.activeManager);
+
+ // if tree module is showing
+ if (type === 'directory' && state.settings.windowsConfig === 2) {
+ // update tree module
+ dispatch('tree/addToTree', {
+ parentPath: oldDir,
+ newDirectory: response.data.tree,
+ });
+
+ // if both managers show the same folder
+ } else if (
+ state.settings.windowsConfig === 3 &&
+ state.left.selectedDirectory === state.right.selectedDirectory &&
+ state.left.selectedDisk === state.right.selectedDisk
+ ) {
+ // add/update file/folder in to the files/folders list (inactive manager)
+ commit(`${getters.inactiveManager}/${commitName}`, response.data[type]);
+ // repeat sort
+ dispatch('repeatSort', getters.inactiveManager);
+ }
}
- }
-
- return response;
- });
- },
-
- /**
- * Add selected items to clipboard
- * @param context
- * @param type
- */
- toClipboard(context, type) {
- const activeManager = context.state.activeManager;
-
- if (context.getters[`${activeManager}/selectedCount`]) {
- context.commit('setClipboard', {
- type,
- disk: context.state[activeManager].selectedDisk,
- directories: context.state[activeManager].selected.directories.map(item => item),
- files: context.state[activeManager].selected.files.map(item => item),
- });
- }
- },
-
- /**
- * Paste files and folders
- * @param context
- */
- paste(context) {
- // create new form data
- const data = new FormData();
- // copy/cut to this folder
- const selectedDirectory = context.getters.selectedDirectory;
-
- // add disk name
- data.append('disk', context.getters.selectedDisk);
-
- // add path name
- data.append('path', selectedDirectory);
-
- // add clipboard
- data.append('clipboard', JSON.stringify(context.state.clipboard));
-
- POST.paste(
- context.getters.selectedDisk,
- selectedDirectory,
- context.state.clipboard,
- ).then((response) => {
- // if the action was successful
- if (response.data.result.status === 'success') {
- // refresh content
- context.dispatch('refreshAll');
-
- // if action - cut - clear clipboard
- if (context.state.clipboard.type === 'cut') {
- context.commit('resetClipboard');
+ },
+
+ /**
+ * Reset application state
+ * @param state
+ * @param commit
+ */
+ resetState({ state, commit }) {
+ // left manager
+ commit('left/setDisk', null);
+ commit('left/setSelectedDirectory', null);
+ commit('left/setDirectoryContent', { directories: [], files: [] });
+ commit('left/resetSelected');
+ commit('left/resetSortSettings');
+ commit('left/resetHistory');
+ commit('left/setView', 'table');
+ // modals
+ commit('modal/clearModal');
+ // messages
+ commit('messages/clearActionResult');
+ commit('messages/clearProgress');
+ commit('messages/clearLoading');
+ commit('messages/clearErrors');
+
+ if (state.settings.windowsConfig === 3) {
+ // right manager
+ commit('right/setDisk', null);
+ commit('right/setSelectedDirectory', null);
+ commit('right/setDirectoryContent', { directories: [], files: [] });
+ commit('right/resetSelected');
+ commit('right/resetSortSettings');
+ commit('right/resetHistory');
+ commit('right/setView', 'table');
+ } else if (state.settings.windowsConfig === 2) {
+ // tree
+ commit('tree/cleanTree');
+ commit('tree/clearTempArray');
}
- }
- });
- },
-
- /**
- * Rename file or folder
- * @param context
- * @param type
- * @param newName
- * @param oldName
- * @returns {Promise}
- */
- rename(context, { type, newName, oldName }) {
- return POST.rename(
- context.getters.selectedDisk,
- newName,
- oldName,
- ).then((response) => {
- // refresh content
- if (type === 'dir') {
- context.dispatch('refreshAll');
- } else {
- context.dispatch('refreshManagers');
- }
-
- return response;
- });
- },
-
- /**
- * Get file url
- * @param context
- * @param disk
- * @param path
- */
- url(http://github.com/context,%20%7B%20disk,%20path%20%7D) {
- GET.url(http://github.com/disk,%20path).then((response) => {
- if (response.data.result.status === 'success') {
- context.state.fileCallback(response.data.url);
- }
- });
- },
+
+ commit('resetState');
+ },
+
+ /**
+ * Open PDF
+ * @param context
+ * @param disk
+ * @param path
+ */
+ openPDF(context, { disk, path }) {
+ const win = window.open();
+
+ GET.getFileArrayBuffer(disk, path).then((response) => {
+ const blob = new Blob([response.data], { type: 'application/pdf' });
+
+ win.document.write(
+ ``
+ );
+ });
+ },
};
diff --git a/src/store/file-manager.js b/src/store/file-manager.js
deleted file mode 100644
index 541d46d..0000000
--- a/src/store/file-manager.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// store modules
-import tree from './modules/tree';
-import modal from './modules/modal';
-import settings from './modules/settings';
-import manager from './modules/manager';
-import messages from './modules/messages';
-// main actions and getters
-import state from './state';
-import mutations from './mutations';
-import getters from './getters';
-import actions from './actions';
-
-const fm = {
- namespaced: true,
- modules: {
- settings,
- left: manager,
- right: manager,
- tree,
- modal,
- messages,
- },
- state,
- mutations,
- actions,
- getters,
-};
-
-export default fm;
diff --git a/src/store/getters.js b/src/store/getters.js
index 6d32ce6..0bcde26 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -1,38 +1,47 @@
export default {
- /**
- * Selected disk for active manager
- * @param state
- * @returns {selectedDisk|null|*|computed.selectedDisk}
- */
- selectedDisk(state) {
- return state[state.activeManager].selectedDisk;
- },
+ /**
+ * Get a list of disks
+ * @param state
+ * @returns {string[]}
+ */
+ diskList(state) {
+ return Object.keys(state.disks);
+ },
- /**
- * Selected directory for active manager
- * @param state
- * @returns {selectedDirectory|computed.selectedDirectory|string|*}
- */
- selectedDirectory(state) {
- return state[state.activeManager].selectedDirectory;
- },
+ /**
+ * Selected disk for active manager
+ * @param state
+ * @returns {*}
+ */
+ selectedDisk(state) {
+ return state[state.activeManager].selectedDisk;
+ },
- /**
- * List of selected files and folders for the active manager
- * @param state
- * @param getters
- * @returns {*}
- */
- selectedItems(state, getters) {
- return getters[`${state.activeManager}/selectedList`];
- },
+ /**
+ * Selected directory for active manager
+ * @param state
+ * @returns {any}
+ */
+ selectedDirectory(state) {
+ return state[state.activeManager].selectedDirectory;
+ },
- /**
- * Inactive manager name
- * @param state
- * @returns {string}
- */
- inactiveManager(state) {
- return state.activeManager === 'left' ? 'right' : 'left';
- },
+ /**
+ * List of selected files and folders for the active manager
+ * @param state
+ * @param getters
+ * @returns {*}
+ */
+ selectedItems(state, getters) {
+ return getters[`${state.activeManager}/selectedList`];
+ },
+
+ /**
+ * Inactive manager name
+ * @param state
+ * @returns {string}
+ */
+ inactiveManager(state) {
+ return state.activeManager === 'left' ? 'right' : 'left';
+ },
};
diff --git a/src/store/manager/actions.js b/src/store/manager/actions.js
new file mode 100644
index 0000000..8ee8450
--- /dev/null
+++ b/src/store/manager/actions.js
@@ -0,0 +1,124 @@
+/* eslint-disable object-curly-newline */
+import GET from '../../http/get';
+
+export default {
+ /**
+ * Load files and folders for the selected directory
+ * @param state
+ * @param commit
+ * @param dispatch
+ * @param rootState
+ * @param path
+ * @param history
+ * @returns {Promise}
+ */
+ selectDirectory({ state, commit, dispatch, rootState }, { path, history }) {
+ // reset content
+ commit('setDirectoryContent', { directories: [], files: [] });
+
+ // get content for the selected directory
+ return GET.content(state.selectedDisk, path).then((response) => {
+ if (response.data.result.status === 'success') {
+ commit('resetSelected');
+ commit('resetSortSettings');
+ commit('setDirectoryContent', response.data);
+ commit('setSelectedDirectory', path);
+
+ if (history) commit('addToHistory', path);
+
+ // if directories tree is shown, not main directory and directory have subdirectories
+ if (rootState.fm.settings.windowsConfig === 2 && path && response.data.directories.length) {
+ dispatch('fm/tree/showSubdirectories', path, { root: true });
+ }
+ }
+ });
+ },
+
+ /**
+ * Refresh content in the selected directory
+ * @param state
+ * @param commit
+ * @param dispatch
+ */
+ refreshDirectory({ state, commit, dispatch }) {
+ GET.content(state.selectedDisk, state.selectedDirectory).then((response) => {
+ commit('resetSelected');
+ commit('resetSortSettings');
+ commit('resetHistory');
+
+ // add to history selected directory
+ if (state.selectedDirectory) commit('addToHistory', state.selectedDirectory);
+
+ if (response.data.result.status === 'success') {
+ commit('setDirectoryContent', response.data);
+ } else if (response.data.result.status === 'danger') {
+ // If directory not found try to load main directory
+ commit('setSelectedDirectory', null);
+ dispatch('refreshDirectory');
+ }
+ });
+ },
+
+ /**
+ * History Back
+ * @param state
+ * @param commit
+ * @param dispatch
+ */
+ historyBack({ state, commit, dispatch }) {
+ dispatch('selectDirectory', {
+ path: state.history[state.historyPointer - 1],
+ history: false,
+ });
+ commit('pointerBack');
+ },
+
+ /**
+ * History Forward
+ * @param state
+ * @param commit
+ * @param dispatch
+ */
+ historyForward({ state, commit, dispatch }) {
+ dispatch('selectDirectory', {
+ path: state.history[state.historyPointer + 1],
+ history: false,
+ });
+ commit('pointerForward');
+ },
+
+ /**
+ * Sort data by field
+ * @param context
+ * @param field
+ * @param direction
+ */
+ sortBy({ state, commit }, { field, direction }) {
+ if (state.sort.field === field && !direction) {
+ commit('setSortDirection', state.sort.direction === 'up' ? 'down' : 'up');
+ } else if (direction) {
+ commit('setSortDirection', direction);
+ commit('setSortField', field);
+ } else {
+ commit('setSortDirection', 'up');
+ commit('setSortField', field);
+ }
+ // sort by field type
+ switch (field) {
+ case 'name':
+ commit('sortByName');
+ break;
+ case 'size':
+ commit('sortBySize');
+ break;
+ case 'type':
+ commit('sortByType');
+ break;
+ case 'date':
+ commit('sortByDate');
+ break;
+ default:
+ break;
+ }
+ },
+};
diff --git a/src/store/manager/getters.js b/src/store/manager/getters.js
new file mode 100644
index 0000000..66a53dc
--- /dev/null
+++ b/src/store/manager/getters.js
@@ -0,0 +1,128 @@
+export default {
+ /**
+ * Files list(filtered)
+ * @param state
+ * @param getters
+ * @param rootState
+ */
+ files(state, getters, rootState) {
+ if (rootState.fm.settings.hiddenFiles) {
+ return state.files;
+ }
+
+ return state.files.filter((item) => item.basename.match(/^([^.]).*/i));
+ },
+
+ /**
+ * Directories list(filtered)
+ * @param state
+ * @param getters
+ * @param rootState
+ * @returns {*}
+ */
+ directories(state, getters, rootState) {
+ if (rootState.fm.settings.hiddenFiles) {
+ return state.directories;
+ }
+
+ return state.directories.filter((item) => item.basename.match(/^([^.]).*/i));
+ },
+
+ /**
+ * Files counter
+ * @param state
+ * @param getters
+ * @returns {*}
+ */
+ filesCount(state, getters) {
+ return getters.files.length;
+ },
+
+ /**
+ * Directories counter
+ * @param state
+ * @param getters
+ * @returns {*}
+ */
+ directoriesCount(state, getters) {
+ return getters.directories.length;
+ },
+
+ /**
+ * Files size - bytes
+ * @param state
+ * @param getters
+ * @returns {*}
+ */
+ filesSize(state, getters) {
+ if (getters.files.length) {
+ return getters.files.reduce((previous, current) => previous + Number(current.size), 0);
+ }
+
+ return 0;
+ },
+
+ /**
+ * Count selected files and folders
+ * @param state
+ * @param getters
+ * @returns {number}
+ */
+ selectedCount(state, getters) {
+ return getters.selectedList.length;
+ },
+
+ /**
+ * Selected files size
+ * @param state
+ * @returns {number}
+ */
+ selectedFilesSize(state) {
+ const selectedFiles = state.files.filter((file) => state.selected.files.includes(file.path));
+
+ if (selectedFiles.length) {
+ return selectedFiles.reduce((previous, current) => previous + Number(current.size), 0);
+ }
+
+ return 0;
+ },
+
+ /**
+ * Selected files and folders
+ * @param state
+ */
+ selectedList(state) {
+ const selectedDirectories = state.directories.filter((directory) =>
+ state.selected.directories.includes(directory.path)
+ );
+
+ const selectedFiles = state.files.filter((file) => state.selected.files.includes(file.path));
+
+ return selectedDirectories.concat(selectedFiles);
+ },
+
+ /**
+ * Breadcrumb
+ * @param state
+ * @returns {*}
+ */
+ breadcrumb(state) {
+ if (state.selectedDirectory) {
+ return state.selectedDirectory.split('/');
+ }
+
+ return null;
+ },
+
+ /**
+ * Compare directories name
+ * @param state
+ */
+ directoryExist: (state) => (basename) => state.directories.some((el) => el.basename === basename),
+
+ /**
+ * Compare files name
+ * @param state
+ */
+ fileExist: (state) => (basename) => state.files.some((el) => el.basename === basename),
+};
diff --git a/src/store/manager/mutations.js b/src/store/manager/mutations.js
new file mode 100644
index 0000000..ca3be10
--- /dev/null
+++ b/src/store/manager/mutations.js
@@ -0,0 +1,232 @@
+export default {
+ /**
+ * Set selected disk
+ * @param state
+ * @param disk
+ */
+ setDisk(state, disk) {
+ state.selectedDisk = disk;
+ },
+
+ /**
+ * Set directories and files in selected directory
+ * @param state
+ * @param data
+ */
+ setDirectoryContent(state, data) {
+ state.directories = data.directories;
+ state.files = data.files;
+ },
+
+ /**
+ * Set selected directory
+ * @param state
+ * @param directory
+ */
+ setSelectedDirectory(state, directory) {
+ state.selectedDirectory = directory;
+ },
+
+ /**
+ * Set selected items
+ * @param state
+ * @param type (directories, files)
+ * @param path
+ */
+ setSelected(state, { type, path }) {
+ state.selected[type].push(path);
+ },
+
+ /**
+ * Remove item from array
+ * @param state
+ * @param arrayIndex
+ */
+ removeSelected(state, { type, path }) {
+ const itemIndex = state.selected[type].indexOf(path);
+ if (itemIndex !== -1) state.selected[type].splice(itemIndex, 1);
+ },
+
+ /**
+ * Change selected item
+ * @param state
+ * @param type
+ * @param path
+ */
+ changeSelected(state, { type, path }) {
+ state.selected.directories = [];
+ state.selected.files = [];
+ state.selected[type].push(path);
+ },
+
+ /**
+ * Reset selected items array
+ * @param state
+ */
+ resetSelected(state) {
+ state.selected.directories = [];
+ state.selected.files = [];
+ },
+
+ /**
+ * Add new file
+ * @param state
+ * @param newFile
+ */
+ addNewFile(state, newFile) {
+ state.files.push(newFile);
+ },
+
+ /**
+ * Update file
+ * @param state
+ * @param file
+ */
+ updateFile(state, file) {
+ const itemIndex = state.files.findIndex((el) => el.basename === file.basename);
+ if (itemIndex !== -1) state.files[itemIndex] = file;
+ },
+
+ /**
+ * Add new directory
+ * @param state
+ * @param newDirectory
+ */
+ addNewDirectory(state, newDirectory) {
+ state.directories.push(newDirectory);
+ },
+
+ /**
+ * Change history pointer (back)
+ * @param state
+ */
+ pointerBack(state) {
+ state.historyPointer -= 1;
+ },
+
+ /**
+ * Change history pointer (forward)
+ * @param state
+ */
+ pointerForward(state) {
+ state.historyPointer += 1;
+ },
+
+ /**
+ * Add to history
+ * @param state
+ * @param path
+ */
+ addToHistory(state, path) {
+ if (state.historyPointer < state.history.length - 1) {
+ // erase next elements in the history
+ state.history.splice(state.historyPointer + 1, Number.MAX_VALUE);
+ }
+ // add new path
+ state.history.push(path);
+ // change history pointer
+ state.historyPointer += 1;
+ },
+
+ /**
+ * Reset history
+ * @param state
+ */
+ resetHistory(state) {
+ state.history = [null];
+ state.historyPointer = 0;
+ },
+
+ /**
+ * Set view type
+ * Grid or Table
+ * @param state
+ * @param type
+ */
+ setView(state, type) {
+ state.viewType = type;
+ },
+
+ /**
+ * Set sort settings - field name
+ * @param state
+ * @param field
+ */
+ setSortField(state, field) {
+ state.sort.field = field;
+ },
+
+ /**
+ * Set sort settings - direction
+ * @param state
+ * @param direction
+ */
+ setSortDirection(state, direction) {
+ state.sort.direction = direction;
+ },
+
+ /**
+ * Reset sort settings
+ * @param state
+ */
+ resetSortSettings(state) {
+ state.sort.field = 'name';
+ state.sort.direction = 'up';
+ },
+
+ /**
+ * Sort table by name field
+ * @param state
+ */
+ sortByName(state) {
+ if (state.sort.direction === 'up') {
+ state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
+ state.files.sort((a, b) => a.basename.localeCompare(b.basename));
+ } else {
+ state.directories.sort((a, b) => b.basename.localeCompare(a.basename));
+ state.files.sort((a, b) => b.basename.localeCompare(a.basename));
+ }
+ },
+
+ /**
+ * Sort by file size
+ * @param state
+ */
+ sortBySize(state) {
+ state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
+
+ if (state.sort.direction === 'up') {
+ state.files.sort((a, b) => a.size - b.size);
+ } else {
+ state.files.sort((a, b) => b.size - a.size);
+ }
+ },
+
+ /**
+ * Sort by file extension
+ * @param state
+ */
+ sortByType(state) {
+ state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
+
+ if (state.sort.direction === 'up') {
+ state.files.sort((a, b) => a.extension.localeCompare(b.extension));
+ } else {
+ state.files.sort((a, b) => b.extension.localeCompare(a.extension));
+ }
+ },
+
+ /**
+ * Sort by date
+ * @param state
+ */
+ sortByDate(state) {
+ if (state.sort.direction === 'up') {
+ state.directories.sort((a, b) => a.timestamp - b.timestamp);
+ state.files.sort((a, b) => a.timestamp - b.timestamp);
+ } else {
+ state.directories.sort((a, b) => b.timestamp - a.timestamp);
+ state.files.sort((a, b) => b.timestamp - a.timestamp);
+ }
+ },
+};
diff --git a/src/store/manager/store.js b/src/store/manager/store.js
new file mode 100644
index 0000000..3846443
--- /dev/null
+++ b/src/store/manager/store.js
@@ -0,0 +1,46 @@
+import mutations from './mutations';
+import getters from './getters';
+import actions from './actions';
+
+export default {
+ namespaced: true,
+ state() {
+ return {
+ // selected disk
+ selectedDisk: null,
+
+ // selected directory
+ selectedDirectory: null,
+
+ // Directories in the selected directory
+ directories: [],
+
+ // files in the selected directory
+ files: [],
+
+ // selected files and folders
+ selected: {
+ directories: [],
+ files: [],
+ },
+
+ // sorting settings
+ sort: {
+ field: 'name',
+ direction: 'up',
+ },
+
+ // history
+ history: [null],
+
+ // history pointer
+ historyPointer: 0,
+
+ // view type - table or grid - (default - table)
+ viewType: 'table',
+ };
+ },
+ mutations,
+ getters,
+ actions,
+};
diff --git a/src/store/messages/mutations.js b/src/store/messages/mutations.js
new file mode 100644
index 0000000..7d3156b
--- /dev/null
+++ b/src/store/messages/mutations.js
@@ -0,0 +1,80 @@
+export default {
+ /**
+ * Set the result of the action
+ * when the message exists
+ * @param state
+ * @param status
+ * @param message
+ */
+ setActionResult(state, { status, message }) {
+ state.actionResult.status = status;
+ state.actionResult.message = message;
+ },
+
+ /**
+ * Clear action result
+ * @param state
+ */
+ clearActionResult(state) {
+ state.actionResult.status = null;
+ state.actionResult.message = null;
+ },
+
+ /**
+ * Progress Bar (%) - upload..
+ * @param state
+ * @param progress
+ */
+ setProgress(state, progress) {
+ state.actionProgress = progress;
+ },
+
+ /**
+ * Clear progress
+ * @param state
+ */
+ clearProgress(state) {
+ state.actionProgress = 0;
+ },
+
+ /**
+ * Add new action
+ * @param state
+ */
+ addLoading(state) {
+ state.loading += 1;
+ },
+
+ /**
+ * Action finish
+ * @param state
+ */
+ subtractLoading(state) {
+ state.loading -= 1;
+ },
+
+ /**
+ * Clear
+ * @param state
+ */
+ clearLoading(state) {
+ state.loading = 0;
+ },
+
+ /**
+ * Set error message
+ * @param state
+ * @param error
+ */
+ setError(state, error) {
+ state.errors.push(error);
+ },
+
+ /**
+ * Clear errors
+ * @param state
+ */
+ clearErrors(state) {
+ state.errors = [];
+ },
+};
diff --git a/src/store/messages/store.js b/src/store/messages/store.js
new file mode 100644
index 0000000..18b77db
--- /dev/null
+++ b/src/store/messages/store.js
@@ -0,0 +1,24 @@
+import mutations from './mutations';
+
+export default {
+ namespaced: true,
+ state() {
+ return {
+ // last action result
+ actionResult: {
+ status: null,
+ message: null,
+ },
+
+ // completing state
+ actionProgress: 0,
+
+ // loading spinner
+ loading: 0,
+
+ // application error messages
+ errors: [],
+ };
+ },
+ mutations,
+};
diff --git a/src/store/modal/mutations.js b/src/store/modal/mutations.js
new file mode 100644
index 0000000..6c75afd
--- /dev/null
+++ b/src/store/modal/mutations.js
@@ -0,0 +1,30 @@
+export default {
+ /**
+ * Modal window state
+ * @param state
+ * @param show
+ * @param modalName
+ */
+ setModalState(state, { show, modalName }) {
+ state.showModal = show;
+ state.modalName = modalName;
+ },
+
+ /**
+ * Clear modal
+ * @param state
+ */
+ clearModal(state) {
+ state.showModal = false;
+ state.modalName = null;
+ },
+
+ /**
+ * Main modal block - set height
+ * @param state
+ * @param height
+ */
+ setModalBlockHeight(state, height) {
+ state.modalBlockHeight = height;
+ },
+};
diff --git a/src/store/modal/store.js b/src/store/modal/store.js
new file mode 100644
index 0000000..4dedd73
--- /dev/null
+++ b/src/store/modal/store.js
@@ -0,0 +1,18 @@
+import mutations from './mutations';
+
+export default {
+ namespaced: true,
+ state() {
+ return {
+ // modal window
+ showModal: false,
+
+ // modal name
+ modalName: null,
+
+ // main modal block height
+ modalBlockHeight: 0,
+ };
+ },
+ mutations,
+};
diff --git a/src/store/modules/manager.js b/src/store/modules/manager.js
deleted file mode 100644
index 14b624b..0000000
--- a/src/store/modules/manager.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import mutations from './manager/mutations';
-import getters from './manager/getters';
-import actions from './manager/actions';
-
-const manager = {
- namespaced: true,
- state() {
- return {
- // selected disk
- selectedDisk: null,
-
- // selected directory
- selectedDirectory: null,
-
- // Directories in the selected directory
- directories: [],
-
- // files in the selected directory
- files: [],
-
- // selected files and folders
- selected: {
- directories: [],
- files: [],
- },
-
- // sorting settings
- sort: {
- field: 'name',
- direction: 'up',
- },
-
- // history
- history: [null],
-
- // history pointer
- historyPointer: 0,
-
- // view type - table or grid - (default - table)
- viewType: 'table',
- };
- },
- mutations,
- getters,
- actions,
-};
-
-export default manager;
diff --git a/src/store/modules/manager/actions.js b/src/store/modules/manager/actions.js
deleted file mode 100644
index 2ca2a0f..0000000
--- a/src/store/modules/manager/actions.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import GET from '../../../http/get-queries';
-
-export default {
- /**
- * Load files and folders in to the selected directory
- * @param context
- * @param path
- * @param history
- */
- selectDirectory(context, { path, history }) {
- // get content from the server
- return GET.content(
- context.state.selectedDisk,
- path,
- ).then((response) => {
- // if the action was successful
- if (response.data.result.status === 'success') {
- // clean selected items
- context.commit('resetSelected');
-
- // reset sorting
- context.commit('resetSortSettings');
-
- // set content
- context.commit('setDirectoryContent', response.data);
-
- // set new selected directory
- context.commit('setSelectedDirectory', path);
-
- // add to history, if need
- if (history) context.commit('addToHistory', path);
-
- // if directories tree is shown, not main directory and directory have subdirectories
- if (
- context.rootState.fm.settings.windowsConfig === 2
- && path
- && response.data.directories.length
- ) {
- // show subdirectories in a tree
- context.dispatch('fm/tree/showSubdirectories', path, { root: true });
- }
- }
- });
- },
-
- /**
- * Refresh content in the selected directory
- * @param context
- */
- refreshDirectory(context) {
- // get content from the server
- GET.content(
- context.state.selectedDisk,
- context.state.selectedDirectory,
- ).then((response) => {
- // clean selected items
- context.commit('resetSelected');
-
- // reset sorting
- context.commit('resetSortSettings');
-
- // reset history
- context.commit('resetHistory');
- // add to history selected directory
- if (context.state.selectedDirectory) context.commit('addToHistory', context.state.selectedDirectory);
-
- if (response.data.result.status === 'success') {
- // refresh content
- context.commit('setDirectoryContent', response.data);
- } else if (response.data.result.status === 'danger') {
- // If directory not found
- context.commit('setSelectedDirectory', null);
- // try to load main directory
- context.dispatch('refreshDirectory');
- }
- });
- },
-
- /**
- * History Back
- * @param context
- */
- historyBack(context) {
- context.dispatch('selectDirectory', {
- path: context.state.history[context.state.historyPointer - 1],
- history: false });
- context.commit('pointerBack');
- },
-
- /**
- * History Forward
- * @param context
- */
- historyForward(context) {
- context.dispatch('selectDirectory', {
- path: context.state.history[context.state.historyPointer + 1],
- history: false });
- context.commit('pointerForward');
- },
-
- /**
- * Sort data by field
- * @param context
- * @param field
- * @param direction
- */
- sortBy(context, { field, direction }) {
- if (context.state.sort.field === field && !direction) {
- context.commit('setSortDirection', context.state.sort.direction === 'up' ? 'down' : 'up');
- } else if (direction) {
- // set default direction
- context.commit('setSortDirection', direction);
- // set field name
- context.commit('setSortField', field);
- } else {
- // set default direction
- context.commit('setSortDirection', 'up');
- // set field name
- context.commit('setSortField', field);
- }
- // sort by field type
- switch (field) {
- case 'name':
- context.commit('sortByName');
- break;
- case 'size':
- context.commit('sortBySize');
- break;
- case 'type':
- context.commit('sortByType');
- break;
- case 'date':
- context.commit('sortByDate');
- break;
- default:
- break;
- }
- },
-};
diff --git a/src/store/modules/manager/getters.js b/src/store/modules/manager/getters.js
deleted file mode 100644
index cd7ad3b..0000000
--- a/src/store/modules/manager/getters.js
+++ /dev/null
@@ -1,117 +0,0 @@
-export default {
-
- /**
- * Files count
- * @param state
- * @returns {number}
- */
- filesCount(state) {
- return state.files.length;
- },
-
- /**
- * Directories count
- * @param state
- * @returns {number}
- */
- directoriesCount(state) {
- return state.directories.length;
- },
-
- /**
- * Files size - bytes
- * @param state
- * @returns {*}
- */
- filesSize(state) {
- if (state.files.length) {
- return state.files.reduce((previous, current) => previous + current.size, 0);
- }
-
- return 0;
- },
-
- /**
- * Count selected files and folders
- * @param state
- * @param getters
- * @returns {number}
- */
- selectedCount(state, getters) {
- return getters.selectedList.length;
- },
-
- /**
- * Selected files size
- * @param state
- * @returns {number}
- */
- selectedFilesSize(state) {
- const selectedFiles = state.files.filter(
- file => state.selected.files.includes(file.path),
- );
-
- if (selectedFiles.length) {
- return selectedFiles.reduce((previous, current) => previous + current.size, 0);
- }
-
- return 0;
- },
-
- /**
- * Selected files and folders
- * @param state
- */
- selectedList(state) {
- const selectedDirectories = state.directories.filter(
- directory => state.selected.directories.includes(directory.path),
- );
-
- const selectedFiles = state.files.filter(
- file => state.selected.files.includes(file.path),
- );
-
- return selectedDirectories.concat(selectedFiles);
- },
-
- /**
- * Breadcrumb
- * @param state
- * @returns {*}
- */
- breadcrumb(state) {
- if (state.selectedDirectory) {
- return state.selectedDirectory.split('/');
- }
-
- return null;
- },
-
- /**
- * Compare directories name
- * @param state
- */
- directoryExist: state => (basename) => {
- for (let i = 0; i < state.directories.length; i += 1) {
- if (state.directories[i].basename === basename) {
- return true;
- }
- }
-
- return false;
- },
-
- /**
- * Compare files name
- * @param state
- */
- fileExist: state => (basename) => {
- for (let i = 0; i < state.files.length; i += 1) {
- if (state.files[i].basename === basename) {
- return true;
- }
- }
-
- return false;
- },
-};
diff --git a/src/store/modules/manager/mutations.js b/src/store/modules/manager/mutations.js
deleted file mode 100644
index 5dd9f2c..0000000
--- a/src/store/modules/manager/mutations.js
+++ /dev/null
@@ -1,214 +0,0 @@
-export default {
-
- /**
- * Set selected disk
- * @param state
- * @param disk
- */
- setDisk(state, disk) {
- state.selectedDisk = disk;
- },
-
- /**
- * Set directories and files in selected directory
- * @param state
- * @param data
- */
- setDirectoryContent(state, data) {
- state.directories = data.directories;
- state.files = data.files;
- },
-
- /**
- * Set selected directory
- * @param state
- * @param directory
- */
- setSelectedDirectory(state, directory) {
- state.selectedDirectory = directory;
- },
-
- /**
- * Set selected items
- * @param state
- * @param type (directories, files)
- * @param path
- */
- setSelected(state, { type, path }) {
- state.selected[type].push(path);
- },
-
- /**
- * Remove item from array
- * @param state
- * @param arrayIndex
- */
- removeSelected(state, { type, path }) {
- const itemIndex = state.selected[type].indexOf(path);
- if (itemIndex !== -1) state.selected[type].splice(itemIndex, 1);
- },
-
- /**
- * Change selected item
- * @param state
- * @param type
- * @param path
- */
- changeSelected(state, { type, path }) {
- state.selected.directories = [];
- state.selected.files = [];
- state.selected[type].push(path);
- },
-
- /**
- * Reset selected items array
- * @param state
- */
- resetSelected(state) {
- state.selected.directories = [];
- state.selected.files = [];
- },
-
- /**
- * Add new directory
- * @param state
- * @param newDirectory
- */
- addNewDirectory(state, newDirectory) {
- state.directories.push(newDirectory);
- },
-
- /**
- * Change history pointer (back)
- * @param state
- */
- pointerBack(state) {
- state.historyPointer -= 1;
- },
-
- /**
- * Change history pointer (forward)
- * @param state
- */
- pointerForward(state) {
- state.historyPointer += 1;
- },
-
- /**
- * Add to history
- * @param state
- * @param path
- */
- addToHistory(state, path) {
- if (state.historyPointer < state.history.length - 1) {
- // erase next elements in the history
- state.history.splice(state.historyPointer + 1, Number.MAX_VALUE);
- }
- // add new path
- state.history.push(path);
- // change history pointer
- state.historyPointer += 1;
- },
-
- /**
- * Reset history
- * @param state
- */
- resetHistory(state) {
- state.history = [null];
- state.historyPointer = 0;
- },
-
- /**
- * Set view type
- * Grid or Table
- * @param state
- * @param type
- */
- setView(state, type) {
- state.viewType = type;
- },
-
- /**
- * Set sort settings - field name
- * @param state
- * @param field
- */
- setSortField(state, field) {
- state.sort.field = field;
- },
-
- /**
- * Set sort settings - direction
- * @param state
- * @param direction
- */
- setSortDirection(state, direction) {
- state.sort.direction = direction;
- },
-
- /**
- * Reset sort settings
- * @param state
- */
- resetSortSettings(state) {
- state.sort.field = 'name';
- state.sort.direction = 'up';
- },
-
- /**
- * Sort table by name field
- * @param state
- */
- sortByName(state) {
- if (state.sort.direction === 'up') {
- state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
- state.files.sort((a, b) => a.basename.localeCompare(b.basename));
- } else {
- state.directories.sort((a, b) => b.basename.localeCompare(a.basename));
- state.files.sort((a, b) => b.basename.localeCompare(a.basename));
- }
- },
-
- /**
- * Sort by file size
- * @param state
- */
- sortBySize(state) {
- state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
-
- if (state.sort.direction === 'up') {
- state.files.sort((a, b) => a.size - b.size);
- } else {
- state.files.sort((a, b) => b.size - a.size);
- }
- },
-
- /**
- * Sort by file extension
- * @param state
- */
- sortByType(state) {
- state.directories.sort((a, b) => a.basename.localeCompare(b.basename));
-
- if (state.sort.direction === 'up') {
- state.files.sort((a, b) => a.extension.localeCompare(b.extension));
- } else {
- state.files.sort((a, b) => b.extension.localeCompare(a.extension));
- }
- },
-
- /**
- * Sort by date
- * @param state
- */
- sortByDate(state) {
- if (state.sort.direction === 'up') {
- state.directories.sort((a, b) => a.timestamp - b.timestamp);
- state.files.sort((a, b) => a.timestamp - b.timestamp);
- } else {
- state.directories.sort((a, b) => b.timestamp - a.timestamp);
- state.files.sort((a, b) => b.timestamp - a.timestamp);
- }
- },
-};
diff --git a/src/store/modules/messages.js b/src/store/modules/messages.js
deleted file mode 100644
index e528d8b..0000000
--- a/src/store/modules/messages.js
+++ /dev/null
@@ -1,116 +0,0 @@
-const messages = {
- namespaced: true,
- state: {
- // last action result
- actionResult: {
- status: null,
- message: null,
- },
-
- // completing state
- actionProgress: 0,
-
- // loading spinner
- loading: 0,
-
- // application error messages
- errors: [],
- },
- mutations: {
- /**
- * Set the result of the action
- * when the message exists
- * @param state
- * @param status
- * @param message
- */
- setActionResult(state, { status, message }) {
- state.actionResult.status = status;
- state.actionResult.message = message;
- },
-
- /**
- * Clear action result
- * @param state
- */
- clearActionResult(state) {
- state.actionResult.status = null;
- state.actionResult.message = null;
- },
-
- /**
- * Progress Bar (%) - upload..
- * @param state
- * @param progress
- */
- setProgress(state, progress) {
- state.actionProgress = progress;
- },
-
- /**
- * Clear progress
- * @param state
- */
- clearProgress(state) {
- state.actionProgress = 0;
- },
-
- /**
- * Add new action
- * @param state
- */
- addLoading(state) {
- state.loading += 1;
- },
-
- /**
- * Action finish
- * @param state
- */
- subtractLoading(state) {
- state.loading -= 1;
- },
-
- /**
- * Clear
- * @param state
- */
- clearLoading(state) {
- state.loading = 0;
- },
-
- /**
- * Set error message
- * @param state
- * @param error
- */
- setError(state, error) {
- if (error.response) {
- state.errors.push({
- status: error.response.status,
- message: error.response.data.message || error.response.statusText,
- });
- } else if (error.request) {
- state.errors.push({
- status: error.request.status,
- message: error.request.statusText || 'Network error',
- });
- } else {
- state.errors.push({
- status: 0,
- message: error.message,
- });
- }
- },
-
- /**
- * Clear errors
- * @param state
- */
- clearErrors(state) {
- state.errors = [];
- },
- },
-};
-
-export default messages;
diff --git a/src/store/modules/modal.js b/src/store/modules/modal.js
deleted file mode 100644
index 3e7f98f..0000000
--- a/src/store/modules/modal.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const modal = {
- namespaced: true,
- state: {
-
- // modal window
- showModal: false,
-
- // modal name
- modalName: null,
- },
- mutations: {
-
- /**
- * Modal window state
- * @param state
- * @param show
- * @param modalName
- */
- setModalState(state, { show, modalName }) {
- state.showModal = show;
- state.modalName = modalName;
- },
-
- /**
- * Clear modal
- * @param state
- */
- clearModal(state) {
- state.showModal = false;
- state.modalName = null;
- },
-
- },
-};
-
-export default modal;
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
deleted file mode 100644
index 63f0b6f..0000000
--- a/src/store/modules/settings.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import ru from '../../lang/ru';
-import en from '../../lang/en';
-import ar from '../../lang/ar';
-
-const settings = {
- namespaced: true,
- state: {
- /**
- * file manager windows configuration
- * 1 - only one file manager window
- * 2 - one file manager window with directories tree module
- * 3 - two file manager windows
- */
- windowsConfig: null,
-
- // app language
- lang: null,
-
- // translations (/src/lang)
- translations: {
- ru: Object.freeze(ru),
- en: Object.freeze(en),
- ar: Object.freeze(ar),
- },
-
- // full screen mode
- fullScreen: false,
- },
- mutations: {
- /**
- * Set windows config
- * @param state
- * @param data
- */
- manualSettings(state, data) {
- // windows config
- if (Object.prototype.hasOwnProperty.call(data, 'windowsConfig')) {
- state.windowsConfig = data.windowsConfig;
- }
- // language
- if (Object.prototype.hasOwnProperty.call(data, 'lang')) {
- state.lang = data.lang;
- }
- // add new translation
- if (Object.prototype.hasOwnProperty.call(data, 'translation')) {
- state.translations[data.translation.name] = Object.freeze(data.translation.content);
- }
- },
-
- /**
- * Initialize App settings from server
- * @param state
- * @param data
- */
- initSettings(state, data) {
- if (!state.lang) state.lang = data.lang;
- if (!state.windowsConfig) state.windowsConfig = data.windowsConfig;
- },
-
- // screen mode toggle - ON/OFF full screen
- screenToggle(state) {
- state.fullScreen = !state.fullScreen;
- },
-
- },
-};
-
-export default settings;
diff --git a/src/store/modules/tree.js b/src/store/modules/tree.js
deleted file mode 100644
index df046f6..0000000
--- a/src/store/modules/tree.js
+++ /dev/null
@@ -1,364 +0,0 @@
-/* eslint-disable no-restricted-syntax,no-param-reassign */
-import GET from '../../http/get-queries';
-
-const tree = {
- namespaced: true,
- state: {
-
- /**
- * directories.id (int), el id
- * directories.name (string), directory name
- * directories.path (string), path to directory
- * directories.props (object), directory properties
- * directories.props.hasSubdirectories (boolean), has child directories,
- * directories.props.subdirectoriesLoaded (boolean), child directories loaded
- * directories.props.showSubdirectories (boolean), show or hide subdirectories branch
- * directories.parentId (int), parent id
- */
- directories: [],
-
- // directories id counter
- counter: 1,
-
- // directories array for deleting(indexes)
- tempIndexArray: [],
-
- },
- mutations: {
-
- /**
- * Clean the directories tree
- * @param state
- */
- cleanTree(state) {
- state.directories = [];
- state.counter = 1;
- },
-
- /**
- * Add directories to the tree
- * @param state
- * @param directories
- * @param parentId
- */
- addDirectories(state, { directories, parentId }) {
- directories.forEach((directory) => {
- // add properties to dir
- directory.id = state.counter;
- directory.parentId = parentId;
- directory.props.subdirectoriesLoaded = false;
- directory.props.showSubdirectories = false;
-
- state.counter += 1;
-
- state.directories.push(directory);
- });
- },
-
- /**
- * Replace directories
- * @param state
- * @param directories
- */
- replaceDirectories(state, directories) {
- state.directories = directories;
- },
-
- /**
- * Update directory properties
- * @param state
- * @param index
- * @param props
- */
- updateDirectoryProps(state, { index, props }) {
- for (const property in props) {
- if (Object.prototype.hasOwnProperty.call(props, property)) {
- state.directories[index].props[property] = props[property];
- }
- }
- },
-
- /**
- * Add to temp index array
- * @param state
- * @param index
- */
- addToTempArray(state, index) {
- state.tempIndexArray.push(index);
- },
-
- /**
- * Clear temp index array
- * @param state
- */
- clearTempArray(state) {
- state.tempIndexArray = [];
- },
- },
- getters: {
- /**
- * Find directory index in the tree
- * @param state
- */
- findDirectoryIndex: state => (path) => {
- for (let i = 0; i < state.directories.length; i += 1) {
- if (state.directories[i].path === path) {
- // return directory index
- return i;
- }
- }
-
- return -1;
- },
- },
- actions: {
-
- /**
- * Initialize directories tree
- * @param context
- * @param disk
- */
- initTree(context, disk) {
- return GET.tree(disk, null).then((response) => {
- // if the action was successful
- if (response.data.result.status === 'success') {
- // clean the tree, if need
- if (context.state.directories) context.commit('cleanTree');
-
- // initialize directories tree
- context.commit('addDirectories', {
- parentId: 0,
- directories: response.data.directories,
- });
- }
- });
- },
-
- /**
- * Add new directory to the tree
- * @param context
- * @param parentPath
- * @param newDirectory
- */
- addToTree(context, { parentPath, newDirectory }) {
- // If this directory is not the root directory
- if (parentPath) {
- // find parent directory index
- const parentDirectoryIndex = context.getters.findDirectoryIndex(parentPath);
-
- if (parentDirectoryIndex !== -1) {
- // add a new directory
- context.commit('addDirectories', {
- directories: newDirectory,
- parentId: context.state.directories[parentDirectoryIndex].id,
- });
-
- // update parent directory property
- context.commit('updateDirectoryProps', {
- index: parentDirectoryIndex,
- props: {
- hasSubdirectories: true,
- showSubdirectories: true,
- subdirectoriesLoaded: true,
- },
- });
- } else {
- context.commit('fm/messages/setError', {
- message: 'Directory not found',
- }, { root: true });
- }
- } else {
- // add a new directory to the root of the disk
- context.commit('addDirectories', {
- directories: newDirectory,
- parentId: 0,
- });
- }
- },
-
- /**
- * Delete directories and subdirectories from tree
- * @param context
- * @param directories
- */
- deleteFromTree(context, directories) {
- directories.forEach((item) => {
- // find this directory in the tree
- const directoryIndex = context.getters.findDirectoryIndex(item.path);
-
- if (directoryIndex !== -1) {
- // add directory index to array for deleting
- context.commit('addToTempArray', directoryIndex);
-
- // if directory has subdirectories
- if (context.state.directories[directoryIndex].props.hasSubdirectories) {
- // find subDirectories
- context.dispatch('subDirsFinder', context.state.directories[directoryIndex].id);
- }
- }
- });
-
- // filter directories
- const temp = context.state.directories.filter((item, index) => {
- if (context.state.tempIndexArray.indexOf(index) === -1) {
- return item;
- }
- return false;
- });
-
- // replace directories
- context.commit('replaceDirectories', temp);
-
- // clear temp array
- context.commit('clearTempArray');
- },
-
-
- /**
- * Find subdirectories
- * @param context
- * @param parentId
- */
- subDirsFinder(context, parentId) {
- // find sub directories
- context.state.directories.forEach((item, index) => {
- if (item.parentId === parentId) {
- // add directory index to array
- context.commit('addToTempArray', index);
-
- // if directory has subdirectories
- if (item.props.hasSubdirectories) {
- // find subDirectories
- context.dispatch('subDirsFinder', item.id);
- }
- }
- });
- },
-
- /**
- * Get subDirectories from server
- * @param context
- * @param path
- * @param parentId
- * @param parentIndex
- * @returns {Promise}
- */
- getSubdirectories(context, { path, parentId, parentIndex }) {
- return GET.tree(
- context.rootGetters['fm/selectedDisk'],
- path,
- ).then((response) => {
- // if the action was successful
- if (response.data.result.status === 'success') {
- // add directories
- context.commit('addDirectories', {
- parentId,
- directories: response.data.directories,
- });
-
- // update properties at parent directory
- context.commit('updateDirectoryProps', {
- index: parentIndex,
- props: {
- subdirectoriesLoaded: true,
- },
- });
- }
- });
- },
-
- /**
- * Show subdirectories
- * @param context
- * @param path
- */
- showSubdirectories(context, path) {
- const promise = Promise.resolve();
- // find parent directory index
- const parentDirectoryIndex = context.getters.findDirectoryIndex(path);
-
- if (parentDirectoryIndex !== -1) {
- // Are the subdirectories loaded?
- if (context.state.directories[parentDirectoryIndex].props.subdirectoriesLoaded) {
- // update directory properties
- context.commit('updateDirectoryProps', {
- index: parentDirectoryIndex,
- props: {
- showSubdirectories: true,
- },
- });
- } else {
- // load subdirectories
- return context.dispatch('getSubdirectories', {
- path: context.state.directories[parentDirectoryIndex].path,
- parentId: context.state.directories[parentDirectoryIndex].id,
- parentIndex: parentDirectoryIndex,
- }).then(() => {
- // update properties in the parent directory
- context.commit('updateDirectoryProps', {
- index: parentDirectoryIndex,
- props: {
- showSubdirectories: true,
- },
- });
- });
- }
- } else {
- context.commit('fm/messages/setError', {
- message: 'Directory not found',
- }, { root: true });
- }
-
- return promise;
- },
-
- /**
- * Hide subdirectories
- * @param context
- * @param path
- */
- hideSubdirectories(context, path) {
- // find parent directory index
- const parentDirectoryIndex = context.getters.findDirectoryIndex(path);
-
- if (parentDirectoryIndex !== -1) {
- // hide subdirectories
- context.commit('updateDirectoryProps', {
- index: parentDirectoryIndex,
- props: {
- showSubdirectories: false,
- },
- });
- } else {
- context.commit('fm/messages/setError', {
- message: 'Directory not found',
- }, { root: true });
- }
- },
-
- /**
- * Reopen tree directories by selected path
- * @param context
- * @param path
- */
- reopenPath(context, path) {
- let promises = Promise.resolve();
-
- if (path) {
- const splitPath = path.split('/');
-
- for (let i = 0; splitPath.length > i; i += 1) {
- promises = promises.then(() => context.dispatch(
- 'showSubdirectories',
- splitPath.slice(0, i + 1).join('/')));
- }
-
- return promises;
- }
-
- return promises;
- },
- },
-};
-
-export default tree;
diff --git a/src/store/mutations.js b/src/store/mutations.js
index d4e5313..5c703bb 100644
--- a/src/store/mutations.js
+++ b/src/store/mutations.js
@@ -1,68 +1,95 @@
+/* eslint-disable object-curly-newline */
export default {
- /**
- * Set disk list
- * @param state
- * @param list
- */
- setDiskList(state, list) {
- state.diskList = list;
- },
+ /**
+ * Set disks
+ * @param state
+ * @param disks
+ */
+ setDisks(state, disks) {
+ state.disks = disks;
+ },
- /**
- * Set clipboard
- * @param state
- * @param type
- * @param disk
- * @param directories
- * @param files
- */
- setClipboard(state, { type, disk, directories, files }) {
- state.clipboard.type = type;
- state.clipboard.disk = disk;
- state.clipboard.directories = directories;
- state.clipboard.files = files;
- },
+ /**
+ * Set clipboard
+ * @param state
+ * @param type
+ * @param disk
+ * @param directories
+ * @param files
+ */
+ setClipboard(state, { type, disk, directories, files }) {
+ state.clipboard.type = type;
+ state.clipboard.disk = disk;
+ state.clipboard.directories = directories;
+ state.clipboard.files = files;
+ },
- /**
- * Truncate clipboard
- * @param state
- * @param type
- * @param path
- */
- truncateClipboard(state, { type, path }) {
- const itemIndex = state.clipboard[type].indexOf(path);
- if (itemIndex !== -1) state.clipboard[type].splice(itemIndex, 1);
- if (!state.clipboard.directories.length && !state.clipboard.files.length) {
- state.clipboard.type = null;
- }
- },
+ /**
+ * Truncate clipboard
+ * @param state
+ * @param type
+ * @param path
+ */
+ truncateClipboard(state, { type, path }) {
+ const itemIndex = state.clipboard[type].indexOf(path);
- /**
- * Reset clipboard
- * @param state
- */
- resetClipboard(state) {
- state.clipboard.type = null;
- state.clipboard.disk = null;
- state.clipboard.directories = [];
- state.clipboard.files = [];
- },
+ if (itemIndex !== -1) state.clipboard[type].splice(itemIndex, 1);
+ if (!state.clipboard.directories.length && !state.clipboard.files.length) {
+ state.clipboard.type = null;
+ }
+ },
- /**
- * Select manager (when shown 2 file manager windows)
- * @param state
- * @param managerName
- */
- setActiveManager(state, managerName) {
- state.activeManager = managerName;
- },
+ /**
+ * Reset clipboard
+ * @param state
+ */
+ resetClipboard(state) {
+ state.clipboard.type = null;
+ state.clipboard.disk = null;
+ state.clipboard.directories = [];
+ state.clipboard.files = [];
+ },
- /**
- * Set file callback
- * @param state
- * @param callback
- */
- setFileCallBack(state, callback) {
- state.fileCallback = callback;
- },
+ /**
+ * Select manager (when shown 2 file manager windows)
+ * @param state
+ * @param managerName
+ */
+ setActiveManager(state, managerName) {
+ state.activeManager = managerName;
+ },
+
+ /**
+ * Set file callback
+ * @param state
+ * @param callback
+ */
+ setFileCallBack(state, callback) {
+ state.fileCallback = callback;
+ },
+
+ /**
+ * Screen mode toggle - ON/OFF full screen
+ * @param state
+ */
+ screenToggle(state) {
+ state.fullScreen = !state.fullScreen;
+ },
+
+ /**
+ * Reset state
+ * @param state
+ */
+ resetState(state) {
+ state.activeManager = 'left';
+ state.clipboard = {
+ type: null,
+ disk: null,
+ directories: [],
+ files: [],
+ };
+ state.disks = [];
+ state.fileCallback = null;
+ state.fullScreen = false;
+ },
};
diff --git a/src/store/settings/getters.js b/src/store/settings/getters.js
new file mode 100644
index 0000000..94b8e3b
--- /dev/null
+++ b/src/store/settings/getters.js
@@ -0,0 +1,28 @@
+export default {
+ /**
+ * Base URL
+ * @param state
+ * @returns {null}
+ */
+ baseUrl(state) {
+ return state.baseUrl;
+ },
+
+ /**
+ * Headers
+ * @param state
+ * @return {*}
+ */
+ headers(state) {
+ return state.headers;
+ },
+
+ /**
+ * Headers has Authorization
+ * @param state
+ * @return {boolean}
+ */
+ authHeader(state) {
+ return Object.prototype.hasOwnProperty.call(state.headers, 'Authorization');
+ },
+};
diff --git a/src/store/settings/mutations.js b/src/store/settings/mutations.js
new file mode 100644
index 0000000..3b843ce
--- /dev/null
+++ b/src/store/settings/mutations.js
@@ -0,0 +1,100 @@
+export default {
+ /**
+ * Set config
+ * @param state
+ * @param data
+ */
+ manualSettings(state, data) {
+ // overwrite headers - Axios
+ if (Object.prototype.hasOwnProperty.call(data, 'headers')) {
+ state.headers = data.headers;
+ }
+ // base url - axios
+ if (Object.prototype.hasOwnProperty.call(data, 'baseUrl')) {
+ state.baseUrl = data.baseUrl;
+ }
+ // windows config
+ if (Object.prototype.hasOwnProperty.call(data, 'windowsConfig')) {
+ state.windowsConfig = data.windowsConfig;
+ }
+ // language
+ if (Object.prototype.hasOwnProperty.call(data, 'lang')) {
+ state.lang = data.lang;
+ }
+ // add new translation
+ if (Object.prototype.hasOwnProperty.call(data, 'translation')) {
+ state.translations[data.translation.name] = Object.freeze(data.translation.content);
+ }
+ },
+
+ /**
+ * Initiate Axios baseUrl and headers
+ * @param state
+ */
+ initAxiosSettings(state) {
+ // initiate base url, if not set manually
+ if (!state.baseUrl) {
+ if (import.meta.env.VITE_APP_LFM_AXIOS_BASE_URL) {
+ // vue .env
+ state.baseUrl = import.meta.env.VITE_APP_LFM_AXIOS_BASE_URL;
+ } else if (import.meta.env.VITE_LFM_BASE_URL) {
+ // laravel .env
+ state.baseUrl = import.meta.env.VITE_LFM_BASE_URL;
+ } else {
+ let baseUrl = `${window.location.protocol}//${window.location.hostname}`;
+
+ if (window.location.port.length) {
+ baseUrl += `:${window.location.port}/file-manager/`;
+ } else {
+ baseUrl += '/file-manager/';
+ }
+
+ state.baseUrl = baseUrl;
+ }
+ }
+
+ // initiate headers, if not set manually
+ if (Object.keys(state.headers).length === 0) {
+ // off laravel csrf-token if need
+ if (import.meta.env.VITE_APP_LFM_CSRF_TOKEN === 'OFF' || import.meta.env.VITE_LFM_CSRF_TOKEN === 'OFF') {
+ state.headers = { 'X-Requested-With': 'XMLHttpRequest' };
+ } else {
+ // Laravel CSRF token
+ const token = document.head.querySelector('meta[name="csrf-token"]');
+
+ if (!token) {
+ state.headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ };
+ // eslint-disable-next-line
+ console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
+ } else {
+ state.headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'X-CSRF-TOKEN': token.content,
+ };
+ }
+ }
+ }
+ },
+
+ /**
+ * Initialize App settings from server
+ * @param state
+ * @param data
+ */
+ initSettings(state, data) {
+ if (!state.lang) state.lang = data.lang;
+ if (!state.windowsConfig) state.windowsConfig = data.windowsConfig;
+ state.acl = data.acl;
+ state.hiddenFiles = data.hiddenFiles;
+ },
+
+ /**
+ * Set Hide or Show hidden files
+ * @param state
+ */
+ toggleHiddenFiles(state) {
+ state.hiddenFiles = !state.hiddenFiles;
+ },
+};
diff --git a/src/store/settings/store.js b/src/store/settings/store.js
new file mode 100644
index 0000000..c039459
--- /dev/null
+++ b/src/store/settings/store.js
@@ -0,0 +1,203 @@
+import mutations from './mutations';
+import getters from './getters';
+
+// languages
+import ru from '../../lang/ru';
+import en from '../../lang/en';
+import ar from '../../lang/ar';
+import sr from '../../lang/sr';
+import cs from '../../lang/cs';
+import de from '../../lang/de';
+import es from '../../lang/es';
+import nl from '../../lang/nl';
+/* eslint camelcase: 0 */
+import zh_CN from '../../lang/zh_CN';
+import fa from '../../lang/fa';
+import it from '../../lang/it';
+import tr from '../../lang/tr';
+import fr from '../../lang/fr';
+import pt_BR from '../../lang/pt_BR';
+import zh_TW from '../../lang/zh_TW';
+import pl from '../../lang/pl';
+import hu from '../../lang/hu';
+
+export default {
+ namespaced: true,
+ state() {
+ return {
+ // ACL
+ acl: null,
+
+ // App version
+ version: '3.1.1',
+
+ // axios headers
+ headers: {},
+
+ // axios default URL
+ baseUrl: null,
+
+ /**
+ * File manager windows configuration
+ * 1 - only one file manager window
+ * 2 - one file manager window with directories tree module
+ * 3 - two file manager windows
+ */
+ windowsConfig: null,
+
+ // App language
+ lang: null,
+
+ // Translations (/src/lang)
+ translations: {
+ ru: Object.freeze(ru),
+ en: Object.freeze(en),
+ ar: Object.freeze(ar),
+ sr: Object.freeze(sr),
+ cs: Object.freeze(cs),
+ de: Object.freeze(de),
+ es: Object.freeze(es),
+ nl: Object.freeze(nl),
+ 'zh-CN': Object.freeze(zh_CN),
+ fa: Object.freeze(fa),
+ it: Object.freeze(it),
+ tr: Object.freeze(tr),
+ fr: Object.freeze(fr),
+ 'pt-BR': Object.freeze(pt_BR),
+ 'zh-TW': Object.freeze(zh_TW),
+ pl: Object.freeze(pl),
+ hu: Object.freeze(hu),
+ },
+
+ // show or hide hidden files
+ hiddenFiles: false,
+
+ // Context menu items
+ contextMenu: [
+ [
+ {
+ name: 'open',
+ icon: 'bi-folder2-open',
+ },
+ {
+ name: 'audioPlay',
+ icon: 'bi-play',
+ },
+ {
+ name: 'videoPlay',
+ icon: 'bi-play',
+ },
+ {
+ name: 'view',
+ icon: 'bi-eye',
+ },
+ {
+ name: 'edit',
+ icon: 'bi-pen',
+ },
+ {
+ name: 'select',
+ icon: 'bi-check2',
+ },
+ {
+ name: 'download',
+ icon: 'bi-download',
+ },
+ ],
+ [
+ {
+ name: 'copy',
+ icon: 'bi-files',
+ },
+ {
+ name: 'cut',
+ icon: 'bi-scissors',
+ },
+ {
+ name: 'rename',
+ icon: 'bi-pencil-square',
+ },
+ {
+ name: 'paste',
+ icon: 'bi-clipboard',
+ },
+ {
+ name: 'zip',
+ icon: 'bi-file-zip',
+ },
+ {
+ name: 'unzip',
+ icon: 'bi-file-zip-fill',
+ },
+ ],
+ [
+ {
+ name: 'delete',
+ icon: 'bi-trash text-danger',
+ },
+ ],
+ [
+ {
+ name: 'properties',
+ icon: 'bi-card-list',
+ },
+ ],
+ ],
+
+ // Image extensions for view and preview
+ imageExtensions: ['png', 'jpg', 'jpeg', 'gif', 'webp'],
+
+ // Image extensions for cropping
+ cropExtensions: ['png', 'jpg', 'jpeg', 'webp'],
+
+ // audio extensions for play
+ audioExtensions: ['ogg', 'mp3', 'aac', 'wav'],
+
+ // video extensions for play
+ videoExtensions: ['webm', 'mp4'],
+
+ // File extensions for code editor
+ textExtensions: {
+ sh: 'text/x-sh',
+ // styles
+ css: 'text/css',
+ less: 'text/x-less',
+ sass: 'text/x-sass',
+ scss: 'text/x-scss',
+ html: 'text/html',
+ // js
+ js: 'text/javascript',
+ ts: 'text/typescript',
+ vue: 'text/x-vue',
+ // text
+ htaccess: 'text/plain',
+ env: 'text/plain',
+ txt: 'text/plain',
+ log: 'text/plain',
+ ini: 'text/x-ini',
+ xml: 'application/xml',
+ md: 'text/x-markdown',
+ // c-like
+ java: 'text/x-java',
+ c: 'text/x-csrc',
+ cpp: 'text/x-c++src',
+ cs: 'text/x-csharp',
+ scl: 'text/x-scala',
+ php: 'application/x-httpd-php',
+ // DB
+ sql: 'text/x-sql',
+ // other
+ pl: 'text/x-perl',
+ py: 'text/x-python',
+ lua: 'text/x-lua',
+ swift: 'text/x-swift',
+ rb: 'text/x-ruby',
+ go: 'text/x-go',
+ yaml: 'text/x-yaml',
+ json: 'application/json',
+ },
+ };
+ },
+ mutations,
+ getters,
+};
diff --git a/src/store/state.js b/src/store/state.js
index 97e04dc..afbc675 100644
--- a/src/store/state.js
+++ b/src/store/state.js
@@ -1,25 +1,28 @@
export default {
- /**
- * Active manager
- * left or right
- * default: left
- */
- activeManager: 'left',
+ /**
+ * Active manager
+ * left or right
+ * default: left
+ */
+ activeManager: 'left',
- /**
- * Clipboard
- * Type - copy || cut
- */
- clipboard: {
- type: null,
- disk: null,
- directories: [],
- files: [],
- },
+ /**
+ * Clipboard
+ * Operation type - copy || cut
+ */
+ clipboard: {
+ type: null,
+ disk: null,
+ directories: [],
+ files: [],
+ },
- // disk list
- diskList: [],
+ // available disks
+ disks: [],
- // file callback for ckeditor, ...
- fileCallback: null,
+ // file callback for ckeditor, ...
+ fileCallback: null,
+
+ // full screen mode
+ fullScreen: false,
};
diff --git a/src/store/tree/actions.js b/src/store/tree/actions.js
new file mode 100644
index 0000000..02332d8
--- /dev/null
+++ b/src/store/tree/actions.js
@@ -0,0 +1,253 @@
+import GET from '../../http/get';
+
+export default {
+ /**
+ * Initialize directories tree
+ * @param state
+ * @param commit
+ * @param disk
+ * @returns {Promise}
+ */
+ initTree({ state, commit }, disk) {
+ return GET.tree(disk, null).then((response) => {
+ // if the action was successful
+ if (response.data.result.status === 'success') {
+ // clean the tree, if need
+ if (state.directories) commit('cleanTree');
+
+ // initialize directories tree
+ commit('addDirectories', {
+ parentId: 0,
+ directories: response.data.directories,
+ });
+ }
+ });
+ },
+
+ /**
+ * Add new directory to the tree
+ * @param state
+ * @param commit
+ * @param getters
+ * @param parentPath
+ * @param newDirectory
+ */
+ addToTree({ state, commit, getters }, { parentPath, newDirectory }) {
+ // If this directory is not the root directory
+ if (parentPath) {
+ // find parent directory index
+ const parentDirectoryIndex = getters.findDirectoryIndex(parentPath);
+
+ if (parentDirectoryIndex !== -1) {
+ // add a new directory
+ commit('addDirectories', {
+ directories: newDirectory,
+ parentId: state.directories[parentDirectoryIndex].id,
+ });
+
+ // update parent directory property
+ commit('updateDirectoryProps', {
+ index: parentDirectoryIndex,
+ props: {
+ hasSubdirectories: true,
+ showSubdirectories: true,
+ subdirectoriesLoaded: true,
+ },
+ });
+ } else {
+ commit('fm/messages/setError', { message: 'Directory not found' }, { root: true });
+ }
+ } else {
+ // add a new directory to the root of the disk
+ commit('addDirectories', {
+ directories: newDirectory,
+ parentId: 0,
+ });
+ }
+ },
+
+ /**
+ * Delete directories and subdirectories from tree
+ * @param state
+ * @param commit
+ * @param getters
+ * @param dispatch
+ * @param directories
+ */
+ deleteFromTree({ state, commit, getters, dispatch }, directories) {
+ directories.forEach((item) => {
+ // find this directory in the tree
+ const directoryIndex = getters.findDirectoryIndex(item.path);
+
+ if (directoryIndex !== -1) {
+ // add directory index to array for deleting
+ commit('addToTempArray', directoryIndex);
+
+ // if directory has subdirectories
+ if (state.directories[directoryIndex].props.hasSubdirectories) {
+ // find subDirectories
+ dispatch('subDirsFinder', state.directories[directoryIndex].id);
+ }
+ }
+ });
+
+ // filter directories
+ const temp = state.directories.filter((item, index) => {
+ if (state.tempIndexArray.indexOf(index) === -1) {
+ return item;
+ }
+ return false;
+ });
+
+ // replace directories
+ commit('replaceDirectories', temp);
+
+ // clear temp array
+ commit('clearTempArray');
+ },
+
+ /**
+ * Find subdirectories
+ * @param state
+ * @param commit
+ * @param dispatch
+ * @param parentId
+ */
+ subDirsFinder({ state, commit, dispatch }, parentId) {
+ // find sub directories
+ state.directories.forEach((item, index) => {
+ if (item.parentId === parentId) {
+ // add directory index to array
+ commit('addToTempArray', index);
+
+ // if directory has subdirectories
+ if (item.props.hasSubdirectories) {
+ // find subDirectories
+ dispatch('subDirsFinder', item.id);
+ }
+ }
+ });
+ },
+
+ /**
+ * Get subDirectories from server
+ * @param commit
+ * @param rootGetters
+ * @param path
+ * @param parentId
+ * @param parentIndex
+ * @returns {Promise}
+ */
+ getSubdirectories({ commit, rootGetters }, { path, parentId, parentIndex }) {
+ return GET.tree(rootGetters['fm/selectedDisk'], path).then((response) => {
+ // if the action was successful
+ if (response.data.result.status === 'success') {
+ // add directories
+ commit('addDirectories', {
+ parentId,
+ directories: response.data.directories,
+ });
+
+ // update properties at parent directory
+ commit('updateDirectoryProps', {
+ index: parentIndex,
+ props: {
+ subdirectoriesLoaded: true,
+ },
+ });
+ }
+ });
+ },
+
+ /**
+ * Show subdirectories
+ * @param state
+ * @param commit
+ * @param getters
+ * @param dispatch
+ * @param path
+ * @returns {*}
+ */
+ showSubdirectories({ state, commit, getters, dispatch }, path) {
+ const promise = Promise.resolve();
+ // find parent directory index
+ const parentDirectoryIndex = getters.findDirectoryIndex(path);
+
+ if (parentDirectoryIndex !== -1) {
+ // Are the subdirectories loaded?
+ if (state.directories[parentDirectoryIndex].props.subdirectoriesLoaded) {
+ // update directory properties
+ commit('updateDirectoryProps', {
+ index: parentDirectoryIndex,
+ props: {
+ showSubdirectories: true,
+ },
+ });
+ } else {
+ // load subdirectories
+ return dispatch('getSubdirectories', {
+ path: state.directories[parentDirectoryIndex].path,
+ parentId: state.directories[parentDirectoryIndex].id,
+ parentIndex: parentDirectoryIndex,
+ }).then(() => {
+ // update properties in the parent directory
+ commit('updateDirectoryProps', {
+ index: parentDirectoryIndex,
+ props: {
+ showSubdirectories: true,
+ },
+ });
+ });
+ }
+ } else {
+ commit('fm/messages/setError', { message: 'Directory not found' }, { root: true });
+ }
+
+ return promise;
+ },
+
+ /**
+ * Hide subdirectories
+ * @param commit
+ * @param getters
+ * @param path
+ */
+ hideSubdirectories({ commit, getters }, path) {
+ // find parent directory index
+ const parentDirectoryIndex = getters.findDirectoryIndex(path);
+
+ if (parentDirectoryIndex !== -1) {
+ // hide subdirectories
+ commit('updateDirectoryProps', {
+ index: parentDirectoryIndex,
+ props: {
+ showSubdirectories: false,
+ },
+ });
+ } else {
+ commit('fm/messages/setError', { message: 'Directory not found' }, { root: true });
+ }
+ },
+
+ /**
+ * Reopen tree directories by selected path
+ * @param dispatch
+ * @param path
+ * @returns {Promise}
+ */
+ reopenPath({ dispatch }, path) {
+ let promises = Promise.resolve();
+
+ if (path) {
+ const splitPath = path.split('/');
+
+ for (let i = 0; splitPath.length > i; i += 1) {
+ promises = promises.then(() => dispatch('showSubdirectories', splitPath.slice(0, i + 1).join('/')));
+ }
+
+ return promises;
+ }
+
+ return promises;
+ },
+};
diff --git a/src/store/tree/getters.js b/src/store/tree/getters.js
new file mode 100644
index 0000000..c51e291
--- /dev/null
+++ b/src/store/tree/getters.js
@@ -0,0 +1,23 @@
+export default {
+ /**
+ * Find directory index in the tree
+ * @param state
+ * @returns {function(*): (number | *)}
+ */
+ findDirectoryIndex: (state) => (path) => state.directories.findIndex((el) => el.path === path),
+
+ /**
+ * Filtered directories list
+ * @param state
+ * @param getters
+ * @param rootState
+ * @returns {*}
+ */
+ directories(state, getters, rootState) {
+ if (rootState.fm.settings.hiddenFiles) {
+ return state.directories;
+ }
+
+ return state.directories.filter((item) => item.basename.match(/^([^.]).*/i));
+ },
+};
diff --git a/src/store/tree/mutations.js b/src/store/tree/mutations.js
new file mode 100644
index 0000000..53d88f4
--- /dev/null
+++ b/src/store/tree/mutations.js
@@ -0,0 +1,71 @@
+/* eslint-disable no-param-reassign,no-restricted-syntax */
+export default {
+ /**
+ * Clean the directories tree
+ * @param state
+ */
+ cleanTree(state) {
+ state.directories = [];
+ state.counter = 1;
+ },
+
+ /**
+ * Add directories to the tree
+ * @param state
+ * @param directories
+ * @param parentId
+ */
+ addDirectories(state, { directories, parentId }) {
+ directories.forEach((directory) => {
+ // add properties to dir
+ directory.id = state.counter;
+ directory.parentId = parentId;
+ directory.props.subdirectoriesLoaded = false;
+ directory.props.showSubdirectories = false;
+
+ state.counter += 1;
+
+ state.directories.push(directory);
+ });
+ },
+
+ /**
+ * Replace directories
+ * @param state
+ * @param directories
+ */
+ replaceDirectories(state, directories) {
+ state.directories = directories;
+ },
+
+ /**
+ * Update directory properties
+ * @param state
+ * @param index
+ * @param props
+ */
+ updateDirectoryProps(state, { index, props }) {
+ for (const property in props) {
+ if (Object.prototype.hasOwnProperty.call(props, property)) {
+ state.directories[index].props[property] = props[property];
+ }
+ }
+ },
+
+ /**
+ * Add to temp index array
+ * @param state
+ * @param index
+ */
+ addToTempArray(state, index) {
+ state.tempIndexArray.push(index);
+ },
+
+ /**
+ * Clear temp index array
+ * @param state
+ */
+ clearTempArray(state) {
+ state.tempIndexArray = [];
+ },
+};
diff --git a/src/store/tree/store.js b/src/store/tree/store.js
new file mode 100644
index 0000000..7865df0
--- /dev/null
+++ b/src/store/tree/store.js
@@ -0,0 +1,32 @@
+import mutations from './mutations';
+import getters from './getters';
+import actions from './actions';
+
+export default {
+ namespaced: true,
+ state() {
+ return {
+ /**
+ * directories.id (int), el id
+ * directories.basename (string), folder name
+ * directories.dirname (string) directory name
+ * directories.path (string), path to directory
+ * directories.props (object), directory properties
+ * directories.props.hasSubdirectories (boolean), has child directories,
+ * directories.props.subdirectoriesLoaded (boolean), child directories loaded
+ * directories.props.showSubdirectories (boolean), show or hide subdirectories branch
+ * directories.parentId (int), parent id
+ */
+ directories: [],
+
+ // directories id counter
+ counter: 1,
+
+ // directories array for deleting(indexes)
+ tempIndexArray: [],
+ };
+ },
+ mutations,
+ getters,
+ actions,
+};
diff --git a/static/.gitkeep b/static/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..26f533a
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,20 @@
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue()],
+ build: {
+ minify: true,
+ cssCodeSplit: false,
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ vendor: [],
+ },
+ },
+ },
+ },
+
+ css: { preprocessorOptions: { scss: { charset: false } } },
+});
|