From 8395b0baa50db7b727c055bc5fe0ff36a774e028 Mon Sep 17 00:00:00 2001 From: davidcanonieto Date: Wed, 17 Apr 2019 17:04:27 +0100 Subject: [PATCH] [ADF-4219] Multivalue Metadata Card View (#4600) * [ADF-4219] Multivalue Metadata Card View * [ADF-4219] Add documentation * [ADF-4219] Improve code, docs and tests * [ADF-4219] Fix e2e tests --- demo-shell/src/app.config.json | 5 +- docs/README.md | 1 + .../content-metadata-card.component.md | 18 +++++ docs/core/pipes/multi-value.pipe.md | 39 +++++++++++ .../images/multi-value-default.pipe.png | Bin 0 -> 10388 bytes docs/docassets/images/multi-value.pipe.png | Bin 0 -> 11126 bytes .../viewer-arcive.component.e2e.ts | 16 ++--- .../file-extensions/viewer-component.e2e.ts | 1 - .../viewer-text.component.e2e.ts | 2 - .../property-groups-translator.service.ts | 15 +++- lib/core/app-config/schema.json | 4 ++ .../card-view-textitem.component.ts | 26 +++++-- ...card-view-textitem-properties.interface.ts | 1 + .../models/card-view-textitem.model.ts | 2 + lib/core/pipes/multi-value.pipe.spec.ts | 66 ++++++++++++++++++ lib/core/pipes/multi-value.pipe.ts | 34 +++++++++ lib/core/pipes/pipe.module.ts | 10 ++- lib/core/pipes/public-api.ts | 1 + 18 files changed, 217 insertions(+), 24 deletions(-) create mode 100644 docs/core/pipes/multi-value.pipe.md create mode 100644 docs/docassets/images/multi-value-default.pipe.png create mode 100644 docs/docassets/images/multi-value.pipe.png create mode 100644 lib/core/pipes/multi-value.pipe.spec.ts create mode 100644 lib/core/pipes/multi-value.pipe.ts diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 75d013078a..96bfb02028 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -601,9 +601,10 @@ "content-metadata": { "presets": { "default": { - "exif:exif": "*" + "exif:exif": "*" } - } + }, + "multi-value-pipe-separator" : ", " }, "sideNav": { "expandedSidenav": true, diff --git a/docs/README.md b/docs/README.md index 70328cf129..007acbe6fa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -162,6 +162,7 @@ for more information about installing and using the source code. | [Text Highlight pipe](core/pipes/text-highlight.pipe.md) | Adds highlighting to words or sections of text that match a search string. | [Source](../lib/core/pipes/text-highlight.pipe.ts) | | [Time Ago pipe](core/pipes/time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../lib/core/pipes/time-ago.pipe.ts) | | [User Initial pipe](core/pipes/user-initial.pipe.md) | Takes the name fields of a UserProcessModel object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) | +| [Multi value pipe](core/pipes/multi-value.pipe.md) | Takes a list of values to stringify them with a custom separator. | [Source](../lib/core/pipes/multi-value.pipe.ts) | ### Services diff --git a/docs/content-services/components/content-metadata-card.component.md b/docs/content-services/components/content-metadata-card.component.md index 2b73654d7c..773ed6b807 100644 --- a/docs/content-services/components/content-metadata-card.component.md +++ b/docs/content-services/components/content-metadata-card.component.md @@ -274,3 +274,21 @@ example below shows this with an aspect-oriented config: Nothing - since this aspect is not related to the node, it will simply be ignored and not displayed. The aspects to be displayed are calculated as an intersection of the preset's aspects and the aspects related to the node. + +## Multi value card properties +Multi value properties are displayed one after another separated by a comma. This card makes use of the [Multi Value Pipe](../../core/pipes/multi-value.pipe.ts). + +To customize the separator used by this card you can set it in your `app.config.json` inside your content-metadata configuration: + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true, + "exclude": "exif:exif", + "exif:exif": [ "exif:pixelXDimension", "exif:pixelYDimension"] + } + }, + "multi-value-pipe-separator" : " - " +}, +``` diff --git a/docs/core/pipes/multi-value.pipe.md b/docs/core/pipes/multi-value.pipe.md new file mode 100644 index 0000000000..a0f948a9b6 --- /dev/null +++ b/docs/core/pipes/multi-value.pipe.md @@ -0,0 +1,39 @@ +# [Multi Value Pipe](../../../lib/core/pipes/multi-value.pipe.ts "Defined in multi-value.pipe.ts") + +Takes an array of strings and turns it into one string where items are separated by a separator. The default separator applied to the list is `', '`, however, you can set your own separator in the params of the pipe. + +## Basic Usage + + + +### Default separator + +```HTML +
+ List {{ values | multiValue }} +
+``` + +#### Result + +![multi-value-pipe](../../docassets/images/multi-value-default.pipe.png) + +### Custom separator + +```HTML +
+ List {{ values | multiValue: ' :) ' }} +
+``` + + + +#### Result + +![multi-value-pipe](../../docassets/images/multi-value.pipe.png) + +## Details + +The pipe gets every one of the items passed to the pipe and stringifies it adding the separator set in the configuration. + +You will need to specify the separator you want to use for it to work. diff --git a/docs/docassets/images/multi-value-default.pipe.png b/docs/docassets/images/multi-value-default.pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..bd57f0221bcfebfc2a81debba252506310125cee GIT binary patch literal 10388 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 literal 0 HcmV?d00001 diff --git a/docs/docassets/images/multi-value.pipe.png b/docs/docassets/images/multi-value.pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..3a72938e66e8776bb2d84c4821255df4d4d5c836 GIT binary patch literal 11126 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 B1#tiX literal 0 HcmV?d00001 diff --git a/e2e/core/viewer/file-extensions/viewer-arcive.component.e2e.ts b/e2e/core/viewer/file-extensions/viewer-arcive.component.e2e.ts index 744bce338a..2b23a1e19f 100644 --- a/e2e/core/viewer/file-extensions/viewer-arcive.component.e2e.ts +++ b/e2e/core/viewer/file-extensions/viewer-arcive.component.e2e.ts @@ -15,21 +15,21 @@ * limitations under the License. */ -import TestConfig = require('../../test.config'); +import TestConfig = require('../../../test.config'); import { LoginPage } from '@alfresco/adf-testing'; -import { ViewerPage } from '../../pages/adf/viewerPage'; -import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; +import { ViewerPage } from '../../../pages/adf/viewerPage'; +import { ContentServicesPage } from '../../../pages/adf/contentServicesPage'; -import CONSTANTS = require('../../util/constants'); -import resources = require('../../util/resources'); +import CONSTANTS = require('../../../util/constants'); +import resources = require('../../../util/resources'); import { StringUtil } from '@alfresco/adf-testing'; -import { FolderModel } from '../../models/ACS/folderModel'; -import { AcsUserModel } from '../../models/ACS/acsUserModel'; +import { FolderModel } from '../../../models/ACS/folderModel'; +import { AcsUserModel } from '../../../models/ACS/acsUserModel'; import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; -import { UploadActions } from '../../actions/ACS/upload.actions'; +import { UploadActions } from '../../../actions/ACS/upload.actions'; describe('Viewer', () => { diff --git a/e2e/core/viewer/file-extensions/viewer-component.e2e.ts b/e2e/core/viewer/file-extensions/viewer-component.e2e.ts index 59a140906c..49f0c71a67 100644 --- a/e2e/core/viewer/file-extensions/viewer-component.e2e.ts +++ b/e2e/core/viewer/file-extensions/viewer-component.e2e.ts @@ -33,7 +33,6 @@ import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../../actions/ACS/upload.actions'; import { NavigationBarPage } from '../../..//pages/adf/navigationBarPage'; - describe('Viewer', () => { const viewerPage = new ViewerPage(); diff --git a/e2e/core/viewer/file-extensions/viewer-text.component.e2e.ts b/e2e/core/viewer/file-extensions/viewer-text.component.e2e.ts index 9db136c4f3..a98518b53e 100644 --- a/e2e/core/viewer/file-extensions/viewer-text.component.e2e.ts +++ b/e2e/core/viewer/file-extensions/viewer-text.component.e2e.ts @@ -104,6 +104,4 @@ describe('Viewer', () => { }); }); - - }); diff --git a/lib/content-services/content-metadata/services/property-groups-translator.service.ts b/lib/content-services/content-metadata/services/property-groups-translator.service.ts index 2833552aba..5ec97325fe 100644 --- a/lib/content-services/content-metadata/services/property-groups-translator.service.ts +++ b/lib/content-services/content-metadata/services/property-groups-translator.service.ts @@ -25,7 +25,9 @@ import { CardViewDatetimeItemModel, CardViewIntItemModel, CardViewFloatItemModel, - LogService + LogService, + MultiValuePipe, + AppConfigService } from '@alfresco/adf-core'; import { Property, CardViewGroup, OrganisedPropertyGroup } from '../interfaces/content-metadata.interfaces'; @@ -46,7 +48,12 @@ export class PropertyGroupTranslatorService { static readonly RECOGNISED_ECM_TYPES = [D_TEXT, D_MLTEXT, D_DATE, D_DATETIME, D_INT, D_LONG, D_FLOAT, D_DOUBLE, D_BOOLEAN]; - constructor(private logService: LogService) { + valueSeparator: string; + + constructor(private logService: LogService, + private multiValuePipe: MultiValuePipe, + private appConfig: AppConfigService) { + this.valueSeparator = this.appConfig.get('content-metadata.multi-value-pipe-separator'); } public translateToCardViewGroups(propertyGroups: OrganisedPropertyGroup[], propertyValues): CardViewGroup[] { @@ -115,7 +122,9 @@ export class PropertyGroupTranslatorService { case D_TEXT: default: cardViewItemProperty = new CardViewTextItemModel(Object.assign(propertyDefinition, { - multiline: false + multivalued: property.multiValued, + multiline: property.multiValued, + pipes: [{ pipe: this.multiValuePipe, params: [this.valueSeparator]}] })); } diff --git a/lib/core/app-config/schema.json b/lib/core/app-config/schema.json index ecfe2b9969..bf6809bf16 100644 --- a/lib/core/app-config/schema.json +++ b/lib/core/app-config/schema.json @@ -859,6 +859,10 @@ ] } } + }, + "multi-value-pipe-separator": { + "description": "Content metadata's separator for multi value properties", + "type": "string" } } }, diff --git a/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts b/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts index 6a44787326..deeabaf1b7 100644 --- a/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts +++ b/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts @@ -18,6 +18,7 @@ import { Component, Input, OnChanges, ViewChild } from '@angular/core'; import { CardViewTextItemModel } from '../../models/card-view-textitem.model'; import { CardViewUpdateService } from '../../services/card-view-update.service'; +import { AppConfigService } from '../../../app-config/app-config.service'; @Component({ selector: 'adf-card-view-textitem', @@ -25,6 +26,9 @@ import { CardViewUpdateService } from '../../services/card-view-update.service'; styleUrls: ['./card-view-textitem.component.scss'] }) export class CardViewTextItemComponent implements OnChanges { + + static DEFAULT_SEPARATOR = ', '; + @Input() property: CardViewTextItemModel; @@ -40,12 +44,15 @@ export class CardViewTextItemComponent implements OnChanges { inEdit: boolean = false; editedValue: string; errorMessages: string[]; + valueSeparator: string; - constructor(private cardViewUpdateService: CardViewUpdateService) { + constructor(private cardViewUpdateService: CardViewUpdateService, + private appConfig: AppConfigService) { + this.valueSeparator = this.appConfig.get('content-metadata.multi-value-pipe-separator') || CardViewTextItemComponent.DEFAULT_SEPARATOR; } ngOnChanges(): void { - this.editedValue = this.property.value; + this.editedValue = this.property.multiline ? this.property.displayValue : this.property.value; } showProperty(): boolean { @@ -78,20 +85,29 @@ export class CardViewTextItemComponent implements OnChanges { } reset(): void { - this.editedValue = this.property.value; + this.editedValue = this.property.multiline ? this.property.displayValue : this.property.value; this.setEditMode(false); } update(): void { if (this.property.isValid(this.editedValue)) { - this.cardViewUpdateService.update(this.property, this.editedValue); - this.property.value = this.editedValue; + const updatedValue = this.prepareValueForUpload(this.property, this.editedValue); + this.cardViewUpdateService.update(this.property, updatedValue); + this.property.value = updatedValue; this.setEditMode(false); } else { this.errorMessages = this.property.getValidationErrors(this.editedValue); } } + prepareValueForUpload(property: CardViewTextItemModel, value: string): string | string [] { + const listOfValues = value; + if (property.multivalued) { + return listOfValues.split(this.valueSeparator); + } + return listOfValues; + } + onTextAreaInputChange() { this.errorMessages = this.property.getValidationErrors(this.editedValue); } diff --git a/lib/core/card-view/interfaces/card-view-textitem-properties.interface.ts b/lib/core/card-view/interfaces/card-view-textitem-properties.interface.ts index d80fa18d1e..511271e8d3 100644 --- a/lib/core/card-view/interfaces/card-view-textitem-properties.interface.ts +++ b/lib/core/card-view/interfaces/card-view-textitem-properties.interface.ts @@ -20,6 +20,7 @@ import { CardViewTextItemPipeProperty } from './card-view-textitem-pipe-property export interface CardViewTextItemProperties extends CardViewItemProperties { multiline?: boolean; + multivalued?: boolean; pipes?: CardViewTextItemPipeProperty[]; clickCallBack?: any; } diff --git a/lib/core/card-view/models/card-view-textitem.model.ts b/lib/core/card-view/models/card-view-textitem.model.ts index 32a6acabb0..22de7d0b23 100644 --- a/lib/core/card-view/models/card-view-textitem.model.ts +++ b/lib/core/card-view/models/card-view-textitem.model.ts @@ -23,12 +23,14 @@ import { CardViewTextItemPipeProperty, CardViewTextItemProperties } from '../int export class CardViewTextItemModel extends CardViewBaseItemModel implements CardViewItem, DynamicComponentModel { type: string = 'text'; multiline?: boolean; + multivalued?: boolean; pipes?: CardViewTextItemPipeProperty[]; clickCallBack?: any; constructor(cardViewTextItemProperties: CardViewTextItemProperties) { super(cardViewTextItemProperties); this.multiline = !!cardViewTextItemProperties.multiline; + this.multivalued = !!cardViewTextItemProperties.multivalued; this.pipes = cardViewTextItemProperties.pipes || []; this.clickCallBack = cardViewTextItemProperties.clickCallBack ? cardViewTextItemProperties.clickCallBack : null; } diff --git a/lib/core/pipes/multi-value.pipe.spec.ts b/lib/core/pipes/multi-value.pipe.spec.ts new file mode 100644 index 0000000000..acc3ce103c --- /dev/null +++ b/lib/core/pipes/multi-value.pipe.spec.ts @@ -0,0 +1,66 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MultiValuePipe } from './multi-value.pipe'; +import { TestBed } from '@angular/core/testing'; +import { setupTestBed } from 'core'; +import { CoreTestingModule } from 'core/testing/core.testing.module'; + +describe('FullNamePipe', () => { + + let pipe: MultiValuePipe; + + setupTestBed({ + imports: [CoreTestingModule] + }); + + beforeEach(() => { + pipe = TestBed.get(MultiValuePipe); + + }); + + it('should add the separator when a list is provided', () => { + const values = ['cat', 'house', 'dog']; + expect(pipe.transform(values)).toBe('cat, house, dog'); + }); + + it('should add custom separator when set', () => { + const values = ['cat', 'house', 'dog']; + const customSeparator = ' - '; + expect(pipe.transform(values, customSeparator)).toBe('cat - house - dog'); + }); + + it('should not add separator when the list has only one item', () => { + const values = ['cat']; + expect(pipe.transform(values)).toBe('cat'); + }); + + it('should return empty string when an empty list is passed', () => { + const values = []; + expect(pipe.transform(values)).toBe(''); + }); + + it('should return empty string when an empty string is passed', () => { + const values = ''; + expect(pipe.transform(values)).toBe(''); + }); + + it('should return same string when the value passed is a string', () => { + const values = 'cat'; + expect(pipe.transform(values)).toBe('cat'); + }); +}); diff --git a/lib/core/pipes/multi-value.pipe.ts b/lib/core/pipes/multi-value.pipe.ts new file mode 100644 index 0000000000..a75a2959f0 --- /dev/null +++ b/lib/core/pipes/multi-value.pipe.ts @@ -0,0 +1,34 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'multiValue' }) +export class MultiValuePipe implements PipeTransform { + + static DEFAULT_SEPARATOR = ', '; + + transform(values: string | string [], valueSeparator: string = MultiValuePipe.DEFAULT_SEPARATOR): string { + + if (values && values instanceof Array) { + values.map((value) => value.trim()); + return values.join(valueSeparator); + } + + return values; + } +} diff --git a/lib/core/pipes/pipe.module.ts b/lib/core/pipes/pipe.module.ts index 2bd70806eb..8d1311671f 100644 --- a/lib/core/pipes/pipe.module.ts +++ b/lib/core/pipes/pipe.module.ts @@ -27,6 +27,7 @@ import { InitialUsernamePipe } from './user-initial.pipe'; import { FullNamePipe } from './full-name.pipe'; import { FormatSpacePipe } from './format-space.pipe'; import { FileTypePipe } from './file-type.pipe'; +import { MultiValuePipe } from './multi-value.pipe'; @NgModule({ imports: [ @@ -41,7 +42,8 @@ import { FileTypePipe } from './file-type.pipe'; FullNamePipe, NodeNameTooltipPipe, FormatSpacePipe, - FileTypePipe + FileTypePipe, + MultiValuePipe ], providers: [ FileSizePipe, @@ -51,7 +53,8 @@ import { FileTypePipe } from './file-type.pipe'; InitialUsernamePipe, NodeNameTooltipPipe, FormatSpacePipe, - FileTypePipe + FileTypePipe, + MultiValuePipe ], exports: [ FileSizePipe, @@ -62,7 +65,8 @@ import { FileTypePipe } from './file-type.pipe'; FullNamePipe, NodeNameTooltipPipe, FormatSpacePipe, - FileTypePipe + FileTypePipe, + MultiValuePipe ] }) export class PipeModule { diff --git a/lib/core/pipes/public-api.ts b/lib/core/pipes/public-api.ts index a40350bacf..9746057417 100644 --- a/lib/core/pipes/public-api.ts +++ b/lib/core/pipes/public-api.ts @@ -22,5 +22,6 @@ export * from './text-highlight.pipe'; export * from './time-ago.pipe'; export * from './user-initial.pipe'; export * from './full-name.pipe'; +export * from './multi-value.pipe'; export * from './pipe.module';