web type fixes

in Zod semantics, .default(x) means “if the input is undefined, substitute x”, so the schema must accept undefined, which effectively makes that value optional-at-input
This commit is contained in:
timonrieger
2026-02-27 16:37:10 +01:00
parent 50a3a64f9f
commit bde7d7254b
7 changed files with 24 additions and 24 deletions

View File

@@ -107,7 +107,7 @@
});
} else {
progressBarController = new Tween<number>(0, {
duration: (from: number, to: number) => (to ? $preferences.memories.duration * 1000 * (to - from) : 0),
duration: (from: number, to: number) => (to ? $preferences.memories.duration! * 1000 * (to - from) : 0),
});
}
};

View File

@@ -32,7 +32,7 @@
};
const TiB = 1024 ** 4;
let [statsUsage, statsUsageUnit] = $derived(getBytesWithUnit(stats.usage, stats.usage > TiB ? 2 : 0));
let [statsUsage, statsUsageUnit] = $derived(getBytesWithUnit(stats.usage!, stats.usage! > TiB ? 2 : 0));
</script>
<div class="flex flex-col gap-5 my-4">
@@ -40,8 +40,8 @@
<Text class="mb-2" fontWeight="medium">{$t('total_usage')}</Text>
<div class="hidden justify-between lg:flex gap-4">
<StatsCard icon={mdiCameraIris} title={$t('photos')} value={stats.photos} />
<StatsCard icon={mdiPlayCircle} title={$t('videos')} value={stats.videos} />
<StatsCard icon={mdiCameraIris} title={$t('photos')} value={stats.photos!} />
<StatsCard icon={mdiPlayCircle} title={$t('videos')} value={stats.videos!} />
<StatsCard icon={mdiChartPie} title={$t('storage')} value={statsUsage} unit={statsUsageUnit} />
</div>
@@ -54,7 +54,7 @@
</div>
<div class="relative text-center font-mono text-2xl font-medium">
<span class="text-light-300">{zeros(stats.photos)}</span><span class="text-primary">{stats.photos}</span>
<span class="text-light-300">{zeros(stats.photos!)}</span><span class="text-primary">{stats.photos}</span>
</div>
</div>
<div class="flex flex-wrap gap-x-12">
@@ -64,7 +64,7 @@
</div>
<div class="relative text-center font-mono text-2xl font-medium">
<span class="text-light-300">{zeros(stats.videos)}</span><span class="text-primary">{stats.videos}</span>
<span class="text-light-300">{zeros(stats.videos!)}</span><span class="text-primary">{stats.videos}</span>
</div>
</div>
<div class="flex flex-wrap gap-x-5">

View File

@@ -221,7 +221,7 @@ export const getAssetActions = ($t: MessageFormatter, asset: AssetResponseDto) =
title: $t('add_tag'),
icon: mdiTagPlusOutline,
type: $t('assets'),
$if: () => userPreferences.tags.enabled,
$if: () => userPreferences.tags.enabled!,
onAction: () => modalManager.show(AssetTagModal, { assetIds: [asset.id] }),
shortcuts: { key: 't' },
};

View File

