diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 8d278b44ce..2133d04113 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -3307,6 +3307,12 @@ export interface SystemConfigDto { * @memberof SystemConfigDto */ 'storageTemplate': SystemConfigStorageTemplateDto; + /** + * + * @type {SystemConfigThemeDto} + * @memberof SystemConfigDto + */ + 'theme': SystemConfigThemeDto; /** * * @type {SystemConfigThumbnailDto} @@ -3741,6 +3747,19 @@ export interface SystemConfigTemplateStorageOptionDto { */ 'yearOptions': Array; } +/** + * + * @export + * @interface SystemConfigThemeDto + */ +export interface SystemConfigThemeDto { + /** + * + * @type {string} + * @memberof SystemConfigThemeDto + */ + 'customCss': string; +} /** * * @export diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 85b96e6473..747c435dd3 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -135,6 +135,7 @@ doc/SystemConfigPasswordLoginDto.md doc/SystemConfigReverseGeocodingDto.md doc/SystemConfigStorageTemplateDto.md doc/SystemConfigTemplateStorageOptionDto.md +doc/SystemConfigThemeDto.md doc/SystemConfigThumbnailDto.md doc/SystemConfigTrashDto.md doc/TagApi.md @@ -302,6 +303,7 @@ lib/model/system_config_password_login_dto.dart lib/model/system_config_reverse_geocoding_dto.dart lib/model/system_config_storage_template_dto.dart lib/model/system_config_template_storage_option_dto.dart +lib/model/system_config_theme_dto.dart lib/model/system_config_thumbnail_dto.dart lib/model/system_config_trash_dto.dart lib/model/tag_response_dto.dart @@ -456,6 +458,7 @@ test/system_config_password_login_dto_test.dart test/system_config_reverse_geocoding_dto_test.dart test/system_config_storage_template_dto_test.dart test/system_config_template_storage_option_dto_test.dart +test/system_config_theme_dto_test.dart test/system_config_thumbnail_dto_test.dart test/system_config_trash_dto_test.dart test/tag_api_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 47d04b9bd2..07d2cf402f 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/doc/SystemConfigDto.md b/mobile/openapi/doc/SystemConfigDto.md index a5b8db773c..d426bef345 100644 Binary files a/mobile/openapi/doc/SystemConfigDto.md and b/mobile/openapi/doc/SystemConfigDto.md differ diff --git a/mobile/openapi/doc/SystemConfigThemeDto.md b/mobile/openapi/doc/SystemConfigThemeDto.md new file mode 100644 index 0000000000..bcdbb690cb Binary files /dev/null and b/mobile/openapi/doc/SystemConfigThemeDto.md differ diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index e72c1da168..091a38e36d 100644 Binary files a/mobile/openapi/lib/api.dart and b/mobile/openapi/lib/api.dart differ diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 34b9a431d4..33586a7e13 100644 Binary files a/mobile/openapi/lib/api_client.dart and b/mobile/openapi/lib/api_client.dart differ diff --git a/mobile/openapi/lib/model/system_config_dto.dart b/mobile/openapi/lib/model/system_config_dto.dart index 932e68466b..8e15d7e219 100644 Binary files a/mobile/openapi/lib/model/system_config_dto.dart and b/mobile/openapi/lib/model/system_config_dto.dart differ diff --git a/mobile/openapi/lib/model/system_config_theme_dto.dart b/mobile/openapi/lib/model/system_config_theme_dto.dart new file mode 100644 index 0000000000..f34234952d Binary files /dev/null and b/mobile/openapi/lib/model/system_config_theme_dto.dart differ diff --git a/mobile/openapi/test/system_config_dto_test.dart b/mobile/openapi/test/system_config_dto_test.dart index 1a3e38a9e9..30dbe6860b 100644 Binary files a/mobile/openapi/test/system_config_dto_test.dart and b/mobile/openapi/test/system_config_dto_test.dart differ diff --git a/mobile/openapi/test/system_config_theme_dto_test.dart b/mobile/openapi/test/system_config_theme_dto_test.dart new file mode 100644 index 0000000000..98e283559e Binary files /dev/null and b/mobile/openapi/test/system_config_theme_dto_test.dart differ diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index e6230fcc32..09ff41e24f 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -8060,6 +8060,9 @@ "storageTemplate": { "$ref": "#/components/schemas/SystemConfigStorageTemplateDto" }, + "theme": { + "$ref": "#/components/schemas/SystemConfigThemeDto" + }, "thumbnail": { "$ref": "#/components/schemas/SystemConfigThumbnailDto" }, @@ -8077,7 +8080,8 @@ "storageTemplate", "job", "thumbnail", - "trash" + "trash", + "theme" ], "type": "object" }, @@ -8404,6 +8408,17 @@ ], "type": "object" }, + "SystemConfigThemeDto": { + "properties": { + "customCss": { + "type": "string" + } + }, + "required": [ + "customCss" + ], + "type": "object" + }, "SystemConfigThumbnailDto": { "properties": { "colorspace": { diff --git a/server/src/domain/system-config/dto/system-config-theme.dto.ts b/server/src/domain/system-config/dto/system-config-theme.dto.ts new file mode 100644 index 0000000000..f47b51e0e1 --- /dev/null +++ b/server/src/domain/system-config/dto/system-config-theme.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export class SystemConfigThemeDto { + @IsString() + customCss!: string; +} diff --git a/server/src/domain/system-config/dto/system-config.dto.ts b/server/src/domain/system-config/dto/system-config.dto.ts index 1522683826..6a88e758c6 100644 --- a/server/src/domain/system-config/dto/system-config.dto.ts +++ b/server/src/domain/system-config/dto/system-config.dto.ts @@ -9,6 +9,7 @@ import { SystemConfigOAuthDto } from './system-config-oauth.dto'; import { SystemConfigPasswordLoginDto } from './system-config-password-login.dto'; import { SystemConfigReverseGeocodingDto } from './system-config-reverse-geocoding.dto'; import { SystemConfigStorageTemplateDto } from './system-config-storage-template.dto'; +import { SystemConfigThemeDto } from './system-config-theme.dto'; import { SystemConfigThumbnailDto } from './system-config-thumbnail.dto'; import { SystemConfigTrashDto } from './system-config-trash.dto'; @@ -62,6 +63,11 @@ export class SystemConfigDto implements SystemConfig { @ValidateNested() @IsObject() trash!: SystemConfigTrashDto; + + @Type(() => SystemConfigThemeDto) + @ValidateNested() + @IsObject() + theme!: SystemConfigThemeDto; } export function mapConfig(config: SystemConfig): SystemConfigDto { diff --git a/server/src/domain/system-config/system-config.core.ts b/server/src/domain/system-config/system-config.core.ts index 66c72fc92e..4fd2faa295 100644 --- a/server/src/domain/system-config/system-config.core.ts +++ b/server/src/domain/system-config/system-config.core.ts @@ -114,6 +114,9 @@ export const defaults = Object.freeze({ enabled: true, days: 30, }, + theme: { + customCss: '', + }, }); export enum FeatureFlag { diff --git a/server/src/domain/system-config/system-config.service.spec.ts b/server/src/domain/system-config/system-config.service.spec.ts index 0444217c09..36cdb6543e 100644 --- a/server/src/domain/system-config/system-config.service.spec.ts +++ b/server/src/domain/system-config/system-config.service.spec.ts @@ -115,6 +115,9 @@ const updatedConfig = Object.freeze({ enabled: true, days: 10, }, + theme: { + customCss: '', + }, }); describe(SystemConfigService.name, () => { diff --git a/server/src/infra/entities/system-config.entity.ts b/server/src/infra/entities/system-config.entity.ts index 47b1f69fd9..6bd552111a 100644 --- a/server/src/infra/entities/system-config.entity.ts +++ b/server/src/infra/entities/system-config.entity.ts @@ -90,6 +90,8 @@ export enum SystemConfigKey { TRASH_ENABLED = 'trash.enabled', TRASH_DAYS = 'trash.days', + + THEME_CUSTOM_CSS = 'theme.customCss', } export enum TranscodePolicy { @@ -221,4 +223,7 @@ export interface SystemConfig { enabled: boolean; days: number; }; + theme: { + customCss: string; + }; } diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 8d278b44ce..2133d04113 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -3307,6 +3307,12 @@ export interface SystemConfigDto { * @memberof SystemConfigDto */ 'storageTemplate': SystemConfigStorageTemplateDto; + /** + * + * @type {SystemConfigThemeDto} + * @memberof SystemConfigDto + */ + 'theme': SystemConfigThemeDto; /** * * @type {SystemConfigThumbnailDto} @@ -3741,6 +3747,19 @@ export interface SystemConfigTemplateStorageOptionDto { */ 'yearOptions': Array; } +/** + * + * @export + * @interface SystemConfigThemeDto + */ +export interface SystemConfigThemeDto { + /** + * + * @type {string} + * @memberof SystemConfigThemeDto + */ + 'customCss': string; +} /** * * @export diff --git a/web/src/lib/components/admin-page/settings/setting-textarea.svelte b/web/src/lib/components/admin-page/settings/setting-textarea.svelte new file mode 100644 index 0000000000..99a672c472 --- /dev/null +++ b/web/src/lib/components/admin-page/settings/setting-textarea.svelte @@ -0,0 +1,53 @@ + + +
+
+ + {#if required} +
*
+ {/if} + + {#if isEdited} +
+ Unsaved change +
+ {/if} +
+ + {#if desc} +

+ {desc} +

+ {:else} + + {/if} + +