From 09db060281062a577301a2736a63421325932d53 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 4 Jun 2026 22:34:07 +0200 Subject: [PATCH] Feature: MacOS-Toggle + Raw-Editor im Samba Config-Tab - Toggle 'Global MacOS Shares' setzt/entfernt fruit-Parameter automatisch (fruit:encoding=native, fruit:metadata=stream, fruit:zero_file_id=yes, fruit:nfs_aces=no) via net conf setparm - Raw-Textarea zeigt alle globalen Parameter direkt editierbar (key = value) - Tabellen-Ansicht durch Raw-Editor ersetzt Co-Authored-By: Claude Sonnet 4.6 --- frontend/app/shares/page.tsx | 180 +++++++++++++++++++++-------------- 1 file changed, 111 insertions(+), 69 deletions(-) diff --git a/frontend/app/shares/page.tsx b/frontend/app/shares/page.tsx index 82f9a7d..227da60 100644 --- a/frontend/app/shares/page.tsx +++ b/frontend/app/shares/page.tsx @@ -24,8 +24,9 @@ export default function SharesPage() { const [deleteConfirm, setDeleteConfirm] = useState<{ type: "samba" | "nfs"; name: string } | null>(null) const [deleting, setDeleting] = useState(false) const [editMode, setEditMode] = useState(false) - const [editedConfig, setEditedConfig] = useState<{ [key: string]: string }>({}) + const [rawConfigText, setRawConfigText] = useState("") const [saving, setSaving] = useState(false) + const [macosEnabled, setMacosEnabled] = useState(false) const [editingShare, setEditingShare] = useState(null) useEffect(() => { @@ -50,7 +51,14 @@ export default function SharesPage() { setSambaShares(samba) setNfsShares(nfs) - setSambaConfig(config.parameters || []) + const params: { key: string; value: string }[] = config.parameters || [] + setSambaConfig(params) + const raw = params.map((p) => `${p.key} = ${p.value}`).join("\n") + setRawConfigText(raw) + const hasMacOS = ["fruit:encoding", "fruit:metadata", "fruit:zero_file_id", "fruit:nfs_aces"].every( + (k) => params.some((p) => p.key === k) + ) + setMacosEnabled(hasMacOS) } catch (err) { setError(err instanceof Error ? err.message : "Failed to load shares") } finally { @@ -117,21 +125,29 @@ export default function SharesPage() { setShowNfsDialog(false) } - const handleEditMode = () => { - const configMap = sambaConfig.reduce((acc, param) => { - acc[param.key] = param.value - return acc - }, {} as { [key: string]: string }) - setEditedConfig(configMap) - setEditMode(true) + const MACOS_PARAMS: { [key: string]: string } = { + "fruit:encoding": "native", + "fruit:metadata": "stream", + "fruit:zero_file_id": "yes", + "fruit:nfs_aces": "no", } - const handleSaveConfig = async () => { + const MACOS_KEYS = Object.keys(MACOS_PARAMS) + + const handleSaveRaw = async () => { try { setSaving(true) - await api.setSambaConfig(editedConfig) - setEditMode(false) + const parsed: { [key: string]: string } = {} + rawConfigText.split("\n").forEach((line) => { + const eq = line.indexOf("=") + if (eq === -1) return + const key = line.slice(0, eq).trim() + const value = line.slice(eq + 1).trim() + if (key) parsed[key] = value + }) + await api.setSambaConfig(parsed) await loadShares() + setEditMode(false) setError(null) } catch (err) { setError(err instanceof Error ? err.message : "Failed to save configuration") @@ -140,6 +156,27 @@ export default function SharesPage() { } } + const handleToggleMacOS = async (enable: boolean) => { + try { + setSaving(true) + const current = sambaConfig.reduce((acc, p) => { acc[p.key] = p.value; return acc }, {} as { [key: string]: string }) + if (enable) { + await api.setSambaConfig({ ...current, ...MACOS_PARAMS } as { [key: string]: string }) + } else { + const filtered: { [key: string]: string } = {} + Object.entries(current).forEach(([k, v]) => { if (!MACOS_KEYS.includes(k)) filtered[k] = v as string }) + await api.setSambaConfig(filtered) + } + setMacosEnabled(enable) + await loadShares() + setError(null) + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to update macOS settings") + } finally { + setSaving(false) + } + } + return (
@@ -390,65 +427,70 @@ export default function SharesPage() { {/* SAMBA CONFIG TAB */} {activeTab === "config" && ( - - -
- Samba Global Configuration - {!editMode && sambaConfig.length > 0 && ( - - )} - {editMode && ( -
- - +
+ {/* MacOS Toggle */} + + +
+
+

Global MacOS Shares

+

Optimize all shares for MacOS

+ {macosEnabled && ( +
+ {Object.entries(MACOS_PARAMS).map(([k, v]) => ( + + {k} = {v} + + ))} +
+ )}
- )} -
- - - {sambaConfig.length === 0 ? ( -

- No global configuration parameters found. -

- ) : ( -
- - - - - - - - - {sambaConfig.map((param, idx) => ( - - - - - ))} - -
ParameterValue
{param.key} - {editMode ? ( - setEditedConfig({ ...editedConfig, [param.key]: e.target.value })} - className="w-full px-2 py-1 rounded border border-border bg-background text-xs font-mono" - /> - ) : ( - {param.value} - )} -
+
- )} -
-
+ + + + {/* Advanced raw config */} + + +
+ Advanced + {!editMode ? ( + + ) : ( +
+ + +
+ )} +
+
+ +