@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.
- package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +1 -1
- package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +7 -4
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +3 -3
- package/esm2022/lib/session/smart-session.service.mjs +48 -23
- package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +3 -3
- package/esm2022/lib/smart-tree/smarttree.component.mjs +3 -3
- package/esm2022/lib/theme/theme.service.mjs +48 -0
- package/esm2022/lib/view-context/api/api/view.service.mjs +211 -1
- package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +1 -1
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +17 -0
- package/esm2022/lib/view-context/api/model/models.mjs +7 -1
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +1 -1
- package/esm2022/lib/view-context/api/model/publishedViewData.mjs +13 -0
- package/esm2022/lib/view-context/api/model/shellProperty.mjs +13 -0
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/themeDefinition.mjs +2 -0
- package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/view.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
- package/esm2022/lib/view-context/projects.mjs +3 -2
- package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +205 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +205 -0
- package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +35 -0
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +6 -4
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +18 -10
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +10 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +13 -3
- package/esm2022/lib/view-context/smart-view-context.module.mjs +13 -7
- package/esm2022/lib/view-context/smart-view-context.service.mjs +14 -5
- package/esm2022/projects.mjs +2 -1
- package/fesm2022/smartbit4all-ng-client.mjs +895 -313
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/session/smart-backend-bootstrap.config.d.ts +9 -1
- package/lib/session/smart-backend-bootstrap.service.d.ts +3 -1
- package/lib/session/smart-error-catching.interceptor.d.ts +2 -1
- package/lib/session/smart-session.service.d.ts +18 -1
- package/lib/theme/theme.service.d.ts +17 -0
- package/lib/view-context/api/api/view.service.d.ts +94 -0
- package/lib/view-context/api/api-default/binaryContentData.d.ts +2 -0
- package/lib/view-context/api/model/deviceInfo.d.ts +1 -0
- package/lib/view-context/api/model/menuTriggerType.d.ts +15 -0
- package/lib/view-context/api/model/models.d.ts +6 -0
- package/lib/view-context/api/model/publishedViewData.d.ts +14 -0
- package/lib/view-context/api/model/shellProperty.d.ts +15 -0
- package/lib/view-context/api/model/themeDefinition.d.ts +22 -0
- package/lib/view-context/api/model/themeDescriptor.d.ts +16 -0
- package/lib/view-context/api/model/themeShellDescriptor.d.ts +17 -0
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +2 -0
- package/lib/view-context/projects.d.ts +2 -1
- package/lib/view-context/smart-ui-action/components/menu/{menu.component.d.ts → click/menu.component.d.ts} +8 -7
- package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +43 -0
- package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +16 -0
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +1 -0
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +2 -1
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +3 -1
- package/lib/view-context/smart-view-context.module.d.ts +56 -54
- package/lib/view-context/smart-view-context.service.d.ts +4 -2
- package/package.json +1 -1
- package/projects.d.ts +1 -0
- package/smartbit4all-ng-client-6.0.10.tgz +0 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +0 -199
- 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/
|
|
28
|
-
import * as i27 from "./smart-ui-action/components/upload-widget/
|
|
29
|
-
import * as i28 from "./smart-ui-action/components/upload-widget/
|
|
30
|
-
import * as i29 from "./smart-ui-action/components/upload-widget/
|
|
31
|
-
import * as i30 from "./smart-
|
|
32
|
-
import * as i31 from "
|
|
33
|
-
import * as i32 from "
|
|
34
|
-
import * as i33 from "@angular/
|
|
35
|
-
import * as i34 from "@angular/
|
|
36
|
-
import * as i35 from "
|
|
37
|
-
import * as i36 from "@angular/material/
|
|
38
|
-
import * as i37 from "
|
|
39
|
-
import * as i38 from "
|
|
40
|
-
import * as i39 from "@angular/material/
|
|
41
|
-
import * as i40 from "../
|
|
42
|
-
import * as i41 from "
|
|
43
|
-
import * as i42 from "
|
|
44
|
-
import * as i43 from "
|
|
45
|
-
import * as i44 from "@angular/
|
|
46
|
-
import * as i45 from "@angular/material/
|
|
47
|
-
import * as i46 from "@angular/
|
|
48
|
-
import * as i47 from "@angular/material/
|
|
49
|
-
import * as i48 from "@angular/material/
|
|
50
|
-
import * as i49 from "@angular/material/
|
|
51
|
-
import * as i50 from "@angular/material
|
|
52
|
-
import * as i51 from "@angular/material/
|
|
53
|
-
import * as i52 from "@angular/material
|
|
54
|
-
import * as i53 from "@angular/material/
|
|
55
|
-
import * as i54 from "
|
|
56
|
-
import * as i55 from "@angular/
|
|
57
|
-
import * as i56 from "
|
|
58
|
-
import * as i57 from "
|
|
59
|
-
import * as i58 from "
|
|
60
|
-
import * as i59 from "primeng/
|
|
61
|
-
import * as i60 from "primeng/
|
|
62
|
-
import * as i61 from "primeng/
|
|
63
|
-
import * as i62 from "primeng/
|
|
64
|
-
import * as i63 from "primeng/
|
|
65
|
-
import * as i64 from "primeng/
|
|
66
|
-
import * as i65 from "primeng/
|
|
67
|
-
import * as i66 from "primeng/
|
|
68
|
-
import * as i67 from "primeng/
|
|
69
|
-
import * as i68 from "primeng/
|
|
70
|
-
import * as i69 from "primeng/
|
|
71
|
-
import * as i70 from "primeng/
|
|
72
|
-
import * as i71 from "primeng/
|
|
73
|
-
import * as i72 from "primeng/
|
|
74
|
-
import * as i73 from "primeng/
|
|
75
|
-
import * as i74 from "primeng/
|
|
76
|
-
import * as i75 from "primeng/
|
|
77
|
-
import * as i76 from "primeng/
|
|
78
|
-
import * as i77 from "
|
|
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.
|
|
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.
|
|
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';
|
|
Binary file
|
|
@@ -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
|