@veloceapps/sdk 7.0.2-16 → 7.0.2-18
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/cms/cms.actions.d.ts +7 -1
- package/cms/components/element-children/element-children.component.d.ts +3 -1
- package/cms/components/preview/preview.types.d.ts +4 -0
- package/cms/injection-tokens.d.ts +1 -3
- package/cms/modules/runtime/services/compilation.service.d.ts +2 -1
- package/cms/plugins/element-hover.plugin.d.ts +2 -0
- package/cms/plugins/script.plugin.d.ts +0 -3
- package/cms/types/common.types.d.ts +2 -2
- package/cms/utils/elements-resolver.d.ts +5 -1
- package/cms/utils/script.utils.d.ts +2 -0
- package/cms/vendor-map.d.ts +1 -2
- package/core/types/ui-definition.types.d.ts +7 -2
- package/esm2020/cms/cms.actions.mjs +11 -2
- package/esm2020/cms/cms.elements.mjs +5 -5
- package/esm2020/cms/components/element-children/element-children.component.mjs +11 -6
- package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +2 -2
- package/esm2020/cms/components/preview/preview.types.mjs +1 -1
- package/esm2020/cms/injection-tokens.mjs +1 -2
- package/esm2020/cms/modules/runtime/services/compilation.service.mjs +3 -3
- package/esm2020/cms/modules/runtime/services/runtime.service.mjs +2 -2
- package/esm2020/cms/plugins/element-hover.plugin.mjs +9 -1
- package/esm2020/cms/plugins/script.plugin.mjs +6 -40
- package/esm2020/cms/services/integration.state.mjs +3 -6
- package/esm2020/cms/types/common.types.mjs +1 -1
- package/esm2020/cms/utils/elements-resolver.mjs +22 -8
- package/esm2020/cms/utils/script.utils.mjs +42 -0
- package/esm2020/core/types/ui-definition.types.mjs +1 -1
- package/esm2020/src/flow-routing.module.mjs +1 -2
- package/fesm2015/veloceapps-sdk-cms.mjs +142 -105
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +0 -1
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +155 -117
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +0 -1
- package/fesm2020/veloceapps-sdk.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ import { InjectionToken, Component, ChangeDetectionStrategy, Inject, Injector, I
|
|
|
4
4
|
import * as rxjs from 'rxjs';
|
|
5
5
|
import { BehaviorSubject, Subject, of, map, tap, switchMap, startWith, distinctUntilChanged, filter, ReplaySubject, noop, take, Observable, takeUntil, forkJoin, catchError, combineLatest } from 'rxjs';
|
|
6
6
|
import * as i2 from '@veloceapps/sdk/core';
|
|
7
|
-
import { ConfigurationService,
|
|
7
|
+
import { ConfigurationService, QuoteDraftService, FlowConfigurationService, LineItemWorker, ProductImagesService, ContextService, lineItemUtils, generateLineItem, getAttributeValue, SdkCoreModule, UI_DEFINITION_VERSION } from '@veloceapps/sdk/core';
|
|
8
8
|
import * as i3 from 'primeng/api';
|
|
9
9
|
import { applyPatch } from 'rfc6902';
|
|
10
10
|
import { getCollectionUniqueName, UUID, isDefined, Operator, Predicate, parseJsonSafely, CoreModule } from '@veloceapps/core';
|
|
@@ -21,8 +21,8 @@ import { DragDropModule } from '@angular/cdk/drag-drop';
|
|
|
21
21
|
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
22
22
|
import * as angularForms from '@angular/forms';
|
|
23
23
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
24
|
-
import { transform } from '@babel/standalone';
|
|
25
24
|
import * as rxjsOperators from 'rxjs/operators';
|
|
25
|
+
import { transform } from '@babel/standalone';
|
|
26
26
|
import { loadRemoteModule } from '@angular-architects/module-federation';
|
|
27
27
|
|
|
28
28
|
var FlowAction;
|
|
@@ -69,16 +69,25 @@ const SwitchObjectAction = (payload) => ({
|
|
|
69
69
|
var CmsAction;
|
|
70
70
|
(function (CmsAction) {
|
|
71
71
|
CmsAction.GO_TO_PAGE = '[CMS]_GO_TO_PAGE';
|
|
72
|
+
CmsAction.UPDATE_CUSTOMIZATION = '[CMS]_UPDATE_CUSTOMIZATION';
|
|
72
73
|
/**
|
|
73
74
|
* Navigate UI definition to a specific page
|
|
74
75
|
*
|
|
75
76
|
* @param pageName name of the page
|
|
76
|
-
* @returns void
|
|
77
77
|
*/
|
|
78
78
|
CmsAction.GoToPage = (pageName) => ({
|
|
79
79
|
type: CmsAction.GO_TO_PAGE,
|
|
80
80
|
payload: { pageName },
|
|
81
81
|
});
|
|
82
|
+
/**
|
|
83
|
+
* Update UI definition customization state
|
|
84
|
+
*
|
|
85
|
+
* @param pageName name of the page
|
|
86
|
+
*/
|
|
87
|
+
CmsAction.UpdateCustomization = (value) => ({
|
|
88
|
+
type: CmsAction.UPDATE_CUSTOMIZATION,
|
|
89
|
+
payload: { value },
|
|
90
|
+
});
|
|
82
91
|
})(CmsAction || (CmsAction = {}));
|
|
83
92
|
|
|
84
93
|
var cmsActions = /*#__PURE__*/Object.freeze({
|
|
@@ -101,7 +110,6 @@ const UI_DEFINITION_METADATA = new InjectionToken('UI_DEFINITION_METADATA_TOKEN'
|
|
|
101
110
|
const ELEMENT_METADATA = new InjectionToken('ELEMENT_METADATA_TOKEN');
|
|
102
111
|
const SHARED_ELEMENT_METADATA = new InjectionToken('SHARED_ELEMENT_METADATA_TOKEN');
|
|
103
112
|
const ELEMENT_CONFIG = new InjectionToken('ELEMENT_CONFIG_TOKEN');
|
|
104
|
-
const VENDOR_MAP = new InjectionToken('VENDOR_MAP');
|
|
105
113
|
|
|
106
114
|
var cmsInjectionTokens = /*#__PURE__*/Object.freeze({
|
|
107
115
|
__proto__: null,
|
|
@@ -109,8 +117,7 @@ var cmsInjectionTokens = /*#__PURE__*/Object.freeze({
|
|
|
109
117
|
ELEMENT_CONFIG: ELEMENT_CONFIG,
|
|
110
118
|
ELEMENT_METADATA: ELEMENT_METADATA,
|
|
111
119
|
SHARED_ELEMENT_METADATA: SHARED_ELEMENT_METADATA,
|
|
112
|
-
UI_DEFINITION_METADATA: UI_DEFINITION_METADATA
|
|
113
|
-
VENDOR_MAP: VENDOR_MAP
|
|
120
|
+
UI_DEFINITION_METADATA: UI_DEFINITION_METADATA
|
|
114
121
|
});
|
|
115
122
|
|
|
116
123
|
class Entity {
|
|
@@ -257,7 +264,7 @@ class RuntimeService {
|
|
|
257
264
|
if (!uiDefinition) {
|
|
258
265
|
return of([]);
|
|
259
266
|
}
|
|
260
|
-
return this.compilationService.compileUIDefinition$(uiDefinition).pipe(map(result => {
|
|
267
|
+
return this.compilationService.compileUIDefinition$(uiDefinition, config).pipe(map(result => {
|
|
261
268
|
this.applicationTree = result.elements;
|
|
262
269
|
this.componentTypes = {
|
|
263
270
|
...this.componentTypes,
|
|
@@ -316,12 +323,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
|
|
|
316
323
|
type: Injectable
|
|
317
324
|
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
318
325
|
|
|
319
|
-
const InitAction = { type: 'INIT' };
|
|
320
|
-
const ClearAction = { type: 'CLEAR' };
|
|
321
326
|
class IntegrationState {
|
|
322
327
|
constructor() {
|
|
323
328
|
this.stateSubj$ = new BehaviorSubject({});
|
|
324
|
-
this.action$ = new
|
|
329
|
+
this.action$ = new Subject();
|
|
325
330
|
}
|
|
326
331
|
get state$() {
|
|
327
332
|
return this.stateSubj$.asObservable();
|
|
@@ -343,7 +348,6 @@ class IntegrationState {
|
|
|
343
348
|
}
|
|
344
349
|
clear() {
|
|
345
350
|
this.stateSubj$.next({});
|
|
346
|
-
this.action$.next(ClearAction);
|
|
347
351
|
}
|
|
348
352
|
}
|
|
349
353
|
IntegrationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: IntegrationState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -864,13 +868,18 @@ class ElementChildrenComponent {
|
|
|
864
868
|
this.destroyed$.next();
|
|
865
869
|
this.destroyed$.complete();
|
|
866
870
|
}
|
|
871
|
+
getFilteredChildren(elements) {
|
|
872
|
+
return this.filter ? this.filter(elements) : elements;
|
|
873
|
+
}
|
|
867
874
|
}
|
|
868
875
|
ElementChildrenComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: ElementChildrenComponent, deps: [{ token: ElementContextService }, { token: RuntimeService }, { token: RuntimeEditorService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
869
|
-
ElementChildrenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: ElementChildrenComponent, selector: "element-children", ngImport: i0, template: "<ng-container *ngIf=\"metadata$ | async as metadata\">\n <vl-element-drop-handle *ngIf=\"dragMode$ | async\" [index]=\"0\" [parentPath]=\"metadata.path\"></vl-element-drop-handle>\n <ng-container *ngFor=\"let child of metadata.children; let i = index\">\n <vl-cms-element-renderer [meta]=\"child\"></vl-cms-element-renderer>\n <vl-element-drop-handle\n *ngIf=\"dragMode$ | async\"\n [index]=\"i + 1\"\n [parentPath]=\"metadata.path\"\n ></vl-element-drop-handle>\n </ng-container>\n</ng-container>\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ElementRendererComponent, selector: "vl-cms-element-renderer", inputs: ["meta"] }, { kind: "component", type: ElementDropHandleComponent, selector: "vl-element-drop-handle", inputs: ["index", "parentPath"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
876
|
+
ElementChildrenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: ElementChildrenComponent, selector: "element-children", inputs: { filter: "filter" }, ngImport: i0, template: "<ng-container *ngIf=\"metadata$ | async as metadata\">\n <vl-element-drop-handle *ngIf=\"dragMode$ | async\" [index]=\"0\" [parentPath]=\"metadata.path\"></vl-element-drop-handle>\n <ng-container *ngFor=\"let child of getFilteredChildren(metadata.children); let i = index\">\n <vl-cms-element-renderer [meta]=\"child\"></vl-cms-element-renderer>\n <vl-element-drop-handle\n *ngIf=\"dragMode$ | async\"\n [index]=\"i + 1\"\n [parentPath]=\"metadata.path\"\n ></vl-element-drop-handle>\n </ng-container>\n</ng-container>\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ElementRendererComponent, selector: "vl-cms-element-renderer", inputs: ["meta"] }, { kind: "component", type: ElementDropHandleComponent, selector: "vl-element-drop-handle", inputs: ["index", "parentPath"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
870
877
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: ElementChildrenComponent, decorators: [{
|
|
871
878
|
type: Component,
|
|
872
|
-
args: [{ selector: 'element-children', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"metadata$ | async as metadata\">\n <vl-element-drop-handle *ngIf=\"dragMode$ | async\" [index]=\"0\" [parentPath]=\"metadata.path\"></vl-element-drop-handle>\n <ng-container *ngFor=\"let child of metadata.children; let i = index\">\n <vl-cms-element-renderer [meta]=\"child\"></vl-cms-element-renderer>\n <vl-element-drop-handle\n *ngIf=\"dragMode$ | async\"\n [index]=\"i + 1\"\n [parentPath]=\"metadata.path\"\n ></vl-element-drop-handle>\n </ng-container>\n</ng-container>\n", styles: [":host{display:contents}\n"] }]
|
|
873
|
-
}], ctorParameters: function () { return [{ type: ElementContextService }, { type: RuntimeService }, { type: RuntimeEditorService }, { type: i0.ChangeDetectorRef }]; }
|
|
879
|
+
args: [{ selector: 'element-children', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"metadata$ | async as metadata\">\n <vl-element-drop-handle *ngIf=\"dragMode$ | async\" [index]=\"0\" [parentPath]=\"metadata.path\"></vl-element-drop-handle>\n <ng-container *ngFor=\"let child of getFilteredChildren(metadata.children); let i = index\">\n <vl-cms-element-renderer [meta]=\"child\"></vl-cms-element-renderer>\n <vl-element-drop-handle\n *ngIf=\"dragMode$ | async\"\n [index]=\"i + 1\"\n [parentPath]=\"metadata.path\"\n ></vl-element-drop-handle>\n </ng-container>\n</ng-container>\n", styles: [":host{display:contents}\n"] }]
|
|
880
|
+
}], ctorParameters: function () { return [{ type: ElementContextService }, { type: RuntimeService }, { type: RuntimeEditorService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { filter: [{
|
|
881
|
+
type: Input
|
|
882
|
+
}] } });
|
|
874
883
|
|
|
875
884
|
class ElementChildrenModule {
|
|
876
885
|
}
|
|
@@ -891,7 +900,7 @@ class ElementToolsPanelComponent {
|
|
|
891
900
|
this.metadata = inject(ELEMENT_METADATA);
|
|
892
901
|
this.config = inject(ELEMENT_CONFIG);
|
|
893
902
|
this.elementRef = inject(ElementRef);
|
|
894
|
-
this.showDeleteButton = !this.config.builder
|
|
903
|
+
this.showDeleteButton = !this.config.builder?.suppressRemovable;
|
|
895
904
|
const hostRect = this.elementRef.nativeElement.parentElement?.getBoundingClientRect();
|
|
896
905
|
if (hostRect) {
|
|
897
906
|
merge(this.elementRef.nativeElement.style, {
|
|
@@ -1001,6 +1010,7 @@ class ElementHoverPlugin {
|
|
|
1001
1010
|
this.destroyed$ = new Subject();
|
|
1002
1011
|
this.mouseOverListenerBound = this.mouseOverListener.bind(this);
|
|
1003
1012
|
this.mouseLeaveListenerBound = this.mouseLeaveListener.bind(this);
|
|
1013
|
+
this.clickListenerBound = this.clickListener.bind(this);
|
|
1004
1014
|
combineLatest([this.runtimeEditorService.editorMode$, this.isHovered$, this.isSelected$])
|
|
1005
1015
|
.pipe(takeUntil(this.destroyed$))
|
|
1006
1016
|
.subscribe(([editorMode]) => {
|
|
@@ -1027,10 +1037,12 @@ class ElementHoverPlugin {
|
|
|
1027
1037
|
attachListeners() {
|
|
1028
1038
|
this.el.nativeElement.addEventListener('mouseover', this.mouseOverListenerBound);
|
|
1029
1039
|
this.el.nativeElement.addEventListener('mouseleave', this.mouseLeaveListenerBound);
|
|
1040
|
+
this.el.nativeElement.addEventListener('click', this.clickListenerBound);
|
|
1030
1041
|
}
|
|
1031
1042
|
detachListeners() {
|
|
1032
1043
|
this.el.nativeElement.removeEventListener('mouseover', this.mouseOverListenerBound);
|
|
1033
1044
|
this.el.nativeElement.removeEventListener('mouseleave', this.mouseLeaveListenerBound);
|
|
1045
|
+
this.el.nativeElement.removeEventListener('click', this.clickListenerBound);
|
|
1034
1046
|
}
|
|
1035
1047
|
mouseOverListener(e) {
|
|
1036
1048
|
const path = e.composedPath();
|
|
@@ -1044,6 +1056,11 @@ class ElementHoverPlugin {
|
|
|
1044
1056
|
this.isHovered$.next(isHovered);
|
|
1045
1057
|
}
|
|
1046
1058
|
}
|
|
1059
|
+
clickListener(e) {
|
|
1060
|
+
if (this.el.nativeElement === e.target) {
|
|
1061
|
+
this.runtimeEditorService.selectedElementPath$.next(this.metadata.path);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1047
1064
|
mouseLeaveListener() {
|
|
1048
1065
|
this.isHovered$.next(false);
|
|
1049
1066
|
}
|
|
@@ -1161,28 +1178,103 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
|
|
|
1161
1178
|
type: Directive
|
|
1162
1179
|
}], ctorParameters: function () { return [{ type: ElementComponent }]; } });
|
|
1163
1180
|
|
|
1181
|
+
const VELOCE_LIBS = {
|
|
1182
|
+
'@veloceapps/core': {
|
|
1183
|
+
isDefined,
|
|
1184
|
+
Operator,
|
|
1185
|
+
Predicate,
|
|
1186
|
+
parseJsonSafely,
|
|
1187
|
+
},
|
|
1188
|
+
'@veloceapps/components': {
|
|
1189
|
+
ToastService,
|
|
1190
|
+
ToastType,
|
|
1191
|
+
},
|
|
1192
|
+
'@veloceapps/api': {
|
|
1193
|
+
SalesforceApiService,
|
|
1194
|
+
QuoteApiService,
|
|
1195
|
+
DocumentTemplatesApiService,
|
|
1196
|
+
DocumentAttachmentApiService,
|
|
1197
|
+
RampApiService,
|
|
1198
|
+
CatalogApiService,
|
|
1199
|
+
DeltaApiService,
|
|
1200
|
+
PicklistsApiService,
|
|
1201
|
+
PriceApiService,
|
|
1202
|
+
ShoppingCartSettingsApiService,
|
|
1203
|
+
ConfigurationSettingsApiService,
|
|
1204
|
+
GuidedSellingApiService,
|
|
1205
|
+
},
|
|
1206
|
+
'@veloceapps/sdk/core': {
|
|
1207
|
+
ConfigurationService,
|
|
1208
|
+
QuoteDraftService,
|
|
1209
|
+
FlowConfigurationService,
|
|
1210
|
+
LineItemWorker,
|
|
1211
|
+
ProductImagesService,
|
|
1212
|
+
ContextService,
|
|
1213
|
+
...lineItemUtils,
|
|
1214
|
+
},
|
|
1215
|
+
'@veloceapps/sdk/cms': {
|
|
1216
|
+
...cmsInjectionTokens,
|
|
1217
|
+
...cmsActions,
|
|
1218
|
+
TemplatesService,
|
|
1219
|
+
IntegrationState,
|
|
1220
|
+
ResourcesService,
|
|
1221
|
+
},
|
|
1222
|
+
};
|
|
1223
|
+
const VELOCE_LIBS_BACKWARDS_COMPATIBLE = Object.entries(VELOCE_LIBS).reduce((trunk, [key, value]) => ({ ...trunk, [key.replace('@veloceapps/', '@veloce/')]: value }), {});
|
|
1224
|
+
const vendorMap = {
|
|
1225
|
+
...VELOCE_LIBS,
|
|
1226
|
+
// TODO: remove when projects/demos are migrated to @veloceapps organization libraries
|
|
1227
|
+
...VELOCE_LIBS_BACKWARDS_COMPATIBLE,
|
|
1228
|
+
'@angular/core': i0,
|
|
1229
|
+
'@angular/forms': angularForms,
|
|
1230
|
+
rxjs: rxjs,
|
|
1231
|
+
'rxjs/operators': rxjsOperators,
|
|
1232
|
+
lodash: lodash,
|
|
1233
|
+
};
|
|
1234
|
+
|
|
1235
|
+
const importRegexp = new RegExp(`import([ \\n\\t]*(?:[^ \\n\\t\\{\\}]+[ \\n\\t]*,?)?(?:[ \\n\\t]*\\{(?:[ \\n\\t]*[^ \\n\\t"'\\{\\}]+[ \\n\\t]*,?)+\\})?[ \\n\\t]*)from[ \\n\\t]*(['"])([^'"\\n]+)(?:['"]);`, 'g');
|
|
1236
|
+
const normalizeImports = (script, elementPath) => {
|
|
1237
|
+
const result = script.replace(importRegexp, (match, g1, g2, src) => {
|
|
1238
|
+
const imports = g1
|
|
1239
|
+
.trim()
|
|
1240
|
+
.slice(1, -1)
|
|
1241
|
+
.split(',')
|
|
1242
|
+
.map(item => item.trim());
|
|
1243
|
+
imports.forEach(item => {
|
|
1244
|
+
if (!vendorMap[src]?.[item]) {
|
|
1245
|
+
throw new Error(`Failed to import ${item} from '${src}' in ${elementPath}/script.ts`);
|
|
1246
|
+
}
|
|
1247
|
+
});
|
|
1248
|
+
return `const ${g1} = vendor['${src}'];`;
|
|
1249
|
+
});
|
|
1250
|
+
return result;
|
|
1251
|
+
};
|
|
1252
|
+
const getScriptClass = (metadata) => {
|
|
1253
|
+
if (!metadata?.script) {
|
|
1254
|
+
return;
|
|
1255
|
+
}
|
|
1256
|
+
const id = btoa(UUID.UUID());
|
|
1257
|
+
const script = document.createElement('script');
|
|
1258
|
+
script.type = `text/javascript`;
|
|
1259
|
+
let scriptContent = normalizeImports(metadata.script, metadata.path);
|
|
1260
|
+
const classMatch = /export class (\S+)/.exec(scriptContent);
|
|
1261
|
+
const className = classMatch?.[1];
|
|
1262
|
+
if (!classMatch || !className) {
|
|
1263
|
+
console.error("Script doesn't have exported class");
|
|
1264
|
+
return;
|
|
1265
|
+
}
|
|
1266
|
+
scriptContent = scriptContent.replace(classMatch[0], `class ${className}`);
|
|
1267
|
+
script.text = `var ${id} = function(vendor) {${scriptContent}
|
|
1268
|
+
return ${className}; };`;
|
|
1269
|
+
document.body.appendChild(script);
|
|
1270
|
+
const ScriptClass = window?.[id]?.(vendorMap);
|
|
1271
|
+
document.body.removeChild(script);
|
|
1272
|
+
return ScriptClass;
|
|
1273
|
+
};
|
|
1274
|
+
|
|
1164
1275
|
class ScriptPlugin {
|
|
1165
1276
|
constructor(host) {
|
|
1166
1277
|
this.host = host;
|
|
1167
|
-
this.normalizeImports = (script, elementPath) => {
|
|
1168
|
-
const regexp = new RegExp(`import([ \\n\\t]*(?:[^ \\n\\t\\{\\}]+[ \\n\\t]*,?)?(?:[ \\n\\t]*\\{(?:[ \\n\\t]*[^ \\n\\t"'\\{\\}]+[ \\n\\t]*,?)+\\})?[ \\n\\t]*)from[ \\n\\t]*(['"])([^'"\\n]+)(?:['"]);`, 'g');
|
|
1169
|
-
const result = script.replace(regexp, (match, g1, g2, src) => {
|
|
1170
|
-
const imports = g1
|
|
1171
|
-
.trim()
|
|
1172
|
-
.slice(1, -1)
|
|
1173
|
-
.split(',')
|
|
1174
|
-
.map(item => item.trim());
|
|
1175
|
-
imports.forEach(item => {
|
|
1176
|
-
if (!this.vendorMap[src]?.[item]) {
|
|
1177
|
-
throw new Error(`Failed to import ${item} from '${src}' in ${elementPath}/script.ts`);
|
|
1178
|
-
}
|
|
1179
|
-
});
|
|
1180
|
-
return `const ${g1} = vendor['${src}'];`;
|
|
1181
|
-
});
|
|
1182
|
-
return result;
|
|
1183
|
-
};
|
|
1184
|
-
this.document = this.host.injector.get(DOCUMENT);
|
|
1185
|
-
this.vendorMap = this.host.injector.get(VENDOR_MAP);
|
|
1186
1278
|
const elementMetadata = this.host.injector.get(ELEMENT_METADATA);
|
|
1187
1279
|
const sharedElementMetadata = this.host.injector.get(SHARED_ELEMENT_METADATA);
|
|
1188
1280
|
this.addScript(sharedElementMetadata);
|
|
@@ -1192,25 +1284,11 @@ class ScriptPlugin {
|
|
|
1192
1284
|
if (!metadata?.script) {
|
|
1193
1285
|
return;
|
|
1194
1286
|
}
|
|
1195
|
-
const
|
|
1196
|
-
const script = this.document.createElement('script');
|
|
1197
|
-
script.type = `text/javascript`;
|
|
1198
|
-
let scriptContent = this.normalizeImports(metadata.script, metadata.path ?? metadata.name);
|
|
1199
|
-
const classMatch = /export class (\S+)/.exec(scriptContent);
|
|
1200
|
-
const className = classMatch?.[1];
|
|
1201
|
-
if (!classMatch || !className) {
|
|
1202
|
-
console.error("Script doesn't have exported class");
|
|
1203
|
-
return;
|
|
1204
|
-
}
|
|
1205
|
-
scriptContent = scriptContent.replace(classMatch[0], `class ${className}`);
|
|
1206
|
-
script.text = `var ${id} = function(vendor) {${scriptContent}
|
|
1207
|
-
return ${className}; };`;
|
|
1208
|
-
this.document.body.appendChild(script);
|
|
1209
|
-
const ScriptClass = window[id](this.vendorMap);
|
|
1287
|
+
const ScriptClass = getScriptClass(metadata);
|
|
1210
1288
|
if (ScriptClass instanceof Object) {
|
|
1211
|
-
|
|
1289
|
+
const instance = new ScriptClass(this.host);
|
|
1290
|
+
this.host.registerPlugin(instance);
|
|
1212
1291
|
}
|
|
1213
|
-
this.document.body.removeChild(script);
|
|
1214
1292
|
}
|
|
1215
1293
|
}
|
|
1216
1294
|
ScriptPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: ScriptPlugin, deps: [{ token: ElementComponent }], target: i0.ɵɵFactoryTarget.Directive });
|
|
@@ -1223,29 +1301,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
|
|
|
1223
1301
|
* ScriptPlugin must always be the last plugin in the list to make sure user code is running after all pre-initializers.
|
|
1224
1302
|
*/
|
|
1225
1303
|
const CONFIG = {
|
|
1304
|
+
CUSTOMIZATION_PAGE: {
|
|
1305
|
+
component: ElementComponent,
|
|
1306
|
+
plugins: [IOPlugin, ScriptPlugin],
|
|
1307
|
+
},
|
|
1226
1308
|
CUSTOM: {
|
|
1227
1309
|
component: ElementComponent,
|
|
1228
1310
|
plugins: [IOPlugin, ElementHoverPlugin, ScriptPlugin],
|
|
1229
|
-
builder: {},
|
|
1230
1311
|
},
|
|
1231
1312
|
CONTAINER: {
|
|
1232
1313
|
component: ElementComponent,
|
|
1233
1314
|
defaultTemplate: '<element-children></element-children>',
|
|
1234
1315
|
plugins: [ScriptPlugin],
|
|
1235
|
-
builder: {},
|
|
1236
1316
|
},
|
|
1237
1317
|
SERVICE: {
|
|
1238
1318
|
component: ElementComponent,
|
|
1239
1319
|
plugins: [IOPlugin, ScriptPlugin],
|
|
1240
1320
|
suppressTemplate: true,
|
|
1241
1321
|
suppressStyles: true,
|
|
1242
|
-
builder: {},
|
|
1243
1322
|
},
|
|
1244
1323
|
REFERENCE: {
|
|
1245
1324
|
component: ElementComponent,
|
|
1246
1325
|
plugins: [IOPlugin, ScriptPlugin],
|
|
1247
1326
|
suppressTemplate: true,
|
|
1248
|
-
builder: {},
|
|
1249
1327
|
},
|
|
1250
1328
|
PAGE: {
|
|
1251
1329
|
component: ElementComponent,
|
|
@@ -1743,63 +1821,10 @@ const LAYOUT = {
|
|
|
1743
1821
|
},
|
|
1744
1822
|
};
|
|
1745
1823
|
|
|
1746
|
-
const VELOCE_LIBS = {
|
|
1747
|
-
'@veloceapps/core': {
|
|
1748
|
-
isDefined,
|
|
1749
|
-
Operator,
|
|
1750
|
-
Predicate,
|
|
1751
|
-
parseJsonSafely,
|
|
1752
|
-
},
|
|
1753
|
-
'@veloceapps/components': {
|
|
1754
|
-
ToastService,
|
|
1755
|
-
ToastType,
|
|
1756
|
-
},
|
|
1757
|
-
'@veloceapps/api': {
|
|
1758
|
-
SalesforceApiService,
|
|
1759
|
-
QuoteApiService,
|
|
1760
|
-
DocumentTemplatesApiService,
|
|
1761
|
-
DocumentAttachmentApiService,
|
|
1762
|
-
RampApiService,
|
|
1763
|
-
CatalogApiService,
|
|
1764
|
-
DeltaApiService,
|
|
1765
|
-
PicklistsApiService,
|
|
1766
|
-
PriceApiService,
|
|
1767
|
-
ShoppingCartSettingsApiService,
|
|
1768
|
-
ConfigurationSettingsApiService,
|
|
1769
|
-
GuidedSellingApiService,
|
|
1770
|
-
},
|
|
1771
|
-
'@veloceapps/sdk/core': {
|
|
1772
|
-
ConfigurationService,
|
|
1773
|
-
QuoteDraftService,
|
|
1774
|
-
FlowConfigurationService,
|
|
1775
|
-
LineItemWorker,
|
|
1776
|
-
ProductImagesService,
|
|
1777
|
-
ContextService,
|
|
1778
|
-
...lineItemUtils,
|
|
1779
|
-
},
|
|
1780
|
-
'@veloceapps/sdk/cms': {
|
|
1781
|
-
...cmsInjectionTokens,
|
|
1782
|
-
...cmsActions,
|
|
1783
|
-
TemplatesService,
|
|
1784
|
-
IntegrationState,
|
|
1785
|
-
ResourcesService,
|
|
1786
|
-
},
|
|
1787
|
-
};
|
|
1788
|
-
const VELOCE_LIBS_BACKWARDS_COMPATIBLE = Object.entries(VELOCE_LIBS).reduce((trunk, [key, value]) => ({ ...trunk, [key.replace('@veloceapps/', '@veloce/')]: value }), {});
|
|
1789
|
-
const vendorMap = {
|
|
1790
|
-
...VELOCE_LIBS,
|
|
1791
|
-
// TODO: remove when projects/demos are migrated to @veloceapps organization libraries
|
|
1792
|
-
...VELOCE_LIBS_BACKWARDS_COMPATIBLE,
|
|
1793
|
-
'@angular/core': i0,
|
|
1794
|
-
'@angular/forms': angularForms,
|
|
1795
|
-
rxjs: rxjs,
|
|
1796
|
-
'rxjs/operators': rxjsOperators,
|
|
1797
|
-
lodash: lodash,
|
|
1798
|
-
};
|
|
1799
|
-
|
|
1800
1824
|
class ElementsResolver {
|
|
1801
|
-
constructor(uiDef, elements, sharedElements = []) {
|
|
1825
|
+
constructor(uiDef, elements, sharedElements = [], config) {
|
|
1802
1826
|
this.uiDef = uiDef;
|
|
1827
|
+
this.config = config;
|
|
1803
1828
|
this.renderableElements = [];
|
|
1804
1829
|
this.sharedElements = [];
|
|
1805
1830
|
const transpiledElements = this.transpileScripts(elements);
|
|
@@ -1809,6 +1834,10 @@ class ElementsResolver {
|
|
|
1809
1834
|
.concat(transpiledSharedElements);
|
|
1810
1835
|
this.elements = transpiledElements.map(el => this.processElementMetadata(el)).filter(isDefined);
|
|
1811
1836
|
this.renderableElements = this.getRenderableElements(this.elements);
|
|
1837
|
+
this.uiDefMetadata = {
|
|
1838
|
+
...this.uiDef,
|
|
1839
|
+
customization: this.uiDef.customization ?? this.getDefaultCustomizationState(),
|
|
1840
|
+
};
|
|
1812
1841
|
}
|
|
1813
1842
|
addElement(element) {
|
|
1814
1843
|
if (element.isShared) {
|
|
@@ -1851,7 +1880,9 @@ class ElementsResolver {
|
|
|
1851
1880
|
getRenderableElements(elements) {
|
|
1852
1881
|
const renderable = [];
|
|
1853
1882
|
for (const el of elements) {
|
|
1854
|
-
|
|
1883
|
+
// In `customizationMode` render only element with CUSTOMIZATION_PAGE type
|
|
1884
|
+
const typePerMode = Boolean(this.config?.customizationMode) === (el.type === 'CUSTOMIZATION_PAGE');
|
|
1885
|
+
if (!this.isSharedElement(el) && typePerMode) {
|
|
1855
1886
|
const children = el.children.filter(child => !this.isSharedElement(child));
|
|
1856
1887
|
const renderableChildren = this.getRenderableElements(children);
|
|
1857
1888
|
renderable.push({ ...el, children }, ...renderableChildren);
|
|
@@ -1930,7 +1961,7 @@ class ElementsResolver {
|
|
|
1930
1961
|
}
|
|
1931
1962
|
resolveElement(element) {
|
|
1932
1963
|
const config = CONFIG[element.type];
|
|
1933
|
-
const defaultPlugins = DEFAULT_PLUGINS[this.
|
|
1964
|
+
const defaultPlugins = DEFAULT_PLUGINS[this.uiDefMetadata.type] ?? [];
|
|
1934
1965
|
if (!config) {
|
|
1935
1966
|
console.warn(`Unknown element type "${element.type}"`);
|
|
1936
1967
|
return;
|
|
@@ -1942,11 +1973,10 @@ class ElementsResolver {
|
|
|
1942
1973
|
...(styles ? { styles: [styles] } : {}),
|
|
1943
1974
|
providers: [
|
|
1944
1975
|
{ provide: DEFAULT_PLUGINS_TOKEN, useValue: defaultPlugins },
|
|
1945
|
-
{ provide: UI_DEFINITION_METADATA, useValue: this.
|
|
1976
|
+
{ provide: UI_DEFINITION_METADATA, useValue: this.uiDefMetadata },
|
|
1946
1977
|
{ provide: ELEMENT_METADATA, useValue: element },
|
|
1947
1978
|
{ provide: SHARED_ELEMENT_METADATA, useValue: this.getSharedElement(element) },
|
|
1948
1979
|
{ provide: ELEMENT_CONFIG, useValue: config },
|
|
1949
|
-
{ provide: VENDOR_MAP, useValue: vendorMap },
|
|
1950
1980
|
],
|
|
1951
1981
|
};
|
|
1952
1982
|
const cmp = Component(component)(class C extends config.component {
|
|
@@ -1978,6 +2008,14 @@ class ElementsResolver {
|
|
|
1978
2008
|
result += '}\n';
|
|
1979
2009
|
return result;
|
|
1980
2010
|
}
|
|
2011
|
+
getDefaultCustomizationState() {
|
|
2012
|
+
const customizationPage = this.elements.find(el => el.type === 'CUSTOMIZATION_PAGE');
|
|
2013
|
+
if (!customizationPage?.script) {
|
|
2014
|
+
return;
|
|
2015
|
+
}
|
|
2016
|
+
const c = getScriptClass(customizationPage);
|
|
2017
|
+
return c && 'default' in c ? c.default : undefined;
|
|
2018
|
+
}
|
|
1981
2019
|
}
|
|
1982
2020
|
|
|
1983
2021
|
class FederatedHostDirective {
|
|
@@ -2082,7 +2120,7 @@ class CompilationService {
|
|
|
2082
2120
|
constructor(injector) {
|
|
2083
2121
|
this.injector = injector;
|
|
2084
2122
|
}
|
|
2085
|
-
compileUIDefinition$(uiDefinition) {
|
|
2123
|
+
compileUIDefinition$(uiDefinition, config) {
|
|
2086
2124
|
return of([]).pipe(map(() => {
|
|
2087
2125
|
const { children, pages, components, ...uiDefinitionMeta } = uiDefinition;
|
|
2088
2126
|
this.uiDefinitionMeta = uiDefinitionMeta;
|
|
@@ -2090,7 +2128,7 @@ class CompilationService {
|
|
|
2090
2128
|
const sharedElements = components ?? [];
|
|
2091
2129
|
const metadata = elements.map(element => elementToMetadata(element));
|
|
2092
2130
|
const sharedMetadata = sharedElements.map(element => elementToMetadata(element));
|
|
2093
|
-
this.elementsResolver = new ElementsResolver(uiDefinition, metadata, sharedMetadata);
|
|
2131
|
+
this.elementsResolver = new ElementsResolver(uiDefinition, metadata, sharedMetadata, config);
|
|
2094
2132
|
const componentTypes = this.elementsResolver.getNgComponents();
|
|
2095
2133
|
const module = this.getModule(componentTypes);
|
|
2096
2134
|
return {
|
|
@@ -2324,5 +2362,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImpor
|
|
|
2324
2362
|
* Generated bundle index. Do not edit.
|
|
2325
2363
|
*/
|
|
2326
2364
|
|
|
2327
|
-
export { ApplyProductConfigurationAction, CloseDocGenAction, CmsAction, ConfigureProductAction, DEFAULT_PLUGINS_TOKEN, ELEMENT_CONFIG, ELEMENT_METADATA, ElementComponent, ElementDefinition, ElementsResolver, FlowAction, IntegrationState, LauncherModule, MigrationsModule, MigrationsService, NavigateBackAction, NavigateToCatalogAction, OpenDocGenAction, PreviewComponent, PreviewModule, RemoteApplyAction, RemoteCancelAction, ResourcesService, RuntimeEditorService, RuntimeModule, SHARED_ELEMENT_METADATA, SwitchObjectAction, TemplatesService, UI_DEFINITION_METADATA, UiBuildError,
|
|
2365
|
+
export { ApplyProductConfigurationAction, CloseDocGenAction, CmsAction, ConfigureProductAction, DEFAULT_PLUGINS_TOKEN, ELEMENT_CONFIG, ELEMENT_METADATA, ElementComponent, ElementDefinition, ElementsResolver, FlowAction, IntegrationState, LauncherModule, MigrationsModule, MigrationsService, NavigateBackAction, NavigateToCatalogAction, OpenDocGenAction, PreviewComponent, PreviewModule, RemoteApplyAction, RemoteCancelAction, ResourcesService, RuntimeEditorService, RuntimeModule, SHARED_ELEMENT_METADATA, SwitchObjectAction, TemplatesService, UI_DEFINITION_METADATA, UiBuildError, doesElementSupportIO, elementToMetadata, extendElementMetadata, extractElementMetadata, findElementByModule, findElementByPath, flattenElements, getAbsolutePath, getElementConfig, insertElement, isSharedElement, isValidScript, metadataToElement, normalizeElementMetadata, parseBoundPath, parsePath, removeElement, stringifyElementMetadata };
|
|
2328
2366
|
//# sourceMappingURL=veloceapps-sdk-cms.mjs.map
|