Describe the bug
Any host app that embeds Text without a fileId (i.e. createEditor/createMarkdownContentEditor, the fileless "markdown content" path) gets its attachment menu permanently disabled, with the misleading tooltip:
Attachments cannot be created or uploaded because this file is shared from another cloud.
There is no federated share and no other cloud involved — there is no file at all.
The most visible victim is Deck card descriptions, reported as nextcloud/deck#7748 (still open, no root cause posted). I traced it and the defect is here in Text, not in Deck.
Root cause
The gate introduced in #7154 (hasOwner, merged 2025-05-06, fixing #7092) assumes a document session always exists. In the fileless embed path it never does.
-
Deck embeds Text with content only, no fileId:
https://github.com/nextcloud/deck/blob/main/src/components/card/Description.vue
this.editor = await window.OCA.Text.createEditor({
el: this.$refs.editor,
content: this.card.description,
readOnly: !this.canEdit,
onFileInsert: () => { this.showAttachmentModal() }, // <-- host-provided hook
})
-
In src/createEditor.ts, optionsForCollaboration() is Boolean(options.fileId) && (options.useSession ?? true) → false, so createMarkdownContentEditor() renders MarkdownContentEditorApp.vue.
-
provideConnection() is called only from src/components/CollaborativeEditor.vue. The markdown-content path never calls it, so the injected openData stays undefined.
-
src/components/Menu/ActionAttachmentUpload.vue:
isUploadDisabled() {
return !this.openData?.hasOwner || !this.networkOnline
}
undefined?.hasOwner → undefined → falsy → disabled, and menuTitle falls through to the federated-share string.
src/components/SuggestionsBar.vue:107 has the identical check and the identical wrong message.
The irony: provideHooks() in createEditor.ts does provide ACTION_ATTACHMENT_PROMPT from options.onFileInsert, so the host app has already supplied a working "insert file" implementation — Text disables the button before that hook can ever fire. Meanwhile EDITOR_UPLOAD is only provided on the collaborative path, so "Upload from computer" is already correctly hidden in this mode. The only entry that should be reachable is "Insert from Files", which delegates to the host and does not need a file owner.
Steps to reproduce
- Install and enable Deck and Text.
- Open any Deck card, edit the description with the rich text editor.
- Hover the paperclip in the toolbar.
- It is greyed out with the "shared from another cloud" tooltip. Uploading via the card's Attachments tab works fine (that path does not go through Text).
Expected behaviour
In the fileless / createMarkdownContentEditor embed, the attachment menu should stay enabled and "Insert from Files" should call the host-provided onFileInsert hook. The hasOwner restriction from #7154 is meaningful only when a document session exists.
Suggested fix
Only apply the owner gate when a connection was actually provided, rather than treating "no session" as "no owner". Something like:
isUploadDisabled() {
if (!this.networkOnline) { return true }
// No connection at all => fileless embed; the host app owns attachment handling.
if (this.openData === undefined && !this.$editorUpload) { return false }
return !this.openData?.hasOwner
}
and the same in SuggestionsBar.vue. Separately, the tooltip should not claim "shared from another cloud" for every falsy hasOwner — worth distinguishing "no owner" from "federated".
Versions
Reproduced on:
|
|
| Nextcloud |
34.0.1 |
| Text |
8.0.0 |
| Deck |
1.18.2 |
| PHP |
8.3 |
| DB |
PostgreSQL 17 |
| Browser |
Chrome |
Also reported against NC 32.0.4 / Deck 1.16.3 and NC 33.0.3 in nextcloud/deck#7748, i.e. present since the #7154 merge.
Describe the bug
Any host app that embeds Text without a
fileId(i.e.createEditor/createMarkdownContentEditor, the fileless "markdown content" path) gets its attachment menu permanently disabled, with the misleading tooltip:There is no federated share and no other cloud involved — there is no file at all.
The most visible victim is Deck card descriptions, reported as nextcloud/deck#7748 (still open, no root cause posted). I traced it and the defect is here in Text, not in Deck.
Root cause
The gate introduced in #7154 (
hasOwner, merged 2025-05-06, fixing #7092) assumes a document session always exists. In the fileless embed path it never does.Deck embeds Text with content only, no
fileId:https://github.com/nextcloud/deck/blob/main/src/components/card/Description.vue
In
src/createEditor.ts,optionsForCollaboration()isBoolean(options.fileId) && (options.useSession ?? true)→ false, socreateMarkdownContentEditor()rendersMarkdownContentEditorApp.vue.provideConnection()is called only fromsrc/components/CollaborativeEditor.vue. The markdown-content path never calls it, so the injectedopenDatastaysundefined.src/components/Menu/ActionAttachmentUpload.vue:undefined?.hasOwner→undefined→ falsy → disabled, andmenuTitlefalls through to the federated-share string.src/components/SuggestionsBar.vue:107has the identical check and the identical wrong message.The irony:
provideHooks()increateEditor.tsdoes provideACTION_ATTACHMENT_PROMPTfromoptions.onFileInsert, so the host app has already supplied a working "insert file" implementation — Text disables the button before that hook can ever fire. MeanwhileEDITOR_UPLOADis only provided on the collaborative path, so "Upload from computer" is already correctly hidden in this mode. The only entry that should be reachable is "Insert from Files", which delegates to the host and does not need a file owner.Steps to reproduce
Expected behaviour
In the fileless /
createMarkdownContentEditorembed, the attachment menu should stay enabled and "Insert from Files" should call the host-providedonFileInserthook. ThehasOwnerrestriction from #7154 is meaningful only when a document session exists.Suggested fix
Only apply the owner gate when a connection was actually provided, rather than treating "no session" as "no owner". Something like:
and the same in
SuggestionsBar.vue. Separately, the tooltip should not claim "shared from another cloud" for every falsyhasOwner— worth distinguishing "no owner" from "federated".Versions
Reproduced on:
Also reported against NC 32.0.4 / Deck 1.16.3 and NC 33.0.3 in nextcloud/deck#7748, i.e. present since the #7154 merge.