From a40ea4855f01e4fd8bee5cbe0e21a2c098ba2882 Mon Sep 17 00:00:00 2001 From: Andrea Leardini Date: Thu, 5 Dec 2024 09:13:13 +0100 Subject: [PATCH] feat(ui): restore file or folder (#62) --- build-images.sh | 2 +- ui/package.json | 8 +- ui/public/i18n/en/translation.json | 34 +- .../BackupRepositorySelector.vue | 152 +++++ .../shared-folders/BackupSnapshotSelector.vue | 147 +++++ .../shared-folders/RestoreFileModal.vue | 546 ++++++++++++++++++ ui/src/main.js | 11 + ui/src/views/Shares.vue | 28 +- ui/yarn.lock | 23 +- 9 files changed, 939 insertions(+), 12 deletions(-) create mode 100644 ui/src/components/shared-folders/BackupRepositorySelector.vue create mode 100644 ui/src/components/shared-folders/BackupSnapshotSelector.vue create mode 100644 ui/src/components/shared-folders/RestoreFileModal.vue diff --git a/build-images.sh b/build-images.sh index 50cc6387..33d4a235 100644 --- a/build-images.sh +++ b/build-images.sh @@ -10,7 +10,7 @@ user_manager_version=v1.0.1 container="ubuntu-working-container" # Prepare a local Ubuntu-based samba image if ! buildah inspect --type container "${container}" &>/dev/null; then - container=$(buildah from --name "${container}" docker.io/library/ubuntu:23.10) + container=$(buildah from --name "${container}" docker.io/library/ubuntu:24.04) buildah run "${container}" -- bash <<'EOF' set -e apt-get update diff --git a/ui/package.json b/ui/package.json index 957b6ad1..e45bbb22 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,23 +6,27 @@ "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", - "watch": "vue-cli-service build --watch" + "watch": "vue-cli-service build --watch", + "format": "prettier --write src/" }, "dependencies": { "@carbon/icons-vue": "^10.37.0", "@carbon/vue": "^2.40.0", - "@nethserver/ns8-ui-lib": "^1.1.4", + "@nethserver/ns8-ui-lib": "^1.2.1", "await-to-js": "^3.0.0", "axios": "^0.21.2", "carbon-components": "^10.41.0", "core-js": "^3.6.5", "lottie-web-vue": "^1.2.0", + "mark.js": "^8.11.1", "sass": "^1.34.1", "vue": "^2.6.11", "vue-axios": "^3.2.4", "vue-date-fns": "^2.0.1", "vue-i18n": "^8.24.4", + "vue-infinite-loading": "^2.4.5", "vue-router": "^3.2.0", + "vue2-debounce": "^1.0.1", "vuex": "^3.4.0" }, "devDependencies": { diff --git a/ui/public/i18n/en/translation.json b/ui/public/i18n/en/translation.json index 68043d8c..8c995951 100644 --- a/ui/public/i18n/en/translation.json +++ b/ui/public/i18n/en/translation.json @@ -4,7 +4,10 @@ "work_in_progress": "Work in progress", "processing": "Processing...", "save": "Save", - "close": "Close" + "close": "Close", + "cancel": "Cancel", + "next": "Next", + "previous": "Previous" }, "status": { "title": "Status", @@ -60,7 +63,23 @@ "set_shared_folder_permissions_explanation": "You are about to set new permissions on all files and subdirectories of shared folder '{name}'. This might take some time, depending on the size of the shared folder", "permissions": "Permissions", "set_permissions_for_share_name": "Set permissions for shared folder {name}", - "invalid_permissions": "Invalid permissions" + "invalid_permissions": "Invalid permissions", + "restore_file_or_folder": "Restore file or folder", + "restore": "Restore", + "select_backup_destination": "Select backup destination", + "select_backup_snapshot": "Select backup snapshot", + "select_file_or_folder_to_restore": "Select file or folder to restore", + "no_backup_destination": "No backup destination", + "from_node_name_of_this_cluster": "From node {name} of this cluster", + "from_node_name_of_different_cluster": "From node {name} of a different cluster", + "from_this_cluster": "From this cluster", + "from_different_cluster": "From a different cluster", + "from_node_name": "From node {name}", + "most_recent": "Most recent", + "no_snapshot_to_restore": "No snapshot to restore", + "search_file_or_folder": "Search file or folder", + "restore_file_info": "The selected file or folder will be restored to '{restoredFolder}'. Ensure there is sufficient space on {node} to avoid restore failure.", + "restoring_to_share_name": "Restoring to share '{name}'" }, "about": { "title": "About" @@ -82,7 +101,10 @@ "alter-share": "Edit description", "remove-share": "Delete shared folder", "list-domain-groups": "List domain groups", - "reset-share-acls": "Set shared folder permissions" + "reset-share-acls": "Set shared folder permissions", + "restore-backup-content": "Restore file or folder", + "seek-snapshot-contents": "Search matching files", + "read-backup-snapshots": "Read backup snapshots" }, "error": { "error": "Error", @@ -95,5 +117,11 @@ "404": "Resource not found", "cannot_retrieve_module_info": "Cannot retrieve module info", "cannot_retrieve_installed_modules": "Cannot retrieve installed modules" + }, + "ns_combo_search_box": { + "placeholder": "Search", + "clear_search": "Clear search", + "no_results": "No results", + "results_limit_reached": "Keep typing to show more options" } } diff --git a/ui/src/components/shared-folders/BackupRepositorySelector.vue b/ui/src/components/shared-folders/BackupRepositorySelector.vue new file mode 100644 index 00000000..1bb38f9b --- /dev/null +++ b/ui/src/components/shared-folders/BackupRepositorySelector.vue @@ -0,0 +1,152 @@ + + + + + + diff --git a/ui/src/components/shared-folders/BackupSnapshotSelector.vue b/ui/src/components/shared-folders/BackupSnapshotSelector.vue new file mode 100644 index 00000000..6c813c45 --- /dev/null +++ b/ui/src/components/shared-folders/BackupSnapshotSelector.vue @@ -0,0 +1,147 @@ + + + + + + diff --git a/ui/src/components/shared-folders/RestoreFileModal.vue b/ui/src/components/shared-folders/RestoreFileModal.vue new file mode 100644 index 00000000..bce64711 --- /dev/null +++ b/ui/src/components/shared-folders/RestoreFileModal.vue @@ -0,0 +1,546 @@ + + + + + + diff --git a/ui/src/main.js b/ui/src/main.js index bb2d3035..8138d048 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -24,6 +24,17 @@ Vue.use(VueDateFns); import LottieAnimation from "lottie-web-vue"; Vue.use(LottieAnimation); +import InfiniteLoading from "vue-infinite-loading"; +Vue.use(InfiniteLoading, { + slots: { + noResults: "", + noMore: "", + }, +}); + +import vueDebounce from "vue2-debounce"; +Vue.use(vueDebounce); + // filters import { Filters } from "@nethserver/ns8-ui-lib"; for (const f in Filters) { diff --git a/ui/src/views/Shares.vue b/ui/src/views/Shares.vue index 2f218779..b795fd83 100644 --- a/ui/src/views/Shares.vue +++ b/ui/src/views/Shares.vue @@ -58,8 +58,8 @@ @click="showCreateSharedFolderModal" class="empty-state-button" >{{ $t("shares.create_shared_folder") }} + > + @@ -91,6 +91,12 @@ :label="$t('shares.set_permissions')" /> + + + + +