feat(sidebar): library + general settings dialogs, sidebar footer, alignment polish
- Add a Settings cog to the Folders header that opens a tabbed library admin dialog (Library / Index / Import / Logs) wrapping PhotoPrism's /api/v1 settings, index, import and errors endpoints. - Add a sticky footer to the left sidebar with the signed-in user's display name plus quick-toggle theme, general-settings cog (separate dialog for app prefs), and sign-out. Pull these out of the top Toolbar trailing slot. - Align depth-0 folder rows with the rest of the sidebar entries (drop the leading chevron column when no children) and bring heap rows in line with folder rows so the kebab is part of the row's hover background instead of a detached chip. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -602,6 +602,92 @@ export async function renameOnDisk(photoUid: string, newName: string): Promise<R
|
||||
return data as RenameResult;
|
||||
}
|
||||
|
||||
// ── Settings / Admin ─────────────────────────────────────────────────────────
|
||||
//
|
||||
// Thin wrappers over PhotoPrism's admin endpoints driving the settings dialog
|
||||
// (Library / Index / Import / Logs). Shapes are deliberately partial — newer
|
||||
// PhotoPrism versions ship extra fields we don't render, and the POST endpoint
|
||||
// merges server-side, so it's safe to round-trip an incomplete object.
|
||||
|
||||
export interface PpSettings {
|
||||
ui?: { theme?: string; language?: string; scrollbar?: boolean; zoom?: boolean };
|
||||
search?: { batchSize?: number; listView?: boolean; showTitles?: boolean; showCaptions?: boolean };
|
||||
index?: { path?: string; convert?: boolean; rescan?: boolean; skipArchived?: boolean };
|
||||
import?: { path?: string; move?: boolean; dest?: string };
|
||||
stack?: { uuid?: boolean; meta?: boolean; name?: boolean };
|
||||
download?: {
|
||||
name?: string;
|
||||
disabled?: boolean;
|
||||
originals?: boolean;
|
||||
mediaRaw?: boolean;
|
||||
mediaSidecar?: boolean;
|
||||
};
|
||||
[k: string]: unknown;
|
||||
}
|
||||
|
||||
export async function getSettings(): Promise<PpSettings> {
|
||||
const { data } = await http.get<PpSettings>('/settings');
|
||||
return data;
|
||||
}
|
||||
|
||||
export async function saveSettings(patch: Partial<PpSettings>): Promise<PpSettings> {
|
||||
const { data } = await http.post<PpSettings>('/settings', patch);
|
||||
return data;
|
||||
}
|
||||
|
||||
export interface IndexBody {
|
||||
path?: string;
|
||||
rescan?: boolean;
|
||||
cleanup?: boolean;
|
||||
}
|
||||
|
||||
export async function startIndex(body: IndexBody = {}): Promise<{ message: string }> {
|
||||
const { data } = await http.post<{ message: string }>('/index', {
|
||||
path: '/',
|
||||
rescan: false,
|
||||
cleanup: false,
|
||||
...body
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
export async function cancelIndex(): Promise<void> {
|
||||
await http.delete('/index');
|
||||
}
|
||||
|
||||
export interface ImportBody {
|
||||
path?: string;
|
||||
move?: boolean;
|
||||
dest?: string;
|
||||
}
|
||||
|
||||
export async function startImport(body: ImportBody = {}): Promise<{ message: string }> {
|
||||
const { data } = await http.post<{ message: string }>('/import', {
|
||||
path: '/',
|
||||
move: false,
|
||||
dest: '',
|
||||
...body
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
export async function cancelImport(): Promise<void> {
|
||||
await http.delete('/import');
|
||||
}
|
||||
|
||||
export interface PpLogEntry {
|
||||
Time: string;
|
||||
Level: string;
|
||||
Message: string;
|
||||
}
|
||||
|
||||
export async function getErrors(opts: { limit?: number } = {}): Promise<PpLogEntry[]> {
|
||||
const { data } = await http.get<PpLogEntry[]>('/errors', {
|
||||
params: { limit: opts.limit ?? 200 }
|
||||
});
|
||||
return data ?? [];
|
||||
}
|
||||
|
||||
// ── Re-exports ───────────────────────────────────────────────────────────────
|
||||
|
||||
export type { PpClientConfig, PpPhoto, PpSessionResponse, PpUser };
|
||||
|
||||
Reference in New Issue
Block a user