@smartbit4all/ng-client 6.0.8 → 6.0.10

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.
Files changed (73) hide show
  1. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +1 -1
  2. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +7 -4
  3. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +3 -3
  4. package/esm2022/lib/session/smart-session.service.mjs +48 -23
  5. package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +3 -3
  6. package/esm2022/lib/smart-tree/smarttree.component.mjs +3 -3
  7. package/esm2022/lib/theme/theme.service.mjs +48 -0
  8. package/esm2022/lib/view-context/api/api/view.service.mjs +211 -1
  9. package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +2 -0
  10. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +1 -1
  11. package/esm2022/lib/view-context/api/model/iconPosition.mjs +1 -1
  12. package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +17 -0
  13. package/esm2022/lib/view-context/api/model/models.mjs +7 -1
  14. package/esm2022/lib/view-context/api/model/namedValidator.mjs +1 -1
  15. package/esm2022/lib/view-context/api/model/publishedViewData.mjs +13 -0
  16. package/esm2022/lib/view-context/api/model/shellProperty.mjs +13 -0
  17. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
  18. package/esm2022/lib/view-context/api/model/themeDefinition.mjs +2 -0
  19. package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +2 -0
  20. package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +2 -0
  21. package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
  22. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
  23. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
  24. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
  25. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
  26. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
  27. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
  28. package/esm2022/lib/view-context/api/model/view.mjs +1 -1
  29. package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
  30. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
  31. package/esm2022/lib/view-context/projects.mjs +3 -2
  32. package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +205 -0
  33. package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +205 -0
  34. package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +35 -0
  35. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +6 -4
  36. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +18 -10
  37. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +10 -7
  38. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +13 -3
  39. package/esm2022/lib/view-context/smart-view-context.module.mjs +13 -7
  40. package/esm2022/lib/view-context/smart-view-context.service.mjs +14 -5
  41. package/esm2022/projects.mjs +2 -1
  42. package/fesm2022/smartbit4all-ng-client.mjs +895 -313
  43. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  44. package/lib/session/smart-backend-bootstrap.config.d.ts +9 -1
  45. package/lib/session/smart-backend-bootstrap.service.d.ts +3 -1
  46. package/lib/session/smart-error-catching.interceptor.d.ts +2 -1
  47. package/lib/session/smart-session.service.d.ts +18 -1
  48. package/lib/theme/theme.service.d.ts +17 -0
  49. package/lib/view-context/api/api/view.service.d.ts +94 -0
  50. package/lib/view-context/api/api-default/binaryContentData.d.ts +2 -0
  51. package/lib/view-context/api/model/deviceInfo.d.ts +1 -0
  52. package/lib/view-context/api/model/menuTriggerType.d.ts +15 -0
  53. package/lib/view-context/api/model/models.d.ts +6 -0
  54. package/lib/view-context/api/model/publishedViewData.d.ts +14 -0
  55. package/lib/view-context/api/model/shellProperty.d.ts +15 -0
  56. package/lib/view-context/api/model/themeDefinition.d.ts +22 -0
  57. package/lib/view-context/api/model/themeDescriptor.d.ts +16 -0
  58. package/lib/view-context/api/model/themeShellDescriptor.d.ts +17 -0
  59. package/lib/view-context/api/model/uiActionDescriptor.d.ts +2 -0
  60. package/lib/view-context/projects.d.ts +2 -1
  61. package/lib/view-context/smart-ui-action/components/menu/{menu.component.d.ts → click/menu.component.d.ts} +8 -7
  62. package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +43 -0
  63. package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +16 -0
  64. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +1 -0
  65. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +2 -1
  66. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +3 -1
  67. package/lib/view-context/smart-view-context.module.d.ts +56 -54
  68. package/lib/view-context/smart-view-context.service.d.ts +4 -2
  69. package/package.json +1 -1
  70. package/projects.d.ts +1 -0
  71. package/smartbit4all-ng-client-6.0.10.tgz +0 -0
  72. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +0 -199
  73. package/smartbit4all-ng-client-6.0.8.tgz +0 -0
@@ -23,61 +23,63 @@ import * as i21 from "../smart-form/widgets/components/smart-multi-file-editor/s
23
23
  import * as i22 from "../smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component";
24
24
  import * as i23 from "../smart-form/highlightMacthingString-pipe";
25
25
  import * as i24 from "./smart-ui-action/ui-action-button/ui-action-button.component";
