diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 795aba6b..1199d2c7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,7 +12,6 @@ "@vueuse/core": "^10.5.0", "@vueuse/integrations": "^10.5.0", "ace-builds": "^1.31.1", - "clipboard": "^2.0.11", "core-js": "^3.33.2", "dayjs": "^1.11.10", "filesize": "^10.1.0", @@ -30,6 +29,7 @@ "videojs-hotkeys": "^0.2.28", "videojs-mobile-ui": "^1.1.1", "vue": "^3.3.4", + "vue-final-modal": "^4.4.5", "vue-i18n": "^9.6.4", "vue-lazyload": "^3.0.0", "vue-router": "^4.2.5", @@ -3677,16 +3677,6 @@ "node": ">= 6" } }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3936,11 +3926,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4551,8 +4536,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "optional": true, - "peer": true, "dependencies": { "tabbable": "^6.2.0" } @@ -4704,14 +4687,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", - "dependencies": { - "delegate": "^3.1.2" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -6353,11 +6328,6 @@ "node": ">=v12.22.7" } }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -6544,9 +6514,7 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "optional": true, - "peer": true + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/terser": { "version": "5.24.0", @@ -6572,11 +6540,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -7059,6 +7022,197 @@ "eslint": ">=6.0.0" } }, + "node_modules/vue-final-modal": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/vue-final-modal/-/vue-final-modal-4.4.5.tgz", + "integrity": "sha512-5O1twpVcOuvxc8fJppNYtdZ4M0GGeoSMcHZTFUoie3BmtzSx3EE6Lvz8YgnpQbDkxVMmRKEjhsSBywqqWfoQVw==", + "dependencies": { + "@vueuse/core": "^9.13.0", + "@vueuse/integrations": "^9.13.0", + "focus-trap": "^7.4.0", + "vue": "^3.3.4" + }, + "peerDependencies": { + "@vueuse/core": ">=9.11.1", + "@vueuse/integrations": ">=9.11.1", + "focus-trap": ">=7.2.0", + "vue": ">=3.2.0" + } + }, + "node_modules/vue-final-modal/node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/vue-final-modal/node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/integrations": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-9.13.0.tgz", + "integrity": "sha512-I1kX/tsfcvWWLZD7HZaP0LsSfchK13YxReLfharXhk72SFXp87doLbRaTfIF5w8m/gr/vPtcNyQPAXW7Ubpuww==", + "dependencies": { + "@vueuse/core": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vue-final-modal/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-i18n": { "version": "9.6.4", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.6.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5c23b6a5..0d0d4d27 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,7 +22,6 @@ "@vueuse/core": "^10.5.0", "@vueuse/integrations": "^10.5.0", "ace-builds": "^1.31.1", - "clipboard": "^2.0.11", "core-js": "^3.33.2", "dayjs": "^1.11.10", "filesize": "^10.1.0", @@ -40,6 +39,7 @@ "videojs-hotkeys": "^0.2.28", "videojs-mobile-ui": "^1.1.1", "vue": "^3.3.4", + "vue-final-modal": "^4.4.5", "vue-i18n": "^9.6.4", "vue-lazyload": "^3.0.0", "vue-router": "^4.2.5", diff --git a/frontend/src/components/prompts/BaseModal.vue b/frontend/src/components/prompts/BaseModal.vue new file mode 100644 index 00000000..38023839 --- /dev/null +++ b/frontend/src/components/prompts/BaseModal.vue @@ -0,0 +1,20 @@ + + + diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue index 66c07cdf..31cc8583 100644 --- a/frontend/src/components/prompts/Copy.vue +++ b/frontend/src/components/prompts/Copy.vue @@ -6,7 +6,7 @@

{{ $t("prompts.copyMessage") }}

- +
@@ -15,14 +15,17 @@ @click="closeHovers" :aria-label="$t('buttons.cancel')" :title="$t('buttons.cancel')" + tabindex="3" > {{ $t("buttons.cancel") }} diff --git a/frontend/src/components/prompts/Delete.vue b/frontend/src/components/prompts/Delete.vue index 886591fd..096a334e 100644 --- a/frontend/src/components/prompts/Delete.vue +++ b/frontend/src/components/prompts/Delete.vue @@ -14,14 +14,17 @@ class="button button--flat button--grey" :aria-label="$t('buttons.cancel')" :title="$t('buttons.cancel')" + tabindex="2" > {{ $t("buttons.cancel") }} diff --git a/frontend/src/components/prompts/DeleteUser.vue b/frontend/src/components/prompts/DeleteUser.vue new file mode 100644 index 00000000..e45dab8e --- /dev/null +++ b/frontend/src/components/prompts/DeleteUser.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend/src/components/prompts/Download.vue b/frontend/src/components/prompts/Download.vue index a1fc2fd6..553e766e 100644 --- a/frontend/src/components/prompts/Download.vue +++ b/frontend/src/components/prompts/Download.vue @@ -1,18 +1,18 @@ - diff --git a/frontend/src/components/prompts/Help.vue b/frontend/src/components/prompts/Help.vue index 10075959..a5c5d138 100644 --- a/frontend/src/components/prompts/Help.vue +++ b/frontend/src/components/prompts/Help.vue @@ -20,11 +20,13 @@
diff --git a/frontend/src/components/prompts/Info.vue b/frontend/src/components/prompts/Info.vue index a07292aa..68a6cc9d 100644 --- a/frontend/src/components/prompts/Info.vue +++ b/frontend/src/components/prompts/Info.vue @@ -33,33 +33,45 @@

MD5: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA1: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA256: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA512: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

@@ -67,6 +79,7 @@
diff --git a/frontend/src/components/prompts/NewDir.vue b/frontend/src/components/prompts/NewDir.vue index 0e172ca7..4510bc27 100644 --- a/frontend/src/components/prompts/NewDir.vue +++ b/frontend/src/components/prompts/NewDir.vue @@ -1,85 +1,88 @@ - diff --git a/frontend/src/components/prompts/NewFile.vue b/frontend/src/components/prompts/NewFile.vue index fcd67822..b7c05d44 100644 --- a/frontend/src/components/prompts/NewFile.vue +++ b/frontend/src/components/prompts/NewFile.vue @@ -1,14 +1,14 @@ - diff --git a/frontend/src/components/prompts/Prompts.vue b/frontend/src/components/prompts/Prompts.vue index 076b9340..844272b9 100644 --- a/frontend/src/components/prompts/Prompts.vue +++ b/frontend/src/components/prompts/Prompts.vue @@ -1,19 +1,22 @@ - diff --git a/frontend/src/components/prompts/Rename.vue b/frontend/src/components/prompts/Rename.vue index 81c68d02..d1730701 100644 --- a/frontend/src/components/prompts/Rename.vue +++ b/frontend/src/components/prompts/Rename.vue @@ -10,8 +10,8 @@ >:

{{ $t("buttons.cancel") }} @@ -22,14 +23,17 @@ @click="showAction" :aria-label="$t('buttons.continue')" :title="$t('buttons.continue')" + tabindex="2" > {{ $t("buttons.continue") }} diff --git a/frontend/src/components/prompts/ReplaceRename.vue b/frontend/src/components/prompts/ReplaceRename.vue index 509386b5..d50004ea 100644 --- a/frontend/src/components/prompts/ReplaceRename.vue +++ b/frontend/src/components/prompts/ReplaceRename.vue @@ -14,6 +14,7 @@ @click="closeHovers" :aria-label="$t('buttons.cancel')" :title="$t('buttons.cancel')" + tabindex="3" > {{ $t("buttons.cancel") }} @@ -22,14 +23,17 @@ @click="(event) => showConfirm(event, 'rename')" :aria-label="$t('buttons.rename')" :title="$t('buttons.rename')" + tabindex="2" > {{ $t("buttons.rename") }} diff --git a/frontend/src/components/prompts/Share.vue b/frontend/src/components/prompts/Share.vue index 80baad33..78678bd4 100644 --- a/frontend/src/components/prompts/Share.vue +++ b/frontend/src/components/prompts/Share.vue @@ -1,5 +1,5 @@ @@ -80,9 +59,9 @@ import { useRoute, useRouter } from "vue-router"; import { useI18n } from "vue-i18n"; import { StatusError } from "@/api/utils"; -const error = ref(null); -const originalUser = ref(null); -const user = ref(null); +const error = ref(); +const originalUser = ref(); +const user = ref(); const createUserDir = ref(false); const $showError = inject("$showError")!; @@ -136,11 +115,12 @@ const fetchData = async () => { } }; -const deletePrompt = () => layoutStore.showHover("deleteUser"); +const deletePrompt = () => + layoutStore.showHover({ prompt: "deleteUser", confirm: deleteUser }); const deleteUser = async (e: Event) => { e.preventDefault(); - if (user.value === null) { + if (!user.value) { return false; } try { @@ -157,21 +137,22 @@ const deleteUser = async (e: Event) => { return true; }; + const save = async (event: Event) => { event.preventDefault(); - if (originalUser.value === null || user.value === null) { + if (!user.value) { return false; } try { if (isNew.value) { const newUser: IUser = { - ...originalUser.value, + ...originalUser?.value, ...user.value, }; - const loc = (await api.create(newUser)) || "/settings/users"; - router.push({ path: loc }); + const loc = await api.create(newUser); + router.push({ path: loc || "/settings/users" }); $showSuccess(t("settings.userCreated")); } else { await api.update(user.value);