aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-04-15 18:09:37 +0200
committerFerdinand Thiessen <opensource@fthiessen.de>2024-04-16 12:02:30 +0200
commitdf3b2ebbfd727b64afe881e5252484f00fe56966 (patch)
treed24f5319137af010f6768083fbf9b1a7a9274181
parent3091c31d6e57036b0d588b75aaa2c7e0ab2f18a5 (diff)
downloadnextcloud-server-df3b2ebbfd727b64afe881e5252484f00fe56966.tar.gz
nextcloud-server-df3b2ebbfd727b64afe881e5252484f00fe56966.zip
fix(files): Inherit some node attributes when creating new nodes to preserve shared state
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
-rw-r--r--apps/files/src/components/FileEntry/FileEntryActions.vue13
-rw-r--r--apps/files/src/newMenu/newFolder.ts6
-rw-r--r--apps/files/src/newMenu/newFromTemplate.ts14
-rw-r--r--apps/files/src/views/TemplatePicker.vue16
4 files changed, 39 insertions, 10 deletions
diff --git a/apps/files/src/components/FileEntry/FileEntryActions.vue b/apps/files/src/components/FileEntry/FileEntryActions.vue
index 5d35eae5a79..abe71b7271b 100644
--- a/apps/files/src/components/FileEntry/FileEntryActions.vue
+++ b/apps/files/src/components/FileEntry/FileEntryActions.vue
@@ -93,13 +93,15 @@
</template>
<script lang="ts">
-import { DefaultType, FileAction, Node, NodeStatus, View, getFileActions } from '@nextcloud/files'
+import type { FileAction, Node, View } from '@nextcloud/files'
+import type { PropType } from 'vue'
+
import { showError, showSuccess } from '@nextcloud/dialogs'
+import { DefaultType, NodeStatus, getFileActions } from '@nextcloud/files'
import { translate as t } from '@nextcloud/l10n'
-import Vue, { PropType } from 'vue'
+import Vue, { defineComponent } from 'vue'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
-import ChevronRightIcon from 'vue-material-design-icons/ChevronRight.vue'
import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'
import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
import NcActionSeparator from '@nextcloud/vue/dist/Components/NcActionSeparator.js'
@@ -112,12 +114,11 @@ import logger from '../../logger.js'
// The registered actions list
const actions = getFileActions()
-export default Vue.extend({
+export default defineComponent({
name: 'FileEntryActions',
components: {
ArrowLeftIcon,
- ChevronRightIcon,
CustomElementRender,
NcActionButton,
NcActions,
@@ -335,7 +336,7 @@ export default Vue.extend({
// Focus the previous menu action button
this.$nextTick(() => {
// Focus the action button
- const menuAction = this.$refs[`action-${action.id}`][0]
+ const menuAction = this.$refs[`action-${action.id}`]?.[0]
if (menuAction) {
menuAction.$el.querySelector('button')?.focus()
}
diff --git a/apps/files/src/newMenu/newFolder.ts b/apps/files/src/newMenu/newFolder.ts
index 64ab8004e78..5d378cab438 100644
--- a/apps/files/src/newMenu/newFolder.ts
+++ b/apps/files/src/newMenu/newFolder.ts
@@ -74,6 +74,12 @@ export const entry = {
owner: getCurrentUser()?.uid || null,
permissions: Permission.ALL,
root: context?.root || '/files/' + getCurrentUser()?.uid,
+ // Include mount-type from parent folder as this is inherited
+ attributes: {
+ 'mount-type': context.attributes?.['mount-type'],
+ 'owner-id': context.attributes?.['owner-id'],
+ 'owner-display-name': context.attributes?.['owner-display-name'],
+ },
})
showSuccess(t('files', 'Created new folder "{name}"', { name: basename(source) }))
diff --git a/apps/files/src/newMenu/newFromTemplate.ts b/apps/files/src/newMenu/newFromTemplate.ts
index 5e69181995e..10ff5d630fe 100644
--- a/apps/files/src/newMenu/newFromTemplate.ts
+++ b/apps/files/src/newMenu/newFromTemplate.ts
@@ -36,7 +36,7 @@ import Vue, { defineAsyncComponent } from 'vue'
const TemplatePickerVue = defineAsyncComponent(() => import('../views/TemplatePicker.vue'))
let TemplatePicker: ComponentInstance & { open: (n: string, t: TemplateFile) => void } | null = null
-const getTemplatePicker = async () => {
+const getTemplatePicker = async (context: Folder) => {
if (TemplatePicker === null) {
// Create document root
const mountingPoint = document.createElement('div')
@@ -45,7 +45,15 @@ const getTemplatePicker = async () => {
// Init vue app
TemplatePicker = new Vue({
- render: (h) => h(TemplatePickerVue, { ref: 'picker' }),
+ render: (h) => h(
+ TemplatePickerVue,
+ {
+ ref: 'picker',
+ props: {
+ parent: context,
+ },
+ },
+ ),
methods: { open(...args) { this.$refs.picker.open(...args) } },
el: mountingPoint,
})
@@ -71,7 +79,7 @@ export function registerTemplateEntries() {
},
order: 11,
async handler(context: Folder, content: Node[]) {
- const templatePicker = getTemplatePicker()
+ const templatePicker = getTemplatePicker(context)
const name = await newNodeName(`${provider.label}${provider.extension}`, content, {
label: t('files', 'Filename'),
name: provider.label,
diff --git a/apps/files/src/views/TemplatePicker.vue b/apps/files/src/views/TemplatePicker.vue
index dce081f5733..e235a9e6054 100644
--- a/apps/files/src/views/TemplatePicker.vue
+++ b/apps/files/src/views/TemplatePicker.vue
@@ -90,6 +90,16 @@ export default defineComponent({
TemplatePreview,
},
+ props: {
+ /**
+ * The parent folder where to create the node
+ */
+ parent: {
+ type: Object,
+ default: () => null,
+ },
+ },
+
data() {
return {
// Check empty template by default
@@ -109,7 +119,7 @@ export default defineComponent({
nameWithoutExt() {
// Strip extension from name if defined
return !this.extension
- ? this.name
+ ? this.name!
: this.name!.slice(0, 0 - this.extension.length)
},
@@ -236,6 +246,10 @@ export default defineComponent({
size: fileInfo.size,
permissions: fileInfo.permissions,
attributes: {
+ // Inherit some attributes from parent folder like the mount type and real owner
+ 'mount-type': this.parent?.attributes?.['mount-type'],
+ 'owner-id': this.parent?.attributes?.['owner-id'],
+ 'owner-display-name': this.parent?.attributes?.['owner-display-name'],
...fileInfo,
'has-preview': fileInfo.hasPreview,
},