diff options
author | F. E Noel Nfebe <fenn25.fn@gmail.com> | 2024-11-19 21:15:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-19 21:15:05 +0100 |
commit | af14ff066c28272128b49661e8cd209fe549919c (patch) | |
tree | f9bae3fa00874269ec0a900ac802e00c6fcd9975 /apps/files/src | |
parent | 8f6ef39391c6a1d99b81bec8f5c79b5a129e7ce0 (diff) | |
parent | 724a79aba3cdae0e569241664f2db3b012dc5fbc (diff) | |
download | nextcloud-server-af14ff066c28272128b49661e8cd209fe549919c.tar.gz nextcloud-server-af14ff066c28272128b49661e8cd209fe549919c.zip |
Merge pull request #49308 from nextcloud/feat/46528/ask-confirm-extension-change
feat: add confirmation dialog for file extension changes
Diffstat (limited to 'apps/files/src')
-rw-r--r-- | apps/files/src/store/renaming.ts | 79 |
1 files changed, 78 insertions, 1 deletions
diff --git a/apps/files/src/store/renaming.ts b/apps/files/src/store/renaming.ts index ff8ac3ba8da..2ec73837f82 100644 --- a/apps/files/src/store/renaming.ts +++ b/apps/files/src/store/renaming.ts @@ -8,11 +8,77 @@ import type { RenamingStore } from '../types' import axios, { isAxiosError } from '@nextcloud/axios' import { emit, subscribe } from '@nextcloud/event-bus' import { NodeStatus } from '@nextcloud/files' +import { DialogBuilder } from '@nextcloud/dialogs' import { t } from '@nextcloud/l10n' -import { basename, dirname } from 'path' +import { basename, dirname, extname } from 'path' import { defineStore } from 'pinia' import logger from '../logger' import Vue from 'vue' +import IconCancel from '@mdi/svg/svg/cancel.svg?raw' +import IconCheck from '@mdi/svg/svg/check.svg?raw' + +let isDialogVisible = false + +const showWarningDialog = (oldExtension: string, newExtension: string): Promise<boolean> => { + if (isDialogVisible) { + return Promise.resolve(false) + } + + isDialogVisible = true + + let message + + if (!oldExtension && newExtension) { + message = t( + 'files', + 'Adding the file extension "{new}" may render the file unreadable.', + { new: newExtension }, + ) + } else if (!newExtension) { + message = t( + 'files', + 'Removing the file extension "{old}" may render the file unreadable.', + { old: oldExtension }, + ) + } else { + message = t( + 'files', + 'Changing the file extension from "{old}" to "{new}" may render the file unreadable.', + { old: oldExtension, new: newExtension }, + ) + } + + return new Promise((resolve) => { + const dialog = new DialogBuilder() + .setName(t('files', 'Change file extension')) + .setText(message) + .setButtons([ + { + label: t('files', 'Keep {oldextension}', { oldextension: oldExtension }), + icon: IconCancel, + type: 'secondary', + callback: () => { + isDialogVisible = false + resolve(false) + }, + }, + { + label: newExtension.length ? t('files', 'Use {newextension}', { newextension: newExtension }) : t('files', 'Remove extension'), + icon: IconCheck, + type: 'primary', + callback: () => { + isDialogVisible = false + resolve(true) + }, + }, + ]) + .build() + + dialog.show().then(() => { + dialog.hide() + }) + }) +} export const useRenamingStore = function(...args) { const store = defineStore('renaming', { @@ -36,6 +102,17 @@ export const useRenamingStore = function(...args) { const newName = this.newName.trim?.() || '' const oldName = this.renamingNode.basename const oldEncodedSource = this.renamingNode.encodedSource + + // Check for extension change + const oldExtension = extname(oldName) + const newExtension = extname(newName) + if (oldExtension !== newExtension) { + const proceed = await showWarningDialog(oldExtension, newExtension) + if (!proceed) { + return false + } + } + if (oldName === newName) { return false } |