diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetPreviewMode.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetPreviewMode.cs new file mode 100644 index 000000000..738f891ea --- /dev/null +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetPreviewMode.cs @@ -0,0 +1,16 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Schemas +{ + public enum AssetPreviewMode + { + ImageAndFileName, + Image, + FileName + } +} diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs index 84d09b2d0..e5087a2ba 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs @@ -12,7 +12,7 @@ namespace Squidex.Domain.Apps.Core.Schemas [Equals(DoNotAddEqualityOperators = true)] public sealed class AssetsFieldProperties : FieldProperties { - public bool MustBeImage { get; set; } + public AssetPreviewMode PreviewMode { get; set; } public int? MinItems { get; set; } @@ -34,6 +34,8 @@ namespace Squidex.Domain.Apps.Core.Schemas public int? AspectHeight { get; set; } + public bool MustBeImage { get; set; } + public bool AllowDuplicates { get; set; } public bool ResolveFirst { get; set; } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs index 4a918ec92..76912088b 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs @@ -14,6 +14,11 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models.Fields { public sealed class AssetsFieldPropertiesDto : FieldPropertiesDto { + /// + /// The preview mode for the asset. + /// + public AssetPreviewMode PreviewMode { get; set; } + /// /// The minimum allowed items for the field value. /// diff --git a/frontend/app/features/content/shared/list/content-value.component.html b/frontend/app/features/content/shared/list/content-value.component.html index e61b527fa..6cd833107 100644 --- a/frontend/app/features/content/shared/list/content-value.component.html +++ b/frontend/app/features/content/shared/list/content-value.component.html @@ -2,5 +2,5 @@ {{value}} - +   \ No newline at end of file diff --git a/frontend/app/features/content/shared/list/content-value.component.scss b/frontend/app/features/content/shared/list/content-value.component.scss index 39752b104..8559d194b 100644 --- a/frontend/app/features/content/shared/list/content-value.component.scss +++ b/frontend/app/features/content/shared/list/content-value.component.scss @@ -1,11 +1,19 @@ -:ng-deep { +:host ::ng-deep { .html-value { img { - margin-top: -25px; + margin-top: -15px; max-height: 50px; min-height: 50px; position: absolute; } + + img + span { + padding-left: 60px; + } + + span { + @include truncate; + } } } diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html index 32da7deb9..905a62088 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html @@ -1,5 +1,21 @@
+
+ + +
+ + + + The preview mode for assets in content lists. + +
+
+
diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts index 685daf2f8..61ddbe296 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts @@ -25,6 +25,9 @@ export class AssetsUIComponent implements OnInit { public properties: AssetsFieldPropertiesDto; public ngOnInit() { + this.editForm.setControl('previewMode', + new FormControl(this.properties.previewMode)); + this.editForm.setControl('resolveFirst', new FormControl(this.properties.resolveFirst)); } diff --git a/frontend/app/shared/services/schemas.types.ts b/frontend/app/shared/services/schemas.types.ts index ef5fbbda1..f293cfde7 100644 --- a/frontend/app/shared/services/schemas.types.ts +++ b/frontend/app/shared/services/schemas.types.ts @@ -172,6 +172,7 @@ export class ArrayFieldPropertiesDto extends FieldPropertiesDto { export class AssetsFieldPropertiesDto extends FieldPropertiesDto { public readonly fieldType = 'Assets'; + public readonly previewMode: 'ImageAndFileName' | 'Image' | 'FileName'; public readonly allowDuplicates?: boolean; public readonly allowedExtensions?: ReadonlyArray; public readonly resolveFirst: boolean; diff --git a/frontend/app/shared/state/contents.forms.spec.ts b/frontend/app/shared/state/contents.forms.spec.ts index 799297d59..a442f92d4 100644 --- a/frontend/app/shared/state/contents.forms.spec.ts +++ b/frontend/app/shared/state/contents.forms.spec.ts @@ -456,9 +456,43 @@ describe('GetContentValue', () => { } }; - const result = getContentValue(content, language, fieldAssets); + const assetWithImageAndFileName = createField({ properties: createProperties('Assets', { previewMode: 'ImageAndFileName' }) }); + + const result = getContentValue(content, language, assetWithImageAndFileName); + + expect(result).toEqual({ value: ['url/to/13', 'file13'], formatted: new HtmlValue(' file13') }); + }); + + it('should resolve image url only from referenced asset', () => { + const content: any = { + referenceData: { + field1: { + en: ['url/to/13', 'file13'] + } + } + }; + + const assetWithImage = createField({ properties: createProperties('Assets', { previewMode: 'Image' }) }); + + const result = getContentValue(content, language, assetWithImage); + + expect(result).toEqual({ value: ['url/to/13', 'file13'], formatted: new HtmlValue('') }); + }); + + it('should resolve filename only from referenced asset', () => { + const content: any = { + referenceData: { + field1: { + en: ['url/to/13', 'file13'] + } + } + }; + + const assetWithFileName = createField({ properties: createProperties('Assets', { previewMode: 'FileName' }) }); + + const result = getContentValue(content, language, assetWithFileName); - expect(result).toEqual({ value: ['url/to/13', 'file13'], formatted: new HtmlValue(' file13') }); + expect(result).toEqual({ value: ['url/to/13', 'file13'], formatted: 'file13' }); }); it('should resolve filename from referenced asset', () => { diff --git a/frontend/app/shared/state/contents.forms.ts b/frontend/app/shared/state/contents.forms.ts index 340c6d418..cd8d571c1 100644 --- a/frontend/app/shared/state/contents.forms.ts +++ b/frontend/app/shared/state/contents.forms.ts @@ -69,7 +69,15 @@ export function getContentValue(content: ContentDto, language: LanguageDto, fiel if (value) { if (isAssets && Types.isArray(value)) { if (value.length === 2) { - formatted = new HtmlValue(` ${value[1]}`); + const previewMode = field.properties['previewMode']; + + if (previewMode === 'ImageAndFileName') { + formatted = new HtmlValue(` ${value[1]}`); + } else if (previewMode === 'Image') { + formatted = new HtmlValue(``); + } else { + formatted = value[1]; + } } else if (value.length === 1) { formatted = value[0]; }