fix(frontend): more reactive db problems

Co-Authored-By: E44 <129310925+programmer-44@users.noreply.github.com>
This commit is contained in:
2026-01-02 16:50:52 +01:00
parent 2391169f46
commit 028e419535
4 changed files with 41 additions and 39 deletions
@@ -19,7 +19,7 @@
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import type { MenuOption } from '$lib/ts/types'; import type { MenuOption } from '$lib/ts/types';
import { selected_display_ids } from '$lib/ts/stores/select'; import { selected_display_ids } from '$lib/ts/stores/select';
import { liveQuery } from 'dexie'; import { liveQuery, type Observable } from 'dexie';
let { let {
display_group_id, display_group_id,
@@ -31,17 +31,16 @@
close_pinned_display: () => void; close_pinned_display: () => void;
} = $props(); } = $props();
let all_selected = liveQuery(() => let all_selected: Observable<boolean> | undefined = $state();
all_displays_of_group_selected(display_group_id, $selected_display_ids) $effect(() => {
); const sdi = $selected_display_ids;
all_selected = liveQuery(() => all_displays_of_group_selected(display_group_id, sdi));
});
let display_ids_in_group = liveQuery(() => get_display_ids_in_group(display_group_id)); let display_ids_in_group = liveQuery(() => get_display_ids_in_group(display_group_id));
let hovering_selectable = $state(false); let hovering_selectable = $state(false);
async function select_all_of_this_group() { async function select_all_of_this_group() {
const new_value = !(await all_displays_of_group_selected( const new_value = !($all_selected || false);
display_group_id,
$selected_display_ids
));
await select_all_of_group(display_group_id, new_value); await select_all_of_group(display_group_id, new_value);
} }
+14 -12
View File
@@ -39,13 +39,18 @@
} = $props(); } = $props();
let displays_scroll_box: HTMLElement; let displays_scroll_box: HTMLElement;
let pinned_display: Observable<Display | null> = liveQuery(() => let pinned_display: Observable<Display | null> | undefined = $state();
get_display_by_id($pinned_display_id || '') $effect(() => {
); const pdi = $pinned_display_id;
pinned_display = liveQuery(() => get_display_by_id(pdi || ''));
});
let display_groups = liveQuery(() => get_display_groups()); let display_groups = liveQuery(() => get_display_groups());
let all_groups_selected = liveQuery(() => let all_groups_selected: Observable<boolean> | undefined = $state();
all_selected($display_groups || [], $selected_display_ids) $effect(() => {
); const d = $display_groups;
const sdi = $selected_display_ids;
all_groups_selected = liveQuery(() => all_selected(d || [], sdi));
});
let last_pinned_pane_size: number = 45; let last_pinned_pane_size: number = 45;
let pinned_pane_size: number = $state(last_pinned_pane_size); let pinned_pane_size: number = $state(last_pinned_pane_size);
@@ -75,11 +80,8 @@
]; ];
} }
async function select_all( async function select_all(current_displays: DisplayGroup[]) {
current_displays: DisplayGroup[], const new_value = !all_groups_selected;
current_selected_display_ids: string[]
) {
const new_value = !(await all_selected(current_displays, current_selected_display_ids));
for (const display_group of current_displays) { for (const display_group of current_displays) {
await select_all_of_group(display_group.id, new_value); await select_all_of_group(display_group.id, new_value);
} }
@@ -211,7 +213,7 @@
text: true text: true
} }
)}" )}"
onclick={async () => await select_all($display_groups || [], $selected_display_ids)} onclick={async () => await select_all($display_groups || [])}
> >
<span>{$all_groups_selected || false ? 'Alle abwählen' : 'Alle auswählen'}</span> <span>{$all_groups_selected || false ? 'Alle abwählen' : 'Alle auswählen'}</span>
</button> </button>
+12 -15
View File
@@ -38,16 +38,17 @@
let current_valid: boolean = $state(false); let current_valid: boolean = $state(false);
let display_names_where_path_does_not_exist: string[] = $state([]); let display_names_where_path_does_not_exist: string[] = $state([]);
let selected_files = liveQuery(() => get_selected_files($selected_display_ids)); let selected_files: Observable<Inode[]> | undefined = $state();
let current_folder_elements: Observable<Inode[]> | undefined = $state();
$effect(() => { $effect(() => {
const path = $current_file_path, display_ids = $selected_display_ids; const s = $selected_file_ids;
selected_files = liveQuery(() => get_selected_files(s));
});
let current_folder_elements: Observable<Inode[]> | undefined = $state();
$effect(() => {
const path = $current_file_path,
display_ids = $selected_display_ids;
current_folder_elements = liveQuery(() => get_current_folder_elements(path, display_ids)); current_folder_elements = liveQuery(() => get_current_folder_elements(path, display_ids));
}) });
let popup_content: PopupContent = $state({ let popup_content: PopupContent = $state({
open: false, open: false,
@@ -163,11 +164,7 @@
if (trimmed_input.length === 0 || trimmed_input.length > 50) if (trimmed_input.length === 0 || trimmed_input.length > 50)
return [false, 'Ungültige Länge']; return [false, 'Ungültige Länge'];
if (!is_valid_name(trimmed_input)) return [false, 'Name enthält ungültige Zeichen']; if (!is_valid_name(trimmed_input)) return [false, 'Name enthält ungültige Zeichen'];
if ( if (($current_folder_elements ?? []).some((e) => e.name === trimmed_input))
(await get_current_folder_elements($current_file_path, $selected_display_ids)).some(
(e) => e.name === trimmed_input
)
)
return [false, 'Name bereits verwendet']; return [false, 'Name bereits verwendet'];
return [true, 'Gültiger Name']; return [true, 'Gültiger Name'];
}} }}
@@ -194,8 +191,8 @@
return [false, 'Ungültige Länge']; return [false, 'Ungültige Länge'];
if (!is_valid_name(trimmed_input)) return [false, 'Name enthält ungültige Zeichen']; if (!is_valid_name(trimmed_input)) return [false, 'Name enthält ungültige Zeichen'];
if ( if (
(await get_current_folder_elements($current_file_path, $selected_display_ids)).some( ($current_folder_elements ?? []).some(
async (e) => e.name === trimmed_input && get_file_primary_key(e) !== $selected_file_ids[0] (e) => e.name === trimmed_input && get_file_primary_key(e) !== $selected_file_ids[0]
) )
) )
return [false, 'Name bereits verwendet']; return [false, 'Name bereits verwendet'];
@@ -24,13 +24,17 @@
import { open_file } from '$lib/ts/api_handler'; import { open_file } from '$lib/ts/api_handler';
import { run_on_all_selected_displays } from '$lib/ts/stores/displays'; import { run_on_all_selected_displays } from '$lib/ts/stores/displays';
import { get_thumbnail_url } from '$lib/ts/stores/thumbnails'; import { get_thumbnail_url } from '$lib/ts/stores/thumbnails';
import { liveQuery } from 'dexie'; import { liveQuery, type Observable } from 'dexie';
let { file, not_interactable = false }: { file: Inode; not_interactable?: boolean } = $props(); let { file, not_interactable = false }: { file: Inode; not_interactable?: boolean } = $props();
let missing_colliding_displays_ids = liveQuery(() => let missing_colliding_displays_ids:
get_missing_colliding_display_ids(file, $selected_display_ids) | Observable<{ missing: string[]; colliding: string[] }>
); | undefined = $state();
$effect(() => {
const s = $selected_file_ids;
missing_colliding_displays_ids = liveQuery(() => get_missing_colliding_display_ids(file, s));
});
let thumbnail_url = liveQuery(() => get_thumbnail_url(file)); let thumbnail_url = liveQuery(() => get_thumbnail_url(file));
const is_folder = file.type === 'inode/directory'; const is_folder = file.type === 'inode/directory';