refactor(control): replace === 'inode/directory' with is_folder()

This commit is contained in:
E44
2026-01-19 17:54:47 +01:00
parent 4acbc96a58
commit 209080db22
5 changed files with 42 additions and 31 deletions
@@ -11,7 +11,10 @@
type Inode, type Inode,
get_file_primary_key, get_file_primary_key,
type FileOnDisplay, type FileOnDisplay,
type FileTransferTask type FileTransferTask,
is_folder
} from '$lib/ts/types'; } from '$lib/ts/types';
import { import {
@@ -69,7 +72,7 @@
get_date_mapping(file_primary_key) get_date_mapping(file_primary_key)
); );
const is_folder = file.type === 'inode/directory'; const file_is_folder = $derived(is_folder(file));
function get_created_info(date_mapping: Record<string, Date> | undefined, full_string = false) { function get_created_info(date_mapping: Record<string, Date> | undefined, full_string = false) {
if (!date_mapping) return ''; if (!date_mapping) return '';
@@ -149,7 +152,7 @@
} }
async function open() { async function open() {
if (is_folder) { if (file_is_folder) {
await change_file_path($current_file_path + file.name + '/'); await change_file_path($current_file_path + file.name + '/');
} else { } else {
const path_to_file = $current_file_path + file.name; const path_to_file = $current_file_path + file.name;
@@ -213,28 +216,28 @@
{#if !not_interactable} {#if !not_interactable}
<div class="h-{$current_height.file} aspect-square max-w-15 flex"> <div class="h-{$current_height.file} aspect-square max-w-15 flex">
<Button <Button
disabled={!is_folder && get_file_type(file) === null} disabled={!file_is_folder && get_file_type(file) === null}
title={!is_folder && get_file_type(file) === null ? 'Dateityp nicht unterstützt' : ''} title={!file_is_folder && get_file_type(file) === null ? 'Dateityp nicht unterstützt' : ''}
className="flex rounded-l-lg rounded-r-none {is_folder className="flex rounded-l-lg rounded-r-none {file_is_folder
? 'text-stone-450' ? 'text-stone-450'
: 'text-stone-800'} w-full" : 'text-stone-800'} w-full"
div_class="w-full" div_class="w-full"
bg={get_selectable_color_classes( bg={get_selectable_color_classes(
!is_folder && get_file_type(file) !== null, !file_is_folder && get_file_type(file) !== null,
{ {
bg: true bg: true
}, },
-50 -50
)} )}
hover_bg={get_selectable_color_classes( hover_bg={get_selectable_color_classes(
!is_folder, !file_is_folder,
{ {
bg: true bg: true
}, },
50 50
)} )}
active_bg={get_selectable_color_classes( active_bg={get_selectable_color_classes(
!is_folder, !file_is_folder,
{ {
bg: true bg: true
}, },
@@ -245,7 +248,7 @@
e.stopPropagation(); e.stopPropagation();
}} }}
> >
{#if is_folder} {#if file_is_folder}
<ArrowRight class="size-full" strokeWidth="3" /> <ArrowRight class="size-full" strokeWidth="3" />
{:else if $missing_colliding_displays_ids && $missing_colliding_displays_ids.missing.length !== 0} {:else if $missing_colliding_displays_ids && $missing_colliding_displays_ids.missing.length !== 0}
<RefreshPlay className="size-full" /> <RefreshPlay className="size-full" />
@@ -274,7 +277,7 @@
{/if} {/if}
<div class="flex flex-row gap-2 min-w-0 w-full z-10"> <div class="flex flex-row gap-2 min-w-0 w-full z-10">
<div class="aspect-square rounded-md flex justify-center items-center"> <div class="aspect-square rounded-md flex justify-center items-center">
{#if is_folder} {#if file_is_folder}
<Folder class="size-full p-2" /> <Folder class="size-full p-2" />
{:else if $thumbnail_url || null} {:else if $thumbnail_url || null}
<img <img
@@ -291,7 +294,7 @@
{/if} {/if}
</div> </div>
<div class="content-center truncate select-none w-full" title={file.name}> <div class="content-center truncate select-none w-full" title={file.name}>
{file.name.includes('.') && !is_folder && get_file_type(file) {file.name.includes('.') && !file_is_folder && get_file_type(file)
? file.name.slice(0, file.name.lastIndexOf('.')) ? file.name.slice(0, file.name.lastIndexOf('.'))
: file.name} : file.name}
</div> </div>
@@ -343,7 +346,7 @@
class="w-12 content-center text-center select-none text-xs whitespace-nowrap truncate" class="w-12 content-center text-center select-none text-xs whitespace-nowrap truncate"
title={file.type} title={file.type}
> >
{is_folder ? 'Ordner' : (get_file_type(file)?.display_name ?? '?')} {file_is_folder ? 'Ordner' : (get_file_type(file)?.display_name ?? '?')}
</div> </div>
<div <div
class="h-[70%] border {get_grayed_out_border_color_strings( class="h-[70%] border {get_grayed_out_border_color_strings(
@@ -12,6 +12,7 @@ import { notifications } from './stores/notification';
import { generate_thumbnail } from './stores/thumbnails'; import { generate_thumbnail } from './stores/thumbnails';
import { import {
get_file_primary_key, get_file_primary_key,
is_folder,
type FileLoadingData, type FileLoadingData,
type FileOnDisplay, type FileOnDisplay,
type FileTransferTask, type FileTransferTask,
@@ -109,7 +110,7 @@ export async function add_sync_recursively(
); );
if (!file_data) return console.warn('Sync canceled: no file_data'); if (!file_data) return console.warn('Sync canceled: no file_data');
if (file_data.file.type === 'inode/directory') { if (is_folder(file_data.file)) {
const new_path = file_data.file.path + file_data.file.name + '/'; const new_path = file_data.file.path + file_data.file.name + '/';
const elements_in_folder = await get_folder_elements(new_path, selected_display_ids); const elements_in_folder = await get_folder_elements(new_path, selected_display_ids);
if (elements_in_folder.length === 0) { if (elements_in_folder.length === 0) {
@@ -294,7 +295,7 @@ export async function download_file(selected_file_id: string, selected_display_i
selected_file_id, selected_file_id,
selected_display_ids selected_display_ids
); );
if (!file_data || file_data.file.type === 'inode/directory') if (!file_data || is_folder(file_data.file))
return console.warn('Download cancelled: is folder'); return console.warn('Download cancelled: is folder');
try { try {
+6 -5
View File
@@ -1,6 +1,7 @@
import { get, writable, type Writable } from 'svelte/store'; import { get, writable, type Writable } from 'svelte/store';
import { import {
get_file_primary_key, get_file_primary_key,
is_folder,
type Display, type Display,
type FileOnDisplay, type FileOnDisplay,
type Inode, type Inode,
@@ -59,7 +60,7 @@ export async function remove_file_from_display_recusively(
const inode_element = await get_file_by_id(found.file_primary_key); const inode_element = await get_file_by_id(found.file_primary_key);
if (!inode_element) return; if (!inode_element) return;
if (inode_element.type === 'inode/directory') { if (is_folder(inode_element)) {
const path_inside_folder = inode_element.path + inode_element.name + `/`; const path_inside_folder = inode_element.path + inode_element.name + `/`;
const primary_file_keys_in_folder = ( const primary_file_keys_in_folder = (
await db.files.where('path').equals(path_inside_folder).toArray() await db.files.where('path').equals(path_inside_folder).toArray()
@@ -149,7 +150,7 @@ export async function get_displays_where_path_not_exists(
const folders_of_current_path = await db.files const folders_of_current_path = await db.files
.where('name') .where('name')
.equals(last_path_part) .equals(last_path_part)
.filter((inode) => inode.path === path_without_last_part && inode.type === 'inode/directory') .filter((inode) => inode.path === path_without_last_part && is_folder(inode))
.first(); .first();
if (!folders_of_current_path) return []; if (!folders_of_current_path) return [];
const folder_primary_key = get_file_primary_key(folders_of_current_path); const folder_primary_key = get_file_primary_key(folders_of_current_path);
@@ -278,7 +279,7 @@ export async function update_folder_elements_recursively(
}; };
await db.files_on_display.put(file_on_display); await db.files_on_display.put(file_on_display);
if (new_element.folder_element.type === 'inode/directory') { if (is_folder(new_element.folder_element)) {
await update_folder_elements_recursively( await update_folder_elements_recursively(
display, display,
file_path + new_element.folder_element.name + '/' file_path + new_element.folder_element.name + '/'
@@ -334,8 +335,8 @@ export async function get_folder_elements(
function sort_files(files: Inode[]) { function sort_files(files: Inode[]) {
files.sort((a, b) => { files.sort((a, b) => {
const isDirA = a.type === 'inode/directory'; const isDirA = is_folder(a);
const isDirB = b.type === 'inode/directory'; const isDirB = is_folder(b);
// Ordner zuerst // Ordner zuerst
if (isDirA && !isDirB) return -1; if (isDirA && !isDirB) return -1;
+10 -6
View File
@@ -46,7 +46,7 @@ export type FileTransferTaskData =
type: 'sync'; type: 'sync';
destination_display_data: { destination_display_data: {
display: ShortDisplay; display: ShortDisplay;
loading_data: FileLoadingData loading_data: FileLoadingData;
}[]; }[];
}; };
@@ -135,11 +135,11 @@ export type PopupContent = {
}; };
export type NumberSetting = { export type NumberSetting = {
max: number, max: number;
min: number, min: number;
now: number, now: number;
step: number step: number;
} };
export type DisplayStatus = 'host_offline' | 'app_offline' | 'app_online' | null; export type DisplayStatus = 'host_offline' | 'app_offline' | 'app_online' | null;
@@ -148,3 +148,7 @@ export function to_display_status(value: string): DisplayStatus {
? (value as DisplayStatus) ? (value as DisplayStatus)
: null; : null;
} }
export function is_folder(inode: Inode) {
return inode.type === 'inode/directory';
}
+7 -5
View File
@@ -27,7 +27,7 @@
import { slide } from 'svelte/transition'; import { slide } from 'svelte/transition';
import InodeElement from '../lib/components/InodeElement.svelte'; import InodeElement from '../lib/components/InodeElement.svelte';
import PopUp from '$lib/components/PopUp.svelte'; import PopUp from '$lib/components/PopUp.svelte';
import { get_file_primary_key, type Inode, type PopupContent } from '$lib/ts/types'; import { get_file_primary_key, is_folder, type Inode, type PopupContent } from '$lib/ts/types';
import TextInput from '$lib/components/TextInput.svelte'; import TextInput from '$lib/components/TextInput.svelte';
import { import {
first_letter_is_valid, first_letter_is_valid,
@@ -59,7 +59,9 @@
$effect(() => { $effect(() => {
const s = $selected_file_ids; const s = $selected_file_ids;
one_file_selected = liveQuery(async () => { one_file_selected = liveQuery(async () => {
return s.length === 1 && (await get_file_by_id(s[0]))?.type !== 'inode/directory'; const inode = await get_file_by_id(s[0]);
if (!inode) return false;
return s.length === 1 && is_folder(inode);
}); });
}); });
@@ -110,14 +112,14 @@
const show_edit_file_popup = async () => { const show_edit_file_popup = async () => {
const file = await get_file_by_id($selected_file_ids[0]); const file = await get_file_by_id($selected_file_ids[0]);
if (!file) return; if (!file) return;
const is_folder = file.type === 'inode/directory'; const file_is_folder = is_folder(file);
const extension = is_folder ? '' : '.' + file.name.split('.').at(-1) || ''; const extension = file_is_folder ? '' : '.' + file.name.split('.').at(-1) || '';
current_name = file.name.slice(0, file.name.length - extension.length); current_name = file.name.slice(0, file.name.length - extension.length);
current_valid = true; current_valid = true;
popup_content = { popup_content = {
open: true, open: true,
snippet: edit_file_name_popup, snippet: edit_file_name_popup,
title: `${is_folder ? 'Ordner' : 'Datei'} umbenennen`, title: `${file_is_folder ? 'Ordner' : 'Datei'} umbenennen`,
title_icon: FolderPlus, title_icon: FolderPlus,
snippet_arg: extension, snippet_arg: extension,
}; };