TL;DR
The "No office suite installed" empty state is shown for two completely different situations — zero template creators registered, and the getTemplates() request itself failing — with no way for the user (or an admin debugging it) to tell which one they're looking at. In practice this made a transient, already-recovered document-server outage look like nothing was ever configured. See Euro-Office/eurooffice-nextcloud#133 for the concrete connector-side bug this surfaced.
Mechanism
fetchAll() (src/views/OfficeOverview.vue:192-217) sets creators.value = [] both when getTemplates() throws (caught at :210-216, only error.value is set) and when it legitimately returns an empty array. The template's empty-state check (:248-249) is v-if="creators.length === 0", which fires in both cases and always wins over the separate error state — the "No office suite installed" message is what's shown, not the actual error. This is confirmed as deliberate, tested behavior, not an oversight: src/views/OfficeOverview.spec.ts:153 comments "template shows 'No office suite installed' instead, before the error," and :157-162 asserts exactly that.
Impact
An admin/user has no way to distinguish, from the UI alone:
All three collapse to the same message, so the one case that's actually actionable from this screen (case 1) can't be distinguished from two cases that require debugging a different app entirely.
Suggested fix
Surface the error state distinctly from the zero-creators state — e.g. keep the existing empty-state UI for "genuinely zero creators returned" but show the actual error (or a generic "couldn't check for available editors, try again" message) when the request itself failed, rather than always falling through to "no suite installed."
This report was drafted and filed directly by Claude Code (claude-sonnet-5) at the explicit direction of the maintainer, who reviewed the mechanism and takes responsibility for filing it directly rather than via the org's standard human-submission workflow.
🤖 AI (if applicable)
Assisted-by: ClaudeCode:claude-sonnet-5
TL;DR
The "No office suite installed" empty state is shown for two completely different situations — zero template creators registered, and the
getTemplates()request itself failing — with no way for the user (or an admin debugging it) to tell which one they're looking at. In practice this made a transient, already-recovered document-server outage look like nothing was ever configured. See Euro-Office/eurooffice-nextcloud#133 for the concrete connector-side bug this surfaced.Mechanism
fetchAll()(src/views/OfficeOverview.vue:192-217) setscreators.value = []both whengetTemplates()throws (caught at:210-216, onlyerror.valueis set) and when it legitimately returns an empty array. The template's empty-state check (:248-249) isv-if="creators.length === 0", which fires in both cases and always wins over the separateerrorstate — the "No office suite installed" message is what's shown, not the actual error. This is confirmed as deliberate, tested behavior, not an oversight:src/views/OfficeOverview.spec.ts:153comments "template shows 'No office suite installed' instead, before the error," and:157-162asserts exactly that.Impact
An admin/user has no way to distinguish, from the UI alone:
settings_error, settings_error is a sticky negative cache with no TTL — a document-server outage permanently disables template creators until manually cleared Euro-Office/eurooffice-nextcloud#133)apps/files/api/v1/templatesrequest itself failed transiently (network, auth, server error)All three collapse to the same message, so the one case that's actually actionable from this screen (case 1) can't be distinguished from two cases that require debugging a different app entirely.
Suggested fix
Surface the
errorstate distinctly from the zero-creators state — e.g. keep the existing empty-state UI for "genuinely zero creators returned" but show the actual error (or a generic "couldn't check for available editors, try again" message) when the request itself failed, rather than always falling through to "no suite installed."This report was drafted and filed directly by Claude Code (claude-sonnet-5) at the explicit direction of the maintainer, who reviewed the mechanism and takes responsibility for filing it directly rather than via the org's standard human-submission workflow.
🤖 AI (if applicable)
Assisted-by: ClaudeCode:claude-sonnet-5