feat: update to version 2.1.0 with central site collection configuration and inheritance support

This commit is contained in:
Torsten Brendgen
2026-07-18 20:42:00 +02:00
parent 0d6da3451d
commit 0b8b752837
17 changed files with 348 additions and 43 deletions

View File

@@ -2,6 +2,8 @@
'use strict';
var FIELD_CUSTOMIZER_ID = 'a555f4fc-d6a6-4421-8189-457449d9bbde';
var SITE_DEFAULTS_PROPERTY = 'PortalSettings.ExpiryIndicator.Defaults';
var WEB_OVERRIDE_PROPERTY = 'PortalSettings.ExpiryIndicator.Override';
var state = { context: null, field: null, config: null, loading: null };
function configuredExpiryField() {
@@ -44,6 +46,10 @@
return String(pageContext().webAbsoluteUrl || '').replace(/\/$/, '');
}
function siteUrl() {
return String(pageContext().siteAbsoluteUrl || webUrl()).replace(/\/$/, '');
}
function listId(context) {
return String((context && context.listName) || pageContext().pageListId || '').replace(/[{}]/g, '');
}
@@ -94,14 +100,55 @@
};
}
function mergeConfig(baseValue, overrideValue) {
var base = baseValue || defaults();
var override = overrideValue || {};
var result = {
baseField: override.baseField || base.baseField || 'Created',
expiryField: override.expiryField || base.expiryField || 'ExpiryDate',
default: {
lifeTime: override.default && override.default.lifeTime ? override.default.lifeTime :
(base.default && base.default.lifeTime ? base.default.lifeTime : { value: 2, unit: 'years' }),
columnRule: override.default && override.default.columnRule instanceof Array ? override.default.columnRule :
(base.default && base.default.columnRule instanceof Array ? base.default.columnRule : [])
},
rules: override.rules instanceof Array ? override.rules : (base.rules instanceof Array ? base.rules : []),
nullText: typeof override.nullText === 'string' ? override.nullText : base.nullText,
confirmExtension: typeof override.confirmExtension === 'boolean' ? override.confirmExtension : base.confirmExtension
};
return result;
}
function propertyValue(payload, key) {
var properties = payload && payload.d ? payload.d : (payload || {});
for (var name in properties) {
if (Object.prototype.hasOwnProperty.call(properties, name) && name.toLowerCase() === key.toLowerCase()) {
try { return typeof properties[name] === 'string' ? JSON.parse(properties[name]) : properties[name]; }
catch (ignore) { return null; }
}
}
return null;
}
function isBindingOnly(value) {
if (!value || typeof value !== 'object') { return false; }
return typeof value.expiryField === 'string' && !value.default && !value.rules &&
!value.baseField && typeof value.nullText === 'undefined' && typeof value.confirmExtension === 'undefined';
}
function loadConfig(context) {
var id = listId(context);
if (!id) { return Promise.reject(new Error('Keine Liste erkannt.')); }
if (state.loading && state.context === id) { return state.loading; }
state.context = id;
state.loading = request('GET', listUrl(id) +
'/fields?$select=Id,InternalName,ClientSideComponentId,ClientSideComponentProperties')
.then(function (data) {
var fieldRequest = request('GET', listUrl(id) +
'/fields?$select=Id,InternalName,ClientSideComponentId,ClientSideComponentProperties');
var sitePropertiesRequest = request('GET', siteUrl() + '/_api/web/AllProperties').catch(function () { return {}; });
var webPropertiesRequest = siteUrl().toLowerCase() === webUrl().toLowerCase() ? Promise.resolve({}) :
request('GET', webUrl() + '/_api/web/AllProperties').catch(function () { return {}; });
state.loading = Promise.all([fieldRequest, sitePropertiesRequest, webPropertiesRequest])
.then(function (results) {
var data = results[0];
var fields = data.d ? data.d.results : (data.value || []);
var field;
for (var index = 0; index < fields.length; index++) {
@@ -109,12 +156,18 @@
if (componentId === FIELD_CUSTOMIZER_ID) { field = fields[index]; break; }
}
if (!field) { throw new Error('Kein ExpiryIndicator-Feld gebunden.'); }
var config = defaults(field.InternalName);
var inherited = mergeConfig(defaults(field.InternalName), propertyValue(results[1], SITE_DEFAULTS_PROPERTY));
inherited = mergeConfig(inherited, propertyValue(results[2], WEB_OVERRIDE_PROPERTY));
var config = inherited;
try {
if (field.ClientSideComponentProperties) {
var parsed = JSON.parse(field.ClientSideComponentProperties);
for (var name in parsed) {
if (Object.prototype.hasOwnProperty.call(parsed, name)) { config[name] = parsed[name]; }
if (parsed.inheritSiteDefaults === true || parsed.override || isBindingOnly(parsed)) {
config = mergeConfig(inherited, parsed.override || {});
} else if (parsed.inheritSiteDefaults === false) {
config = mergeConfig(defaults(field.InternalName), parsed.override || {});
} else {
config = mergeConfig(defaults(field.InternalName), parsed);
}
}
} catch (ignore) { }