tango-app-ui-store-builder 1.0.46 → 1.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  2. package/esm2022/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.mjs +183 -0
  3. package/esm2022/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.mjs +211 -0
  4. package/esm2022/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.mjs +422 -0
  5. package/esm2022/lib/components/collection-update-ai/components/store-select/store-select.component.mjs +148 -0
  6. package/esm2022/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.mjs +20 -0
  7. package/esm2022/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.mjs +359 -0
  8. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.mjs +23 -0
  9. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +2524 -0
  10. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.mjs +66 -0
  11. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.mjs +85 -0
  12. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +2039 -0
  13. package/esm2022/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.mjs +433 -0
  14. package/esm2022/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.mjs +76 -0
  15. package/esm2022/lib/components/collection-update-ai/models/find-replace.model.mjs +2 -0
  16. package/esm2022/lib/components/collection-update-ai/services/data.service.mjs +291 -0
  17. package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
  18. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
  19. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
  20. package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
  21. package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
  22. package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
  23. package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
  24. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +33 -4
  25. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
  26. package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +25 -3
  27. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
  28. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
  29. package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
  30. package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
  31. package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
  32. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
  33. package/esm2022/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.mjs +75 -31
  34. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +7 -8
  35. package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +234 -0
  36. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +1110 -0
  37. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +52 -0
  38. package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +36 -10
  39. package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
  40. package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +92 -0
  41. package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +645 -0
  42. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1276 -0
  43. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +33 -15
  44. package/esm2022/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.mjs +41 -35
  45. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
  46. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +19 -12
  47. package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
  48. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
  49. package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
  50. package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
  51. package/esm2022/lib/services/store-builder.service.mjs +49 -1
  52. package/esm2022/lib/tango-store-builder-routing.module.mjs +23 -1
  53. package/esm2022/lib/tango-store-builder.module.mjs +42 -5
  54. package/fesm2022/tango-app-ui-store-builder.mjs +12677 -2064
  55. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  56. package/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.d.ts +51 -0
  57. package/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.d.ts +36 -0
  58. package/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.d.ts +50 -0
  59. package/lib/components/collection-update-ai/components/store-select/store-select.component.d.ts +33 -0
  60. package/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.d.ts +9 -0
  61. package/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.d.ts +58 -0
  62. package/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.d.ts +10 -0
  63. package/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.d.ts +141 -0
  64. package/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.d.ts +18 -0
  65. package/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.d.ts +19 -0
  66. package/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.d.ts +116 -0
  67. package/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.d.ts +63 -0
  68. package/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.d.ts +19 -0
  69. package/lib/components/collection-update-ai/models/find-replace.model.d.ts +55 -0
  70. package/lib/components/collection-update-ai/services/data.service.d.ts +70 -0
  71. package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
  72. package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
  73. package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
  74. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +2 -0
  75. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -2
  76. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
  77. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
  78. package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
  79. package/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.d.ts +8 -2
  80. package/lib/components/planogram/merch-compliance/merch-compliance.component.d.ts +1 -3
  81. package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +47 -0
  82. package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +70 -0
  83. package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +16 -0
  84. package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +13 -3
  85. package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
  86. package/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.d.ts +24 -0
  87. package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +93 -0
  88. package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +97 -0
  89. package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +8 -3
  90. package/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.d.ts +2 -4
  91. package/lib/interfaces/fixture-library.interface.d.ts +1 -1
  92. package/lib/services/store-builder.service.d.ts +25 -0
  93. package/lib/tango-store-builder.module.d.ts +31 -21
  94. package/package.json +1 -1
@@ -0,0 +1,66 @@
1
+ import { Component, inject, ViewChild, Input } from '@angular/core';
2
+ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3
+ import { CommonModule } from '@angular/common';
4
+ import { FormsModule } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/forms";
8
+ export class ApproveCompleteModalComponent {
9
+ activeModal = inject(NgbActiveModal);
10
+ dateInput;
11
+ initialSchedule = false;
12
+ initialScheduleDate = null;
13
+ schedule = false;
14
+ scheduleDate = '';
15
+ ngOnInit() {
16
+ // Pre-fill the schedule value
17
+ this.schedule = this.initialSchedule;
18
+ // Pre-fill the schedule date if it exists
19
+ if (this.initialScheduleDate) {
20
+ // Convert the date to YYYY-MM-DD format if needed
21
+ const date = new Date(this.initialScheduleDate);
22
+ if (!isNaN(date.getTime())) {
23
+ this.scheduleDate = date.toISOString().split('T')[0];
24
+ }
25
+ }
26
+ }
27
+ get minDate() {
28
+ const today = new Date();
29
+ return today.toISOString().split('T')[0];
30
+ }
31
+ openDatePicker(event) {
32
+ const input = event.target;
33
+ if (input && 'showPicker' in input && typeof input.showPicker === 'function') {
34
+ // Modern browsers support showPicker()
35
+ input.showPicker();
36
+ }
37
+ else {
38
+ // Fallback: focus the input which should trigger the picker
39
+ input.focus();
40
+ input.click();
41
+ }
42
+ }
43
+ onCancel() {
44
+ this.activeModal.dismiss();
45
+ }
46
+ onApproveAndComplete() {
47
+ this.activeModal.close({
48
+ schedule: this.schedule,
49
+ scheduleDate: this.schedule ? this.scheduleDate : null
50
+ });
51
+ }
52
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ApproveCompleteModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ApproveCompleteModalComponent, isStandalone: true, selector: "lib-approve-complete-modal", inputs: { initialSchedule: "initialSchedule", initialScheduleDate: "initialScheduleDate" }, viewQueries: [{ propertyName: "dateInput", first: true, predicate: ["dateInput"], descendants: true }], ngImport: i0, template: "<div class=\"modal-content-custom\">\r\n <!-- Modal Header -->\r\n <div class=\"modal-header-custom\">\r\n <h5 class=\"modal-title\">Approve and complete</h5>\r\n </div>\r\n \r\n <!-- Modal Body -->\r\n <div class=\"modal-body-custom\">\r\n <p class=\"description-text\">The selected stores will be approved, and a rollout task will be sent to them.</p>\r\n <p class=\"description-text\">Choose if you want to schedule the task for later.</p>\r\n \r\n <!-- Schedule Checkbox -->\r\n <div class=\"custom-checkbox\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"schedule\" \r\n [(ngModel)]=\"schedule\">\r\n <label for=\"schedule\" class=\"checkbox-label\">\r\n <div class=\"checkbox-label-text\">Schedule</div>\r\n </label>\r\n </div>\r\n \r\n <!-- Date Picker (shown when schedule is true) -->\r\n <div class=\"date-picker-container\" *ngIf=\"schedule\">\r\n <input \r\n type=\"date\" \r\n class=\"date-input\" \r\n [(ngModel)]=\"scheduleDate\"\r\n [min]=\"minDate\"\r\n (click)=\"openDatePicker($event)\"\r\n #dateInput>\r\n </div>\r\n </div>\r\n \r\n <!-- Modal Footer -->\r\n <div class=\"modal-footer-custom\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary-custom\" (click)=\"onApproveAndComplete()\">Approve & Complete</button>\r\n </div>\r\n</div>\r\n", styles: [".modal-content-custom{background:#fff;border-radius:12px;padding:0;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;border:none;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}.modal-header-custom{padding:24px 16px 0;border-bottom:none}.modal-title{color:#1d2939;font-size:18px;font-weight:600;line-height:28px;margin:0}.modal-body-custom{padding:24px 16px}.description-text{color:#1d2939;font-size:16px;font-weight:500;line-height:24px;margin-bottom:12px}.note-text{color:#1d2939;font-size:16px;font-weight:500;line-height:24px;margin-bottom:16px}.custom-checkbox{display:flex;align-items:flex-start;gap:12px;width:fit-content}.form-check-input{width:16px;height:16px;border:1px solid #d0d5dd;border-radius:4px;cursor:pointer;margin-top:0;flex-shrink:0}.form-check-input:checked{background-color:#00a3ff;border-color:#00a3ff}.form-check-input:focus{box-shadow:0 0 0 .2rem #00a3ff40}.checkbox-label{flex:1;cursor:pointer}.checkbox-label-text{color:#344054;font-size:16px;font-weight:500;line-height:24px;margin-bottom:2px}.checkbox-supporting-text{color:#667085;font-size:16px;font-weight:400;line-height:24px;margin:0}.date-picker-container{margin-top:16px;margin-left:28px}.date-input{width:auto;max-width:200px;padding:8px 12px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;font-weight:400;line-height:20px;color:#1d2939;background:#fff;cursor:pointer;transition:all .2s}.date-input:focus{outline:none;border-color:#00a3ff;box-shadow:0 0 0 .2rem #00a3ff40}.date-input:hover{border-color:#98a2b3}.modal-footer-custom{border-top:none;padding:0 16px 24px;display:flex;justify-content:flex-end;gap:12px}.btn-cancel{background:#fff;color:#344054;border:1px solid #d0d5dd;border-radius:8px;padding:10px 18px;font-size:16px;font-weight:600;line-height:24px;text-transform:capitalize;box-shadow:0 1px 2px #1018280d;cursor:pointer;transition:all .2s}.btn-cancel:hover{background-color:#f9fafb;border-color:#d0d5dd;color:#344054}.btn-primary-custom{background:#00a3ff;color:#fff;border:1px solid #00a3ff;border-radius:8px;padding:10px 18px;font-size:16px;font-weight:600;line-height:24px;text-transform:capitalize;box-shadow:0 1px 2px #1018280d;cursor:pointer;transition:all .2s}.btn-primary-custom:hover{background:#0090e0;border-color:#0090e0;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ApproveCompleteModalComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'lib-approve-complete-modal', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"modal-content-custom\">\r\n <!-- Modal Header -->\r\n <div class=\"modal-header-custom\">\r\n <h5 class=\"modal-title\">Approve and complete</h5>\r\n </div>\r\n \r\n <!-- Modal Body -->\r\n <div class=\"modal-body-custom\">\r\n <p class=\"description-text\">The selected stores will be approved, and a rollout task will be sent to them.</p>\r\n <p class=\"description-text\">Choose if you want to schedule the task for later.</p>\r\n \r\n <!-- Schedule Checkbox -->\r\n <div class=\"custom-checkbox\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n id=\"schedule\" \r\n [(ngModel)]=\"schedule\">\r\n <label for=\"schedule\" class=\"checkbox-label\">\r\n <div class=\"checkbox-label-text\">Schedule</div>\r\n </label>\r\n </div>\r\n \r\n <!-- Date Picker (shown when schedule is true) -->\r\n <div class=\"date-picker-container\" *ngIf=\"schedule\">\r\n <input \r\n type=\"date\" \r\n class=\"date-input\" \r\n [(ngModel)]=\"scheduleDate\"\r\n [min]=\"minDate\"\r\n (click)=\"openDatePicker($event)\"\r\n #dateInput>\r\n </div>\r\n </div>\r\n \r\n <!-- Modal Footer -->\r\n <div class=\"modal-footer-custom\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary-custom\" (click)=\"onApproveAndComplete()\">Approve & Complete</button>\r\n </div>\r\n</div>\r\n", styles: [".modal-content-custom{background:#fff;border-radius:12px;padding:0;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;border:none;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}.modal-header-custom{padding:24px 16px 0;border-bottom:none}.modal-title{color:#1d2939;font-size:18px;font-weight:600;line-height:28px;margin:0}.modal-body-custom{padding:24px 16px}.description-text{color:#1d2939;font-size:16px;font-weight:500;line-height:24px;margin-bottom:12px}.note-text{color:#1d2939;font-size:16px;font-weight:500;line-height:24px;margin-bottom:16px}.custom-checkbox{display:flex;align-items:flex-start;gap:12px;width:fit-content}.form-check-input{width:16px;height:16px;border:1px solid #d0d5dd;border-radius:4px;cursor:pointer;margin-top:0;flex-shrink:0}.form-check-input:checked{background-color:#00a3ff;border-color:#00a3ff}.form-check-input:focus{box-shadow:0 0 0 .2rem #00a3ff40}.checkbox-label{flex:1;cursor:pointer}.checkbox-label-text{color:#344054;font-size:16px;font-weight:500;line-height:24px;margin-bottom:2px}.checkbox-supporting-text{color:#667085;font-size:16px;font-weight:400;line-height:24px;margin:0}.date-picker-container{margin-top:16px;margin-left:28px}.date-input{width:auto;max-width:200px;padding:8px 12px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;font-weight:400;line-height:20px;color:#1d2939;background:#fff;cursor:pointer;transition:all .2s}.date-input:focus{outline:none;border-color:#00a3ff;box-shadow:0 0 0 .2rem #00a3ff40}.date-input:hover{border-color:#98a2b3}.modal-footer-custom{border-top:none;padding:0 16px 24px;display:flex;justify-content:flex-end;gap:12px}.btn-cancel{background:#fff;color:#344054;border:1px solid #d0d5dd;border-radius:8px;padding:10px 18px;font-size:16px;font-weight:600;line-height:24px;text-transform:capitalize;box-shadow:0 1px 2px #1018280d;cursor:pointer;transition:all .2s}.btn-cancel:hover{background-color:#f9fafb;border-color:#d0d5dd;color:#344054}.btn-primary-custom{background:#00a3ff;color:#fff;border:1px solid #00a3ff;border-radius:8px;padding:10px 18px;font-size:16px;font-weight:600;line-height:24px;text-transform:capitalize;box-shadow:0 1px 2px #1018280d;cursor:pointer;transition:all .2s}.btn-primary-custom:hover{background:#0090e0;border-color:#0090e0;color:#fff}\n"] }]
58
+ }], propDecorators: { dateInput: [{
59
+ type: ViewChild,
60
+ args: ['dateInput']
61
+ }], initialSchedule: [{
62
+ type: Input
63
+ }], initialScheduleDate: [{
64
+ type: Input
65
+ }] } });
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcm92ZS1jb21wbGV0ZS1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9maW5kLXJlcGxhY2UtbGF5b3V0L3Jldmlldy1yZXBsYWNlL2FwcHJvdmUtY29tcGxldGUtbW9kYWwvYXBwcm92ZS1jb21wbGV0ZS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9maW5kLXJlcGxhY2UtbGF5b3V0L3Jldmlldy1yZXBsYWNlL2FwcHJvdmUtY29tcGxldGUtbW9kYWwvYXBwcm92ZS1jb21wbGV0ZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBUzdDLE1BQU0sT0FBTyw2QkFBNkI7SUFDeEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUViLFNBQVMsQ0FBZ0M7SUFFeEQsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxtQkFBbUIsR0FBa0IsSUFBSSxDQUFDO0lBRW5ELFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUUxQixRQUFRO1FBQ04sOEJBQThCO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVyQywwQ0FBMEM7UUFDMUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsa0RBQWtEO1lBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RDtTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWTtRQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUMvQyxJQUFJLEtBQUssSUFBSSxZQUFZLElBQUksS0FBSyxJQUFJLE9BQVEsS0FBYSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7WUFDckYsdUNBQXVDO1lBQ3RDLEtBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUM3QjthQUFNO1lBQ0wsNERBQTREO1lBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ3ZELENBQUMsQ0FBQztJQUNMLENBQUM7d0dBbkRVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLDBSQ1oxQywwckRBeUNBLG8xRURqQ1ksWUFBWSxrSUFBRSxXQUFXOzs0RkFJeEIsNkJBQTZCO2tCQVB6QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDOzhCQU9aLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFFYixlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXBwcm92ZS1jb21wbGV0ZS1tb2RhbCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcHJvdmUtY29tcGxldGUtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hcHByb3ZlLWNvbXBsZXRlLW1vZGFsLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwcm92ZUNvbXBsZXRlTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGFjdGl2ZU1vZGFsID0gaW5qZWN0KE5nYkFjdGl2ZU1vZGFsKTtcclxuICBcclxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnKSBkYXRlSW5wdXQhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIFxyXG4gIEBJbnB1dCgpIGluaXRpYWxTY2hlZHVsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGluaXRpYWxTY2hlZHVsZURhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIHNjaGVkdWxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2NoZWR1bGVEYXRlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBQcmUtZmlsbCB0aGUgc2NoZWR1bGUgdmFsdWVcclxuICAgIHRoaXMuc2NoZWR1bGUgPSB0aGlzLmluaXRpYWxTY2hlZHVsZTtcclxuICAgIFxyXG4gICAgLy8gUHJlLWZpbGwgdGhlIHNjaGVkdWxlIGRhdGUgaWYgaXQgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5pbml0aWFsU2NoZWR1bGVEYXRlKSB7XHJcbiAgICAgIC8vIENvbnZlcnQgdGhlIGRhdGUgdG8gWVlZWS1NTS1ERCBmb3JtYXQgaWYgbmVlZGVkXHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmluaXRpYWxTY2hlZHVsZURhdGUpO1xyXG4gICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVEYXRlID0gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtaW5EYXRlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICByZXR1cm4gdG9kYXkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRhdGVQaWNrZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0ICYmICdzaG93UGlja2VyJyBpbiBpbnB1dCAmJiB0eXBlb2YgKGlucHV0IGFzIGFueSkuc2hvd1BpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgc3VwcG9ydCBzaG93UGlja2VyKClcclxuICAgICAgKGlucHV0IGFzIGFueSkuc2hvd1BpY2tlcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRmFsbGJhY2s6IGZvY3VzIHRoZSBpbnB1dCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgcGlja2VyXHJcbiAgICAgIGlucHV0LmZvY3VzKCk7XHJcbiAgICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuZGlzbWlzcygpO1xyXG4gIH1cclxuXHJcbiAgb25BcHByb3ZlQW5kQ29tcGxldGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHsgXHJcbiAgICAgIHNjaGVkdWxlOiB0aGlzLnNjaGVkdWxlLCBcclxuICAgICAgc2NoZWR1bGVEYXRlOiB0aGlzLnNjaGVkdWxlID8gdGhpcy5zY2hlZHVsZURhdGUgOiBudWxsIFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50LWN1c3RvbVwiPlxyXG4gICAgPCEtLSBNb2RhbCBIZWFkZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyLWN1c3RvbVwiPlxyXG4gICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QXBwcm92ZSBhbmQgY29tcGxldGU8L2g1PlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDwhLS0gTW9kYWwgQm9keSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5LWN1c3RvbVwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiZGVzY3JpcHRpb24tdGV4dFwiPlRoZSBzZWxlY3RlZCBzdG9yZXMgd2lsbCBiZSBhcHByb3ZlZCwgYW5kIGEgcm9sbG91dCB0YXNrIHdpbGwgYmUgc2VudCB0byB0aGVtLjwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImRlc2NyaXB0aW9uLXRleHRcIj5DaG9vc2UgaWYgeW91IHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRhc2sgZm9yIGxhdGVyLjwvcD5cclxuICAgICAgICBcclxuICAgICAgICA8IS0tIFNjaGVkdWxlIENoZWNrYm94IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2NoZWR1bGVcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2NoZWR1bGVcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNjaGVkdWxlXCIgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXRleHRcIj5TY2hlZHVsZTwvZGl2PlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgIDwhLS0gRGF0ZSBQaWNrZXIgKHNob3duIHdoZW4gc2NoZWR1bGUgaXMgdHJ1ZSkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNvbnRhaW5lclwiICpuZ0lmPVwic2NoZWR1bGVcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImRhdGVcIiBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZS1pbnB1dFwiIFxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzY2hlZHVsZURhdGVcIlxyXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRGF0ZVBpY2tlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICNkYXRlSW5wdXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPCEtLSBNb2RhbCBGb290ZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyLWN1c3RvbVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeS1jdXN0b21cIiAoY2xpY2spPVwib25BcHByb3ZlQW5kQ29tcGxldGUoKVwiPkFwcHJvdmUgJiBDb21wbGV0ZTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,85 @@
1
+ import { Component, inject, Input } from '@angular/core';
2
+ import { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap';
3
+ import { CommonModule } from '@angular/common';
4
+ import { StoreFixtureComponent } from '../../../components/store-fixture/store-fixture.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class FixtureBeforeAfterComponent {
8
+ activeOffcanvas = inject(NgbActiveOffcanvas);
9
+ selectedFixtureData = null;
10
+ originalFixtureData = null;
11
+ ngOnInit() {
12
+ // Ensure data is properly initialized
13
+ this.ensureFixtureDataStructure(this.selectedFixtureData);
14
+ this.ensureFixtureDataStructure(this.originalFixtureData);
15
+ }
16
+ ngOnChanges(changes) {
17
+ if (changes['selectedFixtureData']?.currentValue) {
18
+ this.ensureFixtureDataStructure(changes['selectedFixtureData'].currentValue);
19
+ }
20
+ if (changes['originalFixtureData']?.currentValue) {
21
+ this.ensureFixtureDataStructure(changes['originalFixtureData'].currentValue);
22
+ }
23
+ }
24
+ ensureFixtureDataStructure(fixture) {
25
+ if (!fixture)
26
+ return;
27
+ // Ensure vmConfig is an array
28
+ if (!Array.isArray(fixture.vmConfig)) {
29
+ fixture.vmConfig = [];
30
+ }
31
+ // Ensure shelfConfig is an array
32
+ if (!Array.isArray(fixture.shelfConfig)) {
33
+ fixture.shelfConfig = [];
34
+ }
35
+ }
36
+ getCurrentFixtureData() {
37
+ return this.selectedFixtureData || this.originalFixtureData;
38
+ }
39
+ getFixtureLabel() {
40
+ const fixture = this.getCurrentFixtureData();
41
+ return fixture?.header?.label || '';
42
+ }
43
+ getFixtureCategory() {
44
+ const fixture = this.getCurrentFixtureData();
45
+ return fixture?.fixtureCategory || '';
46
+ }
47
+ getFixtureWidth() {
48
+ const fixture = this.getCurrentFixtureData();
49
+ if (!fixture?.fixtureWidth)
50
+ return '';
51
+ const width = fixture.fixtureWidth.value;
52
+ const unit = fixture.fixtureWidth.unit || 'mm';
53
+ let dimensionStr = `${width}${unit}`;
54
+ // Convert to feet if needed (1200mm = 4ft)
55
+ if (unit === 'mm' && width === 1200) {
56
+ dimensionStr = `${width}${unit}/4ft`;
57
+ }
58
+ else if (unit === 'mm' && width > 0) {
59
+ const feet = Math.round(width / 300);
60
+ if (feet > 0) {
61
+ dimensionStr = `${width}${unit}/${feet}ft`;
62
+ }
63
+ }
64
+ return dimensionStr;
65
+ }
66
+ getShelfCount() {
67
+ const fixture = this.getCurrentFixtureData();
68
+ return fixture?.shelfConfig?.length || 0;
69
+ }
70
+ getFixtureCapacity() {
71
+ const fixture = this.getCurrentFixtureData();
72
+ return fixture?.fixtureCapacity || 0;
73
+ }
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureBeforeAfterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
75
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FixtureBeforeAfterComponent, isStandalone: true, selector: "lib-fixture-before-after", inputs: { selectedFixtureData: "selectedFixtureData", originalFixtureData: "originalFixtureData" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"offcanvas-header d-flex w-100 justify-content-between p-3 align-items-center\">\r\n <div class=\"fixture-preview-header\">\r\n <div class=\"header-card\">\r\n <div class=\"card-content\">\r\n <!-- <div class=\"product-image-container\">\r\n <img \r\n alt=\"Product\" \r\n class=\"product-image\"\r\n />\r\n </div> -->\r\n <div class=\"name\">{{ getFixtureLabel() }}</div>\r\n <div class=\"specs-container\" *ngIf=\"getFixtureCategory() || getFixtureWidth() || getShelfCount() > 0 || getFixtureCapacity() > 0\">\r\n <span class=\"spec-text\" *ngIf=\"getFixtureCategory()\">{{ getFixtureCategory() }}</span>\r\n <div class=\"dot\" *ngIf=\"getFixtureCategory() && (getFixtureWidth() || getShelfCount() > 0 || getFixtureCapacity() > 0)\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getFixtureWidth()\">{{ getFixtureWidth() }}</span>\r\n <div class=\"dot\" *ngIf=\"getFixtureWidth() && (getShelfCount() > 0 || getFixtureCapacity() > 0)\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getShelfCount() > 0\">{{ getShelfCount() }} {{ getShelfCount() === 1 ? 'Shelf' : 'Shelves' }}</span>\r\n <div class=\"dot\" *ngIf=\"getShelfCount() > 0 && getFixtureCapacity() > 0\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getFixtureCapacity() > 0\">{{ getFixtureCapacity() }} Capacity</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"btn-close\" (click)=\"activeOffcanvas.dismiss()\" aria-label=\"Close\"></button>\r\n</div>\r\n\r\n<div class=\"offcanvas-body p-3\">\r\n <div class=\"fixture-preview-content\">\r\n <!-- Show Before/After when replace data exists -->\r\n <div *ngIf=\"originalFixtureData\" class=\"before-after-container\">\r\n <div class=\"before-section\">\r\n <div class=\"section-header\">\r\n <h6 class=\"section-label mb-0\">Before</h6>\r\n </div>\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"originalFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n <div class=\"after-section\">\r\n <div class=\"section-header\">\r\n <h6 class=\"section-label mb-0\">After</h6>\r\n </div>\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"selectedFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Show single fixture when no replace data -->\r\n <div *ngIf=\"!originalFixtureData && selectedFixtureData\" class=\"single-fixture-container\">\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"selectedFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".offcanvas-header{border-bottom:1px solid #e5e7eb;flex-shrink:0;align-items:center}.offcanvas-body{overflow-y:auto;overflow-x:hidden;height:calc(100vh - 60px);-ms-overflow-style:none;scrollbar-width:none}.offcanvas-body::-webkit-scrollbar{display:none}.fixture-preview-header{flex:1}.fixture-preview-header .header-card{background:#f9fafb;border-radius:6.536px;padding:9.804px 6.536px;display:flex;flex-direction:column;align-items:center}.fixture-preview-header .header-card .card-content{display:flex;flex-direction:column;gap:6.536px;align-items:center}.fixture-preview-header .header-card .card-content .product-image-container{width:25.651px;height:25.651px;position:relative;overflow:hidden}.fixture-preview-header .header-card .card-content .product-image-container .product-image{position:absolute;width:300.85%;height:160.87%;left:-100.43%;top:-30.43%;max-width:none;object-fit:cover}.fixture-preview-header .header-card .card-content .name{font-family:Inter,sans-serif;font-weight:600;font-size:16px;line-height:19.608px;color:#101828;text-align:center}.fixture-preview-header .header-card .card-content .specs-container{display:flex;gap:4.664px;align-items:center;flex-wrap:wrap;justify-content:center}.fixture-preview-header .header-card .card-content .specs-container .spec-text{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:16.34px;color:#475467}.fixture-preview-header .header-card .card-content .specs-container .dot{width:2.332px;height:2.332px;background:#98a2b3;border-radius:50%;flex-shrink:0}.fixture-preview-content{width:100%;padding:16px}.fixture-preview-content .before-after-container{display:flex;flex-direction:row;gap:16px;align-items:flex-start}.fixture-preview-content .before-after-container .before-section,.fixture-preview-content .before-after-container .after-section{display:flex;flex-direction:column;flex:1;min-width:0;background:#f9fafb;border-radius:8px;padding:12px}.fixture-preview-content .before-after-container .before-section .section-header,.fixture-preview-content .before-after-container .after-section .section-header{display:flex;align-items:center;justify-content:center;margin-bottom:12px;gap:8px}.fixture-preview-content .before-after-container .before-section .section-header .section-label,.fixture-preview-content .before-after-container .after-section .section-header .section-label{font-size:14px;font-weight:600;color:#1d2939;letter-spacing:.5px;margin:0}.fixture-preview-content .before-after-container .before-section .fixture-wrapper,.fixture-preview-content .before-after-container .after-section .fixture-wrapper,.fixture-preview-content .single-fixture-container .fixture-wrapper{background:#fff;border-radius:4px;padding:8px;box-shadow:0 1px 2px #0000000d}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: StoreFixtureComponent, selector: "lib-store-fixture", inputs: ["fixture", "showColors", "showVMs", "showBCs"] }] });
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureBeforeAfterComponent, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'lib-fixture-before-after', standalone: true, imports: [CommonModule, StoreFixtureComponent], template: "<div class=\"offcanvas-header d-flex w-100 justify-content-between p-3 align-items-center\">\r\n <div class=\"fixture-preview-header\">\r\n <div class=\"header-card\">\r\n <div class=\"card-content\">\r\n <!-- <div class=\"product-image-container\">\r\n <img \r\n alt=\"Product\" \r\n class=\"product-image\"\r\n />\r\n </div> -->\r\n <div class=\"name\">{{ getFixtureLabel() }}</div>\r\n <div class=\"specs-container\" *ngIf=\"getFixtureCategory() || getFixtureWidth() || getShelfCount() > 0 || getFixtureCapacity() > 0\">\r\n <span class=\"spec-text\" *ngIf=\"getFixtureCategory()\">{{ getFixtureCategory() }}</span>\r\n <div class=\"dot\" *ngIf=\"getFixtureCategory() && (getFixtureWidth() || getShelfCount() > 0 || getFixtureCapacity() > 0)\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getFixtureWidth()\">{{ getFixtureWidth() }}</span>\r\n <div class=\"dot\" *ngIf=\"getFixtureWidth() && (getShelfCount() > 0 || getFixtureCapacity() > 0)\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getShelfCount() > 0\">{{ getShelfCount() }} {{ getShelfCount() === 1 ? 'Shelf' : 'Shelves' }}</span>\r\n <div class=\"dot\" *ngIf=\"getShelfCount() > 0 && getFixtureCapacity() > 0\"></div>\r\n <span class=\"spec-text\" *ngIf=\"getFixtureCapacity() > 0\">{{ getFixtureCapacity() }} Capacity</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"btn-close\" (click)=\"activeOffcanvas.dismiss()\" aria-label=\"Close\"></button>\r\n</div>\r\n\r\n<div class=\"offcanvas-body p-3\">\r\n <div class=\"fixture-preview-content\">\r\n <!-- Show Before/After when replace data exists -->\r\n <div *ngIf=\"originalFixtureData\" class=\"before-after-container\">\r\n <div class=\"before-section\">\r\n <div class=\"section-header\">\r\n <h6 class=\"section-label mb-0\">Before</h6>\r\n </div>\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"originalFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n <div class=\"after-section\">\r\n <div class=\"section-header\">\r\n <h6 class=\"section-label mb-0\">After</h6>\r\n </div>\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"selectedFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Show single fixture when no replace data -->\r\n <div *ngIf=\"!originalFixtureData && selectedFixtureData\" class=\"single-fixture-container\">\r\n <div class=\"fixture-wrapper\">\r\n <lib-store-fixture \r\n [fixture]=\"selectedFixtureData\" \r\n [showColors]=\"true\"\r\n [showVMs]=\"true\"\r\n [showBCs]=\"true\">\r\n </lib-store-fixture>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".offcanvas-header{border-bottom:1px solid #e5e7eb;flex-shrink:0;align-items:center}.offcanvas-body{overflow-y:auto;overflow-x:hidden;height:calc(100vh - 60px);-ms-overflow-style:none;scrollbar-width:none}.offcanvas-body::-webkit-scrollbar{display:none}.fixture-preview-header{flex:1}.fixture-preview-header .header-card{background:#f9fafb;border-radius:6.536px;padding:9.804px 6.536px;display:flex;flex-direction:column;align-items:center}.fixture-preview-header .header-card .card-content{display:flex;flex-direction:column;gap:6.536px;align-items:center}.fixture-preview-header .header-card .card-content .product-image-container{width:25.651px;height:25.651px;position:relative;overflow:hidden}.fixture-preview-header .header-card .card-content .product-image-container .product-image{position:absolute;width:300.85%;height:160.87%;left:-100.43%;top:-30.43%;max-width:none;object-fit:cover}.fixture-preview-header .header-card .card-content .name{font-family:Inter,sans-serif;font-weight:600;font-size:16px;line-height:19.608px;color:#101828;text-align:center}.fixture-preview-header .header-card .card-content .specs-container{display:flex;gap:4.664px;align-items:center;flex-wrap:wrap;justify-content:center}.fixture-preview-header .header-card .card-content .specs-container .spec-text{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:16.34px;color:#475467}.fixture-preview-header .header-card .card-content .specs-container .dot{width:2.332px;height:2.332px;background:#98a2b3;border-radius:50%;flex-shrink:0}.fixture-preview-content{width:100%;padding:16px}.fixture-preview-content .before-after-container{display:flex;flex-direction:row;gap:16px;align-items:flex-start}.fixture-preview-content .before-after-container .before-section,.fixture-preview-content .before-after-container .after-section{display:flex;flex-direction:column;flex:1;min-width:0;background:#f9fafb;border-radius:8px;padding:12px}.fixture-preview-content .before-after-container .before-section .section-header,.fixture-preview-content .before-after-container .after-section .section-header{display:flex;align-items:center;justify-content:center;margin-bottom:12px;gap:8px}.fixture-preview-content .before-after-container .before-section .section-header .section-label,.fixture-preview-content .before-after-container .after-section .section-header .section-label{font-size:14px;font-weight:600;color:#1d2939;letter-spacing:.5px;margin:0}.fixture-preview-content .before-after-container .before-section .fixture-wrapper,.fixture-preview-content .before-after-container .after-section .fixture-wrapper,.fixture-preview-content .single-fixture-container .fixture-wrapper{background:#fff;border-radius:4px;padding:8px;box-shadow:0 1px 2px #0000000d}\n"] }]
80
+ }], propDecorators: { selectedFixtureData: [{
81
+ type: Input
82
+ }], originalFixtureData: [{
83
+ type: Input
84
+ }] } });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1iZWZvcmUtYWZ0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY29sbGVjdGlvbi11cGRhdGUtYWkvZmluZC1yZXBsYWNlLWxheW91dC9yZXZpZXctcmVwbGFjZS9maXh0dXJlLWJlZm9yZS1hZnRlci9maXh0dXJlLWJlZm9yZS1hZnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9maW5kLXJlcGxhY2UtbGF5b3V0L3Jldmlldy1yZXBsYWNlL2ZpeHR1cmUtYmVmb3JlLWFmdGVyL2ZpeHR1cmUtYmVmb3JlLWFmdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7QUFTbEcsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxlQUFlLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFcEMsbUJBQW1CLEdBQVEsSUFBSSxDQUFDO0lBQ2hDLG1CQUFtQixHQUFRLElBQUksQ0FBQztJQUV6QyxRQUFRO1FBQ04sc0NBQXNDO1FBQ3RDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFlBQVksRUFBRTtZQUNoRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDOUU7UUFDRCxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFlBQVksRUFBRTtZQUNoRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDOUU7SUFDSCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsT0FBWTtRQUM3QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFckIsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQyxPQUFPLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUVELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUM5RCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLE9BQU8sT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsT0FBTyxPQUFPLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUMvQyxJQUFJLFlBQVksR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNyQywyQ0FBMkM7UUFDM0MsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbkMsWUFBWSxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUNaLFlBQVksR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUM7YUFDNUM7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsT0FBTyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE9BQU8sRUFBRSxlQUFlLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7d0dBM0VVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLDZNQ1p4Qyx1ckhBdUVBLHl2RkQvRFksWUFBWSxtSUFBRSxxQkFBcUI7OzRGQUlsQywyQkFBMkI7a0JBUHZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQzs4QkFPckMsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlT2ZmY2FudmFzIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTdG9yZUZpeHR1cmVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3N0b3JlLWZpeHR1cmUvc3RvcmUtZml4dHVyZS5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZml4dHVyZS1iZWZvcmUtYWZ0ZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgU3RvcmVGaXh0dXJlQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZml4dHVyZS1iZWZvcmUtYWZ0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9maXh0dXJlLWJlZm9yZS1hZnRlci5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpeHR1cmVCZWZvcmVBZnRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBhY3RpdmVPZmZjYW52YXMgPSBpbmplY3QoTmdiQWN0aXZlT2ZmY2FudmFzKTtcclxuICBcclxuICBASW5wdXQoKSBzZWxlY3RlZEZpeHR1cmVEYXRhOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG9yaWdpbmFsRml4dHVyZURhdGE6IGFueSA9IG51bGw7IFxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEVuc3VyZSBkYXRhIGlzIHByb3Blcmx5IGluaXRpYWxpemVkXHJcbiAgICB0aGlzLmVuc3VyZUZpeHR1cmVEYXRhU3RydWN0dXJlKHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSk7XHJcbiAgICB0aGlzLmVuc3VyZUZpeHR1cmVEYXRhU3RydWN0dXJlKHRoaXMub3JpZ2luYWxGaXh0dXJlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRGaXh0dXJlRGF0YSddPy5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5lbnN1cmVGaXh0dXJlRGF0YVN0cnVjdHVyZShjaGFuZ2VzWydzZWxlY3RlZEZpeHR1cmVEYXRhJ10uY3VycmVudFZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydvcmlnaW5hbEZpeHR1cmVEYXRhJ10/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmVuc3VyZUZpeHR1cmVEYXRhU3RydWN0dXJlKGNoYW5nZXNbJ29yaWdpbmFsRml4dHVyZURhdGEnXS5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVGaXh0dXJlRGF0YVN0cnVjdHVyZShmaXh0dXJlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghZml4dHVyZSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICAvLyBFbnN1cmUgdm1Db25maWcgaXMgYW4gYXJyYXlcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShmaXh0dXJlLnZtQ29uZmlnKSkge1xyXG4gICAgICBmaXh0dXJlLnZtQ29uZmlnID0gW107XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEVuc3VyZSBzaGVsZkNvbmZpZyBpcyBhbiBhcnJheVxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpeHR1cmUuc2hlbGZDb25maWcpKSB7XHJcbiAgICAgIGZpeHR1cmUuc2hlbGZDb25maWcgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRGaXh0dXJlRGF0YSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaXh0dXJlRGF0YSB8fCB0aGlzLm9yaWdpbmFsRml4dHVyZURhdGE7XHJcbiAgfVxyXG5cclxuICBnZXRGaXh0dXJlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmdldEN1cnJlbnRGaXh0dXJlRGF0YSgpO1xyXG4gICAgcmV0dXJuIGZpeHR1cmU/LmhlYWRlcj8ubGFiZWwgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXRGaXh0dXJlQ2F0ZWdvcnkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmdldEN1cnJlbnRGaXh0dXJlRGF0YSgpO1xyXG4gICAgcmV0dXJuIGZpeHR1cmU/LmZpeHR1cmVDYXRlZ29yeSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldEZpeHR1cmVXaWR0aCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZ2V0Q3VycmVudEZpeHR1cmVEYXRhKCk7XHJcbiAgICBpZiAoIWZpeHR1cmU/LmZpeHR1cmVXaWR0aCkgcmV0dXJuICcnO1xyXG4gICAgY29uc3Qgd2lkdGggPSBmaXh0dXJlLmZpeHR1cmVXaWR0aC52YWx1ZTtcclxuICAgIGNvbnN0IHVuaXQgPSBmaXh0dXJlLmZpeHR1cmVXaWR0aC51bml0IHx8ICdtbSc7XHJcbiAgICBsZXQgZGltZW5zaW9uU3RyID0gYCR7d2lkdGh9JHt1bml0fWA7XHJcbiAgICAvLyBDb252ZXJ0IHRvIGZlZXQgaWYgbmVlZGVkICgxMjAwbW0gPSA0ZnQpXHJcbiAgICBpZiAodW5pdCA9PT0gJ21tJyAmJiB3aWR0aCA9PT0gMTIwMCkge1xyXG4gICAgICBkaW1lbnNpb25TdHIgPSBgJHt3aWR0aH0ke3VuaXR9LzRmdGA7XHJcbiAgICB9IGVsc2UgaWYgKHVuaXQgPT09ICdtbScgJiYgd2lkdGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZlZXQgPSBNYXRoLnJvdW5kKHdpZHRoIC8gMzAwKTtcclxuICAgICAgaWYgKGZlZXQgPiAwKSB7XHJcbiAgICAgICAgZGltZW5zaW9uU3RyID0gYCR7d2lkdGh9JHt1bml0fS8ke2ZlZXR9ZnRgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGltZW5zaW9uU3RyO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2hlbGZDb3VudCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZ2V0Q3VycmVudEZpeHR1cmVEYXRhKCk7XHJcbiAgICByZXR1cm4gZml4dHVyZT8uc2hlbGZDb25maWc/Lmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rml4dHVyZUNhcGFjaXR5KCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmaXh0dXJlID0gdGhpcy5nZXRDdXJyZW50Rml4dHVyZURhdGEoKTtcclxuICAgIHJldHVybiBmaXh0dXJlPy5maXh0dXJlQ2FwYWNpdHkgfHwgMDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm9mZmNhbnZhcy1oZWFkZXIgZC1mbGV4IHctMTAwIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaXh0dXJlLXByZXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1jYXJkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInByb2R1Y3QtaW1hZ2UtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiUHJvZHVjdFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2R1Y3QtaW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZVwiPnt7IGdldEZpeHR1cmVMYWJlbCgpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BlY3MtY29udGFpbmVyXCIgKm5nSWY9XCJnZXRGaXh0dXJlQ2F0ZWdvcnkoKSB8fCBnZXRGaXh0dXJlV2lkdGgoKSB8fCBnZXRTaGVsZkNvdW50KCkgPiAwIHx8IGdldEZpeHR1cmVDYXBhY2l0eSgpID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3BlYy10ZXh0XCIgKm5nSWY9XCJnZXRGaXh0dXJlQ2F0ZWdvcnkoKVwiPnt7IGdldEZpeHR1cmVDYXRlZ29yeSgpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3RcIiAqbmdJZj1cImdldEZpeHR1cmVDYXRlZ29yeSgpICYmIChnZXRGaXh0dXJlV2lkdGgoKSB8fCBnZXRTaGVsZkNvdW50KCkgPiAwIHx8IGdldEZpeHR1cmVDYXBhY2l0eSgpID4gMClcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwZWMtdGV4dFwiICpuZ0lmPVwiZ2V0Rml4dHVyZVdpZHRoKClcIj57eyBnZXRGaXh0dXJlV2lkdGgoKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG90XCIgKm5nSWY9XCJnZXRGaXh0dXJlV2lkdGgoKSAmJiAoZ2V0U2hlbGZDb3VudCgpID4gMCB8fCBnZXRGaXh0dXJlQ2FwYWNpdHkoKSA+IDApXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGVjLXRleHRcIiAqbmdJZj1cImdldFNoZWxmQ291bnQoKSA+IDBcIj57eyBnZXRTaGVsZkNvdW50KCkgfX0ge3sgZ2V0U2hlbGZDb3VudCgpID09PSAxID8gJ1NoZWxmJyA6ICdTaGVsdmVzJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG90XCIgKm5nSWY9XCJnZXRTaGVsZkNvdW50KCkgPiAwICYmIGdldEZpeHR1cmVDYXBhY2l0eSgpID4gMFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3BlYy10ZXh0XCIgKm5nSWY9XCJnZXRGaXh0dXJlQ2FwYWNpdHkoKSA+IDBcIj57eyBnZXRGaXh0dXJlQ2FwYWNpdHkoKSB9fSBDYXBhY2l0eTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiAoY2xpY2spPVwiYWN0aXZlT2ZmY2FudmFzLmRpc21pc3MoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJvZmZjYW52YXMtYm9keSBwLTNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaXh0dXJlLXByZXZpZXctY29udGVudFwiPlxyXG4gICAgICAgIDwhLS0gU2hvdyBCZWZvcmUvQWZ0ZXIgd2hlbiByZXBsYWNlIGRhdGEgZXhpc3RzIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJvcmlnaW5hbEZpeHR1cmVEYXRhXCIgY2xhc3M9XCJiZWZvcmUtYWZ0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZWZvcmUtc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2VjdGlvbi1sYWJlbCBtYi0wXCI+QmVmb3JlPC9oNj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeHR1cmUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc3RvcmUtZml4dHVyZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpeHR1cmVdPVwib3JpZ2luYWxGaXh0dXJlRGF0YVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbG9yc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dWTXNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QkNzXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1zdG9yZS1maXh0dXJlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWZ0ZXItc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2VjdGlvbi1sYWJlbCBtYi0wXCI+QWZ0ZXI8L2g2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1zdG9yZS1maXh0dXJlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZml4dHVyZV09XCJzZWxlY3RlZEZpeHR1cmVEYXRhXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q29sb3JzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZNc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCQ3NdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXN0b3JlLWZpeHR1cmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPCEtLSBTaG93IHNpbmdsZSBmaXh0dXJlIHdoZW4gbm8gcmVwbGFjZSBkYXRhIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhb3JpZ2luYWxGaXh0dXJlRGF0YSAmJiBzZWxlY3RlZEZpeHR1cmVEYXRhXCIgY2xhc3M9XCJzaW5nbGUtZml4dHVyZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpeHR1cmUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1zdG9yZS1maXh0dXJlIFxyXG4gICAgICAgICAgICAgICAgICAgIFtmaXh0dXJlXT1cInNlbGVjdGVkRml4dHVyZURhdGFcIiBcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbG9yc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1ZNc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0JDc109XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1zdG9yZS1maXh0dXJlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19