From 01fddd58c6a3f4ad7f82a921a2a0a41a629334e6 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Tue, 16 Sep 2025 01:42:17 +0100 Subject: [PATCH 01/87] chore: update ROCm image (#22034) --- machine-learning/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/machine-learning/Dockerfile b/machine-learning/Dockerfile index dd8d8ad7e8..e4ed643375 100644 --- a/machine-learning/Dockerfile +++ b/machine-learning/Dockerfile @@ -22,7 +22,7 @@ FROM builder-cpu AS builder-rknn # Warning: 25GiB+ disk space required to pull this image # TODO: find a way to reduce the image size -FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm +FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm # renovate: datasource=github-releases depName=Microsoft/onnxruntime ARG ONNXRUNTIME_VERSION="v1.20.1" @@ -99,7 +99,7 @@ COPY --from=builder-cuda /usr/local/bin/python3 /usr/local/bin/python3 COPY --from=builder-cuda /usr/local/lib/python3.11 /usr/local/lib/python3.11 COPY --from=builder-cuda /usr/local/lib/libpython3.11.so /usr/local/lib/libpython3.11.so -FROM rocm/dev-ubuntu-22.04:6.3.4-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm +FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS prod-rocm FROM prod-cpu AS prod-armnn From 3d883b27aaefa29eaf56ab9f580bf99c3a299724 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 15 Sep 2025 21:19:55 -0500 Subject: [PATCH 02/87] fix: sidebar link hightlight (#22035) * fix: sidebar link hightlight * check if current route start with href --- .../components/shared-components/side-bar/side-bar-link.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte b/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte index 99c98e0d0f..b1368ad3f3 100644 --- a/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte +++ b/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte @@ -28,7 +28,7 @@ }: Props = $props(); $effect(() => { - isSelected = (page.url.pathname.match(/^\/(admin|user)\/[^/]*/) || [])[0] === href; + isSelected = page.url.pathname.startsWith(href); }); From 4f4a50ac11a0777fcde73394a6e0e29170e59fa0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 23:12:15 -0400 Subject: [PATCH 03/87] chore(deps): update dependency @types/node to ^22.18.1 (#22042) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- cli/package.json | 2 +- e2e/package.json | 2 +- open-api/typescript-sdk/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- server/package.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/package.json b/cli/package.json index 7e11d1a15a..5b9b2d810c 100644 --- a/cli/package.json +++ b/cli/package.json @@ -20,7 +20,7 @@ "@types/lodash-es": "^4.17.12", "@types/micromatch": "^4.0.9", "@types/mock-fs": "^4.13.1", - "@types/node": "^22.18.0", + "@types/node": "^22.18.1", "@vitest/coverage-v8": "^3.0.0", "byte-size": "^9.0.0", "cli-progress": "^3.12.0", diff --git a/e2e/package.json b/e2e/package.json index 9356538d7c..737f488a50 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -25,7 +25,7 @@ "@playwright/test": "^1.44.1", "@socket.io/component-emitter": "^3.1.2", "@types/luxon": "^3.4.2", - "@types/node": "^22.18.0", + "@types/node": "^22.18.1", "@types/oidc-provider": "^9.0.0", "@types/pg": "^8.15.1", "@types/pngjs": "^6.0.4", diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index 3a52fd6360..8f0d44dcbb 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -19,7 +19,7 @@ "@oazapfts/runtime": "^1.0.2" }, "devDependencies": { - "@types/node": "^22.18.0", + "@types/node": "^22.18.1", "typescript": "^5.3.3" }, "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fb05f0bb8..d903068ea3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,7 +63,7 @@ importers: specifier: ^4.13.1 version: 4.13.4 '@types/node': - specifier: ^22.18.0 + specifier: ^22.18.1 version: 22.18.1 '@vitest/coverage-v8': specifier: ^3.0.0 @@ -214,7 +214,7 @@ importers: specifier: ^3.4.2 version: 3.7.1 '@types/node': - specifier: ^22.18.0 + specifier: ^22.18.1 version: 22.18.1 '@types/oidc-provider': specifier: ^9.0.0 @@ -296,7 +296,7 @@ importers: version: 1.0.4 devDependencies: '@types/node': - specifier: ^22.18.0 + specifier: ^22.18.1 version: 22.18.1 typescript: specifier: ^5.3.3 @@ -585,7 +585,7 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@types/node': - specifier: ^22.18.0 + specifier: ^22.18.1 version: 22.18.1 '@types/nodemailer': specifier: ^6.4.14 diff --git a/server/package.json b/server/package.json index 0a713689da..0f1734dc01 100644 --- a/server/package.json +++ b/server/package.json @@ -129,7 +129,7 @@ "@types/luxon": "^3.6.2", "@types/mock-fs": "^4.13.1", "@types/multer": "^2.0.0", - "@types/node": "^22.18.0", + "@types/node": "^22.18.1", "@types/nodemailer": "^6.4.14", "@types/picomatch": "^4.0.0", "@types/pngjs": "^6.0.5", From 5fb0afb0d0958ca39946cde87e7f58d052e0a6cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 23:13:21 -0400 Subject: [PATCH 04/87] chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to c44be5f (#22038) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/docker-compose.dev.yml | 2 +- docker/docker-compose.prod.yml | 2 +- docker/docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 1bc1908d4e..7864a1edd1 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -149,7 +149,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107 env_file: - .env environment: diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index f7d1f564cf..c3fb9c7736 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -63,7 +63,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107 env_file: - .env environment: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c401d4cfc7..3316c17839 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -56,7 +56,7 @@ services: database: container_name: immich_postgres - image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:8d292bdb796aa58bbbaa47fe971c8516f6f57d6a47e7172e62754feb6ed4e7b0 + image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:c44be5f2871c59362966d71eab4268170eb6f5653c0e6170184e72b38ffdf107 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} From 0f79e0c38eb377d421f230abc6a156f11ea88328 Mon Sep 17 00:00:00 2001 From: Stewart Rand Date: Tue, 16 Sep 2025 00:28:42 -0300 Subject: [PATCH 05/87] fix: Use CSS for uppercase text (#22011) --- .../admin-page/jobs/job-tile.svelte | 18 ++++++++--------- .../admin-page/jobs/jobs-panel.svelte | 6 +++--- .../server-stats/server-stats-panel.svelte | 16 +++++++-------- .../admin-page/server-stats/stats-card.svelte | 2 +- .../settings/auth/auth-settings.svelte | 20 +++++++++---------- .../storage-template-settings.svelte | 2 +- .../supported-datetime-panel.svelte | 16 +++++++-------- .../supported-variables-panel.svelte | 8 ++++---- .../asset-viewer/detail-panel-tags.svelte | 2 +- .../asset-viewer/detail-panel.svelte | 10 +++++----- .../asset-viewer/download-panel.svelte | 2 +- .../editor/crop-tool/crop-tool.svelte | 4 ++-- .../memory-page/memory-viewer.svelte | 4 ++-- .../onboarding-page/onboarding-card.svelte | 4 ++-- .../onboarding-page/onboarding-theme.svelte | 4 ++-- .../search-bar/search-camera-section.svelte | 2 +- .../search-bar/search-date-section.svelte | 4 ++-- .../search-bar/search-display-section.svelte | 2 +- .../search-bar/search-history-box.svelte | 2 +- .../search-bar/search-location-section.svelte | 2 +- .../search-bar/search-media-section.svelte | 2 +- .../search-bar/search-people-section.svelte | 2 +- .../search-bar/search-ratings-section.svelte | 16 ++++++++------- .../search-bar/search-tags-section.svelte | 20 ++++++++++--------- .../settings/setting-input-field.svelte | 2 +- .../side-bar/user-sidebar.svelte | 2 +- .../shared-components/user-avatar.svelte | 4 ++-- .../sharedlinks-page/shared-link-card.svelte | 2 +- .../user-settings-page/device-list.svelte | 12 +++++------ .../partner-settings.svelte | 8 ++++---- .../utilities-page/utilities-menu.svelte | 2 +- web/src/lib/modals/AlbumOptionsModal.svelte | 4 ++-- web/src/lib/modals/TagCreateModal.svelte | 2 +- web/src/lib/modals/TagEditModal.svelte | 6 +----- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 6 +++--- .../[[assetId=id]]/+page.svelte | 2 +- web/src/routes/admin/users/[id]/+page.svelte | 11 +++------- web/src/routes/auth/login/+page.svelte | 4 ++-- 40 files changed, 118 insertions(+), 123 deletions(-) diff --git a/web/src/lib/components/admin-page/jobs/job-tile.svelte b/web/src/lib/components/admin-page/jobs/job-tile.svelte index d2e0ca3ac4..dcd76fa238 100644 --- a/web/src/lib/components/admin-page/jobs/job-tile.svelte +++ b/web/src/lib/components/admin-page/jobs/job-tile.svelte @@ -67,7 +67,7 @@
{#if jobCounts.failed > 0} @@ -137,7 +137,7 @@ onClick={() => onCommand({ command: JobCommand.Start, force: false })} > - {$t('disabled').toUpperCase()} + {$t('disabled')} {/if} @@ -145,7 +145,7 @@ {#if waitingCount > 0} onCommand({ command: JobCommand.Empty, force: false })}> - {$t('clear').toUpperCase()} + {$t('clear')} {/if} {#if queueStatus.isPaused} @@ -153,12 +153,12 @@ onCommand({ command: JobCommand.Resume, force: false })}> - {$t('resume').toUpperCase()} + {$t('resume')} {:else} onCommand({ command: JobCommand.Pause, force: false })}> - {$t('pause').toUpperCase()} + {$t('pause')} {/if} {/if} @@ -167,25 +167,25 @@ {#if allText} onCommand({ command: JobCommand.Start, force: true })}> - {allText} + {allText} {/if} {#if refreshText} onCommand({ command: JobCommand.Start, force: undefined })}> - {refreshText} + {refreshText} {/if} onCommand({ command: JobCommand.Start, force: false })}> - {missingText} + {missingText} {/if} {#if !disabled && !multipleButtons && isIdle} onCommand({ command: JobCommand.Start, force: false })}> - {missingText} + {missingText} {/if}
diff --git a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte index 463bcb3d20..93e015e251 100644 --- a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte +++ b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte @@ -177,9 +177,9 @@ {disabled} {subtitle} {description} - allText={allText?.toUpperCase()} - refreshText={refreshText?.toUpperCase()} - missingText={missingText.toUpperCase()} + {allText} + {refreshText} + {missingText} {jobCounts} {queueStatus} onCommand={(command) => (handleCommandOverride || handleCommand)(jobName, command)} diff --git a/web/src/lib/components/admin-page/server-stats/server-stats-panel.svelte b/web/src/lib/components/admin-page/server-stats/server-stats-panel.svelte index b9ceec7445..25c5a0dc56 100644 --- a/web/src/lib/components/admin-page/server-stats/server-stats-panel.svelte +++ b/web/src/lib/components/admin-page/server-stats/server-stats-panel.svelte @@ -36,19 +36,19 @@
-

{$t('total_usage').toUpperCase()}

+

{$t('total_usage')}

-

{$t('photos').toUpperCase()}

+

{$t('photos')}

@@ -60,7 +60,7 @@
-

{$t('videos').toUpperCase()}

+

{$t('videos')}

@@ -72,7 +72,7 @@
-

{$t('storage').toUpperCase()}

+

{$t('storage')}

@@ -87,7 +87,7 @@
-

{$t('user_usage_detail').toUpperCase()}

+

{$t('user_usage_detail')}

- {title} + {title}
diff --git a/web/src/lib/components/admin-page/settings/auth/auth-settings.svelte b/web/src/lib/components/admin-page/settings/auth/auth-settings.svelte index ef371910c5..07a0e3952c 100644 --- a/web/src/lib/components/admin-page/settings/auth/auth-settings.svelte +++ b/web/src/lib/components/admin-page/settings/auth/auth-settings.svelte @@ -183,7 +183,7 @@ {$t('template')}
-

{$t('preview').toUpperCase()}

+

{$t('preview')}

diff --git a/web/src/lib/components/admin-page/settings/storage-template/supported-datetime-panel.svelte b/web/src/lib/components/admin-page/settings/storage-template/supported-datetime-panel.svelte index 8d8d6f0fa7..af21cdc3c9 100644 --- a/web/src/lib/components/admin-page/settings/storage-template/supported-datetime-panel.svelte +++ b/web/src/lib/components/admin-page/settings/storage-template/supported-datetime-panel.svelte @@ -16,7 +16,7 @@

-

{$t('date_and_time').toUpperCase()}

+

{$t('date_and_time')}

@@ -27,7 +27,7 @@
-

{$t('year').toUpperCase()}

+

{$t('year')}

    {#each options.yearOptions as yearFormat, index (index)}
  • {'{{'}{yearFormat}{'}}'} - {getLuxonExample(yearFormat)}
  • @@ -36,7 +36,7 @@
-

{$t('month').toUpperCase()}

+

{$t('month')}

    {#each options.monthOptions as monthFormat, index (index)}
  • {'{{'}{monthFormat}{'}}'} - {getLuxonExample(monthFormat)}
  • @@ -45,7 +45,7 @@
-

{$t('week').toUpperCase()}

+

{$t('week')}

    {#each options.weekOptions as weekFormat, index (index)}
  • {'{{'}{weekFormat}{'}}'} - {getLuxonExample(weekFormat)}
  • @@ -54,7 +54,7 @@
-

{$t('day').toUpperCase()}

+

{$t('day')}

    {#each options.dayOptions as dayFormat, index (index)}
  • {'{{'}{dayFormat}{'}}'} - {getLuxonExample(dayFormat)}
  • @@ -63,7 +63,7 @@
-

{$t('hour').toUpperCase()}

+

{$t('hour')}

    {#each options.hourOptions as dayFormat, index (index)}
  • {'{{'}{dayFormat}{'}}'} - {getLuxonExample(dayFormat)}
  • @@ -72,7 +72,7 @@
-

{$t('minute').toUpperCase()}

+

{$t('minute')}

    {#each options.minuteOptions as dayFormat, index (index)}
  • {'{{'}{dayFormat}{'}}'} - {getLuxonExample(dayFormat)}
  • @@ -81,7 +81,7 @@
-

{$t('second').toUpperCase()}

+

{$t('second')}

{#each sortOptionsMetadata as option, index (index)} diff --git a/web/src/lib/components/asset-viewer/detail-panel-location.svelte b/web/src/lib/components/asset-viewer/detail-panel-location.svelte index 57fe04b0ef..1a3779f528 100644 --- a/web/src/lib/components/asset-viewer/detail-panel-location.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel-location.svelte @@ -40,8 +40,7 @@ class="flex w-full text-start justify-between place-items-start gap-4 py-4" onclick={() => (isOwner ? (isShowChangeLocation = true) : null)} title={isOwner ? $t('edit_location') : ''} - class:hover:dark:text-immich-dark-primary={isOwner} - class:hover:text-immich-primary={isOwner} + class:hover:text-primary={isOwner} >
@@ -72,7 +71,7 @@ {:else if !asset.exifInfo?.city && isOwner}
@@ -116,7 +116,7 @@ {#if user.quotaSizeInBytes !== null} / {getByteUnitString(user.quotaSizeInBytes, $locale, 0)} {/if} - + {#if user.quotaSizeInBytes !== null && user.quotaSizeInBytes >= 0} ({(user.quotaSizeInBytes === 0 ? 1 : user.usage / user.quotaSizeInBytes).toLocaleString($locale, { style: 'percent', diff --git a/web/src/lib/components/shared-components/map/map.svelte b/web/src/lib/components/shared-components/map/map.svelte index 555181ab3b..bf2c4357e0 100644 --- a/web/src/lib/components/shared-components/map/map.svelte +++ b/web/src/lib/components/shared-components/map/map.svelte @@ -367,11 +367,7 @@ > {#snippet children({ feature }: { feature: Feature })} {#if useLocationPin} - + {:else}
-

+

{$user.name}

{$user.email}

@@ -107,7 +107,7 @@ - {$t('reset_to_default')} - {/if}
diff --git a/web/src/lib/components/shared-components/settings/setting-checkboxes.svelte b/web/src/lib/components/shared-components/settings/setting-checkboxes.svelte index efec23460c..940bab36fc 100644 --- a/web/src/lib/components/shared-components/settings/setting-checkboxes.svelte +++ b/web/src/lib/components/shared-components/settings/setting-checkboxes.svelte @@ -31,7 +31,7 @@
-
{$t('user')}
diff --git a/web/src/lib/components/user-settings-page/user-purchase-settings.svelte b/web/src/lib/components/user-settings-page/user-purchase-settings.svelte index 9a61c6086b..5aeed92d41 100644 --- a/web/src/lib/components/user-settings-page/user-purchase-settings.svelte +++ b/web/src/lib/components/user-settings-page/user-purchase-settings.svelte @@ -122,10 +122,10 @@
- +
-

+

{$t('purchase_server_title')}

@@ -154,10 +154,10 @@
- +
-

+

{$t('purchase_individual_title')}

{#if $user.license?.activatedAt} diff --git a/web/src/lib/components/user-settings-page/user-usage-statistic.svelte b/web/src/lib/components/user-settings-page/user-usage-statistic.svelte index 933d54ceea..e2848f09fb 100644 --- a/web/src/lib/components/user-settings-page/user-usage-statistic.svelte +++ b/web/src/lib/components/user-settings-page/user-usage-statistic.svelte @@ -71,7 +71,7 @@
{$t('name')}
@@ -94,9 +94,7 @@
{$t('view_name')}
- + diff --git a/web/src/lib/components/utilities-page/utilities-menu.svelte b/web/src/lib/components/utilities-page/utilities-menu.svelte index d9e22aaa9e..fc747dc6af 100644 --- a/web/src/lib/components/utilities-page/utilities-menu.svelte +++ b/web/src/lib/components/utilities-page/utilities-menu.svelte @@ -16,7 +16,7 @@ {#each links as link (link.href)} - + {link.label} {/each} diff --git a/web/src/lib/elements/Dropdown.svelte b/web/src/lib/elements/Dropdown.svelte index 8bc956c779..6cf4b005b2 100644 --- a/web/src/lib/elements/Dropdown.svelte +++ b/web/src/lib/elements/Dropdown.svelte @@ -121,10 +121,10 @@ onclick={() => !renderedOption.disabled && handleSelectOption(option)} > {#if isEqual(selectedOption, option)} -
+
-

+

{renderedOption.title}

{:else} diff --git a/web/src/lib/elements/StarRating.svelte b/web/src/lib/elements/StarRating.svelte index 37634c3311..f345dc86b7 100644 --- a/web/src/lib/elements/StarRating.svelte +++ b/web/src/lib/elements/StarRating.svelte @@ -57,7 +57,7 @@
setHoverRating(0)} use:focusOutside={{ onFocusOut: reset }} use:shortcuts={[ @@ -114,7 +114,7 @@ ratingSelection = 0; handleSelect(ratingSelection); }} - class="cursor-pointer text-xs text-immich-primary dark:text-immich-dark-primary" + class="cursor-pointer text-xs text-primary" > {$t('rating_clear')} diff --git a/web/src/lib/modals/AlbumUsersModal.svelte b/web/src/lib/modals/AlbumUsersModal.svelte index 32c8cd28cf..ac33ed0be9 100644 --- a/web/src/lib/modals/AlbumUsersModal.svelte +++ b/web/src/lib/modals/AlbumUsersModal.svelte @@ -140,7 +140,7 @@ {/if} diff --git a/web/src/lib/modals/ApiKeySecretModal.svelte b/web/src/lib/modals/ApiKeySecretModal.svelte index b50aed5f79..e3c8d13fb8 100644 --- a/web/src/lib/modals/ApiKeySecretModal.svelte +++ b/web/src/lib/modals/ApiKeySecretModal.svelte @@ -14,7 +14,7 @@ -
+

{$t('api_key_description')}

diff --git a/web/src/lib/modals/HelpAndFeedbackModal.svelte b/web/src/lib/modals/HelpAndFeedbackModal.svelte index 0e4f33dfa6..f2b60738a4 100644 --- a/web/src/lib/modals/HelpAndFeedbackModal.svelte +++ b/web/src/lib/modals/HelpAndFeedbackModal.svelte @@ -20,10 +20,7 @@
-

+

{$t('documentation')}

@@ -32,10 +29,7 @@
-

+

{$t('source')}

@@ -44,10 +38,7 @@
-

+

{$t('discord')}

@@ -56,10 +47,7 @@
-

+

{$t('bugs_and_feature_requests')}

@@ -75,10 +63,7 @@
-

+

{$t('documentation')}

@@ -89,10 +74,7 @@
-

+

{$t('source')}

@@ -103,10 +85,7 @@
-

+

{$t('support')}

@@ -117,10 +96,7 @@
-

+

{$t('bugs_and_feature_requests')}

diff --git a/web/src/lib/modals/PersonEditBirthDateModal.svelte b/web/src/lib/modals/PersonEditBirthDateModal.svelte index 1b4d7591e2..520a606971 100644 --- a/web/src/lib/modals/PersonEditBirthDateModal.svelte +++ b/web/src/lib/modals/PersonEditBirthDateModal.svelte @@ -37,7 +37,7 @@ -
+

{$t('birthdate_set_description')}

diff --git a/web/src/lib/modals/ServerAboutModal.svelte b/web/src/lib/modals/ServerAboutModal.svelte index 963e2bff64..99967e7588 100644 --- a/web/src/lib/modals/ServerAboutModal.svelte +++ b/web/src/lib/modals/ServerAboutModal.svelte @@ -17,11 +17,9 @@ -
+
- +
- +

{info.exiftool}

- +

{info.nodejs}

- +

{info.libvips}

10 ? 'col-span-2' : ''}> - +

{info.imagemagick}

10 ? 'col-span-2' : ''}> - +

{info.ffmpeg}

@@ -82,9 +70,7 @@ {#if info.repository && info.repositoryUrl}
- +
- +
- +
- +
- +
{$t('owned')} {$t('shared')}
diff --git a/web/src/routes/admin/users/+page.svelte b/web/src/routes/admin/users/+page.svelte index f34b393291..9416d92db8 100644 --- a/web/src/routes/admin/users/+page.svelte +++ b/web/src/routes/admin/users/+page.svelte @@ -87,7 +87,7 @@
{$t('name')}
Date: Wed, 17 Sep 2025 12:14:16 -0400 Subject: [PATCH 57/87] fix(mobile): load original image (#22142) load original image --- .../alextran/immich/images/ThumbnailsImpl.kt | 8 ++++---- mobile/ios/Runner/Images/ThumbnailsImpl.swift | 2 +- .../widgets/images/local_image_provider.dart | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt index 1b1716f55c..1ccd742d67 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/images/ThumbnailsImpl.kt @@ -8,7 +8,6 @@ import android.net.Uri import android.os.Build import android.os.CancellationSignal import android.os.OperationCanceledException -import android.provider.MediaStore import android.provider.MediaStore.Images import android.provider.MediaStore.Video import android.util.Size @@ -19,7 +18,6 @@ import com.bumptech.glide.Glide import com.bumptech.glide.Priority import com.bumptech.glide.load.DecodeFormat import java.util.Base64 -import java.util.HashMap import java.util.concurrent.CancellationException import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Future @@ -202,8 +200,10 @@ class ThumbnailsImpl(context: Context) : ThumbnailApi { val source = ImageDecoder.createSource(resolver, uri) signal.throwIfCanceled() ImageDecoder.decodeBitmap(source) { decoder, info, _ -> - val sampleSize = max(1, min(info.size.width / targetWidth, info.size.height / targetHeight)) - decoder.setTargetSampleSize(sampleSize) + if (targetWidth > 0 && targetHeight > 0) { + val sample = max(1, min(info.size.width / targetWidth, info.size.height / targetHeight)) + decoder.setTargetSampleSize(sample) + } decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE decoder.setTargetColorSpace(ColorSpace.get(ColorSpace.Named.SRGB)) } diff --git a/mobile/ios/Runner/Images/ThumbnailsImpl.swift b/mobile/ios/Runner/Images/ThumbnailsImpl.swift index d1ea2cc0e0..452ca62377 100644 --- a/mobile/ios/Runner/Images/ThumbnailsImpl.swift +++ b/mobile/ios/Runner/Images/ThumbnailsImpl.swift @@ -105,7 +105,7 @@ class ThumbnailApiImpl: ThumbnailApi { var image: UIImage? Self.imageManager.requestImage( for: asset, - targetSize: CGSize(width: Double(width), height: Double(height)), + targetSize: width > 0 && height > 0 ? CGSize(width: Double(width), height: Double(height)) : PHImageManagerMaximumSize, contentMode: .aspectFill, options: Self.requestOptions, resultHandler: { (_image, info) -> Void in diff --git a/mobile/lib/presentation/widgets/images/local_image_provider.dart b/mobile/lib/presentation/widgets/images/local_image_provider.dart index 223d095432..f90961ea5a 100644 --- a/mobile/lib/presentation/widgets/images/local_image_provider.dart +++ b/mobile/lib/presentation/widgets/images/local_image_provider.dart @@ -4,6 +4,8 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/domain/models/store.model.dart'; +import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/infrastructure/loaders/image_request.dart'; import 'package:immich_mobile/presentation/widgets/images/image_provider.dart'; import 'package:immich_mobile/presentation/widgets/images/one_frame_multi_image_stream_completer.dart'; @@ -88,13 +90,26 @@ class LocalFullImageProvider extends CancellableImageProvider Date: Wed, 17 Sep 2025 21:48:54 +0530 Subject: [PATCH 58/87] fix: show delete on device when asset has a local match (#22143) * fix: show delete on device when asset has a local match * change test description --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- mobile/lib/utils/action_button.utils.dart | 2 +- mobile/test/utils/action_button_utils_test.dart | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mobile/lib/utils/action_button.utils.dart b/mobile/lib/utils/action_button.utils.dart index 4dfc0398bd..090aeeeaa7 100644 --- a/mobile/lib/utils/action_button.utils.dart +++ b/mobile/lib/utils/action_button.utils.dart @@ -102,7 +102,7 @@ enum ActionButtonType { context.asset.hasRemote, ActionButtonType.deleteLocal => !context.isInLockedView && // - context.asset.storage == AssetState.local, + context.asset.hasLocal, ActionButtonType.upload => !context.isInLockedView && // context.asset.storage == AssetState.local, diff --git a/mobile/test/utils/action_button_utils_test.dart b/mobile/test/utils/action_button_utils_test.dart index 497246e2a1..f8c51173d7 100644 --- a/mobile/test/utils/action_button_utils_test.dart +++ b/mobile/test/utils/action_button_utils_test.dart @@ -502,6 +502,21 @@ void main() { expect(ActionButtonType.deleteLocal.shouldShow(context), isFalse); }); + + test('should show when asset is merged', () { + final context = ActionButtonContext( + asset: mergedAsset, + isOwner: true, + isArchived: false, + isTrashEnabled: true, + isInLockedView: false, + currentAlbum: null, + advancedTroubleshooting: false, + source: ActionSource.timeline, + ); + + expect(ActionButtonType.deleteLocal.shouldShow(context), isTrue); + }); }); group('upload button', () { From 98ea3847e52bc50bd4004394bcce2a99a07c71b4 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 17 Sep 2025 12:23:23 -0400 Subject: [PATCH 59/87] refactor: server-about-modal (#22138) * refactor: server-about-modal * fix: bits-ui scroll lock cleanup --- web/src/lib/components/ServerAboutItem.svelte | 24 +++ .../shared-components/change-date.spec.ts | 9 +- web/src/lib/modals/ServerAboutModal.svelte | 159 +++++------------- 3 files changed, 74 insertions(+), 118 deletions(-) create mode 100644 web/src/lib/components/ServerAboutItem.svelte diff --git a/web/src/lib/components/ServerAboutItem.svelte b/web/src/lib/components/ServerAboutItem.svelte new file mode 100644 index 0000000000..9e169a9839 --- /dev/null +++ b/web/src/lib/components/ServerAboutItem.svelte @@ -0,0 +1,24 @@ + + +
+ + + {#if versionHref} + {version} + {:else} + {version} + {/if} + +
diff --git a/web/src/lib/components/shared-components/change-date.spec.ts b/web/src/lib/components/shared-components/change-date.spec.ts index 43035051f3..63926a44a6 100644 --- a/web/src/lib/components/shared-components/change-date.spec.ts +++ b/web/src/lib/components/shared-components/change-date.spec.ts @@ -1,6 +1,6 @@ import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock'; import { getVisualViewportMock } from '$lib/__mocks__/visual-viewport.mock'; -import { fireEvent, render, screen } from '@testing-library/svelte'; +import { fireEvent, render, screen, waitFor } from '@testing-library/svelte'; import userEvent from '@testing-library/user-event'; import { DateTime } from 'luxon'; import ChangeDate from './change-date.svelte'; @@ -30,6 +30,13 @@ describe('ChangeDate component', () => { vi.resetAllMocks(); }); + afterAll(async () => { + await waitFor(() => { + // check that bits-ui body scroll-lock class is gone + expect(document.body.style.pointerEvents).not.toBe('none'); + }); + }); + test('should render correct values', () => { render(ChangeDate, { initialDate, initialTimeZone, onCancel, onConfirm }); expect(getDateInput().value).toBe('2024-01-01T00:00'); diff --git a/web/src/lib/modals/ServerAboutModal.svelte b/web/src/lib/modals/ServerAboutModal.svelte index 99967e7588..92bbac3d67 100644 --- a/web/src/lib/modals/ServerAboutModal.svelte +++ b/web/src/lib/modals/ServerAboutModal.svelte @@ -1,8 +1,8 @@ - -
- + +
+