@planeasyinc/le-angular 0.0.25 → 0.0.26

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.
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, signal, Injectable, computed, effect, untracked, Directive, input, ChangeDetectionStrategy, Component, output, forwardRef, ViewContainerRef, Injector, Renderer2, ElementRef, DestroyRef, viewChild } from '@angular/core';
2
+ import { InjectionToken, inject, signal, Injectable, computed, effect, untracked, Directive, input, Pipe, ChangeDetectionStrategy, Component, output, forwardRef, ViewContainerRef, Injector, Renderer2, ElementRef, DestroyRef, viewChild } from '@angular/core';
3
3
  import { HttpContextToken, HttpClient, HttpContext, HttpRequest, HttpEventType } from '@angular/common/http';
4
- import { map, filter, distinctUntilChanged, Subject, takeUntil, BehaviorSubject, firstValueFrom, of, tap, catchError, switchMap, from, concatMap, finalize, fromEvent, startWith } from 'rxjs';
4
+ import { map, Subject, firstValueFrom, distinctUntilChanged, takeUntil, BehaviorSubject, of, filter, tap, catchError, switchMap, from, concatMap, finalize, fromEvent, startWith } from 'rxjs';
5
5
  import { decodeJwt, UrlFragmentBuilder, normalizeConfig } from '@planeasyinc/le-core';
6
- import { Location, UpperCasePipe, JsonPipe, DatePipe, ViewportScroller } from '@angular/common';
6
+ import { Location, NgTemplateOutlet, UpperCasePipe, JsonPipe, DatePipe, ViewportScroller } from '@angular/common';
7
7
  import { CdkDrag } from '@angular/cdk/drag-drop';
8
8
  import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
9
9
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -138,10 +138,13 @@ class LEApiService {
138
138
  return url;
139
139
  }
140
140
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
141
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEApiService });
141
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEApiService, providedIn: 'root' });
142
142
  }
143
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEApiService, decorators: [{
144
- type: Injectable
144
+ type: Injectable,
145
+ args: [{
146
+ providedIn: 'root',
147
+ }]
145
148
  }] });
146
149
 
147
150
  class LeNavigationService {
@@ -197,17 +200,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
197
200
  type: Injectable
198
201
  }], ctorParameters: () => [] });
199
202
 
200
- class LEDataService {
203
+ class LeApiConfigService {
201
204
  apiService = inject(LEApiService);
202
- leNavigationService = inject(LeNavigationService);
203
205
  _config = signal(null);
206
+ _externalViewChange = new Subject();
207
+ config = this._config.asReadonly();
208
+ externalViewChange = this._externalViewChange.asObservable();
209
+ async requestConfig() {
210
+ try {
211
+ const config = await firstValueFrom(this.apiService.getConfig());
212
+ const normalizedConfig = normalizeConfig({ type: 'section', ...config });
213
+ this._config.set(normalizedConfig);
214
+ return normalizedConfig;
215
+ }
216
+ catch (error) {
217
+ console.error(error);
218
+ }
219
+ }
220
+ setView(node) {
221
+ this._externalViewChange.next(node);
222
+ }
223
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeApiConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
224
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeApiConfigService, providedIn: 'root' });
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeApiConfigService, decorators: [{
227
+ type: Injectable,
228
+ args: [{
229
+ providedIn: 'root',
230
+ }]
231
+ }] });
232
+
233
+ class LeViewService {
234
+ leNavigationService = inject(LeNavigationService);
235
+ configService = inject(LeApiConfigService);
204
236
  _view = signal(null);
205
237
  _parentPath = signal([]);
206
238
  _customCss = signal(null);
207
239
  view = this._view.asReadonly();
208
240
  parentPath = this._parentPath.asReadonly();
209
- config = this._config.asReadonly();
210
241
  customCss = this._customCss.asReadonly();
242
+ init(node) {
243
+ const initialView = this.getInitialView(node);
244
+ this._customCss.set(node.custom_css);
245
+ this._parentPath.set(initialView.path);
246
+ this.setView(initialView.node);
247
+ }
211
248
  registerEffects() {
212
249
  effect(() => {
213
250
  const node = this.leNavigationService.node();
@@ -228,39 +265,13 @@ class LEDataService {
228
265
  this.leNavigationService.navigate(node);
229
266
  }
230
267
  }
231
- requestConfig(force) {
232
- if (this._config() && !force) {
233
- return;
234
- }
235
- this.apiService.getConfig().subscribe({
236
- next: (config) => {
237
- const normalizedConfig = normalizeConfig({ type: 'section', ...config });
238
- this._config.set(normalizedConfig);
239
- this._customCss.set(config.custom_css);
240
- const initialView = this.getInitialView(normalizedConfig);
241
- this.setView(initialView.node);
242
- this._parentPath.set(initialView.path);
243
- },
244
- error: (err) => {
245
- console.error(err);
246
- },
247
- });
248
- }
249
- request(method, url, body) {
250
- return this.apiService
251
- .request(method, url, body)
252
- .pipe(filter((event) => HttpEventType.Response === event.type));
253
- }
254
- getObjectByClassName(className) {
255
- return this.apiService.getObject(className);
256
- }
257
268
  navigateByNodeId(id) {
258
269
  const node = this.getNodeById(id);
259
270
  if (node) {
260
271
  this.setView(node);
261
272
  }
262
273
  }
263
- getNodeById(id, node = this._config()) {
274
+ getNodeById(id, node = this.configService.config()) {
264
275
  if (!node)
265
276
  return null;
266
277
  if (node.id === id) {
@@ -292,10 +303,10 @@ class LEDataService {
292
303
  }
293
304
  throw new Error(`${node.type} is not a section`);
294
305
  }
295
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
296
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEDataService });
306
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
307
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeViewService });
297
308
  }
