mirror of
https://github.com/immich-app/immich
synced 2026-08-15 13:03:57 +00:00
feat: integrity checks admin settings (#29406)
This commit is contained in:
parent
6a7a34d294
commit
02506424a7
3 changed files with 197 additions and 0 deletions
|
|
@ -31,6 +31,7 @@
|
|||
mdiBookshelf,
|
||||
mdiClockOutline,
|
||||
mdiDatabaseOutline,
|
||||
mdiFileCheckOutline,
|
||||
mdiFileDocumentOutline,
|
||||
mdiFolderOutline,
|
||||
mdiImageOutline,
|
||||
|
|
@ -47,6 +48,7 @@
|
|||
import type { Component } from 'svelte';
|
||||
import { t } from 'svelte-i18n';
|
||||
import type { PageData } from './$types';
|
||||
import IntegrityChecksSettings from './IntegrityChecksSettings.svelte';
|
||||
|
||||
type Props = {
|
||||
data: PageData;
|
||||
|
|
@ -82,6 +84,13 @@
|
|||
key: 'image',
|
||||
icon: mdiImageOutline,
|
||||
},
|
||||
{
|
||||
component: IntegrityChecksSettings,
|
||||
title: $t('admin.integrity_checks_settings'),
|
||||
subtitle: $t('admin.integrity_checks_settings_description'),
|
||||
key: 'integrity-checks',
|
||||
icon: mdiFileCheckOutline,
|
||||
},
|
||||
{
|
||||
component: JobSettings,
|
||||
title: $t('admin.job_settings'),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,173 @@
|
|||
<script lang="ts">
|
||||
import SettingAccordion from '$lib/components/shared-components/settings/SettingAccordion.svelte';
|
||||
import SettingInputField from '$lib/components/shared-components/settings/SettingInputField.svelte';
|
||||
import SettingSwitch from '$lib/components/shared-components/settings/SettingSwitch.svelte';
|
||||
import SettingButtonsRow from '$lib/components/shared-components/settings/SystemConfigButtonRow.svelte';
|
||||
import { SettingInputFieldType } from '$lib/constants';
|
||||
import FormatMessage from '$lib/elements/FormatMessage.svelte';
|
||||
import { featureFlagsManager } from '$lib/managers/feature-flags-manager.svelte';
|
||||
import { systemConfigManager } from '$lib/managers/system-config-manager.svelte';
|
||||
import { Link } from '@immich/ui';
|
||||
import { t } from 'svelte-i18n';
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
const disabled = $derived(featureFlagsManager.value.configFile);
|
||||
const config = $derived(systemConfigManager.value);
|
||||
let configToEdit = $state(systemConfigManager.cloneValue());
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div in:fade={{ duration: 500 }}>
|
||||
<form autocomplete="off" onsubmit={(event) => event.preventDefault()}>
|
||||
<div class="ms-4 mt-4 flex flex-col gap-4">
|
||||
<SettingAccordion
|
||||
key="integrity-checks-missing-files"
|
||||
title={$t('admin.integrity_checks_missing_files')}
|
||||
subtitle={$t('admin.integrity_checks_missing_files_description')}
|
||||
>
|
||||
<div class="ms-4 mt-4 flex flex-col gap-4">
|
||||
<SettingSwitch
|
||||
title={$t('admin.integrity_checks_missing_files_enable_description')}
|
||||
{disabled}
|
||||
bind:checked={configToEdit.integrityChecks.missingFiles.enabled}
|
||||
/>
|
||||
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.TEXT}
|
||||
label={$t('admin.cron_expression')}
|
||||
bind:value={configToEdit.integrityChecks.missingFiles.cronExpression}
|
||||
required={true}
|
||||
{disabled}
|
||||
isEdited={!(
|
||||
configToEdit.integrityChecks.missingFiles.cronExpression ===
|
||||
config.integrityChecks.missingFiles.cronExpression
|
||||
)}
|
||||
>
|
||||
{#snippet descriptionSnippet()}
|
||||
<p class="text-sm dark:text-immich-dark-fg">
|
||||
<FormatMessage key="admin.cron_expression_description">
|
||||
{#snippet children({ message })}
|
||||
<Link
|
||||
href="https://crontab.guru/#{configToEdit.backup.database.cronExpression.replaceAll(' ', '_')}"
|
||||
>
|
||||
{message}
|
||||
<br />
|
||||
</Link>
|
||||
{/snippet}
|
||||
</FormatMessage>
|
||||
</p>
|
||||
{/snippet}
|
||||
</SettingInputField>
|
||||
</div>
|
||||
</SettingAccordion>
|
||||
|
||||
<SettingAccordion
|
||||
key="integrity-checks-untracked-files"
|
||||
title={$t('admin.integrity_checks_untracked_files')}
|
||||
subtitle={$t('admin.integrity_checks_untracked_files_description')}
|
||||
>
|
||||
<div class="ms-4 mt-4 flex flex-col gap-4">
|
||||
<SettingSwitch
|
||||
title={$t('admin.integrity_checks_untracked_files_enable_description')}
|
||||
{disabled}
|
||||
bind:checked={configToEdit.integrityChecks.untrackedFiles.enabled}
|
||||
/>
|
||||
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.TEXT}
|
||||
label={$t('admin.cron_expression')}
|
||||
bind:value={configToEdit.integrityChecks.untrackedFiles.cronExpression}
|
||||
required={true}
|
||||
{disabled}
|
||||
isEdited={!(
|
||||
configToEdit.integrityChecks.untrackedFiles.cronExpression ===
|
||||
config.integrityChecks.untrackedFiles.cronExpression
|
||||
)}
|
||||
>
|
||||
{#snippet descriptionSnippet()}
|
||||
<p class="text-sm dark:text-immich-dark-fg">
|
||||
<FormatMessage key="admin.cron_expression_description">
|
||||
{#snippet children({ message })}
|
||||
<Link
|
||||
href="https://crontab.guru/#{configToEdit.backup.database.cronExpression.replaceAll(' ', '_')}"
|
||||
>
|
||||
{message}
|
||||
<br />
|
||||
</Link>
|
||||
{/snippet}
|
||||
</FormatMessage>
|
||||
</p>
|
||||
{/snippet}
|
||||
</SettingInputField>
|
||||
</div>
|
||||
</SettingAccordion>
|
||||
|
||||
<SettingAccordion
|
||||
key="integrity-checks-checksum-files"
|
||||
title={$t('admin.integrity_checks_checksum_files')}
|
||||
subtitle={$t('admin.integrity_checks_checksum_files_description')}
|
||||
>
|
||||
<div class="ms-4 mt-4 flex flex-col gap-4">
|
||||
<SettingSwitch
|
||||
title={$t('admin.integrity_checks_checksum_files_enable_description')}
|
||||
{disabled}
|
||||
bind:checked={configToEdit.integrityChecks.checksumFiles.enabled}
|
||||
/>
|
||||
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.TEXT}
|
||||
label={$t('admin.cron_expression')}
|
||||
bind:value={configToEdit.integrityChecks.checksumFiles.cronExpression}
|
||||
required={true}
|
||||
{disabled}
|
||||
isEdited={!(
|
||||
configToEdit.integrityChecks.checksumFiles.cronExpression ===
|
||||
config.integrityChecks.checksumFiles.cronExpression
|
||||
)}
|
||||
>
|
||||
{#snippet descriptionSnippet()}
|
||||
<p class="text-sm dark:text-immich-dark-fg">
|
||||
<FormatMessage key="admin.cron_expression_description">
|
||||
{#snippet children({ message })}
|
||||
<Link
|
||||
href="https://crontab.guru/#{configToEdit.backup.database.cronExpression.replaceAll(' ', '_')}"
|
||||
>
|
||||
{message}
|
||||
<br />
|
||||
</Link>
|
||||
{/snippet}
|
||||
</FormatMessage>
|
||||
</p>
|
||||
{/snippet}
|
||||
</SettingInputField>
|
||||
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.NUMBER}
|
||||
label={$t('admin.integrity_checks_checksum_files_time_limit')}
|
||||
description={$t('admin.integrity_checks_checksum_files_time_limit_description')}
|
||||
bind:value={configToEdit.integrityChecks.checksumFiles.timeLimit}
|
||||
{disabled}
|
||||
isEdited={configToEdit.integrityChecks.checksumFiles.timeLimit !==
|
||||
config.integrityChecks.checksumFiles.timeLimit}
|
||||
/>
|
||||
|
||||
<SettingInputField
|
||||
inputType={SettingInputFieldType.NUMBER}
|
||||
label={$t('admin.integrity_checks_checksum_files_percentage_limit')}
|
||||
description={$t('admin.integrity_checks_checksum_files_percentage_limit_description')}
|
||||
bind:value={configToEdit.integrityChecks.checksumFiles.percentageLimit}
|
||||
step="0.01"
|
||||
min={0.01}
|
||||
max={1}
|
||||
{disabled}
|
||||
isEdited={configToEdit.integrityChecks.checksumFiles.percentageLimit !==
|
||||
config.integrityChecks.checksumFiles.percentageLimit}
|
||||
/>
|
||||
</div>
|
||||
</SettingAccordion>
|
||||
|
||||
<SettingButtonsRow bind:configToEdit keys={['integrityChecks']} {disabled} />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue