@alfresco/adf-content-services
Version:
Alfresco ADF content services
108 lines • 17.3 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* 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 { getProperty } from './property-group-reader';
export class LayoutOrientedConfigService {
constructor(config) {
this.config = config;
}
isGroupAllowed(groupName) {
if (this.isIncludeAllEnabled()) {
return true;
}
return this.getMatchingGroups(groupName).length > 0;
}
reorganiseByConfig(propertyGroups) {
const layoutBlocks = this.config.filter((itemsGroup) => itemsGroup.items);
const organisedPropertyGroup = layoutBlocks.map((layoutBlock) => {
const flattenedItems = this.flattenItems(layoutBlock.items);
const properties = flattenedItems.reduce((props, explodedItem) => {
const isProperty = typeof explodedItem.property === 'object';
const propertyName = isProperty ? explodedItem.property.name : explodedItem.property;
let property = getProperty(propertyGroups, explodedItem.groupName, propertyName) || [];
if (isProperty) {
property = this.setPropertyTitle(property, explodedItem.property);
}
property = this.setEditableProperty(property, explodedItem);
return props.concat(property);
}, []);
return {
title: layoutBlock.title,
properties
};
});
return organisedPropertyGroup;
}
appendAllPreset(propertyGroups) {
return Object.keys(propertyGroups).map((groupName) => {
const propertyGroup = propertyGroups[groupName];
const properties = propertyGroup.properties;
return Object.assign({}, propertyGroup, {
properties: Object.keys(properties).map((propertyName) => properties[propertyName])
});
});
}
filterExcludedPreset(propertyGroups) {
let excludedConfig = this.config
.map((config) => config.exclude)
.filter((exclude) => exclude !== undefined)
.flat();
if (excludedConfig === undefined) {
excludedConfig = [];
}
else if (typeof excludedConfig === 'string') {
excludedConfig = [excludedConfig];
}
return propertyGroups.filter((props) => !excludedConfig.includes(props.name));
}
isIncludeAllEnabled() {
const includeAllProperty = this.config.map((config) => config.includeAll).find((includeAll) => includeAll !== undefined);
return includeAllProperty !== undefined ? includeAllProperty : false;
}
setEditableProperty(propertyGroup, itemConfig) {
if (Array.isArray(propertyGroup)) {
propertyGroup.forEach((property) => (property.editable = itemConfig.editable !== undefined ? itemConfig.editable : true));
}
else {
propertyGroup.editable = itemConfig.editable !== undefined ? itemConfig.editable : true;
}
return propertyGroup;
}
setPropertyTitle(item, property) {
if (!Array.isArray(item)) {
return { ...item, ...(item.name === property.name && !!property.title && { title: property.title }) };
}
return item;
}
flattenItems(items) {
return items.reduce((accumulator, item) => {
const properties = Array.isArray(item.properties) ? item.properties : [item.properties];
const flattenedProperties = properties.map((property) => ({
groupName: item.aspect || item.type,
property,
editable: item.editable
}));
return accumulator.concat(flattenedProperties);
}, []);
}
getMatchingGroups(groupName) {
return this.config
.map((layoutBlock) => layoutBlock.items)
.reduce((accumulator, items) => accumulator.concat(items), [])
.filter((item) => item.aspect === groupName || item.type === groupName);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW9yaWVudGVkLWNvbmZpZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9jb250ZW50LW1ldGFkYXRhL3NlcnZpY2VzL2NvbmZpZy9sYXlvdXQtb3JpZW50ZWQtY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBU0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXRELE1BQU0sT0FBTywyQkFBMkI7SUFDcEMsWUFBb0IsTUFBVztRQUFYLFdBQU0sR0FBTixNQUFNLENBQUs7SUFBRyxDQUFDO0lBRTVCLGNBQWMsQ0FBQyxTQUFpQjtRQUNuQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLGtCQUFrQixDQUFDLGNBQXNDO1FBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUUsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRTtnQkFDN0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxZQUFZ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LEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUNuQyxRQUFRO2dCQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUMxQixDQUFDLENBQUMsQ0FBQztZQUVKLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25ELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2IsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2FBQ3ZDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQzdELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgQ29udGVudE1ldGFkYXRhQ29uZmlnLFxuICAgIExheW91dE9yaWVudGVkQ29uZmlnSXRlbSxcbiAgICBPcmdhbmlzZWRQcm9wZXJ0eUdyb3VwLFxuICAgIFByb3BlcnR5R3JvdXBDb250YWluZXIsXG4gICAgUHJvcGVydHlcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb250ZW50LW1ldGFkYXRhLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0UHJvcGVydHkgfSBmcm9tICcuL3Byb3BlcnR5LWdyb3VwLXJlYWRlcic7XG5cbmV4cG9ydCBjbGFzcyBMYXlvdXRPcmllbnRlZENvbmZpZ1NlcnZpY2UgaW1wbGVtZW50cyBDb250ZW50TWV0YWRhdGFDb25maWcge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBhbnkpIHt9XG5cbiAgICBwdWJsaWMgaXNHcm91cEFsbG93ZWQoZ3JvdXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbmNsdWRlQWxsRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXRjaGluZ0dyb3Vwcyhncm91cE5hbWUpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHJlb3JnYW5pc2VCeUNvbmZpZyhwcm9wZXJ0eUdyb3VwczogUHJvcGVydHlHcm91cENvbnRhaW5lcik6IE9yZ2FuaXNlZFByb3BlcnR5R3JvdXBbXSB7XG4gICAgICAgIGNvbnN0IGxheW91dEJsb2NrcyA9IHRoaXMuY29uZmlnLmZpbHRlcigoaXRlbXNHcm91cCkgPT4gaXRlbXNHcm91cC5pdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgb3JnYW5pc2VkUHJvcGVydHlHcm91cCA9IGxheW91dEJsb2Nrcy5tYXAoKGxheW91dEJsb2NrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWRJdGVtcyA9IHRoaXMuZmxhdHRlbkl0ZW1zKGxheW91dEJsb2NrLml0ZW1zKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBmbGF0dGVuZWRJdGVtcy5yZWR1Y2UoKHByb3BzLCBleHBsb2RlZEl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Byb3BlcnR5ID0gdHlwZW9mIGV4cGxvZGVkSXRlbS5wcm9wZXJ0eSA9PT0gJ29iamVjdCc7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gaXNQcm9wZXJ0eSA/IGV4cGxvZGVkSXRlbS5wcm9wZXJ0eS5uYW1lIDogZXhwbG9kZWRJdGVtLnByb3BlcnR5O1xuICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KHByb3BlcnR5R3JvdXBzLCBleHBsb2RlZEl0ZW0uZ3JvdXBOYW1lLCBwcm9wZXJ0eU5hbWUpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5zZXRQcm9wZXJ0eVRpdGxlKHByb3BlcnR5LCBleHBsb2RlZEl0ZW0ucHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IHRoaXMuc2V0RWRpdGFibGVQcm9wZXJ0eShwcm9wZXJ0eSwgZXhwbG9kZWRJdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHMuY29uY2F0KHByb3BlcnR5KTtcbiAgICAgICAgICAgIH0sIFtdKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogbGF5b3V0QmxvY2sudGl0bGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG9yZ2FuaXNlZFByb3BlcnR5R3JvdXA7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGVuZEFsbFByZXNldChwcm9wZXJ0eUdyb3VwczogUHJvcGVydHlHcm91cENvbnRhaW5lcik6IE9yZ2FuaXNlZFByb3BlcnR5R3JvdXBbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0eUdyb3VwcykubWFwKChncm91cE5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5R3JvdXAgPSBwcm9wZXJ0eUdyb3Vwc1tncm91cE5hbWVdO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5R3JvdXAucHJvcGVydGllcztcblxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnR5R3JvdXAsIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKHByb3BlcnR5TmFtZSkgPT4gcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWx0ZXJFeGNsdWRlZFByZXNldChwcm9wZXJ0eUdyb3VwczogT3JnYW5pc2VkUHJvcGVydHlHcm91cFtdKTogT3JnYW5pc2VkUHJvcGVydHlHcm91cFtdIHtcbiAgICAgICAgbGV0IGV4Y2x1ZGVkQ29uZmlnID0gdGhpcy5jb25maWdcbiAgICAgICAgICAgIC5tYXAoKGNvbmZpZykgPT4gY29uZmlnLmV4Y2x1ZGUpXG4gICAgICAgICAgICAuZmlsdGVyKChleGNsdWRlKSA9PiBleGNsdWRlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAuZmxhdCgpO1xuXG4gICAgICAgIGlmIChleGNsdWRlZENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleGNsdWRlZENvbmZpZyA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleGNsdWRlZENvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGV4Y2x1ZGVkQ29uZmlnID0gW2V4Y2x1ZGVkQ29uZmlnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUdyb3Vwcy5maWx0ZXIoKHByb3BzKSA9PiAhZXhjbHVkZWRDb25maWcuaW5jbHVkZXMocHJvcHMubmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0luY2x1ZGVBbGxFbmFibGVkKCkge1xuICAgICAgICBjb25zdCBpbmNsdWRlQWxsUHJvcGVydHkgPSB0aGlzLmNvbmZpZy5tYXAoKGNvbmZpZykgPT4gY29uZmlnLmluY2x1ZGVBbGwpLmZpbmQoKGluY2x1ZGVBbGwpID0+IGluY2x1ZGVBbGwgIT09IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIGluY2x1ZGVBbGxQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkID8gaW5jbHVkZUFsbFByb3BlcnR5IDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRFZGl0YWJsZVByb3BlcnR5KHByb3BlcnR5R3JvdXA6IFByb3BlcnR5IHwgUHJvcGVydHlbXSwgaXRlbUNvbmZpZyk6IFByb3BlcnR5IHwgUHJvcGVydHlbXSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5R3JvdXApKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUdyb3VwLmZvckVhY2goKHByb3BlcnR5KSA9PiAocHJvcGVydHkuZWRpdGFibGUgPSBpdGVtQ29uZmlnLmVkaXRhYmxlICE9PSB1bmRlZmluZWQgPyBpdGVtQ29uZmlnLmVkaXRhYmxlIDogdHJ1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvcGVydHlHcm91cC5lZGl0YWJsZSA9IGl0ZW1Db25maWcuZWRpdGFibGUgIT09IHVuZGVmaW5lZCA/IGl0ZW1Db25maWcuZWRpdGFibGUgOiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5R3JvdXA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0eVRpdGxlKGl0ZW06IFByb3BlcnR5IHwgUHJvcGVydHlbXSwgcHJvcGVydHk6IFByb3BlcnR5KTogUHJvcGVydHkgfCBQcm9wZXJ0eVtdIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtLCAuLi4oaXRlbS5uYW1lID09PSBwcm9wZXJ0eS5uYW1lICYmICEhcHJvcGVydHkudGl0bGUgJiYgeyB0aXRsZTogcHJvcGVydHkudGl0bGUgfSkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZsYXR0ZW5JdGVtcyhpdGVtcykge1xuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2N1bXVsYXRvciwgaXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkoaXRlbS5wcm9wZXJ0aWVzKSA/IGl0ZW0ucHJvcGVydGllcyA6IFtpdGVtLnByb3BlcnRpZXNdO1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gKHtcbiAgICAgICAgICAgICAgICBncm91cE5hbWU6IGl0ZW0uYXNwZWN0IHx8IGl0ZW0udHlwZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBlZGl0YWJsZTogaXRlbS5lZGl0YWJsZVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IuY29uY2F0KGZsYXR0ZW5lZFByb3BlcnRpZXMpO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ0dyb3Vwcyhncm91cE5hbWU6IHN0cmluZyk6IExheW91dE9yaWVudGVkQ29uZmlnSXRlbVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnXG4gICAgICAgICAgICAubWFwKChsYXlvdXRCbG9jaykgPT4gbGF5b3V0QmxvY2suaXRlbXMpXG4gICAgICAgICAgICAucmVkdWNlKChhY2N1bXVsYXRvciwgaXRlbXMpID0+IGFjY3VtdWxhdG9yLmNvbmNhdChpdGVtcyksIFtdKVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5hc3BlY3QgPT09IGdyb3VwTmFtZSB8fCBpdGVtLnR5cGUgPT09IGdyb3VwTmFtZSk7XG4gICAgfVxufVxuIl19