298
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LEDataService, decorators: [{
309
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeViewService, decorators: [{
299
310
  type: Injectable
300
311
  }] });
301
312
 
@@ -407,6 +418,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
407
418
  }]
408
419
  }] });
409
420
 
421
+ class IsParentMenuPipe {
422
+ transform(node) {
423
+ return node.type === 'section' && node.isParentMenu;
424
+ }
425
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: IsParentMenuPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
426
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: IsParentMenuPipe, isStandalone: true, name: "isParentMenu" });
427
+ }
428
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: IsParentMenuPipe, decorators: [{
429
+ type: Pipe,
430
+ args: [{
431
+ name: 'isParentMenu',
432
+ }]
433
+ }] });
434
+
410
435
  const close = {
411
436
  name: 'close',
412
437
  viewBox: '0 -960 960 960',
@@ -583,11 +608,19 @@ class SidebarComponent {
583
608
  element.style.transform = 'none';
584
609
  }
585
610
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
586
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SidebarComponent, isStandalone: true, selector: "le-sidebar", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, ngImport: i0, template: "<div leDrawerContainer>\n <aside leDrawer [opened]=\"isDrawerOpen()\" [width]=\"width()\" [hideOnClose]=\"isSmallScreen()\">\n <h3 class=\"le-sidebar-title\">\n <button\n class=\"le-sidebar-toggle\"\n (click)=\"onDrawerToggleClick($event)\"\n (keydown.enter)=\"onDrawerToggleClick($event)\"\n >\n @if (isDrawerOpen()) {\n {{ config().title }}\n }\n\n <le-icon name=\"chevron\"></le-icon>\n </button>\n </h3>\n\n @if (isDrawerOpen()) {\n <menu>\n @for (item of menu(); track item) {\n @if (isSection(item)) {\n <a\n class=\"le-menu-item\"\n tabindex=\"0\"\n [class.le-menu-item--expanded]=\"expanded().has(item)\"\n (click)=\"toggleExpanded($event, item)\"\n (keydown.enter)=\"toggleExpanded($event, item)\"\n >\n <div class=\"le-menu-title\">\n {{ item.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(item)\">\n @for (child of item.children; track child) {\n @if (isSection(child)) {\n <a\n class=\"le-menu-item\"\n [tabindex]=\"expanded().has(item) ? 0 : -1\"\n [class.le-menu-item--expanded]=\"expanded().has(child)\"\n (click)=\"toggleExpanded($event, child)\"\n (keydown.enter)=\"toggleExpanded($event, child)\"\n >\n <div class=\"le-menu-title\">\n {{ child.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(child)\">\n @for (grandchild of child.children; track grandchild) {\n <a\n [tabindex]=\"expanded().has(child) ? 0 : -1\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === grandchild.id\"\n (click)=\"onSidebarItemClick($event, grandchild)\"\n (keydown.enter)=\"onSidebarItemClick($event, grandchild)\"\n >\n <div class=\"le-menu-title\">\n {{ grandchild.title }}\n </div>\n </a>\n }\n </div>\n } @else {\n <a\n [tabindex]=\"expanded().has(item) ? 0 : -1\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === child.id\"\n (click)=\"onSidebarItemClick($event, child)\"\n (keydown.enter)=\"onSidebarItemClick($event, child)\"\n >\n <div class=\"le-menu-title\">\n {{ child.title }}\n </div>\n </a>\n }\n }\n </div>\n } @else {\n <a\n tabindex=\"0\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === item.id\"\n (click)=\"onSidebarItemClick($event, item)\"\n (keydown.enter)=\"onSidebarItemClick($event, item)\"\n >\n <div class=\"le-menu-title\">\n {{ item.title }}\n </div>\n </a>\n }\n }\n </menu>\n\n <div class=\"le-drawer-resizer\" cdkDrag (cdkDragMoved)=\"onDragMoved($event)\">\n <span class=\"le-drag-icon\">\u283F</span>\n </div>\n }\n </aside>\n\n <main leDrawerContent>\n <ng-content></ng-content>\n </main>\n</div>\n", dependencies: [{ kind: "directive", type: DrawerContentDirective, selector: "[leDrawerContent]" }, { kind: "directive", type: DrawerContainerDirective, selector: "[leDrawerContainer]" }, { kind: "directive", type: LeDrawerDirective, selector: "[leDrawer]", inputs: ["opened", "width", "hideOnClose", "type"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: LeIconComponent, selector: "le-icon", inputs: ["name", "size"] }] });
611
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SidebarComponent, isStandalone: true, selector: "le-sidebar", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, ngImport: i0, template: "<div leDrawerContainer>\n <aside leDrawer [opened]=\"isDrawerOpen()\" [width]=\"width()\" [hideOnClose]=\"isSmallScreen()\">\n <h3 class=\"le-sidebar-title\">\n <button\n class=\"le-sidebar-toggle\"\n (click)=\"onDrawerToggleClick($event)\"\n (keydown.enter)=\"onDrawerToggleClick($event)\"\n >\n @if (isDrawerOpen()) {\n {{ config().title }}\n }\n\n <le-icon name=\"chevron\"></le-icon>\n </button>\n </h3>\n\n @if (isDrawerOpen()) {\n <menu>\n @for (item of menu(); track item) {\n @if (item | isParentMenu) {\n <ng-container *ngTemplateOutlet=\"navParentTemplate; context: { node: item }\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"navChildTemplate; context: { node: item }\"></ng-container>\n }\n }\n </menu>\n\n <div class=\"le-drawer-resizer\" cdkDrag (cdkDragMoved)=\"onDragMoved($event)\">\n <span class=\"le-drag-icon\">\u283F</span>\n </div>\n }\n </aside>\n\n <main leDrawerContent>\n <ng-content></ng-content>\n </main>\n</div>\n\n<ng-template #navParentTemplate let-node=\"node\" let-parent=\"parent\">\n <a\n class=\"le-menu-item\"\n [tabindex]=\"!!parent && (expanded().has(parent) ? 0 : -1) || 0\"\n [class.le-menu-item--expanded]=\"expanded().has(node)\"\n (click)=\"toggleExpanded($event, node)\"\n (keydown.enter)=\"toggleExpanded($event, node)\"\n >\n <div class=\"le-menu-title\">\n {{ node.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(node)\">\n @for (child of node.children; track child) {\n @if (child | isParentMenu) {\n <ng-container *ngTemplateOutlet=\"navParentTemplate; context: { node: child, parent: node }\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"navChildTemplate; context: { node: child, parent: node }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #navChildTemplate let-node=\"node\" let-parent=\"parent\">\n <a\n [tabindex]=\"!!parent && (expanded().has(parent) ? 0 : -1) || 0\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === node.id\"\n (click)=\"onSidebarItemClick($event, node)\"\n (keydown.enter)=\"onSidebarItemClick($event, node)\"\n >\n <div class=\"le-menu-title\">\n {{ node.title }}\n </div>\n </a>\n</ng-template>\n", dependencies: [{ kind: "directive", type: DrawerContentDirective, selector: "[leDrawerContent]" }, { kind: "directive", type: DrawerContainerDirective, selector: "[leDrawerContainer]" }, { kind: "directive", type: LeDrawerDirective, selector: "[leDrawer]", inputs: ["opened", "width", "hideOnClose", "type"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: LeIconComponent, selector: "le-icon", inputs: ["name", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: IsParentMenuPipe, name: "isParentMenu" }] });
587
612
  }