26
- import * as i25 from "./smart-ui-action/components/menu/menu.component";
27
- import * as i26 from "./smart-ui-action/components/upload-widget/upload-widget.component";
28
- import * as i27 from "./smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component";
29
- import * as i28 from "./smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component";
30
- import * as i29 from "./smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component";
31
- import * as i30 from "./smart-embedded-slot.directive";
32
- import * as i31 from "@angular/common";
33
- import * as i32 from "@angular/common/http";
34
- import * as i33 from "@angular/material/core";
35
- import * as i34 from "@angular/material/button";
36
- import * as i35 from "primeng/button";
37
- import * as i36 from "@angular/material/icon";
38
- import * as i37 from "@angular/material/snack-bar";
39
- import * as i38 from "../smart-icon/smart-icon.module";
40
- import * as i39 from "@angular/material/tooltip";
41
- import * as i40 from "../shared/shared.module";
42
- import * as i41 from "primeng/api";
43
- import * as i42 from "@angular/platform-browser";
44
- import * as i43 from "@angular/material/chips";
45
- import * as i44 from "@angular/forms";
46
- import * as i45 from "@angular/material/form-field";
47
- import * as i46 from "@angular/material/checkbox";
48
- import * as i47 from "@angular/material/select";
49
- import * as i48 from "@angular/material/input";
50
- import * as i49 from "@angular/material/datepicker";
51
- import * as i50 from "@angular/material-moment-adapter";
52
- import * as i51 from "@angular/material/radio";
53
- import * as i52 from "@angular/material/slide-toggle";
54
- import * as i53 from "@angular/material/autocomplete";
55
- import * as i54 from "ngx-quill";
56
- import * as i55 from "@angular/cdk/drag-drop";
57
- import * as i56 from "@angular/youtube-player";
58
- import * as i57 from "primeng/inputtext";
59
- import * as i58 from "primeng/messages";
60
- import * as i59 from "primeng/overlaypanel";
61
- import * as i60 from "primeng/dropdown";
62
- import * as i61 from "primeng/multiselect";
63
- import * as i62 from "primeng/inputswitch";
64
- import * as i63 from "primeng/inputnumber";
65
- import * as i64 from "primeng/tooltip";
66
- import * as i65 from "primeng/inputtextarea";
67
- import * as i66 from "primeng/image";
68
- import * as i67 from "primeng/floatlabel";
69
- import * as i68 from "primeng/toast";
70
- import * as i69 from "primeng/dynamicdialog";
71
- import * as i70 from "primeng/fileupload";
72
- import * as i71 from "primeng/chips";
73
- import * as i72 from "primeng/calendar";
74
- import * as i73 from "primeng/checkbox";
75
- import * as i74 from "primeng/orderlist";
76
- import * as i75 from "primeng/inputmask";
77
- import * as i76 from "primeng/editor";
78
- import * as i77 from "@angular/material/menu";
26
+ import * as i25 from "./smart-ui-action/components/menu/click/menu.component";
27
+ import * as i26 from "./smart-ui-action/components/menu/hover/hover-menu.component";
28
+ import * as i27 from "./smart-ui-action/components/upload-widget/upload-widget.component";
29
+ import * as i28 from "./smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component";
30
+ import * as i29 from "./smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component";
31
+ import * as i30 from "./smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component";
32
+ import * as i31 from "./smart-embedded-slot.directive";
33
+ import * as i32 from "./smart-ui-action/components/theme-selector/theme-selector.component";
34
+ import * as i33 from "@angular/common";
35
+ import * as i34 from "@angular/common/http";
36
+ import * as i35 from "@angular/material/core";
37
+ import * as i36 from "@angular/material/button";
38
+ import * as i37 from "primeng/button";
39
+ import * as i38 from "@angular/material/icon";
40
+ import * as i39 from "@angular/material/snack-bar";
41
+ import * as i40 from "../smart-icon/smart-icon.module";
42
+ import * as i41 from "@angular/material/tooltip";
43
+ import * as i42 from "../shared/shared.module";
44
+ import * as i43 from "primeng/api";
45
+ import * as i44 from "@angular/platform-browser";
46
+ import * as i45 from "@angular/material/chips";
47
+ import * as i46 from "@angular/forms";
48
+ import * as i47 from "@angular/material/form-field";
49
+ import * as i48 from "@angular/material/checkbox";
50
+ import * as i49 from "@angular/material/select";
51
+ import * as i50 from "@angular/material/input";
52
+ import * as i51 from "@angular/material/datepicker";
53
+ import * as i52 from "@angular/material-moment-adapter";
54
+ import * as i53 from "@angular/material/radio";
55
+ import * as i54 from "@angular/material/slide-toggle";
56
+ import * as i55 from "@angular/material/autocomplete";
57
+ import * as i56 from "ngx-quill";
58
+ import * as i57 from "@angular/cdk/drag-drop";
59
+ import * as i58 from "@angular/youtube-player";
60
+ import * as i59 from "primeng/inputtext";
61
+ import * as i60 from "primeng/messages";
62
+ import * as i61 from "primeng/overlaypanel";
63
+ import * as i62 from "primeng/dropdown";
64
+ import * as i63 from "primeng/multiselect";
65
+ import * as i64 from "primeng/inputswitch";
66
+ import * as i65 from "primeng/inputnumber";
67
+ import * as i66 from "primeng/tooltip";
68
+ import * as i67 from "primeng/inputtextarea";
69
+ import * as i68 from "primeng/image";
70
+ import * as i69 from "primeng/floatlabel";
71
+ import * as i70 from "primeng/toast";
72
+ import * as i71 from "primeng/dynamicdialog";
73
+ import * as i72 from "primeng/fileupload";
74
+ import * as i73 from "primeng/chips";
75
+ import * as i74 from "primeng/calendar";
76
+ import * as i75 from "primeng/checkbox";
77
+ import * as i76 from "primeng/orderlist";
78
+ import * as i77 from "primeng/inputmask";
79
+ import * as i78 from "primeng/editor";
80
+ import * as i79 from "@angular/material/menu";
79
81
  export declare class SmartViewContextModule {
80
82
  static ɵfac: i0.ɵɵFactoryDeclaration<SmartViewContextModule, never>;
81
- static ɵmod: i0.ɵɵNgModuleDeclaration<SmartViewContextModule, [typeof i1.MessageDialogComponent, typeof i2.SmartViewContextErrorDialogComponent, typeof i3.SmartViewRedirect, typeof i4.UiActionToolbarComponent, typeof i5.FileEditorToolbarComponent, typeof i6.UiActionInputDialogComponent, typeof i7.UiActionConfirmDialogComponent, typeof i8.UiActionFileUploadDialogComponent, typeof i9.InvalidFieldsSnackBarComponent, typeof i10.SmartformComponent, typeof i11.UiActionDialogButtonComponent, typeof i12.SmartformwidgetComponent, typeof i13.SmartfileuploaderComponent, typeof i14.TrackCapsDirective, typeof i15.ComparableDropdownDirective, typeof i16.ComparableMultiselectDirective, typeof i17.LargeFileSnackBarComponent, typeof i18.SortableWidgetComponent, typeof i19.SmartMonthPickerComponent, typeof i20.SmartFileEditorComponent, typeof i21.SmartMultiFileEditorComponent, typeof i22.SmartVoiceRecorderComponent, typeof i23.HighlightPipe, typeof i24.UiActionButtonComponent, typeof i25.MenuComponent, typeof i26.UploadWidgetComponent, typeof i27.VoiceRecordWidgetComponent, typeof i28.PhotoCaptureWidgetComponent, typeof i29.PrimeFileUploaderComponent, typeof i30.SmartEmbeddedSlotDirective], [typeof i31.CommonModule, typeof i32.HttpClientModule, typeof i33.MatCommonModule, typeof i34.MatButtonModule, typeof i35.ButtonModule, typeof i36.MatIconModule, typeof i37.MatSnackBarModule, typeof i38.SmartIconModule, typeof i39.MatTooltipModule, typeof i40.SharedModule, typeof i41.SharedModule, typeof i42.BrowserModule, typeof i43.MatChipsModule, typeof i44.FormsModule, typeof i44.ReactiveFormsModule, typeof i45.MatFormFieldModule, typeof i46.MatCheckboxModule, typeof i47.MatSelectModule, typeof i48.MatInputModule, typeof i49.MatDatepickerModule, typeof i50.MatMomentDateModule, typeof i51.MatRadioModule, typeof i52.MatSlideToggleModule, typeof i53.MatAutocompleteModule, typeof i54.QuillModule, typeof i55.DragDropModule, typeof i56.YouTubePlayerModule, typeof i57.InputTextModule, typeof i58.MessagesModule, typeof i59.OverlayPanelModule, typeof i60.DropdownModule, typeof i61.MultiSelectModule, typeof i44.FormsModule, typeof i62.InputSwitchModule, typeof i63.InputNumberModule, typeof i64.TooltipModule, typeof i65.InputTextareaModule, typeof i66.ImageModule, typeof i67.FloatLabelModule, typeof i31.CommonModule, typeof i68.ToastModule, typeof i69.DynamicDialogModule, typeof i70.FileUploadModule, typeof i71.ChipsModule, typeof i72.CalendarModule, typeof i73.CheckboxModule, typeof i74.OrderListModule, typeof i75.InputMaskModule, typeof i76.EditorModule, typeof i77.MatMenuModule, typeof i38.SmartIconModule], [typeof i4.UiActionToolbarComponent, typeof i6.UiActionInputDialogComponent, typeof i10.SmartformComponent, typeof i12.SmartformwidgetComponent, typeof i11.UiActionDialogButtonComponent, typeof i13.SmartfileuploaderComponent, typeof i23.HighlightPipe, typeof i15.ComparableDropdownDirective, typeof i16.ComparableMultiselectDirective, typeof i24.UiActionButtonComponent, typeof i25.MenuComponent, typeof i26.UploadWidgetComponent, typeof i27.VoiceRecordWidgetComponent, typeof i28.PhotoCaptureWidgetComponent, typeof i20.SmartFileEditorComponent, typeof i21.SmartMultiFileEditorComponent, typeof i22.SmartVoiceRecorderComponent, typeof i30.SmartEmbeddedSlotDirective]>;
83
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SmartViewContextModule, [typeof i1.MessageDialogComponent, typeof i2.SmartViewContextErrorDialogComponent, typeof i3.SmartViewRedirect, typeof i4.UiActionToolbarComponent, typeof i5.FileEditorToolbarComponent, typeof i6.UiActionInputDialogComponent, typeof i7.UiActionConfirmDialogComponent, typeof i8.UiActionFileUploadDialogComponent, typeof i9.InvalidFieldsSnackBarComponent, typeof i10.SmartformComponent, typeof i11.UiActionDialogButtonComponent, typeof i12.SmartformwidgetComponent, typeof i13.SmartfileuploaderComponent, typeof i14.TrackCapsDirective, typeof i15.ComparableDropdownDirective, typeof i16.ComparableMultiselectDirective, typeof i17.LargeFileSnackBarComponent, typeof i18.SortableWidgetComponent, typeof i19.SmartMonthPickerComponent, typeof i20.SmartFileEditorComponent, typeof i21.SmartMultiFileEditorComponent, typeof i22.SmartVoiceRecorderComponent, typeof i23.HighlightPipe, typeof i24.UiActionButtonComponent, typeof i25.ClickMenuComponent, typeof i26.HoverMenuComponent, typeof i27.UploadWidgetComponent, typeof i28.VoiceRecordWidgetComponent, typeof i29.PhotoCaptureWidgetComponent, typeof i30.PrimeFileUploaderComponent, typeof i31.SmartEmbeddedSlotDirective, typeof i32.ThemeSelectorComponent], [typeof i33.CommonModule, typeof i34.HttpClientModule, typeof i35.MatCommonModule, typeof i36.MatButtonModule, typeof i37.ButtonModule, typeof i38.MatIconModule, typeof i39.MatSnackBarModule, typeof i40.SmartIconModule, typeof i41.MatTooltipModule, typeof i42.SharedModule, typeof i43.SharedModule, typeof i44.BrowserModule, typeof i45.MatChipsModule, typeof i46.FormsModule, typeof i46.ReactiveFormsModule, typeof i47.MatFormFieldModule, typeof i48.MatCheckboxModule, typeof i49.MatSelectModule, typeof i50.MatInputModule, typeof i51.MatDatepickerModule, typeof i52.MatMomentDateModule, typeof i53.MatRadioModule, typeof i54.MatSlideToggleModule, typeof i55.MatAutocompleteModule, typeof i56.QuillModule, typeof i57.DragDropModule, typeof i58.YouTubePlayerModule, typeof i59.InputTextModule, typeof i60.MessagesModule, typeof i61.OverlayPanelModule, typeof i62.DropdownModule, typeof i63.MultiSelectModule, typeof i46.FormsModule, typeof i64.InputSwitchModule, typeof i65.InputNumberModule, typeof i66.TooltipModule, typeof i67.InputTextareaModule, typeof i68.ImageModule, typeof i69.FloatLabelModule, typeof i33.CommonModule, typeof i70.ToastModule, typeof i71.DynamicDialogModule, typeof i72.FileUploadModule, typeof i73.ChipsModule, typeof i74.CalendarModule, typeof i75.CheckboxModule, typeof i76.OrderListModule, typeof i77.InputMaskModule, typeof i78.EditorModule, typeof i79.MatMenuModule, typeof i40.SmartIconModule], [typeof i4.UiActionToolbarComponent, typeof i6.UiActionInputDialogComponent, typeof i10.SmartformComponent, typeof i12.SmartformwidgetComponent, typeof i11.UiActionDialogButtonComponent, typeof i13.SmartfileuploaderComponent, typeof i23.HighlightPipe, typeof i15.ComparableDropdownDirective, typeof i16.ComparableMultiselectDirective, typeof i24.UiActionButtonComponent, typeof i25.ClickMenuComponent, typeof i27.UploadWidgetComponent, typeof i28.VoiceRecordWidgetComponent, typeof i29.PhotoCaptureWidgetComponent, typeof i20.SmartFileEditorComponent, typeof i21.SmartMultiFileEditorComponent, typeof i22.SmartVoiceRecorderComponent, typeof i31.SmartEmbeddedSlotDirective]>;
82
84
  static ɵinj: i0.ɵɵInjectorDeclaration<SmartViewContextModule>;
83
85
  }
