aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/components/NewNodeDialog.vue
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-01-21 01:29:24 +0100
committerFerdinand Thiessen <opensource@fthiessen.de>2024-02-09 01:06:42 +0100
commit8be4704e1125b6eb6fe17a58c8b54c651fa40c0c (patch)
treeefad38860b0004efb2b3831ad2c4d2d75756dd2c /apps/files/src/components/NewNodeDialog.vue
parente62c5d719de2a50f944246dee8f0990ccd84beec (diff)
downloadnextcloud-server-8be4704e1125b6eb6fe17a58c8b54c651fa40c0c.tar.gz
nextcloud-server-8be4704e1125b6eb6fe17a58c8b54c651fa40c0c.zip
enh(files): Add modal to set filename before creating new files in the fileslist
* Reactive `openfile` query Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps/files/src/components/NewNodeDialog.vue')
-rw-r--r--apps/files/src/components/NewNodeDialog.vue149
1 files changed, 149 insertions, 0 deletions
diff --git a/apps/files/src/components/NewNodeDialog.vue b/apps/files/src/components/NewNodeDialog.vue
new file mode 100644
index 00000000000..38337ddf4b8
--- /dev/null
+++ b/apps/files/src/components/NewNodeDialog.vue
@@ -0,0 +1,149 @@
+<!--
+ - @copyright Copyright (c) 2024 Ferdinand Thiessen <opensource@fthiessen.de>
+ -
+ - @author Ferdinand Thiessen <opensource@fthiessen.de>
+ -
+ - @license AGPL-3.0-or-later
+ -
+ - This program is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU Affero General Public License as
+ - published by the Free Software Foundation, either version 3 of the
+ - License, or (at your option) any later version.
+ -
+ - This program is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU Affero General Public License for more details.
+ -
+ - You should have received a copy of the GNU Affero General Public License
+ - along with this program. If not, see <http://www.gnu.org/licenses/>.
+ -
+ -->
+<template>
+ <NcDialog :name="name"
+ :open="open"
+ close-on-click-outside
+ out-transition
+ @update:open="onClose">
+ <template #actions>
+ <NcButton type="primary"
+ :disabled="!isUniqueName"
+ @click="onCreate">
+ {{ t('files', 'Create') }}
+ </NcButton>
+ </template>
+ <form @submit.prevent="onCreate">
+ <NcTextField ref="input"
+ :error="!isUniqueName"
+ :helper-text="errorMessage"
+ :label="label"
+ :value.sync="localDefaultName" />
+ </form>
+ </NcDialog>
+</template>
+
+<script lang="ts">
+import type { PropType } from 'vue'
+
+import { defineComponent } from 'vue'
+import { translate as t } from '@nextcloud/l10n'
+import { getUniqueName } from '../utils/fileUtils'
+
+import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
+import NcDialog from '@nextcloud/vue/dist/Components/NcDialog.js'
+import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js'
+
+interface ICanFocus {
+ focus: () => void
+}
+
+export default defineComponent({
+ name: 'NewNodeDialog',
+ components: {
+ NcButton,
+ NcDialog,
+ NcTextField,
+ },
+ props: {
+ /**
+ * The name to be used by default
+ */
+ defaultName: {
+ type: String,
+ default: t('files', 'New folder'),
+ },
+ /**
+ * Other files that are in the current directory
+ */
+ otherNames: {
+ type: Array as PropType<string[]>,
+ default: () => [],
+ },
+ /**
+ * Open state of the dialog
+ */
+ open: {
+ type: Boolean,
+ default: true,
+ },
+ /**
+ * Dialog name
+ */
+ name: {
+ type: String,
+ default: t('files', 'Create new folder'),
+ },
+ /**
+ * Input label
+ */
+ label: {
+ type: String,
+ default: t('files', 'Folder name'),
+ },
+ },
+ emits: {
+ close: (name: string|null) => name === null || name,
+ },
+ data() {
+ return {
+ localDefaultName: this.defaultName || t('files', 'New folder'),
+ }
+ },
+ computed: {
+ errorMessage() {
+ if (this.isUniqueName) {
+ return ''
+ } else {
+ return t('files', 'A file or folder with that name already exists.')
+ }
+ },
+ uniqueName() {
+ return getUniqueName(this.localDefaultName, this.otherNames)
+ },
+ isUniqueName() {
+ return this.localDefaultName === this.uniqueName
+ },
+ },
+ watch: {
+ defaultName() {
+ this.localDefaultName = this.defaultName || t('files', 'New folder')
+ },
+ },
+ mounted() {
+ // on mounted lets use the unique name
+ this.localDefaultName = this.uniqueName
+ this.$nextTick(() => (this.$refs.input as unknown as ICanFocus)?.focus?.())
+ },
+ methods: {
+ t,
+ onCreate() {
+ this.$emit('close', this.localDefaultName)
+ },
+ onClose(state: boolean) {
+ if (!state) {
+ this.$emit('close', null)
+ }
+ },
+ },
+})
+</script>