588
613
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SidebarComponent, decorators: [{
589
614
  type: Component,
590
- args: [{ selector: 'le-sidebar', imports: [DrawerContentDirective, DrawerContainerDirective, LeDrawerDirective, CdkDrag, LeIconComponent], template: "<div leDrawerContainer>\n <aside leDrawer [opened]=\"isDrawerOpen()\" [width]=\"width()\" [hideOnClose]=\"isSmallScreen()\">\n <h3 class=\"le-sidebar-title\">\n <button\n class=\"le-sidebar-toggle\"\n (click)=\"onDrawerToggleClick($event)\"\n (keydown.enter)=\"onDrawerToggleClick($event)\"\n >\n @if (isDrawerOpen()) {\n {{ config().title }}\n }\n\n <le-icon name=\"chevron\"></le-icon>\n </button>\n </h3>\n\n @if (isDrawerOpen()) {\n <menu>\n @for (item of menu(); track item) {\n @if (isSection(item)) {\n <a\n class=\"le-menu-item\"\n tabindex=\"0\"\n [class.le-menu-item--expanded]=\"expanded().has(item)\"\n (click)=\"toggleExpanded($event, item)\"\n (keydown.enter)=\"toggleExpanded($event, item)\"\n >\n <div class=\"le-menu-title\">\n {{ item.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(item)\">\n @for (child of item.children; track child) {\n @if (isSection(child)) {\n <a\n class=\"le-menu-item\"\n [tabindex]=\"expanded().has(item) ? 0 : -1\"\n [class.le-menu-item--expanded]=\"expanded().has(child)\"\n (click)=\"toggleExpanded($event, child)\"\n (keydown.enter)=\"toggleExpanded($event, child)\"\n >\n <div class=\"le-menu-title\">\n {{ child.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(child)\">\n @for (grandchild of child.children; track grandchild) {\n <a\n [tabindex]=\"expanded().has(child) ? 0 : -1\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === grandchild.id\"\n (click)=\"onSidebarItemClick($event, grandchild)\"\n (keydown.enter)=\"onSidebarItemClick($event, grandchild)\"\n >\n <div class=\"le-menu-title\">\n {{ grandchild.title }}\n </div>\n </a>\n }\n </div>\n } @else {\n <a\n [tabindex]=\"expanded().has(item) ? 0 : -1\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === child.id\"\n (click)=\"onSidebarItemClick($event, child)\"\n (keydown.enter)=\"onSidebarItemClick($event, child)\"\n >\n <div class=\"le-menu-title\">\n {{ child.title }}\n </div>\n </a>\n }\n }\n </div>\n } @else {\n <a\n tabindex=\"0\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === item.id\"\n (click)=\"onSidebarItemClick($event, item)\"\n (keydown.enter)=\"onSidebarItemClick($event, item)\"\n >\n <div class=\"le-menu-title\">\n {{ item.title }}\n </div>\n </a>\n }\n }\n </menu>\n\n <div class=\"le-drawer-resizer\" cdkDrag (cdkDragMoved)=\"onDragMoved($event)\">\n <span class=\"le-drag-icon\">\u283F</span>\n </div>\n }\n </aside>\n\n <main leDrawerContent>\n <ng-content></ng-content>\n </main>\n</div>\n" }]
615
+ args: [{ selector: 'le-sidebar', imports: [
616
+ DrawerContentDirective,
617
+ DrawerContainerDirective,
618
+ LeDrawerDirective,
619
+ CdkDrag,
620
+ LeIconComponent,
621
+ NgTemplateOutlet,
622
+ IsParentMenuPipe,
623
+ ], template: "<div leDrawerContainer>\n <aside leDrawer [opened]=\"isDrawerOpen()\" [width]=\"width()\" [hideOnClose]=\"isSmallScreen()\">\n <h3 class=\"le-sidebar-title\">\n <button\n class=\"le-sidebar-toggle\"\n (click)=\"onDrawerToggleClick($event)\"\n (keydown.enter)=\"onDrawerToggleClick($event)\"\n >\n @if (isDrawerOpen()) {\n {{ config().title }}\n }\n\n <le-icon name=\"chevron\"></le-icon>\n </button>\n </h3>\n\n @if (isDrawerOpen()) {\n <menu>\n @for (item of menu(); track item) {\n @if (item | isParentMenu) {\n <ng-container *ngTemplateOutlet=\"navParentTemplate; context: { node: item }\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"navChildTemplate; context: { node: item }\"></ng-container>\n }\n }\n </menu>\n\n <div class=\"le-drawer-resizer\" cdkDrag (cdkDragMoved)=\"onDragMoved($event)\">\n <span class=\"le-drag-icon\">\u283F</span>\n </div>\n }\n </aside>\n\n <main leDrawerContent>\n <ng-content></ng-content>\n </main>\n</div>\n\n<ng-template #navParentTemplate let-node=\"node\" let-parent=\"parent\">\n <a\n class=\"le-menu-item\"\n [tabindex]=\"!!parent && (expanded().has(parent) ? 0 : -1) || 0\"\n [class.le-menu-item--expanded]=\"expanded().has(node)\"\n (click)=\"toggleExpanded($event, node)\"\n (keydown.enter)=\"toggleExpanded($event, node)\"\n >\n <div class=\"le-menu-title\">\n {{ node.title }}\n </div>\n\n <le-icon class=\"le-menu-chevron\" name=\"chevron\"></le-icon>\n </a>\n\n <div class=\"le-menu-group\" [class.le-menu-group--expanded]=\"expanded().has(node)\">\n @for (child of node.children; track child) {\n @if (child | isParentMenu) {\n <ng-container *ngTemplateOutlet=\"navParentTemplate; context: { node: child, parent: node }\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"navChildTemplate; context: { node: child, parent: node }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #navChildTemplate let-node=\"node\" let-parent=\"parent\">\n <a\n [tabindex]=\"!!parent && (expanded().has(parent) ? 0 : -1) || 0\"\n class=\"le-menu-item\"\n [class.le-menu-item--selected]=\"view().id === node.id\"\n (click)=\"onSidebarItemClick($event, node)\"\n (keydown.enter)=\"onSidebarItemClick($event, node)\"\n >\n <div class=\"le-menu-title\">\n {{ node.title }}\n </div>\n </a>\n</ng-template>\n" }]
591
624
  }], ctorParameters: () => [] });