@@ -9,6 +9,7 @@ import { SmartViewContextDialogService } from './smart-view-context-dialog.servi
9
9
  import { ComponentLibrary } from './utility/componentLibrary';
10
10
  import { SlotKind } from './view-slot-resolution';
11
11
  import { DefaultViewComponentEntry } from './default-view-components.token';
12
+ import { ThemeService } from '../theme/theme.service';
12
13
  import * as i0 from "@angular/core";
13
14
  export declare const SmartViewContextErrorDialogButtonLabel = "SmartViewContextErrorDialogButtonLabel";
14
15
  export declare const SmartViewContextErrorDialogTitle = "SmartViewContextErrorDialogTitle";
@@ -20,6 +21,7 @@ export declare class SmartViewContextService implements OnDestroy {
20
21
  private session;
21
22
  private dialog;
22
23
  private apiQueueService;
24
+ private themeService;
23
25
  private inject;
24
26
  private readonly viewContextUuidName;
25
27
  private readonly viewContextUuidHeaderName;
@@ -54,7 +56,7 @@ export declare class SmartViewContextService implements OnDestroy {
54
56
  private _translateService?;
55
57
  translateServiceChanged: Subject<void>;
56
58
  componentLibrary: ComponentLibrary | undefined;
57
- constructor(view: ViewService, session: SmartSessionService, dialog: SmartViewContextDialogService, apiQueueService: ApiQueueService, inject: Injector, compLib?: ComponentLibrary, defaultViewComponents?: DefaultViewComponentEntry[]);
59
+ constructor(view: ViewService, session: SmartSessionService, dialog: SmartViewContextDialogService, apiQueueService: ApiQueueService, themeService: ThemeService, inject: Injector, compLib?: ComponentLibrary, defaultViewComponents?: DefaultViewComponentEntry[]);
58
60
  ngOnDestroy(): void;
59
61
  follow(uuid: string, detectChange: SmartSubject<any>): void;
60
62
  unfollow(uuid: string): void;
@@ -147,7 +149,7 @@ export declare class SmartViewContextService implements OnDestroy {
147
149
  load(uuid: string): Promise<ComponentModel | undefined>;
148
150
  load2(uuid: string): Promise<ViewContextChange | undefined>;
149
151
  getCurrentViewContext(): ViewContextData | undefined;
150
- static ɵfac: i0.ɵɵFactoryDeclaration<SmartViewContextService, [null, null, null, null, null, { optional: true; }, { optional: true; }]>;
152
+ static ɵfac: i0.ɵɵFactoryDeclaration<SmartViewContextService, [null, null, null, null, null, null, { optional: true; }, { optional: true; }]>;
151
153
  static ɵprov: i0.ɵɵInjectableDeclaration<SmartViewContextService>;
152
154
  }
153
155
  export declare const IS_ASYNC_PARAM_NAME = "isAsync";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartbit4all/ng-client",
3
- "version": "6.0.8",
3
+ "version": "6.0.10",
4
4
  "description": "Angular client library for the smartbit4all platform — a server-driven UI framework that renders views, pages, forms, grids, trees and dialogs from backend (ViewApi/PageApi) definitions. Provides reactive view-context state management, dynamic component layouts and OpenAPI-generated BFF clients.",
5
5
  "peerDependencies": {
6
6
  "@angular/animations": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
package/projects.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './lib/smart-ng-client.service';
2
2
  export * from './lib/smart-ng-client.module';
3
3
  export * from './lib/smart-client/smart-file-uploader/smart-file-uploader.component';
4
4
  export * from './lib/smart-client/projects';
5
+ export * from './lib/theme/theme.service';
5
6
  export * from './lib/component-factory-service/projects';
6
7
  export * from './lib/session/projects';
7
8
  export * from './lib/smart-component-layout/projects';
@@ -1,199 +0,0 @@
1
- import { Component, EventEmitter, HostListener, Inject, Input, Optional, Output, ViewChild, ViewChildren, } from '@angular/core';
2
- import { Subject, takeUntil } from 'rxjs';
3
- import { COMPONENT_LIBRARY, ComponentLibrary } from '../../../utility/componentLibrary';
4
- import { TemplatePortal } from '@angular/cdk/portal';
5
- import { SUBMENU_POSITIONS, ROOT_MENU_POSITIONS } from './menu.constants';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./menu.service";
8
- import * as i2 from "@angular/cdk/overlay";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "../../../../smart-icon/smart-icon/smart-icon.component";
11
- import * as i5 from "../../ui-action-button/ui-action-button.component";
12
- import * as i6 from "../../../utility/componentLibrary";
13
- export class MenuComponent {
14
- constructor(menuService, overlay, viewContainerRef, overlayPositionBuilder, compLib) {
15
- this.menuService = menuService;
16
- this.overlay = overlay;
17
- this.viewContainerRef = viewContainerRef;
18
- this.overlayPositionBuilder = overlayPositionBuilder;
19
- this.compLib = compLib;
20
- this.overlayRef = null;
21
- this.isSubmenu = false;
22
- this.actionClick = new EventEmitter();
23
- this.submenuOpened = new EventEmitter();
24
- this.destroy$ = new Subject();
25
- this.submenuOpenMap = new Map();
26
- this.subActions = [];
27
- this.hasCheckedChildren = false;
28
- this.compLib = compLib ?? ComponentLibrary.PRIMENG;
29
- if (this.compLib === ComponentLibrary.PRIMENG) {
30
- this.icon = 'chevron-right';
31
- }
32
- else if (this.compLib === ComponentLibrary.MATERIAL) {
33
- this.icon = 'chevron_right';
34
- }
35
- }
36
- ngOnInit() {
37
- this.menuService
38
- .getCloseSignal()
39
- .pipe(takeUntil(this.destroy$))
40
- .subscribe(() => {
41
- this.closeMenu();
42
- });
43
- }
44
- ngAfterViewChecked() {
45
- if (this.isOpen && !this.hasCheckedChildren && this.submenuComponents.length > 0) {
46
- this.hasCheckedChildren = true;
47
- }
48
- }
49
- ngOnChanges(changes) {
50
- if (changes['triggerAction']) {
51
- const trigger = changes['triggerAction'].currentValue;
52
- const previousTrigger = changes['triggerAction'].previousValue;
53
- this.subActions = trigger?.subActions ?? [];
54
- if (this.isOpen && previousTrigger) {
55
- const hasSubActionsChanged = this.hasSubActionsChanged(previousTrigger?.subActions, trigger?.subActions);
56
- if (hasSubActionsChanged) {
57
- this.refreshOverlay();
58
- }
59
- }
60
- }
61
- }
62
- hasSubActionsChanged(oldSubActions, newSubActions) {
63
- const oldLength = oldSubActions?.length ?? 0;
64
- const newLength = newSubActions?.length ?? 0;
65
- if (oldLength !== newLength) {
66
- return true;
67
- }
68
- if (oldLength > 0 && newLength > 0) {
69
- for (let i = 0; i < newLength; i++) {
70
- if (oldSubActions[i].code !== newSubActions[i].code) {
71
- return true;
72
- }
73
- }
74
- }
75
- return false;
76
- }
77
- ngOnDestroy() {
78
- this.destroy$.next();
79
- this.destroy$.complete();
80
- }
81
- onActionClick(action) {
82
- if (!action.disabled) {
83
- this.actionClick.emit(action);
84
- this.menuService.closeAllMenus();
85
- }
86
- }
87
- onMenuClick(event) {
88
- event.stopPropagation();
89
- }
90
- onDocumentClick(event) {
91
- this.menuService.closeAllMenus();
92
- if (this.overlayRef) {
93
- this.closeMenu();
94
- }
95
- }
96
- get isOpen() {
97
- return !!this.overlayRef;
98
- }
99
- closeMenu() {
100
- if (this.overlayRef) {
101
- this.overlayRef.dispose();
102
- this.overlayRef = null;
103
- this.hasCheckedChildren = false;
104
- }
105
- if (this.submenuComponents && this.submenuComponents.length > 0) {
106
- this.submenuComponents.forEach((submenu) => {
107
- submenu.closeMenu();
108
- });
109
- }
110
- }
111
- refreshOverlay() {
112
- if (!this.overlayRef) {
113
- return;
114
- }
115
- this.overlayRef.detach();
116
- let portal = new TemplatePortal(this.menuTemplate, this.viewContainerRef);
117
- this.overlayRef.attach(portal);
118
- this.hasCheckedChildren = false;
119
- }
120
- openMenu(event) {
121
- if (this.isOpen) {
122
- return;
123
- }
124
- if (this.isSubmenu) {
125
- this.submenuOpened.emit(this.triggerAction);
126
- }
127
- else {
128
- this.menuService.closeAllMenus();
129
- }
130
- let triggerElement = event.currentTarget;
131
- const positions = this.isSubmenu ? SUBMENU_POSITIONS : ROOT_MENU_POSITIONS;
132
- let positionStrategy = this.overlayPositionBuilder
133
- .flexibleConnectedTo(triggerElement)
134
- .withFlexibleDimensions(false)
135
- .withPush(true)
136
- .withPositions(positions);
137
- this.overlayRef = this.overlay.create({
138
- positionStrategy,
139
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
140
- hasBackdrop: false,
141
- });
142
- let portal = new TemplatePortal(this.menuTemplate, this.viewContainerRef);
143
- this.overlayRef.attach(portal);
144
- }
145
- toggleMenu(event) {
146
- if (!this.isOpen) {
147
- this.openMenu(event);
148
- }
149
- else {
150
- this.closeMenu();
151
- }
152
- }
153
- onSubmenuOpened(openedAction) {
154
- // Check if submenuComponents is available
155
- if (!this.submenuComponents || this.submenuComponents.length === 0) {
156
- setTimeout(() => {
157
- this.onSubmenuOpened(openedAction);
158
- }, 0);
159
- return;
160
- }
161
- this.submenuComponents.forEach((submenu) => {
162
- if (submenu.triggerAction.code !== openedAction.code && submenu.overlayRef) {
163
- submenu.closeMenu();
164
- }
165
- });
166
- }
167
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: MenuComponent, deps: [{ token: i1.UiMenuService }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i2.OverlayPositionBuilder }, { token: COMPONENT_LIBRARY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
168
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: MenuComponent, selector: "ui-tiered-menu", inputs: { triggerAction: "triggerAction", isSubmenu: "isSubmenu" }, outputs: { actionClick: "actionClick", submenuOpened: "submenuOpened" }, host: { listeners: { "click": "onMenuClick($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true }, { propertyName: "submenuComponents", predicate: ["submenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu\">\r\n <li *ngFor=\"let action of subActions\" class=\"hoverEffect\" [class.disabled]=\"action.disabled\">\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i5.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
169
- }
170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: MenuComponent, decorators: [{
171
- type: Component,
172
- args: [{ selector: 'ui-tiered-menu', template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu\">\r\n <li *ngFor=\"let action of subActions\" class=\"hoverEffect\" [class.disabled]=\"action.disabled\">\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"] }]
173
- }], ctorParameters: () => [{ type: i1.UiMenuService }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i2.OverlayPositionBuilder }, { type: i6.ComponentLibrary, decorators: [{
174
- type: Inject,
175
- args: [COMPONENT_LIBRARY]
176
- }, {
177
- type: Optional
178
- }] }], propDecorators: { submenuComponents: [{
179
- type: ViewChildren,
180
- args: ['submenu']
181
- }], menuTemplate: [{
182
- type: ViewChild,
183
- args: ['menuTemplate']
184
- }], triggerAction: [{
185
- type: Input
186
- }], isSubmenu: [{
187
- type: Input
188
- }], actionClick: [{
189
- type: Output
190
- }], submenuOpened: [{
191
- type: Output
192
- }], onMenuClick: [{
193
- type: HostListener,
194
- args: ['click', ['$event']]
195
- }], onDocumentClick: [{
196
- type: HostListener,
197
- args: ['document:click', ['$event']]
198
- }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3ZpZXctY29udGV4dC9zbWFydC11aS1hY3Rpb24vY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFJTixTQUFTLEVBQ1QsWUFBWSxHQUdiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBT3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7QUFPMUUsTUFBTSxPQUFPLGFBQWE7SUFrQnhCLFlBQ1UsV0FBMEIsRUFDMUIsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLHNCQUE4QyxFQUNSLE9BQTBCO1FBSmhFLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBQzFCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ1IsWUFBTyxHQUFQLE9BQU8sQ0FB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QUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F2TVUsYUFBYSw0SUF1QmQsaUJBQWlCO21HQXZCaEIsYUFBYSw4ZkNuQzFCLG9sREEyQ0EsaW1ERFJhLGFBQWE7OzRGQUFiLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkEyQnZCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFBRyxRQUFRO3lDQXRCYixpQkFBaUI7c0JBQXpDLFlBQVk7dUJBQUMsU0FBUztnQkFFSSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBR2hCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBOEZQLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWpDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVaUFjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2FwaSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVaU1lbnVTZXJ2aWNlIH0gZnJvbSAnLi9tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDT01QT05FTlRfTElCUkFSWSwgQ29tcG9uZW50TGlicmFyeSB9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvY29tcG9uZW50TGlicmFyeSc7XHJcbmltcG9ydCB7XHJcbiAgQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gIE92ZXJsYXlSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBTVUJNRU5VX1BPU0lUSU9OUywgUk9PVF9NRU5VX1BPU0lUSU9OUyB9IGZyb20gJy4vbWVudS5jb25zdGFudHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS10aWVyZWQtbWVudScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQge1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ3N1Ym1lbnUnKSBzdWJtZW51Q29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxNZW51Q29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnbWVudVRlbXBsYXRlJykgbWVudVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHRyaWdnZXJBY3Rpb24hOiBVaUFjdGlvbjtcclxuICBASW5wdXQoKSBpc1N1Ym1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGFjdGlvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxVaUFjdGlvbj4oKTtcclxuICBAT3V0cHV0KCkgc3VibWVudU9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8VWlBY3Rpb24+KCk7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIGljb24hOiBzdHJpbmc7XHJcbiAgc3VibWVudU9wZW5NYXAgPSBuZXcgTWFwPFVpQWN0aW9uLCBib29sZWFuPigpO1xyXG4gIHN1YkFjdGlvbnM6IFVpQWN0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIGhhc0NoZWNrZWRDaGlsZHJlbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbWVudVNlcnZpY2U6IFVpTWVudVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIG92ZXJsYXlQb3NpdGlvbkJ1aWxkZXI6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICBASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBAT3B0aW9uYWwoKSBwdWJsaWMgY29tcExpYj86IENvbXBvbmVudExpYnJhcnlcclxuICApIHtcclxuICAgIHRoaXMuY29tcExpYiA9IGNvbXBMaWIgPz8gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICB0aGlzLmljb24gPSAnY2hldnJvbi1yaWdodCc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5NQVRFUklBTCkge1xyXG4gICAgICB0aGlzLmljb24gPSAnY2hldnJvbl9yaWdodCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudVNlcnZpY2VcclxuICAgICAgLmdldENsb3NlU2lnbmFsKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNsb3NlTWVudSgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3BlbiAmJiAhdGhpcy5oYXNDaGVja2VkQ2hpbGRyZW4gJiYgdGhpcy5zdWJtZW51Q29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaGFzQ2hlY2tlZENoaWxkcmVuID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWyd0cmlnZ2VyQWN0aW9uJ10pIHtcclxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNoYW5nZXNbJ3RyaWdnZXJBY3Rpb24nXS5jdXJyZW50VmFsdWUgYXMgVWlBY3Rpb247XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzVHJpZ2dlciA9IGNoYW5nZXNbJ3RyaWdnZXJBY3Rpb24nXS5wcmV2aW91c1ZhbHVlIGFzIFVpQWN0aW9uO1xyXG5cclxuICAgICAgdGhpcy5zdWJBY3Rpb25zID0gdHJpZ2dlcj8uc3ViQWN0aW9ucyA/PyBbXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiBwcmV2aW91c1RyaWdnZXIpIHtcclxuICAgICAgICBjb25zdCBoYXNTdWJBY3Rpb25zQ2hhbmdlZCA9IHRoaXMuaGFzU3ViQWN0aW9uc0NoYW5nZWQoXHJcbiAgICAgICAgICBwcmV2aW91c1RyaWdnZXI/LnN1YkFjdGlvbnMsXHJcbiAgICAgICAgICB0cmlnZ2VyPy5zdWJBY3Rpb25zXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGhhc1N1YkFjdGlvbnNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hPdmVybGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1N1YkFjdGlvbnNDaGFuZ2VkKFxyXG4gICAgb2xkU3ViQWN0aW9uczogVWlBY3Rpb25bXSB8IHVuZGVmaW5lZCxcclxuICAgIG5ld1N1YkFjdGlvbnM6IFVpQWN0aW9uW10gfCB1bmRlZmluZWRcclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9sZExlbmd0aCA9IG9sZFN1YkFjdGlvbnM/Lmxlbmd0aCA/PyAwO1xyXG4gICAgY29uc3QgbmV3TGVuZ3RoID0gbmV3U3ViQWN0aW9ucz8ubGVuZ3RoID8/IDA7XHJcblxyXG4gICAgaWYgKG9sZExlbmd0aCAhPT0gbmV3TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvbGRMZW5ndGggPiAwICYmIG5ld0xlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChvbGRTdWJBY3Rpb25zIVtpXS5jb2RlICE9PSBuZXdTdWJBY3Rpb25zIVtpXS5jb2RlKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25BY3Rpb25DbGljayhhY3Rpb246IFVpQWN0aW9uKSB7XHJcbiAgICBpZiAoIWFjdGlvbi5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrLmVtaXQoYWN0aW9uKTtcclxuICAgICAgdGhpcy5tZW51U2VydmljZS5jbG9zZUFsbE1lbnVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25NZW51Q2xpY2soZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICB0aGlzLm1lbnVTZXJ2aWNlLmNsb3NlQWxsTWVudXMoKTtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm92ZXJsYXlSZWY7XHJcbiAgfVxyXG5cclxuICBjbG9zZU1lbnUoKSB7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XHJcbiAgICAgIHRoaXMuaGFzQ2hlY2tlZENoaWxkcmVuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3VibWVudUNvbXBvbmVudHMgJiYgdGhpcy5zdWJtZW51Q29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc3VibWVudUNvbXBvbmVudHMuZm9yRWFjaCgoc3VibWVudSkgPT4ge1xyXG4gICAgICAgIHN1Ym1lbnUuY2xvc2VNZW51KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaE92ZXJsYXkoKSB7XHJcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xyXG5cclxuICAgIGxldCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5tZW51VGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XHJcblxyXG4gICAgdGhpcy5oYXNDaGVja2VkQ2hpbGRyZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9wZW5NZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzU3VibWVudSkge1xyXG4gICAgICB0aGlzLnN1Ym1lbnVPcGVuZWQuZW1pdCh0aGlzLnRyaWdnZXJBY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tZW51U2VydmljZS5jbG9zZUFsbE1lbnVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRyaWdnZXJFbGVtZW50ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IHRoaXMuaXNTdWJtZW51ID8gU1VCTUVOVV9QT1NJVElPTlMgOiBST09UX01FTlVfUE9TSVRJT05TO1xyXG5cclxuICAgIGxldCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXHJcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRyaWdnZXJFbGVtZW50KVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcclxuICAgICAgLndpdGhQdXNoKHRydWUpXHJcbiAgICAgIC53aXRoUG9zaXRpb25zKHBvc2l0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXHJcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBwb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5tZW51VGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMub3Blbk1lbnUoZXZlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU3VibWVudU9wZW5lZChvcGVuZWRBY3Rpb246IFVpQWN0aW9uKSB7XHJcbiAgICAvLyBDaGVjayBpZiBzdWJtZW51Q29tcG9uZW50cyBpcyBhdmFpbGFibGVcclxuICAgIGlmICghdGhpcy5zdWJtZW51Q29tcG9uZW50cyB8fCB0aGlzLnN1Ym1lbnVDb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLm9uU3VibWVudU9wZW5lZChvcGVuZWRBY3Rpb24pO1xyXG4gICAgICB9LCAwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3VibWVudUNvbXBvbmVudHMuZm9yRWFjaCgoc3VibWVudSkgPT4ge1xyXG4gICAgICBpZiAoc3VibWVudS50cmlnZ2VyQWN0aW9uLmNvZGUgIT09IG9wZW5lZEFjdGlvbi5jb2RlICYmIHN1Ym1lbnUub3ZlcmxheVJlZikge1xyXG4gICAgICAgIHN1Ym1lbnUuY2xvc2VNZW51KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKGlzU3VibWVudSkge1xyXG4gIDxkaXYgY2xhc3M9XCJzdWJtZW51IGhvdmVyRWZmZWN0XCIgW2NsYXNzLmFjdGl2ZVN1Ym1lbnVdPVwiaXNPcGVuXCIgKG1vdXNlZW50ZXIpPVwib3Blbk1lbnUoJGV2ZW50KVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRyaWdnZXJUZW1wYWx0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPHNtYXJ0LWljb24gW2ljb25dPVwiaWNvblwiIGNvbG9yPVwiYmxhY2tcIj48L3NtYXJ0LWljb24+XHJcbiAgPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0cmlnZ2VyVGVtcGFsdGVcIj48L25nLWNvbnRhaW5lcj5cclxufVxyXG5cclxuPG5nLXRlbXBsYXRlICNtZW51VGVtcGxhdGU+XHJcbiAgPHVsIGNsYXNzPVwidWktdGllcmVkLW1lbnVcIj5cclxuICAgIDxsaSAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHN1YkFjdGlvbnNcIiBjbGFzcz1cImhvdmVyRWZmZWN0XCIgW2NsYXNzLmRpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZFwiPlxyXG4gICAgICBAaWYgKGFjdGlvbi5zdWJBY3Rpb25zICYmIGFjdGlvbi5zdWJBY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICA8dWktdGllcmVkLW1lbnVcclxuICAgICAgICAgICNzdWJtZW51XHJcbiAgICAgICAgICBbdHJpZ2dlckFjdGlvbl09XCJhY3Rpb25cIlxyXG4gICAgICAgICAgW2lzU3VibWVudV09XCJ0cnVlXCJcclxuICAgICAgICAgIFtzdWJBY3Rpb25zXT1cImFjdGlvbi5zdWJBY3Rpb25zIVwiXHJcbiAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiYWN0aW9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgIChzdWJtZW51T3BlbmVkKT1cIm9uU3VibWVudU9wZW5lZChzdWJtZW51KVwiXHJcbiAgICAgICAgPjwvdWktdGllcmVkLW1lbnU+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDx1aS1hY3Rpb24tYnV0dG9uXHJcbiAgICAgICAgICBbZGVzY3JpcHRvcl09XCJhY3Rpb24uZGVzY3JpcHRvciFcIlxyXG4gICAgICAgICAgW2NvZGVdPVwiYWN0aW9uLmNvZGVcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWN0aW9uLmRpc2FibGVkXCJcclxuICAgICAgICAgIChhY3Rpb25DbGljayk9XCIhYWN0aW9uLnN1YkFjdGlvbnM/Lmxlbmd0aCAmJiBvbkFjdGlvbkNsaWNrKGFjdGlvbilcIlxyXG4gICAgICAgID48L3VpLWFjdGlvbi1idXR0b24+XHJcbiAgICAgIH1cclxuICAgIDwvbGk+XHJcbiAgPC91bD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdHJpZ2dlclRlbXBhbHRlPlxyXG4gIDx1aS1hY3Rpb24tYnV0dG9uXHJcbiAgICBbZGVzY3JpcHRvcl09XCJ0cmlnZ2VyQWN0aW9uLmRlc2NyaXB0b3IhXCJcclxuICAgIFtjb2RlXT1cInRyaWdnZXJBY3Rpb24uY29kZVwiXHJcbiAgICBbZGlzYWJsZWRdPVwiISF0cmlnZ2VyQWN0aW9uLmRpc2FibGVkXCJcclxuICAgIChhY3Rpb25DbGljayk9XCJ0b2dnbGVNZW51KCRldmVudC5ldmVudClcIlxyXG4gICAgW2NsYXNzLnN1Ym1lbnVUcmlnZ2VyXT1cImlzU3VibWVudVwiXHJcbiAgPlxyXG4gIDwvdWktYWN0aW9uLWJ1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
Binary file