fix(office): PDF am Telefon nur bei OnlyOffice, Collabora behält den Editor

Die Regel galt für beide Anbieter – das war falsch. Marcs Kritik betraf
nur OnlyOffice: Es baut auf dem Telefon dieselbe Oberfläche auf wie am
PC. Collabora bringt für kleine Schirme eine eigene Ansicht mit, die
taugt; dort wäre der Umweg über ein PDF ein Rückschritt.

Der Anbieter steht jetzt in der öffentlichen Konfiguration
(office_provider), und die Oberfläche entscheidet daran. Der Endpunkt
selbst kann weiterhin beides.

Nachgeholt: Der ganze Weg ist jetzt auch mit Collabora gemessen, nicht
nur mit OnlyOffice – gegen die Dev-Instanz, die damit läuft.
  erster Abruf 0,347 s, zweiter 0,009 s, eine Datei auf der Platte
  (OnlyOffice zum Vergleich: 1,05 s – es muss die Datei erst abholen)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-01 01:07:08 +02:00
1 parent 065372359b
commit 6c53651568
6 files changed
+57 -17

No files matched your search

+2
View File
@@ -225,6 +225,8 @@ export interface PublicConfig {
/** Gibt es einen Office-Server? Sonst bietet das Menue das Bearbeiten gar
* nicht erst an – ein Punkt, der immer scheitert, ist schlimmer als keiner. */
office_enabled?: boolean
/** 'collabora' | 'onlyoffice' | '' – entscheidet über die Handy-Ansicht. */
office_provider?: string
/** Wie viele frühere Fassungen der Server aufhebt (MAX_VERSIONS_KEPT). */
max_versions_kept?: number
/** Beschriftung des SSO-Knopfes (OIDC_BUTTON_LABEL). Leer, wenn OIDC aus ist. */
+12 -1
View File
@@ -25,6 +25,14 @@ interface AppSettingsValue {
globalColors: { primary?: string; accent?: string }
/** Gibt es einen Office-Server? Steuert nur, ob der Menuepunkt erscheint. */
officeEnabled: boolean
/**
* Welcher Anbieter – 'collabora', 'onlyoffice' oder leer.
*
* Die Oberfläche braucht das, weil sich die beiden am Telefon verschieden
* verhalten: Collabora hat eine eigene Handy-Ansicht, die taugt; OnlyOffice
* baut dort dieselbe Oberfläche auf wie am PC.
*/
officeProvider: string
/** Wie viele frühere Fassungen der Server aufhebt. Kommt vom Server, damit
* der Dialog nicht eine andere Zahl nennt als die, die angewendet wird. */
maxVersionsKept: number
@@ -34,6 +42,7 @@ interface AppSettingsValue {
const Ctx = createContext<AppSettingsValue>({
cloudName: 'Aether',
officeEnabled: false,
officeProvider: '',
maxVersionsKept: 5,
logoUrl: '',
faviconUrl: '',
@@ -89,6 +98,7 @@ export function AppSettingsProvider({ children }: { children: ReactNode }) {
const [appIconUrl, setAppIconUrl] = useState('')
const [globalColors, setGlobalColors] = useState<{ primary?: string; accent?: string }>({})
const [officeEnabled, setOfficeEnabled] = useState(false)
const [officeProvider, setOfficeProvider] = useState('')
const [maxVersionsKept, setMaxVersionsKept] = useState(5)
const refresh = useCallback(async () => {
@@ -101,6 +111,7 @@ export function AppSettingsProvider({ children }: { children: ReactNode }) {
applyFavicon(cfg.favicon_url ?? '', cfg.apple_touch_icon_url ?? '')
setGlobalColors({ primary: cfg.primary_color, accent: cfg.accent_color })
setOfficeEnabled(!!cfg.office_enabled)
setOfficeProvider(cfg.office_provider ?? '')
if (typeof cfg.max_versions_kept === 'number' && cfg.max_versions_kept > 0) {
setMaxVersionsKept(cfg.max_versions_kept)
}
@@ -116,7 +127,7 @@ export function AppSettingsProvider({ children }: { children: ReactNode }) {
useEffect(() => { void refresh() }, [refresh])
return (
<Ctx.Provider value={{ cloudName, logoUrl, faviconUrl, appIconUrl, globalColors, officeEnabled, maxVersionsKept, refresh }}>{children}</Ctx.Provider>
<Ctx.Provider value={{ cloudName, logoUrl, faviconUrl, appIconUrl, globalColors, officeEnabled, officeProvider, maxVersionsKept, refresh }}>{children}</Ctx.Provider>
)
}
+10 -6
View File
@@ -153,7 +153,7 @@ export default function FileBrowser({
const [officePreview, setOfficePreview] = useState<FileItem | null>(null)
/** Datei, die gerade im Office-Server bearbeitet wird. */
const [editing, setEditing] = useState<FileItem | null>(null)
const { officeEnabled } = useAppSettings()
const { officeEnabled, officeProvider } = useAppSettings()
/** Finger oder Maus? Entscheidet, ob ein Office-Dokument als PDF oder im
* Editor aufgeht. */
const touchDevice = useCoarsePointer()
@@ -316,15 +316,19 @@ export default function FileBrowser({
*/
function openFile(file: FileItem) {
if (officeEnabled && isOfficeFile(file.name)) {
// Am Telefon zuerst ansehen, nicht bearbeiten. Der Editor ist dort eine
// vollständige Textverarbeitung; zwischen Menüband, Formatleisten und
// Eigenschaftenbereich bleibt vom Dokument ein Rechteck. Gilt für
// Collabora wie für OnlyOffice – beide ausprobiert, dasselbe Bild.
// **Nur bei OnlyOffice** öffnet ein Dokument am Telefon als PDF.
//
// Der Unterschied ist gemessen, nicht vermutet: Collabora bringt eine
// eigene Handy-Ansicht mit, die taugt – dort ist der Editor der
// richtige Weg. OnlyOffice baut auf dem Telefon dieselbe Oberfläche
// auf wie am PC; zwischen Menüband, Formatleisten und
// Eigenschaftenbereich bleibt vom Dokument ein Rechteck übrig, und
// genau das war der Anlass für die PDF-Ansicht.
//
// Die Entscheidung fällt am **Zeigegerät**, nicht an der Fensterbreite:
// Ein schmales Fenster auf dem Schreibtisch ist immer noch eine Maus
// und eine Tastatur, und dort will man bearbeiten.
if (touchDevice) setOfficePreview(file)
if (touchDevice && officeProvider === 'onlyoffice') setOfficePreview(file)
else setEditing(file)
return
}