592
625
 
593
626
  class ChartViewComponent {
@@ -893,12 +926,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
893
926
  }] });
894
927
 
895
928
  class SidePanelComponent {
896
- dataService = inject(LEDataService);
929
+ viewService = inject(LeViewService);
897
930
  _selectedTab = signal(0);
898
931
  data = input.required();
899
932
  config = input();
900
933
  event = output();
901
- node = this.dataService.view;
934
+ node = this.viewService.view;
902
935
  tabs = computed(() => {
903
936
  const data = this.data();
904
937
  return data.tabs.length ? data.tabs : undefined;
@@ -912,7 +945,7 @@ class SidePanelComponent {
912
945
  const data = this.data();
913
946
  untracked(() => {
914
947
  if (data.node) {
915
- this.dataService.setView(data.node, true);
948
+ this.viewService.setView(data.node, true);
916
949
  }
917
950
  });
918
951
  });
@@ -924,7 +957,7 @@ class SidePanelComponent {
924
957
  this._selectedTab.set(index);
925
958
  }
926
959
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
927
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SidePanelComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { event: "event" }, host: { properties: { "style.width": "\"100%\"", "style.overflow": "\"auto\"", "style.padding": "\"0 16px\"" } }, providers: [LEDataService, LEFiltersService], ngImport: i0, template: "@if (node(); as node) {\n <le-node [node]=\"node\" [config]=\"data()?.config\" (event)=\"onEvent($event)\"></le-node>\n}\n\n@if (tabs(); as tabs) {\n <div class=\"le-tabs-nav\">\n @for (tab of tabs; track tab.type; let idx = $index) {\n <button\n class=\"le-button le-button-flat le-button--success\"\n [attr.aria-label]=\"'Select ' + tab.type\"\n [class.le-button--success]=\"selectedTabIndex() === idx\"\n (click)=\"onTabClick(idx)\"\n >\n {{ tab.label }}\n </button>\n }\n <span class=\"spacer\"></span>\n\n <button\n aria-label=\"Close side panel\"\n class=\"le-button le-button-flat\"\n (click)=\"event.emit({ type: 'close' })\"\n >Close</button>\n </div>\n}\n\n@if (selectedTab(); as selectedTab) {\n <div class=\"le-tabs-content\">\n @switch (selectedTab.type) {\n @case ('tree') {\n <le-tree-view [data]=\"selectedTab.data\"></le-tree-view>\n }\n @case ('table') {\n <le-node\n [node]=\"selectedTab.data\"\n [config]=\"data()?.config\"\n (event)=\"onEvent($event)\"\n ></le-node>\n }\n @case ('block') {\n <le-block-view\n [data]=\"selectedTab.data\"\n [columns]=\"selectedTab.columns\"\n (event)=\"onEvent($event)\"\n ></le-block-view>\n }\n }\n </div>\n}\n", dependencies: [{ kind: "component", type: i0.forwardRef(() => NodeComponent), selector: "le-node", inputs: ["node", "config"], outputs: ["event"] }, { kind: "component", type: i0.forwardRef(() => TreeViewComponent), selector: "le-tree-view", inputs: ["data"] }, { kind: "component", type: i0.forwardRef(() => BlockViewComponent), selector: "le-block-view", inputs: ["data", "columns"], outputs: ["event"] }] });
960
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SidePanelComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { event: "event" }, host: { properties: { "style.width": "\"100%\"", "style.overflow": "\"auto\"", "style.padding": "\"0 16px\"" } }, providers: [LeViewService, LEFiltersService], ngImport: i0, template: "@if (node(); as node) {\n <le-node [node]=\"node\" [config]=\"data()?.config\" (event)=\"onEvent($event)\"></le-node>\n}\n\n@if (tabs(); as tabs) {\n <div class=\"le-tabs-nav\">\n @for (tab of tabs; track tab.type; let idx = $index) {\n <button\n class=\"le-button le-button-flat le-button--success\"\n [attr.aria-label]=\"'Select ' + tab.type\"\n [class.le-button--success]=\"selectedTabIndex() === idx\"\n (click)=\"onTabClick(idx)\"\n >\n {{ tab.label }}\n </button>\n }\n <span class=\"spacer\"></span>\n\n <button\n aria-label=\"Close side panel\"\n class=\"le-button le-button-flat\"\n (click)=\"event.emit({ type: 'close' })\"\n >Close</button>\n </div>\n}\n\n@if (selectedTab(); as selectedTab) {\n <div class=\"le-tabs-content\">\n @switch (selectedTab.type) {\n @case ('tree') {\n <le-tree-view [data]=\"selectedTab.data\"></le-tree-view>\n }\n @case ('table') {\n <le-node\n [node]=\"selectedTab.data\"\n [config]=\"data()?.config\"\n (event)=\"onEvent($event)\"\n ></le-node>\n }\n @case ('block') {\n <le-block-view\n [data]=\"selectedTab.data\"\n [columns]=\"selectedTab.columns\"\n (event)=\"onEvent($event)\"\n ></le-block-view>\n }\n }\n </div>\n}\n", dependencies: [{ kind: "component", type: i0.forwardRef(() => NodeComponent), selector: "le-node", inputs: ["node", "config"], outputs: ["event"] }, { kind: "component", type: i0.forwardRef(() => TreeViewComponent), selector: "le-tree-view", inputs: ["data"] }, { kind: "component", type: i0.forwardRef(() => BlockViewComponent), selector: "le-block-view", inputs: ["data", "columns"], outputs: ["event"] }] });
928
961
  }
