@pacem/pacem-cms 1.0.0-bessel → 1.0.0-dirac
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/pacem-cms.js +118 -3
- package/dist/browser/pacem-cms.js.map +1 -1
- package/dist/browser/pacem-cms.min.js +1 -1
- package/dist/bundle/pacem-cms.min.mjs +1 -1
- package/dist/bundle/pacem-cms.mjs +17 -1
- package/dist/bundle/pacem-cms.mjs.map +2 -2
- package/dist/docs/pacem-cms.json +9325 -0
- package/dist/esm/index-iife.js +1 -1
- package/dist/esm/index.cms.js +1 -1
- package/dist/esm/index.components.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/types.js +9 -1
- package/package.json +2 -1
- package/typings/index.d.ts +178 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pacem/pacem-cms v1.0.0-
|
|
2
|
+
* @pacem/pacem-cms v1.0.0-dirac (https://js.pacem.it)
|
|
3
3
|
* Pacem (https://pacem.it)
|
|
4
4
|
* Licensed under Apache-2.0
|
|
5
5
|
*/
|
|
@@ -33,7 +33,14 @@
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Default metadata ('expression' field) 'type' factory: renders a `${P}-expression` field bound to the
|
|
38
|
+
* given entity's `prop` attribute (or, for plain objects, the property itself), relaying value changes back
|
|
39
|
+
* through {@link Functions.handleExpressionValueChange} and honoring the field's `extra.selector`/`filter`/`labeler`.
|
|
40
|
+
* @param host The form field element requesting the markup.
|
|
41
|
+
* @param hostRef Binding-expression reference to `host` (defaults to `:host`).
|
|
42
|
+
* @param hostEntityRef Binding-expression reference to `host.entity` (defaults to `:host.entity`).
|
|
43
|
+
*/
|
|
37
44
|
const EXPRESSION_METADATA_TYPE = (host, hostRef = ':host', hostEntityRef = ':host.entity') => {
|
|
38
45
|
const attrs = {}, meta = host.metadata, fns = Functions, fnKeys = [];
|
|
39
46
|
attrs['value'] = `{{ ${hostEntityRef} instanceof HTMLElement && ${hostEntityRef}.getAttribute('${pacemCore.CustomElementUtils.camelToKebab(meta.prop)}') }}`;
|
|
@@ -82,6 +89,11 @@
|
|
|
82
89
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
83
90
|
};
|
|
84
91
|
//namespace Pacem.Components.Cms {
|
|
92
|
+
/**
|
|
93
|
+
* Base class for form fields that let the user pick an `Element` from the current document, filtered by
|
|
94
|
+
* `selector`/`filter` and displayed through `labeler`. See {@link PacemElementPickerElement} for the concrete
|
|
95
|
+
* `${P}-select`-backed implementation.
|
|
96
|
+
*/
|
|
85
97
|
class PacemElementPickerElementBase extends pacemScaffolding.Components.Scaffolding.PacemBaseElement {
|
|
86
98
|
}
|
|
87
99
|
__decorate$e([
|
|
@@ -93,6 +105,7 @@
|
|
|
93
105
|
__decorate$e([
|
|
94
106
|
pacemCore.Watch({ converter: pacemCore.PropertyConverters.Eval })
|
|
95
107
|
], PacemElementPickerElementBase.prototype, "labeler", void 0);
|
|
108
|
+
/** Form field for picking an `Element` (identified by its `id`) among those matching `selector`/`filter`, listed in a `${P}-select`. */
|
|
96
109
|
let PacemElementPickerElement = class PacemElementPickerElement extends PacemElementPickerElementBase {
|
|
97
110
|
get inputFields() {
|
|
98
111
|
return [this._select];
|
|
@@ -169,12 +182,18 @@
|
|
|
169
182
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
170
183
|
};
|
|
171
184
|
//namespace Pacem.Components.Cms {
|
|
185
|
+
/** The kind of value a {@link PacemExpressionElement} is currently editing, as picked in its source selector. */
|
|
172
186
|
var ExpressionSource;
|
|
173
187
|
(function (ExpressionSource) {
|
|
174
188
|
ExpressionSource["Constant"] = "const";
|
|
175
189
|
ExpressionSource["PropertyReference"] = "property";
|
|
176
190
|
ExpressionSource["Expression"] = "expr";
|
|
177
191
|
})(ExpressionSource || (ExpressionSource = {}));
|
|
192
|
+
/**
|
|
193
|
+
* Form field for building a Pacem binding-expression string, either as a plain constant, a picked
|
|
194
|
+
* element/property reference (via {@link PacemElementPickerElementBase}), or a free-hand expression typed
|
|
195
|
+
* into an inner `${P}-textarea`; a live preview of the evaluated `value` is shown alongside the field.
|
|
196
|
+
*/
|
|
178
197
|
let PacemExpressionElement = class PacemExpressionElement extends PacemElementPickerElementBase {
|
|
179
198
|
propertyChangedCallback(name, old, val, first) {
|
|
180
199
|
super.propertyChangedCallback(name, old, val, first);
|
|
@@ -401,6 +420,12 @@
|
|
|
401
420
|
const css = p.display.cssClass = pacemCore.Utils.isArray(p.display.cssClass) && p.display.cssClass || [];
|
|
402
421
|
css.push(pacemCore.PCSS + '-cell');
|
|
403
422
|
}
|
|
423
|
+
/**
|
|
424
|
+
* Adds the `${PCSS}-cell`/grid CSS classes to `metadata`'s display and to each of its properties' display,
|
|
425
|
+
* so that a generated form lays its fields out as grid cells (used for the datacolumns/fetch-parameters
|
|
426
|
+
* sub-grids editors, as opposed to {@link buildWidgetMetadata} which is used for a widget's own root metadata).
|
|
427
|
+
* @param metadata The metadata to adapt; defaults to an empty `{ props: [] }`-like metadata when omitted.
|
|
428
|
+
*/
|
|
404
429
|
function gridifyMetadata(metadata) {
|
|
405
430
|
var props = metadata && metadata.props || [];
|
|
406
431
|
var display = metadata && metadata.display || { name: 'Element' };
|
|
@@ -411,6 +436,11 @@
|
|
|
411
436
|
props.forEach(cellifyMetadata);
|
|
412
437
|
return { display: display, props: props };
|
|
413
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* Merges `metadata` on top of {@link DEFAULT_METADATA} (the common `tag` property/display), cellifying every
|
|
441
|
+
* resulting property's display (see `cellifyMetadata`); used by widget constructors to build their `metadata`.
|
|
442
|
+
* @param metadata Widget-specific metadata to merge on top of the defaults.
|
|
443
|
+
*/
|
|
414
444
|
function buildWidgetMetadata(metadata) {
|
|
415
445
|
var display = pacemCore.Utils.extend({}, DEFAULT_METADATA.display, metadata && metadata.display || {});
|
|
416
446
|
var props = pacemCore.Utils.clone(DEFAULT_METADATA.props);
|
|
@@ -434,6 +464,7 @@
|
|
|
434
464
|
return (e.metadata && e.metadata.display && e.metadata.display.name || '') + '#' + e.id;
|
|
435
465
|
}
|
|
436
466
|
};
|
|
467
|
+
/** Static lookup helper for {@link PacemWidgetElement} instances in the current document. */
|
|
437
468
|
class Widget {
|
|
438
469
|
/**
|
|
439
470
|
* Utility method for widget gathering.
|
|
@@ -443,6 +474,7 @@
|
|
|
443
474
|
return pacemCore.CustomElementUtils.findAll('.' + WIDGET_CSS_CLASS, (widget) => widget instanceof PacemWidgetElement && !pacemCore.Utils.isNullOrEmpty(widget.id) && (pacemCore.Utils.isNull(predicate) || predicate(widget)));
|
|
444
475
|
}
|
|
445
476
|
}
|
|
477
|
+
/** Floating toolbar (edit/permissions/remove buttons), shown by a {@link PacemWidgetElement}'s balloon while `editing`, that opens the widget's core/permissions edit forms. */
|
|
446
478
|
let PacemWidgetToolbarElement = class PacemWidgetToolbarElement extends pacemCore.Components.PacemElement {
|
|
447
479
|
/** Gets the toolbar's edit button. */
|
|
448
480
|
get editButton() {
|
|
@@ -512,9 +544,16 @@
|
|
|
512
544
|
</${pacemCore.P}-shell-proxy>`
|
|
513
545
|
})
|
|
514
546
|
], PacemWidgetToolbarElement);
|
|
547
|
+
/**
|
|
548
|
+
* Base class for CMS widgets: assigns each instance a stable `id`, exposes an `editing`/`editable` toggle
|
|
549
|
+
* backed by a hover-triggered {@link PacemWidgetToolbarElement} balloon (edit/permissions/remove actions),
|
|
550
|
+
* and carries the `metadata`/`permissionMetadata`/`permissions` used to scaffold its editing forms. See
|
|
551
|
+
* {@link PacemUiWidgetElement} and {@link PacemBearerWidgetElement} for further specialized bases.
|
|
552
|
+
*/
|
|
515
553
|
class PacemWidgetElement extends pacemCore.Components.PacemElement {
|
|
516
554
|
constructor(metadata, role = 'widget') {
|
|
517
555
|
super(role);
|
|
556
|
+
/** Gets or sets the scaffolding metadata describing the widget's permission-editing form. */
|
|
518
557
|
this.permissionMetadata = DEFAULT_PERMISSION_METADATA;
|
|
519
558
|
this.metadata = metadata;
|
|
520
559
|
}
|
|
@@ -619,6 +658,7 @@
|
|
|
619
658
|
}
|
|
620
659
|
]
|
|
621
660
|
};
|
|
661
|
+
/** Non-visual helper widget exposing an arbitrary `model` object, typically referenced as a data source by other widgets/expressions. */
|
|
622
662
|
let PacemWidgetDataElement = class PacemWidgetDataElement extends PacemWidgetElement {
|
|
623
663
|
constructor() {
|
|
624
664
|
super(buildWidgetMetadata(DATA_METADATA$1));
|
|
@@ -681,6 +721,7 @@
|
|
|
681
721
|
]
|
|
682
722
|
};
|
|
683
723
|
const PARAMETER_TAGNAME = pacemCore.P + '-widget-fetch-parameter';
|
|
724
|
+
/** A single, named fetch parameter nested under a {@link PacemWidgetFetchElement}; setting `value` re-triggers the owning fetcher's `fetch()`. */
|
|
684
725
|
let PacemWidgetFetchParameterElement = class PacemWidgetFetchParameterElement extends pacemCore.PacemEventTarget {
|
|
685
726
|
propertyChangedCallback(name, old, val, first) {
|
|
686
727
|
super.propertyChangedCallback(name, old, val.first);
|
|
@@ -708,6 +749,11 @@
|
|
|
708
749
|
PacemWidgetFetchParameterElement = __decorate$a([
|
|
709
750
|
pacemCore.CustomElement({ tagName: PARAMETER_TAGNAME })
|
|
710
751
|
], PacemWidgetFetchParameterElement);
|
|
752
|
+
/**
|
|
753
|
+
* Non-visual helper widget that fetches data from a REST endpoint chosen from a {@link PacemWidgetApiManifestElement}
|
|
754
|
+
* `manifest`, using its nested {@link PacemWidgetFetchParameterElement} children (see `_parameters`) as request
|
|
755
|
+
* parameters; the response is exposed as `result`.
|
|
756
|
+
*/
|
|
711
757
|
let PacemWidgetFetchElement = class PacemWidgetFetchElement extends PacemBearerWidgetElement {
|
|
712
758
|
constructor() {
|
|
713
759
|
super(buildWidgetMetadata(FETCH_METADATA));
|
|
@@ -724,6 +770,7 @@
|
|
|
724
770
|
get _parameters() {
|
|
725
771
|
return Array.from(this._itemsElement.children).filter(e => e.localName === PARAMETER_TAGNAME);
|
|
726
772
|
}
|
|
773
|
+
/** Triggers the request against `endpoint`/`url`, provided all of the endpoint's required parameters are attached and populated; otherwise does nothing. */
|
|
727
774
|
fetch() {
|
|
728
775
|
const fetcher = this._fetcher, parameters = this._parameters || [], endpoint = this.endpoint;
|
|
729
776
|
if (!pacemCore.Utils.isNull(endpoint)) {
|
|
@@ -860,9 +907,15 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
860
907
|
prop: 'accessToken', type: EXPRESSION_METADATA_TYPE, display: { name: 'Access Token' },
|
|
861
908
|
extra: pacemCore.Utils.extend({}, EXPRESSION_WIDGET_METADATA_EXTRA, { filter: (e) => e instanceof PacemWidgetDataElement || e instanceof PacemWidgetFetchElement })
|
|
862
909
|
};
|
|
910
|
+
/**
|
|
911
|
+
* Base class for widgets that authenticate their own fetch requests with a bearer `accessToken` (turned into
|
|
912
|
+
* an `Authorization: Bearer ...` header on `fetchHeaders`). See {@link PacemWidgetApiManifestElement} and
|
|
913
|
+
* {@link PacemWidgetFetchElement} for the concrete implementations.
|
|
914
|
+
*/
|
|
863
915
|
class PacemBearerWidgetElement extends PacemWidgetElement {
|
|
864
916
|
constructor() {
|
|
865
917
|
super(...arguments);
|
|
918
|
+
/** Gets or sets the `credentials` mode used for the widget's fetch requests. */
|
|
866
919
|
this.fetchCredentials = 'same-origin';
|
|
867
920
|
}
|
|
868
921
|
propertyChangedCallback(name, old, val, first) {
|
|
@@ -897,6 +950,7 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
897
950
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
898
951
|
};
|
|
899
952
|
//namespace Pacem.Components.Cms {
|
|
953
|
+
/** Non-visual helper widget, reserved for translation-related composition (no widget-specific behavior beyond {@link PacemWidgetElement}). */
|
|
900
954
|
let PacemWidgetTranslatorElement = class PacemWidgetTranslatorElement extends PacemWidgetElement {
|
|
901
955
|
};
|
|
902
956
|
PacemWidgetTranslatorElement = __decorate$8([
|
|
@@ -927,9 +981,11 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
927
981
|
}
|
|
928
982
|
]
|
|
929
983
|
};
|
|
984
|
+
/** Non-visual helper widget exposing the current timestamp (`time`), refreshed every `interval` milliseconds by an internal `${P}-timer`. */
|
|
930
985
|
let PacemWidgetClockElement = class PacemWidgetClockElement extends PacemWidgetElement {
|
|
931
986
|
constructor() {
|
|
932
987
|
super(buildWidgetMetadata(DATA_METADATA));
|
|
988
|
+
/** Gets or sets the tick interval, in milliseconds, at which `time` is refreshed. */
|
|
933
989
|
this.interval = 0;
|
|
934
990
|
}
|
|
935
991
|
};
|
|
@@ -948,11 +1004,23 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
948
1004
|
/// <reference path="./swagger-types.d.ts" />
|
|
949
1005
|
//namespace Pacem.Cms.OpenApi {
|
|
950
1006
|
const BAG = 'pacem:metadatabag';
|
|
1007
|
+
/**
|
|
1008
|
+
* Loads an OpenApi manifest (via the underlying {@link Scaffolding.OpenApi.OpenApiParser}) and eagerly
|
|
1009
|
+
* enriches every endpoint's request/response schemas into scaffolding-ready {@link Scaffolding.OpenApi.DataField}
|
|
1010
|
+
* metadata (fetched from each schema's absolute-url definition key, recursively for nested `$ref`s), optionally
|
|
1011
|
+
* caching the per-url metadata fetches through `cache`.
|
|
1012
|
+
*/
|
|
951
1013
|
class SwaggerCmsParser {
|
|
952
1014
|
constructor(_openApi = new pacemScaffolding.Scaffolding.OpenApi.OpenApiParser()) {
|
|
953
1015
|
this._openApi = _openApi;
|
|
954
1016
|
this._cachedMetadataUrls = [];
|
|
955
1017
|
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Loads the OpenApi manifest at `url` and enriches every endpoint's request/response schemas with their
|
|
1020
|
+
* fetched field metadata (see `_enrichSchemas`).
|
|
1021
|
+
* @param url The OpenApi (swagger) json configuration's url.
|
|
1022
|
+
* @param headers Optional HTTP headers for both the manifest and the per-schema metadata fetches.
|
|
1023
|
+
*/
|
|
956
1024
|
async load(url, headers) {
|
|
957
1025
|
let api = await this._openApi.load(url, headers);
|
|
958
1026
|
if (api != null) {
|
|
@@ -978,6 +1046,7 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
978
1046
|
}
|
|
979
1047
|
}
|
|
980
1048
|
}
|
|
1049
|
+
/** Removes from `cache` every metadata entry fetched by this parser so far. */
|
|
981
1050
|
clearCache() {
|
|
982
1051
|
const cache = this.cache, keys = this._cachedMetadataUrls;
|
|
983
1052
|
if (cache) {
|
|
@@ -1096,6 +1165,7 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1096
1165
|
ACCESS_TOKEN_METADATA
|
|
1097
1166
|
]
|
|
1098
1167
|
};
|
|
1168
|
+
/** Non-visual helper widget that parses an OpenApi document at `url` (via {@link SwaggerCmsParser}) into a `manifest`, typically referenced by a {@link PacemWidgetFetchElement}. */
|
|
1099
1169
|
let PacemWidgetApiManifestElement = class PacemWidgetApiManifestElement extends PacemBearerWidgetElement {
|
|
1100
1170
|
constructor(_openapi = new SwaggerCmsParser(), _cache = new pacemCore.Storage()) {
|
|
1101
1171
|
super(buildWidgetMetadata(APIMANIFEST_METADATA));
|
|
@@ -1154,6 +1224,10 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1154
1224
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1155
1225
|
};
|
|
1156
1226
|
//namespace Pacem.Components.Cms {
|
|
1227
|
+
/**
|
|
1228
|
+
* Base class for widgets that occupy a cell of a CSS grid-based layout (`column`/`row`/`colspan`/`rowspan`),
|
|
1229
|
+
* self-registering into the nearest ancestor {@link PacemCompositeWidgetElement} container (see `findContainer`).
|
|
1230
|
+
*/
|
|
1157
1231
|
class PacemUiWidgetElement extends PacemWidgetElement {
|
|
1158
1232
|
constructor(metadata, colspan = 1, role) {
|
|
1159
1233
|
super(metadata, role);
|
|
@@ -1234,20 +1308,25 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1234
1308
|
const WidgetRegisterEventName = "widgetregister";
|
|
1235
1309
|
const WidgetUnregisterEventName = "widgetunregister";
|
|
1236
1310
|
const LayoutChangeEventName = "layoutchange";
|
|
1311
|
+
/** Dispatched by a {@link PacemCompositeWidgetElement} right after a child widget is successfully registered into it. */
|
|
1237
1312
|
class WidgetRegisterEvent extends CustomEvent {
|
|
1238
1313
|
constructor(item, eventInit) {
|
|
1239
1314
|
super(WidgetRegisterEventName, pacemCore.Utils.extend(eventInit || {}, { detail: item }));
|
|
1240
1315
|
}
|
|
1241
1316
|
}
|
|
1317
|
+
/** Dispatched by a {@link PacemCompositeWidgetElement} right after a child widget is unregistered from it. */
|
|
1242
1318
|
class WidgetUnregisterEvent extends CustomEvent {
|
|
1243
1319
|
constructor(item, eventInit) {
|
|
1244
1320
|
super(WidgetUnregisterEventName, pacemCore.Utils.extend(eventInit || {}, { detail: item }));
|
|
1245
1321
|
}
|
|
1246
1322
|
}
|
|
1323
|
+
/** Base class for widgets that act as a container ({@link CompositeWidget}) for other {@link PacemUiWidgetElement} widgets. See {@link PacemGridWidgetElement} and `PacemWidgetPickerElement` for concrete implementations. */
|
|
1247
1324
|
class PacemCompositeWidgetElement extends PacemUiWidgetElement {
|
|
1325
|
+
/** Gets the `Element` new items are appended to; defaults to this widget itself. */
|
|
1248
1326
|
get itemsElement() {
|
|
1249
1327
|
return this;
|
|
1250
1328
|
}
|
|
1329
|
+
/** Gets whether `item` is an acceptable child of this container; overridable by subclasses to narrow the accepted item type. */
|
|
1251
1330
|
validate(item) {
|
|
1252
1331
|
return item instanceof PacemUiWidgetElement;
|
|
1253
1332
|
}
|
|
@@ -1319,6 +1398,7 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1319
1398
|
prop: 'text', type: EXPRESSION_METADATA_TYPE, display: { name: 'Text' }, extra: EXPRESSION_WIDGET_METADATA_EXTRA
|
|
1320
1399
|
}]
|
|
1321
1400
|
});
|
|
1401
|
+
/** UI widget rendering a plain (optionally expression-bound) piece of text via an inner `${P}-text`. */
|
|
1322
1402
|
let PacemWidgetTextElement = class PacemWidgetTextElement extends PacemUiWidgetElement {
|
|
1323
1403
|
constructor() {
|
|
1324
1404
|
super(TEXT_METADATA);
|
|
@@ -1441,6 +1521,12 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1441
1521
|
}
|
|
1442
1522
|
]
|
|
1443
1523
|
};
|
|
1524
|
+
/**
|
|
1525
|
+
* Composition widget that lays out child {@link PacemUiWidgetElement} widgets in a CSS grid: on `register`
|
|
1526
|
+
* it finds a free spot (or grows the grid) for the new item's `column`/`row`/`colspan`/`rowspan`, and while
|
|
1527
|
+
* `editing` it enables drag-move/resize behaviors (backed by internal `${P}-drag-drop`/`${P}-rescale`
|
|
1528
|
+
* elements) plus an overlay of selectable grid-cell boxes.
|
|
1529
|
+
*/
|
|
1444
1530
|
let PacemGridWidgetElement = class PacemGridWidgetElement extends PacemCompositeWidgetElement {
|
|
1445
1531
|
constructor() {
|
|
1446
1532
|
super(buildWidgetMetadata(GRID_METADATA), FALLBACK_COLUMNS, "grid");
|
|
@@ -1757,7 +1843,14 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1757
1843
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1758
1844
|
};
|
|
1759
1845
|
//namespace Pacem.Components.Cms {
|
|
1760
|
-
/**
|
|
1846
|
+
/**
|
|
1847
|
+
* Default metadata ('expression' field) 'type' factory: renders a `${P}-datacolumns` field bound to the
|
|
1848
|
+
* given entity's `prop` (via `extra.properties`, either a property name or a factory function), used to
|
|
1849
|
+
* edit the field's underlying {@link DataColumn}[] value.
|
|
1850
|
+
* @param host The form field element requesting the markup.
|
|
1851
|
+
* @param hostRef Binding-expression reference to `host` (defaults to `:host`).
|
|
1852
|
+
* @param hostEntityRef Binding-expression reference to `host.entity` (defaults to `:host.entity`).
|
|
1853
|
+
*/
|
|
1761
1854
|
const DATACOLUMNS_METADATA_TYPE = (host, hostRef = ':host', hostEntityRef = ':host.entity') => {
|
|
1762
1855
|
const attrs = {}, meta = host.metadata, fns = Functions, fnKeys = [];
|
|
1763
1856
|
attrs['properties'] = `{{ Pacem.CustomElementUtils.getWatchedProperty(${hostEntityRef}, '${meta.prop}').config.converter }}`;
|
|
@@ -1794,6 +1887,7 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1794
1887
|
}
|
|
1795
1888
|
]
|
|
1796
1889
|
};
|
|
1890
|
+
/** Single-column editor (header/content) used by {@link PacemDataColumnsElement}, self-scaffolding its inner `${P}-form` against `DATACOLUMN_METADATA`. */
|
|
1797
1891
|
let PacemDataColumnElement = class PacemDataColumnElement extends pacemCore.Components.PacemElement {
|
|
1798
1892
|
propertyChangedCallback(name, old, val, first) {
|
|
1799
1893
|
super.propertyChangedCallback(name, old, val, first);
|
|
@@ -1830,6 +1924,10 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
1830
1924
|
template: `<${pacemCore.P}-form class="panel-body" autogenerate="true"></${pacemCore.P}-form>`
|
|
1831
1925
|
})
|
|
1832
1926
|
], PacemDataColumnElement);
|
|
1927
|
+
/**
|
|
1928
|
+
* Form field for authoring a list of {@link DataColumn}s (`value`) by drag-dropping entries from the
|
|
1929
|
+
* available `properties` onto the columns strip, each rendered/edited through a nested {@link PacemDataColumnElement}.
|
|
1930
|
+
*/
|
|
1833
1931
|
let PacemDataColumnsElement = class PacemDataColumnsElement extends pacemScaffolding.Components.Scaffolding.PacemBaseElement {
|
|
1834
1932
|
constructor() {
|
|
1835
1933
|
super(...arguments);
|
|
@@ -2026,11 +2124,20 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
2026
2124
|
<template>${body0.innerHTML}</template>
|
|
2027
2125
|
</div></${pacemCore.P}-repeater>`;
|
|
2028
2126
|
}
|
|
2127
|
+
/**
|
|
2128
|
+
* UI widget rendering `datasource` as a CSS-grid-based data table: one `${P}-repeater`-driven row per item,
|
|
2129
|
+
* one head/data cell pair per `columns` entry, with `datarowMetadata` auto-extracted from the first bound
|
|
2130
|
+
* item (see `_extractMetadataJustInCase`) whenever it isn't supplied. Its markup is entirely (re)generated
|
|
2131
|
+
* as plain `innerHTML` (see `datagridInnerHTML`) whenever `columns` changes.
|
|
2132
|
+
*/
|
|
2029
2133
|
let PacemWidgetDataGridElement = class PacemWidgetDataGridElement extends PacemUiWidgetElement {
|
|
2030
2134
|
constructor() {
|
|
2031
2135
|
super(DATAGRID_METADATA);
|
|
2136
|
+
/** Gets or sets the rendered columns (header + per-row content expression); reassigning rebuilds the widget's markup. */
|
|
2032
2137
|
this.columns = [];
|
|
2138
|
+
/** Gets or sets the rows rendered by the grid. */
|
|
2033
2139
|
this.datasource = [];
|
|
2140
|
+
/** Gets or sets the field metadata describing a `datasource` row; auto-extracted from the first bound item when left unset. */
|
|
2034
2141
|
this.datarowMetadata = [];
|
|
2035
2142
|
this._builtUponDatasource = false;
|
|
2036
2143
|
}
|
|
@@ -2166,17 +2273,25 @@ on-${pacemCore.Net.FetchResultEventName}=":host._onresult($event)" on-${pacemCor
|
|
|
2166
2273
|
});
|
|
2167
2274
|
|
|
2168
2275
|
const PermissionEditEventName = 'permissionedit';
|
|
2276
|
+
/** Dispatched to request permission-editing UI for the given {@link Permissible} resource. */
|
|
2169
2277
|
class PermissionEditEvent extends CustomEvent {
|
|
2170
2278
|
constructor(permissible) {
|
|
2171
2279
|
super(PermissionEditEventName, { detail: permissible, cancelable: false, bubbles: true });
|
|
2172
2280
|
}
|
|
2173
2281
|
}
|
|
2282
|
+
/** Static, claim-based authorization checks (edit/read/add/delete/translate) against a {@link Permissible} resource's {@link Permission} list. */
|
|
2174
2283
|
class Permissible {
|
|
2284
|
+
/** Gets whether `claims` grants edit (update) permission on `resource`. */
|
|
2175
2285
|
static canEdit(claims, resource) { return this._canDoSomethingToResource(claims, resource, p => p.update); }
|
|
2286
|
+
/** Gets whether `claims` grants read permission on `resource`. */
|
|
2176
2287
|
static canRead(claims, resource) { return this._canDoSomethingToResource(claims, resource, p => p.read); }
|
|
2288
|
+
/** Gets whether `claims` grants add (create) permission on `resource`. */
|
|
2177
2289
|
static canAdd(claims, resource) { return this._canDoSomethingToResource(claims, resource, p => p.create); }
|
|
2290
|
+
/** Gets whether `claims` grants delete permission on `resource`. */
|
|
2178
2291
|
static canDelete(claims, resource) { return this._canDoSomethingToResource(claims, resource, p => p.delete); }
|
|
2292
|
+
/** Gets whether `claims` grants translate permission on `resource`. */
|
|
2179
2293
|
static canTranslate(claims, resource) { return this._canDoSomethingToResource(claims, resource, p => p.translate); }
|
|
2294
|
+
/** Returns whether `claims` satisfies `predicate` for at least one of `resource.permissions`; when `resource.permissions` is empty, access is unrestricted (returns `true`). */
|
|
2180
2295
|
static _canDoSomethingToResource(claims, resource, predicate) {
|
|
2181
2296
|
if (pacemCore.Utils.isNullOrEmpty(claims) || pacemCore.Utils.isNull(resource)) {
|
|
2182
2297
|
return false;
|