1.0.34
This commit is contained in:
56 files changed
+9101
-117
No files matched your search
@@ -79,6 +79,7 @@
|
||||
containers: number;
|
||||
images: number;
|
||||
name: string;
|
||||
engine?: 'docker' | 'podman';
|
||||
};
|
||||
}
|
||||
|
||||
@@ -576,7 +577,12 @@
|
||||
<!-- Docker Version Column -->
|
||||
<Table.Cell>
|
||||
{#if testResult?.info?.serverVersion}
|
||||
<span class="text-sm text-muted-foreground">{testResult.info.serverVersion}</span>
|
||||
<div class="flex items-center gap-1.5">
|
||||
<span class="text-sm text-muted-foreground">{testResult.info.serverVersion}</span>
|
||||
{#if testResult.info.engine === 'podman'}
|
||||
<Badge variant="secondary" class="text-[10px] px-1.5 py-0 leading-tight">Podman</Badge>
|
||||
{/if}
|
||||
</div>
|
||||
{:else}
|
||||
<span class="text-muted-foreground text-sm">—</span>
|
||||
{/if}
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
let highlightUpdates = $derived($appSettings.highlightUpdates);
|
||||
let compactPorts = $derived($appSettings.compactPorts);
|
||||
let showExposedPorts = $derived($appSettings.showExposedPorts);
|
||||
let honorProxyLabels = $derived($appSettings.honorProxyLabels);
|
||||
let showImageChangelogLinks = $derived($appSettings.showImageChangelogLinks);
|
||||
let timeFormat = $derived($appSettings.timeFormat);
|
||||
let dateFormat = $derived($appSettings.dateFormat);
|
||||
let downloadFormat = $derived($appSettings.downloadFormat);
|
||||
@@ -116,6 +118,18 @@ services:
|
||||
{ value: 'YYYY-MM-DD', label: 'YYYY-MM-DD', example: '2024-12-31' }
|
||||
];
|
||||
|
||||
const downloadFormatOptions: { value: DownloadFormat; label: string; description: string }[] = [
|
||||
{ value: 'tar', label: 'tar', description: 'Uncompressed archive' },
|
||||
{ value: 'tar.gz', label: 'tar.gz', description: 'Gzip-compressed archive' },
|
||||
{ value: 'raw', label: 'No archive', description: 'Single file, raw bytes' }
|
||||
];
|
||||
|
||||
const downloadFormatLabel: Record<DownloadFormat, string> = {
|
||||
tar: 'tar',
|
||||
'tar.gz': 'tar.gz',
|
||||
raw: 'No archive'
|
||||
};
|
||||
|
||||
function handleScheduleRetentionChange(e: Event) {
|
||||
const value = Math.max(1, Math.min(365, parseInt((e.target as HTMLInputElement).value) || 30));
|
||||
appSettings.setScheduleRetentionDays(value);
|
||||
@@ -288,6 +302,28 @@ services:
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground">Highlight container rows in amber when updates are available</p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<div class="flex items-center gap-3">
|
||||
<Label>Show changelog links</Label>
|
||||
<Tooltip.Root>
|
||||
<Tooltip.Trigger>
|
||||
<HelpCircle class="w-3.5 h-3.5 text-muted-foreground" />
|
||||
</Tooltip.Trigger>
|
||||
<Tooltip.Content side="top" class="max-w-xs">
|
||||
<p>Surface a release-notes link next to the image name on rows with updates available. The link is resolved from the image's <code>org.opencontainers.image.source</code> label, from the <code>ghcr.io</code> registry path, or from an explicit <code>dockhand.changelog.url</code> label override.</p>
|
||||
</Tooltip.Content>
|
||||
</Tooltip.Root>
|
||||
<TogglePill
|
||||
checked={showImageChangelogLinks}
|
||||
onchange={(checked) => {
|
||||
appSettings.setShowImageChangelogLinks(checked);
|
||||
toast.success(checked ? 'Changelog links shown' : 'Changelog links hidden');
|
||||
}}
|
||||
disabled={!$canAccess('settings', 'edit')}
|
||||
/>
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground">Show a release-notes icon next to images with updates available</p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<div class="flex items-center gap-3">
|
||||
<Label>Compact port display</Label>
|
||||
@@ -324,6 +360,28 @@ services:
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground">Display internal container ports in the container list grid</p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<div class="flex items-center gap-3">
|
||||
<Label>Honor Traefik/Pangolin labels</Label>
|
||||
<Tooltip.Root>
|
||||
<Tooltip.Trigger>
|
||||
<HelpCircle class="w-3.5 h-3.5 text-muted-foreground" />
|
||||
</Tooltip.Trigger>
|
||||
<Tooltip.Content side="top" class="max-w-xs">
|
||||
<p>Parse <code>traefik.http.routers.<name>.rule</code> and <code>pangolin.proxy-resources.<name>.full-domain</code> labels and surface the resulting URLs as clickable pills next to ports. When off, only explicit <code>dockhand.url</code> labels are shown.</p>
|
||||
</Tooltip.Content>
|
||||
</Tooltip.Root>
|
||||
<TogglePill
|
||||
checked={honorProxyLabels}
|
||||
onchange={(checked) => {
|
||||
appSettings.setHonorProxyLabels(checked);
|
||||
toast.success(checked ? 'Proxy labels honored' : 'Proxy labels ignored');
|
||||
}}
|
||||
disabled={!$canAccess('settings', 'edit')}
|
||||
/>
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground">Show URLs inferred from Traefik and Pangolin labels alongside dockhand.url</p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<div class="flex items-center gap-3">
|
||||
<Label>Time format</Label>
|
||||
@@ -470,18 +528,34 @@ services:
|
||||
<div class="space-y-1">
|
||||
<div class="flex items-center gap-3">
|
||||
<Label>Download format</Label>
|
||||
<ToggleSwitch
|
||||
<Select.Root
|
||||
type="single"
|
||||
value={downloadFormat}
|
||||
leftValue="tar"
|
||||
rightValue="tar.gz"
|
||||
onchange={(newFormat) => {
|
||||
appSettings.setDownloadFormat(newFormat as DownloadFormat);
|
||||
toast.success(`Download format set to ${newFormat}`);
|
||||
onValueChange={(value) => {
|
||||
if (value) {
|
||||
appSettings.setDownloadFormat(value as DownloadFormat);
|
||||
toast.success(`Download format set to ${downloadFormatLabel[value as DownloadFormat]}`);
|
||||
}
|
||||
}}
|
||||
disabled={!$canAccess('settings', 'edit')}
|
||||
/>
|
||||
>
|
||||
<Select.Trigger class="w-[180px]">
|
||||
<FileText class="w-4 h-4 mr-2" />
|
||||
<span>{downloadFormatLabel[downloadFormat]}</span>
|
||||
</Select.Trigger>
|
||||
<Select.Content>
|
||||
{#each downloadFormatOptions as option}
|
||||
<Select.Item value={option.value}>
|
||||
<div class="flex items-center justify-between w-full gap-4">
|
||||
<span>{option.label}</span>
|
||||
<span class="text-xs text-muted-foreground">{option.description}</span>
|
||||
</div>
|
||||
</Select.Item>
|
||||
{/each}
|
||||
</Select.Content>
|
||||
</Select.Root>
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground">Archive format when downloading files from containers</p>
|
||||
<p class="text-xs text-muted-foreground">Format when downloading files from containers or volumes. "No archive" emits raw bytes for single files; directories still download as tar.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="space-y-4">
|
||||
|
||||
Reference in new issue
Block a user