929
962
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SidePanelComponent, decorators: [{
930
963
  type: Component,
@@ -932,7 +965,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
932
965
  '[style.width]': '"100%"',
933
966
  '[style.overflow]': '"auto"',
934
967
  '[style.padding]': '"0 16px"',
935
- }, imports: [forwardRef(() => NodeComponent), TreeViewComponent, BlockViewComponent], providers: [LEDataService, LEFiltersService], template: "@if (node(); as node) {\n <le-node [node]=\"node\" [config]=\"data()?.config\" (event)=\"onEvent($event)\"></le-node>\n}\n\n@if (tabs(); as tabs) {\n <div class=\"le-tabs-nav\">\n @for (tab of tabs; track tab.type; let idx = $index) {\n <button\n class=\"le-button le-button-flat le-button--success\"\n [attr.aria-label]=\"'Select ' + tab.type\"\n [class.le-button--success]=\"selectedTabIndex() === idx\"\n (click)=\"onTabClick(idx)\"\n >\n {{ tab.label }}\n </button>\n }\n <span class=\"spacer\"></span>\n\n <button\n aria-label=\"Close side panel\"\n class=\"le-button le-button-flat\"\n (click)=\"event.emit({ type: 'close' })\"\n >Close</button>\n </div>\n}\n\n@if (selectedTab(); as selectedTab) {\n <div class=\"le-tabs-content\">\n @switch (selectedTab.type) {\n @case ('tree') {\n <le-tree-view [data]=\"selectedTab.data\"></le-tree-view>\n }\n @case ('table') {\n <le-node\n [node]=\"selectedTab.data\"\n [config]=\"data()?.config\"\n (event)=\"onEvent($event)\"\n ></le-node>\n }\n @case ('block') {\n <le-block-view\n [data]=\"selectedTab.data\"\n [columns]=\"selectedTab.columns\"\n (event)=\"onEvent($event)\"\n ></le-block-view>\n }\n }\n </div>\n}\n" }]
968
+ }, imports: [forwardRef(() => NodeComponent), TreeViewComponent, BlockViewComponent], providers: [LeViewService, LEFiltersService], template: "@if (node(); as node) {\n <le-node [node]=\"node\" [config]=\"data()?.config\" (event)=\"onEvent($event)\"></le-node>\n}\n\n@if (tabs(); as tabs) {\n <div class=\"le-tabs-nav\">\n @for (tab of tabs; track tab.type; let idx = $index) {\n <button\n class=\"le-button le-button-flat le-button--success\"\n [attr.aria-label]=\"'Select ' + tab.type\"\n [class.le-button--success]=\"selectedTabIndex() === idx\"\n (click)=\"onTabClick(idx)\"\n >\n {{ tab.label }}\n </button>\n }\n <span class=\"spacer\"></span>\n\n <button\n aria-label=\"Close side panel\"\n class=\"le-button le-button-flat\"\n (click)=\"event.emit({ type: 'close' })\"\n >Close</button>\n </div>\n}\n\n@if (selectedTab(); as selectedTab) {\n <div class=\"le-tabs-content\">\n @switch (selectedTab.type) {\n @case ('tree') {\n <le-tree-view [data]=\"selectedTab.data\"></le-tree-view>\n }\n @case ('table') {\n <le-node\n [node]=\"selectedTab.data\"\n [config]=\"data()?.config\"\n (event)=\"onEvent($event)\"\n ></le-node>\n }\n @case ('block') {\n <le-block-view\n [data]=\"selectedTab.data\"\n [columns]=\"selectedTab.columns\"\n (event)=\"onEvent($event)\"\n ></le-block-view>\n }\n }\n </div>\n}\n" }]
936
969
  }], ctorParameters: () => [] });
