|
|
|
@ -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 |
|
|
|
} |
|
|
|
|