coer-elements 0.0.64 → 0.0.66
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +63 -0
- package/components/lib/coer-accordion/coer-accordion.component.d.ts +1 -1
- package/components/lib/coer-datebox/coer-datebox.component.d.ts +49 -0
- package/components/lib/coer-filebox/coer-filebox.component.d.ts +1 -1
- package/components/lib/coer-grid/coer-grid.extension.d.ts +2 -2
- package/components/lib/coer-modal/coer-modal.component.d.ts +1 -1
- package/components/lib/components.module.d.ts +37 -33
- package/components/public-api.d.ts +1 -0
- package/fesm2022/coer-elements-components.mjs +256 -93
- package/fesm2022/coer-elements-components.mjs.map +1 -1
- package/fesm2022/coer-elements-directives.mjs +14 -12
- package/fesm2022/coer-elements-directives.mjs.map +1 -1
- package/fesm2022/coer-elements-pipes.mjs +16 -16
- package/fesm2022/coer-elements-pipes.mjs.map +1 -1
- package/fesm2022/coer-elements-tools.mjs +20 -14
- package/fesm2022/coer-elements-tools.mjs.map +1 -1
- package/fesm2022/coer-elements.mjs +4 -4
- package/fesm2022/coer-elements.mjs.map +1 -1
- package/package.json +3 -17
- package/styles/angular-material.scss +18 -13
- package/styles/bootstrap.scss +1 -6
- package/styles/coer-elements.css +993 -2866
- package/styles/colors.scss +50 -60
- package/styles/index.scss +9 -9
- package/styles/layout.scss +10 -0
- package/styles/scroll-bar.scss +5 -5
- package/tools/lib/date-time.class.d.ts +3 -1
- package/tools/lib/page.class.d.ts +1 -1
- package/tools/lib/section.class.d.ts +1 -1
- package/tools/lib/tools.d.ts +9 -9
- package/esm2022/coer-elements.mjs +0 -5
- package/esm2022/components/coer-elements-components.mjs +0 -5
- package/esm2022/components/lib/coer-accordion/coer-accordion.component.mjs +0 -53
- package/esm2022/components/lib/coer-button/coer-button.component.mjs +0 -138
- package/esm2022/components/lib/coer-checkbox/coer-checkbox.component.mjs +0 -83
- package/esm2022/components/lib/coer-filebox/coer-filebox.component.mjs +0 -102
- package/esm2022/components/lib/coer-form/coer-form.component.mjs +0 -107
- package/esm2022/components/lib/coer-grid/coer-grid.component.mjs +0 -512
- package/esm2022/components/lib/coer-grid/coer-grid.extension.mjs +0 -409
- package/esm2022/components/lib/coer-list/coer-list.component.mjs +0 -130
- package/esm2022/components/lib/coer-modal/coer-modal.component.mjs +0 -107
- package/esm2022/components/lib/coer-numberbox/coer-numberbox.component.mjs +0 -258
- package/esm2022/components/lib/coer-page-title/coer-page-title.component.mjs +0 -44
- package/esm2022/components/lib/coer-selectbox/coer-selectbox.component.mjs +0 -342
- package/esm2022/components/lib/coer-sidenav/coer-menu-option/coer-menu-option.component.mjs +0 -103
- package/esm2022/components/lib/coer-sidenav/coer-sidenav.component.mjs +0 -194
- package/esm2022/components/lib/coer-sidenav/coer-toolbar/coer-toolbar.component.mjs +0 -33
- package/esm2022/components/lib/coer-sidenav/coer-tree-accordion/coer-tree-accordion.component.mjs +0 -116
- package/esm2022/components/lib/coer-switch/coer-switch.component.mjs +0 -93
- package/esm2022/components/lib/coer-tab/coer-tab.component.mjs +0 -120
- package/esm2022/components/lib/coer-textarea/coer-textarea.component.mjs +0 -156
- package/esm2022/components/lib/coer-textbox/coer-textbox.component.mjs +0 -221
- package/esm2022/components/lib/components.module.mjs +0 -188
- package/esm2022/components/public-api.mjs +0 -20
- package/esm2022/directives/coer-elements-directives.mjs +0 -5
- package/esm2022/directives/lib/coer-ref.directive.mjs +0 -23
- package/esm2022/directives/lib/directives.module.mjs +0 -25
- package/esm2022/directives/lib/life-cycle.directive.mjs +0 -33
- package/esm2022/directives/public-api.mjs +0 -4
- package/esm2022/index.mjs +0 -54
- package/esm2022/interfaces/coer-elements-interfaces.mjs +0 -5
- package/esm2022/interfaces/lib/app-source.interface.mjs +0 -2
- package/esm2022/interfaces/lib/box-button.interface.mjs +0 -2
- package/esm2022/interfaces/lib/bulk-load.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-filebox/file-image.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-filebox/file.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-button-by-row.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-checkbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-coer-numberbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-coer-selectbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-coer-switch.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-coer-textbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-column.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-data-source.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-header-button.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-header-export-button.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-header.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-import.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-input-checkbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-input-switch-change.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-input-textbox.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-item.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-keyup-enter.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-length.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-search.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-grid/grid-sort.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-menu/menu-option-selected.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-menu/menu-selected.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-menu/menu.interface.mjs +0 -2
- package/esm2022/interfaces/lib/coer-ref.interface.mjs +0 -2
- package/esm2022/interfaces/lib/image.interface.mjs +0 -2
- package/esm2022/interfaces/lib/page-title/breadcrumb.interface.mjs +0 -2
- package/esm2022/interfaces/lib/page-title/go-back.interface.mjs +0 -2
- package/esm2022/interfaces/lib/screen-size.interface.mjs +0 -2
- package/esm2022/interfaces/lib/service/http-request.interface.mjs +0 -2
- package/esm2022/interfaces/lib/service/http-response.interface.mjs +0 -2
- package/esm2022/interfaces/lib/service/patch.interface.mjs +0 -2
- package/esm2022/interfaces/public-api.mjs +0 -42
- package/esm2022/pipes/coer-elements-pipes.mjs +0 -5
- package/esm2022/pipes/lib/html.pipe.mjs +0 -18
- package/esm2022/pipes/lib/no-image.pipe.mjs +0 -23
- package/esm2022/pipes/lib/numeric-format.pipe.mjs +0 -15
- package/esm2022/pipes/lib/pipes.module.mjs +0 -31
- package/esm2022/pipes/public-api.mjs +0 -5
- package/esm2022/signals/coer-elements-signals.mjs +0 -5
- package/esm2022/signals/lib/breakpoint.signal.mjs +0 -4
- package/esm2022/signals/lib/is-loading.signal.mjs +0 -3
- package/esm2022/signals/lib/is-menu-open.signal.mjs +0 -3
- package/esm2022/signals/lib/is-modal-open.signal.mjs +0 -3
- package/esm2022/signals/lib/navigation.signal.mjs +0 -3
- package/esm2022/signals/public-api.mjs +0 -6
- package/esm2022/tools/coer-elements-tools.mjs +0 -5
- package/esm2022/tools/lib/breadcrumbs.class.mjs +0 -63
- package/esm2022/tools/lib/coer-alert/coer-alert.component.mjs +0 -229
- package/esm2022/tools/lib/coer-grid.templates.mjs +0 -34
- package/esm2022/tools/lib/colors.class.mjs +0 -68
- package/esm2022/tools/lib/control-value.class.mjs +0 -46
- package/esm2022/tools/lib/date-time.class.mjs +0 -29
- package/esm2022/tools/lib/files.class.mjs +0 -91
- package/esm2022/tools/lib/filters.class.mjs +0 -57
- package/esm2022/tools/lib/menu.class.mjs +0 -23
- package/esm2022/tools/lib/page.class.mjs +0 -187
- package/esm2022/tools/lib/screen.class.mjs +0 -51
- package/esm2022/tools/lib/section.class.mjs +0 -60
- package/esm2022/tools/lib/service.class.mjs +0 -408
- package/esm2022/tools/lib/source.class.mjs +0 -80
- package/esm2022/tools/lib/tools.mjs +0 -232
- package/esm2022/tools/public-api.mjs +0 -16
@@ -1,130 +0,0 @@
|
|
1
|
-
import { Component, computed, input, output } from '@angular/core';
|
2
|
-
import { Screen, Tools } from 'coer-elements/tools';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
import * as i1 from "@angular/common";
|
5
|
-
import * as i2 from "@angular/cdk/drag-drop";
|
6
|
-
import * as i3 from "../coer-button/coer-button.component";
|
7
|
-
import * as i4 from "../coer-textbox/coer-textbox.component";
|
8
|
-
import * as i5 from "coer-elements/pipes";
|
9
|
-
export class CoerList {
|
10
|
-
constructor() {
|
11
|
-
//Variables
|
12
|
-
this._id = Tools.GetGuid('coer-List');
|
13
|
-
this._enableAnimations = false;
|
14
|
-
//Inputs
|
15
|
-
this.dataSource = input([]);
|
16
|
-
this.propDisplay = input('name');
|
17
|
-
this.header = input('');
|
18
|
-
this.headerIcon = input('');
|
19
|
-
this.showDeleteButton = input(false);
|
20
|
-
this.showGoButton = input(false);
|
21
|
-
this.showBackButton = input(false);
|
22
|
-
this.isLoading = input(false);
|
23
|
-
this.isDraggable = input(false);
|
24
|
-
this.showSearch = input(false);
|
25
|
-
this.template = input(null);
|
26
|
-
this.width = input('100%');
|
27
|
-
this.MinWidth = input('250px');
|
28
|
-
this.MaxWidth = input('100%');
|
29
|
-
this.height = input('350px');
|
30
|
-
this.minHeight = input('140px');
|
31
|
-
this.maxHeight = input('100vh');
|
32
|
-
this.marginTop = input('0px');
|
33
|
-
this.marginRight = input('0px');
|
34
|
-
this.marginBottom = input('0px');
|
35
|
-
this.marginLeft = input('0px');
|
36
|
-
//Outputs
|
37
|
-
this.onDrop = output();
|
38
|
-
this.onSort = output();
|
39
|
-
this.onClick = output();
|
40
|
-
this.onDoubleClick = output();
|
41
|
-
this.onClickDelete = output();
|
42
|
-
this.onClickGo = output();
|
43
|
-
this.onClickBack = output();
|
44
|
-
//computed
|
45
|
-
this._dataSource = computed(() => {
|
46
|
-
let index = 0;
|
47
|
-
return Tools.BreakReference(this.dataSource())
|
48
|
-
.map((item) => Object.assign(item, { index: index++ }));
|
49
|
-
});
|
50
|
-
//computed
|
51
|
-
this._isDraggable = computed(() => {
|
52
|
-
return this.isDraggable() && !this.isLoading();
|
53
|
-
});
|
54
|
-
//computed
|
55
|
-
this._hasTemplate = computed(() => {
|
56
|
-
return typeof this.template() == 'function';
|
57
|
-
});
|
58
|
-
//computed
|
59
|
-
this._showbuttons = computed(() => {
|
60
|
-
return !this.isLoading();
|
61
|
-
});
|
62
|
-
/** */
|
63
|
-
this.GetDisplay = (item) => {
|
64
|
-
return Tools.IsNotNull(item) ? item[this.propDisplay()] : '';
|
65
|
-
};
|
66
|
-
/** */
|
67
|
-
this.GetIndexRow = (item) => {
|
68
|
-
return item['index'];
|
69
|
-
};
|
70
|
-
/** */
|
71
|
-
this._showBackButton = () => {
|
72
|
-
return this.showBackButton()
|
73
|
-
&& !this.isLoading();
|
74
|
-
};
|
75
|
-
/** */
|
76
|
-
this._showDeleteButton = (item) => {
|
77
|
-
const showButton = this.showDeleteButton();
|
78
|
-
return (typeof showButton === 'boolean')
|
79
|
-
? showButton && !this.isLoading()
|
80
|
-
: showButton(item, item.index) === true && !this.isLoading();
|
81
|
-
};
|
82
|
-
/** */
|
83
|
-
this._showGoButton = (item) => {
|
84
|
-
const showButton = this.showGoButton();
|
85
|
-
return (typeof showButton === 'boolean')
|
86
|
-
? showButton && !this.isLoading()
|
87
|
-
: showButton(item, item.index) === true && !this.isLoading();
|
88
|
-
};
|
89
|
-
}
|
90
|
-
//getter
|
91
|
-
get _height() {
|
92
|
-
let height = this.height();
|
93
|
-
if (height == 'full') {
|
94
|
-
const TOOLBAR = 45;
|
95
|
-
const PAGE_HEADER = 70;
|
96
|
-
const LIST_HEADER = document.getElementById(`${this._id}-header`);
|
97
|
-
const HEADER = (LIST_HEADER && LIST_HEADER.children.length > 0) ? 50 : 0;
|
98
|
-
const MARGIN = 50;
|
99
|
-
const PADDING = 50;
|
100
|
-
height = (Screen.WINDOW_HEIGHT - TOOLBAR - PAGE_HEADER - MARGIN - HEADER - PADDING) + 'px';
|
101
|
-
}
|
102
|
-
return height;
|
103
|
-
}
|
104
|
-
ngAfterViewInit() {
|
105
|
-
Tools.Sleep().then(() => {
|
106
|
-
this._enableAnimations = true;
|
107
|
-
});
|
108
|
-
}
|
109
|
-
/** */
|
110
|
-
GetTemplate(item) {
|
111
|
-
return this.template()(item, item.index);
|
112
|
-
}
|
113
|
-
/** */
|
114
|
-
Drop(event) {
|
115
|
-
const { previousIndex, currentIndex } = event;
|
116
|
-
let dataSource = Tools.BreakReference(this.dataSource());
|
117
|
-
const item = Tools.BreakReference(dataSource[previousIndex]);
|
118
|
-
dataSource.splice(previousIndex, 1);
|
119
|
-
dataSource.splice(currentIndex, 0, item);
|
120
|
-
this.onSort.emit(dataSource);
|
121
|
-
this.onDrop.emit(item);
|
122
|
-
}
|
123
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
124
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CoerList, selector: "coer-list", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, propDisplay: { classPropertyName: "propDisplay", publicName: "propDisplay", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, headerIcon: { classPropertyName: "headerIcon", publicName: "headerIcon", isSignal: true, isRequired: false, transformFunction: null }, showDeleteButton: { classPropertyName: "showDeleteButton", publicName: "showDeleteButton", isSignal: true, isRequired: false, transformFunction: null }, showGoButton: { classPropertyName: "showGoButton", publicName: "showGoButton", isSignal: true, isRequired: false, transformFunction: null }, showBackButton: { classPropertyName: "showBackButton", publicName: "showBackButton", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, isDraggable: { classPropertyName: "isDraggable", publicName: "isDraggable", isSignal: true, isRequired: false, transformFunction: null }, showSearch: { classPropertyName: "showSearch", publicName: "showSearch", isSignal: true, isRequired: false, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, MinWidth: { classPropertyName: "MinWidth", publicName: "MinWidth", isSignal: true, isRequired: false, transformFunction: null }, MaxWidth: { classPropertyName: "MaxWidth", publicName: "MaxWidth", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, marginTop: { classPropertyName: "marginTop", publicName: "marginTop", isSignal: true, isRequired: false, transformFunction: null }, marginRight: { classPropertyName: "marginRight", publicName: "marginRight", isSignal: true, isRequired: false, transformFunction: null }, marginBottom: { classPropertyName: "marginBottom", publicName: "marginBottom", isSignal: true, isRequired: false, transformFunction: null }, marginLeft: { classPropertyName: "marginLeft", publicName: "marginLeft", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onDrop: "onDrop", onSort: "onSort", onClick: "onClick", onDoubleClick: "onDoubleClick", onClickDelete: "onClickDelete", onClickGo: "onClickGo", onClickBack: "onClickBack" }, ngImport: i0, template: "<div [id]=\"_id\" class=\"coer-list\" [ngStyle]=\"{ \r\n 'margin-top': marginTop(), \r\n 'margin-right': marginRight(), \r\n 'margin-bottom': marginBottom(), \r\n 'margin-left': marginLeft(), \r\n }\">\r\n\r\n @if(isLoading()) {\r\n <!-- Grid Message -->\r\n <div class=\"loading\">\r\n <i class=\"spinner-border\"></i>\r\n <span class=\"fa-fade\">Loading</span>\r\n </div>\r\n }\r\n\r\n @else if(dataSource().length <= 0) {\r\n <div class=\"no-data\"> No Data </div>\r\n }\r\n\r\n <header [id]=\"_id + '-header'\" class=\"row\"> \r\n @if(header().length > 0 || headerIcon().length > 0) {\r\n <div class=\"col-auto me-auto\">\r\n <h6>\r\n @if(headerIcon().length > 0) {\r\n <i [class]=\"headerIcon()\"></i> \r\n }\r\n\r\n @if(header().length > 0) {\r\n <span>{{ header() }}</span> \r\n }\r\n </h6> \r\n </div>\r\n }\r\n\r\n @if(_showBackButton()) {\r\n <div class=\"col-auto ps-2 pe-0\"> \r\n <coer-button\r\n type=\"icon-outline\"\r\n color=\"secondary\"\r\n icon=\"back\"\r\n tooltip=\"Back\"\r\n [animation]=\"_enableAnimations\"\r\n (onClick)=\"onClickBack.emit()\"\r\n ></coer-button> \r\n </div>\r\n }\r\n \r\n <!-- Search -->\r\n @if(showSearch() && dataSource().length > 0) {\r\n <div class=\"col-auto pe-0\">\r\n <coer-textbox\r\n #inputSearch \r\n placeholder=\"Search\"\r\n [isDisabled]=\"isLoading()\"\r\n [selectOnFocus]=\"true\"\r\n width=\"250px\"\r\n marginTop=\"5px\"\r\n marginBottom=\"5px\"\r\n [showSearchIcon]=\"true\"\r\n [showClearIcon]=\"true\"\r\n ></coer-textbox>\r\n </div>\r\n }\r\n </header>\r\n\r\n <div [ngStyle]=\"{ \r\n 'width': width(), \r\n 'min-Width': MinWidth(), \r\n 'max-Width': MaxWidth(), \r\n }\">\r\n <ul cdkDropList (cdkDropListDropped)=\"Drop($event)\" class='list-group coer-list'\r\n [ngStyle]=\"{ \r\n 'height': _height, \r\n 'min-height': minHeight(), \r\n 'max-height': maxHeight(), \r\n 'd-none': dataSource().length <= 0 \r\n }\">\r\n \r\n @for (item of _dataSource(); track GetIndexRow(item)) {\r\n <li cdkDrag \r\n class=\"list-group-item coer-list-box\" \r\n cdkDragBoundary=\"ul.coer-list\"\r\n (click)=\"onClick.emit(item)\" \r\n (dblclick)=\"onDoubleClick.emit(item)\">\r\n \r\n <div *cdkDragPlaceholder class=\"coer-list-placeholder cursor-grabbing\"></div>\r\n <div class=\"coer-list-content\"> \r\n @if(_hasTemplate()) {\r\n <div [innerHTML]=\"GetTemplate(item) | html\" class=\"template\"></div>\r\n }\r\n \r\n @else {\r\n <div> {{ GetDisplay(item) }} </div> \r\n } \r\n \r\n <div>\r\n @if(_showDeleteButton(item)) {\r\n <coer-button\r\n type=\"icon-no-border\"\r\n color=\"secondary\"\r\n icon=\"delete\" \r\n (onClick)=\"onClickDelete.emit(item)\"\r\n ></coer-button>\r\n } \r\n \r\n @if(_showGoButton(item)) {\r\n <coer-button\r\n type=\"icon-no-border\"\r\n color=\"secondary\"\r\n icon=\"go\" \r\n marginLeft=\"5px\" \r\n (onClick)=\"onClickGo.emit(item)\"\r\n ></coer-button>\r\n } \r\n \r\n <i cdkDragHandle [ngClass]=\"{ \r\n 'fa-solid fa-grip-vertical text-secondary ps-2': true,\r\n 'cursor-grab': true, \r\n 'cursor-grabbing': false, \r\n 'd-none': !_isDraggable()\r\n }\"></i> \r\n </div> \r\n </div> \r\n </li> \r\n } \r\n </ul>\r\n </div>\r\n</div>", styles: ["div.coer-list header{align-items:center;justify-content:flex-end;padding-right:10px;margin:0}div.coer-list header h6{display:flex;align-items:center;gap:10px;min-height:40px;max-height:40px;margin-top:5px;margin-bottom:5px}div.coer-list header>div{display:flex;align-items:baseline;position:relative;z-index:1}div.coer-list ul.coer-list{width:100%;border:solid 1px #ccc;display:block;background:#fff;border-radius:4px;overflow:auto}div.coer-list li.coer-list-box{padding:10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;background:#fff;font-size:14px}div.coer-list li.coer-list-box div.coer-list-content{width:100%;display:flex;align-items:center;justify-content:space-between}div.coer-list .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}div.coer-list .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list .coer-list-box:last-child{border:none}div.coer-list .coer-list.cdk-drop-list-dragging .coer-list-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list div.coer-list-placeholder{background:#ccc;border:dotted 3px #999;min-height:40px;transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list div.cdk-drag-placeholder,div.coer-list ul.cdk-drop-list-dragging,div.coer-list ul.cdk-drop-list-dragging *{cursor:grabbing}div.coer-list div.loading,div.coer-list div.no-data{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:25px;color:gray;z-index:1}div.coer-list div.loading{background-color:#bbbbbb83!important;flex-direction:column!important;gap:10px!important}div.coer-list div.loading span.fa-fade{position:relative!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: i3.CoerButton, selector: "coer-button", inputs: ["id", "color", "type", "icon", "iconPosition", "animation", "isLoading", "isDisabled", "isInvisible", "width", "minWidth", "height", "minHeight", "marginTop", "marginRight", "marginBottom", "marginLeft", "path", "tooltipPosition", "tooltip"], outputs: ["onClick"] }, { kind: "component", type: i4.CoerTextBox, selector: "coer-textbox", inputs: ["value", "id", "button", "label", "placeholder", "minLength", "maxLength", "showSearchIcon", "showClearIcon", "width", "minWidth", "maxWidth", "marginTop", "marginRight", "marginBottom", "marginLeft", "isInvalid", "isValid", "isDisabled", "isReadonly", "isLoading", "selectOnFocus", "textPosition"], outputs: ["onKeyupEnter", "onInput", "onClickClear", "onClickButton"] }, { kind: "pipe", type: i5.HtmlPipe, name: "html" }] }); }
|
125
|
-
}
|
126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerList, decorators: [{
|
127
|
-
type: Component,
|
128
|
-
args: [{ selector: 'coer-list', template: "<div [id]=\"_id\" class=\"coer-list\" [ngStyle]=\"{ \r\n 'margin-top': marginTop(), \r\n 'margin-right': marginRight(), \r\n 'margin-bottom': marginBottom(), \r\n 'margin-left': marginLeft(), \r\n }\">\r\n\r\n @if(isLoading()) {\r\n <!-- Grid Message -->\r\n <div class=\"loading\">\r\n <i class=\"spinner-border\"></i>\r\n <span class=\"fa-fade\">Loading</span>\r\n </div>\r\n }\r\n\r\n @else if(dataSource().length <= 0) {\r\n <div class=\"no-data\"> No Data </div>\r\n }\r\n\r\n <header [id]=\"_id + '-header'\" class=\"row\"> \r\n @if(header().length > 0 || headerIcon().length > 0) {\r\n <div class=\"col-auto me-auto\">\r\n <h6>\r\n @if(headerIcon().length > 0) {\r\n <i [class]=\"headerIcon()\"></i> \r\n }\r\n\r\n @if(header().length > 0) {\r\n <span>{{ header() }}</span> \r\n }\r\n </h6> \r\n </div>\r\n }\r\n\r\n @if(_showBackButton()) {\r\n <div class=\"col-auto ps-2 pe-0\"> \r\n <coer-button\r\n type=\"icon-outline\"\r\n color=\"secondary\"\r\n icon=\"back\"\r\n tooltip=\"Back\"\r\n [animation]=\"_enableAnimations\"\r\n (onClick)=\"onClickBack.emit()\"\r\n ></coer-button> \r\n </div>\r\n }\r\n \r\n <!-- Search -->\r\n @if(showSearch() && dataSource().length > 0) {\r\n <div class=\"col-auto pe-0\">\r\n <coer-textbox\r\n #inputSearch \r\n placeholder=\"Search\"\r\n [isDisabled]=\"isLoading()\"\r\n [selectOnFocus]=\"true\"\r\n width=\"250px\"\r\n marginTop=\"5px\"\r\n marginBottom=\"5px\"\r\n [showSearchIcon]=\"true\"\r\n [showClearIcon]=\"true\"\r\n ></coer-textbox>\r\n </div>\r\n }\r\n </header>\r\n\r\n <div [ngStyle]=\"{ \r\n 'width': width(), \r\n 'min-Width': MinWidth(), \r\n 'max-Width': MaxWidth(), \r\n }\">\r\n <ul cdkDropList (cdkDropListDropped)=\"Drop($event)\" class='list-group coer-list'\r\n [ngStyle]=\"{ \r\n 'height': _height, \r\n 'min-height': minHeight(), \r\n 'max-height': maxHeight(), \r\n 'd-none': dataSource().length <= 0 \r\n }\">\r\n \r\n @for (item of _dataSource(); track GetIndexRow(item)) {\r\n <li cdkDrag \r\n class=\"list-group-item coer-list-box\" \r\n cdkDragBoundary=\"ul.coer-list\"\r\n (click)=\"onClick.emit(item)\" \r\n (dblclick)=\"onDoubleClick.emit(item)\">\r\n \r\n <div *cdkDragPlaceholder class=\"coer-list-placeholder cursor-grabbing\"></div>\r\n <div class=\"coer-list-content\"> \r\n @if(_hasTemplate()) {\r\n <div [innerHTML]=\"GetTemplate(item) | html\" class=\"template\"></div>\r\n }\r\n \r\n @else {\r\n <div> {{ GetDisplay(item) }} </div> \r\n } \r\n \r\n <div>\r\n @if(_showDeleteButton(item)) {\r\n <coer-button\r\n type=\"icon-no-border\"\r\n color=\"secondary\"\r\n icon=\"delete\" \r\n (onClick)=\"onClickDelete.emit(item)\"\r\n ></coer-button>\r\n } \r\n \r\n @if(_showGoButton(item)) {\r\n <coer-button\r\n type=\"icon-no-border\"\r\n color=\"secondary\"\r\n icon=\"go\" \r\n marginLeft=\"5px\" \r\n (onClick)=\"onClickGo.emit(item)\"\r\n ></coer-button>\r\n } \r\n \r\n <i cdkDragHandle [ngClass]=\"{ \r\n 'fa-solid fa-grip-vertical text-secondary ps-2': true,\r\n 'cursor-grab': true, \r\n 'cursor-grabbing': false, \r\n 'd-none': !_isDraggable()\r\n }\"></i> \r\n </div> \r\n </div> \r\n </li> \r\n } \r\n </ul>\r\n </div>\r\n</div>", styles: ["div.coer-list header{align-items:center;justify-content:flex-end;padding-right:10px;margin:0}div.coer-list header h6{display:flex;align-items:center;gap:10px;min-height:40px;max-height:40px;margin-top:5px;margin-bottom:5px}div.coer-list header>div{display:flex;align-items:baseline;position:relative;z-index:1}div.coer-list ul.coer-list{width:100%;border:solid 1px #ccc;display:block;background:#fff;border-radius:4px;overflow:auto}div.coer-list li.coer-list-box{padding:10px;border-bottom:solid 1px #ccc;color:#000000de;display:flex;flex-direction:row;align-items:center;justify-content:space-between;box-sizing:border-box;background:#fff;font-size:14px}div.coer-list li.coer-list-box div.coer-list-content{width:100%;display:flex;align-items:center;justify-content:space-between}div.coer-list .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}div.coer-list .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list .coer-list-box:last-child{border:none}div.coer-list .coer-list.cdk-drop-list-dragging .coer-list-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list div.coer-list-placeholder{background:#ccc;border:dotted 3px #999;min-height:40px;transition:transform .25s cubic-bezier(0,0,.2,1)}div.coer-list div.cdk-drag-placeholder,div.coer-list ul.cdk-drop-list-dragging,div.coer-list ul.cdk-drop-list-dragging *{cursor:grabbing}div.coer-list div.loading,div.coer-list div.no-data{position:absolute;display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:25px;color:gray;z-index:1}div.coer-list div.loading{background-color:#bbbbbb83!important;flex-direction:column!important;gap:10px!important}div.coer-list div.loading span.fa-fade{position:relative!important}\n"] }]
|
129
|
-
}] });
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29lci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvZXItZWxlbWVudHMvY29tcG9uZW50cy9saWIvY29lci1saXN0L2NvZXItbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2VyLWVsZW1lbnRzL2NvbXBvbmVudHMvbGliL2NvZXItbGlzdC9jb2VyLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQU9wRCxNQUFNLE9BQU8sUUFBUTtJQUxyQjtRQU9JLFdBQVc7UUFDRCxRQUFHLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFN0MsUUFBUTtRQUNELGVBQVUsR0FBRyxLQUFLLENBQU0sRUFBRSxDQUFDLENBQUM7UUFDNUIsZ0JBQVcsR0FBRyxLQUFLLENBQVMsTUFBTSxDQUFDLENBQUM7UUFDcEMsV0FBTSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUMzQixlQUFVLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLHFCQUFnQixHQUFHLEtBQUssQ0FBa0QsS0FBSyxDQUFDLENBQUM7UUFDakYsaUJBQVksR0FBRyxLQUFLLENBQWtELEtBQUssQ0FBQyxDQUFDO1FBQzdFLG1CQUFjLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLGNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxLQUFLLENBQVUsS0FB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QUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBOUlRLFFBQVE7bUdBQVIsUUFBUSx1L0ZDVHJCLCttSUErSE07OzRGRHRITyxRQUFRO2tCQUxwQixTQUFTOytCQUNJLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7IFxyXG5pbXBvcnQgeyBTY3JlZW4sIFRvb2xzIH0gZnJvbSAnY29lci1lbGVtZW50cy90b29scyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY29lci1saXN0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2VyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmw6ICcuL2NvZXItbGlzdC5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2VyTGlzdDxUPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQgeyBcclxuXHJcbiAgICAvL1ZhcmlhYmxlc1xyXG4gICAgcHJvdGVjdGVkIF9pZDogc3RyaW5nID0gVG9vbHMuR2V0R3VpZCgnY29lci1MaXN0Jyk7XHJcbiAgICBwcm90ZWN0ZWQgX2VuYWJsZUFuaW1hdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvL0lucHV0c1xyXG4gICAgcHVibGljIGRhdGFTb3VyY2UgPSBpbnB1dDxUW10+KFtdKTtcclxuICAgIHB1YmxpYyBwcm9wRGlzcGxheSA9IGlucHV0PHN0cmluZz4oJ25hbWUnKTtcclxuICAgIHB1YmxpYyBoZWFkZXIgPSBpbnB1dDxzdHJpbmc+KCcnKTtcclxuICAgIHB1YmxpYyBoZWFkZXJJY29uID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcbiAgICBwdWJsaWMgc2hvd0RlbGV0ZUJ1dHRvbiA9IGlucHV0PCgoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbikgfCBib29sZWFuPihmYWxzZSk7XHJcbiAgICBwdWJsaWMgc2hvd0dvQnV0dG9uID0gaW5wdXQ8KChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKSB8IGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyBzaG93QmFja0J1dHRvbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyBpc0xvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwdWJsaWMgaXNEcmFnZ2FibGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwdWJsaWMgc2hvd1NlYXJjaCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyB0ZW1wbGF0ZSA9IGlucHV0PCgoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nKSB8IG51bGw+KG51bGwpO1xyXG4gICAgcHVibGljIHdpZHRoID0gaW5wdXQ8c3RyaW5nPignMTAwJScpO1xyXG4gICAgcHVibGljIE1pbldpZHRoID0gaW5wdXQ8c3RyaW5nPignMjUwcHgnKTtcclxuICAgIHB1YmxpYyBNYXhXaWR0aCA9IGlucHV0PHN0cmluZz4oJzEwMCUnKTtcclxuICAgIHB1YmxpYyBoZWlnaHQgPSBpbnB1dDxzdHJpbmc+KCczNTBweCcpO1xyXG4gICAgcHVibGljIG1pbkhlaWdodCA9IGlucHV0PHN0cmluZz4oJzE0MHB4Jyk7XHJcbiAgICBwdWJsaWMgbWF4SGVpZ2h0ID0gaW5wdXQ8c3RyaW5nPignMTAwdmgnKTtcclxuICAgIHB1YmxpYyBtYXJnaW5Ub3AgPSBpbnB1dDxzdHJpbmc+KCcwcHgnKTtcclxuICAgIHB1YmxpYyBtYXJnaW5SaWdodCA9IGlucHV0PHN0cmluZz4oJzBweCcpO1xyXG4gICAgcHVibGljIG1hcmdpbkJvdHRvbSA9IGlucHV0PHN0cmluZz4oJzBweCcpO1xyXG4gICAgcHVibGljIG1hcmdpbkxlZnQgPSBpbnB1dDxzdHJpbmc+KCcwcHgnKTtcclxuXHJcbiAgICAvL091dHB1dHNcclxuICAgIHB1YmxpYyBvbkRyb3AgPSBvdXRwdXQ8VD4oKTsgXHJcbiAgICBwdWJsaWMgb25Tb3J0ID0gb3V0cHV0PFRbXT4oKTsgXHJcbiAgICBwdWJsaWMgb25DbGljayA9IG91dHB1dDxUPigpO1xyXG4gICAgcHVibGljIG9uRG91YmxlQ2xpY2sgPSBvdXRwdXQ8VD4oKTtcclxuICAgIHB1YmxpYyBvbkNsaWNrRGVsZXRlID0gb3V0cHV0PFQ+KCk7XHJcbiAgICBwdWJsaWMgb25DbGlja0dvID0gb3V0cHV0PFQ+KCk7XHJcbiAgICBwdWJsaWMgb25DbGlja0JhY2sgPSBvdXRwdXQ8dm9pZD4oKTtcclxuXHJcbiAgICAvL2NvbXB1dGVkXHJcbiAgICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2UgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcclxuICAgICAgICBsZXQgaW5kZXggPSAwOyAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIFRvb2xzLkJyZWFrUmVmZXJlbmNlKHRoaXMuZGF0YVNvdXJjZSgpKVxyXG4gICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+IE9iamVjdC5hc3NpZ24oaXRlbSwgeyBpbmRleDogaW5kZXgrKyB9KSk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLy9jb21wdXRlZFxyXG4gICAgcHJvdGVjdGVkIF9pc0RyYWdnYWJsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc0RyYWdnYWJsZSgpICYmICF0aGlzLmlzTG9hZGluZygpO1xyXG4gICAgfSk7ICBcclxuXHJcblxyXG4gICAgLy9jb21wdXRlZFxyXG4gICAgcHJvdGVjdGVkIF9oYXNUZW1wbGF0ZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnRlbXBsYXRlKCkgPT0gJ2Z1bmN0aW9uJztcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICAvL2NvbXB1dGVkXHJcbiAgICBwcm90ZWN0ZWQgX3Nob3didXR0b25zID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4geyAgICAgICAgICAgICAgICBcclxuICAgICAgICByZXR1cm4gIXRoaXMuaXNMb2FkaW5nKCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgLy9nZXR0ZXJcclxuICAgIHByb3RlY3RlZCBnZXQgX2hlaWdodCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xyXG5cclxuICAgICAgICBpZiAoaGVpZ2h0ID09ICdmdWxsJykge1xyXG4gICAgICAgICAgICBjb25zdCBUT09MQkFSID0gNDU7XHJcbiAgICAgICAgICAgIGNvbnN0IFBBR0VfSEVBREVSID0gNzA7XHJcbiAgICAgICAgICAgIGNvbnN0IExJU1RfSEVBREVSID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5faWR9LWhlYWRlcmApITtcclxuICAgICAgICAgICAgY29uc3QgSEVBREVSID0gKExJU1RfSEVBREVSICYmIExJU1RfSEVBREVSLmNoaWxkcmVuLmxlbmd0aCA+IDApID8gNTAgOiAwO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgTUFSR0lOID0gNTA7XHJcbiAgICAgICAgICAgIGNvbnN0IFBBRERJTkcgPSA1MDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gKFNjcmVlbi5XSU5ET1dfSEVJR0hUIC0gVE9PTEJBUiAtIFBBR0VfSEVBREVSIC0gTUFSR0lOIC0gSEVBREVSIC0gUEFERElORykgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGhlaWdodDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIFRvb2xzLlNsZWVwKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMgPSB0cnVlOyBcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcm90ZWN0ZWQgR2V0RGlzcGxheSA9IChpdGVtOiBhbnkpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwoaXRlbSkgPyBpdGVtW3RoaXMucHJvcERpc3BsYXkoKV0gOiAnJztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcm90ZWN0ZWQgR2V0SW5kZXhSb3cgPSAoaXRlbTogYW55KTogbnVtYmVyID0+IHtcclxuICAgICAgICByZXR1cm4gaXRlbVsnaW5kZXgnXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcm90ZWN0ZWQgR2V0VGVtcGxhdGUoaXRlbTogYW55KTogc3RyaW5nIHsgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlKCkhKGl0ZW0sIGl0ZW0uaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHByb3RlY3RlZCBfc2hvd0JhY2tCdXR0b24gPSAoKTogYm9vbGVhbiA9PiB7ICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5zaG93QmFja0J1dHRvbigpXHJcbiAgICAgICAgICAgICYmICF0aGlzLmlzTG9hZGluZygpIFxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHByb3RlY3RlZCBfc2hvd0RlbGV0ZUJ1dHRvbiA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHsgXHJcbiAgICAgICAgY29uc3Qgc2hvd0J1dHRvbiA9IHRoaXMuc2hvd0RlbGV0ZUJ1dHRvbigpIGFzIGFueTsgICAgICAgIFxyXG4gICAgICAgIHJldHVybiAodHlwZW9mIHNob3dCdXR0b24gPT09ICdib29sZWFuJylcclxuICAgICAgICAgICAgPyBzaG93QnV0dG9uICYmICF0aGlzLmlzTG9hZGluZygpXHJcbiAgICAgICAgICAgIDogc2hvd0J1dHRvbihpdGVtLCBpdGVtLmluZGV4KSA9PT0gdHJ1ZSAmJiAhdGhpcy5pc0xvYWRpbmcoKTsgXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIF9zaG93R29CdXR0b24gPSAoaXRlbTogYW55KTogYm9vbGVhbiA9PiB7IFxyXG4gICAgICAgIGNvbnN0IHNob3dCdXR0b24gPSB0aGlzLnNob3dHb0J1dHRvbigpIGFzIGFueTsgICAgICAgIFxyXG4gICAgICAgIHJldHVybiAodHlwZW9mIHNob3dCdXR0b24gPT09ICdib29sZWFuJylcclxuICAgICAgICAgICAgPyBzaG93QnV0dG9uICYmICF0aGlzLmlzTG9hZGluZygpXHJcbiAgICAgICAgICAgIDogc2hvd0J1dHRvbihpdGVtLCBpdGVtLmluZGV4KSA9PT0gdHJ1ZSAmJiAhdGhpcy5pc0xvYWRpbmcoKTsgXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJvdGVjdGVkIERyb3AoZXZlbnQ6IENka0RyYWdEcm9wPFRbXT4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCB9ID0gZXZlbnQ7ICAgICAgICBcclxuICAgICAgICBsZXQgZGF0YVNvdXJjZSA9IFRvb2xzLkJyZWFrUmVmZXJlbmNlKHRoaXMuZGF0YVNvdXJjZSgpKTtcclxuICAgICAgICBjb25zdCBpdGVtID0gVG9vbHMuQnJlYWtSZWZlcmVuY2UoZGF0YVNvdXJjZVtwcmV2aW91c0luZGV4XSk7XHJcbiAgICAgICAgZGF0YVNvdXJjZS5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XHJcbiAgICAgICAgZGF0YVNvdXJjZS5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBpdGVtKTsgXHJcbiAgICAgICAgdGhpcy5vblNvcnQuZW1pdChkYXRhU291cmNlKTtcclxuICAgICAgICB0aGlzLm9uRHJvcC5lbWl0KGl0ZW0pO1xyXG4gICAgfVxyXG59IiwiPGRpdiBbaWRdPVwiX2lkXCIgY2xhc3M9XCJjb2VyLWxpc3RcIiBbbmdTdHlsZV09XCJ7IFxyXG4gICdtYXJnaW4tdG9wJzogbWFyZ2luVG9wKCksIFxyXG4gICdtYXJnaW4tcmlnaHQnOiBtYXJnaW5SaWdodCgpLCBcclxuICAnbWFyZ2luLWJvdHRvbSc6IG1hcmdpbkJvdHRvbSgpLCBcclxuICAnbWFyZ2luLWxlZnQnOiBtYXJnaW5MZWZ0KCksIFxyXG4gIH1cIj5cclxuXHJcbiAgQGlmKGlzTG9hZGluZygpKSB7XHJcbiAgICA8IS0tIEdyaWQgTWVzc2FnZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiPjwvaT5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhLWZhZGVcIj5Mb2FkaW5nPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICBAZWxzZSBpZihkYXRhU291cmNlKCkubGVuZ3RoIDw9IDApIHtcclxuICAgIDxkaXYgY2xhc3M9XCJuby1kYXRhXCI+IE5vIERhdGEgPC9kaXY+XHJcbiAgfVxyXG5cclxuICA8aGVhZGVyIFtpZF09XCJfaWQgKyAnLWhlYWRlcidcIiBjbGFzcz1cInJvd1wiPiBcclxuICAgIEBpZihoZWFkZXIoKS5sZW5ndGggPiAwIHx8IGhlYWRlckljb24oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBtZS1hdXRvXCI+XHJcbiAgICAgICAgPGg2PlxyXG4gICAgICAgICAgQGlmKGhlYWRlckljb24oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIDxpIFtjbGFzc109XCJoZWFkZXJJY29uKClcIj48L2k+IFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEBpZihoZWFkZXIoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGhlYWRlcigpIH19PC9zcGFuPiBcclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2g2PiAgICAgICAgXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIEBpZihfc2hvd0JhY2tCdXR0b24oKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcHMtMiBwZS0wXCI+ICAgICAgICAgXHJcbiAgICAgICAgPGNvZXItYnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJpY29uLW91dGxpbmVcIlxyXG4gICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgIGljb249XCJiYWNrXCJcclxuICAgICAgICAgICAgdG9vbHRpcD1cIkJhY2tcIlxyXG4gICAgICAgICAgICBbYW5pbWF0aW9uXT1cIl9lbmFibGVBbmltYXRpb25zXCJcclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0JhY2suZW1pdCgpXCJcclxuICAgICAgICA+PC9jb2VyLWJ1dHRvbj4gICAgICAgXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgXHJcbiAgICA8IS0tIFNlYXJjaCAtLT5cclxuICAgIEBpZihzaG93U2VhcmNoKCkgJiYgZGF0YVNvdXJjZSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHBlLTBcIj5cclxuICAgICAgICAgIDxjb2VyLXRleHRib3hcclxuICAgICAgICAgICAgICAjaW5wdXRTZWFyY2ggXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIlxyXG4gICAgICAgICAgICAgIFtpc0Rpc2FibGVkXT1cImlzTG9hZGluZygpXCJcclxuICAgICAgICAgICAgICBbc2VsZWN0T25Gb2N1c109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICB3aWR0aD1cIjI1MHB4XCJcclxuICAgICAgICAgICAgICBtYXJnaW5Ub3A9XCI1cHhcIlxyXG4gICAgICAgICAgICAgIG1hcmdpbkJvdHRvbT1cIjVweFwiXHJcbiAgICAgICAgICAgICAgW3Nob3dTZWFyY2hJY29uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJJY29uXT1cInRydWVcIlxyXG4gICAgICAgICAgPjwvY29lci10ZXh0Ym94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2hlYWRlcj5cclxuXHJcbiAgPGRpdiBbbmdTdHlsZV09XCJ7IFxyXG4gICAgJ3dpZHRoJzogd2lkdGgoKSwgXHJcbiAgICAnbWluLVdpZHRoJzogTWluV2lkdGgoKSwgXHJcbiAgICAnbWF4LVdpZHRoJzogTWF4V2lkdGgoKSwgXHJcbiAgICB9XCI+XHJcbiAgICA8dWwgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJEcm9wKCRldmVudClcIiBjbGFzcz0nbGlzdC1ncm91cCBjb2VyLWxpc3QnXHJcbiAgICAgICAgW25nU3R5bGVdPVwieyBcclxuICAgICAgICAgICdoZWlnaHQnOiBfaGVpZ2h0LCBcclxuICAgICAgICAgICdtaW4taGVpZ2h0JzogbWluSGVpZ2h0KCksIFxyXG4gICAgICAgICAgJ21heC1oZWlnaHQnOiBtYXhIZWlnaHQoKSwgXHJcbiAgICAgICAgICAnZC1ub25lJzogZGF0YVNvdXJjZSgpLmxlbmd0aCA8PSAwICBcclxuICAgICAgICAgIH1cIj5cclxuICAgICAgXHJcbiAgICAgIEBmb3IgKGl0ZW0gb2YgX2RhdGFTb3VyY2UoKTsgdHJhY2sgR2V0SW5kZXhSb3coaXRlbSkpIHtcclxuICAgICAgICA8bGkgY2RrRHJhZyBcclxuICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGNvZXItbGlzdC1ib3hcIiBcclxuICAgICAgICAgIGNka0RyYWdCb3VuZGFyeT1cInVsLmNvZXItbGlzdFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25DbGljay5lbWl0KGl0ZW0pXCIgXHJcbiAgICAgICAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljay5lbWl0KGl0ZW0pXCI+XHJcbiAgXHJcbiAgICAgICAgICA8ZGl2ICpjZGtEcmFnUGxhY2Vob2xkZXIgY2xhc3M9XCJjb2VyLWxpc3QtcGxhY2Vob2xkZXIgY3Vyc29yLWdyYWJiaW5nXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29lci1saXN0LWNvbnRlbnRcIj4gXHJcbiAgICAgICAgICAgIEBpZihfaGFzVGVtcGxhdGUoKSkge1xyXG4gICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJHZXRUZW1wbGF0ZShpdGVtKSB8IGh0bWxcIiBjbGFzcz1cInRlbXBsYXRlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgICAgQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXY+IHt7IEdldERpc3BsYXkoaXRlbSkgfX0gPC9kaXY+IFxyXG4gICAgICAgICAgICB9ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIEBpZihfc2hvd0RlbGV0ZUJ1dHRvbihpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgPGNvZXItYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJpY29uLW5vLWJvcmRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgaWNvbj1cImRlbGV0ZVwiICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xpY2tEZWxldGUuZW1pdChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9jb2VyLWJ1dHRvbj5cclxuICAgICAgICAgICAgICB9IFxyXG4gIFxyXG4gICAgICAgICAgICAgIEBpZihfc2hvd0dvQnV0dG9uKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICA8Y29lci1idXR0b25cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImljb24tbm8tYm9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICBpY29uPVwiZ29cIiAgIFxyXG4gICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0PVwiNXB4XCIgICBcclxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DbGlja0dvLmVtaXQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgPjwvY29lci1idXR0b24+XHJcbiAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGkgY2RrRHJhZ0hhbmRsZSBbbmdDbGFzc109XCJ7IFxyXG4gICAgICAgICAgICAgICAgJ2ZhLXNvbGlkIGZhLWdyaXAtdmVydGljYWwgdGV4dC1zZWNvbmRhcnkgcHMtMic6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAnY3Vyc29yLWdyYWInOiB0cnVlLCBcclxuICAgICAgICAgICAgICAgICdjdXJzb3ItZ3JhYmJpbmcnOiBmYWxzZSwgXHJcbiAgICAgICAgICAgICAgICAnZC1ub25lJzogIV9pc0RyYWdnYWJsZSgpXHJcbiAgICAgICAgICAgICAgfVwiPjwvaT4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PiAgXHJcbiAgICAgICAgPC9saT4gXHJcbiAgICAgIH0gXHJcbiAgICA8L3VsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
@@ -1,107 +0,0 @@
|
|
1
|
-
import { Component, computed, ContentChildren, input, Input, output } from '@angular/core';
|
2
|
-
import { CoerRefDirective } from 'coer-elements/directives';
|
3
|
-
import { isModalOpenSIGNAL } from 'coer-elements/signals';
|
4
|
-
import { Screen, Tools } from 'coer-elements/tools';
|
5
|
-
import { Modal } from 'bootstrap';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
import * as i1 from "@angular/common";
|
8
|
-
export class CoerModal {
|
9
|
-
constructor() {
|
10
|
-
//Variables
|
11
|
-
this._id = Tools.GetGuid('coer-modal');
|
12
|
-
this._isOpen = false;
|
13
|
-
this._isModalOpen = isModalOpenSIGNAL;
|
14
|
-
this.windowWidth = Screen.WINDOW_WIDTH;
|
15
|
-
//Inputs
|
16
|
-
this.id = '';
|
17
|
-
this.title = input('');
|
18
|
-
this.icon = input('');
|
19
|
-
this.showCloseButton = input(true);
|
20
|
-
this.width = input('small');
|
21
|
-
this.height = input('auto');
|
22
|
-
this.maxHeight = input('');
|
23
|
-
//Computed
|
24
|
-
this.contentList = computed(() => Array.from(this.contentRef._results));
|
25
|
-
//Computed
|
26
|
-
this.header = computed(() => {
|
27
|
-
const header = this.contentList().find(x => x.coerRef() === 'header');
|
28
|
-
return Tools.IsNotNull(header) ? header : null;
|
29
|
-
});
|
30
|
-
//Computed
|
31
|
-
this.body = computed(() => {
|
32
|
-
const body = this.contentList().find(x => x.coerRef() === '' || x.coerRef() === 'body');
|
33
|
-
return Tools.IsNotNull(body) ? body : null;
|
34
|
-
});
|
35
|
-
//Computed
|
36
|
-
this.footer = computed(() => {
|
37
|
-
const footer = this.contentList().find(x => x.coerRef() === 'footer');
|
38
|
-
return Tools.IsNotNull(footer) ? footer : null;
|
39
|
-
});
|
40
|
-
//Computed
|
41
|
-
this._title = computed(() => {
|
42
|
-
return Tools.IsNotNull(this.header()) && this.header().title().length > 0
|
43
|
-
? this.header().title() : this.title();
|
44
|
-
});
|
45
|
-
//Computed
|
46
|
-
this._icon = computed(() => {
|
47
|
-
return Tools.IsNotNull(this.header()) && this.header().icon().length > 0
|
48
|
-
? this.header().icon() : this.icon();
|
49
|
-
});
|
50
|
-
//Outputs
|
51
|
-
this.onOpen = output();
|
52
|
-
this.onClose = output();
|
53
|
-
//Generic Tools
|
54
|
-
this.IsNull = Tools.IsNull;
|
55
|
-
this.IsNotNull = Tools.IsNotNull;
|
56
|
-
}
|
57
|
-
//getter
|
58
|
-
get isOpen() {
|
59
|
-
return this._isOpen;
|
60
|
-
}
|
61
|
-
//getter
|
62
|
-
get _width() {
|
63
|
-
switch (this.width()) {
|
64
|
-
case 'small': return '450px';
|
65
|
-
case 'full': return `${this.windowWidth - 50}px`;
|
66
|
-
default: return 'auto';
|
67
|
-
}
|
68
|
-
}
|
69
|
-
ngOnInit() {
|
70
|
-
Screen.Resize.subscribe((response) => {
|
71
|
-
this.windowWidth = response.width;
|
72
|
-
});
|
73
|
-
Tools.Sleep().then(() => {
|
74
|
-
this._modal = new Modal(document.getElementById(this._id));
|
75
|
-
});
|
76
|
-
}
|
77
|
-
/** */
|
78
|
-
Open() {
|
79
|
-
this._modal.show();
|
80
|
-
if (!this._isOpen) {
|
81
|
-
this._isOpen = true;
|
82
|
-
this._isModalOpen.set(true);
|
83
|
-
Tools.Sleep(1000).then(() => this.onOpen.emit());
|
84
|
-
}
|
85
|
-
}
|
86
|
-
/** */
|
87
|
-
Close() {
|
88
|
-
this._modal.hide();
|
89
|
-
if (this._isOpen) {
|
90
|
-
this._isOpen = false;
|
91
|
-
this._isModalOpen.set(false);
|
92
|
-
Tools.Sleep(1000).then(() => this.onClose.emit());
|
93
|
-
}
|
94
|
-
}
|
95
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerModal, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
96
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CoerModal, selector: "coer-modal", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: false, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onOpen: "onOpen", onClose: "onClose" }, queries: [{ propertyName: "contentRef", predicate: CoerRefDirective }], ngImport: i0, template: "<aside title='' [id]=\"_id\" class=\"modal fade\" data-bs-backdrop=\"static\" tabindex=\"-1\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\" [ngStyle]=\"{ 'max-width': _width }\">\r\n <div class=\"modal-content\">\r\n @if(IsNull(header()) || (IsNotNull(header()) && header()?.show())) {\r\n <header class=\"modal-header\">\r\n <h6 class=\"modal-title\">\r\n <i [class]=\"_icon()\"></i>\r\n <span [ngClass]=\"{ 'ms-1': _icon().length > 0 }\"> {{ _title() }} </span>\r\n </h6>\r\n\r\n @if(showCloseButton()) {\r\n <button type=\"button\" class=\"btn-close\" (click)=\"Close()\"></button>\r\n }\r\n </header>\r\n }\r\n\r\n <section class=\"modal-body\" [ngStyle]=\"{\r\n 'height': height(),\r\n 'max-height': maxHeight(),\r\n 'overflow': maxHeight() === '' ? 'visible' : 'auto'\r\n }\">\r\n @if(IsNotNull(body()) && body()?.show()) {\r\n <ng-container [ngTemplateOutlet]=\"body()!.template\"></ng-container>\r\n }\r\n\r\n @else {\r\n <ng-content></ng-content>\r\n }\r\n </section>\r\n\r\n @if(IsNotNull(footer())) {\r\n <footer class=\"modal-footer\">\r\n @if(footer()?.show()) {\r\n <ng-container [ngTemplateOutlet]=\"footer()!.template\"></ng-container>\r\n }\r\n </footer>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'backdrop': _isModalOpen() }\"></div>\r\n</aside>", styles: [".modal-dialog{margin:auto!important;height:100vh}.modal-header{padding:8px 16px!important}.modal-title{font-weight:700!important;font-size:17px!important}.modal-body{padding-top:16px!important;padding-bottom:0!important;min-width:60px!important}div.coer-filebox .modal-body{padding:0!important}.modal-footer{border:none!important;display:flex!important;align-items:flex-end!important;justify-content:flex-end!important;max-height:64px!important;min-height:64px!important;gap:10px!important}.btn-close:focus{box-shadow:none!important}div.modal-backdrop{z-index:0!important}aside.modal div.backdrop{width:100vw;height:100vh;position:fixed;top:0;left:0;background-color:#0000005b;z-index:1500}div.modal-content{z-index:1501;overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
|
97
|
-
}
|
98
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CoerModal, decorators: [{
|
99
|
-
type: Component,
|
100
|
-
args: [{ selector: 'coer-modal', template: "<aside title='' [id]=\"_id\" class=\"modal fade\" data-bs-backdrop=\"static\" tabindex=\"-1\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\" [ngStyle]=\"{ 'max-width': _width }\">\r\n <div class=\"modal-content\">\r\n @if(IsNull(header()) || (IsNotNull(header()) && header()?.show())) {\r\n <header class=\"modal-header\">\r\n <h6 class=\"modal-title\">\r\n <i [class]=\"_icon()\"></i>\r\n <span [ngClass]=\"{ 'ms-1': _icon().length > 0 }\"> {{ _title() }} </span>\r\n </h6>\r\n\r\n @if(showCloseButton()) {\r\n <button type=\"button\" class=\"btn-close\" (click)=\"Close()\"></button>\r\n }\r\n </header>\r\n }\r\n\r\n <section class=\"modal-body\" [ngStyle]=\"{\r\n 'height': height(),\r\n 'max-height': maxHeight(),\r\n 'overflow': maxHeight() === '' ? 'visible' : 'auto'\r\n }\">\r\n @if(IsNotNull(body()) && body()?.show()) {\r\n <ng-container [ngTemplateOutlet]=\"body()!.template\"></ng-container>\r\n }\r\n\r\n @else {\r\n <ng-content></ng-content>\r\n }\r\n </section>\r\n\r\n @if(IsNotNull(footer())) {\r\n <footer class=\"modal-footer\">\r\n @if(footer()?.show()) {\r\n <ng-container [ngTemplateOutlet]=\"footer()!.template\"></ng-container>\r\n }\r\n </footer>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"{ 'backdrop': _isModalOpen() }\"></div>\r\n</aside>", styles: [".modal-dialog{margin:auto!important;height:100vh}.modal-header{padding:8px 16px!important}.modal-title{font-weight:700!important;font-size:17px!important}.modal-body{padding-top:16px!important;padding-bottom:0!important;min-width:60px!important}div.coer-filebox .modal-body{padding:0!important}.modal-footer{border:none!important;display:flex!important;align-items:flex-end!important;justify-content:flex-end!important;max-height:64px!important;min-height:64px!important;gap:10px!important}.btn-close:focus{box-shadow:none!important}div.modal-backdrop{z-index:0!important}aside.modal div.backdrop{width:100vw;height:100vh;position:fixed;top:0;left:0;background-color:#0000005b;z-index:1500}div.modal-content{z-index:1501;overflow:visible!important}\n"] }]
|
101
|
-
}], propDecorators: { contentRef: [{
|
102
|
-
type: ContentChildren,
|
103
|
-
args: [CoerRefDirective]
|
104
|
-
}], id: [{
|
105
|
-
type: Input
|
106
|
-
}] } });
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29lci1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2VyLWVsZW1lbnRzL2NvbXBvbmVudHMvbGliL2NvZXItbW9kYWwvY29lci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2VyLWVsZW1lbnRzL2NvbXBvbmVudHMvbGliL2NvZXItbW9kYWwvY29lci1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBUWxDLE1BQU0sT0FBTyxTQUFTO0lBTHRCO1FBU0ksV0FBVztRQUNELFFBQUcsR0FBVyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFekIsaUJBQVksR0FBNEIsaUJBQWlCLENBQUM7UUFDNUQsZ0JBQVcsR0FBVyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBRWxELFFBQVE7UUFDQyxPQUFFLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLFVBQUssR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDMUIsU0FBSSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6QixvQkFBZSxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUN2QyxVQUFLLEdBQUcsS0FBSyxDQUFrQixPQUFPLENBQUMsQ0FBQztRQUN4QyxXQUFNLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLGNBQVMsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFnQnJDLFVBQVU7UUFDQSxnQkFBVyxHQUFHLFFBQVEsQ0FBYSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV6RixVQUFVO1FBQ0EsV0FBTSxHQUFHLFFBQVEsQ0FBa0IsR0FBRyxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILFVBQVU7UUFDQSxTQUFJLEdBQUcsUUFBUSxDQUFrQixHQUFHLEVBQUU7WUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ3hGLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVO1FBQ0EsV0FBTSxHQUFHLFFBQVEsQ0FBa0IsR0FBRyxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDdEUsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILFVBQVU7UUFDQSxXQUFNLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRTtZQUNyQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN0RSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVO1FBQ0EsVUFBSyxHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUU7WUFDcEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUztRQUNGLFdBQU0sR0FBRyxNQUFNLEVBQVEsQ0FBQztRQUN4QixZQUFPLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEMsZUFBZTtRQUNMLFdBQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RCLGNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0tBbUN6QztJQXhGRyxRQUFRO0lBQ1IsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxRQUFRO0lBQ1IsSUFBYyxNQUFNO1FBQ2hCLFFBQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEIsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQztZQUM3QixLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsSUFBSSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO0lBMkNELFFBQVE7UUFDSixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQXFCLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBRSxDQUFDLENBQUE7UUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0QsTUFBTTtJQUNDLElBQUk7UUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRW5CLElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNMLENBQUM7SUFHRCxNQUFNO0lBQ0MsS0FBSztRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbkIsSUFBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7K0dBM0dRLFNBQVM7bUdBQVQsU0FBUyxzL0JBRUQsZ0JBQWdCLDZCQ2ZyQyxpMERBeUNROzs0RkQ1QkssU0FBUztrQkFMckIsU0FBUzsrQkFDSSxZQUFZOzhCQU1hLFVBQVU7c0JBQTVDLGVBQWU7dUJBQUMsZ0JBQWdCO2dCQVV4QixFQUFFO3NCQUFWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBDb250ZW50Q2hpbGRyZW4sIGlucHV0LCBJbnB1dCwgT25Jbml0LCBvdXRwdXQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElDb2VyUmVmLCBJU2NyZWVuU2l6ZSB9IGZyb20gJ2NvZXItZWxlbWVudHMvaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IENvZXJSZWZEaXJlY3RpdmUgfSBmcm9tICdjb2VyLWVsZW1lbnRzL2RpcmVjdGl2ZXMnO1xyXG5pbXBvcnQgeyBpc01vZGFsT3BlblNJR05BTCB9IGZyb20gJ2NvZXItZWxlbWVudHMvc2lnbmFscyc7XHJcbmltcG9ydCB7IFNjcmVlbiwgVG9vbHMgfSBmcm9tICdjb2VyLWVsZW1lbnRzL3Rvb2xzJztcclxuaW1wb3J0IHsgTW9kYWwgfSBmcm9tICdib290c3RyYXAnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjb2VyLW1vZGFsJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2VyLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9jb2VyLW1vZGFsLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29lck1vZGFsIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKENvZXJSZWZEaXJlY3RpdmUpIGNvbnRlbnRSZWYhOiBhbnk7XHJcblxyXG4gICAgLy9WYXJpYWJsZXNcclxuICAgIHByb3RlY3RlZCBfaWQ6IHN0cmluZyA9IFRvb2xzLkdldEd1aWQoJ2NvZXItbW9kYWwnKTtcclxuICAgIHByb3RlY3RlZCBfaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgX21vZGFsITogTW9kYWw7XHJcbiAgICBwcm90ZWN0ZWQgX2lzTW9kYWxPcGVuOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IGlzTW9kYWxPcGVuU0lHTkFMO1xyXG4gICAgcHJpdmF0ZSB3aW5kb3dXaWR0aDogbnVtYmVyID0gU2NyZWVuLldJTkRPV19XSURUSDtcclxuXHJcbiAgICAvL0lucHV0c1xyXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gICAgcHVibGljIHRpdGxlID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcbiAgICBwdWJsaWMgaWNvbiA9IGlucHV0PHN0cmluZz4oJycpO1xyXG4gICAgcHVibGljIHNob3dDbG9zZUJ1dHRvbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xyXG4gICAgcHVibGljIHdpZHRoID0gaW5wdXQ8J3NtYWxsJ3wgJ2Z1bGwnPignc21hbGwnKTtcclxuICAgIHB1YmxpYyBoZWlnaHQgPSBpbnB1dDxzdHJpbmc+KCdhdXRvJyk7XHJcbiAgICBwdWJsaWMgbWF4SGVpZ2h0ID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcblxyXG4gICAgLy9nZXR0ZXJcclxuICAgIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgLy9nZXR0ZXJcclxuICAgIHByb3RlY3RlZCBnZXQgX3dpZHRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoKHRoaXMud2lkdGgoKSkge1xyXG4gICAgICAgICAgICBjYXNlICdzbWFsbCc6IHJldHVybiAnNDUwcHgnO1xyXG4gICAgICAgICAgICBjYXNlICdmdWxsJzogcmV0dXJuIGAke3RoaXMud2luZG93V2lkdGggLSA1MH1weGA7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnYXV0byc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQ29tcHV0ZWRcclxuICAgIHByb3RlY3RlZCBjb250ZW50TGlzdCA9IGNvbXB1dGVkPElDb2VyUmVmW10+KCgpID0+IEFycmF5LmZyb20odGhpcy5jb250ZW50UmVmLl9yZXN1bHRzKSk7XHJcblxyXG4gICAgLy9Db21wdXRlZFxyXG4gICAgcHJvdGVjdGVkIGhlYWRlciA9IGNvbXB1dGVkPElDb2VyUmVmIHwgbnVsbD4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuY29udGVudExpc3QoKS5maW5kKHggPT4geC5jb2VyUmVmKCkgPT09ICdoZWFkZXInKTtcclxuICAgICAgICByZXR1cm4gVG9vbHMuSXNOb3ROdWxsKGhlYWRlcikgPyBoZWFkZXIhIDogbnVsbDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vQ29tcHV0ZWRcclxuICAgIHByb3RlY3RlZCBib2R5ID0gY29tcHV0ZWQ8SUNvZXJSZWYgfCBudWxsPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29udGVudExpc3QoKS5maW5kKHggPT4geC5jb2VyUmVmKCkgPT09ICcnIHx8IHguY29lclJlZigpID09PSAnYm9keScpO1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwoYm9keSkgPyBib2R5ISA6IG51bGw7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL0NvbXB1dGVkXHJcbiAgICBwcm90ZWN0ZWQgZm9vdGVyID0gY29tcHV0ZWQ8SUNvZXJSZWYgfCBudWxsPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGhpcy5jb250ZW50TGlzdCgpLmZpbmQoeCA9PiB4LmNvZXJSZWYoKSA9PT0gJ2Zvb3RlcicpO1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwoZm9vdGVyKSA/IGZvb3RlciEgOiBudWxsO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9Db21wdXRlZFxyXG4gICAgcHJvdGVjdGVkIF90aXRsZSA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwodGhpcy5oZWFkZXIoKSkgJiYgdGhpcy5oZWFkZXIoKSEudGl0bGUoKS5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5oZWFkZXIoKSEudGl0bGUoKSA6IHRoaXMudGl0bGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vQ29tcHV0ZWRcclxuICAgIHByb3RlY3RlZCBfaWNvbiA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBUb29scy5Jc05vdE51bGwodGhpcy5oZWFkZXIoKSkgJiYgdGhpcy5oZWFkZXIoKSEuaWNvbigpLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyB0aGlzLmhlYWRlcigpIS5pY29uKCkgOiB0aGlzLmljb24oKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vT3V0cHV0c1xyXG4gICAgcHVibGljIG9uT3BlbiA9IG91dHB1dDx2b2lkPigpO1xyXG4gICAgcHVibGljIG9uQ2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcclxuXHJcbiAgICAvL0dlbmVyaWMgVG9vbHNcclxuICAgIHByb3RlY3RlZCBJc051bGwgPSBUb29scy5Jc051bGw7XHJcbiAgICBwcm90ZWN0ZWQgSXNOb3ROdWxsID0gVG9vbHMuSXNOb3ROdWxsO1xyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIFNjcmVlbi5SZXNpemUuc3Vic2NyaWJlKChyZXNwb25zZTogSVNjcmVlblNpemUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy53aW5kb3dXaWR0aCA9IHJlc3BvbnNlLndpZHRoO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBUb29scy5TbGVlcCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9tb2RhbCA9IG5ldyBNb2RhbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9pZCkhKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHB1YmxpYyBPcGVuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21vZGFsLnNob3coKTtcclxuXHJcbiAgICAgICAgaWYoIXRoaXMuX2lzT3Blbikge1xyXG4gICAgICAgICAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9pc01vZGFsT3Blbi5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIFRvb2xzLlNsZWVwKDEwMDApLnRoZW4oKCkgPT4gdGhpcy5vbk9wZW4uZW1pdCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHVibGljIENsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21vZGFsLmhpZGUoKTtcclxuXHJcbiAgICAgICAgaWYodGhpcy5faXNPcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9pc01vZGFsT3Blbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgICBUb29scy5TbGVlcCgxMDAwKS50aGVuKCgpID0+IHRoaXMub25DbG9zZS5lbWl0KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIjxhc2lkZSB0aXRsZT0nJyBbaWRdPVwiX2lkXCIgY2xhc3M9XCJtb2RhbCBmYWRlXCIgZGF0YS1icy1iYWNrZHJvcD1cInN0YXRpY1wiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtZGlhbG9nLWNlbnRlcmVkIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCIgW25nU3R5bGVdPVwieyAnbWF4LXdpZHRoJzogX3dpZHRoIH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICBAaWYoSXNOdWxsKGhlYWRlcigpKSB8fCAoSXNOb3ROdWxsKGhlYWRlcigpKSAmJiBoZWFkZXIoKT8uc2hvdygpKSkge1xyXG4gICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJfaWNvbigpXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7ICdtcy0xJzogX2ljb24oKS5sZW5ndGggPiAwIH1cIj4ge3sgX3RpdGxlKCkgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaDY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihzaG93Q2xvc2VCdXR0b24oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJDbG9zZSgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtYm9keVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ21heC1oZWlnaHQnOiBtYXhIZWlnaHQoKSxcclxuICAgICAgICAgICAgICAgICAgICAnb3ZlcmZsb3cnOiBtYXhIZWlnaHQoKSA9PT0gJycgPyAndmlzaWJsZScgOiAnYXV0bydcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIEBpZihJc05vdE51bGwoYm9keSgpKSAmJiBib2R5KCk/LnNob3coKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYm9keSgpIS50ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgICAgICAgIEBpZihJc05vdE51bGwoZm9vdGVyKCkpKSB7XHJcbiAgICAgICAgICAgICAgICA8Zm9vdGVyIGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGZvb3RlcigpPy5zaG93KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmb290ZXIoKSEudGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJ7ICdiYWNrZHJvcCc6IF9pc01vZGFsT3BlbigpIH1cIj48L2Rpdj5cclxuPC9hc2lkZT4iXX0=
|