parent
bb0872afef
commit
a16d233a0c
|
|
@ -13,10 +13,6 @@
|
||||||
"editor.wordBasedSuggestions": "off"
|
"editor.wordBasedSuggestions": "off"
|
||||||
},
|
},
|
||||||
"[javascript]": {
|
"[javascript]": {
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.organizeImports": "explicit",
|
|
||||||
"source.removeUnusedImports": "explicit"
|
|
||||||
},
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"editor.formatOnSave": true
|
"editor.formatOnSave": true
|
||||||
},
|
},
|
||||||
|
|
@ -29,18 +25,10 @@
|
||||||
"editor.formatOnSave": true
|
"editor.formatOnSave": true
|
||||||
},
|
},
|
||||||
"[svelte]": {
|
"[svelte]": {
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.organizeImports": "explicit",
|
|
||||||
"source.removeUnusedImports": "explicit"
|
|
||||||
},
|
|
||||||
"editor.defaultFormatter": "svelte.svelte-vscode",
|
"editor.defaultFormatter": "svelte.svelte-vscode",
|
||||||
"editor.formatOnSave": true
|
"editor.formatOnSave": true
|
||||||
},
|
},
|
||||||
"[typescript]": {
|
"[typescript]": {
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.organizeImports": "explicit",
|
|
||||||
"source.removeUnusedImports": "explicit"
|
|
||||||
},
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"editor.formatOnSave": true
|
"editor.formatOnSave": true
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -281,11 +281,19 @@ class ServerApi {
|
||||||
/// Get product key
|
/// Get product key
|
||||||
///
|
///
|
||||||
/// Retrieve information about whether the server currently has a product key registered.
|
/// Retrieve information about whether the server currently has a product key registered.
|
||||||
Future<void> getServerLicense() async {
|
Future<UserLicense?> getServerLicense() async {
|
||||||
final response = await getServerLicenseWithHttpInfo();
|
final response = await getServerLicenseWithHttpInfo();
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
if (response.statusCode >= HttpStatus.badRequest) {
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
||||||
}
|
}
|
||||||
|
// When a remote server returns no body with a status of 204, we shall not decode it.
|
||||||
|
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
||||||
|
// FormatException when trying to decode an empty string.
|
||||||
|
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
||||||
|
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UserLicense',) as UserLicense;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get statistics
|
/// Get statistics
|
||||||
|
|
|
||||||
|
|
@ -10298,6 +10298,16 @@
|
||||||
"operationId": "getServerLicense",
|
"operationId": "getServerLicense",
|
||||||
"parameters": [],
|
"parameters": [],
|
||||||
"responses": {
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/LicenseResponseDto"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
"404": {
|
"404": {
|
||||||
"description": ""
|
"description": ""
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5591,7 +5591,12 @@ export function deleteServerLicense(opts?: Oazapfts.RequestOpts) {
|
||||||
* Get product key
|
* Get product key
|
||||||
*/
|
*/
|
||||||
export function getServerLicense(opts?: Oazapfts.RequestOpts) {
|
export function getServerLicense(opts?: Oazapfts.RequestOpts) {
|
||||||
return oazapfts.ok(oazapfts.fetchText("/server/license", {
|
return oazapfts.ok(oazapfts.fetchJson<{
|
||||||
|
status: 200;
|
||||||
|
data: UserLicense;
|
||||||
|
} | {
|
||||||
|
status: 404;
|
||||||
|
}>("/server/license", {
|
||||||
...opts
|
...opts
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
4830
pnpm-lock.yaml
4830
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
|
@ -1,8 +1,9 @@
|
||||||
{
|
{
|
||||||
|
"importOrder": ["<THIRD_PARTY_MODULES>", "<BUILTIN_MODULES>", "^\\$(.*)$", "^@test-data(.*)$", "^[./]"],
|
||||||
|
"importOrderSeparation": false,
|
||||||
"jsonRecursiveSort": true,
|
"jsonRecursiveSort": true,
|
||||||
"organizeImportsSkipDestructiveCodeActions": true,
|
|
||||||
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }],
|
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }],
|
||||||
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-svelte", "prettier-plugin-sort-json"],
|
"plugins": ["@trivago/prettier-plugin-sort-imports", "prettier-plugin-svelte", "prettier-plugin-sort-json"],
|
||||||
"printWidth": 120,
|
"printWidth": 120,
|
||||||
"semi": true,
|
"semi": true,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@ import eslintPluginCompat from 'eslint-plugin-compat';
|
||||||
import eslintPluginSvelte from 'eslint-plugin-svelte';
|
import eslintPluginSvelte from 'eslint-plugin-svelte';
|
||||||
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
|
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
|
||||||
import globals from 'globals';
|
import globals from 'globals';
|
||||||
|
import parser from 'svelte-eslint-parser';
|
||||||
|
import typescriptEslint from 'typescript-eslint';
|
||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import { fileURLToPath } from 'node:url';
|
import { fileURLToPath } from 'node:url';
|
||||||
import parser from 'svelte-eslint-parser';
|
|
||||||
import typescriptEslint from 'typescript-eslint';
|
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = path.dirname(__filename);
|
const __dirname = path.dirname(__filename);
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,7 @@
|
||||||
"@testing-library/jest-dom": "^6.4.2",
|
"@testing-library/jest-dom": "^6.4.2",
|
||||||
"@testing-library/svelte": "^5.2.8",
|
"@testing-library/svelte": "^5.2.8",
|
||||||
"@testing-library/user-event": "^14.5.2",
|
"@testing-library/user-event": "^14.5.2",
|
||||||
|
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
||||||
"@types/chromecast-caf-sender": "^1.0.11",
|
"@types/chromecast-caf-sender": "^1.0.11",
|
||||||
"@types/dom-to-image": "^2.6.7",
|
"@types/dom-to-image": "^2.6.7",
|
||||||
"@types/justified-layout": "^4.1.4",
|
"@types/justified-layout": "^4.1.4",
|
||||||
|
|
@ -97,7 +98,6 @@
|
||||||
"globals": "^17.0.0",
|
"globals": "^17.0.0",
|
||||||
"happy-dom": "^20.0.0",
|
"happy-dom": "^20.0.0",
|
||||||
"prettier": "^3.7.4",
|
"prettier": "^3.7.4",
|
||||||
"prettier-plugin-organize-imports": "^4.0.0",
|
|
||||||
"prettier-plugin-sort-json": "^4.1.1",
|
"prettier-plugin-sort-json": "^4.1.1",
|
||||||
"prettier-plugin-svelte": "^3.3.3",
|
"prettier-plugin-svelte": "^3.3.3",
|
||||||
"rollup-plugin-visualizer": "^7.0.0",
|
"rollup-plugin-visualizer": "^7.0.0",
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
import 'svelte-i18n';
|
||||||
|
import type en from '$i18n/en.json';
|
||||||
|
|
||||||
/// <reference types="@sveltejs/kit" />
|
/// <reference types="@sveltejs/kit" />
|
||||||
|
|
||||||
// See https://kit.svelte.dev/docs/types#app
|
// See https://kit.svelte.dev/docs/types#app
|
||||||
|
|
@ -28,9 +31,6 @@ interface Element {
|
||||||
requestFullscreen?(options?: FullscreenOptions): Promise<void>;
|
requestFullscreen?(options?: FullscreenOptions): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
import type en from '$i18n/en.json';
|
|
||||||
import 'svelte-i18n';
|
|
||||||
|
|
||||||
type NestedKeys<T, K = keyof T> = K extends keyof T & string
|
type NestedKeys<T, K = keyof T> = K extends keyof T & string
|
||||||
? `${K}` | (T[K] extends object ? `${K}.${NestedKeys<T[K]>}` : never)
|
? `${K}` | (T[K] extends object ? `${K}.${NestedKeys<T[K]>}` : never)
|
||||||
: never;
|
: never;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import type { Handle } from '@sveltejs/kit';
|
||||||
import GoogleSans from '$lib/assets/fonts/GoogleSans/GoogleSans.ttf?url';
|
import GoogleSans from '$lib/assets/fonts/GoogleSans/GoogleSans.ttf?url';
|
||||||
import GoogleSansCode from '$lib/assets/fonts/GoogleSansCode/GoogleSansCode.ttf?url';
|
import GoogleSansCode from '$lib/assets/fonts/GoogleSansCode/GoogleSansCode.ttf?url';
|
||||||
import type { Handle } from '@sveltejs/kit';
|
|
||||||
|
|
||||||
// only used during the build to replace the variables from app.html
|
// only used during the build to replace the variables from app.html
|
||||||
export const handle = (async ({ event, resolve }) => {
|
export const handle = (async ({ event, resolve }) => {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import FocusTrapTest from '$lib/actions/__test__/FocusTrapTest.svelte';
|
|
||||||
import { setDefaultTabbleOptions } from '$lib/utils/focus-util';
|
|
||||||
import { render, screen } from '@testing-library/svelte';
|
import { render, screen } from '@testing-library/svelte';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
|
import FocusTrapTest from '$lib/actions/__test__/FocusTrapTest.svelte';
|
||||||
|
import { setDefaultTabbleOptions } from '$lib/utils/focus-util';
|
||||||
|
|
||||||
setDefaultTabbleOptions({ displayCheck: 'none' });
|
setDefaultTabbleOptions({ displayCheck: 'none' });
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { matchesShortcut } from '$lib/actions/shortcut';
|
|
||||||
import type { ActionReturn } from 'svelte/action';
|
import type { ActionReturn } from 'svelte/action';
|
||||||
|
import { matchesShortcut } from '$lib/actions/shortcut';
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
onOutclick?: () => void;
|
onOutclick?: () => void;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { shortcuts } from '$lib/actions/shortcut';
|
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
import type { Action } from 'svelte/action';
|
import type { Action } from 'svelte/action';
|
||||||
|
import { shortcuts } from '$lib/actions/shortcut';
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { getTabbable } from '$lib/utils/focus-util';
|
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
|
import { getTabbable } from '$lib/utils/focus-util';
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { shortcuts } from '$lib/actions/shortcut';
|
|
||||||
import type { Action } from 'svelte/action';
|
import type { Action } from 'svelte/action';
|
||||||
|
import { shortcuts } from '$lib/actions/shortcut';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables keyboard navigation (up and down arrows) for a list of elements.
|
* Enables keyboard navigation (up and down arrows) for a list of elements.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
|
|
||||||
import { createZoomImageWheel } from '@zoom-image/core';
|
import { createZoomImageWheel } from '@zoom-image/core';
|
||||||
|
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
|
||||||
|
|
||||||
// Minimal touch shape — avoids importing DOM TouchEvent which isn't available in all TS targets.
|
// Minimal touch shape — avoids importing DOM TouchEvent which isn't available in all TS targets.
|
||||||
type TouchEventLike = {
|
type TouchEventLike = {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { page } from '$app/state';
|
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { copyToClipboard } from '$lib/utils';
|
|
||||||
import { defaultProvider, screencastManager, themeManager, ThemePreference, type ActionItem } from '@immich/ui';
|
import { defaultProvider, screencastManager, themeManager, ThemePreference, type ActionItem } from '@immich/ui';
|
||||||
import {
|
import {
|
||||||
mdiAccountMultipleOutline,
|
mdiAccountMultipleOutline,
|
||||||
|
|
@ -14,6 +9,11 @@ import {
|
||||||
mdiThemeLightDark,
|
mdiThemeLightDark,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { page } from '$app/state';
|
||||||
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { copyToClipboard } from '$lib/utils';
|
||||||
|
|
||||||
export const getPagesProvider = ($t: MessageFormatter) => {
|
export const getPagesProvider = ($t: MessageFormatter) => {
|
||||||
const adminPages: ActionItem[] = [
|
const adminPages: ActionItem[] = [
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { fireEvent, render } from '@testing-library/svelte';
|
||||||
import Image from '$lib/components/Image.svelte';
|
import Image from '$lib/components/Image.svelte';
|
||||||
import { cancelImageUrl } from '$lib/utils/sw-messaging';
|
import { cancelImageUrl } from '$lib/utils/sw-messaging';
|
||||||
import { fireEvent, render } from '@testing-library/svelte';
|
|
||||||
|
|
||||||
vi.mock('$lib/utils/sw-messaging', () => ({
|
vi.mock('$lib/utils/sw-messaging', () => ({
|
||||||
cancelImageUrl: vi.fn(),
|
cancelImageUrl: vi.fn(),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
import SharedLinkFormFields from './SharedLinkFormFields.svelte';
|
import SharedLinkFormFields from './SharedLinkFormFields.svelte';
|
||||||
|
|
||||||
describe('SharedLinkFormFields component', () => {
|
describe('SharedLinkFormFields component', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
|
||||||
import { albumFactory } from '@test-data/factories/album-factory';
|
|
||||||
import '@testing-library/jest-dom';
|
import '@testing-library/jest-dom';
|
||||||
import { render, waitFor, type RenderResult } from '@testing-library/svelte';
|
import { render, waitFor, type RenderResult } from '@testing-library/svelte';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
import { init, register, waitLocale } from 'svelte-i18n';
|
import { init, register, waitLocale } from 'svelte-i18n';
|
||||||
|
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
||||||
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
|
import { albumFactory } from '@test-data/factories/album-factory';
|
||||||
import AlbumCard from '../AlbumCard.svelte';
|
import AlbumCard from '../AlbumCard.svelte';
|
||||||
|
|
||||||
const onShowContextMenu = vi.fn();
|
const onShowContextMenu = vi.fn();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { render } from '@testing-library/svelte';
|
||||||
import AlbumCover from '$lib/components/album-page/AlbumCover.svelte';
|
import AlbumCover from '$lib/components/album-page/AlbumCover.svelte';
|
||||||
import { getAssetMediaUrl } from '$lib/utils';
|
import { getAssetMediaUrl } from '$lib/utils';
|
||||||
import { albumFactory } from '@test-data/factories/album-factory';
|
import { albumFactory } from '@test-data/factories/album-factory';
|
||||||
import { render } from '@testing-library/svelte';
|
|
||||||
|
|
||||||
vi.mock('$lib/utils');
|
vi.mock('$lib/utils');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
|
import { updateAsset } from '@immich/sdk';
|
||||||
|
import { fireEvent, waitFor } from '@testing-library/svelte';
|
||||||
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
||||||
import { getResizeObserverMock } from '$lib/__mocks__/resize-observer.mock';
|
import { getResizeObserverMock } from '$lib/__mocks__/resize-observer.mock';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { SlideshowState, slideshowStore } from '$lib/stores/slideshow.store';
|
import { SlideshowState, slideshowStore } from '$lib/stores/slideshow.store';
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
import { updateAsset } from '@immich/sdk';
|
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
||||||
import { userAdminFactory } from '@test-data/factories/user-factory';
|
import { userAdminFactory } from '@test-data/factories/user-factory';
|
||||||
import { fireEvent, waitFor } from '@testing-library/svelte';
|
|
||||||
import AssetViewer from './AssetViewer.svelte';
|
import AssetViewer from './AssetViewer.svelte';
|
||||||
|
|
||||||
vi.mock('$lib/managers/feature-flags-manager.svelte', () => ({
|
vi.mock('$lib/managers/feature-flags-manager.svelte', () => ({
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
|
import '@testing-library/jest-dom';
|
||||||
import { getResizeObserverMock } from '$lib/__mocks__/resize-observer.mock';
|
import { getResizeObserverMock } from '$lib/__mocks__/resize-observer.mock';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
||||||
import { userAdminFactory } from '@test-data/factories/user-factory';
|
import { userAdminFactory } from '@test-data/factories/user-factory';
|
||||||
import '@testing-library/jest-dom';
|
|
||||||
import AssetViewerNavBar from './AssetViewerNavBar.svelte';
|
import AssetViewerNavBar from './AssetViewerNavBar.svelte';
|
||||||
|
|
||||||
describe('AssetViewerNavBar component', () => {
|
describe('AssetViewerNavBar component', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
|
||||||
import '@testing-library/jest-dom';
|
import '@testing-library/jest-dom';
|
||||||
import { render, screen } from '@testing-library/svelte';
|
import { render, screen } from '@testing-library/svelte';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import DetailPanelDescription from './DetailPanelDescription.svelte';
|
import DetailPanelDescription from './DetailPanelDescription.svelte';
|
||||||
|
|
||||||
describe('DetailPanelDescription', () => {
|
describe('DetailPanelDescription', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
import type { AssetResponseDto, SharedLinkResponseDto } from '@immich/sdk';
|
||||||
import { loadImage } from '$lib/actions/image-loader.svelte';
|
import { loadImage } from '$lib/actions/image-loader.svelte';
|
||||||
import { getAssetUrls } from '$lib/utils';
|
import { getAssetUrls } from '$lib/utils';
|
||||||
import { AdaptiveImageLoader, type QualityList } from '$lib/utils/adaptive-image-loader.svelte';
|
import { AdaptiveImageLoader, type QualityList } from '$lib/utils/adaptive-image-loader.svelte';
|
||||||
import type { AssetResponseDto, SharedLinkResponseDto } from '@immich/sdk';
|
|
||||||
|
|
||||||
type AssetCursor = {
|
type AssetCursor = {
|
||||||
current: AssetResponseDto;
|
current: AssetResponseDto;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
|
||||||
import type { AssetResponseDto } from '@immich/sdk';
|
import type { AssetResponseDto } from '@immich/sdk';
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
|
||||||
import '@testing-library/jest-dom';
|
import '@testing-library/jest-dom';
|
||||||
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import DeleteAction from './DeleteAction.svelte';
|
import DeleteAction from './DeleteAction.svelte';
|
||||||
|
|
||||||
let asset: AssetResponseDto;
|
let asset: AssetResponseDto;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import type { AssetResponseDto, PersonResponseDto, StackResponseDto } from '@immich/sdk';
|
||||||
import type { AssetAction } from '$lib/constants';
|
import type { AssetAction } from '$lib/constants';
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import type { AssetResponseDto, PersonResponseDto, StackResponseDto } from '@immich/sdk';
|
|
||||||
|
|
||||||
type ActionMap = {
|
type ActionMap = {
|
||||||
[AssetAction.ARCHIVE]: { asset: TimelineAsset };
|
[AssetAction.ARCHIVE]: { asset: TimelineAsset };
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import ImageThumbnail from '$lib/components/assets/thumbnail/ImageThumbnail.svelte';
|
|
||||||
import { fireEvent, render } from '@testing-library/svelte';
|
import { fireEvent, render } from '@testing-library/svelte';
|
||||||
|
import ImageThumbnail from '$lib/components/assets/thumbnail/ImageThumbnail.svelte';
|
||||||
|
|
||||||
vi.mock('$lib/utils/sw-messaging', () => ({
|
vi.mock('$lib/utils/sw-messaging', () => ({
|
||||||
cancelImageUrl: vi.fn(),
|
cancelImageUrl: vi.fn(),
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { render } from '@testing-library/svelte';
|
||||||
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
||||||
import Thumbnail from '$lib/components/assets/thumbnail/Thumbnail.svelte';
|
import Thumbnail from '$lib/components/assets/thumbnail/Thumbnail.svelte';
|
||||||
import { getTabbable } from '$lib/utils/focus-util';
|
import { getTabbable } from '$lib/utils/focus-util';
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import { render } from '@testing-library/svelte';
|
|
||||||
|
|
||||||
vi.hoisted(() => {
|
vi.hoisted(() => {
|
||||||
Object.defineProperty(globalThis, 'matchMedia', {
|
Object.defineProperty(globalThis, 'matchMedia', {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { locale } from '$lib/stores/preferences.store';
|
|
||||||
import { renderWithTooltips } from '$tests/helpers';
|
|
||||||
import { screen } from '@testing-library/svelte';
|
import { screen } from '@testing-library/svelte';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
import { locale } from '$lib/stores/preferences.store';
|
||||||
|
import { renderWithTooltips } from '$tests/helpers';
|
||||||
import MaintenanceBackupEntry from './MaintenanceBackupEntry.svelte';
|
import MaintenanceBackupEntry from './MaintenanceBackupEntry.svelte';
|
||||||
|
|
||||||
vi.mock('$lib/services/database-backups.service', () => ({
|
vi.mock('$lib/services/database-backups.service', () => ({
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import NumberRangeInput from '$lib/components/shared-components/NumberRangeInput.svelte';
|
|
||||||
import { render, type RenderResult } from '@testing-library/svelte';
|
import { render, type RenderResult } from '@testing-library/svelte';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
import type { Mock } from 'vitest';
|
import type { Mock } from 'vitest';
|
||||||
|
import NumberRangeInput from '$lib/components/shared-components/NumberRangeInput.svelte';
|
||||||
|
|
||||||
describe('NumberRangeInput component', () => {
|
describe('NumberRangeInput component', () => {
|
||||||
const user = userEvent.setup();
|
const user = userEvent.setup();
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
|
import type { AlbumResponseDto } from '@immich/sdk';
|
||||||
import {
|
import {
|
||||||
type AlbumModalRow,
|
type AlbumModalRow,
|
||||||
AlbumModalRowConverter,
|
AlbumModalRowConverter,
|
||||||
AlbumModalRowType,
|
AlbumModalRowType,
|
||||||
} from '$lib/components/shared-components/album-selection/album-selection-utils';
|
} from '$lib/components/shared-components/album-selection/album-selection-utils';
|
||||||
import { AlbumSortBy, SortOrder } from '$lib/stores/preferences.store';
|
import { AlbumSortBy, SortOrder } from '$lib/stores/preferences.store';
|
||||||
import type { AlbumResponseDto } from '@immich/sdk';
|
|
||||||
import { albumFactory } from '@test-data/factories/album-factory';
|
import { albumFactory } from '@test-data/factories/album-factory';
|
||||||
|
|
||||||
// Some helper functions to make tests below more readable
|
// Some helper functions to make tests below more readable
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { sortAlbums } from '$lib/utils/album-utils';
|
|
||||||
import { normalizeSearchString } from '$lib/utils/string-utils';
|
|
||||||
import type { AlbumResponseDto } from '@immich/sdk';
|
import type { AlbumResponseDto } from '@immich/sdk';
|
||||||
import { t } from 'svelte-i18n';
|
import { t } from 'svelte-i18n';
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
import { sortAlbums } from '$lib/utils/album-utils';
|
||||||
|
import { normalizeSearchString } from '$lib/utils/string-utils';
|
||||||
|
|
||||||
export const SCROLL_PROPERTIES: ScrollIntoViewOptions = { block: 'center', behavior: 'smooth' };
|
export const SCROLL_PROPERTIES: ScrollIntoViewOptions = { block: 'center', behavior: 'smooth' };
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { SettingInputFieldType } from '$lib/constants';
|
|
||||||
import { render } from '@testing-library/svelte';
|
import { render } from '@testing-library/svelte';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
|
import { SettingInputFieldType } from '$lib/constants';
|
||||||
import SettingInputField from './SettingInputField.svelte';
|
import SettingInputField from './SettingInputField.svelte';
|
||||||
|
|
||||||
describe('SettingInputField component', () => {
|
describe('SettingInputField component', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { render, screen } from '@testing-library/svelte';
|
||||||
|
import { tick } from 'svelte';
|
||||||
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
||||||
import RecentAlbums from '$lib/components/shared-components/side-bar/RecentAlbums.svelte';
|
import RecentAlbums from '$lib/components/shared-components/side-bar/RecentAlbums.svelte';
|
||||||
import { albumFactory } from '@test-data/factories/album-factory';
|
import { albumFactory } from '@test-data/factories/album-factory';
|
||||||
import { render, screen } from '@testing-library/svelte';
|
|
||||||
import { tick } from 'svelte';
|
|
||||||
|
|
||||||
describe('RecentAlbums component', () => {
|
describe('RecentAlbums component', () => {
|
||||||
it('sorts albums by most recently updated', async () => {
|
it('sorts albums by most recently updated', async () => {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import AssetCover from '$lib/components/sharedlinks-page/covers/AssetCover.svelte';
|
|
||||||
import { render } from '@testing-library/svelte';
|
import { render } from '@testing-library/svelte';
|
||||||
|
import AssetCover from '$lib/components/sharedlinks-page/covers/AssetCover.svelte';
|
||||||
|
|
||||||
describe('AssetCover component', () => {
|
describe('AssetCover component', () => {
|
||||||
it('renders correctly', () => {
|
it('renders correctly', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import NoCover from '$lib/components/sharedlinks-page/covers/NoCover.svelte';
|
|
||||||
import { render } from '@testing-library/svelte';
|
import { render } from '@testing-library/svelte';
|
||||||
|
import NoCover from '$lib/components/sharedlinks-page/covers/NoCover.svelte';
|
||||||
|
|
||||||
describe('NoCover component', () => {
|
describe('NoCover component', () => {
|
||||||
it('renders correctly', () => {
|
it('renders correctly', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import SideBarSection from '$lib/components/sidebar/Sidebar.svelte';
|
|
||||||
import { sidebarStore } from '$lib/stores/sidebar.svelte';
|
|
||||||
import { render, screen } from '@testing-library/svelte';
|
import { render, screen } from '@testing-library/svelte';
|
||||||
import { vi } from 'vitest';
|
import { vi } from 'vitest';
|
||||||
|
import SideBarSection from '$lib/components/sidebar/Sidebar.svelte';
|
||||||
|
import { sidebarStore } from '$lib/stores/sidebar.svelte';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { tick } from 'svelte';
|
||||||
import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
|
import { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { moveFocus } from '$lib/utils/focus-util';
|
import { moveFocus } from '$lib/utils/focus-util';
|
||||||
import { InvocationTracker } from '$lib/utils/invocationTracker';
|
import { InvocationTracker } from '$lib/utils/invocationTracker';
|
||||||
import { tick } from 'svelte';
|
|
||||||
|
|
||||||
const tracker = new InvocationTracker();
|
const tracker = new InvocationTracker();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,16 +30,16 @@ export enum ProjectionType {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const dateFormats = {
|
export const dateFormats = {
|
||||||
album: <Intl.DateTimeFormatOptions>{
|
album: {
|
||||||
month: 'short',
|
month: 'short',
|
||||||
day: 'numeric',
|
day: 'numeric',
|
||||||
year: 'numeric',
|
year: 'numeric',
|
||||||
},
|
} satisfies Intl.DateTimeFormatOptions,
|
||||||
settings: <Intl.DateTimeFormatOptions>{
|
settings: {
|
||||||
month: 'short',
|
month: 'short',
|
||||||
day: 'numeric',
|
day: 'numeric',
|
||||||
year: 'numeric',
|
year: 'numeric',
|
||||||
},
|
} satisfies Intl.DateTimeFormatOptions,
|
||||||
};
|
};
|
||||||
|
|
||||||
export enum QueryParameter {
|
export enum QueryParameter {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import FormatTagB from '$lib/elements/__test__/FormatTagB.svelte';
|
|
||||||
import FormatMessage from '$lib/elements/FormatMessage.svelte';
|
|
||||||
import '@testing-library/jest-dom';
|
import '@testing-library/jest-dom';
|
||||||
import { render, screen } from '@testing-library/svelte';
|
import { render, screen } from '@testing-library/svelte';
|
||||||
import { init, locale, register, waitLocale, type Translations } from 'svelte-i18n';
|
import { init, locale, register, waitLocale, type Translations } from 'svelte-i18n';
|
||||||
import { describe } from 'vitest';
|
import { describe } from 'vitest';
|
||||||
|
import FormatMessage from '$lib/elements/FormatMessage.svelte';
|
||||||
|
import FormatTagB from '$lib/elements/__test__/FormatTagB.svelte';
|
||||||
|
|
||||||
const getSanitizedHTML = (container: HTMLElement) => container.innerHTML.replaceAll('<!---->', '');
|
const getSanitizedHTML = (container: HTMLElement) => container.innerHTML.replaceAll('<!---->', '');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import StarRating from '$lib/elements/StarRating.svelte';
|
|
||||||
import { render } from '@testing-library/svelte';
|
import { render } from '@testing-library/svelte';
|
||||||
|
import StarRating from '$lib/elements/StarRating.svelte';
|
||||||
|
|
||||||
describe('StarRating component', () => {
|
describe('StarRating component', () => {
|
||||||
it('renders correctly', () => {
|
it('renders correctly', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
import type { FormatXMLElementFn, PrimitiveType } from 'intl-messageformat';
|
import type { FormatXMLElementFn, PrimitiveType } from 'intl-messageformat';
|
||||||
|
|
||||||
export type InterpolationValues = Record<string, PrimitiveType | FormatXMLElementFn<unknown>>;
|
export type InterpolationValues = Record<string, PrimitiveType | FormatXMLElementFn<unknown>>;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { getClosestAvailableLocale, langs } from '$lib/utils/i18n';
|
|
||||||
import { readFileSync, readdirSync } from 'node:fs';
|
import { readFileSync, readdirSync } from 'node:fs';
|
||||||
|
import { getClosestAvailableLocale, langs } from '$lib/utils/i18n';
|
||||||
|
|
||||||
describe('i18n', () => {
|
describe('i18n', () => {
|
||||||
describe('loaders', () => {
|
describe('loaders', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { getAssetInfo, getAssetOcr } from '@immich/sdk';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import { getAssetInfo, getAssetOcr } from '@immich/sdk';
|
|
||||||
|
|
||||||
const defaultSerializer = <K>(params: K) => JSON.stringify(params);
|
const defaultSerializer = <K>(params: K) => JSON.stringify(params);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
|
||||||
import { handlePromiseError } from '$lib/utils';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import {
|
import {
|
||||||
createActivity,
|
createActivity,
|
||||||
deleteActivity,
|
deleteActivity,
|
||||||
|
|
@ -13,6 +10,9 @@ import {
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
import { t } from 'svelte-i18n';
|
import { t } from 'svelte-i18n';
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { handlePromiseError } from '$lib/utils';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
|
||||||
type CacheKey = string;
|
type CacheKey = string;
|
||||||
type ActivityCache = {
|
type ActivityCache = {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { AssetVisibility } from '@immich/sdk';
|
||||||
import { AssetMultiSelectManager } from '$lib/managers/asset-multi-select-manager.svelte';
|
import { AssetMultiSelectManager } from '$lib/managers/asset-multi-select-manager.svelte';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { AssetVisibility } from '@immich/sdk';
|
|
||||||
import { timelineAssetFactory } from '@test-data/factories/asset-factory';
|
import { timelineAssetFactory } from '@test-data/factories/asset-factory';
|
||||||
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
||||||
import { userAdminFactory } from '@test-data/factories/user-factory';
|
import { userAdminFactory } from '@test-data/factories/user-factory';
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
|
import { AssetVisibility } from '@immich/sdk';
|
||||||
|
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { AssetVisibility } from '@immich/sdk';
|
|
||||||
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
||||||
|
|
||||||
export type AssetMultiSelectOptions = {
|
export type AssetMultiSelectOptions = {
|
||||||
resetOnNavigate?: boolean;
|
resetOnNavigate?: boolean;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
|
import { getAssetInfo, type AssetResponseDto } from '@immich/sdk';
|
||||||
|
import type { ZoomImageWheelState } from '@zoom-image/core';
|
||||||
|
import { cubicOut } from 'svelte/easing';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import type { ImageLoaderStatus } from '$lib/utils/adaptive-image-loader.svelte';
|
import type { ImageLoaderStatus } from '$lib/utils/adaptive-image-loader.svelte';
|
||||||
import { canCopyImageToClipboard } from '$lib/utils/asset-utils';
|
import { canCopyImageToClipboard } from '$lib/utils/asset-utils';
|
||||||
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
|
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
|
||||||
import type { AssetGridRouteSearchParams } from '$lib/utils/navigation';
|
import type { AssetGridRouteSearchParams } from '$lib/utils/navigation';
|
||||||
import { PersistedLocalStorage } from '$lib/utils/persisted';
|
import { PersistedLocalStorage } from '$lib/utils/persisted';
|
||||||
import { getAssetInfo, type AssetResponseDto } from '@immich/sdk';
|
|
||||||
import type { ZoomImageWheelState } from '@zoom-image/core';
|
|
||||||
import { cubicOut } from 'svelte/easing';
|
|
||||||
|
|
||||||
const isShowDetailPanel = new PersistedLocalStorage<boolean>('asset-viewer-state', false);
|
const isShowDetailPanel = new PersistedLocalStorage<boolean>('asset-viewer-state', false);
|
||||||
const isShowAssetPath = new PersistedLocalStorage<boolean>('asset-viewer-show-path', false);
|
const isShowAssetPath = new PersistedLocalStorage<boolean>('asset-viewer-show-path', false);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,3 @@
|
||||||
import { browser } from '$app/environment';
|
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { page } from '$app/state';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { isSharedLinkRoute } from '$lib/utils/navigation';
|
|
||||||
import {
|
import {
|
||||||
getAboutInfo,
|
getAboutInfo,
|
||||||
getMyPreferences,
|
getMyPreferences,
|
||||||
|
|
@ -12,6 +6,12 @@ import {
|
||||||
type UserAdminResponseDto,
|
type UserAdminResponseDto,
|
||||||
type UserPreferencesResponseDto,
|
type UserPreferencesResponseDto,
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
|
import { browser } from '$app/environment';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { page } from '$app/state';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { isSharedLinkRoute } from '$lib/utils/navigation';
|
||||||
|
|
||||||
class AuthManager {
|
class AuthManager {
|
||||||
isPurchased = $state(false);
|
isPurchased = $state(false);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { GCastDestination } from '$lib/utils/cast/gcast-destination.svelte';
|
|
||||||
import { createSession, type SessionCreateResponseDto } from '@immich/sdk';
|
import { createSession, type SessionCreateResponseDto } from '@immich/sdk';
|
||||||
import { DateTime, Duration } from 'luxon';
|
import { DateTime, Duration } from 'luxon';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { GCastDestination } from '$lib/utils/cast/gcast-destination.svelte';
|
||||||
|
|
||||||
// follows chrome.cast.media.PlayerState
|
// follows chrome.cast.media.PlayerState
|
||||||
export enum CastState {
|
export enum CastState {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
|
import { editAsset, removeAssetEdits, type AssetEditsCreateDto, type AssetResponseDto } from '@immich/sdk';
|
||||||
|
import { ConfirmModal, modalManager, toastManager } from '@immich/ui';
|
||||||
|
import { mdiCropRotate } from '@mdi/js';
|
||||||
|
import type { Component } from 'svelte';
|
||||||
import TransformTool from '$lib/components/asset-viewer/editor/transform-tool/TransformTool.svelte';
|
import TransformTool from '$lib/components/asset-viewer/editor/transform-tool/TransformTool.svelte';
|
||||||
import { transformManager } from '$lib/managers/edit/transform-manager.svelte';
|
import { transformManager } from '$lib/managers/edit/transform-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import { waitForWebsocketEvent } from '$lib/stores/websocket';
|
import { waitForWebsocketEvent } from '$lib/stores/websocket';
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
import { editAsset, removeAssetEdits, type AssetEditsCreateDto, type AssetResponseDto } from '@immich/sdk';
|
|
||||||
import { ConfirmModal, modalManager, toastManager } from '@immich/ui';
|
|
||||||
import { mdiCropRotate } from '@mdi/js';
|
|
||||||
import type { Component } from 'svelte';
|
|
||||||
|
|
||||||
export type EditAction = AssetEditsCreateDto['edits'][number];
|
export type EditAction = AssetEditsCreateDto['edits'][number];
|
||||||
export type EditActions = EditAction[];
|
export type EditActions = EditAction[];
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
|
import { AssetEditAction, AssetMediaSize, MirrorAxis, type AssetResponseDto, type CropParameters } from '@immich/sdk';
|
||||||
|
import { clamp } from 'lodash-es';
|
||||||
|
import { tick } from 'svelte';
|
||||||
import { type EditActions, type EditToolManager } from '$lib/managers/edit/edit-manager.svelte';
|
import { type EditActions, type EditToolManager } from '$lib/managers/edit/edit-manager.svelte';
|
||||||
import { getAssetMediaUrl } from '$lib/utils';
|
import { getAssetMediaUrl } from '$lib/utils';
|
||||||
import { getDimensions } from '$lib/utils/asset-utils';
|
import { getDimensions } from '$lib/utils/asset-utils';
|
||||||
import { normalizeTransformEdits } from '$lib/utils/editor';
|
import { normalizeTransformEdits } from '$lib/utils/editor';
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
import { AssetEditAction, AssetMediaSize, MirrorAxis, type AssetResponseDto, type CropParameters } from '@immich/sdk';
|
|
||||||
import { clamp } from 'lodash-es';
|
|
||||||
import { tick } from 'svelte';
|
|
||||||
|
|
||||||
export type CropAspectRatio =
|
export type CropAspectRatio =
|
||||||
| '1:1'
|
| '1:1'
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
import type { ReleaseEvent } from '$lib/types';
|
|
||||||
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
|
|
||||||
import type { TreeNode } from '$lib/utils/tree-utils';
|
|
||||||
import type {
|
import type {
|
||||||
AlbumResponseDto,
|
AlbumResponseDto,
|
||||||
AlbumUserRole,
|
AlbumUserRole,
|
||||||
|
|
@ -16,6 +13,9 @@ import type {
|
||||||
UserAdminResponseDto,
|
UserAdminResponseDto,
|
||||||
WorkflowResponseDto,
|
WorkflowResponseDto,
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
|
import type { ReleaseEvent } from '$lib/types';
|
||||||
|
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
|
||||||
|
import type { TreeNode } from '$lib/utils/tree-utils';
|
||||||
|
|
||||||
export type Events = {
|
export type Events = {
|
||||||
AppInit: [];
|
AppInit: [];
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { getServerFeatures, type ServerFeaturesDto } from '@immich/sdk';
|
import { getServerFeatures, type ServerFeaturesDto } from '@immich/sdk';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
|
||||||
class FeatureFlagsManager {
|
class FeatureFlagsManager {
|
||||||
#value?: ServerFeaturesDto = $state();
|
#value?: ServerFeaturesDto = $state();
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
|
import { deleteMemory, type MemoryResponseDto, removeMemoryAssets, searchMemories, updateMemory } from '@immich/sdk';
|
||||||
|
import { DateTime } from 'luxon';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { asLocalTimeISO } from '$lib/utils/date-time';
|
import { asLocalTimeISO } from '$lib/utils/date-time';
|
||||||
import { toTimelineAsset } from '$lib/utils/timeline-util';
|
import { toTimelineAsset } from '$lib/utils/timeline-util';
|
||||||
import { deleteMemory, type MemoryResponseDto, removeMemoryAssets, searchMemories, updateMemory } from '@immich/sdk';
|
|
||||||
import { DateTime } from 'luxon';
|
|
||||||
|
|
||||||
type MemoryIndex = {
|
type MemoryIndex = {
|
||||||
memoryIndex: number;
|
memoryIndex: number;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import type { QueueSnapshot } from '$lib/types';
|
|
||||||
import { getQueues, type QueueResponseDto } from '@immich/sdk';
|
import { getQueues, type QueueResponseDto } from '@immich/sdk';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import type { QueueSnapshot } from '$lib/types';
|
||||||
|
|
||||||
export class QueueManager {
|
export class QueueManager {
|
||||||
#snapshots = $state<QueueSnapshot[]>([]);
|
#snapshots = $state<QueueSnapshot[]>([]);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { getServerConfig, type ServerConfigDto } from '@immich/sdk';
|
import { getServerConfig, type ServerConfigDto } from '@immich/sdk';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
|
||||||
class ServerConfigManager {
|
class ServerConfigManager {
|
||||||
#value?: ServerConfigDto = $state();
|
#value?: ServerConfigDto = $state();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { getConfig, getConfigDefaults, type SystemConfigDto } from '@immich/sdk';
|
import { getConfig, getConfigDefaults, type SystemConfigDto } from '@immich/sdk';
|
||||||
import { cloneDeep } from 'lodash-es';
|
import { cloneDeep } from 'lodash-es';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
|
||||||
class SystemConfigManager {
|
class SystemConfigManager {
|
||||||
#value?: SystemConfigDto = $state();
|
#value?: SystemConfigDto = $state();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { setDifference, type TimelineDate } from '$lib/utils/timeline-util';
|
|
||||||
import { AssetOrder } from '@immich/sdk';
|
import { AssetOrder } from '@immich/sdk';
|
||||||
|
import { setDifference, type TimelineDate } from '$lib/utils/timeline-util';
|
||||||
import type { TimelineDay } from './timeline-day.svelte';
|
import type { TimelineDay } from './timeline-day.svelte';
|
||||||
import type { TimelineMonth } from './timeline-month.svelte';
|
import type { TimelineMonth } from './timeline-month.svelte';
|
||||||
import type { TimelineAsset } from './types';
|
import type { TimelineAsset } from './types';
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { getTimeBucket } from '@immich/sdk';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { toISOYearMonthUTC } from '$lib/utils/timeline-util';
|
import { toISOYearMonthUTC } from '$lib/utils/timeline-util';
|
||||||
import { getTimeBucket } from '@immich/sdk';
|
|
||||||
import { TimelineManager } from '../timeline-manager.svelte';
|
import { TimelineManager } from '../timeline-manager.svelte';
|
||||||
import type { TimelineMonth } from '../timeline-month.svelte';
|
import type { TimelineMonth } from '../timeline-month.svelte';
|
||||||
import type { TimelineManagerOptions } from '../types';
|
import type { TimelineManagerOptions } from '../types';
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { plainDateTimeCompare, type TimelineYearMonth } from '$lib/utils/timeline-util';
|
|
||||||
import { AssetOrder, type AssetResponseDto } from '@immich/sdk';
|
import { AssetOrder, type AssetResponseDto } from '@immich/sdk';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
import { plainDateTimeCompare, type TimelineYearMonth } from '$lib/utils/timeline-util';
|
||||||
import { TimelineManager } from '../timeline-manager.svelte';
|
import { TimelineManager } from '../timeline-manager.svelte';
|
||||||
import type { TimelineMonth } from '../timeline-month.svelte';
|
import type { TimelineMonth } from '../timeline-month.svelte';
|
||||||
import type { AssetDescriptor, Direction, TimelineAsset } from '../types';
|
import type { AssetDescriptor, Direction, TimelineAsset } from '../types';
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
|
import { throttle } from 'lodash-es';
|
||||||
|
import type { Unsubscriber } from 'svelte/store';
|
||||||
import type { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
|
import type { TimelineManager } from '$lib/managers/timeline-manager/timeline-manager.svelte';
|
||||||
import type { PendingChange, TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { PendingChange, TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { websocketEvents } from '$lib/stores/websocket';
|
import { websocketEvents } from '$lib/stores/websocket';
|
||||||
import { toTimelineAsset } from '$lib/utils/timeline-util';
|
import { toTimelineAsset } from '$lib/utils/timeline-util';
|
||||||
import { throttle } from 'lodash-es';
|
|
||||||
import type { Unsubscriber } from 'svelte/store';
|
|
||||||
|
|
||||||
export class WebsocketSupport {
|
export class WebsocketSupport {
|
||||||
#pendingChanges: PendingChange[] = [];
|
#pendingChanges: PendingChange[] = [];
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
import { AssetOrder } from '@immich/sdk';
|
import { AssetOrder } from '@immich/sdk';
|
||||||
|
import { SvelteSet } from 'svelte/reactivity';
|
||||||
import type { CommonLayoutOptions } from '$lib/utils/layout-utils';
|
import type { CommonLayoutOptions } from '$lib/utils/layout-utils';
|
||||||
import { getJustifiedLayoutFromAssets } from '$lib/utils/layout-utils';
|
import { getJustifiedLayoutFromAssets } from '$lib/utils/layout-utils';
|
||||||
import { plainDateTimeCompare } from '$lib/utils/timeline-util';
|
import { plainDateTimeCompare } from '$lib/utils/timeline-util';
|
||||||
|
|
||||||
import { SvelteSet } from 'svelte/reactivity';
|
|
||||||
import type { TimelineMonth } from './timeline-month.svelte';
|
import type { TimelineMonth } from './timeline-month.svelte';
|
||||||
import type { Direction, MoveAsset, TimelineAsset } from './types';
|
import type { Direction, MoveAsset, TimelineAsset } from './types';
|
||||||
import { ViewerAsset } from './viewer-asset.svelte';
|
import { ViewerAsset } from './viewer-asset.svelte';
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
|
import { AssetVisibility, type AssetResponseDto, type TimeBucketAssetResponseDto } from '@immich/sdk';
|
||||||
|
import { tick } from 'svelte';
|
||||||
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import { getTimelineMonthByDate } from '$lib/managers/timeline-manager/internal/search-support.svelte';
|
import { getTimelineMonthByDate } from '$lib/managers/timeline-manager/internal/search-support.svelte';
|
||||||
import { AbortError } from '$lib/utils';
|
import { AbortError } from '$lib/utils';
|
||||||
import { fromISODateTimeUTCToObject } from '$lib/utils/timeline-util';
|
import { fromISODateTimeUTCToObject } from '$lib/utils/timeline-util';
|
||||||
import { AssetVisibility, type AssetResponseDto, type TimeBucketAssetResponseDto } from '@immich/sdk';
|
|
||||||
import { assetFactory, timelineAssetFactory, toResponseDto } from '@test-data/factories/asset-factory';
|
import { assetFactory, timelineAssetFactory, toResponseDto } from '@test-data/factories/asset-factory';
|
||||||
import { tick } from 'svelte';
|
|
||||||
import { TimelineManager } from './timeline-manager.svelte';
|
import { TimelineManager } from './timeline-manager.svelte';
|
||||||
import type { TimelineAsset } from './types';
|
import type { TimelineAsset } from './types';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
import { AssetOrder, getAssetInfo, getTimeBuckets, type AssetResponseDto } from '@immich/sdk';
|
||||||
|
import { clamp, isEqual } from 'lodash-es';
|
||||||
|
import { SvelteDate, SvelteSet } from 'svelte/reactivity';
|
||||||
import { VirtualScrollManager } from '$lib/managers/VirtualScrollManager/VirtualScrollManager.svelte';
|
import { VirtualScrollManager } from '$lib/managers/VirtualScrollManager/VirtualScrollManager.svelte';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
|
@ -23,9 +26,6 @@ import {
|
||||||
type TimelineDateTime,
|
type TimelineDateTime,
|
||||||
type TimelineYearMonth,
|
type TimelineYearMonth,
|
||||||
} from '$lib/utils/timeline-util';
|
} from '$lib/utils/timeline-util';
|
||||||
import { AssetOrder, getAssetInfo, getTimeBuckets, type AssetResponseDto } from '@immich/sdk';
|
|
||||||
import { clamp, isEqual } from 'lodash-es';
|
|
||||||
import { SvelteDate, SvelteSet } from 'svelte/reactivity';
|
|
||||||
import { isMismatched, updateObject } from './internal/utils.svelte';
|
import { isMismatched, updateObject } from './internal/utils.svelte';
|
||||||
import { TimelineDay } from './timeline-day.svelte';
|
import { TimelineDay } from './timeline-day.svelte';
|
||||||
import { TimelineMonth } from './timeline-month.svelte';
|
import { TimelineMonth } from './timeline-month.svelte';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
import { AssetOrder, type TimeBucketAssetResponseDto } from '@immich/sdk';
|
import { AssetOrder, type TimeBucketAssetResponseDto } from '@immich/sdk';
|
||||||
|
import { t } from 'svelte-i18n';
|
||||||
|
import { SvelteSet } from 'svelte/reactivity';
|
||||||
|
import { get } from 'svelte/store';
|
||||||
|
import {
|
||||||
|
ViewportProximity,
|
||||||
|
isInOrNearViewport as isInOrNearViewportUtil,
|
||||||
|
isInViewport as isInViewportUtil,
|
||||||
|
} from '$lib/managers/timeline-manager/internal/intersection-support.svelte';
|
||||||
import { CancellableTask } from '$lib/utils/cancellable-task';
|
import { CancellableTask } from '$lib/utils/cancellable-task';
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
import {
|
import {
|
||||||
|
|
@ -13,16 +20,6 @@ import {
|
||||||
type TimelineDateTime,
|
type TimelineDateTime,
|
||||||
type TimelineYearMonth,
|
type TimelineYearMonth,
|
||||||
} from '$lib/utils/timeline-util';
|
} from '$lib/utils/timeline-util';
|
||||||
|
|
||||||
import { t } from 'svelte-i18n';
|
|
||||||
import { get } from 'svelte/store';
|
|
||||||
|
|
||||||
import {
|
|
||||||
ViewportProximity,
|
|
||||||
isInOrNearViewport as isInOrNearViewportUtil,
|
|
||||||
isInViewport as isInViewportUtil,
|
|
||||||
} from '$lib/managers/timeline-manager/internal/intersection-support.svelte';
|
|
||||||
import { SvelteSet } from 'svelte/reactivity';
|
|
||||||
import { GroupInsertionCache } from './group-insertion-cache.svelte';
|
import { GroupInsertionCache } from './group-insertion-cache.svelte';
|
||||||
import { TimelineDay } from './timeline-day.svelte';
|
import { TimelineDay } from './timeline-day.svelte';
|
||||||
import type { TimelineManager } from './timeline-manager.svelte';
|
import type { TimelineManager } from './timeline-manager.svelte';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import type { TimelineDate, TimelineDateTime, TimelineYearMonth } from '$lib/utils/timeline-util';
|
|
||||||
import type { AssetStackResponseDto, AssetVisibility } from '@immich/sdk';
|
import type { AssetStackResponseDto, AssetVisibility } from '@immich/sdk';
|
||||||
|
import type { TimelineDate, TimelineDateTime, TimelineYearMonth } from '$lib/utils/timeline-util';
|
||||||
|
|
||||||
export type ViewportTopMonth = TimelineYearMonth | undefined | 'lead-in' | 'lead-out';
|
export type ViewportTopMonth = TimelineYearMonth | undefined | 'lead-in' | 'lead-out';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import type { CommonPosition } from '$lib/utils/layout-utils';
|
import type { CommonPosition } from '$lib/utils/layout-utils';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ViewportProximity,
|
ViewportProximity,
|
||||||
calculateViewerAssetViewportProximity,
|
calculateViewerAssetViewportProximity,
|
||||||
|
|
@ -27,7 +26,7 @@ export class ViewerAsset {
|
||||||
}
|
}
|
||||||
|
|
||||||
position: CommonPosition | undefined = $state.raw();
|
position: CommonPosition | undefined = $state.raw();
|
||||||
asset: TimelineAsset = <TimelineAsset>$state();
|
asset: TimelineAsset = $state() as TimelineAsset;
|
||||||
id: string = $derived(this.asset.id);
|
id: string = $derived(this.asset.id);
|
||||||
|
|
||||||
constructor(group: TimelineDay, asset: TimelineAsset) {
|
constructor(group: TimelineDay, asset: TimelineAsset) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { getSupportedMediaTypes, type ServerMediaTypesResponseDto } from '@immich/sdk';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import { uploadAssetsStore } from '$lib/stores/upload';
|
import { uploadAssetsStore } from '$lib/stores/upload';
|
||||||
import { cancelUploadRequests } from '$lib/utils';
|
import { cancelUploadRequests } from '$lib/utils';
|
||||||
import { getSupportedMediaTypes, type ServerMediaTypesResponseDto } from '@immich/sdk';
|
|
||||||
|
|
||||||
class UploadManager {
|
class UploadManager {
|
||||||
mediaTypes = $state<ServerMediaTypesResponseDto>({ image: [], sidecar: [], video: [] });
|
mediaTypes = $state<ServerMediaTypesResponseDto>({ image: [], sidecar: [], video: [] });
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
|
||||||
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
|
||||||
import { getVisualViewportMock } from '$lib/__mocks__/visual-viewport.mock';
|
|
||||||
import { fireEvent, render, screen, waitFor } from '@testing-library/svelte';
|
import { fireEvent, render, screen, waitFor } from '@testing-library/svelte';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
|
import { afterAll, beforeEach, describe, expect, test, vi } from 'vitest';
|
||||||
|
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
||||||
|
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
||||||
|
import { getVisualViewportMock } from '$lib/__mocks__/visual-viewport.mock';
|
||||||
import AssetChangeDateModal from './AssetChangeDateModal.svelte';
|
import AssetChangeDateModal from './AssetChangeDateModal.svelte';
|
||||||
|
|
||||||
describe('AssetChangeDateModal component', () => {
|
describe('AssetChangeDateModal component', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
import { fireEvent, render, screen, waitFor } from '@testing-library/svelte';
|
||||||
|
import userEvent from '@testing-library/user-event';
|
||||||
|
import { DateTime } from 'luxon';
|
||||||
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
import { getAnimateMock } from '$lib/__mocks__/animate.mock';
|
||||||
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
import { getIntersectionObserverMock } from '$lib/__mocks__/intersection-observer.mock';
|
||||||
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
import { sdkMock } from '$lib/__mocks__/sdk.mock';
|
||||||
|
|
@ -5,9 +8,6 @@ import { getVisualViewportMock } from '$lib/__mocks__/visual-viewport.mock';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { calcNewDate } from '$lib/modals/timezone-utils';
|
import { calcNewDate } from '$lib/modals/timezone-utils';
|
||||||
import { userAdminFactory } from '@test-data/factories/user-factory';
|
import { userAdminFactory } from '@test-data/factories/user-factory';
|
||||||
import { fireEvent, render, screen, waitFor } from '@testing-library/svelte';
|
|
||||||
import userEvent from '@testing-library/user-event';
|
|
||||||
import { DateTime } from 'luxon';
|
|
||||||
import AssetSelectionChangeDateModal from './AssetSelectionChangeDateModal.svelte';
|
import AssetSelectionChangeDateModal from './AssetSelectionChangeDateModal.svelte';
|
||||||
|
|
||||||
describe('DateSelectionModal component', () => {
|
describe('DateSelectionModal component', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { OpenQueryParam, type SharedLinkTab } from '$lib/constants';
|
|
||||||
import { QueueName, type MetadataSearchDto, type SmartSearchDto } from '@immich/sdk';
|
import { QueueName, type MetadataSearchDto, type SmartSearchDto } from '@immich/sdk';
|
||||||
import { omitBy } from 'lodash-es';
|
import { omitBy } from 'lodash-es';
|
||||||
|
import { OpenQueryParam, type SharedLinkTab } from '$lib/constants';
|
||||||
|
|
||||||
const asQueueSlug = (name: QueueName) => {
|
const asQueueSlug = (name: QueueName) => {
|
||||||
return name.replaceAll(/[A-Z]/g, (m) => '-' + m.toLowerCase());
|
return name.replaceAll(/[A-Z]/g, (m) => '-' + m.toLowerCase());
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
|
||||||
import AlbumAddUsersModal from '$lib/modals/AlbumAddUsersModal.svelte';
|
|
||||||
import AlbumOptionsModal from '$lib/modals/AlbumOptionsModal.svelte';
|
|
||||||
import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { createAlbumAndRedirect } from '$lib/utils/album-utils';
|
|
||||||
import { downloadArchive } from '$lib/utils/asset-utils';
|
|
||||||
import { openFileUploadDialog } from '$lib/utils/file-uploader';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
addAssetsToAlbum as addToAlbum,
|
addAssetsToAlbum as addToAlbum,
|
||||||
addAssetsToAlbums as addToAlbums,
|
addAssetsToAlbums as addToAlbums,
|
||||||
|
|
@ -30,6 +17,19 @@ import {
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiLink, mdiPlus, mdiPlusBoxOutline, mdiShareVariantOutline, mdiUpload } from '@mdi/js';
|
import { mdiLink, mdiPlus, mdiPlusBoxOutline, mdiShareVariantOutline, mdiUpload } from '@mdi/js';
|
||||||
import { type MessageFormatter } from 'svelte-i18n';
|
import { type MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
|
import AlbumAddUsersModal from '$lib/modals/AlbumAddUsersModal.svelte';
|
||||||
|
import AlbumOptionsModal from '$lib/modals/AlbumOptionsModal.svelte';
|
||||||
|
import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { createAlbumAndRedirect } from '$lib/utils/album-utils';
|
||||||
|
import { downloadArchive } from '$lib/utils/asset-utils';
|
||||||
|
import { openFileUploadDialog } from '$lib/utils/file-uploader';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getAlbumsActions = ($t: MessageFormatter) => {
|
export const getAlbumsActions = ($t: MessageFormatter) => {
|
||||||
const Create: ActionItem = {
|
const Create: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,3 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import ApiKeyCreateModal from '$lib/modals/ApiKeyCreateModal.svelte';
|
|
||||||
import ApiKeyUpdateModal from '$lib/modals/ApiKeyUpdateModal.svelte';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
createApiKey,
|
createApiKey,
|
||||||
deleteApiKey,
|
deleteApiKey,
|
||||||
|
|
@ -14,6 +9,11 @@ import {
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiPencilOutline, mdiPlus, mdiTrashCanOutline } from '@mdi/js';
|
import { mdiPencilOutline, mdiPlus, mdiTrashCanOutline } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import ApiKeyCreateModal from '$lib/modals/ApiKeyCreateModal.svelte';
|
||||||
|
import ApiKeyUpdateModal from '$lib/modals/ApiKeyUpdateModal.svelte';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getApiKeysActions = ($t: MessageFormatter) => {
|
export const getApiKeysActions = ($t: MessageFormatter) => {
|
||||||
const Create: ActionItem = {
|
const Create: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { CastDestinationType, castManager } from '$lib/managers/cast-manager.svelte';
|
|
||||||
import { GCastDestination } from '$lib/utils/cast/gcast-destination.svelte';
|
|
||||||
import type { ActionItem } from '@immich/ui';
|
import type { ActionItem } from '@immich/ui';
|
||||||
import { mdiCast, mdiCastConnected } from '@mdi/js';
|
import { mdiCast, mdiCastConnected } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { CastDestinationType, castManager } from '$lib/managers/cast-manager.svelte';
|
||||||
|
import { GCastDestination } from '$lib/utils/cast/gcast-destination.svelte';
|
||||||
|
|
||||||
export const getGlobalActions = ($t: MessageFormatter) => {
|
export const getGlobalActions = ($t: MessageFormatter) => {
|
||||||
const Cast: ActionItem = {
|
const Cast: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
|
import { getAssetInfo } from '@immich/sdk';
|
||||||
|
import { toastManager } from '@immich/ui';
|
||||||
|
import { vitest } from 'vitest';
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
import { getAssetActions, handleDownloadAsset } from '$lib/services/asset.service';
|
import { getAssetActions, handleDownloadAsset } from '$lib/services/asset.service';
|
||||||
import { setSharedLink } from '$lib/utils';
|
import { setSharedLink } from '$lib/utils';
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
import { getAssetInfo } from '@immich/sdk';
|
|
||||||
import { toastManager } from '@immich/ui';
|
|
||||||
import { assetFactory } from '@test-data/factories/asset-factory';
|
import { assetFactory } from '@test-data/factories/asset-factory';
|
||||||
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
import { preferencesFactory } from '@test-data/factories/preferences-factory';
|
||||||
import { sharedLinkFactory } from '@test-data/factories/shared-link-factory';
|
import { sharedLinkFactory } from '@test-data/factories/shared-link-factory';
|
||||||
import { userAdminFactory } from '@test-data/factories/user-factory';
|
import { userAdminFactory } from '@test-data/factories/user-factory';
|
||||||
import { vitest } from 'vitest';
|
|
||||||
|
|
||||||
vitest.mock('@immich/ui', () => ({
|
vitest.mock('@immich/ui', () => ({
|
||||||
toastManager: {
|
toastManager: {
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,3 @@
|
||||||
import { ProjectionType } from '$lib/constants';
|
|
||||||
import { assetMultiSelectManager } from '$lib/managers/asset-multi-select-manager.svelte';
|
|
||||||
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
|
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import AssetAddToAlbumModal from '$lib/modals/AssetAddToAlbumModal.svelte';
|
|
||||||
import AssetTagModal from '$lib/modals/AssetTagModal.svelte';
|
|
||||||
import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte';
|
|
||||||
import { getAssetMediaUrl, getSharedLink, sleep } from '$lib/utils';
|
|
||||||
import { downloadUrl } from '$lib/utils/asset-utils';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
AssetJobName,
|
AssetJobName,
|
||||||
AssetMediaSize,
|
AssetMediaSize,
|
||||||
|
|
@ -45,6 +33,18 @@ import {
|
||||||
mdiTune,
|
mdiTune,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { ProjectionType } from '$lib/constants';
|
||||||
|
import { assetMultiSelectManager } from '$lib/managers/asset-multi-select-manager.svelte';
|
||||||
|
import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
|
||||||
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import AssetAddToAlbumModal from '$lib/modals/AssetAddToAlbumModal.svelte';
|
||||||
|
import AssetTagModal from '$lib/modals/AssetTagModal.svelte';
|
||||||
|
import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte';
|
||||||
|
import { getAssetMediaUrl, getSharedLink, sleep } from '$lib/utils';
|
||||||
|
import { downloadUrl } from '$lib/utils/asset-utils';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getAssetBulkActions = ($t: MessageFormatter) => {
|
export const getAssetBulkActions = ($t: MessageFormatter) => {
|
||||||
const ownedAssets = assetMultiSelectManager.ownedAssets;
|
const ownedAssets = assetMultiSelectManager.ownedAssets;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,3 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { uploadRequest } from '$lib/utils';
|
|
||||||
import { openFilePicker } from '$lib/utils/file-uploader';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
deleteDatabaseBackup,
|
deleteDatabaseBackup,
|
||||||
getBaseUrl,
|
getBaseUrl,
|
||||||
|
|
@ -13,6 +8,11 @@ import {
|
||||||
import { modalManager, type ActionItem } from '@immich/ui';
|
import { modalManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiDownload, mdiTrashCanOutline } from '@mdi/js';
|
import { mdiDownload, mdiTrashCanOutline } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { uploadRequest } from '$lib/utils';
|
||||||
|
import { openFilePicker } from '$lib/utils/file-uploader';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getDatabaseBackupActions = ($t: MessageFormatter, filename: string) => {
|
export const getDatabaseBackupActions = ($t: MessageFormatter, filename: string) => {
|
||||||
const Download: ActionItem = {
|
const Download: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import { createJob, type JobCreateDto } from '@immich/sdk';
|
import { createJob, type JobCreateDto } from '@immich/sdk';
|
||||||
import { toastManager } from '@immich/ui';
|
import { toastManager } from '@immich/ui';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const handleCreateJob = async (dto: JobCreateDto) => {
|
export const handleCreateJob = async (dto: JobCreateDto) => {
|
||||||
const $t = await getFormatter();
|
const $t = await getFormatter();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte';
|
|
||||||
import { modalManager, type ActionItem } from '@immich/ui';
|
import { modalManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiKeyboard } from '@mdi/js';
|
import { mdiKeyboard } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte';
|
||||||
|
|
||||||
export const getKeyboardActions = ($t: MessageFormatter) => {
|
export const getKeyboardActions = ($t: MessageFormatter) => {
|
||||||
const KeyboardShortcuts: ActionItem = {
|
const KeyboardShortcuts: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import LibraryExclusionPatternAddModal from '$lib/modals/LibraryExclusionPatternAddModal.svelte';
|
|
||||||
import LibraryExclusionPatternEditModal from '$lib/modals/LibraryExclusionPatternEditModal.svelte';
|
|
||||||
import LibraryFolderAddModal from '$lib/modals/LibraryFolderAddModal.svelte';
|
|
||||||
import LibraryFolderEditModal from '$lib/modals/LibraryFolderEditModal.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
createLibrary,
|
createLibrary,
|
||||||
deleteLibrary,
|
deleteLibrary,
|
||||||
|
|
@ -22,6 +13,15 @@ import {
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiInformationOutline, mdiPencilOutline, mdiPlusBoxOutline, mdiSync, mdiTrashCanOutline } from '@mdi/js';
|
import { mdiInformationOutline, mdiPencilOutline, mdiPlusBoxOutline, mdiSync, mdiTrashCanOutline } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import LibraryExclusionPatternAddModal from '$lib/modals/LibraryExclusionPatternAddModal.svelte';
|
||||||
|
import LibraryExclusionPatternEditModal from '$lib/modals/LibraryExclusionPatternEditModal.svelte';
|
||||||
|
import LibraryFolderAddModal from '$lib/modals/LibraryFolderAddModal.svelte';
|
||||||
|
import LibraryFolderEditModal from '$lib/modals/LibraryFolderEditModal.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getLibrariesActions = ($t: MessageFormatter) => {
|
export const getLibrariesActions = ($t: MessageFormatter) => {
|
||||||
const ScanAll: ActionItem = {
|
const ScanAll: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import { MaintenanceAction, setMaintenanceMode, type SetMaintenanceModeDto } from '@immich/sdk';
|
import { MaintenanceAction, setMaintenanceMode, type SetMaintenanceModeDto } from '@immich/sdk';
|
||||||
import type { ActionItem } from '@immich/ui';
|
import type { ActionItem } from '@immich/ui';
|
||||||
import { mdiProgressWrench } from '@mdi/js';
|
import { mdiProgressWrench } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getMaintenanceAdminActions = ($t: MessageFormatter) => {
|
export const getMaintenanceAdminActions = ($t: MessageFormatter) => {
|
||||||
const StartMaintenance: ActionItem = {
|
const StartMaintenance: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,3 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import PersonEditBirthDateModal from '$lib/modals/PersonEditBirthDateModal.svelte';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import { updatePerson, type PersonResponseDto } from '@immich/sdk';
|
import { updatePerson, type PersonResponseDto } from '@immich/sdk';
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import {
|
import {
|
||||||
|
|
@ -12,6 +8,10 @@ import {
|
||||||
mdiHeartOutline,
|
mdiHeartOutline,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import PersonEditBirthDateModal from '$lib/modals/PersonEditBirthDateModal.svelte';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getPersonActions = ($t: MessageFormatter, person: PersonResponseDto) => {
|
export const getPersonActions = ($t: MessageFormatter, person: PersonResponseDto) => {
|
||||||
const SetDateOfBirth: ActionItem = {
|
const SetDateOfBirth: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { OpenQueryParam } from '$lib/constants';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { queueManager } from '$lib/managers/queue-manager.svelte';
|
|
||||||
import JobCreateModal from '$lib/modals/JobCreateModal.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import type { HeaderButtonActionItem } from '$lib/types';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
emptyQueue,
|
emptyQueue,
|
||||||
getQueue,
|
getQueue,
|
||||||
|
|
@ -41,6 +32,15 @@ import {
|
||||||
mdiVideo,
|
mdiVideo,
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { OpenQueryParam } from '$lib/constants';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { queueManager } from '$lib/managers/queue-manager.svelte';
|
||||||
|
import JobCreateModal from '$lib/modals/JobCreateModal.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import type { HeaderButtonActionItem } from '$lib/types';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
type QueueItem = {
|
type QueueItem = {
|
||||||
icon: IconLike;
|
icon: IconLike;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { asUrl } from '$lib/services/shared-link.service';
|
|
||||||
import type { ServerConfigDto } from '@immich/sdk';
|
import type { ServerConfigDto } from '@immich/sdk';
|
||||||
|
import { asUrl } from '$lib/services/shared-link.service';
|
||||||
import { sharedLinkFactory } from '@test-data/factories/shared-link-factory';
|
import { sharedLinkFactory } from '@test-data/factories/shared-link-factory';
|
||||||
|
|
||||||
describe('SharedLinkService', () => {
|
describe('SharedLinkService', () => {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
|
|
||||||
import QrCodeModal from '$lib/modals/QrCodeModal.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { copyToClipboard } from '$lib/utils';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
createSharedLink,
|
createSharedLink,
|
||||||
getSharedLinkById,
|
getSharedLinkById,
|
||||||
|
|
@ -19,6 +11,14 @@ import {
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiContentCopy, mdiLink, mdiPencilOutline, mdiQrcode, mdiTrashCanOutline } from '@mdi/js';
|
import { mdiContentCopy, mdiLink, mdiPencilOutline, mdiQrcode, mdiTrashCanOutline } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
|
||||||
|
import QrCodeModal from '$lib/modals/QrCodeModal.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { copyToClipboard } from '$lib/utils';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getSharedLinksActions = ($t: MessageFormatter) => {
|
export const getSharedLinksActions = ($t: MessageFormatter) => {
|
||||||
const ViewAll: ActionItem = {
|
const ViewAll: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
|
import { getConfig, updateConfig, type ServerFeaturesDto, type SystemConfigDto } from '@immich/sdk';
|
||||||
|
import { toastManager, type ActionItem } from '@immich/ui';
|
||||||
|
import { mdiContentCopy, mdiDownload, mdiUpload } from '@mdi/js';
|
||||||
|
import { isEqual } from 'lodash-es';
|
||||||
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
import { downloadManager } from '$lib/managers/download-manager.svelte';
|
import { downloadManager } from '$lib/managers/download-manager.svelte';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import { copyToClipboard } from '$lib/utils';
|
import { copyToClipboard } from '$lib/utils';
|
||||||
import { downloadBlob } from '$lib/utils/asset-utils';
|
import { downloadBlob } from '$lib/utils/asset-utils';
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
import { getConfig, updateConfig, type ServerFeaturesDto, type SystemConfigDto } from '@immich/sdk';
|
|
||||||
import { toastManager, type ActionItem } from '@immich/ui';
|
|
||||||
import { mdiContentCopy, mdiDownload, mdiUpload } from '@mdi/js';
|
|
||||||
import { isEqual } from 'lodash-es';
|
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
|
||||||
|
|
||||||
export const getSystemConfigActions = (
|
export const getSystemConfigActions = (
|
||||||
$t: MessageFormatter,
|
$t: MessageFormatter,
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
|
import { deleteTag, updateTag, upsertTags, type TagUpdateDto } from '@immich/sdk';
|
||||||
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
|
import { mdiPencil, mdiPlus, mdiTrashCanOutline } from '@mdi/js';
|
||||||
|
import { type MessageFormatter } from 'svelte-i18n';
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
import TagCreateModal from '$lib/modals/TagCreateModal.svelte';
|
import TagCreateModal from '$lib/modals/TagCreateModal.svelte';
|
||||||
import TagEditModal from '$lib/modals/TagEditModal.svelte';
|
import TagEditModal from '$lib/modals/TagEditModal.svelte';
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
import type { TreeNode } from '$lib/utils/tree-utils';
|
import type { TreeNode } from '$lib/utils/tree-utils';
|
||||||
import { deleteTag, updateTag, upsertTags, type TagUpdateDto } from '@immich/sdk';
|
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
|
||||||
import { mdiPencil, mdiPlus, mdiTrashCanOutline } from '@mdi/js';
|
|
||||||
import { type MessageFormatter } from 'svelte-i18n';
|
|
||||||
|
|
||||||
export const getTagActions = ($t: MessageFormatter, tag: TreeNode) => {
|
export const getTagActions = ($t: MessageFormatter, tag: TreeNode) => {
|
||||||
const Create: ActionItem = {
|
const Create: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import { emptyTrash, restoreTrash } from '@immich/sdk';
|
import { emptyTrash, restoreTrash } from '@immich/sdk';
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiDeleteForeverOutline, mdiHistory } from '@mdi/js';
|
import { mdiDeleteForeverOutline, mdiHistory } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getTrashActions = ($t: MessageFormatter) => {
|
export const getTrashActions = ($t: MessageFormatter) => {
|
||||||
const RestoreAll: ActionItem = {
|
const RestoreAll: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { authManager } from '$lib/managers/auth-manager.svelte';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
|
|
||||||
import PasswordResetSuccessModal from '$lib/modals/PasswordResetSuccessModal.svelte';
|
|
||||||
import UserDeleteConfirmModal from '$lib/modals/UserDeleteConfirmModal.svelte';
|
|
||||||
import UserRestoreConfirmModal from '$lib/modals/UserRestoreConfirmModal.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import type { HeaderButtonActionItem } from '$lib/types';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
createUserAdmin,
|
createUserAdmin,
|
||||||
deleteUserAdmin,
|
deleteUserAdmin,
|
||||||
|
|
@ -32,6 +21,17 @@ import {
|
||||||
} from '@mdi/js';
|
} from '@mdi/js';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { authManager } from '$lib/managers/auth-manager.svelte';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { serverConfigManager } from '$lib/managers/server-config-manager.svelte';
|
||||||
|
import PasswordResetSuccessModal from '$lib/modals/PasswordResetSuccessModal.svelte';
|
||||||
|
import UserDeleteConfirmModal from '$lib/modals/UserDeleteConfirmModal.svelte';
|
||||||
|
import UserRestoreConfirmModal from '$lib/modals/UserRestoreConfirmModal.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import type { HeaderButtonActionItem } from '$lib/types';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getUserAdminsActions = ($t: MessageFormatter) => {
|
export const getUserAdminsActions = ($t: MessageFormatter) => {
|
||||||
const Create: ActionItem = {
|
const Create: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
changePassword,
|
changePassword,
|
||||||
lockAuthSession,
|
lockAuthSession,
|
||||||
|
|
@ -11,6 +8,9 @@ import {
|
||||||
import { toastManager, type ActionItem } from '@immich/ui';
|
import { toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiLockOutline } from '@mdi/js';
|
import { mdiLockOutline } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export const getUserActions = ($t: MessageFormatter) => {
|
export const getUserActions = ($t: MessageFormatter) => {
|
||||||
const LockSession: ActionItem = {
|
const LockSession: ActionItem = {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,3 @@
|
||||||
import { goto } from '$app/navigation';
|
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { Route } from '$lib/route';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getFormatter } from '$lib/utils/i18n';
|
|
||||||
import {
|
import {
|
||||||
createWorkflow,
|
createWorkflow,
|
||||||
deleteWorkflow,
|
deleteWorkflow,
|
||||||
|
|
@ -25,6 +20,11 @@ import {
|
||||||
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
|
||||||
import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay, mdiPlus } from '@mdi/js';
|
import { mdiCodeJson, mdiDelete, mdiPause, mdiPencil, mdiPlay, mdiPlus } from '@mdi/js';
|
||||||
import type { MessageFormatter } from 'svelte-i18n';
|
import type { MessageFormatter } from 'svelte-i18n';
|
||||||
|
import { goto } from '$app/navigation';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { Route } from '$lib/route';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
import { getFormatter } from '$lib/utils/i18n';
|
||||||
|
|
||||||
export type PickerSubType = 'album-picker' | 'people-picker';
|
export type PickerSubType = 'album-picker' | 'people-picker';
|
||||||
export type PickerMetadata = AlbumResponseDto | PersonResponseDto | AlbumResponseDto[] | PersonResponseDto[];
|
export type PickerMetadata = AlbumResponseDto | PersonResponseDto | AlbumResponseDto[] | PersonResponseDto[];
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { foldersStore } from '$lib/stores/folders.svelte';
|
|
||||||
import { getUniqueOriginalPaths } from '@immich/sdk';
|
import { getUniqueOriginalPaths } from '@immich/sdk';
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
import { foldersStore } from '$lib/stores/folders.svelte';
|
||||||
|
|
||||||
vi.mock('$lib/managers/event-manager.svelte', () => ({
|
vi.mock('$lib/managers/event-manager.svelte', () => ({
|
||||||
eventManager: {
|
eventManager: {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { TreeNode } from '$lib/utils/tree-utils';
|
|
||||||
import {
|
import {
|
||||||
getAssetsByOriginalPath,
|
getAssetsByOriginalPath,
|
||||||
getUniqueOriginalPaths,
|
getUniqueOriginalPaths,
|
||||||
|
|
@ -8,6 +6,8 @@ import {
|
||||||
*/
|
*/
|
||||||
type AssetResponseDto,
|
type AssetResponseDto,
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { TreeNode } from '$lib/utils/tree-utils';
|
||||||
|
|
||||||
type AssetCache = {
|
type AssetCache = {
|
||||||
[path: string]: AssetResponseDto[];
|
[path: string]: AssetResponseDto[];
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import { handleError } from '$lib/utils/handle-error';
|
|
||||||
import { getNotifications, updateNotification, updateNotifications, type NotificationDto } from '@immich/sdk';
|
import { getNotifications, updateNotification, updateNotifications, type NotificationDto } from '@immich/sdk';
|
||||||
import { t } from 'svelte-i18n';
|
import { t } from 'svelte-i18n';
|
||||||
import { get } from 'svelte/store';
|
import { get } from 'svelte/store';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
import { handleError } from '$lib/utils/handle-error';
|
||||||
|
|
||||||
class NotificationStore {
|
class NotificationStore {
|
||||||
notifications = $state<NotificationDto[]>([]);
|
notifications = $state<NotificationDto[]>([]);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { assetCacheManager } from '$lib/managers/AssetCacheManager.svelte';
|
|
||||||
import { ocrManager, type OcrBoundingBox } from '$lib/stores/ocr.svelte';
|
|
||||||
import { getAssetOcr } from '@immich/sdk';
|
import { getAssetOcr } from '@immich/sdk';
|
||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
|
import { assetCacheManager } from '$lib/managers/AssetCacheManager.svelte';
|
||||||
|
import { ocrManager, type OcrBoundingBox } from '$lib/stores/ocr.svelte';
|
||||||
|
|
||||||
// Mock the SDK
|
// Mock the SDK
|
||||||
vi.mock('@immich/sdk', () => ({
|
vi.mock('@immich/sdk', () => ({
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { persisted } from 'svelte-persisted-store';
|
||||||
import { browser } from '$app/environment';
|
import { browser } from '$app/environment';
|
||||||
import { defaultLang } from '$lib/constants';
|
import { defaultLang } from '$lib/constants';
|
||||||
import { getPreferredLocale } from '$lib/utils/i18n';
|
import { getPreferredLocale } from '$lib/utils/i18n';
|
||||||
import { persisted } from 'svelte-persisted-store';
|
|
||||||
|
|
||||||
// Locale to use for formatting dates, numbers, etc.
|
// Locale to use for formatting dates, numbers, etc.
|
||||||
export const locale = persisted('locale', 'default', {
|
export const locale = persisted('locale', 'default', {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { UploadState, type UploadAsset } from '$lib/types';
|
|
||||||
import { derived, writable } from 'svelte/store';
|
import { derived, writable } from 'svelte/store';
|
||||||
|
import { UploadState, type UploadAsset } from '$lib/types';
|
||||||
|
|
||||||
function createUploadStore() {
|
function createUploadStore() {
|
||||||
const uploadAssets = writable<Array<UploadAsset>>([]);
|
const uploadAssets = writable<Array<UploadAsset>>([]);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import { eventManager } from '$lib/managers/event-manager.svelte';
|
|
||||||
import type {
|
import type {
|
||||||
AlbumResponseDto,
|
AlbumResponseDto,
|
||||||
ServerAboutResponseDto,
|
ServerAboutResponseDto,
|
||||||
ServerStorageResponseDto,
|
ServerStorageResponseDto,
|
||||||
ServerVersionHistoryResponseDto,
|
ServerVersionHistoryResponseDto,
|
||||||
} from '@immich/sdk';
|
} from '@immich/sdk';
|
||||||
|
import { eventManager } from '$lib/managers/event-manager.svelte';
|
||||||
|
|
||||||
interface UserInteractions {
|
interface UserInteractions {
|
||||||
recentAlbums?: AlbumResponseDto[];
|
recentAlbums?: AlbumResponseDto[];
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue