@seniorsistemas/components-ai 0.0.0-master-d4a804fe
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/CHANGELOG.md +101 -0
- package/CONTRIBUTING.md +317 -0
- package/README.md +161 -0
- package/docs/API.md +486 -0
- package/docs/COMPONENTS.md +272 -0
- package/docs/EXAMPLES.md +559 -0
- package/docs/MIGRATION.md +367 -0
- package/esm2022/lib/angular-components.module.mjs +25 -0
- package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +121 -0
- package/esm2022/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.mjs +176 -0
- package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +625 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-date.component.mjs +86 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.mjs +103 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-lookup.component.mjs +599 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-number.component.mjs +92 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-text.component.mjs +163 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-textarea.component.mjs +81 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.mjs +93 -0
- package/esm2022/lib/components/dynamic-form/fields/index.mjs +8 -0
- package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +2 -0
- package/esm2022/lib/components/export-dialog/export-dialog.component.mjs +219 -0
- package/esm2022/lib/config/translation.config.mjs +70 -0
- package/esm2022/lib/directives/cep-mask.directive.mjs +79 -0
- package/esm2022/lib/directives/document-mask.directive.mjs +62 -0
- package/esm2022/lib/directives/phone-mask.directive.mjs +59 -0
- package/esm2022/lib/interceptors/api.interceptor.mjs +55 -0
- package/esm2022/lib/models/base-entity.interface.mjs +2 -0
- package/esm2022/lib/models/entity-list.config.mjs +2 -0
- package/esm2022/lib/pipes/translate.pipe.mjs +74 -0
- package/esm2022/lib/services/auth.service.mjs +169 -0
- package/esm2022/lib/services/cookie.service.mjs +90 -0
- package/esm2022/lib/services/entity.service.mjs +208 -0
- package/esm2022/lib/services/mask.service.mjs +121 -0
- package/esm2022/lib/services/permission.service.mjs +180 -0
- package/esm2022/lib/services/senior-token.service.mjs +209 -0
- package/esm2022/lib/services/theme.service.mjs +85 -0
- package/esm2022/lib/services/translation.service.mjs +232 -0
- package/esm2022/public-api.mjs +90 -0
- package/esm2022/seniorsistemas-components-ai.mjs +5 -0
- package/fesm2022/seniorsistemas-components-ai.mjs +4006 -0
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/angular-components.module.d.ts +13 -0
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -0
- package/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.d.ts +46 -0
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +97 -0
- package/lib/components/dynamic-form/fields/dynamic-field-date.component.d.ts +16 -0
- package/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.d.ts +17 -0
- package/lib/components/dynamic-form/fields/dynamic-field-lookup.component.d.ts +52 -0
- package/lib/components/dynamic-form/fields/dynamic-field-number.component.d.ts +16 -0
- package/lib/components/dynamic-form/fields/dynamic-field-text.component.d.ts +17 -0
- package/lib/components/dynamic-form/fields/dynamic-field-textarea.component.d.ts +16 -0
- package/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.d.ts +20 -0
- package/lib/components/dynamic-form/fields/index.d.ts +7 -0
- package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +178 -0
- package/lib/components/export-dialog/export-dialog.component.d.ts +56 -0
- package/lib/config/translation.config.d.ts +24 -0
- package/lib/directives/cep-mask.directive.d.ts +13 -0
- package/lib/directives/document-mask.directive.d.ts +19 -0
- package/lib/directives/phone-mask.directive.d.ts +11 -0
- package/lib/interceptors/api.interceptor.d.ts +2 -0
- package/lib/models/base-entity.interface.d.ts +7 -0
- package/lib/models/entity-list.config.d.ts +161 -0
- package/lib/pipes/translate.pipe.d.ts +21 -0
- package/lib/services/auth.service.d.ts +82 -0
- package/lib/services/cookie.service.d.ts +31 -0
- package/lib/services/entity.service.d.ts +99 -0
- package/lib/services/mask.service.d.ts +36 -0
- package/lib/services/permission.service.d.ts +91 -0
- package/lib/services/senior-token.service.d.ts +70 -0
- package/lib/services/theme.service.d.ts +16 -0
- package/lib/services/translation.service.d.ts +54 -0
- package/package.json +53 -0
- package/public-api.d.ts +17 -0
- package/src/lib/styles/entity-list.shared.scss +383 -0
- package/src/lib/styles/index.scss +10 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, Optional, Inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { DialogModule } from 'primeng/dialog';
|
|
4
|
+
import { ButtonModule } from 'primeng/button';
|
|
5
|
+
import { ProgressBarModule } from 'primeng/progressbar';
|
|
6
|
+
import { TagModule } from 'primeng/tag';
|
|
7
|
+
import { catchError, concatMap, from, of } from 'rxjs';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "primeng/dialog";
|
|
10
|
+
import * as i2 from "primeng/api";
|
|
11
|
+
import * as i3 from "primeng/button";
|
|
12
|
+
import * as i4 from "primeng/progressbar";
|
|
13
|
+
import * as i5 from "primeng/tag";
|
|
14
|
+
export class BulkDeleteDialogComponent {
|
|
15
|
+
translationService;
|
|
16
|
+
visible = false;
|
|
17
|
+
stages = []; // Generic entities
|
|
18
|
+
service; // Generic service
|
|
19
|
+
entityNameField = 'name'; // Field to display entity name
|
|
20
|
+
entityCodeField = 'code'; // Field to display entity code (optional)
|
|
21
|
+
translationPrefix = 'crmx.business';
|
|
22
|
+
visibleChange = new EventEmitter();
|
|
23
|
+
onComplete = new EventEmitter();
|
|
24
|
+
deleteStatuses = [];
|
|
25
|
+
isProcessing = false;
|
|
26
|
+
isCompleted = false;
|
|
27
|
+
currentIndex = 0;
|
|
28
|
+
successCount = 0;
|
|
29
|
+
errorCount = 0;
|
|
30
|
+
constructor(translationService) {
|
|
31
|
+
this.translationService = translationService;
|
|
32
|
+
}
|
|
33
|
+
t(key, params) {
|
|
34
|
+
if (this.translationService) {
|
|
35
|
+
const fullKey = `${this.translationPrefix}.${key}`;
|
|
36
|
+
const translated = this.translationService.translate(fullKey, params);
|
|
37
|
+
// Se params foi fornecido e a tradução contém placeholders, fazer replace manual
|
|
38
|
+
if (params && translated.includes('{{')) {
|
|
39
|
+
return Object.keys(params).reduce((text, key) => {
|
|
40
|
+
return text.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), params[key]);
|
|
41
|
+
}, translated);
|
|
42
|
+
}
|
|
43
|
+
return translated;
|
|
44
|
+
}
|
|
45
|
+
return key;
|
|
46
|
+
}
|
|
47
|
+
ngOnChanges() {
|
|
48
|
+
if (this.visible && this.stages.length > 0) {
|
|
49
|
+
this.initializeStatuses();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
initializeStatuses() {
|
|
53
|
+
this.deleteStatuses = this.stages.map(entity => ({
|
|
54
|
+
entity,
|
|
55
|
+
status: 'pending'
|
|
56
|
+
}));
|
|
57
|
+
this.isProcessing = false;
|
|
58
|
+
this.isCompleted = false;
|
|
59
|
+
this.currentIndex = 0;
|
|
60
|
+
this.successCount = 0;
|
|
61
|
+
this.errorCount = 0;
|
|
62
|
+
}
|
|
63
|
+
get progress() {
|
|
64
|
+
if (this.deleteStatuses.length === 0)
|
|
65
|
+
return 0;
|
|
66
|
+
return Math.round((this.currentIndex / this.deleteStatuses.length) * 100);
|
|
67
|
+
}
|
|
68
|
+
get canClose() {
|
|
69
|
+
return !this.isProcessing || this.isCompleted;
|
|
70
|
+
}
|
|
71
|
+
startDeletion() {
|
|
72
|
+
if (!this.service) {
|
|
73
|
+
console.error('Service not provided to BulkDeleteDialogComponent');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.isProcessing = true;
|
|
77
|
+
this.isCompleted = false;
|
|
78
|
+
// Process deletions sequentially
|
|
79
|
+
from(this.deleteStatuses)
|
|
80
|
+
.pipe(concatMap((deleteStatus, index) => {
|
|
81
|
+
this.currentIndex = index;
|
|
82
|
+
deleteStatus.status = 'processing';
|
|
83
|
+
return this.service.delete(deleteStatus.entity.id).pipe(concatMap(() => {
|
|
84
|
+
deleteStatus.status = 'success';
|
|
85
|
+
this.successCount++;
|
|
86
|
+
return of(null);
|
|
87
|
+
}), catchError((error) => {
|
|
88
|
+
// Check if it's actually a success (204 No Content)
|
|
89
|
+
if (error?.status === 204) {
|
|
90
|
+
deleteStatus.status = 'success';
|
|
91
|
+
this.successCount++;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
deleteStatus.status = 'error';
|
|
95
|
+
deleteStatus.errorMessage = error?.message || error?.statusText || this.t('bulk_delete_error_generic');
|
|
96
|
+
this.errorCount++;
|
|
97
|
+
}
|
|
98
|
+
return of(null);
|
|
99
|
+
}));
|
|
100
|
+
}))
|
|
101
|
+
.subscribe({
|
|
102
|
+
complete: () => {
|
|
103
|
+
this.currentIndex = this.deleteStatuses.length;
|
|
104
|
+
this.isCompleted = true;
|
|
105
|
+
this.isProcessing = false;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
onHide() {
|
|
110
|
+
if (!this.canClose)
|
|
111
|
+
return;
|
|
112
|
+
this.visible = false;
|
|
113
|
+
this.visibleChange.emit(false);
|
|
114
|
+
if (this.isCompleted && this.successCount > 0) {
|
|
115
|
+
this.onComplete.emit();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
onClose() {
|
|
119
|
+
this.onHide();
|
|
120
|
+
}
|
|
121
|
+
getStatusSeverity(status) {
|
|
122
|
+
switch (status) {
|
|
123
|
+
case 'pending': return 'secondary';
|
|
124
|
+
case 'processing': return 'info';
|
|
125
|
+
case 'success': return 'success';
|
|
126
|
+
case 'error': return 'danger';
|
|
127
|
+
default: return 'secondary';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
getStatusLabel(status) {
|
|
131
|
+
return this.t(`bulk_delete_status_${status}`);
|
|
132
|
+
}
|
|
133
|
+
getStatusIcon(status) {
|
|
134
|
+
switch (status) {
|
|
135
|
+
case 'pending': return 'pi pi-clock';
|
|
136
|
+
case 'processing': return 'pi pi-spin pi-spinner';
|
|
137
|
+
case 'success': return 'pi pi-check';
|
|
138
|
+
case 'error': return 'pi pi-times';
|
|
139
|
+
default: return 'pi pi-question';
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, deps: [{ token: 'TranslationService', optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BulkDeleteDialogComponent, isStandalone: true, selector: "sia-bulk-delete-dialog", inputs: { visible: "visible", stages: "stages", service: "service", entityNameField: "entityNameField", entityCodeField: "entityCodeField", translationPrefix: "translationPrefix" }, outputs: { visibleChange: "visibleChange", onComplete: "onComplete" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ t('bulk_delete_title') }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"t('bulk_delete_warning', { count: stages.length })\"></span>\n </p>\n <p class=\"summary-description\">\n {{ t('bulk_delete_description') }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ t('bulk_delete_progress') }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ t('bulk_delete_success_count') }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ t('bulk_delete_error_count') }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ t('bulk_delete_code_label') }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ t('bulk_delete_success_message') }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ t('bulk_delete_completed_with_errors', { count: errorCount }) }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"t('cancel')\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"t('bulk_delete_confirm')\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"t('close')\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i4.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i5.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }] });
|
|
144
|
+
}
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, decorators: [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'sia-bulk-delete-dialog', standalone: true, imports: [
|
|
148
|
+
CommonModule,
|
|
149
|
+
DialogModule,
|
|
150
|
+
ButtonModule,
|
|
151
|
+
ProgressBarModule,
|
|
152
|
+
TagModule
|
|
153
|
+
], template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ t('bulk_delete_title') }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"t('bulk_delete_warning', { count: stages.length })\"></span>\n </p>\n <p class=\"summary-description\">\n {{ t('bulk_delete_description') }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ t('bulk_delete_progress') }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ t('bulk_delete_success_count') }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ t('bulk_delete_error_count') }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ t('bulk_delete_code_label') }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ t('bulk_delete_success_message') }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ t('bulk_delete_completed_with_errors', { count: errorCount }) }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"t('cancel')\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"t('bulk_delete_confirm')\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"t('close')\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"] }]
|
|
154
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
155
|
+
type: Optional
|
|
156
|
+
}, {
|
|
157
|
+
type: Inject,
|
|
158
|
+
args: ['TranslationService']
|
|
159
|
+
}] }], propDecorators: { visible: [{
|
|
160
|
+
type: Input
|
|
161
|
+
}], stages: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], service: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], entityNameField: [{
|
|
166
|
+
type: Input
|
|
167
|
+
}], entityCodeField: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], translationPrefix: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], visibleChange: [{
|
|
172
|
+
type: Output
|
|
173
|
+
}], onComplete: [{
|
|
174
|
+
type: Output
|
|
175
|
+
}] } });
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2J1bGstZGVsZXRlLWRpYWxvZy9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvYnVsay1kZWxldGUtZGlhbG9nL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBK0JuRSxNQUFNLE9BQU8seUJBQXlCO0lBaUIwQjtJQWhCckQsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixNQUFNLEdBQVUsRUFBRSxDQUFDLENBQUMsbUJBQW1CO0lBQ3ZDLE9BQU8sQ0FBaUIsQ0FBQyxrQkFBa0I7SUFDM0MsZUFBZSxHQUFXLE1BQU0sQ0FBQyxDQUFDLCtCQUErQjtJQUNqRSxlQUFlLEdBQVcsTUFBTSxDQUFDLENB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Q0FBQyxNQUFjO1FBQzFCLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sYUFBYSxDQUFDO1lBQ3JDLEtBQUssWUFBWSxDQUFDLENBQUMsT0FBTyx1QkFBdUIsQ0FBQztZQUNsRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sYUFBYSxDQUFDO1lBQ3JDLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxhQUFhLENBQUM7WUFDbkMsT0FBTyxDQUFDLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQzt3R0FuSlUseUJBQXlCLGtCQWlCSixvQkFBb0I7NEZBakJ6Qyx5QkFBeUIsb1dDckN0QyxxakpBMklBLDhySUQvR0ksWUFBWSw4QkFDWixZQUFZLDBnQ0FDWixZQUFZLGliQUNaLGlCQUFpQix3T0FDakIsU0FBUzs7NEZBS0EseUJBQXlCO2tCQWJyQyxTQUFTOytCQUNFLHdCQUF3QixjQUN0QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixTQUFTO3FCQUNWOzswQkFxQlksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxvQkFBb0I7eUNBaEIzQyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBPbkNoYW5nZXMsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IHsgVGFnTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWcnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBmcm9tLCBvZiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbnRlcmZhY2UgRGVsZXRlU3RhdHVzIHtcbiAgZW50aXR5OiBhbnk7XG4gIHN0YXR1czogJ3BlbmRpbmcnIHwgJ3Byb2Nlc3NpbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2Vycm9yJztcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vLyBJbnRlcmZhY2UgcGFyYSBvIHNlcnZpw6dvIGRlIGVudGlkYWRlIChkdWNrIHR5cGluZylcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2VydmljZSB7XG4gIGRlbGV0ZShpZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG4vLyBJbnRlcmZhY2UgcGFyYSBvIHNlcnZpw6dvIGRlIHRyYWR1w6fDo28gKGR1Y2sgdHlwaW5nKVxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvblNlcnZpY2Uge1xuICB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIHBhcmFtcz86IGFueSk6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2lhLWJ1bGstZGVsZXRlLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRGlhbG9nTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBUYWdNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEJ1bGtEZWxldGVEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0YWdlczogYW55W10gPSBbXTsgLy8gR2VuZXJpYyBlbnRpdGllc1xuICBASW5wdXQoKSBzZXJ2aWNlITogRW50aXR5U2VydmljZTsgLy8gR2VuZXJpYyBzZXJ2aWNlXG4gIEBJbnB1dCgpIGVudGl0eU5hbWVGaWVsZDogc3RyaW5nID0gJ25hbWUnOyAvLyBGaWVsZCB0byBkaXNwbGF5IGVudGl0eSBuYW1lXG4gIEBJbnB1dCgpIGVudGl0eUNvZGVGaWVsZDogc3RyaW5nID0gJ2NvZGUnOyAvLyBGaWVsZCB0byBkaXNwbGF5IGVudGl0eSBjb2RlIChvcHRpb25hbClcbiAgQElucHV0KCkgdHJhbnNsYXRpb25QcmVmaXg6IHN0cmluZyA9ICdjcm14LmJ1c2luZXNzJztcbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGRlbGV0ZVN0YXR1c2VzOiBEZWxldGVTdGF0dXNbXSA9IFtdO1xuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudEluZGV4OiBudW1iZXIgPSAwO1xuICBzdWNjZXNzQ291bnQ6IG51bWJlciA9IDA7XG4gIGVycm9yQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdCgnVHJhbnNsYXRpb25TZXJ2aWNlJykgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U/OiBUcmFuc2xhdGlvblNlcnZpY2UpIHt9XG5cbiAgdChrZXk6IHN0cmluZywgcGFyYW1zPzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50cmFuc2xhdGlvblNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IGZ1bGxLZXkgPSBgJHt0aGlzLnRyYW5zbGF0aW9uUHJlZml4fS4ke2tleX1gO1xuICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShmdWxsS2V5LCBwYXJhbXMpO1xuICAgICAgXG4gICAgICAvLyBTZSBwYXJhbXMgZm9pIGZvcm5lY2lkbyBlIGEgdHJhZHXDp8OjbyBjb250w6ltIHBsYWNlaG9sZGVycywgZmF6ZXIgcmVwbGFjZSBtYW51YWxcbiAgICAgIGlmIChwYXJhbXMgJiYgdHJhbnNsYXRlZC5pbmNsdWRlcygne3snKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocGFyYW1zKS5yZWR1Y2UoKHRleHQsIGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHtcXFxceyR7a2V5fVxcXFx9XFxcXH1gLCAnZycpLCBwYXJhbXNba2V5XSk7XG4gICAgICAgIH0sIHRyYW5zbGF0ZWQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpc2libGUgJiYgdGhpcy5zdGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplU3RhdHVzZXMoKTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplU3RhdHVzZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVTdGF0dXNlcyA9IHRoaXMuc3RhZ2VzLm1hcChlbnRpdHkgPT4gKHtcbiAgICAgIGVudGl0eSxcbiAgICAgIHN0YXR1czogJ3BlbmRpbmcnXG4gICAgfSkpO1xuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLnN1Y2Nlc3NDb3VudCA9IDA7XG4gICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgfVxuXG4gIGdldCBwcm9ncmVzcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmRlbGV0ZVN0YXR1c2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuY3VycmVudEluZGV4IC8gdGhpcy5kZWxldGVTdGF0dXNlcy5sZW5ndGgpICogMTAwKTtcbiAgfVxuXG4gIGdldCBjYW5DbG9zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNQcm9jZXNzaW5nIHx8IHRoaXMuaXNDb21wbGV0ZWQ7XG4gIH1cblxuICBzdGFydERlbGV0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXJ2aWNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTZXJ2aWNlIG5vdCBwcm92aWRlZCB0byBCdWxrRGVsZXRlRGlhbG9nQ29tcG9uZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFByb2Nlc3MgZGVsZXRpb25zIHNlcXVlbnRpYWxseVxuICAgIGZyb20odGhpcy5kZWxldGVTdGF0dXNlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKGRlbGV0ZVN0YXR1cywgaW5kZXgpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGRlbGV0ZVN0YXR1cy5zdGF0dXMgPSAncHJvY2Vzc2luZyc7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kZWxldGUoZGVsZXRlU3RhdHVzLmVudGl0eS5pZCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgIGRlbGV0ZVN0YXR1cy5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0NvdW50Kys7XG4gICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFjdHVhbGx5IGEgc3VjY2VzcyAoMjA0IE5vIENvbnRlbnQpXG4gICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSAyMDQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVTdGF0dXMuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0NvdW50Kys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzLnN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzLmVycm9yTWVzc2FnZSA9IGVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5zdGF0dXNUZXh0IHx8IHRoaXMudCgnYnVsa19kZWxldGVfZXJyb3JfZ2VuZXJpYycpO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuZGVsZXRlU3RhdHVzZXMubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25IaWRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5DbG9zZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCAmJiB0aGlzLnN1Y2Nlc3NDb3VudCA+IDApIHtcbiAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uSGlkZSgpO1xuICB9XG5cbiAgZ2V0U3RhdHVzU2V2ZXJpdHkoc3RhdHVzOiBzdHJpbmcpOiAnc2Vjb25kYXJ5JyB8ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICdkYW5nZXInIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAncGVuZGluZyc6IHJldHVybiAnc2Vjb25kYXJ5JztcbiAgICAgIGNhc2UgJ3Byb2Nlc3NpbmcnOiByZXR1cm4gJ2luZm8nO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnZGFuZ2VyJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnc2Vjb25kYXJ5JztcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudChgYnVsa19kZWxldGVfc3RhdHVzXyR7c3RhdHVzfWApO1xuICB9XG5cbiAgZ2V0U3RhdHVzSWNvbihzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3BlbmRpbmcnOiByZXR1cm4gJ3BpIHBpLWNsb2NrJztcbiAgICAgIGNhc2UgJ3Byb2Nlc3NpbmcnOiByZXR1cm4gJ3BpIHBpLXNwaW4gcGktc3Bpbm5lcic7XG4gICAgICBjYXNlICdzdWNjZXNzJzogcmV0dXJuICdwaSBwaS1jaGVjayc7XG4gICAgICBjYXNlICdlcnJvcic6IHJldHVybiAncGkgcGktdGltZXMnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdwaSBwaS1xdWVzdGlvbic7XG4gICAgfVxuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbY2xvc2FibGVdPVwiY2FuQ2xvc2VcIlxuICBbY2xvc2VPbkVzY2FwZV09XCJjYW5DbG9zZVwiXG4gIFtkaXNtaXNzYWJsZU1hc2tdPVwiZmFsc2VcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzcwMHB4JywgbWF4V2lkdGg6ICc5MHZ3JyB9XCJcbiAgKG9uSGlkZSk9XCJvbkhpZGUoKVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlclwiPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS10cmFzaCBoZWFkZXItaWNvblwiPjwvaT5cbiAgICAgIDxoMj57eyB0KCdidWxrX2RlbGV0ZV90aXRsZScpIH19PC9oMj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj5cbiAgICA8IS0tIFN1bW1hcnkgLS0+XG4gICAgQGlmICghaXNQcm9jZXNzaW5nICYmICFpc0NvbXBsZXRlZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktc2VjdGlvblwiPlxuICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUgd2FybmluZy1pY29uXCI+PC9pPlxuICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwidCgnYnVsa19kZWxldGVfd2FybmluZycsIHsgY291bnQ6IHN0YWdlcy5sZW5ndGggfSlcIj48L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAge3sgdCgnYnVsa19kZWxldGVfZGVzY3JpcHRpb24nKSB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIFByb2dyZXNzIEJhciAtLT5cbiAgICBAaWYgKGlzUHJvY2Vzc2luZyB8fCBpc0NvbXBsZXRlZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWluZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2dyZXNzLWxhYmVsXCI+e3sgdCgnYnVsa19kZWxldGVfcHJvZ3Jlc3MnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2dyZXNzLWNvdW50XCI+e3sgY3VycmVudEluZGV4IH19IC8ge3sgZGVsZXRlU3RhdHVzZXMubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtcHJvZ3Jlc3NCYXIgXG4gICAgICAgICAgW3ZhbHVlXT1cInByb2dyZXNzXCIgXG4gICAgICAgICAgW3Nob3dWYWx1ZV09XCJmYWxzZVwiXG4gICAgICAgICAgc3R5bGVDbGFzcz1cImN1c3RvbS1wcm9ncmVzc1wiXG4gICAgICAgID48L3AtcHJvZ3Jlc3NCYXI+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3Mtc3RhdHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdCBzdWNjZXNzXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZWNrLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHN1Y2Nlc3NDb3VudCB9fSB7eyB0KCdidWxrX2RlbGV0ZV9zdWNjZXNzX2NvdW50JykgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChlcnJvckNvdW50ID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQgZXJyb3JcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS10aW1lcy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGVycm9yQ291bnQgfX0ge3sgdCgnYnVsa19kZWxldGVfZXJyb3JfY291bnQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIFN0YXR1cyBMaXN0IC0tPlxuICAgIEBpZiAoaXNQcm9jZXNzaW5nIHx8IGlzQ29tcGxldGVkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWxpc3RcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBkZWxldGVTdGF0dXNlczsgdHJhY2sgaXRlbS5lbnRpdHkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5mb1wiPlxuICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiZ2V0U3RhdHVzSWNvbihpdGVtLnN0YXR1cylcIiBjbGFzcz1cInN0YXR1cy1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YWdlLW5hbWVcIj57eyBpdGVtLmVudGl0eVtlbnRpdHlOYW1lRmllbGRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5lbnRpdHlbZW50aXR5Q29kZUZpZWxkXSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFnZS1jb2RlXCI+e3sgdCgnYnVsa19kZWxldGVfY29kZV9sYWJlbCcpIH19OiB7eyBpdGVtLmVudGl0eVtlbnRpdHlDb2RlRmllbGRdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtYmFkZ2VcIj5cbiAgICAgICAgICAgICAgPHAtdGFnIFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRTdGF0dXNMYWJlbChpdGVtLnN0YXR1cylcIiBcbiAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwiZ2V0U3RhdHVzU2V2ZXJpdHkoaXRlbS5zdGF0dXMpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5zdGF0dXMgPT09ICdwcm9jZXNzaW5nJykge1xuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zcGluIHBpLXNwaW5uZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3AtdGFnPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0uc3RhdHVzID09PSAnZXJyb3InICYmIGl0ZW0uZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5lcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBDb21wbGV0aW9uIE1lc3NhZ2UgLS0+XG4gICAgQGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRpb24tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGlvbi1tZXNzYWdlXCIgW2NsYXNzLmhhcy1lcnJvcnNdPVwiZXJyb3JDb3VudCA+IDBcIj5cbiAgICAgICAgICA8aSBbY2xhc3NdPVwiZXJyb3JDb3VudCA+IDAgPyAncGkgcGktZXhjbGFtYXRpb24tY2lyY2xlJyA6ICdwaSBwaS1jaGVjay1jaXJjbGUnXCIgY2xhc3M9XCJjb21wbGV0aW9uLWljb25cIj48L2k+XG4gICAgICAgICAgQGlmIChlcnJvckNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge3sgdCgnYnVsa19kZWxldGVfc3VjY2Vzc19tZXNzYWdlJykgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChlcnJvckNvdW50ID4gMCkge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHt7IHQoJ2J1bGtfZGVsZXRlX2NvbXBsZXRlZF93aXRoX2Vycm9ycycsIHsgY291bnQ6IGVycm9yQ291bnQgfSkgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1mb290ZXJcIj5cbiAgICAgIEBpZiAoIWlzUHJvY2Vzc2luZyAmJiAhaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2NhbmNlbCcpXCJcbiAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBbb3V0bGluZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgICAgPjwvcC1idXR0b24+XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdidWxrX2RlbGV0ZV9jb25maXJtJylcIlxuICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgc2V2ZXJpdHk9XCJkYW5nZXJcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInN0YXJ0RGVsZXRpb24oKVwiXG4gICAgICAgID48L3AtYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwidCgnY2xvc2UnKVwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAob25DbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1kaWFsb2c+XG4iXX0=
|