937
970
 
938
971
  const positionMap = {
@@ -1297,7 +1330,7 @@ const download = (url) => {
1297
1330
 
1298
1331
  class TableViewComponent {
1299
1332
  apiService = inject(LEApiService);
1300
- dataService = inject(LEDataService);
1333
+ viewService = inject(LeViewService);
1301
1334
  filtersService = inject(LEFiltersService);
1302
1335
  sidePanelService = inject(LeSidePanelService);
1303
1336
  injector = inject(Injector);
@@ -1518,7 +1551,7 @@ class TableViewComponent {
1518
1551
  }
1519
1552
  }
1520
1553
  setView(node) {
1521
- this.dataService.setView(node, !!this.config()?.skipLocationChange);
1554
+ this.viewService.setView(node, !!this.config()?.skipLocationChange);
1522
1555
  }
1523
1556
  setPagination(pagination) {
1524
1557
  this._pageSize.set(pagination?.pageSize ?? 0);
@@ -2242,10 +2275,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
2242
2275
  }]
2243
2276
  }] });
2244
2277
 
2278
+ const isHttpResponse = (event) => {
2279
+ return event.type === HttpEventType.Response;
2280
+ };
2281
+
2245
2282
  let ID = 100_000_000;
2246
2283
  class FormViewComponent {
2247
2284
  apiService = inject(LEApiService);
2248
- dataService = inject(LEDataService);
2285
+ viewService = inject(LeViewService);
2249
2286
  attachmentService = inject(FormViewAttachmentService);
2250
2287
  viewportScroller = inject(ViewportScroller);
2251
2288
  toastService = inject(LeToastService);
@@ -2277,9 +2314,9 @@ class FormViewComponent {
2277
2314
  if (!action.async) {
2278
2315
  this._isLoading.set(true);
2279
2316
  }
2280
- return this.dataService
2317
+ return this.apiService
2281
2318
  .request(action.method, action.url, body)
2282
- .pipe(tap((response) => {
2319
+ .pipe(filter(isHttpResponse), tap((response) => {
2283
2320
  if (action.onSuccess && response.ok) {
2284
2321
  this.processActionList(action.onSuccess, response.body);
2285
2322
  }
@@ -2297,6 +2334,28 @@ class FormViewComponent {
2297
2334
  }
2298
2335
  return of(null);
2299
2336
  }));
2337
+ // return this.dataService
2338
+ // .request<ActionResponse, Record<string, any> | string>(action.method, action.url, body)
2339
+ // .pipe(
2340
+ // tap((response) => {
2341
+ // if (action.onSuccess && response.ok) {
2342
+ // this.processActionList(action.onSuccess, response.body);
2343
+ // } else if (action.onError && !response.ok) {
2344
+ // this.processActionList(action.onError);
2345
+ // } else {
2346
+ // this._isLoading.set(false);
2347
+ // }
2348
+ // this.event.emit({ type: 'refresh' });
2349
+ // this.event.emit({ type: 'close' });
2350
+ // }),
2351
+ // map(() => null),
2352
+ // catchError(() => {
2353
+ // if (action.onError) {
2354
+ // this.processActionList(action.onError);
2355
+ // }
2356
+ // return of(null);
2357
+ // }),
2358
+ // );
2300
2359
  },
2301
2360
  update_form: (action) => {
2302
2361
  const node = this.mapUpdateFormActionToFormNode(action.control_source);
@@ -2349,7 +2408,7 @@ class FormViewComponent {
2349
2408
  return of(null);
2350
2409
  },
2351
2410
  navigate_to_section: (action) => {
2352
- this.dataService.navigateByNodeId(action.section_id);
2411
+ this.viewService.navigateByNodeId(action.section_id);
2353
2412
  return of(null);
2354
2413
  },
2355
2414
  align_values: (action) => {
@@ -2386,7 +2445,7 @@ class FormViewComponent {
2386
2445
  const engine = this._engine();
2387
2446
  const sections = this._sections();
2388
2447
  const topLevelControls = this._topLevelControls();
2389
- const customCss = this.dataService.customCss() ?? '';
2448
+ const customCss = this.viewService.customCss() ?? '';
2390
2449
  if (!engine || !sections)
2391
2450
  return null;
2392
2451
  return {
@@ -2423,7 +2482,7 @@ class FormViewComponent {
2423
2482
  this._topLevelControls.set(form.controls ?? []);
2424
2483
  const resolvers = {
2425
2484
  attachment: (value) => this.attachmentService.resolve(value),
2426
- objectLatest: (className) => firstValueFrom(this.dataService.getObjectByClassName(className)),
2485
+ objectLatest: (className) => firstValueFrom(this.apiService.getObject(className)),
2427
2486
  };
2428
2487
  this._engine.set(createEngine(form, {}, resolvers));
2429
2488
  this.checkDelayedActions();
@@ -2440,7 +2499,7 @@ class FormViewComponent {
2440
2499
  });
2441
2500
  }
2442
2501
  setView(node) {
2443
- this.dataService.setView(node, !!this.config()?.skipLocationChange);
2502
+ this.viewService.setView(node, !!this.config()?.skipLocationChange);
2444
2503
  }
2445
2504
  processAction(action, response) {
2446
2505
  return this._actionHandlers[action.type](action, response);
@@ -2804,11 +2863,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
2804
2863
 
2805
2864
  class LeContainerComponent {
2806
2865
  auth = inject(LEAuthService);
2807
- dataService = inject(LEDataService);
2866
+ viewService = inject(LeViewService);
2867
+ configService = inject(LeApiConfigService);
2808
2868
  sidebar = viewChild(SidebarComponent);
2809
2869
  data = computed(() => {
2810
- const config = this.dataService.config();
2811
- const view = this.dataService.view();
2870
+ const config = this.configService.config();
2871
+ const view = this.viewService.view();
2812
2872
  if (!config || !view)
2813
2873
  return null;
2814
2874
  return {
@@ -2819,10 +2879,18 @@ class LeContainerComponent {
2819
2879
  constructor() {
2820
2880
  this.listenAuthState();
2821
2881
  this.listenPageInit();
2822
- this.dataService.registerEffects();
2882
+ this.listenExternalViewChange();
2883
+ this.viewService.registerEffects();
2823
2884
  }
2824
2885
  onSelectionChange(view) {
2825
- this.dataService.setView(view);
2886
+ this.viewService.setView(view);
2887
+ }
2888
+ listenExternalViewChange() {
2889
+ this.configService.externalViewChange.pipe(takeUntilDestroyed()).subscribe({
2890
+ next: (data) => {
2891
+ this.viewService.setView(data);
2892
+ },
2893
+ });
2826
2894
  }
2827
2895
  listenAuthState() {
2828
2896
  effect(() => {
@@ -2830,14 +2898,18 @@ class LeContainerComponent {
2830
2898
  const isGuest = this.auth.isGuest();
2831
2899
  if (!token && !isGuest)
2832
2900
  return;
2833
- untracked(() => {
2834
- this.dataService.requestConfig();
2901
+ untracked(async () => {
2902
+ const config = await this.configService.requestConfig();
2903
+ if (!config) {
2904
+ return;
2905
+ }
2906
+ this.viewService.init(config);
2835
2907
  });
2836
2908
  });
2837
2909
  }
2838
2910
  listenPageInit() {
2839
2911
  effect(() => {
2840
- const path = this.dataService.parentPath();
2912
+ const path = this.viewService.parentPath();
2841
2913
  const sidebar = this.sidebar();
2842
2914
  if (!(path.length && sidebar))
2843
2915
  return;
@@ -2849,11 +2921,11 @@ class LeContainerComponent {
2849
2921
  });
2850
2922
  }
2851
2923
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2852
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: LeContainerComponent, isStandalone: true, selector: "le-container", providers: [LEDataService, LEApiService, LEFiltersService, LeNavigationService], viewQueries: [{ propertyName: "sidebar", first: true, predicate: SidebarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (data(); as data) {\n <le-sidebar\n [config]=\"data.config\"\n [view]=\"data.view\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <le-filters>\n <le-node [node]=\"data.view\"></le-node>\n </le-filters>\n </le-sidebar>\n}\n", dependencies: [{ kind: "component", type: SidebarComponent, selector: "le-sidebar", inputs: ["config", "view"], outputs: ["selectionChange"] }, { kind: "component", type: NodeComponent, selector: "le-node", inputs: ["node", "config"], outputs: ["event"] }, { kind: "component", type: FiltersComponent, selector: "le-filters" }] });
2924
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: LeContainerComponent, isStandalone: true, selector: "le-container", providers: [LeViewService, LEApiService, LEFiltersService, LeNavigationService], viewQueries: [{ propertyName: "sidebar", first: true, predicate: SidebarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (data(); as data) {\n <le-sidebar\n [config]=\"data.config\"\n [view]=\"data.view\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <le-filters>\n <le-node [node]=\"data.view\"></le-node>\n </le-filters>\n </le-sidebar>\n}\n", dependencies: [{ kind: "component", type: SidebarComponent, selector: "le-sidebar", inputs: ["config", "view"], outputs: ["selectionChange"] }, { kind: "component", type: NodeComponent, selector: "le-node", inputs: ["node", "config"], outputs: ["event"] }, { kind: "component", type: FiltersComponent, selector: "le-filters" }] });
2853
2925
  }
2854
2926
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: LeContainerComponent, decorators: [{
2855
2927
  type: Component,
2856
- args: [{ selector: 'le-container', imports: [SidebarComponent, NodeComponent, FiltersComponent], providers: [LEDataService, LEApiService, LEFiltersService, LeNavigationService], template: "@if (data(); as data) {\n <le-sidebar\n [config]=\"data.config\"\n [view]=\"data.view\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <le-filters>\n <le-node [node]=\"data.view\"></le-node>\n </le-filters>\n </le-sidebar>\n}\n" }]
2928
+ args: [{ selector: 'le-container', imports: [SidebarComponent, NodeComponent, FiltersComponent], providers: [LeViewService, LEApiService, LEFiltersService, LeNavigationService], template: "@if (data(); as data) {\n <le-sidebar\n [config]=\"data.config\"\n [view]=\"data.view\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <le-filters>\n <le-node [node]=\"data.view\"></le-node>\n </le-filters>\n </le-sidebar>\n}\n" }]
2857
2929
  }], ctorParameters: () => [] });
2858
2930
 
2859
2931
  const provideConfig = (config) => {
@@ -2888,5 +2960,5 @@ const LEAuthInterceptor = (req, next) => {
2888
2960
  * Generated bundle index. Do not edit.
2889
2961
  */
2890
2962
 
2891
- export { CONFIG_TOKEN, LEAuthInterceptor, LEAuthService, CONFIG_TOKEN as LE_CONFIG_TOKEN, LE_REQUEST_CONTEXT_TOKEN, LeContainerComponent, LeToastService, provideConfig };
2963
+ export { CONFIG_TOKEN, IsParentMenuPipe, LEAuthInterceptor, LEAuthService, CONFIG_TOKEN as LE_CONFIG_TOKEN, LE_REQUEST_CONTEXT_TOKEN, LeApiConfigService, LeContainerComponent, LeToastService, provideConfig, provideConfig as provideEngineConfig };
2892
2964
  //# sourceMappingURL=planeasyinc-le-angular.mjs.map