ngx-view-builder 0.1.0 → 0.1.2
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/README.md +19 -131
- package/fesm2022/{ngx-view-builder-avatar-element-Bwq_4ceZ.mjs → ngx-view-builder-avatar-element-9HrNMsbH.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-avatar-element-Bwq_4ceZ.mjs.map → ngx-view-builder-avatar-element-9HrNMsbH.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-B7bwS9wN.mjs → ngx-view-builder-breadcrumbs-element-B53MyJZv.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-B7bwS9wN.mjs.map → ngx-view-builder-breadcrumbs-element-B53MyJZv.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-icon-element-DY8JkPss.mjs → ngx-view-builder-icon-element-CF0zR6AC.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-icon-element-DY8JkPss.mjs.map → ngx-view-builder-icon-element-CF0zR6AC.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-ngx-view-builder-B54ZEWUk.mjs → ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs} +39 -24
- package/fesm2022/{ngx-view-builder-ngx-view-builder-B54ZEWUk.mjs.map → ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-toast-element-BWsScfIX.mjs → ngx-view-builder-toast-element-BHD67zTY.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-toast-element-BWsScfIX.mjs.map → ngx-view-builder-toast-element-BHD67zTY.mjs.map} +1 -1
- package/fesm2022/ngx-view-builder.mjs +1 -1
- package/package.json +1 -1
- package/types/ngx-view-builder.d.ts +8 -0
package/README.md
CHANGED
|
@@ -1,131 +1,19 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- `NgxViewBuilderBuilder`, `NgxViewBuilderRuntime`, `NgxViewBuilderRenderer` and `NgxViewBuilder` are imported from `ngx-view-builder`.
|
|
22
|
-
- optional plugin tabs do not appear automatically;
|
|
23
|
-
- the host application must install the plugin package and register its provider.
|
|
24
|
-
|
|
25
|
-
## Typical imports
|
|
26
|
-
|
|
27
|
-
Builder:
|
|
28
|
-
|
|
29
|
-
```ts
|
|
30
|
-
import { BuilderModel, NgxViewBuilderBuilder } from 'ngx-view-builder';
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Runtime:
|
|
34
|
-
|
|
35
|
-
```ts
|
|
36
|
-
import { NgxViewBuilderRuntime, NgxViewBuilderRenderer, NgxViewBuilderApiService } from 'ngx-view-builder';
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Optional plugins:
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
import { provideNgxViewBuilderAutomationStudio } from 'ngx-view-builder-plugin-automation';
|
|
43
|
-
import { provideNgxViewBuilderDocumentationGenerator } from 'ngx-view-builder-plugin-documentation';
|
|
44
|
-
import { provideNgxViewBuilderLogicStudio } from 'ngx-view-builder-plugin-logic';
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Host registration example
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
import { ApplicationConfig } from '@angular/core';
|
|
51
|
-
import { provideNgxViewBuilderDocumentationGenerator } from 'ngx-view-builder-plugin-documentation';
|
|
52
|
-
import { provideNgxViewBuilderAutomationStudio } from 'ngx-view-builder-plugin-automation';
|
|
53
|
-
import { provideNgxViewBuilderLogicStudio } from 'ngx-view-builder-plugin-logic';
|
|
54
|
-
|
|
55
|
-
export const appConfig: ApplicationConfig = {
|
|
56
|
-
providers: [
|
|
57
|
-
provideNgxViewBuilderDocumentationGenerator(),
|
|
58
|
-
provideNgxViewBuilderAutomationStudio(),
|
|
59
|
-
provideNgxViewBuilderLogicStudio(),
|
|
60
|
-
],
|
|
61
|
-
};
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Builder component
|
|
65
|
-
|
|
66
|
-
```html
|
|
67
|
-
<ngx-view-builder-builder [model]="builderModel"></ngx-view-builder-builder>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Styles
|
|
71
|
-
|
|
72
|
-
```scss
|
|
73
|
-
@import 'ngx-view-builder/styles/index.css';
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Reset styles are scoped to `.nvb-root`, so host global styles are not overridden.
|
|
77
|
-
|
|
78
|
-
## Build in this workspace
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
npm run build:ngx-view-builder
|
|
82
|
-
npm run build:ngx-view-builder-plugins
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Outputs:
|
|
86
|
-
|
|
87
|
-
- `dist/ngx-view-builder`
|
|
88
|
-
- `dist/ngx-view-builder-builder`
|
|
89
|
-
- `dist/ngx-view-builder-runtime`
|
|
90
|
-
- `dist/ngx-view-builder-plugin-automation`
|
|
91
|
-
- `dist/ngx-view-builder-plugin-documentation`
|
|
92
|
-
- `dist/ngx-view-builder-plugin-logic`
|
|
93
|
-
|
|
94
|
-
## Runtime API
|
|
95
|
-
|
|
96
|
-
`NgxViewBuilderApiService` exposes:
|
|
97
|
-
|
|
98
|
-
- value events: `onValueChanging`, `onValueChanged`
|
|
99
|
-
- lifecycle events: `onBeforeRender`, `onRender`, `onAfterRender`
|
|
100
|
-
- structure/data methods: `getStructure`, `setStructure`, `getData`, `setData`
|
|
101
|
-
- validation method: `validateData(formJson, dataJson, options?)`
|
|
102
|
-
- model access: `getElement`, `getElementProperty`, `setElementProperty`
|
|
103
|
-
- extension registration: `registerExtensions`, `registerExtensionsAsync`
|
|
104
|
-
|
|
105
|
-
## Headless validation
|
|
106
|
-
|
|
107
|
-
```ts
|
|
108
|
-
import { inject } from '@angular/core';
|
|
109
|
-
import { ForgeInitializerService } from 'ngx-view-builder';
|
|
110
|
-
|
|
111
|
-
inject(ForgeInitializerService).load({
|
|
112
|
-
preloadRuntimeServices: true,
|
|
113
|
-
exposeHeadlessValidationApi: true,
|
|
114
|
-
headlessValidationApiKey: '__NGX_VIEW_BUILDER__',
|
|
115
|
-
});
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## Documentation
|
|
119
|
-
|
|
120
|
-
Main product docs live in `ngx-view-builder-docs-vitepress/` (VitePress).
|
|
121
|
-
|
|
122
|
-
## License
|
|
123
|
-
|
|
124
|
-
NGX View Builder is **commercial software** — see [LICENSE.md](./LICENSE.md).
|
|
125
|
-
|
|
126
|
-
- A paid license key unlocks the builder without a watermark; a key covers **all versions released during your license term, perpetually** — they keep working even after the license expires.
|
|
127
|
-
- Client work is covered, and **either side can hold the license**: an agency's key covers apps it builds for its clients, or the client buys the key and it covers the contractors developing their application. Operating a delivered application never requires a separate key.
|
|
128
|
-
- Versions released after your license term require a renewal.
|
|
129
|
-
- Evaluation without a key is free (the builder shows a watermark); the production runtime never shows license UI.
|
|
130
|
-
|
|
131
|
-
Pricing and keys: https://ngxviewbuilder.io/pricing
|
|
1
|
+
# NGX View Builder
|
|
2
|
+
|
|
3
|
+
Visual builder and native runtime for complete Angular views — forms, dashboards, data tables, and guided flows defined as JSON.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i ngx-view-builder
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Documentation
|
|
12
|
+
|
|
13
|
+
Full guides, API reference, and examples: https://ngxviewbuilder.io
|
|
14
|
+
|
|
15
|
+
## License
|
|
16
|
+
|
|
17
|
+
NGX View Builder is **commercial software** — see [LICENSE.md](./LICENSE.md). Evaluate for free (the builder shows a watermark; the production runtime never does). A paid license key covers all versions released during your license term, perpetually.
|
|
18
|
+
|
|
19
|
+
Pricing and keys: https://ngxviewbuilder.io/pricing
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NgStyle } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { input, signal, inject, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
-
import { E as ElementActionService, a as ElementWrapper, D as DynamicTextPipe } from './ngx-view-builder-ngx-view-builder-
|
|
4
|
+
import { E as ElementActionService, a as ElementWrapper, D as DynamicTextPipe } from './ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs';
|
|
5
5
|
|
|
6
6
|
class AvatarElement {
|
|
7
7
|
model = input.required(...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
|
|
@@ -74,4 +74,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
74
74
|
}], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }] } });
|
|
75
75
|
|
|
76
76
|
export { AvatarElement };
|
|
77
|
-
//# sourceMappingURL=ngx-view-builder-avatar-element-
|
|
77
|
+
//# sourceMappingURL=ngx-view-builder-avatar-element-9HrNMsbH.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-view-builder-avatar-element-
|
|
1
|
+
{"version":3,"file":"ngx-view-builder-avatar-element-9HrNMsbH.mjs","sources":["../../../projects/ngx-view-builder/src/lib/core/shared/elements/avatar-element/avatar-element.ts","../../../projects/ngx-view-builder/src/lib/core/shared/elements/avatar-element/avatar-element.html"],"sourcesContent":["import { NgStyle } from '@angular/common';\r\nimport { Component, computed, inject, input, signal, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { ElementWrapper } from '../../components/element-wrapper/element-wrapper';\r\n\r\nimport { AvatarModel } from '../../models/elements/avatar.model';\r\n\r\nimport { DynamicTextPipe } from '../../pipes/dynamic-text.pipe';\r\n\r\nimport { ElementActionService } from '../../services/element-action.service';\r\n\r\n@Component({\r\n selector: 'avatar-element',\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n\r\n imports: [ElementWrapper, NgStyle, DynamicTextPipe],\r\n\r\n templateUrl: './avatar-element.html',\r\n\r\n styleUrl: './avatar-element.scss',\r\n})\r\nexport class AvatarElement {\r\n model = input.required<AvatarModel>();\r\n\r\n previewOpen = signal<boolean>(false);\r\n\r\n previewSrc = signal<string>('');\r\n\r\n private elementActionService = inject(ElementActionService);\r\n\r\n avatarStyle = computed<Record<string, string>>(() => {\r\n const sizeRaw = Number(this.model()?.size);\r\n\r\n const size = Number.isFinite(sizeRaw) && sizeRaw > 0 ? Math.floor(sizeRaw) : 48;\r\n\r\n const shape = String(this.model()?.shape ?? 'circle')\r\n .trim()\r\n\r\n .toLowerCase();\r\n\r\n return {\r\n width: `${size}px`,\r\n\r\n height: `${size}px`,\r\n\r\n 'border-radius': shape === 'square' ? '10px' : '999px',\r\n\r\n 'background-color': String(this.model()?.backgroundColor ?? '#dfe6ff').trim() || '#dfe6ff',\r\n\r\n color: String(this.model()?.textColor ?? '#1b2d6b').trim() || '#1b2d6b',\r\n\r\n border: this.model().showBorder ? '1px solid var(--color-neutral-300)' : 'none',\r\n };\r\n });\r\n\r\n initials = computed(() => {\r\n const value = String(this.model()?.nameText ?? '').trim();\r\n\r\n if (!value) {\r\n return 'U';\r\n }\r\n\r\n const parts = value\r\n\r\n .split(/\\s+/)\r\n\r\n .map((part) => part.trim())\r\n\r\n .filter((part) => part.length > 0);\r\n\r\n if (!parts.length) {\r\n return 'U';\r\n }\r\n\r\n return parts\r\n\r\n .slice(0, 2)\r\n\r\n .map((part) => part[0].toUpperCase())\r\n\r\n .join('');\r\n });\r\n\r\n onAvatarClick(src: string, event: MouseEvent): void {\r\n event.preventDefault();\r\n\r\n event.stopPropagation();\r\n\r\n const runtimeContext: Record<string, unknown> = {\r\n value: src || this.initials(),\r\n\r\n item: null,\r\n\r\n row: null,\r\n };\r\n\r\n const elementName = String(this.model().name ?? '').trim();\r\n\r\n if (elementName) {\r\n runtimeContext[elementName] = runtimeContext['value'];\r\n }\r\n\r\n void this.elementActionService.runActions(\r\n this.model(),\r\n\r\n this.model().events ?? [],\r\n\r\n 'click',\r\n\r\n runtimeContext,\r\n );\r\n\r\n if (!this.model().showPreview || !src) {\r\n return;\r\n }\r\n\r\n this.previewSrc.set(src);\r\n\r\n this.previewOpen.set(true);\r\n }\r\n\r\n closePreview(event?: Event): void {\r\n event?.preventDefault();\r\n\r\n event?.stopPropagation();\r\n\r\n this.previewOpen.set(false);\r\n\r\n this.previewSrc.set('');\r\n }\r\n}\r\n","<element-wrapper [model]=\"model()\">\r\n @let avatarSrc = model().src | dynamicText: model();\r\n @let avatarName = model().nameText | dynamicText: model();\r\n\r\n <div class=\"nvb-avatar-wrap\" data-testid=\"avatar-root\">\r\n <button\r\n type=\"button\"\r\n class=\"nvb-avatar\"\r\n [ngStyle]=\"avatarStyle()\"\r\n (click)=\"onAvatarClick(avatarSrc, $event)\"\r\n >\r\n @if (avatarSrc) {\r\n <img [src]=\"avatarSrc\" [alt]=\"avatarName\" />\r\n } @else {\r\n <span>{{ initials() }}</span>\r\n }\r\n </button>\r\n </div>\r\n\r\n @if (previewOpen()) {\r\n <div class=\"nvb-avatar-preview\" (click)=\"closePreview()\">\r\n <button type=\"button\" class=\"nvb-avatar-preview__close\" (click)=\"closePreview($event)\">\r\n <span class=\"material-symbols-outlined\">close</span>\r\n </button>\r\n <img [src]=\"previewSrc()\" [alt]=\"avatarName\" />\r\n </div>\r\n }\r\n</element-wrapper>\r\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { input, inject, signal, computed, ChangeDetectionStrategy, Component } f
|
|
|
3
3
|
import { Router, NavigationEnd } from '@angular/router';
|
|
4
4
|
import { get } from 'lodash-es';
|
|
5
5
|
import { filter } from 'rxjs';
|
|
6
|
-
import { E as ElementActionService, M as MarkupSecurityService, U as UiTranslationService, a as ElementWrapper, N as NvbIcon, D as DynamicTextPipe } from './ngx-view-builder-ngx-view-builder-
|
|
6
|
+
import { E as ElementActionService, M as MarkupSecurityService, U as UiTranslationService, a as ElementWrapper, N as NvbIcon, D as DynamicTextPipe } from './ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs';
|
|
7
7
|
|
|
8
8
|
class BreadcrumbsElement {
|
|
9
9
|
model = input.required(...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
|
|
@@ -246,4 +246,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
246
246
|
}], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }] } });
|
|
247
247
|
|
|
248
248
|
export { BreadcrumbsElement };
|
|
249
|
-
//# sourceMappingURL=ngx-view-builder-breadcrumbs-element-
|
|
249
|
+
//# sourceMappingURL=ngx-view-builder-breadcrumbs-element-B53MyJZv.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-view-builder-breadcrumbs-element-B7bwS9wN.mjs","sources":["../../../projects/ngx-view-builder/src/lib/core/shared/elements/breadcrumbs-element/breadcrumbs-element.ts","../../../projects/ngx-view-builder/src/lib/core/shared/elements/breadcrumbs-element/breadcrumbs-element.html"],"sourcesContent":["import {\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\r\nimport { get } from 'lodash-es';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { ElementWrapper } from '../../components/element-wrapper/element-wrapper';\r\nimport { NvbIcon } from '../../components/nvb-icon/nvb-icon';\r\nimport {\r\n BreadcrumbsModel,\r\n IBreadcrumbItem,\r\n IRouteBreadcrumbConfig,\r\n} from '../../models/elements/breadcrumbs.model';\r\nimport { DynamicTextPipe } from '../../pipes/dynamic-text.pipe';\r\nimport { ElementActionService } from '../../services/element-action.service';\r\nimport { MarkupSecurityService } from '../../services/markup-security.service';\r\nimport { UiTranslationService } from '../../services/ui-translation.service';\r\n\r\ninterface IRenderedBreadcrumbItem extends IBreadcrumbItem {\r\n ellipsis?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'breadcrumbs-element',\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [ElementWrapper, DynamicTextPipe, NvbIcon],\r\n templateUrl: './breadcrumbs-element.html',\r\n styleUrl: './breadcrumbs-element.scss',\r\n})\r\nexport class BreadcrumbsElement implements OnInit, OnDestroy {\r\n model = input.required<BreadcrumbsModel>();\r\n\r\n private elementActionService = inject(ElementActionService);\r\n private markupSecurityService = inject(MarkupSecurityService);\r\n private uiTranslationService = inject(UiTranslationService);\r\n private router = inject(Router, { optional: true });\r\n private routeRefresh = signal(0);\r\n private navigationSubscription: Subscription | null = null;\r\n\r\n ngOnInit(): void {\r\n if (!this.router) {\r\n return;\r\n }\r\n this.navigationSubscription = this.router.events\r\n .pipe(filter((event) => event instanceof NavigationEnd))\r\n .subscribe(() => {\r\n this.routeRefresh.update((value) => value + 1);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.navigationSubscription?.unsubscribe();\r\n this.navigationSubscription = null;\r\n }\r\n\r\n renderedItems = computed<IRenderedBreadcrumbItem[]>(() => {\r\n this.routeRefresh();\r\n const source = this.resolveSourceItems();\r\n const items: IRenderedBreadcrumbItem[] = [];\r\n if (this.model().showHome) {\r\n const configuredHomeLabel = String(this.model()?.homeLabel ?? '').trim();\r\n items.push({\r\n label:\r\n configuredHomeLabel || this.uiTranslationService.translate('breadcrumbs.home', 'Home'),\r\n value: String(this.model()?.homeUrl ?? '/').trim() || '/',\r\n });\r\n }\r\n items.push(...source);\r\n const maxItemsRaw = Number(this.model()?.maxItems ?? 0);\r\n const maxItems = Number.isFinite(maxItemsRaw) && maxItemsRaw > 0 ? Math.floor(maxItemsRaw) : 0;\r\n if (maxItems > 0 && items.length > maxItems && maxItems >= 2) {\r\n const first = items[0];\r\n const lastItems = items.slice(items.length - (maxItems - 1));\r\n return [first, { label: '...', value: '', ellipsis: true }, ...lastItems];\r\n }\r\n return items;\r\n });\r\n\r\n separatorIcon = computed(() => {\r\n const value = String(this.model()?.separator ?? '').trim();\r\n return value || 'chevron_right';\r\n });\r\n\r\n resolveItemHref(value: string | null | undefined): string | null {\r\n return this.markupSecurityService.sanitizeNavigationUrl(String(value ?? ''));\r\n }\r\n\r\n onItemClick(item: IRenderedBreadcrumbItem, index: number, event: MouseEvent): void {\r\n if (item.ellipsis) {\r\n event.preventDefault();\r\n return;\r\n }\r\n const hasClickActions = Array.isArray(this.model().events) && this.model().events.length > 0;\r\n if (hasClickActions) {\r\n event.preventDefault();\r\n } else {\r\n const anchorHref =\r\n event.currentTarget instanceof HTMLAnchorElement\r\n ? String(event.currentTarget.getAttribute('href') ?? '').trim()\r\n : '';\r\n if (anchorHref.startsWith('/') && this.router) {\r\n event.preventDefault();\r\n this.router.navigateByUrl(anchorHref).catch(() => {\r\n if (typeof window !== 'undefined' && typeof window.location?.assign === 'function') {\r\n window.location.assign(anchorHref);\r\n }\r\n });\r\n return;\r\n }\r\n }\r\n const runtimeContext: Record<string, unknown> = {\r\n item,\r\n row: item,\r\n index,\r\n value: item.value,\r\n };\r\n const elementName = String(this.model().name ?? '').trim();\r\n if (elementName) {\r\n runtimeContext[elementName] = item.value;\r\n }\r\n void this.elementActionService.runActions(\r\n this.model(),\r\n this.model().events ?? [],\r\n 'click',\r\n runtimeContext,\r\n );\r\n }\r\n\r\n private resolveSourceItems(): IRenderedBreadcrumbItem[] {\r\n if (this.model()?.itemsSource === 'route') {\r\n return this.buildRouteItems();\r\n }\r\n return Array.isArray(this.model()?.items) ? [...this.model().items] : [];\r\n }\r\n\r\n private buildRouteItems(): IRenderedBreadcrumbItem[] {\r\n const rootSnapshot = this.router?.routerState?.snapshot?.root ?? null;\r\n if (!rootSnapshot) {\r\n return [];\r\n }\r\n\r\n const labelDataKey =\r\n String(this.model()?.routeLabelDataKey ?? 'breadcrumb').trim() || 'breadcrumb';\r\n const usePathFallback = this.model()?.routeUsePathFallback !== false;\r\n const includeCurrent = this.model()?.routeIncludeCurrent !== false;\r\n const leaf = this.resolveLeafSnapshot(rootSnapshot);\r\n const accumulatedSegments: string[] = [];\r\n const items: IRenderedBreadcrumbItem[] = [];\r\n\r\n for (const snapshot of leaf.pathFromRoot) {\r\n const urlSegments = snapshot.url\r\n .map((segment) => String(segment?.path ?? '').trim())\r\n .filter(Boolean);\r\n if (urlSegments.length > 0) {\r\n accumulatedSegments.push(...urlSegments);\r\n }\r\n\r\n const item = this.resolveRouteItem(\r\n snapshot,\r\n accumulatedSegments,\r\n labelDataKey,\r\n usePathFallback,\r\n );\r\n if (item) {\r\n items.push(item);\r\n }\r\n }\r\n\r\n if (!includeCurrent && items.length > 0) {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n }\r\n\r\n private resolveLeafSnapshot(snapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot {\r\n let current = snapshot;\r\n while (current.firstChild) {\r\n current = current.firstChild;\r\n }\r\n return current;\r\n }\r\n\r\n private resolveRouteItem(\r\n snapshot: ActivatedRouteSnapshot,\r\n accumulatedSegments: string[],\r\n labelDataKey: string,\r\n usePathFallback: boolean,\r\n ): IRenderedBreadcrumbItem | null {\r\n const config = this.resolveRouteBreadcrumbConfig(snapshot, labelDataKey);\r\n if (config?.skip) {\r\n return null;\r\n }\r\n\r\n const fallbackLabel = usePathFallback ? this.resolveFallbackRouteLabel(snapshot) : '';\r\n const label = this.resolveRouteTemplate(\r\n String(config?.label ?? fallbackLabel ?? '').trim(),\r\n snapshot,\r\n accumulatedSegments,\r\n );\r\n if (!label) {\r\n return null;\r\n }\r\n\r\n const explicitValue = this.resolveRouteTemplate(\r\n String(config?.value ?? '').trim(),\r\n snapshot,\r\n accumulatedSegments,\r\n );\r\n const accumulatedUrl =\r\n accumulatedSegments.length > 0 ? `/${accumulatedSegments.join('/')}` : '/';\r\n\r\n return {\r\n label,\r\n value: explicitValue || accumulatedUrl,\r\n };\r\n }\r\n\r\n private resolveRouteBreadcrumbConfig(\r\n snapshot: ActivatedRouteSnapshot,\r\n labelDataKey: string,\r\n ): IRouteBreadcrumbConfig | null {\r\n const rawConfig = snapshot.data?.[labelDataKey];\r\n if (rawConfig === false || rawConfig === null) {\r\n return { skip: true };\r\n }\r\n if (typeof rawConfig === 'string') {\r\n const label = rawConfig.trim();\r\n return label ? { label } : null;\r\n }\r\n if (!rawConfig || typeof rawConfig !== 'object' || Array.isArray(rawConfig)) {\r\n return null;\r\n }\r\n\r\n const config = rawConfig as Record<string, unknown>;\r\n return {\r\n label: String(config['label'] ?? '').trim() || undefined,\r\n value: String(config['value'] ?? '').trim() || undefined,\r\n skip: Boolean(config['skip']),\r\n };\r\n }\r\n\r\n private resolveFallbackRouteLabel(snapshot: ActivatedRouteSnapshot): string {\r\n const dataTitle = String(snapshot.data?.['title'] ?? '').trim();\r\n if (dataTitle) {\r\n return dataTitle;\r\n }\r\n\r\n const urlLabel = snapshot.url\r\n .map((segment) => this.humanizeSegment(String(segment?.path ?? '').trim()))\r\n .filter(Boolean)\r\n .join(' / ');\r\n if (urlLabel) {\r\n return urlLabel;\r\n }\r\n\r\n const routePath = String(snapshot.routeConfig?.path ?? '').trim();\r\n if (routePath.startsWith(':')) {\r\n const paramName = routePath.slice(1).split('/')[0];\r\n const paramValue = String(snapshot.params?.[paramName] ?? '').trim();\r\n if (paramValue) {\r\n return paramValue;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private humanizeSegment(value: string): string {\r\n const normalized = decodeURIComponent(String(value ?? '').trim());\r\n if (!normalized) {\r\n return '';\r\n }\r\n return normalized\r\n .replace(/[-_]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\r\n }\r\n\r\n private resolveRouteTemplate(\r\n template: string,\r\n snapshot: ActivatedRouteSnapshot,\r\n accumulatedSegments: string[],\r\n ): string {\r\n const normalizedTemplate = String(template ?? '').trim();\r\n if (!normalizedTemplate) {\r\n return '';\r\n }\r\n\r\n const currentUrl = accumulatedSegments.length > 0 ? `/${accumulatedSegments.join('/')}` : '/';\r\n const routeId =\r\n String(snapshot.params?.['id'] ?? snapshot.paramMap.get('id') ?? '').trim() || undefined;\r\n const context = {\r\n route: {\r\n id: routeId,\r\n url: currentUrl,\r\n params: snapshot.params ?? {},\r\n queryParams: snapshot.queryParams ?? {},\r\n data: snapshot.data ?? {},\r\n fragment: snapshot.fragment ?? '',\r\n path: String(snapshot.routeConfig?.path ?? '').trim(),\r\n },\r\n id: routeId,\r\n url: currentUrl,\r\n params: snapshot.params ?? {},\r\n queryParams: snapshot.queryParams ?? {},\r\n data: snapshot.data ?? {},\r\n } as Record<string, unknown>;\r\n\r\n const resolveToken = (token: string): string => {\r\n const path = String(token ?? '').trim();\r\n if (!path) {\r\n return '';\r\n }\r\n const resolved = get(context, path);\r\n if (resolved === null || resolved === undefined) {\r\n return '';\r\n }\r\n return String(resolved);\r\n };\r\n\r\n const withMustache = normalizedTemplate.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, token: string) =>\r\n resolveToken(token),\r\n );\r\n return withMustache.replace(/\\{([^}]+)\\}/g, (_match, token: string) => resolveToken(token));\r\n }\r\n}\r\n","<element-wrapper [model]=\"model()\">\r\n <nav class=\"nvb-breadcrumbs\" aria-label=\"Breadcrumbs\" data-testid=\"breadcrumbs-root\">\r\n <ol>\r\n @for (item of renderedItems(); track $index; let itemIndex = $index; let isLast = $last) {\r\n <li>\r\n @if (item.ellipsis) {\r\n <span class=\"nvb-breadcrumbs__ellipsis\">...</span>\r\n } @else if (!isLast && item.value) {\r\n <a\r\n [attr.href]=\"resolveItemHref(item.value | dynamicText: model())\"\r\n (click)=\"onItemClick(item, itemIndex, $event)\"\r\n >\r\n {{ item.label | dynamicText: model() }}\r\n </a>\r\n } @else {\r\n <span class=\"nvb-breadcrumbs__current\">{{ item.label | dynamicText: model() }}</span>\r\n }\r\n\r\n @if (!isLast) {\r\n <nvb-icon class=\"nvb-breadcrumbs__separator\" [name]=\"separatorIcon()\"></nvb-icon>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n</element-wrapper>\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-view-builder-breadcrumbs-element-B53MyJZv.mjs","sources":["../../../projects/ngx-view-builder/src/lib/core/shared/elements/breadcrumbs-element/breadcrumbs-element.ts","../../../projects/ngx-view-builder/src/lib/core/shared/elements/breadcrumbs-element/breadcrumbs-element.html"],"sourcesContent":["import {\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\r\nimport { get } from 'lodash-es';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { ElementWrapper } from '../../components/element-wrapper/element-wrapper';\r\nimport { NvbIcon } from '../../components/nvb-icon/nvb-icon';\r\nimport {\r\n BreadcrumbsModel,\r\n IBreadcrumbItem,\r\n IRouteBreadcrumbConfig,\r\n} from '../../models/elements/breadcrumbs.model';\r\nimport { DynamicTextPipe } from '../../pipes/dynamic-text.pipe';\r\nimport { ElementActionService } from '../../services/element-action.service';\r\nimport { MarkupSecurityService } from '../../services/markup-security.service';\r\nimport { UiTranslationService } from '../../services/ui-translation.service';\r\n\r\ninterface IRenderedBreadcrumbItem extends IBreadcrumbItem {\r\n ellipsis?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'breadcrumbs-element',\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [ElementWrapper, DynamicTextPipe, NvbIcon],\r\n templateUrl: './breadcrumbs-element.html',\r\n styleUrl: './breadcrumbs-element.scss',\r\n})\r\nexport class BreadcrumbsElement implements OnInit, OnDestroy {\r\n model = input.required<BreadcrumbsModel>();\r\n\r\n private elementActionService = inject(ElementActionService);\r\n private markupSecurityService = inject(MarkupSecurityService);\r\n private uiTranslationService = inject(UiTranslationService);\r\n private router = inject(Router, { optional: true });\r\n private routeRefresh = signal(0);\r\n private navigationSubscription: Subscription | null = null;\r\n\r\n ngOnInit(): void {\r\n if (!this.router) {\r\n return;\r\n }\r\n this.navigationSubscription = this.router.events\r\n .pipe(filter((event) => event instanceof NavigationEnd))\r\n .subscribe(() => {\r\n this.routeRefresh.update((value) => value + 1);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.navigationSubscription?.unsubscribe();\r\n this.navigationSubscription = null;\r\n }\r\n\r\n renderedItems = computed<IRenderedBreadcrumbItem[]>(() => {\r\n this.routeRefresh();\r\n const source = this.resolveSourceItems();\r\n const items: IRenderedBreadcrumbItem[] = [];\r\n if (this.model().showHome) {\r\n const configuredHomeLabel = String(this.model()?.homeLabel ?? '').trim();\r\n items.push({\r\n label:\r\n configuredHomeLabel || this.uiTranslationService.translate('breadcrumbs.home', 'Home'),\r\n value: String(this.model()?.homeUrl ?? '/').trim() || '/',\r\n });\r\n }\r\n items.push(...source);\r\n const maxItemsRaw = Number(this.model()?.maxItems ?? 0);\r\n const maxItems = Number.isFinite(maxItemsRaw) && maxItemsRaw > 0 ? Math.floor(maxItemsRaw) : 0;\r\n if (maxItems > 0 && items.length > maxItems && maxItems >= 2) {\r\n const first = items[0];\r\n const lastItems = items.slice(items.length - (maxItems - 1));\r\n return [first, { label: '...', value: '', ellipsis: true }, ...lastItems];\r\n }\r\n return items;\r\n });\r\n\r\n separatorIcon = computed(() => {\r\n const value = String(this.model()?.separator ?? '').trim();\r\n return value || 'chevron_right';\r\n });\r\n\r\n resolveItemHref(value: string | null | undefined): string | null {\r\n return this.markupSecurityService.sanitizeNavigationUrl(String(value ?? ''));\r\n }\r\n\r\n onItemClick(item: IRenderedBreadcrumbItem, index: number, event: MouseEvent): void {\r\n if (item.ellipsis) {\r\n event.preventDefault();\r\n return;\r\n }\r\n const hasClickActions = Array.isArray(this.model().events) && this.model().events.length > 0;\r\n if (hasClickActions) {\r\n event.preventDefault();\r\n } else {\r\n const anchorHref =\r\n event.currentTarget instanceof HTMLAnchorElement\r\n ? String(event.currentTarget.getAttribute('href') ?? '').trim()\r\n : '';\r\n if (anchorHref.startsWith('/') && this.router) {\r\n event.preventDefault();\r\n this.router.navigateByUrl(anchorHref).catch(() => {\r\n if (typeof window !== 'undefined' && typeof window.location?.assign === 'function') {\r\n window.location.assign(anchorHref);\r\n }\r\n });\r\n return;\r\n }\r\n }\r\n const runtimeContext: Record<string, unknown> = {\r\n item,\r\n row: item,\r\n index,\r\n value: item.value,\r\n };\r\n const elementName = String(this.model().name ?? '').trim();\r\n if (elementName) {\r\n runtimeContext[elementName] = item.value;\r\n }\r\n void this.elementActionService.runActions(\r\n this.model(),\r\n this.model().events ?? [],\r\n 'click',\r\n runtimeContext,\r\n );\r\n }\r\n\r\n private resolveSourceItems(): IRenderedBreadcrumbItem[] {\r\n if (this.model()?.itemsSource === 'route') {\r\n return this.buildRouteItems();\r\n }\r\n return Array.isArray(this.model()?.items) ? [...this.model().items] : [];\r\n }\r\n\r\n private buildRouteItems(): IRenderedBreadcrumbItem[] {\r\n const rootSnapshot = this.router?.routerState?.snapshot?.root ?? null;\r\n if (!rootSnapshot) {\r\n return [];\r\n }\r\n\r\n const labelDataKey =\r\n String(this.model()?.routeLabelDataKey ?? 'breadcrumb').trim() || 'breadcrumb';\r\n const usePathFallback = this.model()?.routeUsePathFallback !== false;\r\n const includeCurrent = this.model()?.routeIncludeCurrent !== false;\r\n const leaf = this.resolveLeafSnapshot(rootSnapshot);\r\n const accumulatedSegments: string[] = [];\r\n const items: IRenderedBreadcrumbItem[] = [];\r\n\r\n for (const snapshot of leaf.pathFromRoot) {\r\n const urlSegments = snapshot.url\r\n .map((segment) => String(segment?.path ?? '').trim())\r\n .filter(Boolean);\r\n if (urlSegments.length > 0) {\r\n accumulatedSegments.push(...urlSegments);\r\n }\r\n\r\n const item = this.resolveRouteItem(\r\n snapshot,\r\n accumulatedSegments,\r\n labelDataKey,\r\n usePathFallback,\r\n );\r\n if (item) {\r\n items.push(item);\r\n }\r\n }\r\n\r\n if (!includeCurrent && items.length > 0) {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n }\r\n\r\n private resolveLeafSnapshot(snapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot {\r\n let current = snapshot;\r\n while (current.firstChild) {\r\n current = current.firstChild;\r\n }\r\n return current;\r\n }\r\n\r\n private resolveRouteItem(\r\n snapshot: ActivatedRouteSnapshot,\r\n accumulatedSegments: string[],\r\n labelDataKey: string,\r\n usePathFallback: boolean,\r\n ): IRenderedBreadcrumbItem | null {\r\n const config = this.resolveRouteBreadcrumbConfig(snapshot, labelDataKey);\r\n if (config?.skip) {\r\n return null;\r\n }\r\n\r\n const fallbackLabel = usePathFallback ? this.resolveFallbackRouteLabel(snapshot) : '';\r\n const label = this.resolveRouteTemplate(\r\n String(config?.label ?? fallbackLabel ?? '').trim(),\r\n snapshot,\r\n accumulatedSegments,\r\n );\r\n if (!label) {\r\n return null;\r\n }\r\n\r\n const explicitValue = this.resolveRouteTemplate(\r\n String(config?.value ?? '').trim(),\r\n snapshot,\r\n accumulatedSegments,\r\n );\r\n const accumulatedUrl =\r\n accumulatedSegments.length > 0 ? `/${accumulatedSegments.join('/')}` : '/';\r\n\r\n return {\r\n label,\r\n value: explicitValue || accumulatedUrl,\r\n };\r\n }\r\n\r\n private resolveRouteBreadcrumbConfig(\r\n snapshot: ActivatedRouteSnapshot,\r\n labelDataKey: string,\r\n ): IRouteBreadcrumbConfig | null {\r\n const rawConfig = snapshot.data?.[labelDataKey];\r\n if (rawConfig === false || rawConfig === null) {\r\n return { skip: true };\r\n }\r\n if (typeof rawConfig === 'string') {\r\n const label = rawConfig.trim();\r\n return label ? { label } : null;\r\n }\r\n if (!rawConfig || typeof rawConfig !== 'object' || Array.isArray(rawConfig)) {\r\n return null;\r\n }\r\n\r\n const config = rawConfig as Record<string, unknown>;\r\n return {\r\n label: String(config['label'] ?? '').trim() || undefined,\r\n value: String(config['value'] ?? '').trim() || undefined,\r\n skip: Boolean(config['skip']),\r\n };\r\n }\r\n\r\n private resolveFallbackRouteLabel(snapshot: ActivatedRouteSnapshot): string {\r\n const dataTitle = String(snapshot.data?.['title'] ?? '').trim();\r\n if (dataTitle) {\r\n return dataTitle;\r\n }\r\n\r\n const urlLabel = snapshot.url\r\n .map((segment) => this.humanizeSegment(String(segment?.path ?? '').trim()))\r\n .filter(Boolean)\r\n .join(' / ');\r\n if (urlLabel) {\r\n return urlLabel;\r\n }\r\n\r\n const routePath = String(snapshot.routeConfig?.path ?? '').trim();\r\n if (routePath.startsWith(':')) {\r\n const paramName = routePath.slice(1).split('/')[0];\r\n const paramValue = String(snapshot.params?.[paramName] ?? '').trim();\r\n if (paramValue) {\r\n return paramValue;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private humanizeSegment(value: string): string {\r\n const normalized = decodeURIComponent(String(value ?? '').trim());\r\n if (!normalized) {\r\n return '';\r\n }\r\n return normalized\r\n .replace(/[-_]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\r\n }\r\n\r\n private resolveRouteTemplate(\r\n template: string,\r\n snapshot: ActivatedRouteSnapshot,\r\n accumulatedSegments: string[],\r\n ): string {\r\n const normalizedTemplate = String(template ?? '').trim();\r\n if (!normalizedTemplate) {\r\n return '';\r\n }\r\n\r\n const currentUrl = accumulatedSegments.length > 0 ? `/${accumulatedSegments.join('/')}` : '/';\r\n const routeId =\r\n String(snapshot.params?.['id'] ?? snapshot.paramMap.get('id') ?? '').trim() || undefined;\r\n const context = {\r\n route: {\r\n id: routeId,\r\n url: currentUrl,\r\n params: snapshot.params ?? {},\r\n queryParams: snapshot.queryParams ?? {},\r\n data: snapshot.data ?? {},\r\n fragment: snapshot.fragment ?? '',\r\n path: String(snapshot.routeConfig?.path ?? '').trim(),\r\n },\r\n id: routeId,\r\n url: currentUrl,\r\n params: snapshot.params ?? {},\r\n queryParams: snapshot.queryParams ?? {},\r\n data: snapshot.data ?? {},\r\n } as Record<string, unknown>;\r\n\r\n const resolveToken = (token: string): string => {\r\n const path = String(token ?? '').trim();\r\n if (!path) {\r\n return '';\r\n }\r\n const resolved = get(context, path);\r\n if (resolved === null || resolved === undefined) {\r\n return '';\r\n }\r\n return String(resolved);\r\n };\r\n\r\n const withMustache = normalizedTemplate.replace(/\\{\\{([^}]+)\\}\\}/g, (_match, token: string) =>\r\n resolveToken(token),\r\n );\r\n return withMustache.replace(/\\{([^}]+)\\}/g, (_match, token: string) => resolveToken(token));\r\n }\r\n}\r\n","<element-wrapper [model]=\"model()\">\r\n <nav class=\"nvb-breadcrumbs\" aria-label=\"Breadcrumbs\" data-testid=\"breadcrumbs-root\">\r\n <ol>\r\n @for (item of renderedItems(); track $index; let itemIndex = $index; let isLast = $last) {\r\n <li>\r\n @if (item.ellipsis) {\r\n <span class=\"nvb-breadcrumbs__ellipsis\">...</span>\r\n } @else if (!isLast && item.value) {\r\n <a\r\n [attr.href]=\"resolveItemHref(item.value | dynamicText: model())\"\r\n (click)=\"onItemClick(item, itemIndex, $event)\"\r\n >\r\n {{ item.label | dynamicText: model() }}\r\n </a>\r\n } @else {\r\n <span class=\"nvb-breadcrumbs__current\">{{ item.label | dynamicText: model() }}</span>\r\n }\r\n\r\n @if (!isLast) {\r\n <nvb-icon class=\"nvb-breadcrumbs__separator\" [name]=\"separatorIcon()\"></nvb-icon>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n</element-wrapper>\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NgClass, NgStyle } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { input, inject, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
-
import { E as ElementActionService, a as ElementWrapper, N as NvbIcon } from './ngx-view-builder-ngx-view-builder-
|
|
4
|
+
import { E as ElementActionService, a as ElementWrapper, N as NvbIcon } from './ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs';
|
|
5
5
|
|
|
6
6
|
class IconElement {
|
|
7
7
|
model = input.required(...(ngDevMode ? [{ debugName: "model" }] : /* istanbul ignore next */ []));
|
|
@@ -60,4 +60,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
60
60
|
}], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }] } });
|
|
61
61
|
|
|
62
62
|
export { IconElement };
|
|
63
|
-
//# sourceMappingURL=ngx-view-builder-icon-element-
|
|
63
|
+
//# sourceMappingURL=ngx-view-builder-icon-element-CF0zR6AC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-view-builder-icon-element-
|
|
1
|
+
{"version":3,"file":"ngx-view-builder-icon-element-CF0zR6AC.mjs","sources":["../../../projects/ngx-view-builder/src/lib/core/shared/elements/icon-element/icon-element.ts","../../../projects/ngx-view-builder/src/lib/core/shared/elements/icon-element/icon-element.html"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common';\r\nimport { Component, computed, inject, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ElementWrapper } from '../../components/element-wrapper/element-wrapper';\r\nimport { NvbIcon } from '../../components/nvb-icon/nvb-icon';\r\nimport { IconModel } from '../../models/elements/icon.model';\r\nimport { ElementActionService } from '../../services/element-action.service';\r\n\r\n@Component({\r\n selector: 'icon-element',\r\n\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [ElementWrapper, NgClass, NgStyle, NvbIcon],\r\n templateUrl: './icon-element.html',\r\n\r\n styleUrl: './icon-element.scss',\r\n})\r\nexport class IconElement {\r\n model = input.required<IconModel>();\r\n\r\n private elementActionService = inject(ElementActionService);\r\n\r\n iconName = computed(() => {\r\n const value = String(this.model()?.iconName ?? '').trim();\r\n\r\n return value || 'star';\r\n });\r\n\r\n iconStyle = computed<Record<string, string>>(() => {\r\n const size = this.resolveSize(this.model()?.iconSize, 24);\r\n\r\n const color = String(this.model()?.iconColor ?? '').trim();\r\n\r\n return {\r\n width: `${size + 18}px`,\r\n\r\n height: `${size + 18}px`,\r\n\r\n color: color || 'var(--color-neutral-700)',\r\n\r\n 'font-size': `${size}px`,\r\n };\r\n });\r\n\r\n previewStyle = computed<Record<string, string>>(() => {\r\n const size = this.resolveSize(this.model()?.previewSize, 64);\r\n\r\n const color = String(this.model()?.iconColor ?? '').trim();\r\n\r\n return {\r\n width: `${size + 20}px`,\r\n\r\n height: `${size + 20}px`,\r\n\r\n color: color || 'var(--color-neutral-700)',\r\n\r\n 'font-size': `${size}px`,\r\n };\r\n });\r\n\r\n onIconClick(event: MouseEvent): void {\r\n event.preventDefault();\r\n\r\n event.stopPropagation();\r\n\r\n const runtimeContext: Record<string, unknown> = {\r\n value: this.iconName(),\r\n\r\n item: null,\r\n\r\n row: null,\r\n };\r\n\r\n const elementName = String(this.model().name ?? '').trim();\r\n\r\n if (elementName) {\r\n runtimeContext[elementName] = this.iconName();\r\n }\r\n\r\n void this.elementActionService.runActions(\r\n this.model(),\r\n\r\n this.model().events ?? [],\r\n\r\n 'click',\r\n\r\n runtimeContext,\r\n );\r\n }\r\n\r\n private resolveSize(value: unknown, fallback: number): number {\r\n const parsed = Number(value);\r\n\r\n if (!Number.isFinite(parsed) || parsed <= 0) {\r\n return fallback;\r\n }\r\n\r\n return Math.floor(parsed);\r\n }\r\n}\r\n","<element-wrapper [model]=\"model()\">\r\n <section class=\"nvb-icon-wrap\" data-testid=\"icon-root\">\r\n <button\r\n type=\"button\"\r\n class=\"nvb-icon\"\r\n [ngClass]=\"{ 'nvb-icon--filled': model().filled }\"\r\n [ngStyle]=\"iconStyle()\"\r\n (click)=\"onIconClick($event)\"\r\n >\r\n <nvb-icon [name]=\"iconName()\"></nvb-icon>\r\n </button>\r\n\r\n @if (model().showPreview) {\r\n <div class=\"nvb-icon__preview\" [ngStyle]=\"previewStyle()\">\r\n <nvb-icon [name]=\"iconName()\"></nvb-icon>\r\n </div>\r\n }\r\n </section>\r\n</element-wrapper>\r\n"],"names":[],"mappings":"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"}
|
|
@@ -5267,10 +5267,10 @@ class FileUploadModel extends ElementBaseModel {
|
|
|
5267
5267
|
uploadDataSourceName = '';
|
|
5268
5268
|
downloadDataSourceName = '';
|
|
5269
5269
|
deleteDataSourceName = '';
|
|
5270
|
-
fileKeyField = '
|
|
5271
|
-
fileNameField = '
|
|
5272
|
-
fileTypeField = '
|
|
5273
|
-
fileSizeField = '
|
|
5270
|
+
fileKeyField = 'key';
|
|
5271
|
+
fileNameField = 'name';
|
|
5272
|
+
fileTypeField = 'contentType';
|
|
5273
|
+
fileSizeField = 'size';
|
|
5274
5274
|
uploadFormFieldName = 'file';
|
|
5275
5275
|
dataService;
|
|
5276
5276
|
constructor(data, dataService) {
|
|
@@ -5297,10 +5297,10 @@ class FileUploadModel extends ElementBaseModel {
|
|
|
5297
5297
|
this.uploadDataSourceName = String(this.uploadDataSourceName ?? '').trim();
|
|
5298
5298
|
this.downloadDataSourceName = String(this.downloadDataSourceName ?? '').trim();
|
|
5299
5299
|
this.deleteDataSourceName = String(this.deleteDataSourceName ?? '').trim();
|
|
5300
|
-
this.fileKeyField = this.normalizeFieldName(this.fileKeyField, '
|
|
5301
|
-
this.fileNameField = this.normalizeFieldName(this.fileNameField, '
|
|
5302
|
-
this.fileTypeField = this.normalizeFieldName(this.fileTypeField, '
|
|
5303
|
-
this.fileSizeField = this.normalizeFieldName(this.fileSizeField, '
|
|
5300
|
+
this.fileKeyField = this.normalizeFieldName(this.fileKeyField, 'key');
|
|
5301
|
+
this.fileNameField = this.normalizeFieldName(this.fileNameField, 'name');
|
|
5302
|
+
this.fileTypeField = this.normalizeFieldName(this.fileTypeField, 'contentType');
|
|
5303
|
+
this.fileSizeField = this.normalizeFieldName(this.fileSizeField, 'size');
|
|
5304
5304
|
this.uploadFormFieldName = this.normalizeFieldName(this.uploadFormFieldName, 'file');
|
|
5305
5305
|
}
|
|
5306
5306
|
setFiles(files) {
|
|
@@ -6857,6 +6857,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
6857
6857
|
class LocaleFormatService {
|
|
6858
6858
|
structureService = inject(StructureService);
|
|
6859
6859
|
applicationLocaleService = inject(ApplicationLocaleService);
|
|
6860
|
+
/**
|
|
6861
|
+
* Deliberately does NOT fall back to `structure.settings.language`: that field is the runtime
|
|
6862
|
+
* UI-translation language (mutated by `api.setLanguage()`), and switching it must never change
|
|
6863
|
+
* date/number formatting. Formatting locale only ever comes from an explicit `settings.locale`
|
|
6864
|
+
* (set once by the form author), a host-provided `ApplicationLocaleService.setLocale(...)`, or —
|
|
6865
|
+
* absent both — the visitor's browser locale. None of those three are touched by `setLanguage()`.
|
|
6866
|
+
*/
|
|
6860
6867
|
resolveLocale(preferredLocale) {
|
|
6861
6868
|
const preferred = String(preferredLocale ?? '').trim();
|
|
6862
6869
|
if (preferred) {
|
|
@@ -6871,10 +6878,6 @@ class LocaleFormatService {
|
|
|
6871
6878
|
if (applicationLocale) {
|
|
6872
6879
|
return this.normalizeLocale(applicationLocale);
|
|
6873
6880
|
}
|
|
6874
|
-
const language = String(structure?.settings?.language ?? '').trim();
|
|
6875
|
-
if (language) {
|
|
6876
|
-
return this.normalizeLocale(language);
|
|
6877
|
-
}
|
|
6878
6881
|
return this.defaultLocale();
|
|
6879
6882
|
}
|
|
6880
6883
|
/** Nothing configured anywhere — fall back to the visitor's own browser locale, then English. */
|
|
@@ -12002,7 +12005,7 @@ const EN_UI_DICTIONARY = {
|
|
|
12002
12005
|
'property.debounceMs.hint': 'Time in milliseconds between the last keystroke and the search request.',
|
|
12003
12006
|
'property.defaultCountryCode.hint': 'Default country code for the phone field. Useful when most users are from a single market.\nExample: US',
|
|
12004
12007
|
'property.defaultValue.hint': 'Initial field value. Applied when the form opens or when the field is reset — suitable for starting state or default selection.',
|
|
12005
|
-
'property.deleteDataSourceName.hint': 'Data source for file deletion. The file key is passed according to the specified fileKeyField (e.g.
|
|
12008
|
+
'property.deleteDataSourceName.hint': 'Data source for file deletion. The file key is passed according to the specified fileKeyField (e.g. key).',
|
|
12006
12009
|
'property.deleteFilterDataSourceName.hint': 'Data source used for deleting saved filters. Typically for table saved filters functionality.',
|
|
12007
12010
|
'property.description.hint': 'Help text below the label. Suitable for a longer explanation that should always be visible at runtime, not just when hovering over the help icon.',
|
|
12008
12011
|
'property.descriptionText.hint': 'Additional description text shown as extended content after the main title or label. Suitable for message card and toast scenarios.',
|
|
@@ -12020,7 +12023,7 @@ const EN_UI_DICTIONARY = {
|
|
|
12020
12023
|
'property.disallowDeleteRows.hint': 'If enabled, the user cannot delete rows.',
|
|
12021
12024
|
'property.dismissible.hint': 'If enabled, the user can manually close the notification or card.',
|
|
12022
12025
|
'property.displayType.hint': 'Controls whether the progress is rendered as a horizontal bar or a circular indicator.',
|
|
12023
|
-
'property.downloadDataSourceName.hint': 'Data source for file download. The file key is passed according to the specified fileKeyField (e.g.
|
|
12026
|
+
'property.downloadDataSourceName.hint': 'Data source for file download. The file key is passed according to the specified fileKeyField (e.g. key).',
|
|
12024
12027
|
'property.dropzoneText.hint': 'Text in the file upload zone. Use a short and action-clear call to action, e.g. drag or select a file.',
|
|
12025
12028
|
'property.editable.hint': 'Marks that the value or record can be edited directly in that component. Most commonly used in table or card editing scenarios.',
|
|
12026
12029
|
'property.editorOptionLabelKey.hint': 'Object key used as the edit control option label. Use together with `editorOptionValueKey`.',
|
|
@@ -12050,10 +12053,10 @@ const EN_UI_DICTIONARY = {
|
|
|
12050
12053
|
'property.expression.hint': 'Expression that calculates the field value. Enter via Edit code. Example: {price} * {quantity}',
|
|
12051
12054
|
'property.falseLabel.hint': 'Label text for the off state.',
|
|
12052
12055
|
'property.falseValue.hint': 'Custom value when the toggle is off.',
|
|
12053
|
-
'property.fileKeyField.hint': 'Field name for the file key in the server object. Example:
|
|
12054
|
-
'property.fileNameField.hint': 'Field name for the file name in the server object. Example:
|
|
12055
|
-
'property.fileSizeField.hint': 'Field name for the file size in the server object. Example:
|
|
12056
|
-
'property.fileTypeField.hint': 'Field name for the file type in the server object. Example:
|
|
12056
|
+
'property.fileKeyField.hint': 'Field name for the file key in the server object. Example: key.',
|
|
12057
|
+
'property.fileNameField.hint': 'Field name for the file name in the server object. Example: name.',
|
|
12058
|
+
'property.fileSizeField.hint': 'Field name for the file size in the server object. Example: size.',
|
|
12059
|
+
'property.fileTypeField.hint': 'Field name for the file type in the server object. Example: contentType.',
|
|
12057
12060
|
'property.filled.hint': 'Controls whether the component is displayed as a filled, full, or more accented variant.',
|
|
12058
12061
|
'property.filterControlType.hint': 'What type of control to show in detailed search for this column. auto tries to match the column type.\nExample: select or toggle',
|
|
12059
12062
|
'property.filterIfEqual.hint': 'Show option only if its value EQUALS the specified value.\nExample: {el1} or 1 or "US".\nIf empty — filter not applied.',
|
|
@@ -19458,6 +19461,7 @@ function parseCssSize(value) {
|
|
|
19458
19461
|
class RendererService {
|
|
19459
19462
|
modelService = inject(ModelService);
|
|
19460
19463
|
expressionService = inject(ExpressionService);
|
|
19464
|
+
eventService = inject(EventService);
|
|
19461
19465
|
structureService = inject(StructureService);
|
|
19462
19466
|
dataService = inject(DataService);
|
|
19463
19467
|
dataSourceService = inject(DataSourceService);
|
|
@@ -19821,6 +19825,11 @@ class RendererService {
|
|
|
19821
19825
|
});
|
|
19822
19826
|
}
|
|
19823
19827
|
});
|
|
19828
|
+
// element.value above is a direct assignment, not routed through dataService.onValueChanged —
|
|
19829
|
+
// several elements (datepicker, select, etc.) only refresh their cached display on that event
|
|
19830
|
+
// or this one, so without firing it they keep showing a stale value after a full rebuild
|
|
19831
|
+
// (e.g. a language switch) even though the restored value itself is correct.
|
|
19832
|
+
this.eventService.afterPropertyChanged.fire({ payload: null });
|
|
19824
19833
|
}
|
|
19825
19834
|
hasDataValue(data, dataPath) {
|
|
19826
19835
|
if (!dataPath) {
|
|
@@ -48520,7 +48529,7 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
|
|
|
48520
48529
|
[ElementTypesEnum.AUTOCOMPLETE]: () => Promise.resolve().then(function () { return autocompleteElement; }).then((m) => m.AutocompleteElement),
|
|
48521
48530
|
[ElementTypesEnum.MULTI_SELECT]: () => Promise.resolve().then(function () { return multiSelectElement; }).then((m) => m.MultiSelectElement),
|
|
48522
48531
|
[ElementTypesEnum.MESSAGE_CARD]: () => Promise.resolve().then(function () { return messageCardElement; }).then((m) => m.MessageCardElement),
|
|
48523
|
-
[ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-
|
|
48532
|
+
[ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-BHD67zTY.mjs').then((m) => m.ToastElement),
|
|
48524
48533
|
[ElementTypesEnum.BADGE]: () => Promise.resolve().then(function () { return badgeElement; }).then((m) => m.BadgeElement),
|
|
48525
48534
|
[ElementTypesEnum.STATS_CARD]: () => Promise.resolve().then(function () { return statsCardElement; }).then((m) => m.StatsCardElement),
|
|
48526
48535
|
[ElementTypesEnum.CHART]: () => Promise.resolve().then(function () { return chartElement; }).then((m) => m.ChartElement),
|
|
@@ -48528,11 +48537,11 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
|
|
|
48528
48537
|
[ElementTypesEnum.IMAGE]: () => Promise.resolve().then(function () { return imageElement; }).then((m) => m.ImageElement),
|
|
48529
48538
|
[ElementTypesEnum.VIDEO]: () => Promise.resolve().then(function () { return videoElement; }).then((m) => m.VideoElement),
|
|
48530
48539
|
[ElementTypesEnum.IFRAME]: () => Promise.resolve().then(function () { return iframeElement; }).then((m) => m.IframeElement),
|
|
48531
|
-
[ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-
|
|
48532
|
-
[ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-
|
|
48540
|
+
[ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-9HrNMsbH.mjs').then((m) => m.AvatarElement),
|
|
48541
|
+
[ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-CF0zR6AC.mjs').then((m) => m.IconElement),
|
|
48533
48542
|
[ElementTypesEnum.DIVIDER]: () => Promise.resolve().then(function () { return dividerElement; }).then((m) => m.DividerElement),
|
|
48534
48543
|
[ElementTypesEnum.SPACER]: () => Promise.resolve().then(function () { return spacerElement; }).then((m) => m.SpacerElement),
|
|
48535
|
-
[ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-
|
|
48544
|
+
[ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-B53MyJZv.mjs').then((m) => m.BreadcrumbsElement),
|
|
48536
48545
|
[ElementTypesEnum.PAGE_TITLE]: () => Promise.resolve().then(function () { return pageTitleElement; }).then((m) => m.PageTitleElement),
|
|
48537
48546
|
[ElementTypesEnum.NUMBER_STEPPER]: () => Promise.resolve().then(function () { return numberStepperElement; }).then((m) => m.NumberStepperElement),
|
|
48538
48547
|
[ElementTypesEnum.TIME_PICKER]: () => Promise.resolve().then(function () { return timePickerElement; }).then((m) => m.TimePickerElement),
|
|
@@ -60370,6 +60379,12 @@ const NGX_VIEW_BUILDER_RUNTIME_INSTANCE_PROVIDERS = [
|
|
|
60370
60379
|
ElementActionService,
|
|
60371
60380
|
DropdownCoordinatorService,
|
|
60372
60381
|
NgxViewBuilderApiService,
|
|
60382
|
+
// LocaleFormatService reads StructureService for `settings.locale` — without an instance-scoped
|
|
60383
|
+
// copy here it resolves the app-root singleton instead, whose structure is never populated by
|
|
60384
|
+
// this runtime instance's RendererService, so date/number formatting silently ignores the form's
|
|
60385
|
+
// configured locale and falls back to the visitor's browser locale.
|
|
60386
|
+
LocaleFormatService,
|
|
60387
|
+
ApplicationLocaleService,
|
|
60373
60388
|
];
|
|
60374
60389
|
|
|
60375
60390
|
class NgxViewBuilderRenderer {
|
|
@@ -80634,7 +80649,7 @@ const LICENSE_VALIDATION_URL = 'https://api.ngxviewbuilder.io';
|
|
|
80634
80649
|
// publish build'a. Perpetual fallback modelis: raktas dengia visas versijas,
|
|
80635
80650
|
// isleistas iki jo expiresAt. Pasibaigus licencijai padengtos versijos veikia
|
|
80636
80651
|
// amzinai be watermark; velesnes (parsisiustos is npm) — watermark, kol neatsinaujinta.
|
|
80637
|
-
const RELEASE_DATE = new Date('2026-07-
|
|
80652
|
+
const RELEASE_DATE = new Date('2026-07-20T00:00:00Z');
|
|
80638
80653
|
const CACHE_KEY = 'ngx_vb_license_validation_v2';
|
|
80639
80654
|
const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
80640
80655
|
const MODAL_SHOWN_KEY = 'ngx_vb_license_modal_shown';
|
|
@@ -90221,4 +90236,4 @@ class ChoiceModel {
|
|
|
90221
90236
|
*/
|
|
90222
90237
|
|
|
90223
90238
|
export { ForgeInitializerService as $, APPLICATION_LOCALE_VALUE as A, BadgeModel as B, ChartModel as C, DynamicTextPipe as D, ElementActionService as E, ElementActionButtonToneEnum as F, ElementActionButtonVariantEnum as G, ElementActionDialogOperationEnum as H, ElementActionResponseModeEnum as I, ElementActionSetValueModeEnum as J, ElementActionToastPositionEnum as K, ElementActionToastVariantEnum as L, MarkupSecurityService as M, NvbIcon as N, ElementActionTriggerEnum as O, ElementActionTypeEnum as P, ElementBaseModel as Q, ElementDataSourceUseForEnum as R, StateService as S, ElementExecutionModeEnum as T, UiTranslationService as U, ElementFocusService as V, ElementTypesEnum as W, EmptyBlockModel as X, EventService as Y, ExpressionService as Z, FileUploadModel as _, ElementWrapper as a, TableColumnAlignEnum as a$, HeaderTabEnum as a0, IconModel as a1, IframeModel as a2, ImageModel as a3, LOCALE_CHOICES as a4, ListBoxModel as a5, ListGridModel as a6, MessageCardModel as a7, MultiSelectInputModel as a8, NGX_VIEW_BUILDER_PROJECT_LAYER as a9, NgxViewBuilderRuntime as aA, NgxViewBuilderSaveRequestedSourceEnum as aB, NgxViewBuilderTableSettingsSourceEnum as aC, NgxViewBuilderThemeModeEnum as aD, NgxViewBuilderTriggerEngineService as aE, NgxViewBuilderTriggerEventEnum as aF, NgxViewBuilderValidator as aG, NgxViewBuilderWebsocketMessageModeEnum as aH, NumberInputModel as aI, NumberStepperModel as aJ, PageTitleModel as aK, PanelModel as aL, PhoneInputModel as aM, ProgressBarModel as aN, ProgressFlowModel as aO, PropertyModel as aP, RadioInputModel as aQ, RichTextModel as aR, RuntimeVariableSourceTypeEnum as aS, SelectButtonModel as aT, SelectInputModel as aU, SignaturePadModel as aV, SingleCheckboxModel as aW, SliderModel as aX, SpacerModel as aY, SplitterModel as aZ, StatsCardModel as a_, NGX_VIEW_BUILDER_TEMPLATES_CAPABILITY as aa, NGX_VIEW_BUILDER_TEMPLATES_FEATURE_PACK_ID as ab, NGX_VIEW_BUILDER_UI_TRANSLATIONS as ac, NgxViewBuilder as ad, NgxViewBuilderActionExecutorService as ae, NgxViewBuilderAlignEnum as af, NgxViewBuilderApiService as ag, NgxViewBuilderAutomationActionTypeEnum as ah, NgxViewBuilderAutomationService as ai, NgxViewBuilderBuilder as aj, NgxViewBuilderBuilderTabRenderModeEnum as ak, NgxViewBuilderChromePositionEnum as al, NgxViewBuilderDataSourceTypeEnum as am, NgxViewBuilderDialogCloseReasonEnum as an, NgxViewBuilderExecutionReasonEnum as ao, NgxViewBuilderHeadlessService as ap, NgxViewBuilderInteractionStatusEnum as aq, NgxViewBuilderPageNavigationModeEnum as ar, NgxViewBuilderPreviewModeEnum as as, NgxViewBuilderProcessService as at, NgxViewBuilderRenderModeEnum as au, NgxViewBuilderRenderPhaseEnum as av, NgxViewBuilderRenderer as aw, NgxViewBuilderRuleExecutedBranchEnum as ax, NgxViewBuilderRuleRunModeEnum as ay, NgxViewBuilderRulesEngineService as az, AUTOMATION_BUILDER_TAB_ID as b, TableColumnCellActionsDisplayModeEnum as b0, TableColumnTypeEnum as b1, TableFilterControlTypeEnum as b2, TableFilterOptionsSourceTypeEnum as b3, TableInlineEditStartModeEnum as b4, TableInlineEditorTypeEnum as b5, TableModel as b6, TableRowActionsDropdownButtonStyleEnum as b7, TableStatusToneEnum as b8, TabsModel as b9, TabsProModel as ba, TemplateEngineService as bb, TemplateStorageModeEnum as bc, TemplatesEditor as bd, TextAreaModel as be, TextInputModel as bf, TimePickerModel as bg, ToastModel as bh, ToggleSwitchModel as bi, UiTranslatePipe as bj, ValueChangeTriggerEnum as bk, VideoModel as bl, bridgeNgxViewBuilderApiEvents as bm, createTemplatesLibraryProperty as bn, provideNgxViewBuilderExtensions as bo, provideNgxViewBuilderProjectLayer as bp, provideNgxViewBuilderProjectLayers as bq, provideNgxViewBuilderRuntime as br, provideNgxViewBuilderUiTranslations as bs, AccordionModel as c, ApplicationLocaleService as d, AutocompleteModel as e, AutomationStudio as f, AvatarModel as g, BreadcrumbsModel as h, BuilderModel as i, BuilderPageDisplayModeEnum as j, ButtonModel as k, CheckboxInputModel as l, ChoiceModel as m, ColumnFragmentModeEnum as n, CreatorStructureService as o, CustomHtmlModel as p, DatePickerModel as q, DateRangeModel as r, DialogModel as s, DividerModel as t, DocumentationGenerator as u, DynamicPanelModel as v, DynamicTableColumnModel as w, DynamicTableModel as x, DynamicTableRowColumnModel as y, EN_UI_DICTIONARY as z };
|
|
90224
|
-
//# sourceMappingURL=ngx-view-builder-ngx-view-builder-
|
|
90239
|
+
//# sourceMappingURL=ngx-view-builder-ngx-view-builder-Fw6YpF9v.mjs.map
|