@@ -331,7 +331,7 @@ export const deleteStack = async (stackIds: string[]) => {
const assets = stacks.flatMap((stack) => stack.assets);
for (const asset of assets) {
asset.stack = null;
asset.stack = undefined;
}
return assets;
@@ -350,7 +350,7 @@ export const keepThisDeleteOthers = async (keepAsset: AssetResponseDto, stack: S
toastManager.success($t('kept_this_deleted_others', { values: { count: assetsToDeleteIds.length } }));
keepAsset.stack = null;
keepAsset.stack = undefined;
return keepAsset;
} catch (error) {
handleError(error, $t('errors.failed_to_keep_this_delete_others'));

View File

@@ -95,7 +95,7 @@
<TableBody>
{#each libraries as library (library.id + library.name)}
{@const { photos, usage, videos } = statistics[library.id]}
{@const [diskUsage, diskUsageUnit] = getBytesWithUnit(usage, 0)}
{@const [diskUsage, diskUsageUnit] = getBytesWithUnit(usage!, 0)}
{@const owner = owners[library.id]}
<TableRow>
<TableCell class={classes.column1}>
@@ -104,8 +104,8 @@
<TableCell class={classes.column2}>
<Link href={Route.viewUser(owner)}>{owner.name}</Link>
</TableCell>
<TableCell class={classes.column3}>{photos.toLocaleString($locale)}</TableCell>
<TableCell class={classes.column4}>{videos.toLocaleString($locale)}</TableCell>
<TableCell class={classes.column3}>{photos!.toLocaleString($locale)}</TableCell>
<TableCell class={classes.column4}>{videos!.toLocaleString($locale)}</TableCell>
<TableCell class={classes.column5}>{diskUsage} {diskUsageUnit}</TableCell>
<TableCell class={classes.column6}>
<ContextMenuButton color="primary" aria-label={$t('open')} items={getActionsForLibrary(library)} />

View File

@@ -30,7 +30,7 @@
const { children, data }: Props = $props();
const statistics = data.statistics;
const [storageUsage, unit] = getBytesWithUnit(statistics.usage);
const [storageUsage, unit] = getBytesWithUnit(statistics.usage!);
let library = $state(data.library);
@@ -61,8 +61,8 @@
<div class="grid gap-4 grid-cols-1 lg:grid-cols-2 w-full">
<Heading tag="h1" size="large" class="col-span-full my-4">{library.name}</Heading>
<div class="flex flex-col lg:flex-row gap-4 col-span-full">
<ServerStatisticsCard icon={mdiCameraIris} title={$t('photos')} value={statistics.photos} />
<ServerStatisticsCard icon={mdiPlayCircle} title={$t('videos')} value={statistics.videos} />
<ServerStatisticsCard icon={mdiCameraIris} title={$t('photos')} value={statistics.photos!} />
<ServerStatisticsCard icon={mdiPlayCircle} title={$t('videos')} value={statistics.videos!} />
<ServerStatisticsCard icon={mdiChartPie} title={$t('usage')} value={storageUsage} {unit} />
</div>

View File

@@ -156,15 +156,15 @@
<AdminCard icon={mdiFeatureSearchOutline} title={$t('features')}>
<Stack gap={3}>
<FeatureSetting title={$t('email_notifications')} state={userPreferences.emailNotifications.enabled} />
<FeatureSetting title={$t('folders')} state={userPreferences.folders.enabled} />
<FeatureSetting title={$t('memories')} state={userPreferences.memories.enabled} />
<FeatureSetting title={$t('people')} state={userPreferences.people.enabled} />
<FeatureSetting title={$t('rating')} state={userPreferences.ratings.enabled} />
<FeatureSetting title={$t('shared_links')} state={userPreferences.sharedLinks.enabled} />
<FeatureSetting title={$t('show_supporter_badge')} state={userPreferences.purchase.showSupportBadge} />
<FeatureSetting title={$t('tags')} state={userPreferences.tags.enabled} />
<FeatureSetting title={$t('gcast_enabled')} state={userPreferences.cast.gCastEnabled} />
<FeatureSetting title={$t('email_notifications')} state={userPreferences.emailNotifications.enabled!} />
<FeatureSetting title={$t('folders')} state={userPreferences.folders.enabled!} />
<FeatureSetting title={$t('memories')} state={userPreferences.memories.enabled!} />
<FeatureSetting title={$t('people')} state={userPreferences.people.enabled!} />
<FeatureSetting title={$t('rating')} state={userPreferences.ratings.enabled!} />
<FeatureSetting title={$t('shared_links')} state={userPreferences.sharedLinks.enabled!} />
<FeatureSetting title={$t('show_supporter_badge')} state={userPreferences.purchase.showSupportBadge!} />
<FeatureSetting title={$t('tags')} state={userPreferences.tags.enabled!} />
<FeatureSetting title={$t('gcast_enabled')} state={userPreferences.cast.gCastEnabled!} />
</Stack>
</AdminCard>