[MNT-22606] Support preset config as input in content-metadata component (#7311)

This commit is contained in:
Pablo Martinez Garcia
2021-10-23 20:25:53 +02:00
committed by GitHub
parent 6861e5320e
commit 9f08d4a3e6
10 changed files with 98 additions and 17 deletions

View File

@@ -19,6 +19,7 @@ import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@
import { Node } from '@alfresco/js-api';
import { ContentService, AllowableOperationsEnum, VersionCompatibilityService } from '@alfresco/adf-core';
import { NodeAspectService } from '../../../aspect-list/node-aspect.service';
import { PresetConfig } from '../../interfaces/content-metadata.interfaces';
@Component({
selector: 'adf-content-metadata-card',
templateUrl: './content-metadata-card.component.html',
@@ -44,11 +45,11 @@ export class ContentMetadataCardComponent implements OnChanges {
@Input()
displayAspect: string = null;
/** (required) Name of the metadata preset, which defines aspects
/** (required) Name or configuration of the metadata preset, which defines aspects
* and their properties.
*/
@Input()
preset: string;
preset: string | PresetConfig;
/** (optional) This flag sets the metadata in read only mode
* preventing changes.

View File

@@ -299,6 +299,30 @@ describe('ContentMetadataComponent', () => {
expect(contentMetadataService.getGroupedProperties).toHaveBeenCalledWith(expectedNode, 'custom-preset');
});
it('should load the group properties when preset config is provided on node change', () => {
const presetConfig = [
{
title: 'My custom preset',
items: [
{
type: 'my:type',
properties: '*'
},
{
aspect: 'my:aspect',
properties: '*'
}
]
}
];
component.preset = presetConfig;
spyOn(contentMetadataService, 'getGroupedProperties');
component.ngOnChanges({ node: new SimpleChange(node, expectedNode, false) });
expect(contentMetadataService.getGroupedProperties).toHaveBeenCalledWith(expectedNode, presetConfig);
});
it('should pass through the loaded group properties to the card view', async () => {
const expectedProperties = [];
component.expanded = true;

View File

@@ -30,7 +30,7 @@ import {
UpdateNotification
} from '@alfresco/adf-core';
import { ContentMetadataService } from '../../services/content-metadata.service';
import { CardViewGroup } from '../../interfaces/content-metadata.interfaces';
import { CardViewGroup, PresetConfig } from '../../interfaces/content-metadata.interfaces';
import { takeUntil, debounceTime, catchError, map } from 'rxjs/operators';
@Component({
@@ -68,9 +68,9 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
@Input()
multi = false;
/** Name of the metadata preset, which defines aspects and their properties */
/** Name or configuration of the metadata preset, which defines aspects and their properties */
@Input()
preset: string;
preset: string | PresetConfig;
/** Toggles whether the metadata properties should be shown */
@Input()

View File

@@ -28,4 +28,6 @@ export * from './services/config/indifferent-config.service';
export * from './services/config/layout-oriented-config.service';
export * from './services/config/aspect-oriented-config.service';
export * from './interfaces/content-metadata.interfaces';
export * from './content-metadata.module';

View File

@@ -51,7 +51,7 @@ export class ContentMetadataConfigFactory {
return this.createConfig(presetConfig);
}
private createConfig(presetConfig: PresetConfig): ContentMetadataConfig {
public createConfig(presetConfig: PresetConfig): ContentMetadataConfig {
let config: ContentMetadataConfig;
if (this.isLayoutOrientedPreset(presetConfig)) {

View File

@@ -273,5 +273,49 @@ describe('ContentMetaDataService', () => {
expect(classesApi.getClass).toHaveBeenCalledTimes(1);
expect(classesApi.getClass).toHaveBeenCalledWith('cm_content');
});
});
});
describe('Provided preset config', () => {
it('should create the metadata config on the fly when preset config is provided', async(done) => {
const fakeNode: Node = <Node> { name: 'Node Action', id: 'fake-id', nodeType: 'cm:content', isFile: true, aspectNames: [] } ;
const customLayoutOrientedScheme = [
{
'id': 'app.content.metadata.customGroup',
'title': 'Exif',
'items': [
{
'id': 'app.content.metadata.exifAspect2',
'aspect': 'exif:exif',
'properties': '*'
}
]
},
{
'id': 'app.content.metadata.customGroup2',
'title': 'Properties',
'items': [
{
'id': 'app.content.metadata.content',
'aspect': 'cm:content',
'properties': '*'
}
]
}
];
spyOn(classesApi, 'getClass').and.returnValue(Promise.resolve(contentResponse));
service.getGroupedProperties(fakeNode, customLayoutOrientedScheme).subscribe(
(res) => {
expect(res.length).toEqual(1);
expect(res[0].title).toEqual('Properties');
done();
}
);
expect(classesApi.getClass).toHaveBeenCalledTimes(1);
expect(classesApi.getClass).toHaveBeenCalledWith('cm_content');
});
});
});

View File

@@ -21,7 +21,7 @@ import { BasicPropertiesService } from './basic-properties.service';
import { Observable, of, iif, Subject } from 'rxjs';
import { PropertyGroupTranslatorService } from './property-groups-translator.service';
import { CardViewItem } from '@alfresco/adf-core';
import { CardViewGroup, OrganisedPropertyGroup } from '../interfaces/content-metadata.interfaces';
import { CardViewGroup, OrganisedPropertyGroup, PresetConfig } from '../interfaces/content-metadata.interfaces';
import { ContentMetadataConfigFactory } from './config/content-metadata-config.factory';
import { PropertyDescriptorsService } from './property-descriptors.service';
import { map, switchMap } from 'rxjs/operators';
@@ -52,14 +52,20 @@ export class ContentMetadataService {
return this.contentTypePropertyService.openContentTypeDialogConfirm(changedProperties.nodeType);
}
getGroupedProperties(node: Node, presetName: string = 'default'): Observable<CardViewGroup[]> {
getGroupedProperties(node: Node, preset: string | PresetConfig = 'default'): Observable<CardViewGroup[]> {
let groupedProperties = of([]);
if (node.aspectNames) {
const contentMetadataConfig = this.contentMetadataConfigFactory.get(presetName),
groupNames = node.aspectNames
.concat(node.nodeType)
.filter((groupName) => contentMetadataConfig.isGroupAllowed(groupName));
let contentMetadataConfig;
if (typeof preset === 'string') {
contentMetadataConfig = this.contentMetadataConfigFactory.get(preset);
} else {
contentMetadataConfig = this.contentMetadataConfigFactory.createConfig(preset);
}
const groupNames = node.aspectNames
.concat(node.nodeType)
.filter((groupName) => contentMetadataConfig.isGroupAllowed(groupName));
if (groupNames.length > 0) {
groupedProperties = this.propertyDescriptorsService.load(groupNames).pipe(