Skip to content

Commit 7f14ac0

Browse files
committed
merge main
2 parents 7cce100 + 2d5ec52 commit 7f14ac0

File tree

56 files changed

+2425
-2102
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2425
-2102
lines changed

e2e/src/web/specs/timeline/timeline.parallel-e2e-spec.ts

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,53 @@ test.describe('Timeline', () => {
611611
await page.getByText('Photos', { exact: true }).click();
612612
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
613613
});
614+
test('open /archive, favorite photo, unfavorite', async ({ page }) => {
615+
const assetToFavorite = assets[0];
616+
changes.assetArchivals.push(assetToFavorite.id);
617+
await pageUtils.openArchivePage(page);
618+
const favorite = pageRoutePromise(page, '**/api/assets', async (route, request) => {
619+
const requestJson = request.postDataJSON();
620+
if (requestJson.isFavorite === undefined) {
621+
return await route.continue();
622+
}
623+
const isFavorite = requestJson.isFavorite;
624+
if (isFavorite) {
625+
changes.assetFavorites.push(...requestJson.ids);
626+
}
627+
await route.fulfill({
628+
status: 204,
629+
});
630+
});
631+
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
632+
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
633+
await page.getByLabel('Favorite').click();
634+
await expect(favorite).resolves.toEqual({
635+
isFavorite: true,
636+
ids: [assetToFavorite.id],
637+
});
638+
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(1);
639+
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
640+
await thumbnailUtils.expectThumbnailIsFavorite(page, assetToFavorite.id);
641+
await thumbnailUtils.withAssetId(page, assetToFavorite.id).hover();
642+
await thumbnailUtils.selectButton(page, assetToFavorite.id).click();
643+
const unFavoriteRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
644+
const requestJson = request.postDataJSON();
645+
if (requestJson.isFavorite === undefined) {
646+
return await route.continue();
647+
}
648+
changes.assetFavorites = changes.assetFavorites.filter((id) => !requestJson.ids.includes(id));
649+
await route.fulfill({
650+
status: 204,
651+
});
652+
});
653+
await page.getByLabel('Remove from favorites').click();
654+
await expect(unFavoriteRequest).resolves.toEqual({
655+
isFavorite: false,
656+
ids: [assetToFavorite.id],
657+
});
658+
await expect(thumbnailUtils.withAssetId(page, assetToFavorite.id)).toHaveCount(1);
659+
await thumbnailUtils.expectThumbnailIsNotFavorite(page, assetToFavorite.id);
660+
});
614661
test('open album, archive photo, open album, unarchive', async ({ page }) => {
615662
const album = timelineRestData.album;
616663
await pageUtils.openAlbumPage(page, album.id);
@@ -633,8 +680,7 @@ test.describe('Timeline', () => {
633680
visibility: 'archive',
634681
ids: [assetToArchive.id],
635682
});
636-
console.log('Skipping assertion - TODO - fix that archiving in album doesnt add icon');
637-
// await thumbnail.expectThumbnailIsArchive(page, assetToArchive.id);
683+
await thumbnailUtils.expectThumbnailIsArchive(page, assetToArchive.id);
638684
await page.locator('#asset-selection-app-bar').getByLabel('Close').click();
639685
await page.getByRole('link').getByText('Archive').click();
640686
await timelineUtils.waitForTimelineLoad(page);
@@ -656,8 +702,7 @@ test.describe('Timeline', () => {
656702
visibility: 'timeline',
657703
ids: [assetToArchive.id],
658704
});
659-
console.log('Skipping assertion - TODO - fix bug with not removing asset from timeline-manager after unarchive');
660-
// await expect(thumbnail.withAssetId(page, assetToArchive.id)).toHaveCount(0);
705+
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
661706
await pageUtils.openAlbumPage(page, album.id);
662707
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
663708
});
@@ -712,6 +757,50 @@ test.describe('Timeline', () => {
712757
await page.getByText('Photos', { exact: true }).click();
713758
await thumbnailUtils.expectInViewport(page, assetToFavorite.id);
714759
});
760+
test('open /favorites, archive photo, unarchive photo', async ({ page }) => {
761+
await pageUtils.openFavorites(page);
762+
const assetToArchive = getAsset(timelineRestData, 'ad31e29f-2069-4574-b9a9-ad86523c92cb')!;
763+
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
764+
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
765+
await page.getByLabel('Menu').click();
766+
const archive = pageRoutePromise(page, '**/api/assets', async (route, request) => {
767+
const requestJson = request.postDataJSON();
768+
if (requestJson.visibility !== 'archive') {
769+
return await route.continue();
770+
}
771+
await route.fulfill({
772+
status: 204,
773+
});
774+
changes.assetArchivals.push(...requestJson.ids);
775+
});
776+
await page.getByRole('menuitem').getByText('Archive').click();
777+
await expect(archive).resolves.toEqual({
778+
visibility: 'archive',
779+
ids: [assetToArchive.id],
780+
});
781+
await page.getByRole('link').getByText('Archive').click();
782+
await thumbnailUtils.expectInViewport(page, assetToArchive.id);
783+
await thumbnailUtils.expectThumbnailIsNotArchive(page, assetToArchive.id);
784+
await thumbnailUtils.withAssetId(page, assetToArchive.id).hover();
785+
await thumbnailUtils.selectButton(page, assetToArchive.id).click();
786+
const unarchiveRequest = pageRoutePromise(page, '**/api/assets', async (route, request) => {
787+
const requestJson = request.postDataJSON();
788+
if (requestJson.visibility !== 'timeline') {
789+
return await route.continue();
790+
}
791+
changes.assetArchivals = changes.assetArchivals.filter((id) => !requestJson.ids.includes(id));
792+
await route.fulfill({
793+
status: 204,
794+
});
795+
});
796+
await page.getByLabel('Unarchive').click();
797+
await expect(unarchiveRequest).resolves.toEqual({
798+
visibility: 'timeline',
799+
ids: [assetToArchive.id],
800+
});
801+
await expect(thumbnailUtils.withAssetId(page, assetToArchive.id)).toHaveCount(0);
802+
await thumbnailUtils.expectThumbnailIsNotArchive(page, assetToArchive.id);
803+
});
715804
test('Open album, favorite photo, open /favorites, remove favorite, Open album', async ({ page }) => {
716805
const album = timelineRestData.album;
717806
await pageUtils.openAlbumPage(page, album.id);

e2e/src/web/specs/timeline/utils.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,20 +105,16 @@ export const thumbnailUtils = {
105105
return await poll(page, () => thumbnailUtils.queryThumbnailInViewport(page, collector));
106106
},
107107
async expectThumbnailIsFavorite(page: Page, assetId: string) {
108-
await expect(
109-
thumbnailUtils
110-
.withAssetId(page, assetId)
111-
.locator(
112-
'path[d="M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z"]',
113-
),
114-
).toHaveCount(1);
108+
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-favorite]')).toHaveCount(1);
109+
},
110+
async expectThumbnailIsNotFavorite(page: Page, assetId: string) {
111+
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-favorite]')).toHaveCount(0);
115112
},
116113
async expectThumbnailIsArchive(page: Page, assetId: string) {
117-
await expect(
118-
thumbnailUtils
119-
.withAssetId(page, assetId)
120-
.locator('path[d="M20 21H4V10H6V19H18V10H20V21M3 3H21V9H3V3M5 5V7H19V5M10.5 11V14H8L12 18L16 14H13.5V11"]'),
121-
).toHaveCount(1);
114+
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-archive]')).toHaveCount(1);
115+
},
116+
async expectThumbnailIsNotArchive(page: Page, assetId: string) {
117+
await expect(thumbnailUtils.withAssetId(page, assetId).locator('[data-icon-archive]')).toHaveCount(0);
122118
},
123119
async expectSelectedReadonly(page: Page, assetId: string) {
124120
// todo - need a data attribute for selected
@@ -208,10 +204,18 @@ export const pageUtils = {
208204
await page.goto(`/photos`);
209205
await timelineUtils.waitForTimelineLoad(page);
210206
},
207+
async openFavorites(page: Page) {
208+
await page.goto(`/favorites`);
209+
await timelineUtils.waitForTimelineLoad(page);
210+
},
211211
async openAlbumPage(page: Page, albumId: string) {
212212
await page.goto(`/albums/${albumId}`);
213213
await timelineUtils.waitForTimelineLoad(page);
214214
},
215+
async openArchivePage(page: Page) {
216+
await page.goto(`/archive`);
217+
await timelineUtils.waitForTimelineLoad(page);
218+
},
215219
async deepLinkAlbumPage(page: Page, albumId: string, assetId: string) {
216220
await page.goto(`/albums/${albumId}?at=${assetId}`);
217221
await timelineUtils.waitForTimelineLoad(page);

e2e/src/web/specs/user-admin.e2e-spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ test.describe('User Administration', () => {
5454

5555
await page.getByRole('button', { name: 'Edit' }).click();
5656
await expect(page.getByLabel('Admin User')).not.toBeChecked();
57-
await page.getByText('Admin User').click();
57+
await page.getByLabel('Admin User').click();
5858
await expect(page.getByLabel('Admin User')).toBeChecked();
5959
await page.getByRole('button', { name: 'Confirm' }).click();
6060

@@ -83,7 +83,7 @@ test.describe('User Administration', () => {
8383

8484
await page.getByRole('button', { name: 'Edit' }).click();
8585
await expect(page.getByLabel('Admin User')).toBeChecked();
86-
await page.getByText('Admin User').click();
86+
await page.getByLabel('Admin User').click();
8787
await expect(page.getByLabel('Admin User')).not.toBeChecked();
8888
await page.getByRole('button', { name: 'Confirm' }).click();
8989

i18n/en.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
{
2+
"workflow_update_success": "Workflow updated successfully",
3+
"trigger_description": "An event that kick off the workflow",
4+
"action_description": "A set of action to perform on the filtered assets",
5+
"filter_description": "Conditions to filter the target assets",
6+
"workflow_summary": "Workflow summary",
7+
"workflow_description": "Workflow description",
8+
"workflow_name": "Workflow name",
29
"about": "About",
310
"account": "Account",
411
"account_settings": "Account Settings",
@@ -12,6 +19,8 @@
1219
"add": "Add",
1320
"add_a_description": "Add a description",
1421
"add_a_location": "Add a location",
22+
"add_filter_description": "Click to add a filter condition",
23+
"add_action_description": "Click to add an action to perform",
1524
"add_a_name": "Add a name",
1625
"add_a_title": "Add a title",
1726
"add_action": "Add action",
@@ -2242,7 +2251,7 @@
22422251
"welcome": "Welcome",
22432252
"welcome_to_immich": "Welcome to Immich",
22442253
"wifi_name": "Wi-Fi Name",
2245-
"workflow": "Workflow",
2254+
"workflows": "Workflows",
22462255
"workflow_delete_prompt": "Are you sure you want to delete this workflow?",
22472256
"workflow_deleted": "Workflow deleted",
22482257
"workflow_json": "Workflow JSON",

machine-learning/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ FROM builder-cpu AS builder-rknn
2525
FROM rocm/dev-ubuntu-22.04:6.4.3-complete@sha256:1f7e92ca7e3a3785680473329ed1091fc99db3e90fcb3a1688f2933e870ed76b AS builder-rocm
2626

2727
# renovate: datasource=github-releases depName=Microsoft/onnxruntime
28-
ARG ONNXRUNTIME_VERSION="v1.20.1"
28+
ARG ONNXRUNTIME_VERSION="v1.22.1"
2929
WORKDIR /code
3030

3131
RUN apt-get update && apt-get install -y --no-install-recommends wget git python3.10-venv
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
2-
index d90a2a355..bb1a7de12 100644
2+
index 2714e6f59..a69da76b4 100644
33
--- a/cmake/CMakeLists.txt
44
+++ b/cmake/CMakeLists.txt
5-
@@ -295,7 +295,7 @@ if (onnxruntime_USE_ROCM)
5+
@@ -338,7 +338,7 @@ if (onnxruntime_USE_ROCM)
6+
if (ROCM_VERSION_DEV VERSION_LESS "6.2")
7+
message(FATAL_ERROR "CMAKE_HIP_ARCHITECTURES is not set when ROCm version < 6.2")
8+
else()
9+
- set(CMAKE_HIP_ARCHITECTURES "gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx940;gfx941;gfx942;gfx1200;gfx1201")
10+
+ set(CMAKE_HIP_ARCHITECTURES "gfx900;gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx1102;gfx940;gfx941;gfx942;gfx1200;gfx1201")
11+
endif()
612
endif()
7-
8-
if (NOT CMAKE_HIP_ARCHITECTURES)
9-
- set(CMAKE_HIP_ARCHITECTURES "gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx940;gfx941;gfx942;gfx1200;gfx1201")
10-
+ set(CMAKE_HIP_ARCHITECTURES "gfx900;gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx1102;gfx940;gfx941;gfx942;gfx1200;gfx1201")
11-
endif()
12-
13-
file(GLOB rocm_cmake_components ${onnxruntime_ROCM_HOME}/lib/cmake/*)
13+

mise.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ experimental_monorepo_root = true
33
[tools]
44
node = "24.11.1"
55
flutter = "3.35.7"
6-
pnpm = "10.20.0"
6+
pnpm = "10.22.0"
77
terragrunt = "0.91.2"
88
opentofu = "1.10.6"
99
java = "25.0.1"

mobile/openapi/lib/model/plugin_trigger_response_dto.dart

Lines changed: 1 addition & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

open-api/immich-openapi-specs.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18465,10 +18465,6 @@
1846518465
"name": {
1846618466
"type": "string"
1846718467
},
18468-
"schema": {
18469-
"nullable": true,
18470-
"type": "object"
18471-
},
1847218468
"triggerType": {
1847318469
"allOf": [
1847418470
{
@@ -18481,7 +18477,6 @@
1848118477
"context",
1848218478
"description",
1848318479
"name",
18484-
"schema",
1848518480
"triggerType"
1848618481
],
1848718482
"type": "object"

open-api/typescript-sdk/src/fetch-client.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,6 @@ export type PluginTriggerResponseDto = {
970970
context: PluginContext;
971971
description: string;
972972
name: string;
973-
schema: object | null;
974973
triggerType: PluginTriggerType;
975974
};
976975
export type QueueResponseDto = {

0 commit comments

Comments
 (0)