{"version":3,"file":"tango-app-ui-store-builder-tango-app-ui-store-builder-LVe4hdLY.mjs","sources":["../../../projects/tango-store-builder/src/lib/components/layout-builder/layout-builder.component.ts","../../../projects/tango-store-builder/src/lib/components/layout-builder/layout-builder.component.html","../../../projects/tango-store-builder/src/lib/services/store-builder.service.ts","../../../projects/tango-store-builder/src/lib/components/store-offcanvas-component/store-offcanvas-component.component.ts","../../../projects/tango-store-builder/src/lib/components/store-offcanvas-component/store-offcanvas-component.component.html","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/add-floor/add-floor.component.ts","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/add-floor/add-floor.component.html","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/clear-all-steps/clear-all-steps.component.ts","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/clear-all-steps/clear-all-steps.component.html","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/delete-layout/delete-layout.component.ts","../../../projects/tango-store-builder/src/lib/components/create-layout/popups/delete-layout/delete-layout.component.html","../../../projects/tango-store-builder/src/lib/components/custom-select/custom-select.component.ts","../../../projects/tango-store-builder/src/lib/components/custom-select/custom-select.component.html","../../../projects/tango-store-builder/src/lib/components/create-layout/create-layout.component.ts","../../../projects/tango-store-builder/src/lib/components/create-layout/create-layout.component.html","../../../projects/tango-store-builder/src/lib/components/layout-summary/popups/complete-layout/complete-layout.component.ts","../../../projects/tango-store-builder/src/lib/components/layout-summary/popups/complete-layout/complete-layout.component.html","../../../projects/tango-store-builder/src/lib/components/layout-summary/layout-summary.component.ts","../../../projects/tango-store-builder/src/lib/components/layout-summary/layout-summary.component.html","../../../projects/tango-store-builder/src/lib/components/store-layout-table/store-layout-table.component.ts","../../../projects/tango-store-builder/src/lib/components/store-layout-table/store-layout-table.component.html","../../../projects/tango-store-builder/src/lib/components/store-builder/store-builder.component.ts","../../../projects/tango-store-builder/src/lib/components/store-builder/store-builder.component.html","../../../projects/tango-store-builder/src/lib/components/create-store/create-store.component.ts","../../../projects/tango-store-builder/src/lib/components/create-store/create-store.component.html","../../../projects/tango-store-builder/src/lib/components/layout-elements/element-form/element-form.component.ts","../../../projects/tango-store-builder/src/lib/components/layout-elements/element-form/element-form.component.html","../../../projects/tango-store-builder/src/lib/components/layout-elements/layout-elements.component.ts","../../../projects/tango-store-builder/src/lib/components/layout-elements/layout-elements.component.html","../../../projects/tango-store-builder/src/lib/components/visualize-vm-data/visualize-vm-data.component.ts","../../../projects/tango-store-builder/src/lib/components/visualize-vm-data/visualize-vm-data.component.html","../../../projects/tango-store-builder/src/lib/components/popups/layout-edit-confirmation/layout-edit-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/layout-edit-confirmation/layout-edit-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/publishtask-popup/publishtask-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/publishtask-popup/publishtask-popup.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/store-task-revoke/store-task-revoke.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/store-task-revoke/store-task-revoke.component.html","../../../projects/tango-store-builder/src/lib/components/popups/delete-confirmation/delete-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/delete-confirmation/delete-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/popups/publish-plano-modal/publish-plano-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/publish-plano-modal/publish-plano-modal.component.html","../../../projects/tango-store-builder/src/lib/components/date-picker/date-picker.component.ts","../../../projects/tango-store-builder/src/lib/components/date-picker/date-picker.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component.html","../../../projects/tango-store-builder/src/lib/functions/plano.function.ts","../../../projects/tango-store-builder/src/lib/services/cad-source.service.ts","../../../projects/tango-store-builder/src/lib/components/reactive-select/reactive-select.component.ts","../../../projects/tango-store-builder/src/lib/components/reactive-select/reactive-select.component.html","../../../projects/tango-store-builder/src/lib/components/counter-input/counter-input.component.ts","../../../projects/tango-store-builder/src/lib/components/counter-input/counter-input.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.html","../../../projects/tango-store-builder/src/lib/data/fixture-template.data.ts","../../../projects/tango-store-builder/src/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.ts","../../../projects/tango-store-builder/src/lib/components/multiselect-chip-dropdown/multiselect-chip-dropdown.component.html","../../../projects/tango-store-builder/src/lib/services/plano-data.service.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-products/template-products.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-products/template-products.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-vms/template-vms.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/template-vms/template-vms.component.html","../../../projects/tango-store-builder/src/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.ts","../../../projects/tango-store-builder/src/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/manage-store-plano.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/manage-store-plano.component.html","../../../projects/tango-store-builder/src/lib/components/popups/cannot-perform/cannot-perform.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/cannot-perform/cannot-perform.component.html","../../../projects/tango-store-builder/src/lib/components/popups/exit-confirmation/exit-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/exit-confirmation/exit-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/popups/variant-popup/variant-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/variant-popup/variant-popup.component.html","../../../projects/tango-store-builder/src/lib/pipes/time-ago.pipe.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/fixture-template.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/fixture-template.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/popups/bulk-upload-fixture-template/bulk-upload-fixture-template.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/popups/bulk-upload-fixture-template/bulk-upload-fixture-template.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-tree/fixture-template-tree.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-tree/fixture-template-tree.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.html","../../../projects/tango-store-builder/src/lib/components/popups/revoke-confirmation/revoke-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/revoke-confirmation/revoke-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-details/template-details.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-details/template-details.component.html","../../../projects/tango-store-builder/src/lib/components/access-denied/access-denied.component.ts","../../../projects/tango-store-builder/src/lib/components/access-denied/access-denied.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/fixture-template-table.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/fixture-template-table.component.html","../../../projects/tango-store-builder/src/lib/components/popups/complete-confirmation/complete-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/complete-confirmation/complete-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-basic-details/template-basic-details.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-basic-details/template-basic-details.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-vms/template-vms.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-vms/template-vms.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-summary/template-summary.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-summary/template-summary.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-products/template-products.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-products/template-products.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/plano-library.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/plano-library.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/popups/fixture-bulk-upload/fixture-bulk-upload.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/popups/fixture-bulk-upload/fixture-bulk-upload.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/fixture-library.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/fixture-library/fixture-library.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/vm-library/popups/vm-bulk-upload/vm-bulk-upload.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/vm-library/popups/vm-bulk-upload/vm-bulk-upload.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/vm-library/vm-library.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/vm-library/vm-library.component.html","../../../projects/tango-store-builder/src/lib/components/plano-library/product-library/product-library.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-library/product-library/product-library.component.html","../../../projects/tango-store-builder/src/lib/components/plano-configurations/popups/popups.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-configurations/popups/popups.component.html","../../../projects/tango-store-builder/src/lib/components/plano-configurations/plano-configurations.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-configurations/plano-configurations.component.html","../../../projects/tango-store-builder/src/lib/components/create-fixture/create-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/create-fixture/create-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/create-vm/popups/add-vm-type/add-vm-type.component.ts","../../../projects/tango-store-builder/src/lib/components/create-vm/popups/add-vm-type/add-vm-type.component.html","../../../projects/tango-store-builder/src/lib/components/create-vm/create-vm.component.ts","../../../projects/tango-store-builder/src/lib/components/create-vm/create-vm.component.html","../../../projects/tango-store-builder/src/lib/components/create-product/create-product.component.ts","../../../projects/tango-store-builder/src/lib/components/create-product/create-product.component.html","../../../projects/tango-store-builder/src/lib/functions/exit.guard.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/popups/bulk-upload-planogram/bulk-upload-planogram.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/popups/bulk-upload-planogram/bulk-upload-planogram.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-table/plano-filter/plano-filter.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-table/plano-filter/plano-filter.component.html","../../../projects/tango-store-builder/src/lib/components/manage-plano/rollout-table/rollout-table.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/rollout-table/rollout-table.component.html","../../../projects/tango-store-builder/src/lib/components/manage-plano/verification-table/verification-table.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/verification-table/verification-table.component.html","../../../projects/tango-store-builder/src/lib/components/manage-plano/manage-plano.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/manage-plano.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/publish-rollout-popup/publish-rollout-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/publish-rollout-popup/publish-rollout-popup.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/confirmation-popup/confirmation-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/popups/confirmation-popup/confirmation-popup.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/rollout-feedback/rollout-feedback.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/rollout-feedback/rollout-feedback.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.html","../../../projects/tango-store-builder/src/lib/components/popups/publish-confirmation/publish-confirmation.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/publish-confirmation/publish-confirmation.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/custom-select/custom-select.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/custom-select/custom-select.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-builder/plano-builder.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-builder/plano-builder.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/tool-page-header/tool-page-header.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/tool-page-header/tool-page-header.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-migrate/plano-migrate.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-migrate/plano-migrate.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-table/plano-table.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-table/plano-table.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/tools-parent/tools-parent.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/tools-parent/tools-parent.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/product-locator.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/product-locator.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/zone-products/zone-products.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/zone-products/zone-products.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/merch-compliance.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/merch-compliance.component.html","../../../projects/tango-store-builder/src/lib/components/popups/set-current-plano-modal/set-current-plano-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/set-current-plano-modal/set-current-plano-modal.component.html","../../../projects/tango-store-builder/src/lib/components/popups/edit-revision-name-modal/edit-revision-name-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/popups/edit-revision-name-modal/edit-revision-name-modal.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-overview-panel/fixture-overview-panel.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-overview-panel/fixture-overview-panel.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/plano-overview.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-overview/plano-overview.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/zone-analytics/zone-analytics.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/zone-analytics/zone-analytics.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/plano-analytics.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-analytics/plano-analytics.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/plano-details-parent/plano-details-parent.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/plano-details-parent/plano-details-parent.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/collection-update-ai.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/collection-update-ai.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/services/data.service.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-select/store-select.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-select/store-select.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.html","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.ts","../../../projects/tango-store-builder/src/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.html","../../../projects/tango-store-builder/src/lib/components/file-upload/file-upload.component.ts","../../../projects/tango-store-builder/src/lib/components/file-upload/file-upload.component.html","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/create-planogram/create-planogram.component.ts","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/create-planogram/create-planogram.component.html","../../../projects/tango-store-builder/src/lib/components/manage-plano/onboard-table/onboard-table.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-plano/onboard-table/onboard-table.component.html","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/utils/axis-compaction.ts","../../../projects/tango-store-builder/src/lib/components/ivm-logic-explorer/ivm-logic-explorer.component.ts","../../../projects/tango-store-builder/src/lib/components/ivm-logic-explorer/ivm-logic-explorer.component.html","../../../projects/tango-store-builder/src/lib/components/fixture-preview/fixture-preview.component.ts","../../../projects/tango-store-builder/src/lib/components/fixture-preview/fixture-preview.component.html","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.ts","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.html","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/onboard-store-plano.component.ts","../../../projects/tango-store-builder/src/lib/components/onboard-store-plano/onboard-store-plano.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/cad-render/cad-render.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/cad-render/cad-render.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/allow-edit/allow-edit.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/allow-edit/allow-edit.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/delete-task/delete-task.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/delete-task/delete-task.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/delete-floor/delete-floor.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/delete-floor/delete-floor.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/update-fixture-type/update-fixture-type.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/update-fixture-type/update-fixture-type.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-data-export/plano-data-export.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/plano-data-export/plano-data-export.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/store-exports/store-exports.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/store-exports/store-exports.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/fixture-conformance/fixture-conformance.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/fixture-conformance/fixture-conformance.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/swap-template/swap-template.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/swap-template/swap-template.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/move-bucket/move-bucket.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/move-bucket/move-bucket.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/cad-files/cad-files.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/cad-files/cad-files.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/layout-touchup/layout-touchup.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/layout-touchup/layout-touchup.component.html","../../../projects/tango-store-builder/src/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.html","../../../projects/tango-store-builder/src/lib/components/look-plano-collection/look-plano-collection.component.ts","../../../projects/tango-store-builder/src/lib/components/look-plano-collection/look-plano-collection.component.html","../../../projects/tango-store-builder/src/lib/components/searchable-select/searchable-select.component.ts","../../../projects/tango-store-builder/src/lib/components/searchable-select/searchable-select.component.html","../../../projects/tango-store-builder/src/lib/components/chips-input/chips-input.component.ts","../../../projects/tango-store-builder/src/lib/components/chips-input/chips-input.component.html","../../../projects/tango-store-builder/src/lib/components/look-plano-collection-form/look-plano-collection-form.component.ts","../../../projects/tango-store-builder/src/lib/components/look-plano-collection-form/look-plano-collection-form.component.html","../../../projects/tango-store-builder/src/lib/functions/feature-access.guard.ts","../../../projects/tango-store-builder/src/lib/tango-store-builder-routing.module.ts","../../../projects/tango-store-builder/src/lib/components/plano-configurations/custom-filter/custom-filter.component.ts","../../../projects/tango-store-builder/src/lib/components/plano-configurations/custom-filter/custom-filter.component.html","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.ts","../../../projects/tango-store-builder/src/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.html","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.ts","../../../projects/tango-store-builder/src/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.html","../../../projects/tango-store-builder/src/lib/tango-store-builder.module.ts","../../../projects/tango-store-builder/src/lib/components/store-plano/store-plano.component.ts","../../../projects/tango-store-builder/src/lib/components/store-plano/store-plano.component.html","../../../projects/tango-store-builder/src/lib/tango-store-plano.module.ts","../../../projects/tango-store-builder/src/public-api.ts","../../../projects/tango-store-builder/src/tango-app-ui-store-builder.ts"],"sourcesContent":["import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\nimport { PageInfoService } from 'tango-app-ui-global';\r\n\r\n@Component({\r\n  selector: 'lib-layout-builder',\r\n  templateUrl: './layout-builder.component.html',\r\n  styleUrl: './layout-builder.component.scss'\r\n})\r\nexport class LayoutBuilderComponent implements OnInit, OnDestroy {\r\n\r\n    currentRoute:string\r\n    routerSub:Subscription\r\n    type: 'create' | 'summary' = 'create'\r\n\r\n  \r\n    constructor(private router:Router, private pageInfo:PageInfoService){\r\n  \r\n    }\r\n    ngOnDestroy(): void {\r\n      this.routerSub.unsubscribe()\r\n    }\r\n    \r\n    ngOnInit(): void {\r\n      this.currentRoute = this.router.url;\r\n      if(this.currentRoute.startsWith('/manage/planogram/layout-builder/create') ){\r\n        this.type = 'create'\r\n      }\r\n      else if(this.currentRoute.startsWith('/manage/planogram/layout-builder/summary') ){\r\n        this.type = 'summary'\r\n      }\r\n     this.routerSub =  this.router.events.subscribe((event) => {\r\n        if (event instanceof NavigationEnd) {\r\n          this.currentRoute = event.urlAfterRedirects\r\n          if(this.currentRoute.startsWith('/manage/planogram/layout-builder/create')){\r\n            this.type = 'create'\r\n          }\r\n          else if(this.currentRoute.startsWith('/manage/planogram/layout-builder/summary')){\r\n            this.type = 'summary'\r\n          }\r\n        }\r\n      });\r\n\r\n      this.setPageData()\r\n  \r\n    }\r\n\r\n    setPageData() {\r\n      this.pageInfo.setTitle(\"Create Store Layout\");\r\n      this.pageInfo.setDescription(\"\");\r\n      this.pageInfo.setBreadcrumbs([\r\n        { title: \"Planogram\", path: \"/manage/planogram/store-layout\", isActive: false, isSeparator: false },\r\n        { title: \"Planogram\", path: \"/manage/planogram/store-layout\", isActive: false, isSeparator: true },\r\n      ]);\r\n    }\r\n  \r\n\r\n}\r\n","<div class=\"c-card\">\r\n    <div *ngIf=\"type === 'create'\" class=\"active-dot\">\r\n        1\r\n    </div>\r\n    <div style=\"width: 8px;\" ></div>\r\n    <div *ngIf=\"type === 'summary'\" class=\"success-dot me-2\" >\r\n     <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n        <path d=\"M9 2L3.5 7.5L1 5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    </svg>   \r\n    </div>    \r\n    <div [ngClass]=\"type === 'create' ? 'active-txt' : 'success-txt'\" class=\" me-4\">\r\n        Create layout\r\n    </div>\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"103\" height=\"2\" viewBox=\"0 0 103 2\" fill=\"none\">\r\n        <path d=\"M0 1H103\" stroke=\"#98A2B3\" stroke-width=\"1.5\" />\r\n    </svg>\r\n    <div [ngClass]=\"type === 'summary' ? 'active-dot' : 'inactive-dot'\" class=\" me-2\">\r\n        2\r\n    </div>\r\n    <div [ngClass]=\"type === 'summary' ? 'active-txt' : 'inactive-txt'\">\r\n        Summary\r\n    </div>\r\n</div>\r\n<router-outlet></router-outlet>","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable, OnDestroy } from \"@angular/core\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { BehaviorSubject, Subject, takeUntil } from \"rxjs\";\r\nimport * as FileSaver from \"file-saver\";\r\nimport * as XLSX from \"xlsx\";\r\n\r\nconst EXCEL_TYPE =\r\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8\";\r\nconst EXCEL_EXTENSION = \".xlsx\";\r\n\r\n@Injectable({\r\n  providedIn: \"root\",\r\n})\r\nexport class StoreBuilderService implements OnDestroy {\r\n  storeApiUrl: string;\r\n  storeBuilderApiUrl: string;\r\n  trafficApiUrl: string;\r\n  ticketsApiUrl: string;\r\n\r\n  dropDownTrigger = new BehaviorSubject(null);\r\n\r\n  private readonly destroy$ = new Subject();\r\n\r\n  constructor(\r\n    private http: HttpClient,\r\n    private gs: GlobalStateService,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => {\r\n      if (env) {\r\n        this.storeBuilderApiUrl = env.storeBuilderUrl;\r\n        this.storeApiUrl = env.storeApiUrl;\r\n        this.trafficApiUrl = env.trafficApiUrl;\r\n        this.ticketsApiUrl = env.ticketsApiUrl;\r\n      }\r\n    });\r\n  }\r\n\r\n  public exportAsExcelFile(json: any[], excelFileName: string): void {\r\n    const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);\r\n    const workbook: XLSX.WorkBook = {\r\n      Sheets: { data: worksheet },\r\n      SheetNames: [\"data\"],\r\n    };\r\n    const excelBuffer: any = XLSX.write(workbook, {\r\n      bookType: \"xlsx\",\r\n      type: \"array\",\r\n    });\r\n    this.saveAsExcelFile(excelBuffer, excelFileName);\r\n  }\r\n\r\n  public saveAsExcelFile(buffer: any, fileName: string): void {\r\n    const data: Blob = new Blob([buffer], {\r\n      type: EXCEL_TYPE,\r\n    });\r\n    FileSaver.saveAs(data, fileName + \"list\" + EXCEL_EXTENSION);\r\n  }\r\n\r\n  public saveAsTemplate(buffer: any, fileName: string): void {\r\n    const data: Blob = new Blob([buffer], {\r\n      type: EXCEL_TYPE,\r\n    });\r\n    FileSaver.saveAs(data, fileName + EXCEL_EXTENSION);\r\n  }\r\n\r\n  layoutList(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/storeLayoutList`, data);\r\n  }\r\n\r\n  getStoreList(data: any) {\r\n    return this.http.post(`${this.storeApiUrl}/storeInfraList`, data);\r\n  }\r\n\r\n  createLayout(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/createStoreLayout`, data);\r\n  }\r\n\r\n  createAndSubmitLayoutTask(storeName: string, clientId: string) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/script/createLayout`, {\r\n      storeName: [storeName],\r\n      clientId,\r\n    });\r\n  }\r\n\r\n  BulkUpload(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/uploadBulkStore`, data);\r\n  }\r\n\r\n  getPlano(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/storeLayout`, data);\r\n  }\r\n\r\n  getPlanoDetails(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/storeFixtures`, data);\r\n  }\r\n\r\n  deleteFloor(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/deleteFloor`, data);\r\n  }\r\n\r\n  getFloorDeleteImpact(data: { floorId: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/getFloorDeleteImpact`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteFloorCascade(data: { floorId: string; confirmLastFloor?: boolean }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/deleteFloorCascade`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  addFloor(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/updateFloor`, data);\r\n  }\r\n\r\n  updateFloorLayout(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/updateStoreLayout`, data);\r\n  }\r\n\r\n  getStoreDetails(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/storeDetails`, data);\r\n  }\r\n\r\n  uploadFile(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/uploadFile`, data);\r\n  }\r\n\r\n  deleteFile(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/removeFile`, data);\r\n  }\r\n\r\n  updatePlanoStatus(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/updateStatus`, data);\r\n  }\r\n\r\n  deleteLayout(data: any) {\r\n    return this.http.delete(\r\n      `${this.storeBuilderApiUrl}/deleteStoreLayout/${data}`,\r\n    );\r\n  }\r\n\r\n  updateDetailedDistance(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/updateDeatailedDistance`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updertFixture(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/upsertFixture`, data);\r\n  }\r\n\r\n  // Fixture Library\r\n  createFixtureLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/createFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureLibraryDetails(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureDetails`,\r\n      { params: { fixtureId: id } },\r\n    );\r\n  }\r\n\r\n  getFixtureSizeList(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureSizeList`,\r\n      { params: { clientId: id } },\r\n    );\r\n  }\r\n\r\n  getFixtureLibraryList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureLibraryListToExport(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureList`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  updateFixtureLibrary(data: any, id: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/updateFixture/${id}`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  duplicateFixtureLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/duplicateFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteFixtureLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/deleteFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  bulkActionFixtureLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureBulkUpload`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureNameList(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureNameList`,\r\n      { params: { clientId: id } },\r\n    );\r\n  }\r\n\r\n  getFixtureLibNameList(id: string, status?: string, country?: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/fixtureLibNameList`,\r\n      {\r\n        params: {\r\n          clientId: id,\r\n          ...(status ? { status } : {}),\r\n          ...(country ? { country } : {}),\r\n        },\r\n      },\r\n    );\r\n  }\r\n\r\n  // VM Library\r\n  getVmLibraryDetails(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getVmDetails`,\r\n      {\r\n        params: { vmId: id },\r\n      },\r\n    );\r\n  }\r\n\r\n  getVmLibraryList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getVmLibList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getVmLibraryListToExport(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getVmLibList`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  addUpdateVmLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/addUpdateVm`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  duplicateVmLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/duplicateVmLib`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteVmLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/deleteVmLib`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  bulkActionVmLibrary(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/vmBulkUpload`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getVMNameList(id: string) {\r\n    return this.http.get(`${this.storeBuilderApiUrl}/planoLibrary/vmNameList`, {\r\n      params: { clientId: id },\r\n    });\r\n  }\r\n\r\n  //  VmTypes\r\n  getVmTypesList(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getVmTypeList`,\r\n      {\r\n        params: { clientId: id },\r\n      },\r\n    );\r\n  }\r\n\r\n  manageVmType(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/addVmType`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  uploadVmTypeImage(formData: any, id: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/uploadVmtypeImage/${id}`,\r\n      formData,\r\n    );\r\n  }\r\n\r\n  // Brand list\r\n  getBrandList(id: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getBrandList`,\r\n      {\r\n        clientId: id,\r\n      },\r\n    );\r\n  }\r\n\r\n  brandExport(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getBrandList`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  getStoreFixtures(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/storeFixturesV2`, {\r\n      ...data,\r\n      // status: [\"completed\"],\r\n    });\r\n  }\r\n\r\n  // getOnboardStoreFixtures(data: any) {\r\n  //   return this.http.post(`${this.storeBuilderApiUrl}/storeFixturesV2`, {\r\n  //     ...data,\r\n  //     status: [\"draft\", \"allocationPending\"],\r\n  //   });\r\n  // }\r\n\r\n  // Fixture Templates\r\n  getFixtureTemplateListOld(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/getTemplateList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureTemplateList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/masterTemplateList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTemplateChildList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/templateChildList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureTemplateListToExport(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/getTemplateList`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  getFixtureTemplateDetails(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/getTemplateDetails`,\r\n      { params: { templateId: id } },\r\n    );\r\n  }\r\n\r\n  createFixtureTemplate(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/createTemplate`,\r\n      data,\r\n    );\r\n  }\r\n  replaceFixtureDetails(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/replaceFixtureDetails`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateFixtureTemplate(data: any, id: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/updateTemplate/${id}`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  duplicateFixtureTemplate(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/duplicateTemplate`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteFixtureTemplate(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/deleteTemplate`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateFixtureStatus(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateFixtureStatus`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateApprovalStatus(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateApprovalStatus`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreFixturesfeedback(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getStoreFixturesfeedback`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateStorePlano(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateStorePlano`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateLayoutTouchup(data: {\r\n    planoId: string;\r\n    floorId: string;\r\n    data: any;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateLayoutTouchup`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoresForTouchup() {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getStoresForTouchup`,\r\n      {},\r\n    );\r\n  }\r\n\r\n  syncZoneResponseFromFixtures(data: { planoId: string; floorId: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/syncZoneResponseFromFixtures`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreFeedback(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getplanoFeedback`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getRolloutFeedback(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getRolloutFeedbackv2`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getZoneVerificationFeedback(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getZoneVerificationFeedback`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateZoneVerificationStatus(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateZoneVerificationStatus`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getHeadersList(storeId?: string) {\r\n    return this.http.get(`${this.storeBuilderApiUrl}/task/getHeaderList`, \r\n      // {      params: { storeId: storeId ?? \"\" }    }\r\n    );\r\n  }\r\n\r\n  getPIDList(header: string = \"others\") {\r\n    return this.http.get(`${this.storeBuilderApiUrl}/task/getPIDList`, {\r\n      params: { header },\r\n    });\r\n  }\r\n\r\n  getTemplateGroupList() {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/task/getTemplateGroupList`,\r\n    );\r\n  }\r\n\r\n  updateFixtureComplianceStatus(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateFixtureStatus`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  addUpdateBrand(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/addUpdateBrand`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  uploadBrand(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/uploadBrandList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getBrandMetaData(clientId: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getBrandMetaData`,\r\n      { clientId },\r\n    );\r\n  }\r\n\r\n  updateBrandMetaData(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/updateBrandMetaData`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateTask(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/updateTaskconfig`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTaskConfig(data: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/planoLibrary/getTaskConfig?clientId=${data}`,\r\n    );\r\n  }\r\n\r\n  updateStoreFixture(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateStoreFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  // Store\r\n  getPlanoList(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/planoList`, data);\r\n  }\r\n\r\n  getOnboardPlanoList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/onboardPlanoList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getPlanoListExport(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/planoList`, data, {\r\n      responseType: \"arraybuffer\",\r\n    });\r\n  }\r\n\r\n  getOnboardPlanoListExport(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/onboardPlanoList`,\r\n      data,\r\n      {\r\n        responseType: \"arraybuffer\",\r\n      },\r\n    );\r\n  }\r\n\r\n  getPlanoCards(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/planoCards`, data);\r\n  }\r\n\r\n  getPlanoRolloutList(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/planoRolloutList`, data);\r\n  }\r\n\r\n  getRolloutListExport(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/planoRolloutList`, data, {\r\n      responseType: \"arraybuffer\",\r\n    });\r\n  }\r\n\r\n  getPlanogramListExport(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/getPlanogramList`, data, {\r\n      responseType: \"arraybuffer\",\r\n    });\r\n  }\r\n\r\n  createTask(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/task/createTask`, data);\r\n  }\r\n\r\n  updateGlobalComment(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateGlobalComment`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getAllTemplates(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/getAllTemplates`,\r\n      data,\r\n    );\r\n  }\r\n  assigedTemplate(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/assigedTemplate`,\r\n      data,\r\n    );\r\n  }\r\n  TemplateStoresList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/TemplateStoresList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTaskInfo(data: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/taskDetails?planoId=${data.planoId}&floorId=${data.floorId}`,\r\n    );\r\n  }\r\n\r\n  getFixtureTemplate(id: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/getTemplate`,\r\n      { params: { templateId: id } },\r\n    );\r\n  }\r\n\r\n  getRolloutTaskInfo(data: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getRolloutTaskDetails?planoId=${data.planoId}&floorId=${data.floorId}`,\r\n    );\r\n  }\r\n\r\n  revokeTask(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/task/revokeTask`, data);\r\n  }\r\n\r\n  updateRolloutStatus(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateRolloutStatus`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTemplateAssignList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/templateAssignList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTemplateTreeList(params: {\r\n    masterId?: string;\r\n    storeId?: string;\r\n    clientId?: string;\r\n    templateGroupNames?: string[];\r\n    fixtureNames?: string[];\r\n    storeNames?: string[];\r\n  }) {\r\n    let queryParts: string[] = [];\r\n    if (params.masterId) queryParts.push(`masterId=${params.masterId}`);\r\n    else if (params.storeId) queryParts.push(`storeId=${params.storeId}`);\r\n    else if (params.clientId) queryParts.push(`clientId=${params.clientId}`);\r\n\r\n    if (params.templateGroupNames?.length)\r\n      queryParts.push(\r\n        `templateGroupNames=${params.templateGroupNames.join(\",\")}`,\r\n      );\r\n    if (params.fixtureNames?.length)\r\n      queryParts.push(`fixtureNames=${params.fixtureNames.join(\",\")}`);\r\n    if (params.storeNames?.length)\r\n      queryParts.push(`storeNames=${params.storeNames.join(\",\")}`);\r\n\r\n    let queryString = queryParts.length ? `?${queryParts.join(\"&\")}` : \"\";\r\n\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/templateTreeList${queryString}`,\r\n    );\r\n  }\r\n\r\n  getTreeFilterOptions(clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/treeFilterOptions?clientId=${clientId}`,\r\n    );\r\n  }\r\n\r\n  getTemplateVersionList(templateId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureTemplate/templateVersionList?templateId=${templateId}`,\r\n    );\r\n  }\r\n\r\n  getFixtureAiDetails(data: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getFixtureAIDetails?fixtureId=${data}`,\r\n    );\r\n  }\r\n\r\n  getFixtureShelfDetails(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureShelfDetailsv2`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getPlanogramList(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/getPlanogramList`, data);\r\n  }\r\n\r\n  getPlanogramComplianceDetails(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/calculateCompliance`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateProductMapping(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/updateProductMapping`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getCountries(data: any) {\r\n    return this.http.post(`${this.trafficApiUrl}/headerCountry_v2`, data);\r\n  }\r\n\r\n  getRegions(data: any) {\r\n    return this.http.post(`${this.trafficApiUrl}/headerLocations_v2`, data);\r\n  }\r\n\r\n  getPlanoStoreVideoParams(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getPlanoStoreVideoParams`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  publish(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/createRevision`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getRevisionList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getRevisions`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStorePlano(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/getRevisionData`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  setActiveRevision(data: {\r\n    revisionId: string;\r\n    planoId: string;\r\n    floorId: string;\r\n    sendVerificationTask: boolean;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/setActiveRevision`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateRevisionName(data: { revisionId: string; name: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/updateRevisionName`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  setStagingFlag(data: { revisionId: string; isStaging: boolean }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/managePlano/setStagingFlag`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getShelfDetails(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/shelfProduct`, data);\r\n  }\r\n\r\n  getPlanoStoreList(data: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getPlanoStoreList?clientId=${data}`,\r\n    );\r\n  }\r\n\r\n  getAllStores(clientId: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getAllStores?clientId=${clientId}`,\r\n    );\r\n  }\r\n\r\n  getStoreFloorsList(storeId: any) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getStoreFloorsList?storeId=${storeId}`,\r\n    );\r\n  }\r\n\r\n  createPlanoFromCAD(\r\n    file: File,\r\n    storeId: string,\r\n    storeName: string,\r\n    floorNumber: number,\r\n  ) {\r\n    const formData = new FormData();\r\n\r\n    formData.append(\"file\", file);\r\n    formData.append(\"storeId\", storeId);\r\n    formData.append(\"floorNumber\", floorNumber.toString());\r\n    formData.append(\"storeName\", storeName);\r\n\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/createPlanoFromCAD`,\r\n      formData,\r\n    );\r\n  }\r\n\r\n  createEmptyPlano(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/createEmptyPlano`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getAllPlanoIds(clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/script/getAllPlanoIdsM?clientId=${clientId}`,\r\n    );\r\n  }\r\n\r\n  findFixtureAi(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/findFixtureAI`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  findFixture(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/findFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  replaceFixture(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/replaceFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getReplaceBrandList(clientId: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getReplaceBrandList`,\r\n      { clientId },\r\n    );\r\n  }\r\n\r\n  getReplaceVmList(clientId: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getReplaceVmList`,\r\n      { clientId },\r\n    );\r\n  }\r\n\r\n  getPlanoId(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getPlanoId`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateFixtureData(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/updateFixture`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  approvePlanoLayout(floorId: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/approvePlanoLayout`,\r\n      { floorId: floorId },\r\n    );\r\n  }\r\n\r\n  exportMBQSheet(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/script/getPlanoExcel`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  exportPlanoOrderSheet(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/script/getPlanoOrderExcel`,\r\n      data,\r\n      { responseType: \"arraybuffer\" },\r\n    );\r\n  }\r\n\r\n  // Async/S3 variants: server queues the job, returns 202 with { jobId }, and\r\n  // saves the Excel to S3. Use getPlanoExportJob(jobId) to poll status.\r\n  exportMBQSheetAsync(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/script/getPlanoExcel`,\r\n      { ...data, saveToS3: true },\r\n      { observe: \"response\" },\r\n    );\r\n  }\r\n\r\n  exportPlanoOrderSheetAsync(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/script/getPlanoOrderExcel`,\r\n      { ...data, saveToS3: true },\r\n      { observe: \"response\" },\r\n    );\r\n  }\r\n\r\n  getPlanoExportJob(jobId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/script/getPlanoExportJob/${encodeURIComponent(\r\n        jobId,\r\n      )}`,\r\n    );\r\n  }\r\n\r\n  runAlocation(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/runAlocation`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  runLooksAllocation(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/runLooksAllocation`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getIvmConversionAlias() {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/onboardPlano/ivmConversionAlias`,\r\n    );\r\n  }\r\n\r\n  getAllFindReplaceData(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getAllFindReplaceData`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFindReplaceDataById(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getFindReplaceDataById`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  saveAsDraft(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/saveAsDraft`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreOrClusterList(data: { searchMode: \"store\" | \"cluster\" }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/getStoreOrClusterList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  batchFindReplace(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/batchFindReplace`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  approveReplace(data: {\r\n    findReplaceId: string;\r\n    stores?: any[];\r\n    schedule?: boolean;\r\n    scheduleDate?: string | null;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/approveReplace`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateBatchProgress(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/updateBatchProgress`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  cancelFindReplace(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/cancelFindReplace`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteFindReplaceAi(data: { id: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/deleteFindReplaceAi`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  revokeFindReplace(data: { findReplaceId: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/planoAI/revokeFindReplace`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  createStore(data: any) {\r\n    return this.http.post(`${this.storeApiUrl}/create-store`, data);\r\n  }\r\n\r\n  spocEmailCheck(data: any) {\r\n    return this.http.post(`${this.storeApiUrl}/spocEmailCheck`, data);\r\n  }\r\n\r\n  createInfraTicket(data: any) {\r\n    return this.http.post(`${this.ticketsApiUrl}/infra/createTicket`, data);\r\n  }\r\n\r\n  getFootfallDetails(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/getFixtureFootfall`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getTopPerformingZones(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/getTopPerformingZones`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreEngagers(data: any) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/getStoreEngagers`, data);\r\n  }\r\n\r\n  getStoreFixtureEngagers(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/getStoreFixtureEngagers`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreFixtureFootfall(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/getStoreFixtureFootfall`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  // VM Allocation Engine\r\n  getVmRuleList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/getRuleList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getVmRuleDetails(ruleId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/getRuleDetails`,\r\n      { params: { ruleId } },\r\n    );\r\n  }\r\n\r\n  createVmRule(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/createRule`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateVmRule(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/updateRule`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteVmRule(ruleId: string) {\r\n    return this.http.delete(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/deleteRule/${ruleId}`,\r\n    );\r\n  }\r\n\r\n  activateVmRule(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/activateRule`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deactivateVmRule(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/deactivateRule`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  duplicateVmRule(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/duplicateRule`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  assignVmRuleStores(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/assignStores`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getActiveVmRuleForStore(storeId: string, clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/vmAllocationEngine/getActiveRuleForStore`,\r\n      { params: { storeId, clientId } },\r\n    );\r\n  }\r\n\r\n  getFixtureNumbersByStore(\r\n    storeName: string,\r\n    clientId: string,\r\n    taskType: \"fixture\" | \"zoneVerification\" = \"fixture\",\r\n  ) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/task/getFixtureNumbersByStore`,\r\n      { params: { storeName, clientId, taskType } },\r\n    );\r\n  }\r\n\r\n  allowEditWithoutRemovingResponse(data: {\r\n    storeNames: string[];\r\n    clientId: string;\r\n    taskType: \"fixture\" | \"zoneVerification\";\r\n    fixtureNumbers?: number[];\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/task/allowEditWithoutRemovingResponse`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFixtureDetailsByStore(storeName: string, clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/task/getFixtureDetailsByStore`,\r\n      { params: { storeName, clientId } },\r\n    );\r\n  }\r\n\r\n  updateFixtureType(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/task/updateFixtureType`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getStoreFixturesForReorder(storeName: string, clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/getStoreFixturesForReorder`,\r\n      { params: { storeName, clientId } },\r\n    );\r\n  }\r\n\r\n  reorderStoreFixtureNumbers(data: { storeName: string; clientId: string }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/reorderStoreFixtureNumbers`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateFixtureNumberManual(data: {\r\n    fixtureId: string;\r\n    fixtureNumber?: number;\r\n    associatedElementFixtureNumber?: number;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/updateFixtureNumberManual`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  // Fixture Conformance (plano-tool)\r\n  listFixturesForConformance(storeName: string, clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/fixtureConformance/listFixtures`,\r\n      { params: { storeName, clientId } },\r\n    );\r\n  }\r\n\r\n  auditFixtureConformance(data: { clientId: string; fixtureIds: string[] }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureConformance/audit`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  applyFixtureConformance(data: {\r\n    clientId: string;\r\n    fixtureIds: string[];\r\n    syncCompliance?: boolean;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/fixtureConformance/applyFix`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteTaskForStores(data: {\r\n    storeNames: string[];\r\n    taskType: \"fixture\" | \"zoneVerification\";\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/task/deleteTaskForStores`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getFloorsWithStatus(storeName: string, clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/task/getFloorsWithStatus`,\r\n      { params: { storeName, clientId } },\r\n    );\r\n  }\r\n\r\n  moveStoreBucket(data: {\r\n    floorId: string;\r\n    targetStatus: \"draft\" | \"allocationPending\" | \"completed\";\r\n    clearLayoutTasks: boolean;\r\n    clearFixtureTasks: boolean;\r\n    clearZoneTasks: boolean;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/task/moveStoreBucket`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  swapFixtureTemplate(data: {\r\n    data: { storeName: string; fixtureNumber: number; templateName: string }[];\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/script/swapFixtureTemplate`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getPlanoDataSchema() {\r\n    return this.http.get(`${this.storeBuilderApiUrl}/getPlanoDataSchema`);\r\n  }\r\n\r\n  getCadFiles(storeName: string) {\r\n    return this.http.get(`${this.storeBuilderApiUrl}/onboardPlano/cadFiles`, {\r\n      params: { storeName },\r\n    });\r\n  }\r\n\r\n  runPlanoDataQuery(data: {\r\n    clientId: string;\r\n    storeNames: string[];\r\n    filters: { field: string; operator: string; value: any }[];\r\n    filterCombinator: \"AND\" | \"OR\";\r\n    selectionMode: \"all\" | \"firstN\";\r\n    limitPerStore?: number;\r\n    columns: { key: string; label?: string }[];\r\n    includeNotFoundRows?: boolean;\r\n  }) {\r\n    return this.http.post(`${this.storeBuilderApiUrl}/runPlanoDataQuery`, data);\r\n  }\r\n\r\n  runVmPlacementQuery(data: {\r\n    clientId: string;\r\n    storeNames: string[];\r\n    vmName: string;\r\n  }) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/runVmPlacementQuery`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  // Feature access — email-gated route/tab visibility. Each returns\r\n  // { code, data: { allowed, email }, ... }; the UI branches on data.allowed.\r\n  /** Whether the current session user may access Find & Replace\r\n   *  (email present in planostaticdatas `allowedFindReplaceUsers`). */\r\n  getFindReplaceAccess() {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/featureAccess/findReplace`,\r\n    );\r\n  }\r\n\r\n  /** Whether the current session user may access the Fixture Library\r\n   *  (email present in planostaticdatas `allowedFixtureLibraryUsers`). */\r\n  getFixtureLibraryAccess() {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/featureAccess/fixtureLibrary`,\r\n    );\r\n  }\r\n\r\n  /** Whether the current session user may access the Looks feature\r\n   *  (email present in planostaticdatas `allowedLookUsers`). */\r\n  getLookAccess() {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/featureAccess/looks`,\r\n    );\r\n  }\r\n\r\n  // Look Plano Collections\r\n  getLookPlanoCollectionList(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/getCollectionList`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  getLookPlanoCollectionDetails(collectionId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/getCollectionDetails`,\r\n      { params: { collectionId } },\r\n    );\r\n  }\r\n\r\n  /** MBQ bucket / Brand / Fixture Header dropdown options + combinations,\r\n   *  seeded into planostaticdatas (type='lookComboOptions') from the sheet. */\r\n  getLookComboOptions(clientId: string) {\r\n    return this.http.get(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/comboOptions`,\r\n      { params: { clientId } },\r\n    );\r\n  }\r\n\r\n  createLookPlanoCollection(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/createCollection`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  updateLookPlanoCollection(data: any) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/updateCollection`,\r\n      data,\r\n    );\r\n  }\r\n\r\n  deleteLookPlanoCollection(collectionId: string) {\r\n    return this.http.delete(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/deleteCollection/${collectionId}`,\r\n    );\r\n  }\r\n\r\n  duplicateLookPlanoCollection(collectionId: string) {\r\n    return this.http.post(\r\n      `${this.storeBuilderApiUrl}/lookPlanoCollection/duplicateCollection`,\r\n      { collectionId },\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","import { ChangeDetectorRef, Component, ElementRef, inject, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { debounceTime, Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport dayjs from 'dayjs';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport utc from 'dayjs/plugin/utc.js';\r\ndayjs.extend( utc );\r\ndayjs.extend(customParseFormat);\r\n\r\n\r\n@Component({\r\n  selector: 'lib-store-offcanvas-component',\r\n  templateUrl: './store-offcanvas-component.component.html',\r\n  styleUrl: './store-offcanvas-component.component.scss'\r\n})\r\nexport class StoreOffcanvasComponentComponent implements OnInit,OnDestroy{\r\n  activeOffcanvas = inject(NgbActiveOffcanvas);\r\n  @Input() store:any;\r\n  @Input() id:any;\r\n  @Input() clientId:string;\r\n  private destroy$ = new Subject<void>();\r\n  @ViewChild('xlsxFile') fileInput!: ElementRef;\r\n  dayjs:any = dayjs;\r\n\r\n  storeDetails:any;\r\n\r\n  constructor(private builderService:StoreBuilderService,private toast:ToastService,private cd:ChangeDetectorRef){}\r\n\r\n\r\n  ngOnInit(): void {\r\n    this.builderService.getStoreDetails({storeId:this.store.storeId,clientId:this.clientId}).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next:(res:any) =>{\r\n        if(res && res.code == 200) {\r\n          this.storeDetails = res.data;\r\n        }\r\n      },\r\n      error:(error:any) =>{\r\n        this.toast.getErrorToast(error?.error?.error || 'Something went wrong')\r\n      }\r\n    })\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  timeFormat(time:string) {\r\n    return this.dayjs(time,'HH:mm:ss').format('HH:mm A')\r\n  }\r\n\r\n  onFileUpload(event:any) {\r\n    let formData = new FormData();\r\n    formData.append('file', event.target.files[0]);\r\n    formData.append('id',this.id)\r\n    this.builderService.uploadFile(formData).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next:(res:any) => {\r\n        if(res && res.code == 200) {\r\n          this.storeDetails.attachments.push(res.data);\r\n          this.fileInput.nativeElement.value = '';\r\n          this.cd.detectChanges();\r\n        }\r\n      },\r\n      error:(error:any) => {\r\n        this.toast.getErrorToast(error?.error?.error || 'Something went wrong');\r\n        this.fileInput.nativeElement.value = '';\r\n      }\r\n    })\r\n  }\r\n\r\n  deleteFile(index:any) {\r\n    this.builderService.deleteFile({id:this.id,fileIndex:index}).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next:(res:any) => {\r\n        if(res && res.code == 200) {\r\n          this.storeDetails.attachments.splice(index,1);\r\n          this.cd.detectChanges();\r\n        }\r\n      },\r\n      error:(error:any) => {\r\n        this.toast.getErrorToast(error?.error?.error || 'Something went wrong');\r\n        this.fileInput.nativeElement.value = '';\r\n      }\r\n    })\r\n  }\r\n\r\n}\r\n","<div class=\"h100\">\r\n    <div class=\"offcanvas-header\">\r\n      <h5 class=\"offcanvas-title\">About</h5>\r\n      <button type=\"button\" class=\"btn-close\" (click)=\"activeOffcanvas.dismiss()\" aria-label=\"Close\"></button>\r\n    </div>\r\n    <div class=\"offcanvas-body d-flex flex-column justify-content-between h-90 \">\r\n        <div>\r\n            <div>\r\n                <div class=\"mb-8\">\r\n                    <img [src]=\"storeDetails.cameraBaseImage\" class=\"w-100 h-155px symbol symbol-75px symbol-fixed\" *ngIf=\"storeDetails?.cameraBaseImage?.trim()\" />\r\n                    <div class=\"symbol symbol-75px symbol-fixed position-relative ng-star-inserted w-100\" *ngIf=\"!storeDetails?.cameraBaseImage?.trim()\">\r\n                        <div class=\"cont w-100\">\r\n                            <div class=\"bg-color mb-5\"><svg width=\"32\"\r\n                                    height=\"30\" viewBox=\"0 0 23 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <g id=\"Group\">\r\n                                        <path id=\"Vector\"\r\n                                            d=\"M6.5 6.32227H6.51M16.25 9.32227H21.5L18 16.3223L14.91 12.0023\" stroke=\"#667085\"\r\n                                            stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path> \\ <path\r\n                                            id=\"Vector_2\"\r\n                                            d=\"M1.5 16.3229H5.26C5.63273 16.3255 5.99877 16.2239 6.31682 16.0295C6.63487 15.8352 6.89228 15.5558 7.06 15.2229L8.5 12.3229M1.5 18.3229V14.3229M17.5 6.82291L13.5 14.8229L3.11 9.62291C2.42033 9.27553 1.89635 8.6691 1.65272 7.93632C1.40909 7.20354 1.46564 6.4041 1.81 5.71291L3.19 2.92291C3.362 2.58014 3.59984 2.2746 3.88994 2.02375C4.18003 1.7729 4.5167 1.58165 4.88072 1.46093C5.24474 1.34021 5.62897 1.29239 6.01147 1.32018C6.39398 1.34797 6.76726 1.45084 7.11 1.62291L17.5 6.82291Z\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                                    </g>\r\n                                </svg>\r\n                                <div class=\"centered mt-8\">Preview not available</div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div class=\"d-flex\">\r\n                <div class=\"me-5 storeClass\">{{storeDetails?.storeName}}</div>\r\n                <div class=\"storeBadge mt-1\"><span class=\"badge badge-light-primary text-active-primary\">{{'APP ID: ' +storeDetails?.appId}}</span></div>\r\n            </div>\r\n            <div class=\"mt-5 address\">\r\n                {{storeDetails?.storeProfile?.address}} {{storeDetails?.storeProfile?.pincode}}\r\n            </div>\r\n            <div class=\"mt-10\">\r\n                <div>\r\n                    <div class=\"d-flex mt-3\">\r\n                        <div>\r\n                            <span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                                d=\"M16.6667 17.5V15.8333C16.6667 14.9493 16.3155 14.1014 15.6904 13.4763C15.0653 12.8512 14.2174 12.5 13.3334 12.5H6.66671C5.78265 12.5 4.93481 12.8512 4.30968 13.4763C3.68456 14.1014 3.33337 14.9493 3.33337 15.8333V17.5M13.3334 5.83333C13.3334 7.67428 11.841 9.16667 10 9.16667C8.15909 9.16667 6.66671 7.67428 6.66671 5.83333C6.66671 3.99238 8.15909 2.5 10 2.5C11.841 2.5 13.3334 3.99238 13.3334 5.83333Z\"\r\n                                stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span><span class=\"spocTitle\">{{storeDetails?.spocDetails?.[0]?.name}}</span>\r\n                        </div>\r\n                        <div class=\"ms-5\">\r\n                            <span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <path\r\n                                    d=\"M18.3333 14.0994V16.5994C18.3343 16.8315 18.2867 17.0612 18.1937 17.2739C18.1008 17.4865 17.9644 17.6774 17.7934 17.8343C17.6224 17.9912 17.4205 18.1107 17.2006 18.185C16.9808 18.2594 16.7478 18.287 16.5167 18.2661C13.9523 17.9875 11.4892 17.1112 9.32498 15.7078C7.31151 14.4283 5.60443 12.7212 4.32499 10.7078C2.91663 8.53377 2.04019 6.05859 1.76665 3.48276C1.74583 3.25232 1.77321 3.02006 1.84707 2.80078C1.92092 2.5815 2.03963 2.38 2.19562 2.20911C2.35162 2.03822 2.54149 1.90169 2.75314 1.8082C2.9648 1.71471 3.1936 1.66631 3.42499 1.6661H5.92499C6.32941 1.66212 6.72148 1.80533 7.02812 2.06904C7.33476 2.33275 7.53505 2.69897 7.59165 3.09943C7.69717 3.89949 7.89286 4.68504 8.17499 5.4411C8.2871 5.73937 8.31137 6.06353 8.24491 6.37516C8.17844 6.6868 8.02404 6.97286 7.79998 7.19943L6.74165 8.25776C7.92795 10.3441 9.65536 12.0715 11.7417 13.2578L12.8 12.1994C13.0266 11.9754 13.3126 11.821 13.6243 11.7545C13.9359 11.688 14.26 11.7123 14.5583 11.8244C15.3144 12.1066 16.0999 12.3022 16.9 12.4078C17.3048 12.4649 17.6745 12.6688 17.9388 12.9807C18.203 13.2926 18.3435 13.6907 18.3333 14.0994Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span><span class=\"spocTitle\">{{storeDetails?.spocDetails?.[0]?.contact}}</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"mt-3\">\r\n                    <span class=\"me-3\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                            d=\"M18.3333 5.00065C18.3333 4.08398 17.5833 3.33398 16.6666 3.33398H3.33329C2.41663 3.33398 1.66663 4.08398 1.66663 5.00065M18.3333 5.00065V15.0007C18.3333 15.9173 17.5833 16.6673 16.6666 16.6673H3.33329C2.41663 16.6673 1.66663 15.9173 1.66663 15.0007V5.00065M18.3333 5.00065L9.99996 10.834L1.66663 5.00065\"\r\n                            stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                    </span>\r\n                    <span class=\"spocTitle\">{{storeDetails?.spocDetails?.[0]?.email}}</span>\r\n                </div>\r\n                <div class=\"mt-3\">\r\n                    <div class=\"d-flex mt-3\">\r\n                        <div>\r\n                            <span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <g clip-path=\"url(#clip0_494_87212)\">\r\n                                    <path\r\n                                        d=\"M2.1875 20C1.60734 20 1.05094 19.7695 0.640704 19.3593C0.230468 18.9491 0 18.3927 0 17.8125L0 2.1875C0 0.98 0.98 0 2.1875 0H12.8125C14.02 0 15 0.98 15 2.1875V17.8125C15 17.9187 14.9925 18.0225 14.9775 18.125H17.8125C17.8954 18.125 17.9749 18.0921 18.0335 18.0335C18.0921 17.9749 18.125 17.8954 18.125 17.8125V10.3562C18.125 10.3048 18.1124 10.2542 18.0882 10.2089C18.064 10.1635 18.029 10.1248 17.9862 10.0962L16.6675 9.2175C16.5651 9.14921 16.4771 9.06142 16.4086 8.95913C16.3401 8.85684 16.2924 8.74206 16.2683 8.62135C16.2441 8.50063 16.244 8.37634 16.2679 8.25558C16.2918 8.13481 16.3392 8.01993 16.4075 7.9175C16.4758 7.81507 16.5636 7.72709 16.6659 7.65859C16.7682 7.59009 16.8829 7.5424 17.0037 7.51826C17.1244 7.49412 17.2487 7.49399 17.3694 7.51788C17.4902 7.54177 17.6051 7.58921 17.7075 7.6575L19.0262 8.53625C19.635 8.9425 20 9.625 20 10.3562V17.8125C20 18.3927 19.7695 18.9491 19.3593 19.3593C18.9491 19.7695 18.3927 20 17.8125 20H13.4375C13.3544 19.9999 13.2716 19.989 13.1912 19.9675C13.0675 19.9888 12.9412 20 12.8125 20H9.0625C8.81386 20 8.5754 19.9012 8.39959 19.7254C8.22377 19.5496 8.125 19.3111 8.125 19.0625V17.5H6.875V19.0625C6.875 19.3111 6.77623 19.5496 6.60041 19.7254C6.4246 19.9012 6.18614 20 5.9375 20H2.1875ZM1.875 17.8125C1.875 17.985 2.015 18.125 2.1875 18.125H5V16.5625C5 16.3139 5.09877 16.0754 5.27459 15.8996C5.4504 15.7238 5.68886 15.625 5.9375 15.625H9.0625C9.31114 15.625 9.5496 15.7238 9.72541 15.8996C9.90123 16.0754 10 16.3139 10 16.5625V18.125H12.8125C12.8954 18.125 12.9749 18.0921 13.0335 18.0335C13.0921 17.9749 13.125 17.8954 13.125 17.8125V2.1875C13.125 2.10462 13.0921 2.02513 13.0335 1.96653C12.9749 1.90792 12.8954 1.875 12.8125 1.875H2.1875C2.10462 1.875 2.02513 1.90792 1.96653 1.96653C1.90792 2.02513 1.875 2.10462 1.875 2.1875V17.8125ZM4.6875 7.5H5.3125C5.56114 7.5 5.7996 7.59877 5.97541 7.77459C6.15123 7.9504 6.25 8.18886 6.25 8.4375C6.25 8.68614 6.15123 8.9246 5.97541 9.10041C5.7996 9.27623 5.56114 9.375 5.3125 9.375H4.6875C4.43886 9.375 4.2004 9.27623 4.02459 9.10041C3.84877 8.9246 3.75 8.68614 3.75 8.4375C3.75 8.18886 3.84877 7.9504 4.02459 7.77459C4.2004 7.59877 4.43886 7.5 4.6875 7.5ZM3.75 4.6875C3.75 4.43886 3.84877 4.2004 4.02459 4.02459C4.2004 3.84877 4.43886 3.75 4.6875 3.75H5.3125C5.56114 3.75 5.7996 3.84877 5.97541 4.02459C6.15123 4.2004 6.25 4.43886 6.25 4.6875C6.25 4.93614 6.15123 5.1746 5.97541 5.35041C5.7996 5.52623 5.56114 5.625 5.3125 5.625H4.6875C4.43886 5.625 4.2004 5.52623 4.02459 5.35041C3.84877 5.1746 3.75 4.93614 3.75 4.6875ZM8.75 8.4375C8.75 8.18886 8.84877 7.9504 9.02459 7.77459C9.2004 7.59877 9.43886 7.5 9.6875 7.5H10.3125C10.5611 7.5 10.7996 7.59877 10.9754 7.77459C11.1512 7.9504 11.25 8.18886 11.25 8.4375C11.25 8.68614 11.1512 8.9246 10.9754 9.10041C10.7996 9.27623 10.5611 9.375 10.3125 9.375H9.6875C9.43886 9.375 9.2004 9.27623 9.02459 9.10041C8.84877 8.9246 8.75 8.68614 8.75 8.4375ZM9.6875 3.75H10.3125C10.5611 3.75 10.7996 3.84877 10.9754 4.02459C11.1512 4.2004 11.25 4.43886 11.25 4.6875C11.25 4.93614 11.1512 5.1746 10.9754 5.35041C10.7996 5.52623 10.5611 5.625 10.3125 5.625H9.6875C9.43886 5.625 9.2004 5.52623 9.02459 5.35041C8.84877 5.1746 8.75 4.93614 8.75 4.6875C8.75 4.43886 8.84877 4.2004 9.02459 4.02459C9.2004 3.84877 9.43886 3.75 9.6875 3.75ZM3.75 12.1875C3.75 11.9389 3.84877 11.7004 4.02459 11.5246C4.2004 11.3488 4.43886 11.25 4.6875 11.25H5.3125C5.56114 11.25 5.7996 11.3488 5.97541 11.5246C6.15123 11.7004 6.25 11.9389 6.25 12.1875C6.25 12.4361 6.15123 12.6746 5.97541 12.8504C5.7996 13.0262 5.56114 13.125 5.3125 13.125H4.6875C4.43886 13.125 4.2004 13.0262 4.02459 12.8504C3.84877 12.6746 3.75 12.4361 3.75 12.1875ZM9.6875 11.25H10.3125C10.5611 11.25 10.7996 11.3488 10.9754 11.5246C11.1512 11.7004 11.25 11.9389 11.25 12.1875C11.25 12.4361 11.1512 12.6746 10.9754 12.8504C10.7996 13.0262 10.5611 13.125 10.3125 13.125H9.6875C9.43886 13.125 9.2004 13.0262 9.02459 12.8504C8.84877 12.6746 8.75 12.4361 8.75 12.1875C8.75 11.9389 8.84877 11.7004 9.02459 11.5246C9.2004 11.3488 9.43886 11.25 9.6875 11.25Z\"\r\n                                        fill=\"#667085\" />\r\n                                </g>\r\n                                <defs>\r\n                                    <clipPath id=\"clip0_494_87212\">\r\n                                        <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                    </clipPath>\r\n                                </defs>\r\n                            </svg></span><span class=\"spocTitle\">{{storeDetails?.businessType || '--'}}</span>\r\n                        </div>\r\n                        <div class=\"ms-5\">\r\n                            <span class=\"me-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <path\r\n                                    d=\"M2.68027 5.80366L2.62703 5.88683C2.06898 6.87388 2.66481 8.1213 3.73642 8.2644C3.83351 8.27627 3.92385 8.28255 4.01212 8.28255C4.59027 8.28255 5.10144 8.03453 5.45772 7.6478L6.01105 7.04718L6.5625 7.64953C6.91445 8.03395 7.42446 8.28255 8.00651 8.28255C8.58595 8.28255 9.09889 8.0336 9.45052 7.64953L10.0037 7.04529L10.5569 7.64953C10.9085 8.0336 11.4215 8.28255 12.0009 8.28255C12.5803 8.28255 13.0933 8.0336 13.4449 7.64953L13.9981 7.04529L14.5513 7.64953C14.9029 8.0336 15.4158 8.28255 15.9953 8.28255C16.0806 8.28255 16.1737 8.27625 16.2701 8.2645C17.3653 8.11518 17.9631 6.80091 17.3244 5.80416C17.3244 5.8041 17.3243 5.80405 17.3243 5.80399L15.5661 3.06258L15.5661 3.06258L15.5652 3.06111C15.55 3.03728 15.5125 3.01172 15.4653 3.01172H4.53593C4.48878 3.01172 4.45129 3.03728 4.43609 3.06111L4.43547 3.06208L2.68027 5.80366ZM15.6517 10.7369V13.8689V14.6189H14.9017H5.09955H4.34955V13.8689V10.7374C4.23932 10.7456 4.12781 10.7498 4.01519 10.7498C3.97289 10.7498 3.93086 10.7492 3.88912 10.748V13.8689V15.8034C3.88912 16.4468 4.42303 16.9879 5.09955 16.9879H14.9017C15.5783 16.9879 16.1122 16.4468 16.1122 15.8034V13.8689V10.7482C16.0723 10.7493 16.0323 10.7498 15.9922 10.7498C15.8778 10.7498 15.7642 10.7455 15.6517 10.7369Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"1.5\" />\r\n                            </svg></span><span class=\"spocTitle\">{{storeDetails?.storeType?.type || '--'}}</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"mt-3\">\r\n                    <span>\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <g clip-path=\"url(#clip0_494_87218)\">\r\n                                <path\r\n                                    d=\"M9.99996 4.99935V9.99935L13.3333 11.666M18.3333 9.99935C18.3333 14.6017 14.6023 18.3327 9.99996 18.3327C5.39759 18.3327 1.66663 14.6017 1.66663 9.99935C1.66663 5.39698 5.39759 1.66602 9.99996 1.66602C14.6023 1.66602 18.3333 5.39698 18.3333 9.99935Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </g>\r\n                            <defs>\r\n                                <clipPath id=\"clip0_494_87218\">\r\n                                    <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                </clipPath>\r\n                            </defs>\r\n                        </svg>\r\n                        <span class=\"spocTitle ms-3\">{{timeFormat(storeDetails?.storeProfile?.open)}} - {{timeFormat(storeDetails?.storeProfile?.close)}}</span>\r\n                    </span>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"mt-10\">\r\n            <span class=\"me-5 badge badge-light-default mx-3 mb-5\" *ngFor=\"let file of storeDetails?.attachments;let i=index\"><a [href]=\"file.url\" download class=\"storeBadge\">{{file.name}}</a><span class=\"ms-3 cursor-pointer\" (click)=\"deleteFile(i)\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"13\" viewBox=\"0 0 12 13\" fill=\"none\">\r\n                <path d=\"M9 3.5L3 9.5M3 3.5L9 9.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n            </svg></span></span>\r\n            <input style=\"display: none;\" type=\"file\" #file1 id=\"kt_account_team_size_select_2\" (change)=\"onFileUpload($event)\" />\r\n            <button class=\"btn btn-outline\" (click)=\"file1.click()\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"24\" viewBox=\"0 0 18 24\" fill=\"none\">\r\n                <path\r\n                    d=\"M10.6875 17.7143L10.6875 10.8C11.2163 11.04 11.7788 11.2229 12.375 11.3257L12.375 17.7143C12.375 21.1886 9.6075 24 6.1875 24C2.7675 24 -1.22891e-07 21.1886 -2.74757e-07 17.7143L-7.99294e-07 5.71428C-9.09696e-07 3.18857 2.01375 1.14286 4.5 1.14286C5.52375 1.14286 6.4575 1.49714 7.21125 2.09143C6.975 2.70857 6.82875 3.37143 6.78375 4.05714C6.43887 3.56323 5.94815 3.19368 5.3827 3.00203C4.81724 2.81038 4.20641 2.80658 3.63868 2.99119C3.07096 3.17579 2.57583 3.53921 2.22503 4.0288C1.87422 4.51839 1.68595 5.10873 1.6875 5.71428L1.6875 17.7143C1.6875 20.24 3.70125 22.2857 6.1875 22.2857C8.67375 22.2857 10.6875 20.24 10.6875 17.7143ZM7.3125 15.4286C7.3125 16.0571 6.80625 16.5714 6.1875 16.5714C5.56875 16.5714 5.0625 16.0571 5.0625 15.4286L5.0625 6.85714L3.375 6.85714L3.375 15.4286C3.375 16.1863 3.67132 16.9131 4.19876 17.4489C4.72621 17.9847 5.44158 18.2857 6.1875 18.2857C6.93342 18.2857 7.64879 17.9847 8.17624 17.4489C8.70368 16.9131 9 16.1863 9 15.4286L9 9.66857C8.27675 9.0123 7.70119 8.20542 7.3125 7.30286L7.3125 15.4286ZM12.375 3.42857L9 3.42857L9 5.71428L12.375 5.71428L12.375 9.14286L14.625 9.14286L14.625 5.71428L18 5.71428L18 3.42857L14.625 3.42857L14.625 -2.54663e-06L12.375 -2.44828e-06L12.375 3.42857Z\"\r\n                    fill=\"#475467\" />\r\n            </svg>\r\n            </span>Attach File</button>\r\n        </div>\r\n    </div>\r\n</div>","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject } from 'rxjs';\r\n\r\n\r\n@Component({\r\n  selector: 'lib-add-floor',\r\n  standalone: false,\r\n  templateUrl: './add-floor.component.html',\r\n  styleUrl: './add-floor.component.scss'\r\n})\r\nexport class AddFloorComponent implements OnInit, OnDestroy {\r\n    floorNo:number = 1\r\n  \r\n    private destroy$ = new Subject();\r\n  \r\n    constructor(public modal:NgbActiveModal) {}\r\n  \r\n    ngOnInit(): void {\r\n     \r\n    }\r\n  \r\n    ngOnDestroy(): void {\r\n      this.destroy$.next(true);\r\n      this.destroy$.complete();\r\n    }\r\n  \r\n  \r\n    floorDec() {\r\n      if(this.floorNo >= 2) {\r\n        this.floorNo--;\r\n      }\r\n    }\r\n  \r\n    floorInc() {\r\n      this.floorNo++;\r\n    }\r\n  \r\n  \r\n    createLayout() {\r\n      let params = {\r\n        floorNumber:this.floorNo,\r\n      }\r\n\r\n      this.modal.dismiss(params)\r\n    }\r\n  \r\n}\r\n","    <div class=\"card scroll\">\r\n        <div class=\"card-header border-0\">\r\n            <div class=\"card-title\">\r\n                <span class=\"card-label\">Add Floors</span>\r\n            </div>\r\n        </div>\r\n        <div class=\"card-body storeCard\">\r\n            <div class=\"selectStore\">\r\n                <div class=\"mt-5\">No of floors</div>\r\n                <div class=\"mt-2\">\r\n                    <div style=\"position: relative;\"><svg role=\"button\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"dec\" (click)=\"floorDec()\">\r\n                            <path d=\"M4.16602 10H15.8327\" stroke=\"#667085\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\"></path>\r\n                        </svg><input readonly=\"\" type=\"number\" [(ngModel)]=\"floorNo\" id=\"floor\"\r\n                            autocomplete=\"off\" class=\"form-control inc-dec-input\"\r\n                            ><svg role=\"button\" width=\"16\" height=\"16\"\r\n                            viewBox=\"0 0 16 16\" fill=\"none\" class=\"inc\" (click)=\"floorInc()\">\r\n                            <path d=\"M8.00065 3.33337V12.6667M3.33398 8.00004H12.6673\" stroke=\"#667085\"\r\n                                stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                        </svg></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"card-footer storeCard text-end border-0\">\r\n            <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n            <button class=\"btn btn-sm btn-primary\" (click)=\"createLayout()\">Save</button>\r\n        </div>\r\n    </div>\r\n","import { Component } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-clear-all-steps',\r\n  standalone: false,\r\n  templateUrl: './clear-all-steps.component.html',\r\n  styleUrl: './clear-all-steps.component.scss'\r\n})\r\nexport class ClearAllStepsComponent {\r\n  constructor(public modal:NgbActiveModal){}\r\n\r\n}\r\n","<div class=\"header mb-5\" >\r\n    Clear all steps\r\n</div>\r\n<div class=\"description mb-7\">\r\n    Are you sure you want to clear all the steps for this layout? Please note that this action cannot be undone.\r\n</div>\r\n<div class=\"d-flex align-items-center justify-content-end\">\r\n    <button class=\"btn btn-outline bg-white me-5\" (click)=\"modal.close()\" >Cancel</button>\r\n    <button class=\"btn btn-sm btn-danger\" (click)=\"modal.close({message:'confirm'})\"  >Clear All Steps</button>\r\n</div>","import { Component } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-delete-layout',\r\n  standalone: false,\r\n  templateUrl: './delete-layout.component.html',\r\n  styleUrl: './delete-layout.component.scss'\r\n})\r\nexport class DeleteLayoutComponent {\r\n\r\n  constructor(public modal:NgbActiveModal){}\r\n\r\n}\r\n","<div class=\"header mb-5\" >\r\n    Delete layout\r\n</div>\r\n<div class=\"description mb-4\">\r\n    Are you sure you want to delete this layout? Please note that deleting this layout will also remove all associated unpublished VM and PID’s.\r\n</div>\r\n<div class=\"description mb-7\">\r\n    This action cannot be undone.\r\n</div>\r\n<div class=\"d-flex align-items-center justify-content-end\">\r\n    <button class=\"btn btn-outline bg-white me-5\" (click)=\"modal.close()\" >Cancel</button>\r\n    <button class=\"btn btn-sm btn-danger\" (click)=\"modal.close({message:'confirm'})\">Delete</button>\r\n</div>","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: 'lib-select-plano',\r\n  templateUrl: './custom-select.component.html',\r\n  styleUrl: './custom-select.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomSelectComponent implements OnChanges, OnInit, OnDestroy {\r\n  private readonly destroy$ = new Subject<void>();\r\n \r\n  @HostListener('document:click', ['$event'])\r\n  onClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n    if (!target.closest('.dropdown')) {\r\n      this.showDropdown = false;\r\n    }\r\n  }\r\n \r\n  @Input() items: any\r\n  @Input() searchField: string\r\n  @Input() multi: boolean\r\n  @Input() idField: string\r\n  @Input() selectedValues: any = []\r\n  @Input() disabled: boolean | undefined\r\n  @Input() label: string\r\n  @Input() compact: boolean = false\r\n \r\n  @Output() selected = new EventEmitter<any>()\r\n  filteredValues: any = []\r\n  showDropdown: boolean\r\n  searchValue: string\r\n  instanceId: any;\r\n\r\n  trackByItem = (_: number, item: any) =>\r\n    this.idField && item ? item[this.idField] : item;\r\n \r\n \r\n  constructor(private cd: ChangeDetectorRef, private authService:StoreBuilderService) { }\r\n  ngOnInit(): void {\r\n    this.instanceId = crypto.randomUUID();\r\n    this.authService.dropDownTrigger\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((e) => {\r\n        if (e && e !== this.instanceId && this.showDropdown) {\r\n          this.showDropdown = false;\r\n          this.cd.detectChanges();\r\n        }\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n \r\n    if (changes['items'] && this.items?.length) {\r\n      this.initializeItems();\r\n    }\r\n    if (changes['selectedValues'] && Array.isArray(changes['selectedValues']?.currentValue) && changes['selectedValues']?.currentValue?.length > 0 && changes['selectedValues']?.currentValue[0]) {            \r\n      this.updateSelectedValues();\r\n    }\r\n  }\r\n \r\n  initializeItems() {\r\n    this.filteredValues = this.items.map((item: any) => ({ ...item }));\r\n    this.updateSelectedValues()\r\n  }\r\n \r\n  updateSelectedValues() {    \r\n    this.selectedValues?.forEach((selectedItem: any) => {\r\n      const item = this.filteredValues?.find((filteredItem: any) => filteredItem?.[this.idField] === selectedItem?.[this.idField]);\r\n      if (item) {\r\n        item.isSelected = true;\r\n      }\r\n    });\r\n   \r\n  }\r\n \r\n  openDropdown(event: any) {\r\n    this.authService.dropDownTrigger.next(this.instanceId)\r\n    event.stopPropagation();\r\n    this.showDropdown = !this.showDropdown;\r\n  }\r\n \r\n  onInput(event: any) {\r\n    if (!event.target.value) {\r\n      this.filteredValues = [...this.items];\r\n    } else {\r\n      const searchTerm = event.target.value.toLowerCase();\r\n      this.filteredValues = this.items.filter((item: any) =>\r\n        item[this.searchField].toLowerCase().includes(searchTerm)\r\n      );\r\n    }\r\n    this.updateSelectedValues();\r\n    this.cd.detectChanges();\r\n  }\r\n \r\n  onSelect(event: any, item: any) {    \r\n    if (this.multi) {\r\n      if (event.currentTarget.checked) {\r\n        this.selectedValues.push(item );        \r\n      } else {\r\n        this.selectedValues = this.selectedValues.filter((elem: any) => elem[this.idField] !== item[this.idField]);\r\n      }\r\n    } else {\r\n      this.selectedValues = [{ ...item }];\r\n      this.filteredValues.forEach((element:any) => {\r\n        if(element[this.idField] !== item[this.idField]){\r\n          element.isSelected = false\r\n        }\r\n      });\r\n      this.showDropdown = false;\r\n    }\r\n \r\n    const valuesToEmit = this.selectedValues.map((value: any) => {\r\n      const selectedItem = { ...value };\r\n      delete selectedItem.isSelected;\r\n      return selectedItem;\r\n    });\r\n \r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n \r\n  }\r\n \r\n  onSelectAll(event: any) {\r\n    const selectAll = event.currentTarget.checked;\r\n    this.filteredValues.forEach((item: any) => item.isSelected = selectAll);\r\n \r\n    if (selectAll) {\r\n      this.selectedValues = [...this.filteredValues];\r\n    } else {\r\n      this.selectedValues = [];\r\n    }\r\n \r\n    const valuesToEmit = this.selectedValues.map((value: any) => {\r\n      const { isSelected, ...selectedItem } = value;\r\n      return selectedItem;\r\n    });\r\n \r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n  }\r\n \r\n \r\n  emitSelectedValues(values: any[]) {\r\n    if (this.multi) {\r\n      this.selected.emit(values);\r\n    } else {\r\n      this.selected.emit(values[0]);\r\n    }\r\n  }\r\n \r\n  checkIfAllSelected() {\r\n    return this.filteredValues.every((item: any) => item.isSelected);\r\n  }\r\n}","<div class=\"outer-container\" [class.compact]=\"compact\">\r\n    <div [ngClass]=\"disabled ? 'disable-input':''\"  (click)=\"openDropdown($event)\"  class=\"form-select\">\r\n    <ng-container *ngIf=\"multi\" >\r\n    {{selectedValues?.length}} {{label}} Selected    \r\n    </ng-container>\r\n    <ng-container *ngIf=\"!multi\" >\r\n        {{selectedValues?.[0]?.[searchField]}}\r\n    </ng-container>\r\n    </div>\r\n    <div *ngIf=\"showDropdown\" class=\"input-container dropdown\" >\r\n        <div class=\"w-100 input-wrapper\">\r\n        <input [(ngModel)]=\"searchValue\" placeholder=\"Search\"  (input)=\"onInput($event)\" type=\"text\">  \r\n        <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n            <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>  \r\n        </div>\r\n        <ul>\r\n            <li *ngIf=\"multi && filteredValues?.length\">\r\n                <label class=\"form-check\" for=\"selectAll\">\r\n                    <input (change)=\"onSelectAll($event)\" [checked]=\"checkIfAllSelected()\" class=\"form-check-input me-3\" type=\"checkbox\"\r\n                        id=\"selectAll\">\r\n                    <span class=\"form-check-label\" >\r\n                        Select All\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngFor=\"let item of filteredValues; trackBy: trackByItem\" [ngClass]=\"item.isSelected && !multi ? 'selected' : ''\" >\r\n                <label [for]=\"item[idField] + instanceId\" [ngClass]=\"multi  ? '': 'ps-0'\" class=\"form-check\">\r\n                    <input [ngClass]=\"multi  ? '': 'd-none'\" (change)=\"onSelect($event, item)\" [(ngModel)]=\"item.isSelected\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\"\r\n                        [id]=\"item[idField] + instanceId\">\r\n                    <span class=\"form-check-label\" >\r\n                        {{item[searchField]}}\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngIf=\"!filteredValues?.length\" >\r\n                <span class=\"d-flex align-items-center justify-content-center\" >No data found</span>\r\n            </li>\r\n        </ul>  \r\n    </div>  \r\n   \r\n</div>","import { FormControl } from '@angular/forms';\r\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { HeaderFilter } from '../../interfaces/layout-builder.interface';\r\nimport { NgbModal, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ChangeDetectorRef, Component, ElementRef, HostListener, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { StoreOffcanvasComponentComponent } from '../store-offcanvas-component/store-offcanvas-component.component';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { AddFloorComponent } from './popups/add-floor/add-floor.component';\r\nimport { ClearAllStepsComponent } from './popups/clear-all-steps/clear-all-steps.component';\r\nimport { DeleteLayoutComponent } from './popups/delete-layout/delete-layout.component';\r\nimport * as XLSX from 'xlsx';\r\n\r\n\r\n\r\n@Component({\r\n  selector: 'lib-create-layout',\r\n  templateUrl: './create-layout.component.html',\r\n  styleUrl: './create-layout.component.scss'\r\n})\r\nexport class CreateLayoutComponent implements OnInit, OnDestroy {\r\n  floorsInput = new FormControl()\r\n  @ViewChild('gridCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('widgetCanvas', { static: false }) widgetCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('scrollContainer') scrollContainerRef!: ElementRef;\r\n\r\n\r\n  gridWidth = 1;\r\n  gridHeight = 1;\r\n\r\n  private ctx!: CanvasRenderingContext2D;\r\n  private canvas!: HTMLCanvasElement;\r\n\r\n  private widgetCtx!: CanvasRenderingContext2D;\r\n  private widgetCanvas!: HTMLCanvasElement;\r\n\r\n  elementType: 'wall' | 'facade' | 'opening' | 'entrance' = 'wall'\r\n  layoutPolygon: any[] = [[\r\n    {\r\n      \"x\": 100,\r\n      \"y\": 100\r\n    },\r\n    {\r\n      \"x\": 100,\r\n      \"y\": 100\r\n    },\r\n    {\r\n      \"elementType\": \"wall\",\r\n      \"distance\": 0,\r\n      \"unit\": \"ft\",\r\n      \"direction\": \"right\",\r\n      \"angle\": 90,\r\n      \"elementNumber\": 1\r\n    }\r\n  ]]\r\n\r\n  popupVisible = false;\r\n  popupPosition: any = { x: 100, y: 100 };\r\n  selectedLine: any\r\n  selectedLineIndex: number | null\r\n  movePixels = 0;\r\n  moveAngle = 0;\r\n  unit: 'ft' = 'ft'\r\n  moveDirection: 'left' | 'right' | 'up' | 'down' = 'right';\r\n\r\n  layoutMode: 'full' | 'half' = 'half'\r\n\r\n  elementSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  directionSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  lineOptionsSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  widgetElementSelect: { show: boolean } = { show: false }\r\n  layoutOptionSelect: { show: boolean, } = { show: false }\r\n  floorSelect: { show: boolean, deleteIndex: number | null } = { show: false, deleteIndex: null }\r\n\r\n  private scale = 1;\r\n  panOffset = { x: 0, y: 0 };\r\n\r\n\r\n  breakpoints: number[] = [0, 360];\r\n  @ViewChild('circle') circleRef!: ElementRef;\r\n  @ViewChild('pointer') pointerRef!: ElementRef;\r\n\r\n  lines: { transform: string; highlight: boolean; invisible: boolean }[] = [];\r\n  private minAngle!: number;\r\n  private maxAngle!: number;\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  headerData: HeaderFilter | null | undefined;\r\n\r\n  planoStoreList: any[] = []\r\n  selectedStore: any\r\n  selectedFloor: any\r\n\r\n  undoStack: any[] = [];\r\n  redoStack: any[] = [];\r\n\r\n  planoIds: string[] = []\r\n\r\n  itemsPerPage = 1\r\n  currentPage = 0\r\n  totalItems = 1\r\n  paginationSizes = [1]\r\n  pageSize = 1\r\n\r\n  pixelPerMetre: number = 50\r\n\r\n  cumulativeRotation = 0\r\n\r\n\r\n\r\n  onPageChange(val: number) {\r\n    this.selectedStore = this.planoStoreList[val - 1];\r\n    this.selectedFloor = this.selectedStore.floors[0];\r\n    this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n    this.redoStack = [];\r\n    this.undoStack = [];\r\n  }\r\n\r\n  saveStateToUndo(): void {\r\n    this.undoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n  }\r\n\r\n  undo(): void {\r\n    if (this.undoStack.length > 0) {\r\n      this.redoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n\r\n      this.layoutPolygon = this.undoStack.pop();\r\n\r\n      this.redrawCanvas()\r\n    }\r\n  }\r\n\r\n  redo(): void {\r\n    if (this.redoStack.length > 0) {\r\n      this.undoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n\r\n      this.layoutPolygon = this.redoStack.pop();\r\n\r\n      this.redrawCanvas()\r\n    }\r\n  }\r\n\r\n  constructor(private cd: ChangeDetectorRef, private renderer: Renderer2, private route: ActivatedRoute,\r\n    private apiService: StoreBuilderService, private router: Router, private offcanvasService: NgbOffcanvas, private toastService: ToastService, private modalDef: NgbModal) {\r\n    this.headerData = JSON.parse(localStorage.getItem('header-filters') as string)\r\n  }\r\n\r\n  initializeLayout() {\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    this.layoutPolygon = [\r\n      [\r\n        {\r\n          \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n          \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n        },\r\n        {\r\n          \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n          \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n        },\r\n        {\r\n          \"elementType\": \"wall\",\r\n          \"distance\": 0,\r\n          \"unit\": \"ft\",\r\n          \"direction\": \"right\",\r\n          \"angle\": 90,\r\n          \"elementNumber\": 1\r\n        }\r\n      ]\r\n    ]\r\n    this.openWidget({\r\n      \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n      \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n    })\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.canvas = this.canvasRef.nativeElement;\r\n    this.ctx = this.canvas.getContext('2d')!;\r\n\r\n    this.canvas.width = 10000;\r\n    this.canvas.height = 10000;\r\n\r\n    this.drawGrid();\r\n\r\n    this.canvas.addEventListener('mousedown', this.onMouseDown.bind(this));\r\n    this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));\r\n\r\n    this.minAngle = Math.min(...this.breakpoints);\r\n    this.maxAngle = Math.max(...this.breakpoints);\r\n\r\n    for (let i = 0; i < 360; i += 45) {\r\n      this.lines.push({\r\n        transform: `rotate(${i}deg)`,\r\n        highlight: false,\r\n        invisible: i < this.minAngle || i > this.maxAngle\r\n      });\r\n    }\r\n\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.id) {\r\n          this.planoIds = params.id.split(',') || [];\r\n          this.getPlanoData()\r\n        }\r\n      });\r\n\r\n\r\n  }\r\n\r\n  onFloorSelect(floorId: string) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === floorId)[0]\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n    this.redoStack = []\r\n    this.undoStack = []\r\n  }\r\n\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  onStoreChange(event: any) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    const index = this.planoStoreList.findIndex(item => item.planoId === event.planoId);\r\n    this.currentPage = index + 1\r\n    this.selectedStore = event;\r\n    this.selectedFloor = this.selectedStore.floors[0];\r\n    this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n    this.redoStack = [];\r\n    this.undoStack = [];\r\n  }\r\n\r\n  openOffCanva() {\r\n    let canvaRef = this.offcanvasService.open(StoreOffcanvasComponentComponent, { position: 'end', panelClass: 'set-height' })\r\n    canvaRef.componentInstance.store = this.selectedStore;\r\n    canvaRef.componentInstance.clientId = this.headerData?.client;\r\n    canvaRef.componentInstance.id = this.selectedStore.planoId;\r\n  }\r\n\r\n  getPlanoData() {\r\n    const payload = {\r\n      id: this.planoIds\r\n    }\r\n\r\n    this.apiService.getPlano(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.planoStoreList = res.data\r\n        this.totalItems = res.data.length\r\n        if (!this.selectedStore) {\r\n          this.selectedStore = this.planoStoreList[0]\r\n        } else {\r\n          this.selectedStore = this.planoStoreList.filter((store: any) => store.planoId === this.selectedStore.planoId)[0]\r\n        }\r\n        if (!this.selectedFloor) {\r\n          this.selectedFloor = this.selectedStore.floors[0]\r\n        } else {\r\n          this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === this.selectedFloor._id)[0]\r\n          if (!this.selectedFloor) {\r\n            this.selectedFloor = this.selectedStore.floors[0]\r\n          }\r\n        }\r\n\r\n        this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false })\r\n        this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  updateFloorLayout() {\r\n    const payload = {\r\n      id: this.selectedFloor._id,\r\n      layoutPolygon: this.layoutPolygon.map((segment) => {\r\n        const [point1, point2, properties] = segment\r\n        properties.detailedDistance = properties.distance\r\n        return properties\r\n      }),\r\n      status: 'draft'\r\n    }\r\n\r\n    this.apiService.updateFloorLayout(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code === 200) {\r\n          this.getPlanoData()\r\n          this.toastService.getSuccessToast(res.message)\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  deleteFloor(index: number) {\r\n\r\n    this.floorSelect = {\r\n      show: !this.floorSelect.show,\r\n      deleteIndex: null\r\n    };\r\n\r\n    const modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        const payload = {\r\n          id: this.selectedStore.floors[index]._id,\r\n        }\r\n    \r\n        this.apiService.deleteFloor(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res.code === 200) {\r\n              this.getPlanoData()\r\n              this.toastService.getSuccessToast(res.message)\r\n            }\r\n          },\r\n          error: (err) => {\r\n            console.log(err)\r\n          }\r\n        })\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  addFloor(planoId: string, floorCount: number) {\r\n    const payload = {\r\n      id: planoId,\r\n      floorNumber: floorCount\r\n    };\r\n\r\n    this.apiService.addFloor(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code === 200) {\r\n          this.getPlanoData()\r\n          this.toastService.getSuccessToast(res.message)\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onSaveAsDraft() {\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n\r\n    this.updateFloorLayout()\r\n\r\n  }\r\n\r\n  onConfigure() {\r\n    if (this.planoStoreList.length === 1) {\r\n      for (let index = 0; index < this.selectedStore.floors.length; index++) {\r\n        let layoutInstruction\r\n        if (this.selectedStore.floors[index]._id === this.selectedFloor._id) {\r\n          layoutInstruction = this.layoutPolygon.map((line) => {\r\n            const [stert, end, properties] = line\r\n            return properties\r\n          })\r\n        } else {\r\n          layoutInstruction = this.selectedStore.floors[index].layoutPolygon\r\n        }\r\n        if (!this.isFloorCompleted(layoutInstruction)) {\r\n          this.toastService.getErrorToast(`Please complete ${this.selectedStore.floors[index].floorName}`)\r\n          return\r\n        }\r\n      }\r\n    } else if (this.planoStoreList.length > 1) {\r\n      for (let i = 0; i < this.planoStoreList.length; i++) {\r\n        for (let j = 0; j < this.planoStoreList[i].floor.length; j++) {\r\n          let layoutInstruction\r\n          if (this.planoStoreList[i].floors[j]._id === this.selectedFloor._id) {\r\n            layoutInstruction = this.layoutPolygon.map((line) => {\r\n              const [stert, end, properties] = line\r\n              return properties\r\n            })\r\n          } else {\r\n            layoutInstruction = this.planoStoreList[i].floor[j].layoutPolygon\r\n          }\r\n          if (!this.isFloorCompleted(layoutInstruction)) {\r\n            this.toastService.getErrorToast(`Please complete ${this.planoStoreList[i].floor[j].floorName} of ${this.planoStoreList[i].storeName}`)\r\n            return\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    this.updateFloorLayout()\r\n    this.router.navigate(['/manage/planogram/layout-builder/summary'], {\r\n      queryParamsHandling: 'merge'\r\n    });\r\n\r\n  }\r\n\r\n  drawWidgetRing() {\r\n    this.widgetCanvas = this.widgetCanvasRef.nativeElement;\r\n    this.widgetCtx = this.widgetCanvas.getContext('2d')!;\r\n\r\n    this.widgetCanvas.width = 229;\r\n    this.widgetCanvas.height = 229;\r\n    this.widgetCtx.clearRect(0, 0, this.widgetCanvas.width, this.widgetCanvas.height);\r\n\r\n    const direction: any = this.moveDirection\r\n    const centerX = this.widgetCanvas.width / 2;\r\n    const centerY = this.widgetCanvas.height / 2;\r\n    const outerRadius = 114.5;\r\n    const innerRadius = 85;\r\n\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, outerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fillStyle = '#F9FAFB';\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'destination-out';\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, innerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'source-over';\r\n\r\n    this.widgetCtx.beginPath();\r\n    let startAngle, endAngle, color;\r\n    switch (direction) {\r\n      case 'down':\r\n        startAngle = 0;\r\n        endAngle = Math.PI;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'up':\r\n        startAngle = Math.PI;\r\n        endAngle = Math.PI * 2;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'right':\r\n        startAngle = Math.PI * 1.5;\r\n        endAngle = Math.PI * 0.5;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'left':\r\n        startAngle = Math.PI * 0.5;\r\n        endAngle = Math.PI * 1.5;\r\n        color = '#EAF7FF';\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    this.widgetCtx.moveTo(centerX, centerY);\r\n    this.widgetCtx.arc(centerX, centerY, outerRadius, startAngle, endAngle);\r\n    this.widgetCtx.lineTo(centerX, centerY);\r\n    this.widgetCtx.fillStyle = color;\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'destination-out';\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, innerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'source-over';\r\n  }\r\n\r\n  private updateWidgetPointer(): void {\r\n    let angle: number;\r\n    switch (this.moveDirection) {\r\n      case 'right':\r\n        angle = 0 + this.moveAngle;\r\n        break;\r\n      case 'down':\r\n        angle = 90 + this.moveAngle;\r\n        break;\r\n      case 'left':\r\n        angle = 180 + this.moveAngle;\r\n        break;\r\n      case 'up':\r\n        angle = 270 + this.moveAngle;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n    const pointer = this.pointerRef?.nativeElement;\r\n    this.renderer.setStyle(pointer, 'transform', `rotate(${angle}deg)`);\r\n\r\n    this.lines.forEach((line) => {\r\n      const lineAngle = parseInt(line.transform.replace('rotate(', ''), 10);\r\n      line.highlight = angle >= lineAngle && angle >= this.minAngle && lineAngle <= this.maxAngle;\r\n    });\r\n\r\n\r\n  }\r\n\r\n\r\n  drawGrid(): void {\r\n    this.ctx.save();\r\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n    this.ctx.scale(this.scale, this.scale);\r\n    this.ctx.translate(this.panOffset.x, this.panOffset.y);\r\n\r\n\r\n    // for (let x = 0; x <= this.canvas.width; x += this.gridWidth) {\r\n    //   for (let y = 0; y <= this.canvas.height; y += this.gridHeight) {\r\n    //     this.ctx.beginPath();\r\n    //     this.ctx.arc(x, y, 1, 0, Math.PI * 2);\r\n    //     this.ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\r\n    //     this.ctx.fill();\r\n    //   }\r\n    // }\r\n\r\n    this.ctx.restore();\r\n  }\r\n\r\n  drawPolygon(polygon = this.layoutPolygon) {\r\n    if (polygon.length < 1) return; // If the polygon has no edges, exit early.\r\n\r\n    this.ctx.save(); // Save the current canvas state.\r\n    this.ctx.scale(this.scale, this.scale); // Scale the canvas context to match the desired scale.\r\n    this.ctx.translate(this.panOffset.x, this.panOffset.y);\r\n\r\n\r\n    // Function to draw an arrowhead at a specific location and angle.\r\n    function drawArrowhead(ctx: any, x: any, y: any, angle: any) {\r\n      const size = 5; // Define the size of the arrowhead.\r\n      ctx.save(); // Save the current canvas state.\r\n      ctx.translate(x, y); // Move the context to the arrowhead position.\r\n      ctx.rotate(angle); // Rotate the context to match the arrow's angle.\r\n      ctx.beginPath(); // Start a new path.\r\n      ctx.moveTo(0, 0); // Move to the tip of the arrowhead.\r\n      ctx.lineTo(-size, -size / 2); // Draw one side of the arrowhead.\r\n      ctx.lineTo(-size, size / 2); // Draw the other side of the arrowhead.\r\n      ctx.closePath(); // Close the arrowhead path.\r\n      ctx.fillStyle = 'black'; // Set the arrowhead color.\r\n      ctx.fill(); // Fill the arrowhead.\r\n      ctx.restore(); // Restore the previous canvas state.\r\n    }\r\n\r\n    this.ctx.beginPath(); // Begin the main polygon path.\r\n    polygon.forEach((edge, edgeIndex) => {\r\n      const point = edge[0]; // Starting point of the edge.\r\n      const nextPoint = edge[1]; // Ending point of the edge.\r\n      const properties = edge[2]; // Properties of the edge (e.g., labels, distances).\r\n\r\n      // Draw the main polygon edge.\r\n      if (edgeIndex === 0) this.ctx.moveTo(point.x, point.y); // Move to the first edge starting point.\r\n      this.ctx.lineTo(nextPoint.x, nextPoint.y); // Draw a line to the next point.\r\n\r\n      // Calculate the perpendicular offset for the bounding box.\r\n      const dx = nextPoint.x - point.x; // X-difference between start and end points.\r\n      const dy = nextPoint.y - point.y; // Y-difference between start and end points.\r\n      const length = Math.sqrt(dx * dx + dy * dy); // Length of the edge.\r\n      const offsetX = (dy / length) * 20; // Offset in the X direction.\r\n      const offsetY = (-dx / length) * 20; // Offset in the Y direction.\r\n\r\n      // Define the bounding box points.\r\n      const boxPoints = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY },\r\n      ];\r\n\r\n      // Draw the bounding box.\r\n      this.ctx.beginPath();\r\n      this.ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n      boxPoints.forEach((pt, index) => {\r\n        if (properties.elementType === 'entrance') {\r\n          if (index < 2) {\r\n            this.ctx.lineTo(pt.x, pt.y)\r\n          }\r\n        } else {\r\n          this.ctx.lineTo(pt.x, pt.y); // Draw each edge of the box.\r\n        }\r\n      });\r\n      if (properties.elementType === 'opening') {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#F9FAFB'\r\n\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      } else {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#1D2939'\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      }\r\n\r\n\r\n      // Position text in the middle of the bounding box.\r\n      const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n      const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n      this.ctx.save(); // Save the current canvas state.\r\n      this.ctx.translate(textX, textY); // Move the context to the text position.\r\n\r\n      // Rotate text based on the edge direction.\r\n      if (dx === 0) {\r\n        this.ctx.rotate(-Math.PI / 2); // Rotate for vertical edges.\r\n      } else if (dy !== 0) {\r\n        const angle = Math.atan2(dy, dx); // Calculate angle for diagonal edges.\r\n        this.ctx.rotate(angle); // Rotate the text to match the angle.\r\n      }\r\n\r\n      // Draw the edge properties as text.\r\n      this.ctx.font = '12px Arial'; // Set the font style and size.\r\n      this.ctx.fillStyle = 'black'; // Set the text color.\r\n      this.ctx.textAlign = 'center'; // Align text to the center.\r\n      this.ctx.textBaseline = 'middle'; // Align text vertically in the middle.\r\n      this.ctx.fillText(\r\n        `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n        0,\r\n        0\r\n      );\r\n      this.ctx.restore(); // Restore the previous canvas state.\r\n\r\n      if (properties.distance >= 4) {\r\n        // Define the midpoints of the left and right edges of the bounding box.\r\n        const centerX = textX;\r\n        const centerY = textY;\r\n        const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n        const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n        const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n        const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n        // Helper function to adjust points by a specific distance.\r\n        function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n          const angle = Math.atan2(y2 - y1, x2 - x1); // Calculate the angle.\r\n          return {\r\n            x: x1 + Math.cos(angle) * distance, // Adjust X by distance.\r\n            y: y1 + Math.sin(angle) * distance, // Adjust Y by distance.\r\n          };\r\n        }\r\n\r\n        // Define the arrow line start and end points for the right side.\r\n        const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n        const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n\r\n        // Define the arrow line start and end points for the left side.\r\n        const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n        const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n        // Draw the right arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(rightStart.x, rightStart.y);\r\n        this.ctx.lineTo(rightEnd.x, rightEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n        drawArrowhead(this.ctx, rightEnd.x, rightEnd.y, rightAngle); // Draw the arrowhead.\r\n\r\n        // Draw the left arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(leftStart.x, leftStart.y);\r\n        this.ctx.lineTo(leftEnd.x, leftEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n        drawArrowhead(this.ctx, leftEnd.x, leftEnd.y, leftAngle); // Draw the arrowhead.\r\n\r\n      }\r\n\r\n      // For Entrance\r\n      if (properties.elementType === 'entrance') {\r\n        // Calculate the angle of the main line (edge) in radians.\r\n        const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n        // Add 15 degrees to the angle for the entrance line.\r\n        const entranceAngle = angle + (15 * Math.PI) / 180; // Convert 15 degrees to radians.\r\n\r\n        // Define the length of the entrance line.\r\n        const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n\r\n        // Calculate the endpoint of the entrance line based on the angle.\r\n        const endPoint = {\r\n          x: point.x + Math.cos(entranceAngle) * lineLength,\r\n          y: point.y + Math.sin(entranceAngle) * lineLength,\r\n        };\r\n\r\n        // Draw the entrance line.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(point.x, point.y);\r\n        this.ctx.lineTo(endPoint.x, endPoint.y);\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#1D2939'\r\n        this.ctx.stroke();\r\n      }\r\n\r\n\r\n    });\r\n\r\n    this.ctx.restore(); // Restore the original canvas state.\r\n  }\r\n\r\n  @HostListener('wheel', ['$event'])\r\n  onMouseWheel(event: WheelEvent) {\r\n    if (event.ctrlKey) {\r\n      event.preventDefault();\r\n      const scaleFactor = event.deltaY < 0 ? 1.01 : 1 / 1.01;\r\n      this.adjustZoom(event, scaleFactor);\r\n    }\r\n  }\r\n\r\n  adjustZoom(event: MouseEvent, scaleFactor: number): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n\r\n    const mouseX = (event.clientX - rect.left - this.panOffset.x) / this.scale;\r\n    const mouseY = (event.clientY - rect.top - this.panOffset.y) / this.scale;\r\n\r\n    this.scale *= scaleFactor;\r\n\r\n    this.panOffset.x -= mouseX * (scaleFactor - 1) * this.scale;\r\n    this.panOffset.y -= mouseY * (scaleFactor - 1) * this.scale;\r\n\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  resetZoom(): void {\r\n    this.scale = 1;\r\n    this.panOffset = { x: 0, y: 0 };\r\n    this.redrawCanvas();\r\n  }\r\n\r\n\r\n\r\n  transformPoint(point: { x: number; y: number }): { x: number; y: number } {\r\n    return {\r\n      x: point.x * this.scale + this.panOffset.x,\r\n      y: point.y * this.scale + this.panOffset.y,\r\n    };\r\n  }\r\n\r\n  drawLine(ctx: CanvasRenderingContext2D, line: { x: number; y: number }[]): void {\r\n    if (line.length < 2) return;\r\n\r\n    ctx.beginPath();\r\n    ctx.moveTo(line[0].x, line[0].y);\r\n    for (let i = 1; i < line.length; i++) {\r\n      ctx.lineTo(line[i].x, line[i].y);\r\n    }\r\n    ctx.stroke();\r\n  }\r\n\r\n\r\n\r\n\r\n  redrawCanvas(): void {\r\n    this.drawGrid();\r\n    this.drawPolygon();\r\n  }\r\n\r\n\r\n\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onOutsideClick(event: MouseEvent): void {\r\n    const clickedInside1 = (event.target as HTMLElement).closest('.elipsis-icon-dropdown');\r\n    if (!clickedInside1) {\r\n      this.lineOptionsSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside2 = (event.target as HTMLElement).closest('.direction-dropdown');\r\n    if (!clickedInside2) {\r\n      this.directionSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside3 = (event.target as HTMLElement).closest('.element-type-dropdown');\r\n    if (!clickedInside3) {\r\n      this.elementSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside4 = (event.target as HTMLElement).closest('.widget-element-type-dropdown');\r\n    if (!clickedInside4) {\r\n      this.widgetElementSelect = { show: false };\r\n    }\r\n\r\n    const clickedInside5 = (event.target as HTMLElement).closest('.top-elipsis-menu');\r\n    if (!clickedInside5) {\r\n      this.layoutOptionSelect = { show: false };\r\n    }\r\n\r\n    const clickedInside6 = (event.target as HTMLElement).closest('.floor-select');\r\n    if (!clickedInside6) {\r\n      this.floorSelect = { show: false, deleteIndex: null };\r\n    }\r\n  }\r\n\r\n  toggleLineOptionsSelect(index: number): void {\r\n    this.lineOptionsSelect = {\r\n      show: this.lineOptionsSelect.index !== index || !this.lineOptionsSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleDirectionSelect(index: number): void {\r\n    this.directionSelect = {\r\n      show: this.directionSelect.index !== index || !this.directionSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleElementSelect(index: number): void {\r\n    this.elementSelect = {\r\n      show: this.elementSelect.index !== index || !this.elementSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleWidgetElementSelect(): void {\r\n    this.widgetElementSelect = {\r\n      show: !this.widgetElementSelect.show,\r\n    };\r\n  }\r\n\r\n  toggleLayoutOptionSelect(): void {\r\n    this.layoutOptionSelect = {\r\n      show: !this.layoutOptionSelect.show,\r\n    };\r\n  }\r\n\r\n  toggleFloorSelect(): void {\r\n    this.floorSelect = {\r\n      show: !this.floorSelect.show,\r\n      deleteIndex: null\r\n    };\r\n  }\r\n\r\n\r\n  drop(event: CdkDragDrop<any[]>) {\r\n\r\n    this.saveStateToUndo()\r\n    moveItemInArray(this.layoutPolygon, event.previousIndex, event.currentIndex);\r\n\r\n    const instructions = this.layoutPolygon.map((segment) => {\r\n      const [point1, point2, properties] = segment\r\n      return properties\r\n    })\r\n\r\n    this.generateLayoutPolygon(instructions)\r\n    this.redoStack = [];\r\n\r\n\r\n  }\r\n\r\n\r\n  snapToGrid(value: number, gridSize: number): number {\r\n    return Math.round(value / gridSize) * gridSize;\r\n  }\r\n\r\n  isPointInPolygon(point: any, polygon: any[]): boolean {\r\n    let { x, y } = point;\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x, yi = polygon[i].y;\r\n      const xj = polygon[j].x, yj = polygon[j].y;\r\n\r\n      const onEdge =\r\n        (y - yi) * (xj - xi) === (x - xi) * (yj - yi) &&\r\n        Math.min(xi, xj) <= x && x <= Math.max(xi, xj) &&\r\n        Math.min(yi, yj) <= y && y <= Math.max(yi, yj);\r\n\r\n      if (onEdge) {\r\n        return true;\r\n      }\r\n\r\n      const intersect = ((yi > y) !== (yj > y)) &&\r\n        (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n\r\n  movePointWithAngle(): void {\r\n    if (this.movePixels <= 0) return;\r\n\r\n    this.saveStateToUndo()\r\n\r\n    let radians: number;\r\n\r\n    switch (this.moveDirection) {\r\n      case 'up':\r\n        radians = ((180 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    if (this.selectedLine) {\r\n      const lineIndex = ((array1 = this.layoutPolygon, array2 = this.selectedLine) => {\r\n        return array1.findIndex(innerArray =>\r\n          innerArray.length === array2.length &&\r\n          innerArray.every((item: any, index: any) => JSON.stringify(item) === JSON.stringify(array2[index]))\r\n        );\r\n      })();\r\n\r\n      const [start, end, properties] = this.layoutPolygon[lineIndex];\r\n      const newX = start.x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n      const newY = start.y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      this.layoutPolygon[lineIndex][1].x = snappedX;\r\n      this.layoutPolygon[lineIndex][1].y = snappedY;\r\n      this.layoutPolygon[lineIndex][2].angle = this.moveAngle;\r\n      this.layoutPolygon[lineIndex][2].direction = this.moveDirection;\r\n      this.layoutPolygon[lineIndex][2].distance = this.movePixels;\r\n      this.layoutPolygon[lineIndex][2].elementType = this.elementType;\r\n\r\n      this.redrawCanvas()\r\n      this.closeWidget()\r\n      this.selectedLine = null\r\n\r\n    } else {\r\n      const lastLine = this.layoutPolygon[this.layoutPolygon.length - 1];\r\n      const newX = lastLine[1].x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n      const newY = lastLine[1].y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newPoint = { x: snappedX, y: snappedY };\r\n\r\n\r\n      if (this.layoutPolygon.length > 0) {\r\n        const lastPoint = lastLine[1];\r\n        const firstPoint = this.layoutPolygon[0][0];\r\n\r\n\r\n        if (newPoint.x === firstPoint.x && newPoint.y === firstPoint.y) {\r\n          this.layoutPolygon.push([lastPoint, newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: this.getMaxElementNumber(this.layoutPolygon, this.elementType) }]);\r\n          this.closeWidget()\r\n\r\n        } else if (\r\n          !this.layoutPolygon.some(line =>\r\n            (line[0].x === newPoint.x && line[0].y === newPoint.y) ||\r\n            (line[1].x === newPoint.x && line[1].y === newPoint.y)\r\n          )\r\n        ) {\r\n          if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n            this.layoutPolygon[0] = [this.layoutPolygon[0][0], newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: 1 }]\r\n          } else {\r\n            this.layoutPolygon.push([lastPoint, newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: this.getMaxElementNumber(this.layoutPolygon, this.elementType) }]);\r\n          }\r\n          this.openWidget(newPoint)\r\n        }\r\n      }\r\n\r\n      this.redoStack = [];\r\n\r\n      this.cd.detectChanges();\r\n      this.redrawCanvas()\r\n    }\r\n\r\n\r\n  }\r\n\r\n  getMaxElementNumber(data: any, elementType: string) {\r\n    if (!Array.isArray(data)) {\r\n      throw new Error(\"Invalid data format: data should be an array.\");\r\n    }\r\n\r\n    return Math.round(data.reduce((maxNumber, segment) => {\r\n      if (Array.isArray(segment)) {\r\n        const element = segment.find(item => item.elementType === elementType);\r\n        if (element && typeof element.elementNumber === 'number') {\r\n          maxNumber = Math.max(maxNumber, element.elementNumber);\r\n        }\r\n      }\r\n      return maxNumber;\r\n    }, 0)) + 1;\r\n  }\r\n\r\n  onMouseDown(event: MouseEvent): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n    const mouseX = event.clientX - rect.left;\r\n    const mouseY = event.clientY - rect.top;\r\n\r\n\r\n    for (const line of this.layoutPolygon) {\r\n      const point = line[0];\r\n      const nextPoint = line[1];\r\n\r\n      const dx = nextPoint.x - point.x;\r\n      const dy = nextPoint.y - point.y;\r\n      const length = Math.sqrt(dx * dx + dy * dy);\r\n      const offsetX = (dy / length) * 20;\r\n      const offsetY = (-dx / length) * 20;\r\n\r\n      const boxCorners = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY }\r\n      ];\r\n\r\n      if (this.isPointInPolygon({ x: mouseX, y: mouseY }, boxCorners)) {\r\n        for (let i = 0; i < this.layoutPolygon.length; i++) {\r\n          const [start, end, properties] = this.layoutPolygon[i];\r\n          if (this.isLineEqual(start, end, boxCorners[0], boxCorners[1], 0)) {\r\n            this.selectLine(line, i);\r\n            return;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n\r\n    this.selectedLine = null\r\n    this.selectedLineIndex = null\r\n    this.redrawCanvas()\r\n    this.closeWidget()\r\n  }\r\n\r\n\r\n  selectLine(line: any, index: number) {\r\n    const [start, end, properties] = line\r\n\r\n    this.selectedLine = line\r\n    this.selectedLineIndex = index\r\n    this.elementType = properties.elementType\r\n    this.movePixels = properties.distance\r\n    this.moveDirection = properties.direction\r\n    this.moveAngle = properties.angle\r\n    this.unit = properties.unit\r\n    this.openWidget(end)\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  openWidget(position: { x: number, y: number }, offset = { up: 0, right: 5, down: 15, left: 0, }) {\r\n    this.popupVisible = true\r\n    const adjustedPosition = {\r\n      x: position.x + offset.right + offset.left,\r\n      y: position.y + offset.up + offset.down,\r\n    };\r\n\r\n    this.popupPosition = adjustedPosition\r\n    this.scrollToCanvasPosition(adjustedPosition)\r\n    setTimeout(() => {\r\n      this.drawWidgetRing()\r\n      this.updateWidgetPointer()\r\n    }, 500);\r\n\r\n  }\r\n\r\n  closeWidget() {\r\n    this.popupVisible = false\r\n  }\r\n\r\n  onMouseMove(event: MouseEvent): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n    const mouseX = event.clientX - rect.left;\r\n    const mouseY = event.clientY - rect.top;\r\n\r\n    let hoveredPolygonBox = this.layoutPolygon.some(line => {\r\n      const point = line[0];\r\n      const nextPoint = line[1];\r\n\r\n      const dx = nextPoint.x - point.x;\r\n      const dy = nextPoint.y - point.y;\r\n      const length = Math.sqrt(dx * dx + dy * dy);\r\n      const offsetX = (dy / length) * 20;\r\n      const offsetY = (-dx / length) * 20;\r\n\r\n      const boxCorners = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY }\r\n      ];\r\n\r\n      return this.isPointInPolygon({ x: mouseX, y: mouseY }, boxCorners);\r\n    });\r\n\r\n\r\n    this.canvas.style.cursor = hoveredPolygonBox ? 'pointer' : 'default';\r\n\r\n  }\r\n\r\n\r\n  drawLineWithLength(start: any, end: any): void {\r\n    const midX = (start.x + end.x) / 2;\r\n    const midY = (start.y + end.y) / 2;\r\n\r\n    const distance = Math.sqrt(\r\n      Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2)\r\n    ).toFixed(0);\r\n\r\n    const textSpacing = 10;\r\n    let textX = midX;\r\n    let textY = midY;\r\n\r\n    if (start.y === end.y) {\r\n      textY += textSpacing;\r\n    } else if (start.x === end.x) {\r\n      textX += textSpacing;\r\n    } else {\r\n      const angle = Math.atan2(end.y - start.y, end.x - start.x);\r\n      textX += textSpacing * Math.cos(angle);\r\n      textY += textSpacing * Math.sin(angle);\r\n    }\r\n\r\n    this.ctx.beginPath();\r\n    this.ctx.moveTo(start.x, start.y);\r\n    this.ctx.lineTo(end.x, end.y);\r\n    this.ctx.strokeStyle = 'black';\r\n    this.ctx.stroke();\r\n\r\n    this.ctx.save();\r\n    if (start.y === end.y) {\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, textX, textY);\r\n    } else if (start.x === end.x) {\r\n      this.ctx.translate(textX, textY);\r\n      this.ctx.rotate(-Math.PI / 2);\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, 0, 0);\r\n      this.ctx.restore();\r\n    } else {\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, textX, textY);\r\n    }\r\n    this.ctx.restore();\r\n  }\r\n\r\n  layoutLengthPreview() {\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n    let radians: number;\r\n    switch (this.moveDirection) {\r\n      case 'up':\r\n        radians = ((180 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const lastLine = this.layoutPolygon[this.layoutPolygon.length - 1];\r\n    const newX = lastLine[1].x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n    const newY = lastLine[1].y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const previewPoint = { x: snappedX, y: snappedY };\r\n\r\n    this.redrawCanvas()\r\n    this.drawLineWithLength(lastLine[1], previewPoint)\r\n\r\n\r\n  }\r\n\r\n\r\n  rotatePolygons(): void {\r\n    this.saveStateToUndo();\r\n    this.closeWidget()\r\n\r\n    const angle = 90;\r\n    this.cumulativeRotation = (this.cumulativeRotation + angle) % 360;\r\n\r\n    const rotatePoint = (point: { x: number; y: number }, center: { x: number; y: number }, angle: number): { x: number; y: number } => {\r\n      const dx = point.x - center.x;\r\n      const dy = point.y - center.y;\r\n      const radianAngle = angle * (Math.PI / 180);\r\n\r\n      const cos = Math.cos(radianAngle);\r\n      const sin = Math.sin(radianAngle);\r\n\r\n      return {\r\n        x: center.x + dx * cos - dy * sin,\r\n        y: center.y + dx * sin + dy * cos,\r\n      };\r\n    };\r\n\r\n    const getPolygonLineCenter = (line: any[]): { x: number; y: number } => {\r\n      const [start, end] = line;\r\n      return {\r\n        x: (start.x + end.x) / 2,\r\n        y: (start.y + end.y) / 2,\r\n      };\r\n    };\r\n\r\n    const getOverallCenter = (lines: any[]): { x: number; y: number } => {\r\n      const sum = lines.reduce(\r\n        (acc, line) => {\r\n          const center = getPolygonLineCenter(line);\r\n          acc.x += center.x;\r\n          acc.y += center.y;\r\n          return acc;\r\n        },\r\n        { x: 0, y: 0 }\r\n      );\r\n\r\n      return { x: sum.x / lines.length, y: sum.y / lines.length };\r\n    };\r\n\r\n    const overallCenter = getOverallCenter(this.layoutPolygon);\r\n\r\n    this.layoutPolygon = this.layoutPolygon.map((line) => {\r\n      const [start, end, properties] = line;\r\n      return [\r\n        rotatePoint(start, overallCenter, angle),\r\n        rotatePoint(end, overallCenter, angle),\r\n        properties,\r\n      ];\r\n    });\r\n\r\n    this.redoStack = [];\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  resetOrientation(): void {\r\n    if (this.cumulativeRotation === 0) return;\r\n\r\n    const angleToReset = -this.cumulativeRotation;\r\n    const resetRotation = (point: { x: number; y: number }, center: { x: number; y: number }, angle: number): { x: number; y: number } => {\r\n      const dx = point.x - center.x;\r\n      const dy = point.y - center.y;\r\n      const radianAngle = angle * (Math.PI / 180);\r\n\r\n      const cos = Math.cos(radianAngle);\r\n      const sin = Math.sin(radianAngle);\r\n\r\n      return {\r\n        x: center.x + dx * cos - dy * sin,\r\n        y: center.y + dx * sin + dy * cos,\r\n      };\r\n    };\r\n\r\n    const getPolygonLineCenter = (line: any[]): { x: number; y: number } => {\r\n      const [start, end] = line;\r\n      return {\r\n        x: (start.x + end.x) / 2,\r\n        y: (start.y + end.y) / 2,\r\n      };\r\n    };\r\n\r\n    const getOverallCenter = (lines: any[]): { x: number; y: number } => {\r\n      const sum = lines.reduce(\r\n        (acc, line) => {\r\n          const center = getPolygonLineCenter(line);\r\n          acc.x += center.x;\r\n          acc.y += center.y;\r\n          return acc;\r\n        },\r\n        { x: 0, y: 0 }\r\n      );\r\n\r\n      return { x: sum.x / lines.length, y: sum.y / lines.length };\r\n    };\r\n\r\n    const overallCenter = getOverallCenter(this.layoutPolygon);\r\n\r\n    this.layoutPolygon = this.layoutPolygon.map((line) => {\r\n      const [start, end, properties] = line;\r\n      return [\r\n        resetRotation(start, overallCenter, angleToReset),\r\n        resetRotation(end, overallCenter, angleToReset),\r\n        properties,\r\n      ];\r\n    });\r\n\r\n    this.cumulativeRotation = 0; // Reset rotation tracker\r\n    this.redrawCanvas();\r\n  }\r\n\r\n\r\n\r\n\r\n  isLineEqual(\r\n    start1: { x: number, y: number },\r\n    end1: { x: number, y: number },\r\n    start2: { x: number, y: number },\r\n    end2: { x: number, y: number },\r\n    tolerance: number\r\n  ): boolean {\r\n    const arePointsEqual = (p1: { x: number, y: number }, p2: { x: number, y: number }) =>\r\n      Math.abs(p1.x - p2.x) <= tolerance && Math.abs(p1.y - p2.y) <= tolerance;\r\n\r\n    return (\r\n      (arePointsEqual(start1, start2) && arePointsEqual(end1, end2)) ||\r\n      (arePointsEqual(start1, end2) && arePointsEqual(end1, start2))\r\n    );\r\n  }\r\n\r\n  convertToPixels(value: number, unit: 'ft' | 'm'): number {\r\n    const PIXELS_PER_METER = this.pixelPerMetre;\r\n    const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;\r\n\r\n    if (typeof value !== 'number' || value < 0) {\r\n      throw new Error('Value must be a non-negative number');\r\n    }\r\n\r\n    switch (unit) {\r\n      case 'm':\r\n        return value * PIXELS_PER_METER;\r\n      case 'ft':\r\n        return value * PIXELS_PER_FOOT;\r\n      default:\r\n        throw new Error(\"Invalid unit. Supported units are 'mt' for meters and 'ft' for feet.\");\r\n    }\r\n  }\r\n\r\n  onElementTypeChange(type: string, index: number) {\r\n    const [point1, point2, properties] = this.layoutPolygon[index]\r\n    properties.elementType = type\r\n    properties.elementNumber = this.getMaxElementNumber(this.layoutPolygon, type)\r\n    this.layoutPolygon[index] = [point1, point2, properties]\r\n    this.elementSelect = { show: false, index: 0 };\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onDistanceChange(value: 'increment' | 'decrement', index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n    if (value === 'increment') {\r\n\r\n      const newX = point2.x + Math.cos(radians) * this.convertToPixels(1, properties.unit);\r\n      const newY = point2.y - Math.sin(radians) * this.convertToPixels(1, properties.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newpoint = { x: snappedX, y: snappedY };\r\n      point2.x = newpoint.x;\r\n      point2.y = newpoint.y;\r\n      properties.distance = properties.distance + 1;\r\n    } else if (value === 'decrement') {\r\n\r\n      const newX = point2.x - Math.cos(radians) * this.convertToPixels(1, properties.unit);\r\n      const newY = point2.y + Math.sin(radians) * this.convertToPixels(1, properties.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newpoint = { x: snappedX, y: snappedY };\r\n      if (properties.distance > 1) {\r\n        point2.x = newpoint.x;\r\n        point2.y = newpoint.y;\r\n        properties.distance = properties.distance - 1;\r\n      }\r\n\r\n    }\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n    this.lineOptionsSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n  onWidgetDistanceChange(value: 'increment' | 'decrement') {\r\n    if (value === 'increment') {\r\n      this.movePixels = this.movePixels + 1;\r\n    } else if (value === 'decrement') {\r\n      if (this.movePixels > 1) {\r\n        this.movePixels = this.movePixels - 1;\r\n      }\r\n    }\r\n  }\r\n\r\n  onWidgetAngleChange(value: 'increment' | 'decrement') {\r\n    if (value === 'increment') {\r\n      if (this.moveAngle < 180) {\r\n        this.moveAngle = this.moveAngle + 5;\r\n      }\r\n    } else if (value === 'decrement') {\r\n      if (this.moveAngle > 0) {\r\n        this.moveAngle = this.moveAngle - 5;\r\n      }\r\n    }\r\n\r\n\r\n    this.updateWidgetPointer()\r\n  }\r\n\r\n  onWidgetDirectionChange(direction: 'left' | 'right' | 'up' | 'down') {\r\n    this.moveDirection = direction;\r\n    this.drawWidgetRing()\r\n    this.updateWidgetPointer()\r\n  }\r\n\r\n  onDirectionChange(value: 'up' | 'left' | 'down' | 'right', index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n\r\n    let radians: number;\r\n    switch (value) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const movementDistance = this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const newX = point1.x + Math.cos(radians) * movementDistance;\r\n    const newY = point1.y - Math.sin(radians) * movementDistance;\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    point2.x = snappedX;\r\n    point2.y = snappedY;\r\n    properties.direction = value;\r\n\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n    this.directionSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onLineDelete(index: number) {\r\n    this.saveStateToUndo()\r\n    this.layoutPolygon.splice(index, 1);\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onAddStep(index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n    let radians = ((90 - 90) * Math.PI) / 180;;\r\n\r\n    const newX = point2.x + Math.cos(radians) * this.convertToPixels(1, this.unit);\r\n    const newY = point2.y - Math.sin(radians) * this.convertToPixels(1, this.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const newpoint = { x: snappedX, y: snappedY };\r\n\r\n    this.layoutPolygon.splice(index + 1, 0,\r\n      [point2, newpoint,\r\n        { elementType: 'wall', distance: 1, unit: this.unit, direction: 'right', angle: 90, elementNumber: this.getMaxElementNumber(this.layoutPolygon, 'wall') }]);\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n    this.lineOptionsSelect = { show: false, index: 0 }\r\n\r\n  }\r\n\r\n  onDuplicateStep(index: number) {\r\n    this.redoStack = [];\r\n    const [point1, point2, properties] = JSON.parse(JSON.stringify(this.layoutPolygon[index]));\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const newX = point2.x + Math.cos(radians) * this.convertToPixels(properties.distance, properties.unit);\r\n    const newY = point2.y - Math.sin(radians) * this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const newpoint = { x: snappedX, y: snappedY };\r\n\r\n    properties.elementNumber = this.getMaxElementNumber(this.layoutPolygon, properties.elementType)\r\n\r\n    this.layoutPolygon.splice(index + 1, 0,\r\n      [point2, newpoint, properties]);\r\n    this.lineOptionsSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n\r\n  scrollToCanvasPosition(coordinates: { x: number; y: number }): void {\r\n    const container = this.scrollContainerRef.nativeElement;\r\n\r\n    const containerRect = container.getBoundingClientRect();\r\n    const containerScrollLeft = container.scrollLeft;\r\n    const containerScrollTop = container.scrollTop;\r\n\r\n    const targetX = coordinates.x;\r\n    const targetY = coordinates.y;\r\n\r\n    const offset = {\r\n      up: 100,\r\n      down: 200,\r\n      left: 100,\r\n      right: 100,\r\n    };\r\n\r\n    const visibleLeft = containerScrollLeft + offset.left;\r\n    const visibleRight = containerScrollLeft + containerRect.width - offset.right;\r\n    const visibleTop = containerScrollTop + offset.up;\r\n    const visibleBottom = containerScrollTop + containerRect.height - offset.down;\r\n\r\n    const isXInView = targetX >= visibleLeft && targetX <= visibleRight;\r\n    const isYInView = targetY >= visibleTop && targetY <= visibleBottom;\r\n\r\n    if (!isXInView || !isYInView) {\r\n      const adjustedX = Math.max(0, targetX - offset.left);\r\n      const adjustedY = Math.max(0, targetY - offset.up);\r\n\r\n      container.scrollTo({\r\n        left: adjustedX,\r\n        top: adjustedY,\r\n        behavior: 'smooth',\r\n      });\r\n    }\r\n  }\r\n\r\n  onClearAll() {\r\n    const modelRef = this.modalDef.open(ClearAllStepsComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        this.toastService.getSuccessToast('Layout cleared successfully')\r\n        this.undoStack = []\r\n        this.redoStack = []\r\n        this.initializeLayout()\r\n        this.redrawCanvas()\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  onDeleteLayout() {\r\n    const modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        this.undoStack = []\r\n        this.redoStack = []\r\n        this.layoutPolygon = [];\r\n        this.updateFloorLayout()\r\n        this.initializeLayout()\r\n        this.redrawCanvas()\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  async exportAsPng() {\r\n    const padding = 100;\r\n    const canvas = document.createElement('canvas');\r\n    const ctx = canvas.getContext('2d')!;\r\n    canvas.width = 10000; \r\n    canvas.height = 10000;\r\n  \r\n    const centerX = canvas.width / 2 / this.scale;\r\n    const centerY = canvas.height / 2 / this.scale;\r\n  \r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n  \r\n    const renderCanvas = async (layoutPolygon: any[]): Promise<string> => {\r\n      const exportLayout: any[] = [];\r\n  \r\n      layoutPolygon.forEach((instruction: any) => {\r\n        const radians: number = {\r\n          up: ((180 - instruction.angle) * Math.PI) / 180,\r\n          left: ((270 - instruction.angle) * Math.PI) / 180,\r\n          down: ((360 - instruction.angle) * Math.PI) / 180,\r\n          right: ((90 - instruction.angle) * Math.PI) / 180,\r\n        }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n  \r\n        if (radians === undefined) {\r\n          throw new Error(`Invalid direction: ${instruction.direction}`);\r\n        }\r\n  \r\n        const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n        const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n        const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n  \r\n        const newPoint = {\r\n          x: this.snapToGrid(newX, this.gridWidth),\r\n          y: this.snapToGrid(newY, this.gridHeight),\r\n        };\r\n  \r\n        const lineSegment = [\r\n          currentPoint,\r\n          newPoint,\r\n          {\r\n            elementType: instruction.elementType,\r\n            distance: instruction.distance,\r\n            unit: instruction.unit,\r\n            direction: instruction.direction,\r\n            angle: instruction.angle,\r\n            elementNumber: instruction.elementNumber,\r\n          },\r\n        ];\r\n  \r\n        exportLayout.push(lineSegment);\r\n        currentPoint = newPoint;\r\n      });\r\n  \r\n      let minX = Infinity,\r\n        minY = Infinity,\r\n        maxX = -Infinity,\r\n        maxY = -Infinity;\r\n  \r\n      exportLayout.forEach(([point1, point2]) => {\r\n        [point1, point2].forEach((point) => {\r\n          if (point.x !== undefined) {\r\n            minX = Math.min(minX, point.x);\r\n            maxX = Math.max(maxX, point.x);\r\n          }\r\n          if (point.y !== undefined) {\r\n            minY = Math.min(minY, point.y);\r\n            maxY = Math.max(maxY, point.y);\r\n          }\r\n        });\r\n      });\r\n  \r\n      minX -= padding;\r\n      minY -= padding;\r\n      maxX += padding;\r\n      maxY += padding;\r\n  \r\n      canvas.width = maxX - minX;\r\n      canvas.height = maxY - minY;\r\n  \r\n      ctx.fillStyle = 'white';\r\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n  \r\n      ctx.save();\r\n      ctx.translate(-minX, -minY);\r\n      ctx.scale(this.scale, this.scale);\r\n  \r\n      function drawArrowhead(ctx: CanvasRenderingContext2D, x: number, y: number, angle: number) {\r\n        const size = 5;\r\n        ctx.save();\r\n        ctx.translate(x, y);\r\n        ctx.rotate(angle);\r\n        ctx.beginPath();\r\n        ctx.moveTo(0, 0);\r\n        ctx.lineTo(-size, -size / 2);\r\n        ctx.lineTo(-size, size / 2);\r\n        ctx.closePath();\r\n        ctx.fillStyle = 'black';\r\n        ctx.fill();\r\n        ctx.restore();\r\n      }\r\n  \r\n      ctx.beginPath();\r\n      exportLayout.forEach((edge, edgeIndex) => {\r\n        const point = edge[0];\r\n        const nextPoint = edge[1];\r\n        const properties = edge[2];\r\n\r\n        if (edgeIndex === 0) ctx.moveTo(point.x, point.y);\r\n        ctx.lineTo(nextPoint.x, nextPoint.y);\r\n\r\n        const dx = nextPoint.x - point.x;\r\n        const dy = nextPoint.y - point.y;\r\n        const length = Math.sqrt(dx * dx + dy * dy);\r\n        const offsetX = (dy / length) * 20;\r\n        const offsetY = (-dx / length) * 20;\r\n\r\n        const boxPoints = [\r\n          { x: point.x, y: point.y },\r\n          { x: nextPoint.x, y: nextPoint.y },\r\n          { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n          { x: point.x + offsetX, y: point.y + offsetY },\r\n        ];\r\n\r\n        ctx.beginPath();\r\n        ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n        boxPoints.forEach((pt, index) => {\r\n          if (properties.elementType === 'entrance') {\r\n            if (index < 2) {\r\n              ctx.lineTo(pt.x, pt.y)\r\n            }\r\n          } else {\r\n            ctx.lineTo(pt.x, pt.y);\r\n          }\r\n        });\r\n        if (properties.elementType === 'opening') {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n\r\n          ctx.strokeStyle = '#F9FAFB';\r\n\r\n          ctx.stroke();\r\n        } else {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n\r\n\r\n        const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n        const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n        ctx.save();\r\n        ctx.translate(textX, textY);\r\n\r\n        if (dx === 0) {\r\n          ctx.rotate(-Math.PI / 2);\r\n        } else if (dy !== 0) {\r\n          const angle = Math.atan2(dy, dx);\r\n          ctx.rotate(angle);\r\n        }\r\n\r\n        ctx.font = '12px Arial';\r\n        ctx.fillStyle = 'black';\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillText(\r\n          `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n          0,\r\n          0\r\n        );\r\n        ctx.restore();\r\n        if (properties.distance >= 4) {\r\n          const centerX = textX;\r\n          const centerY = textY;\r\n          const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n          const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n          const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n          const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n          function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n            const angle = Math.atan2(y2 - y1, x2 - x1);\r\n            return {\r\n              x: x1 + Math.cos(angle) * distance,\r\n              y: y1 + Math.sin(angle) * distance,\r\n            };\r\n          }\r\n\r\n          const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n          const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n          const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n          const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(rightStart.x, rightStart.y);\r\n          ctx.lineTo(rightEnd.x, rightEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n          drawArrowhead(ctx, rightEnd.x, rightEnd.y, rightAngle);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(leftStart.x, leftStart.y);\r\n          ctx.lineTo(leftEnd.x, leftEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n          drawArrowhead(ctx, leftEnd.x, leftEnd.y, leftAngle);\r\n\r\n        }\r\n\r\n        if (properties.elementType === 'entrance') {\r\n          const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n          const entranceAngle = angle + (15 * Math.PI) / 180;\r\n\r\n          const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n          const endPoint = {\r\n            x: point.x + Math.cos(entranceAngle) * lineLength,\r\n            y: point.y + Math.sin(entranceAngle) * lineLength,\r\n          };\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(point.x, point.y);\r\n          ctx.lineTo(endPoint.x, endPoint.y);\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n      });\r\n  \r\n      ctx.restore();\r\n  \r\n      return new Promise((resolve) => {\r\n        canvas.toBlob((blob:any) => {\r\n          const link = document.createElement('a');\r\n          link.download = `${this.selectedStore.storeName}_${this.selectedFloor.floorName}_layout.png`;\r\n          link.href = URL.createObjectURL(blob);\r\n          link.click();\r\n          canvas.remove();\r\n          resolve('');\r\n        });\r\n      });\r\n    };\r\n  \r\n    const layoutInstructions = this.layoutPolygon.map((segment) => {\r\n      const [, , properties] = segment;\r\n      return properties;\r\n    });\r\n  \r\n    await renderCanvas(layoutInstructions);\r\n  }\r\n  \r\n\r\n  generateLayoutPolygon(layoutInstructions: any) {\r\n    this.pixelPerMetre = this.normalizedPixelPerMetre(layoutInstructions)\r\n\r\n    this.layoutPolygon = [];\r\n\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    if (!layoutInstructions.length) {\r\n      this.initializeLayout()\r\n      this.redrawCanvas()\r\n      return\r\n    }\r\n\r\n    let currentPoint = {\r\n      \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n      \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      this.layoutPolygon.push(lineSegment);\r\n\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n\r\n    const lastPoint = this.layoutPolygon[this.layoutPolygon.length - 1][1]\r\n\r\n    if (this.isFloorCompleted(layoutInstructions)) {\r\n      this.findPolygonCenterAndScroll()\r\n      this.closeWidget()\r\n    } else {\r\n      this.openWidget(lastPoint)\r\n    }\r\n\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n  normalizedPixelPerMetre(polygon: any): number {\r\n    const MIN_PIXELS_PER_METER = 50;\r\n    const MAX_PIXELS_PER_METER = 150;\r\n\r\n    let totalLength = 0;\r\n    let lineCount = 0;\r\n\r\n    polygon.forEach((line: any) => {\r\n      if (line.unit === 'ft') {\r\n        totalLength = totalLength + (line.distance * 3.28084);\r\n      } else {\r\n        totalLength = totalLength + line.distance;\r\n      }\r\n      lineCount++;\r\n    });\r\n\r\n    const averageLength = lineCount > 0 ? totalLength / lineCount : 0;\r\n\r\n    const MAX_AVERAGE_LENGTH = 50;\r\n    const MIN_AVERAGE_LENGTH = 5;\r\n\r\n    const normalizedLength = Math.min(\r\n      Math.max(averageLength, MIN_AVERAGE_LENGTH),\r\n      MAX_AVERAGE_LENGTH\r\n    );\r\n\r\n    const pixelsPerMeter =\r\n      MAX_PIXELS_PER_METER -\r\n      ((normalizedLength - MIN_AVERAGE_LENGTH) / (MAX_AVERAGE_LENGTH - MIN_AVERAGE_LENGTH)) *\r\n      (MAX_PIXELS_PER_METER - MIN_PIXELS_PER_METER);\r\n\r\n    return Math.round(pixelsPerMeter);\r\n  }\r\n\r\n  isFloorCompleted(layoutInstructions: any, thresholdInFeet: number = 1): boolean {\r\n    const layoutPolygon: any[] = [];\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      layoutPolygon.push(lineSegment);\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n    const firstPoint = layoutPolygon?.[0]?.[0];\r\n    const lastPoint = layoutPolygon?.[layoutPolygon.length - 1]?.[1];\r\n\r\n    if (layoutPolygon.length <= 1 || !firstPoint || !lastPoint) {\r\n      return false;\r\n    }\r\n\r\n    const distanceBetweenPoints = Math.sqrt(\r\n      Math.pow(lastPoint.x - firstPoint.x, 2) + Math.pow(lastPoint.y - firstPoint.y, 2)\r\n    );\r\n\r\n    const thresholdInPixels = this.convertToPixels(thresholdInFeet, 'ft');\r\n    return distanceBetweenPoints <= thresholdInPixels;\r\n  }\r\n\r\n\r\n  validateAngleInput(event: Event, index: number) {\r\n    const inputElement = event.target as HTMLInputElement;\r\n    let value = parseInt(inputElement.value, 10);\r\n\r\n    if (isNaN(value)) {\r\n      value = 0;\r\n    }\r\n\r\n    if (value < 0) {\r\n      value = 0;\r\n    } else if (value > 180) {\r\n      value = 180;\r\n    }\r\n\r\n    inputElement.value = value.toString();\r\n    this.layoutPolygon[index][2].angle = value;\r\n\r\n\r\n  }\r\n\r\n  onAngleChange(index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const movementDistance = this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const newX = point1.x + Math.cos(radians) * movementDistance;\r\n    const newY = point1.y - Math.sin(radians) * movementDistance;\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    point2.x = snappedX;\r\n    point2.y = snappedY;\r\n    properties.angle = this.layoutPolygon[index][2].angle;\r\n\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  openAddFloorModal() {\r\n    const modelRef = this.modalDef.open(AddFloorComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.floorNumber) {\r\n        this.addFloor(this.selectedStore.planoId, val.floorNumber)\r\n      }\r\n    }).catch((err) => {\r\n      if (err.floorNumber) {\r\n        this.addFloor(this.selectedStore.planoId, err.floorNumber)\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n\r\n  findPolygonCenterAndScroll(polygon: any = this.layoutPolygon): void {\r\n    const vertices = polygon.flatMap((line: any) => line.slice(0, 2));\r\n\r\n    const minX = Math.min(...vertices.map((v: any) => v.x));\r\n    const maxX = Math.max(...vertices.map((v: any) => v.x));\r\n    const minY = Math.min(...vertices.map((v: any) => v.y));\r\n    const maxY = Math.max(...vertices.map((v: any) => v.y));\r\n\r\n    let center = { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\r\n\r\n    const step = 1;\r\n    let bestPoint = center;\r\n    let bestDistanceSum = Number.MAX_VALUE;\r\n\r\n    for (let x = minX; x <= maxX; x += step) {\r\n      for (let y = minY; y <= maxY; y += step) {\r\n        const point = { x, y };\r\n        if (isPointInsidePolygon(point, vertices)) {\r\n          const distanceSum = vertices.reduce(\r\n            (sum: number, vertex: any) => sum + Math.sqrt((point.x - vertex.x) ** 2 + (point.y - vertex.y) ** 2),\r\n            0\r\n          );\r\n          if (distanceSum < bestDistanceSum) {\r\n            bestDistanceSum = distanceSum;\r\n            bestPoint = point;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    const scrollContainer = this.scrollContainerRef.nativeElement;\r\n    scrollContainer.scrollTo({\r\n      left: bestPoint.x - scrollContainer.offsetWidth / 2,\r\n      top: bestPoint.y - scrollContainer.offsetHeight / 2,\r\n      behavior: 'smooth'\r\n    });\r\n\r\n    this.resetZoom()\r\n    this.resetOrientation()\r\n\r\n    function isPointInsidePolygon(point: any, vertices: any): boolean {\r\n      let count = 0;\r\n      for (let i = 0; i < vertices.length; i++) {\r\n        const start = vertices[i];\r\n        const end = vertices[(i + 1) % vertices.length];\r\n        if (rayIntersectsSegment(point, { start, end })) {\r\n          count++;\r\n        }\r\n      }\r\n      return count % 2 === 1;\r\n    }\r\n\r\n    function rayIntersectsSegment(point: any, segment: any): boolean {\r\n      const { x, y } = point;\r\n      const { start, end } = segment;\r\n\r\n      if (y < Math.min(start.y, end.y) || y > Math.max(start.y, end.y)) {\r\n        return false;\r\n      }\r\n\r\n      const t = (y - start.y) / (end.y - start.y);\r\n      const intersectX = start.x + t * (end.x - start.x);\r\n\r\n      return intersectX >= x;\r\n    }\r\n  }\r\n\r\n exportToExcel() {\r\n\r\n   const layoutPolygon = this.layoutPolygon.map((segment) => {\r\n      const [point1, point2, properties] = segment\r\n      return properties\r\n    })\r\n\r\n    const formattedData = layoutPolygon.map((item:any, index:number) => ({\r\n        'Step': index + 1,\r\n        'Elements': `${item.elementType} ${item.elementNumber}`,\r\n        'Measurements(ft)': item.distance,\r\n        'Direction': item.direction,\r\n        'Degree': item.angle\r\n    }));\r\n\r\n    const worksheet = XLSX.utils.json_to_sheet(formattedData);\r\n\r\n    const workbook = XLSX.utils.book_new();\r\n    XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');\r\n\r\n    const fileName = `${this.selectedStore.storeName}_${this.selectedFloor.floorName}_layout.xlsx`\r\n\r\n    XLSX.writeFile(workbook, fileName);\r\n}\r\n\r\n\r\n}\r\n","<div class=\"d-flex align-items-center justify-content-between mb-6\">\r\n    <div>\r\n        <div *ngIf=\"planoStoreList.length === 1\" class=\"storename-txt\">\r\n            {{selectedStore?.storeName}} - Layout\r\n        </div>\r\n        <div *ngIf=\"planoStoreList.length > 1\">\r\n            <lib-select-plano [items]=\"planoStoreList\" [multi]=\"false\" [searchField]=\"'storeName'\" [idField]=\"'storeId'\"\r\n                (selected)=\"onStoreChange($event)\" [selectedValues]=\"[selectedStore]\"></lib-select-plano>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"d-flex align-items-center\">\r\n        <button (click)=\"onSaveAsDraft()\" class=\"btn btn-outline bg-white me-5\">Save As Draft</button>\r\n        <button (click)=\"onConfigure()\" class=\"btn btn-sm btn-primary me-5\">Configure</button>\r\n        <button (click)=\"openOffCanva()\" class=\"btn btn-sm btn-outline bg-white\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path\r\n                    d=\"M9 3V21M5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5C3 3.89543 3.89543 3 5 3Z\"\r\n                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </button>\r\n    </div>\r\n</div>\r\n\r\n<div class=\"row\">\r\n    <div [ngClass]=\"layoutMode === 'full' ? 'col-2' : 'col-5'\">\r\n        <div class=\"c-card\" style=\"height: 75dvh; position: relative;\">\r\n            <div class=\"resize-icon\" *ngIf=\"layoutMode === 'half'\" (click)=\"layoutMode = 'full'\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                    <path\r\n                        d=\"M8.27259 12.6365L4.63623 9.00013L8.27259 5.36377M13.3635 12.6365L9.72714 9.00013L13.3635 5.36377\"\r\n                        stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </div>\r\n            <div class=\"resize-icon\" *ngIf=\"layoutMode === 'full'\" (click)=\"layoutMode = 'half'\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                    <path\r\n                        d=\"M9.72741 5.36399L13.3638 9.00036L9.72741 12.6367M4.6365 5.36399L8.27286 9.00036L4.6365 12.6367\"\r\n                        stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </div>\r\n            <div class=\"d-flex align-items-center justify-content-between mb-5\" style=\"height: 8%;\">\r\n                <div>\r\n                    <div class=\"l-pane-head\">\r\n                        Layout details\r\n                    </div>\r\n                    <div *ngIf=\"layoutMode === 'half'\" class=\"l-pane-desc\">\r\n                        Below are the sequence of steps for this layout\r\n                    </div>\r\n                </div>\r\n                <div class=\"d-flex align-items-center\">\r\n                    <ng-container *ngIf=\"layoutMode === 'half'\">\r\n                        <svg (click)=\"undo()\" class=\"me-3 cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                            height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <path [attr.fill]=\"undoStack.length ? '#1D2939' : '#D0D5DD'\"\r\n                                d=\"M7 19V17H14.1C15.15 17 16.0627 16.6667 16.838 16C17.6133 15.3333 18.0007 14.5 18 13.5C18 12.5 17.6123 11.6667 16.837 11C16.0617 10.3333 15.1493 10 14.1 10H7.8L10.4 12.6L9 14L4 9L9 4L10.4 5.4L7.8 8H14.1C15.7167 8 17.1043 8.525 18.263 9.575C19.4217 10.625 20.0007 11.9333 20 13.5C20 15.0667 19.4207 16.375 18.262 17.425C17.1033 18.475 15.716 19 14.1 19H7Z\"\r\n                                fill=\"#D0D5DD\" />\r\n                        </svg>\r\n                        <svg (click)=\"redo()\" class=\"me-6 cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                            height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <path [attr.fill]=\"redoStack.length ? '#1D2939' : '#D0D5DD'\"\r\n                                d=\"M9.9 19C8.28333 19 6.89567 18.475 5.737 17.425C4.57833 16.375 3.99933 15.0667 4 13.5C4 11.9333 4.57933 10.625 5.738 9.575C6.89667 8.525 8.284 8 9.9 8H16.2L13.6 5.4L15 4L20 9L15 14L13.6 12.6L16.2 10H9.9C8.85 10 7.93733 10.3333 7.162 11C6.38667 11.6667 5.99933 12.5 6 13.5C6 14.5 6.38767 15.3333 7.163 16C7.93833 16.6667 8.85067 17 9.9 17H17V19H9.9Z\"\r\n                                fill=\"#D0D5DD\" />\r\n                        </svg>\r\n                        <div (click)=\"toggleLayoutOptionSelect()\"\r\n                            class=\"d-flex  align-items-center justify-content-center h-100 elipsis-icon-dropdown top-elipsis-menu\">\r\n                            <div class=\"elipsis-btn\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M11 11.9997C11 12.5289 11.4477 12.958 12 12.958C12.5523 12.958 13 12.5289 13 11.9997C13 11.4704 12.5523 11.0413 12 11.0413C11.4477 11.0413 11 11.4704 11 11.9997Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                    <path\r\n                                        d=\"M11 18.708C11 19.2373 11.4477 19.6663 12 19.6663C12.5523 19.6663 13 19.2373 13 18.708C13 18.1787 12.5523 17.7497 12 17.7497C11.4477 17.7497 11 18.1787 11 18.708Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                    <path\r\n                                        d=\"M11 5.29134C11 5.82061 11.4477 6.24967 12 6.24967C12.5523 6.24967 13 5.82061 13 5.29134C13 4.76207 12.5523 4.33301 12 4.33301C11.4477 4.33301 11 4.76207 11 5.29134Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </div>\r\n                            <ul *ngIf=\"layoutOptionSelect?.show\" [ngClass]=\" (layoutOptionSelect.show ) ? 'z-1': ''\"\r\n                                class=\"list-unstyled mb-2\">\r\n                                <li>\r\n                                    <div class=\"d-flex justify-content-between w-100\">\r\n                                        <div class=\"menu-txt1\">Export</div>\r\n                                        <span>\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\r\n                                                <path d=\"M1 13L7 7L1 1\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                              </svg>\r\n                                        </span>\r\n                                    </div>\r\n                                    <div class=\"export-options\">\r\n                                        <ul>\r\n                                            <li (click)=\"exportToExcel()\" >XLSX</li>\r\n                                            <li (click)=\"exportAsPng()\" >PNG</li>\r\n                                        </ul>\r\n                                    </div>\r\n\r\n                                </li>\r\n                                <li (click)=\"onClearAll()\">\r\n                                    <div class=\"d-flex\">\r\n                                        <div class=\"menu-txt1\">Clear all</div>\r\n                                    </div>\r\n\r\n                                </li>\r\n                                <li (click)=\"onDeleteLayout()\">\r\n                                    <div class=\"d-flex\">\r\n                                        <div class=\"menu-txt1 text-danger\">Delete</div>\r\n                                    </div>\r\n                                </li>\r\n\r\n                            </ul>\r\n                        </div>\r\n\r\n                    </ng-container>\r\n\r\n\r\n\r\n                </div>\r\n\r\n            </div>\r\n\r\n            <!-- <div class=\"d-flex align-items-center flex-column mx-auto\" style=\"margin-top: 200px;\" >\r\n                <div class=\"no-steps-txt mb-3\">\r\n                    No steps have been created so far\r\n                </div>\r\n                <div class=\"no-text-desc text-center\">\r\n                    Start designing the layout by applying the steps using elements and dimensions.\r\n                </div>\r\n            </div> -->\r\n\r\n            <div class=\"table-responsive hide-scrollbar \" style=\"height: 92%;\">\r\n                <table class=\"table\">\r\n                    <thead class=\"thead-light\">\r\n                        <tr>\r\n                            <th>Steps</th>\r\n                            <th>Elements and Definition</th>\r\n                            <th>Feet</th>\r\n                            <th>Direction</th>\r\n                            <th>Degree</th>\r\n                            <th></th>\r\n                        </tr>\r\n                    </thead>\r\n                    <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n                        <ng-container *ngFor=\"let item of layoutPolygon; let i = index\">\r\n                            <tr [ngClass]=\"selectedLineIndex === i ? 'selected-element' : ''\" *ngIf=\"item?.[2]\" cdkDrag>\r\n                                <td>\r\n                                    <div class=\"d-flex align-items-center justify-content-center w-100 h-100 drag-handler\">\r\n                                        <span class=\"mr-2  \" >\r\n                                            <svg class=\"cursor-pointer\"  xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\">\r\n                                                <circle cx=\"5\" cy=\"5\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"5\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"5\" cy=\"10\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"10\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"5\" cy=\"15\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"15\" r=\"2\" fill=\"gray\" />\r\n                                              </svg>\r\n                                        </span>\r\n                                        <span>{{ i + 1}}</span>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"d-flex\">\r\n                                        <div (click)=\"toggleElementSelect(i)\"\r\n                                            class=\"element-type-dropdown me-2 position-relative\">\r\n                                            <div>\r\n                                                <svg *ngIf=\"item[2].elementType === 'wall'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                        fill=\"#344054\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'facade'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\"\r\n                                                    viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                                    <path\r\n                                                        d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                        stroke=\"#344054\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'opening'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path\r\n                                                        d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                        stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'entrance'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\"\r\n                                                    viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                        fill=\"#1D2939\" />\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                        fill=\"#1D2939\" />\r\n                                                </svg>\r\n                                            </div>\r\n\r\n                                            <div class=\"down-arrow\">\r\n                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\"\r\n                                                        stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n                                            </div>\r\n\r\n                                            <ul *ngIf=\"elementSelect?.show && elementSelect?.index === i\"\r\n                                                [ngClass]=\" (elementSelect.show && elementSelect.index === i) ? 'z-1': ''\"\r\n                                                class=\"list-unstyled mb-2\">\r\n                                                <li (click)=\"onElementTypeChange('wall', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'wall' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                                                height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                                    fill=\"#344054\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Wall</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'wall'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('facade', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'facade' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\"\r\n                                                                height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                                                <path\r\n                                                                    d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                                    stroke=\"#344054\" stroke-linecap=\"round\"\r\n                                                                    stroke-linejoin=\"round\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Glass/Facade</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'facade'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('opening', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'opening' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                                                height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                                <path\r\n                                                                    d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                                    stroke=\"#101828\" stroke-width=\"1.5\"\r\n                                                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Opening</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'opening'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('entrance', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'entrance' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\"\r\n                                                                height=\"18\" viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                                    fill=\"#1D2939\" />\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                                    fill=\"#1D2939\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Entrance</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'entrance'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                            </ul>\r\n\r\n                                        </div>\r\n                                        <div class=\"element-name\">{{item[2].elementType}} {{item[2].elementNumber}}\r\n                                        </div>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"unit-input\">\r\n                                        <svg (click)=\"onDistanceChange('decrement', i)\" class=\"cursor-pointer\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n                                            viewBox=\"0 0 14 14\" fill=\"none\">\r\n                                            <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                        <span>{{item[2].distance}}</span>\r\n                                        <svg (click)=\"onDistanceChange('increment', i)\" class=\"cursor-pointer\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n                                            viewBox=\"0 0 14 14\" fill=\"none\">\r\n                                            <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\"\r\n                                                stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div (click)=\"toggleDirectionSelect(i)\"\r\n                                        class=\"direction-dropdown position-relative\">\r\n                                        <div>\r\n                                            {{item[2].direction}}\r\n                                        </div>\r\n\r\n                                        <div class=\"down-arrow\">\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n                                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                            </svg>\r\n                                        </div>\r\n\r\n                                        <ul *ngIf=\"directionSelect?.show && directionSelect?.index === i\"\r\n                                            [ngClass]=\" (directionSelect.show && directionSelect.index === i) ? 'z-1': ''\"\r\n                                            class=\"list-unstyled mb-2\">\r\n                                            <li (click)=\"onDirectionChange('up', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'up' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Up</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'up'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('down', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'down' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Down</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'down'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('right', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'right' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Right</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'right'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('left', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'left' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Left</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'left'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                        </ul>\r\n\r\n                                    </div>\r\n                                </td>\r\n\r\n                                <td>\r\n                                    <input min=\"0\" max=\"180\" class=\"angle-input\" [(ngModel)]=\"item[2].angle\"\r\n                                        type=\"number\" (input)=\"validateAngleInput($event, i)\" (blur)=\"onAngleChange(i)\">\r\n                                    <!-- <span class=\"angle-input\">\r\n                                        {{item[2].angle}}°\r\n                                    </span> -->\r\n                                </td>\r\n                                <td>\r\n                                    <div (click)=\"toggleLineOptionsSelect(i)\"\r\n                                        class=\"d-flex  align-items-center justify-content-center h-100 elipsis-icon-dropdown\">\r\n                                        <svg class=\"cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"4\"\r\n                                            height=\"19\" viewBox=\"0 0 4 19\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M1 9.50016C1 10.0294 1.44771 10.4585 2 10.4585C2.55228 10.4585 3 10.0294 3 9.50016C3 8.97089 2.55228 8.54183 2 8.54183C1.44771 8.54183 1 8.97089 1 9.50016Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M0.999999 16.2085C0.999999 16.7378 1.44771 17.1668 2 17.1668C2.55228 17.1668 3 16.7378 3 16.2085C3 15.6792 2.55228 15.2502 2 15.2502C1.44771 15.2502 0.999999 15.6792 0.999999 16.2085Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M1 2.79183C1 3.3211 1.44772 3.75016 2 3.75016C2.55228 3.75016 3 3.3211 3 2.79183C3 2.26256 2.55228 1.8335 2 1.8335C1.44772 1.8335 1 2.26256 1 2.79183Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                        <ul *ngIf=\"lineOptionsSelect?.show && lineOptionsSelect?.index === i\"\r\n                                            [ngClass]=\" (lineOptionsSelect.show && lineOptionsSelect.index === i) ? 'z-1': ''\"\r\n                                            class=\"list-unstyled mb-2\">\r\n                                            <li (click)=\"onAddStep(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Add new step</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n                                            <li (click)=\"onDuplicateStep(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Duplicate</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n                                            <li (click)=\"onLineDelete(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div class=\"text-danger\">Delete</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n\r\n                                        </ul>\r\n                                    </div>\r\n\r\n                                </td>\r\n                            </tr>\r\n                        </ng-container>\r\n\r\n                    </tbody>\r\n                </table>\r\n            </div>\r\n\r\n\r\n        </div>\r\n    </div>\r\n    <div [ngClass]=\"layoutMode === 'full' ? 'col-10' : 'col-7'\">\r\n        <div class=\"c-card \" style=\"height: 75dvh;\">\r\n            <div style=\"height: 7%;\" class=\"d-flex align-items-center justify-content-between\">\r\n                <div>\r\n                    <!-- <lib-reactive-select *ngIf=\"floorsInput.value\" [formControl]=\"floorsInput\" [idField]=\"'id'\"\r\n                        [nameField]=\"'floorName'\" [data]=\"selectedStore?.floor\"></lib-reactive-select> -->\r\n                    <div (click)=\"toggleFloorSelect()\" class=\"floor-select\">\r\n                        <div>{{selectedFloor?.floorName}}</div>\r\n                        <div><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></div>\r\n                        <ul *ngIf=\"floorSelect?.show\" class=\"list-unstyled mb-2\">\r\n                            <li (click)=\"onFloorSelect(floor._id)\"\r\n                                *ngFor=\"let floor of selectedStore?.floors; let i = index\"\r\n                                [ngClass]=\"floor._id === selectedFloor._id ? 'selected': ''\">\r\n                                <div class=\"d-flex justify-content-between\">\r\n                                    <span>{{floor?.floorName}}</span>\r\n                                    <span *ngIf=\"selectedStore?.floors.length > 1\"\r\n                                        (click)=\"$event.stopPropagation(); floorSelect.deleteIndex = i\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"23\"\r\n                                            viewBox=\"0 0 24 23\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M11 11.4999C11 12.0292 11.4477 12.4583 12 12.4583C12.5523 12.4583 13 12.0292 13 11.4999C13 10.9706 12.5523 10.5416 12 10.5416C11.4477 10.5416 11 10.9706 11 11.4999Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M11 18.2083C11 18.7375 11.4477 19.1666 12 19.1666C12.5523 19.1666 13 18.7375 13 18.2083C13 17.679 12.5523 17.2499 12 17.2499C11.4477 17.2499 11 17.679 11 18.2083Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M11 4.79159C11 5.32086 11.4477 5.74992 12 5.74992C12.5523 5.74992 13 5.32086 13 4.79159C13 4.26231 12.5523 3.83325 12 3.83325C11.4477 3.83325 11 4.26231 11 4.79159Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </span>\r\n                                </div>\r\n\r\n                                <div *ngIf=\"floorSelect.deleteIndex === i\"\r\n                                    (click)=\"$event.stopPropagation(); deleteFloor(i)\" class=\"option\">Delete</div>\r\n                            </li>\r\n                            <li (click)=\"openAddFloorModal()\">\r\n                                <span>\r\n                                    <span class=\"mr-2\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n                                            viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                            <path d=\"M8.00016 3.33325V12.6666M3.3335 7.99992H12.6668\" stroke=\"#101828\"\r\n                                                stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </span>\r\n                                    <span>Add floor</span>\r\n                                </span>\r\n\r\n                            </li>\r\n                        </ul>\r\n                    </div>\r\n                </div>\r\n                <div class=\"d-flex align-items-center\" >\r\n                <button ngbTooltip=\"Re-Orient\" (click)=\"findPolygonCenterAndScroll()\" class=\"btn btn-sm btn-outline bg-white me-3\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" fill=\"none\" viewBox=\"0 0 128 128\" id=\"recenter\">\r\n                        <path stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"7\" d=\"M38 74L49 63.5 38 53M53.5 37.5L64 48.5 74.5 37.5M90 53L79 63.5 90 74M74.5 89.5L64 78.5 53.5 89.5\"></path>\r\n                        <path stroke=\"#000\" stroke-linecap=\"round\" stroke-width=\"7\" d=\"M44 64L16 64M63.5 43.5L63.5 15.5M84 63L112 63M64.5 83.5L64.5 111.5\"></path>\r\n                        <circle cx=\"64\" cy=\"64\" r=\"5\" fill=\"#000\"></circle>\r\n                      </svg>\r\n                </button>\r\n                <button ngbTooltip=\"Rotate\" class=\"btn btn-sm btn-outline bg-white\" (click)=\"rotatePolygons()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n                        <path\r\n                            d=\"M6.36265 7.17838L7.17625 6.36238L5.90425 5.09158L5.08945 5.90518L6.36265 7.17838ZM15.671 6.36358L19.6379 10.3304L20.9099 9.0572L16.9442 5.09038L15.671 6.36358ZM19.6379 18.8252L18.8243 19.6388L20.0963 20.9096L20.9099 20.0972L19.6379 18.8252ZM10.3295 19.6388L6.36265 15.672L5.09065 16.9452L9.05626 20.9108L10.3295 19.6388ZM18.8243 19.6388C17.6543 20.8076 16.8407 21.6188 16.1459 22.1492C15.4715 22.664 15.0155 22.8284 14.5763 22.8284V24.6284C15.5675 24.6284 16.4027 24.2168 17.2367 23.5808C18.0503 22.9604 18.9635 22.0448 20.0963 20.912L18.8243 19.6388ZM9.05626 20.9108C10.1891 22.0448 11.1023 22.9592 11.9159 23.5808C12.7499 24.2168 13.5851 24.6284 14.5763 24.6284V22.8284C14.1371 22.8284 13.6823 22.664 13.0067 22.1492C12.3119 21.6188 11.4983 20.8076 10.3295 19.6388L9.05626 20.9108ZM19.6379 10.3304C20.8067 11.4992 21.6179 12.3128 22.1483 13.0076C22.6631 13.6832 22.8275 14.138 22.8275 14.5772H24.6275C24.6275 13.586 24.2159 12.7508 23.5799 11.9168C22.9595 11.1032 22.0427 10.19 20.9099 9.0572L19.6379 10.3304ZM20.9099 20.0972C22.0439 18.9632 22.9583 18.0512 23.5799 17.2376C24.2159 16.4036 24.6275 15.5684 24.6275 14.5772H22.8275C22.8275 15.0164 22.6631 15.4724 22.1483 16.1468C21.6179 16.8416 20.8067 17.6552 19.6379 18.8252L20.9099 20.0972ZM7.17625 6.36238C8.34625 5.19358 9.15985 4.38118 9.85465 3.85078C10.529 3.33598 10.985 3.17278 11.4242 3.17278V1.37158C10.433 1.37158 9.59785 1.78318 8.76385 2.41918C7.94905 3.04078 7.03705 3.95518 5.90425 5.08798L7.17625 6.36238ZM16.9442 5.09038C15.8114 3.95638 14.8982 3.04078 14.0846 2.41918C13.2506 1.78318 12.4154 1.37158 11.4242 1.37158V3.17278C11.8634 3.17278 12.3182 3.33598 12.9938 3.85078C13.6886 4.38118 14.5022 5.19238 15.671 6.36118L16.9442 5.09038ZM5.08945 5.90278C3.95665 7.03558 3.04225 7.94758 2.42065 8.76238C1.78465 9.59638 1.37305 10.4316 1.37305 11.4228H3.17305C3.17305 10.9836 3.33745 10.5276 3.85225 9.85318C4.38265 9.15838 5.19385 8.34478 6.36265 7.17478L5.08945 5.90278ZM6.36265 15.6708C5.19385 14.5008 4.38265 13.6872 3.85225 12.9924C3.33745 12.318 3.17305 11.862 3.17305 11.4228H1.37305C1.37305 12.414 1.78465 13.2492 2.42065 14.0832C3.04225 14.8968 3.95665 15.81 5.08945 16.9428L6.36265 15.6708Z\"\r\n                            fill=\"#1D2939\" />\r\n                        <path\r\n                            d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                            stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </button>    \r\n                </div>\r\n                \r\n            </div>\r\n            <div class=\"hide-scrollbar\" style=\"height: 93%; overflow: scroll; position: relative;\" #scrollContainer>\r\n                <canvas #gridCanvas>\r\n\r\n                </canvas>\r\n\r\n                <div *ngIf=\"popupVisible && popupPosition\" [style.top.px]=\"popupPosition.y\"\r\n                    [style.left.px]=\"popupPosition.x\" class=\"angle-widget\">\r\n                    <div (click)=\"toggleWidgetElementSelect()\" style=\"width: 147px;\"\r\n                        class=\"element-type-dropdown widget-element-type-dropdown d-flex justify-content-between position-relative\">\r\n                        <div>\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'wall'\">\r\n                                <svg class=\"me-3\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                        fill=\"#344054\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Wall</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'facade'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                        stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Glass...</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'opening'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                        stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Openi...</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'entrance'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\" viewBox=\"0 0 21 18\"\r\n                                    fill=\"none\">\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                        fill=\"#1D2939\" />\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                        fill=\"#1D2939\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Entra...</span>\r\n                            </span>\r\n\r\n                        </div>\r\n\r\n                        <div class=\"down-arrow\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                        </div>\r\n\r\n                        <ul *ngIf=\"widgetElementSelect?.show \" [ngClass]=\" widgetElementSelect.show ? 'z-4': ''\"\r\n                            class=\"list-unstyled mb-2\">\r\n                            <li (click)=\"elementType = 'wall'\" [ngClass]=\"elementType === 'wall' ? 'selected' : ''\"\r\n                                class=\"selected\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                fill=\"#344054\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Wall</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'wall'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'facade'\" [ngClass]=\"elementType === 'facade' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\"\r\n                                            viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Glass/Facade</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'facade'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'opening'\"\r\n                                [ngClass]=\"elementType === 'opening' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Opening</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'opening'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'entrance'\"\r\n                                [ngClass]=\"elementType === 'entrance' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\"\r\n                                            viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                fill=\"#1D2939\" />\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                fill=\"#1D2939\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Entrance</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'entrance'\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                        width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                        </ul>\r\n\r\n                    </div>\r\n\r\n                    <div class=\"unit-input\">\r\n                        <svg (click)=\"onWidgetDistanceChange('decrement')\" class=\"cursor-pointer\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n                            <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                        <span>{{movePixels}}</span>\r\n                        <svg (click)=\"onWidgetDistanceChange('increment')\" class=\"cursor-pointer\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n                            <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                    </div>\r\n\r\n                    <div class=\"position-relative\" style=\"position: relative; width: 229px; height: 229px;\">\r\n                        <div\r\n                            style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 3;\">\r\n                            <div style=\"margin-bottom: 27px;\" class=\"d-flex justify-content-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('up')\"\r\n                                    [ngClass]=\"moveDirection === 'up' ? 'direction-selected' : ''\"\r\n                                    class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M6.00016 10.6673L6.00016 1.33398M6.00016 1.33398L1.3335 6.00065M6.00016 1.33398L10.6668 6.00065\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"d-flex justify-content-center align-items-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('left')\"\r\n                                    [ngClass]=\"moveDirection === 'left' ? 'direction-selected' : ''\"\r\n                                    style=\"margin-right: 8px;\" class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M10.6663 5.99935L1.33301 5.99935M1.33301 5.99935L5.99967 10.666M1.33301 5.99935L5.99968 1.33268\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                                <div class=\"unit-input\">\r\n                                    <svg (click)=\"onWidgetAngleChange('decrement')\" class=\"cursor-pointer\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"\r\n                                        fill=\"none\">\r\n                                        <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                    <span>{{moveAngle}}°</span>\r\n                                    <svg (click)=\"onWidgetAngleChange('increment')\" class=\"cursor-pointer\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"\r\n                                        fill=\"none\">\r\n                                        <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\"\r\n                                            stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                                <div (click)=\"onWidgetDirectionChange('right')\"\r\n                                    [ngClass]=\"moveDirection === 'right' ? 'direction-selected' : ''\"\r\n                                    style=\"margin-left: 8px;\" class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M1.33366 6.00065L10.667 6.00065M10.667 6.00065L6.00033 1.33398M10.667 6.00065L6.00033 10.6673\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                            </div>\r\n\r\n                            <div style=\"margin-top: 27px;\" class=\"d-flex justify-content-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('down')\"\r\n                                    [ngClass]=\"moveDirection === 'down' ? 'direction-selected' : ''\"\r\n                                    class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M5.99984 1.33268L5.99984 10.666M5.99984 10.666L10.6665 5.99935M5.99984 10.666L1.33317 5.99935\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                        <canvas height=\"229px\" width=\"229px\" #widgetCanvas\r\n                            style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1;\"></canvas>\r\n                        <div style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 2;\"\r\n                            #circle class=\"circle\">\r\n                            <div class=\"line\" *ngFor=\"let line of lines\"\r\n                                [ngClass]=\"{'line--highlight': line.highlight, 'line--invisible': line.invisible}\"\r\n                                [style.transform]=\"line.transform\"></div>\r\n\r\n                            <div #pointer class=\"pointer\"></div>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <button (click)=\"movePointWithAngle()\"\r\n                        [disabled]=\"!movePixels && moveAngle  !== undefined && moveAngle  !== null\"\r\n                        class=\" w-100 go-btn\">Go</button>\r\n\r\n                </div>\r\n\r\n                <!-- <div *ngIf=\"popupVisible && popupPosition\" [style.top.px]=\"popupPosition.y\" [style.left.px]=\"popupPosition.x\"\r\n                    class=\"popup\">\r\n                    <label>Move Pixels:</label>\r\n                    <select [(ngModel)]=\"elementType\">\r\n                        <option value=\"wall\">Wall</option>\r\n                        <option value=\"facade\">Glass/Facade</option>\r\n                        <option value=\"opening\">Opening</option>\r\n                        <option value=\"entrance\">Entrance</option>\r\n                    </select>\r\n                    <input type=\"number\" [(ngModel)]=\"movePixels\" />\r\n\r\n                    <select [(ngModel)]=\"moveDirection\">\r\n                        <option value=\"right\">Right</option>\r\n                        <option value=\"down\">Down</option>\r\n                        <option value=\"left\">Left</option>\r\n                        <option value=\"up\">Up</option>\r\n                    </select>\r\n                    <input type=\"number\" [(ngModel)]=\"moveAngle\" (ngModelChange)=\"layoutLengthPreview()\" />\r\n                    <button (click)=\"movePointWithAngle()\">Move with angle</button>\r\n                </div> -->\r\n            </div>\r\n\r\n        </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"planoStoreList.length > 1\" class=\"col-12 mt-6\">\r\n        <div style=\"padding: 0px !important;\" class=\"c-card\">\r\n            <lib-pagination [itemsPerPage]=\"itemsPerPage\" (pageChange)=\"onPageChange($event)\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n                [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"></lib-pagination>\r\n        </div>\r\n    </div>\r\n\r\n</div>","import { Component } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-complete-layout',\r\n  standalone: false,\r\n  templateUrl: './complete-layout.component.html',\r\n  styleUrl: './complete-layout.component.scss'\r\n})\r\nexport class CompleteLayoutComponent {\r\n    constructor(public modal:NgbActiveModal){}\r\n  \r\n}\r\n","<div class=\"header mb-5\" >\r\n    Complete layout\r\n</div>\r\n<div class=\"description mb-7\">\r\n    Are you sure you want to finalize this layout? You can always return and make edits before submitting it for fixture validation.\r\n</div>\r\n<div class=\"d-flex align-items-center justify-content-end\">\r\n    <button class=\"btn btn-outline bg-white me-5\" (click)=\"modal.close()\" >Cancel</button>\r\n    <button class=\"btn btn-sm btn-primary\" (click)=\"modal.close({message:'confirm'})\">Complete</button>\r\n</div>","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { AfterViewInit, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output, Renderer2, ViewChild } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { HeaderFilter } from '../../interfaces/layout-builder.interface';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { NgbModal, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { StoreOffcanvasComponentComponent } from '../store-offcanvas-component/store-offcanvas-component.component';\r\nimport { CompleteLayoutComponent } from './popups/complete-layout/complete-layout.component';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n@Component({\r\n  selector: 'lib-layout-summary',\r\n  templateUrl: './layout-summary.component.html',\r\n  styleUrl: './layout-summary.component.scss'\r\n})\r\nexport class LayoutSummaryComponent implements OnInit, AfterViewInit, OnDestroy {\r\n\r\n  floorsInput = new FormControl()\r\n  @ViewChild('gridCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('scrollContainer') scrollContainerRef!: ElementRef;\r\n  @ViewChild('completeLayout') completeLayout!: ElementRef;\r\n\r\n\r\n  gridWidth = 5;\r\n  gridHeight = 5;\r\n\r\n  private ctx!: CanvasRenderingContext2D;\r\n  private canvas!: HTMLCanvasElement;\r\n\r\n  layoutPolygon: any[] = [[\r\n    {\r\n      \"x\": 100,\r\n      \"y\": 100\r\n    },\r\n    {\r\n      \"x\": 100,\r\n      \"y\": 100\r\n    },\r\n    {\r\n      \"elementType\": \"wall\",\r\n      \"distance\": 0,\r\n      \"unit\": \"ft\",\r\n      \"direction\": \"right\",\r\n      \"angle\": 90,\r\n      \"elementNumber\": 1\r\n    }\r\n  ]]\r\n\r\n  private scale = 1;\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  headerData: HeaderFilter | null | undefined;\r\n\r\n  planoStoreList: any[] = []\r\n  selectedStore: any\r\n  selectedFloor: any\r\n  wallCapacity: number\r\n  facadeCapacity: number\r\n  floorCapacity: number\r\n\r\n  floorSelect: { show: boolean, deleteIndex: number | null } = { show: false, deleteIndex: null }\r\n\r\n  markAsCompleteType: 'single' | 'multiple' = 'single'\r\n\r\n  itemsPerPage = 1\r\n  currentPage = 0\r\n  totalItems = 1\r\n  paginationSizes = [1]\r\n  pageSize = 1\r\n\r\n  pixelPerMetre: number = 50\r\n\r\n\r\n  onFloorSelect(floorId: string) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === floorId)[0]\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onOutsideClick(event: MouseEvent): void {\r\n\r\n    const clickedInside6 = (event.target as HTMLElement).closest('.floor-select');\r\n    if (!clickedInside6) {\r\n      this.floorSelect = { show: false, deleteIndex: null };\r\n    }\r\n  }\r\n\r\n  toggleFloorSelect(): void {\r\n    this.floorSelect = {\r\n      show: !this.floorSelect.show,\r\n      deleteIndex: null\r\n    };\r\n  }\r\n\r\n  constructor(private route: ActivatedRoute, private apiService: StoreBuilderService, private modalService: NgbModal,\r\n    private offcanvasService: NgbOffcanvas, private router: Router, private modalDef: NgbModal, private toastService:ToastService) {\r\n    this.headerData = JSON.parse(localStorage.getItem('header-filters') as string)\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.initializeLayout()\r\n  }\r\n\r\n  initializeLayout() {\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    this.layoutPolygon = [\r\n      [\r\n        {\r\n          \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n          \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n        },\r\n        {\r\n          \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n          \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n        },\r\n        {\r\n          \"elementType\": \"wall\",\r\n          \"distance\": 0,\r\n          \"unit\": \"ft\",\r\n          \"direction\": \"right\",\r\n          \"angle\": 90,\r\n          \"elementNumber\": 1\r\n        }\r\n      ]\r\n    ]\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.canvas = this.canvasRef.nativeElement;\r\n    this.ctx = this.canvas.getContext('2d')!;\r\n\r\n    this.canvas.width = 10000;\r\n    this.canvas.height = 10000;\r\n\r\n\r\n    this.drawGrid();\r\n\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.id) {\r\n          const ids = params.id.split(',') || [];\r\n          this.getPlanoData(ids)\r\n        }\r\n      });\r\n\r\n    this.floorsInput.valueChanges.subscribe((val) => {\r\n      if (val) {\r\n        if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n          this.updateFloorLayout()\r\n        }\r\n        this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === val)[0]\r\n        this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  onStoreChange(event: any) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    const index = this.planoStoreList.findIndex(item => item.planoId === event.planoId);\r\n    this.currentPage = index + 1\r\n    this.selectedStore = event;\r\n    this.selectedFloor = this.selectedStore.floors[0];\r\n    this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n  }\r\n\r\n  getPlanoData(planoId: string[]) {\r\n    const payload = {\r\n      id: planoId\r\n    }\r\n\r\n    this.apiService.getPlano(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.planoStoreList = res.data\r\n        this.totalItems = res.data.length\r\n        // this.planoStoreList = res.data.filter((plano:any) => plano.status !== 'completed');\r\n        if (!this.selectedStore) {\r\n          this.selectedStore = this.planoStoreList[0]\r\n        } else {\r\n          this.selectedStore = this.planoStoreList.filter((store: any) => store.planoId === this.selectedStore.planoId)[0]\r\n        }\r\n        if (!this.selectedFloor) {\r\n          this.selectedFloor = this.selectedStore.floors[0]\r\n        } else {\r\n          this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === this.selectedFloor._id)[0]\r\n        }\r\n\r\n        this.planoStoreList.forEach((store) => {\r\n          if (store.planoId === this.selectedStore.planoId) {\r\n            store.selected = true\r\n          }\r\n        })\r\n\r\n        this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false })\r\n        this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  updateFloorLayout() {\r\n    const payload = {\r\n      id: this.selectedFloor._id,\r\n      layoutPolygon: this.layoutPolygon.map((segment) => {\r\n        const [point1, point2, properties] = segment\r\n        return properties\r\n      })\r\n    }\r\n\r\n    this.apiService.updateFloorLayout(payload).subscribe({\r\n      next: (res) => {\r\n        this.getPlanoData(this.selectedStore.planoId)\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onComplete() {\r\n\r\n    if (this.planoStoreList.length === 1) {\r\n      const modelRef = this.modalDef.open(CompleteLayoutComponent, { centered: true });\r\n      modelRef.result.then((val: any) => {\r\n        if (val.message === 'confirm') {\r\n          this.updatePlanoStatus()\r\n        }\r\n      })\r\n    } else {\r\n      this.modalService.open(this.completeLayout, { centered: true, size: \"lg\" })\r\n    }\r\n  }\r\n\r\n\r\n  drawGrid(): void {\r\n    this.ctx.save();\r\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n    this.ctx.scale(this.scale, this.scale);\r\n    this.ctx.fillStyle = 'white';\r\n    this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n  }\r\n\r\n  drawPolygon(polygon = this.layoutPolygon) {\r\n    if (polygon.length < 1) return; // If the polygon has no edges, exit early.\r\n\r\n    this.ctx.save(); // Save the current canvas state.\r\n    this.ctx.scale(this.scale, this.scale); // Scale the canvas context to match the desired scale.\r\n    // this.ctx.translate(this.panOffset.x, this.panOffset.y);\r\n\r\n\r\n    // Function to draw an arrowhead at a specific location and angle.\r\n    function drawArrowhead(ctx: any, x: any, y: any, angle: any) {\r\n      const size = 5; // Define the size of the arrowhead.\r\n      ctx.save(); // Save the current canvas state.\r\n      ctx.translate(x, y); // Move the context to the arrowhead position.\r\n      ctx.rotate(angle); // Rotate the context to match the arrow's angle.\r\n      ctx.beginPath(); // Start a new path.\r\n      ctx.moveTo(0, 0); // Move to the tip of the arrowhead.\r\n      ctx.lineTo(-size, -size / 2); // Draw one side of the arrowhead.\r\n      ctx.lineTo(-size, size / 2); // Draw the other side of the arrowhead.\r\n      ctx.closePath(); // Close the arrowhead path.\r\n      ctx.fillStyle = 'black'; // Set the arrowhead color.\r\n      ctx.fill(); // Fill the arrowhead.\r\n      ctx.restore(); // Restore the previous canvas state.\r\n    }\r\n\r\n    this.ctx.beginPath(); // Begin the main polygon path.\r\n    polygon.forEach((edge, edgeIndex) => {\r\n      const point = edge[0]; // Starting point of the edge.\r\n      const nextPoint = edge[1]; // Ending point of the edge.\r\n      const properties = edge[2]; // Properties of the edge (e.g., labels, distances).\r\n\r\n      // Draw the main polygon edge.\r\n      if (edgeIndex === 0) this.ctx.moveTo(point.x, point.y); // Move to the first edge starting point.\r\n      this.ctx.lineTo(nextPoint.x, nextPoint.y); // Draw a line to the next point.\r\n\r\n      // Calculate the perpendicular offset for the bounding box.\r\n      const dx = nextPoint.x - point.x; // X-difference between start and end points.\r\n      const dy = nextPoint.y - point.y; // Y-difference between start and end points.\r\n      const length = Math.sqrt(dx * dx + dy * dy); // Length of the edge.\r\n      const offsetX = (dy / length) * 20; // Offset in the X direction.\r\n      const offsetY = (-dx / length) * 20; // Offset in the Y direction.\r\n\r\n      // Define the bounding box points.\r\n      const boxPoints = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY },\r\n      ];\r\n\r\n      // Draw the bounding box.\r\n      this.ctx.beginPath();\r\n      this.ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n      boxPoints.forEach((pt, index) => {\r\n        if (properties.elementType === 'entrance') {\r\n          if (index < 2) {\r\n            this.ctx.lineTo(pt.x, pt.y)\r\n          }\r\n        } else {\r\n          this.ctx.lineTo(pt.x, pt.y); // Draw each edge of the box.\r\n        }\r\n      });\r\n      if (properties.elementType === 'opening') {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n\r\n        this.ctx.strokeStyle = '#F9FAFB'\r\n\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      } else {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n        this.ctx.strokeStyle = '#1D2939'\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      }\r\n\r\n\r\n      // Position text in the middle of the bounding box.\r\n      const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n      const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n      this.ctx.save(); // Save the current canvas state.\r\n      this.ctx.translate(textX, textY); // Move the context to the text position.\r\n\r\n      // Rotate text based on the edge direction.\r\n      if (dx === 0) {\r\n        this.ctx.rotate(-Math.PI / 2); // Rotate for vertical edges.\r\n      } else if (dy !== 0) {\r\n        const angle = Math.atan2(dy, dx); // Calculate angle for diagonal edges.\r\n        this.ctx.rotate(angle); // Rotate the text to match the angle.\r\n      }\r\n\r\n      // Draw the edge properties as text.\r\n      this.ctx.font = '12px Arial'; // Set the font style and size.\r\n      this.ctx.fillStyle = 'black'; // Set the text color.\r\n      this.ctx.textAlign = 'center'; // Align text to the center.\r\n      this.ctx.textBaseline = 'middle'; // Align text vertically in the middle.\r\n      this.ctx.fillText(\r\n        `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n        0,\r\n        0\r\n      );\r\n      this.ctx.restore(); // Restore the previous canvas state.\r\n\r\n      if (properties.distance >= 4) {\r\n        // Define the midpoints of the left and right edges of the bounding box.\r\n        const centerX = textX;\r\n        const centerY = textY;\r\n        const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n        const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n        const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n        const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n        // Helper function to adjust points by a specific distance.\r\n        function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n          const angle = Math.atan2(y2 - y1, x2 - x1); // Calculate the angle.\r\n          return {\r\n            x: x1 + Math.cos(angle) * distance, // Adjust X by distance.\r\n            y: y1 + Math.sin(angle) * distance, // Adjust Y by distance.\r\n          };\r\n        }\r\n\r\n        // Define the arrow line start and end points for the right side.\r\n        const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n        const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n\r\n        // Define the arrow line start and end points for the left side.\r\n        const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n        const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n        // Draw the right arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(rightStart.x, rightStart.y);\r\n        this.ctx.lineTo(rightEnd.x, rightEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n        drawArrowhead(this.ctx, rightEnd.x, rightEnd.y, rightAngle); // Draw the arrowhead.\r\n\r\n        // Draw the left arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(leftStart.x, leftStart.y);\r\n        this.ctx.lineTo(leftEnd.x, leftEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n        drawArrowhead(this.ctx, leftEnd.x, leftEnd.y, leftAngle); // Draw the arrowhead.\r\n\r\n      }\r\n\r\n      // For Entrance\r\n      if (properties.elementType === 'entrance') {\r\n        // Calculate the angle of the main line (edge) in radians.\r\n        const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n        // Add 15 degrees to the angle for the entrance line.\r\n        const entranceAngle = angle + (15 * Math.PI) / 180; // Convert 15 degrees to radians.\r\n\r\n        // Define the length of the entrance line.\r\n        const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n\r\n        // Calculate the endpoint of the entrance line based on the angle.\r\n        const endPoint = {\r\n          x: point.x + Math.cos(entranceAngle) * lineLength,\r\n          y: point.y + Math.sin(entranceAngle) * lineLength,\r\n        };\r\n\r\n        // Draw the entrance line.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(point.x, point.y);\r\n        this.ctx.lineTo(endPoint.x, endPoint.y);\r\n        this.ctx.strokeStyle = '#1D2939'\r\n        this.ctx.stroke();\r\n      }\r\n\r\n\r\n    });\r\n\r\n    this.ctx.restore(); // Restore the original canvas state.\r\n  }\r\n\r\n  zoomIn(): void {\r\n    this.scale *= 1.1;\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  zoomOut(): void {\r\n    this.scale /= 1.1;\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  redrawCanvas(): void {\r\n    this.drawGrid();\r\n    this.drawPolygon();\r\n  }\r\n\r\n\r\n\r\n  snapToGrid(value: number, gridSize: number): number {\r\n    return Math.round(value / gridSize) * gridSize;\r\n  }\r\n\r\n\r\n  rotatePolygons(): void {\r\n    const rotatePoint = (point: { x: number; y: number }, center: { x: number; y: number }): { x: number; y: number } => {\r\n      const dx = point.x - center.x;\r\n      const dy = point.y - center.y;\r\n      return { x: center.x - dy, y: center.y + dx };\r\n    };\r\n\r\n    const getPolygonLineCenter = (line: any[]): { x: number; y: number } => {\r\n      const [start, end] = line;\r\n      return {\r\n        x: (start.x + end.x) / 2,\r\n        y: (start.y + end.y) / 2,\r\n      };\r\n    };\r\n\r\n    const getOverallCenter = (lines: any[]): { x: number; y: number } => {\r\n      const sum = lines.reduce(\r\n        (acc, line) => {\r\n          const center = getPolygonLineCenter(line);\r\n          acc.x += center.x;\r\n          acc.y += center.y;\r\n          return acc;\r\n        },\r\n        { x: 0, y: 0 }\r\n      );\r\n\r\n      return { x: sum.x / lines.length, y: sum.y / lines.length };\r\n    };\r\n\r\n    const overallCenter = getOverallCenter(this.layoutPolygon);\r\n\r\n    this.layoutPolygon = this.layoutPolygon.map((line) => {\r\n      const [start, end, properties] = line;\r\n      return [\r\n        rotatePoint(start, overallCenter),\r\n        rotatePoint(end, overallCenter),\r\n        properties\r\n      ];\r\n    });\r\n\r\n\r\n    this.drawGrid();\r\n    this.drawPolygon();\r\n  }\r\n\r\n  convertToPixels(value: number, unit: 'ft' | 'm'): number {\r\n    const PIXELS_PER_METER = this.pixelPerMetre;\r\n    const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;\r\n\r\n    if (typeof value !== 'number' || value < 0) {\r\n      throw new Error('Value must be a non-negative number');\r\n    }\r\n\r\n    switch (unit) {\r\n      case 'm':\r\n        return value * PIXELS_PER_METER;\r\n      case 'ft':\r\n        return value * PIXELS_PER_FOOT;\r\n      default:\r\n        throw new Error(\"Invalid unit. Supported units are 'mt' for meters and 'ft' for feet.\");\r\n    }\r\n  }\r\n\r\n\r\n  scrollToCanvasPosition(coordinates: { x: number; y: number }): void {\r\n    const container = this.scrollContainerRef.nativeElement;\r\n\r\n    const containerRect = container.getBoundingClientRect();\r\n    const containerScrollLeft = container.scrollLeft;\r\n    const containerScrollTop = container.scrollTop;\r\n\r\n    const targetX = coordinates.x;\r\n    const targetY = coordinates.y;\r\n\r\n    const offset = {\r\n      up: 50,\r\n      down: 200,\r\n      left: 100,\r\n      right: 100,\r\n    };\r\n\r\n    const visibleLeft = containerScrollLeft + offset.left;\r\n    const visibleRight = containerScrollLeft + containerRect.width - offset.right;\r\n    const visibleTop = containerScrollTop + offset.up;\r\n    const visibleBottom = containerScrollTop + containerRect.height - offset.down;\r\n\r\n    const isXInView = targetX >= visibleLeft && targetX <= visibleRight;\r\n    const isYInView = targetY >= visibleTop && targetY <= visibleBottom;\r\n\r\n    if (!isXInView || !isYInView) {\r\n      const adjustedX = Math.max(0, targetX - offset.left);\r\n      const adjustedY = Math.max(0, targetY - offset.up);\r\n\r\n      container.scrollTo({\r\n        left: adjustedX,\r\n        top: adjustedY,\r\n        behavior: 'smooth',\r\n      });\r\n    }\r\n  }\r\n\r\n  calculatePolygonArea(elements: any[]): number {\r\n    const vertices: { x: number; y: number }[] = [];\r\n    const centerX = 0; // Assuming (0,0) as the starting point for calculation\r\n    const centerY = 0;\r\n    let currentPoint = { x: centerX, y: centerY };\r\n\r\n    const conversionFactor = 50; // Pixels per foot (adjust as needed)\r\n\r\n    // Compute vertices based on layout instructions\r\n    for (const element of elements) {\r\n      const radians: number = {\r\n        up: ((180 - element.angle) * Math.PI) / 180,\r\n        left: ((270 - element.angle) * Math.PI) / 180,\r\n        down: ((360 - element.angle) * Math.PI) / 180,\r\n        right: ((90 - element.angle) * Math.PI) / 180,\r\n      }[element.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${element.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = element.distance * conversionFactor;\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      vertices.push({ x: currentPoint.x, y: currentPoint.y });\r\n\r\n      currentPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n    }\r\n\r\n    // Close the polygon by adding the starting vertex at the end\r\n    vertices.push(vertices[0]);\r\n\r\n    // Apply the Shoelace formula\r\n    let areaInPixels = 0;\r\n    for (let i = 0; i < vertices.length - 1; i++) {\r\n      const x1 = vertices[i].x;\r\n      const y1 = vertices[i].y;\r\n      const x2 = vertices[i + 1].x;\r\n      const y2 = vertices[i + 1].y;\r\n      areaInPixels += x1 * y2 - y1 * x2;\r\n    }\r\n\r\n    // Convert area from pixels² to feet²\r\n    const areaInSquareFeet = Math.abs(areaInPixels / 2) / (conversionFactor * conversionFactor);\r\n\r\n    return Math.round(areaInSquareFeet); // Return the area in square feet\r\n  }\r\n\r\n\r\n\r\n\r\n  generateLayoutPolygon(layoutInstructions: any) {\r\n\r\n    this.pixelPerMetre = this.normalizedPixelPerMetre(layoutInstructions)\r\n\r\n    this.wallCapacity = layoutInstructions.reduce((acc: any, val: any) => {\r\n      if (val.elementType === 'wall') {\r\n        return acc += val.distance\r\n      } else {\r\n        return acc\r\n      }\r\n    }, 0)\r\n    this.facadeCapacity = layoutInstructions.reduce((acc: any, val: any) => {\r\n      if (val.elementType === 'facade') {\r\n        return acc += val.distance\r\n      } else {\r\n        return acc\r\n      }\r\n    }, 0)\r\n\r\n    this.floorCapacity = this.calculatePolygonArea(layoutInstructions)\r\n\r\n    this.layoutPolygon = [];\r\n\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n      \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n    };\r\n\r\n    if (!layoutInstructions.length) {\r\n\r\n      this.layoutPolygon = [\r\n        [\r\n          {\r\n            \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n            \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n          },\r\n          {\r\n            \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n            \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n          },\r\n          {\r\n            \"elementType\": \"wall\",\r\n            \"distance\": 0,\r\n            \"unit\": \"ft\",\r\n            \"direction\": \"right\",\r\n            \"angle\": 90,\r\n            \"elementNumber\": 1\r\n          }\r\n        ]\r\n      ]\r\n      this.openWidget({ x: this.snapToGrid(centerX, this.gridHeight), y: this.snapToGrid(centerY, this.gridWidth) })\r\n      this.drawGrid()\r\n      this.drawPolygon()\r\n      return\r\n    }\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      this.layoutPolygon.push(lineSegment);\r\n\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n    const lastPoint = this.layoutPolygon[this.layoutPolygon.length - 1][1]\r\n\r\n    if (this.isFloorCompleted(layoutInstructions)) {\r\n      this.findPolygonCenterAndScroll()\r\n    } else {\r\n      this.openWidget(lastPoint)\r\n    }\r\n\r\n    this.drawGrid()\r\n    this.drawPolygon()\r\n\r\n  }\r\n\r\n  isFloorCompleted(layoutInstructions: any, thresholdInFeet: number = 1): boolean {\r\n    const layoutPolygon: any[] = [];\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      layoutPolygon.push(lineSegment);\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n    const firstPoint = layoutPolygon?.[0]?.[0];\r\n    const lastPoint = layoutPolygon?.[layoutPolygon.length - 1]?.[1];\r\n\r\n    if (layoutPolygon.length <= 1 || !firstPoint || !lastPoint) {\r\n      return false;\r\n    }\r\n\r\n    const distanceBetweenPoints = Math.sqrt(\r\n      Math.pow(lastPoint.x - firstPoint.x, 2) + Math.pow(lastPoint.y - firstPoint.y, 2)\r\n    );\r\n\r\n    const thresholdInPixels = this.convertToPixels(thresholdInFeet, 'ft');\r\n    return distanceBetweenPoints <= thresholdInPixels;\r\n  }\r\n\r\n  openWidget(position: { x: number, y: number }, offset = { up: 0, right: 5, down: 15, left: 0, }) {\r\n    const adjustedPosition = {\r\n      x: position.x + offset.right + offset.left,\r\n      y: position.y + offset.up + offset.down,\r\n    };\r\n\r\n    this.scrollToCanvasPosition(adjustedPosition)\r\n\r\n  }\r\n\r\n  openOffCanva() {\r\n    let canvaRef = this.offcanvasService.open(StoreOffcanvasComponentComponent, { position: 'end', panelClass: 'set-height' })\r\n    canvaRef.componentInstance.store = this.selectedStore;\r\n    canvaRef.componentInstance.clientId = this.headerData?.client;\r\n    canvaRef.componentInstance.id = this.selectedStore.planoId;\r\n  }\r\n\r\n  onModalSelectAll(event: any) {\r\n    this.planoStoreList.forEach((store) => store.selected = event.target.checked)\r\n  }\r\n\r\n  get isAllStoreSelected() {\r\n    return this.planoStoreList.every((store) => store.selected)\r\n  }\r\n\r\n  onModalTypeChange(event: 'single' | 'multiple') {\r\n    if (event === 'single') {\r\n      this.planoStoreList.forEach((store, index) => {\r\n        if (store.planoId === this.selectedStore.planoId) {\r\n          store.selected = true\r\n        } else {\r\n          store.selected = false\r\n        }\r\n      })\r\n    } else if (event === 'multiple') {\r\n      this.planoStoreList.forEach((store) => store.selected = true)\r\n    }\r\n\r\n  }\r\n\r\n  updatePlanoStatus() {\r\n    const payload = {\r\n      storeId: this.planoStoreList.filter((store) => store.selected === true).map((store) => store.storeId),\r\n      status: \"completed\"\r\n    }\r\n\r\n    this.apiService.updatePlanoStatus(payload).subscribe({\r\n      next: (res:any) => {\r\n        if(res.code === 200){\r\n          this.toastService.getSuccessToast(res.message)\r\n          this.router.navigateByUrl('/manage/planogram/store-layout')\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onPageChange(val: number) {\r\n    this.selectedStore = this.planoStoreList[val - 1];\r\n    this.selectedFloor = this.selectedStore.floors[0];\r\n    this.floorsInput.setValue(this.selectedFloor._id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n  }\r\n\r\n  normalizedPixelPerMetre(polygon: any): number {\r\n    const MIN_PIXELS_PER_METER = 50;\r\n    const MAX_PIXELS_PER_METER = 150;\r\n\r\n    let totalLength = 0;\r\n    let lineCount = 0;\r\n\r\n    polygon.forEach((line: any) => {\r\n      if (line.unit === 'ft') {\r\n        totalLength = totalLength + (line.distance * 3.28084);\r\n      } else {\r\n        totalLength = totalLength + line.distance;\r\n      }\r\n      lineCount++;\r\n    });\r\n\r\n    const averageLength = lineCount > 0 ? totalLength / lineCount : 0;\r\n\r\n    const MAX_AVERAGE_LENGTH = 50;\r\n    const MIN_AVERAGE_LENGTH = 5;\r\n\r\n    const normalizedLength = Math.min(\r\n      Math.max(averageLength, MIN_AVERAGE_LENGTH),\r\n      MAX_AVERAGE_LENGTH\r\n    );\r\n\r\n    const pixelsPerMeter =\r\n      MAX_PIXELS_PER_METER -\r\n      ((normalizedLength - MIN_AVERAGE_LENGTH) / (MAX_AVERAGE_LENGTH - MIN_AVERAGE_LENGTH)) *\r\n      (MAX_PIXELS_PER_METER - MIN_PIXELS_PER_METER);\r\n\r\n    return Math.round(pixelsPerMeter);\r\n  }\r\n\r\n  findPolygonCenterAndScroll(polygon: any = this.layoutPolygon): void {\r\n    const vertices = polygon.flatMap((line: any) => line.slice(0, 2));\r\n\r\n    const minX = Math.min(...vertices.map((v: any) => v.x));\r\n    const maxX = Math.max(...vertices.map((v: any) => v.x));\r\n    const minY = Math.min(...vertices.map((v: any) => v.y));\r\n    const maxY = Math.max(...vertices.map((v: any) => v.y));\r\n\r\n    let center = { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\r\n\r\n    const step = 1;\r\n    let bestPoint = center;\r\n    let bestDistanceSum = Number.MAX_VALUE;\r\n\r\n    for (let x = minX; x <= maxX; x += step) {\r\n      for (let y = minY; y <= maxY; y += step) {\r\n        const point = { x, y };\r\n        if (isPointInsidePolygon(point, vertices)) {\r\n          const distanceSum = vertices.reduce(\r\n            (sum: number, vertex: any) => sum + Math.sqrt((point.x - vertex.x) ** 2 + (point.y - vertex.y) ** 2),\r\n            0\r\n          );\r\n          if (distanceSum < bestDistanceSum) {\r\n            bestDistanceSum = distanceSum;\r\n            bestPoint = point;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    const scrollContainer = this.scrollContainerRef.nativeElement;\r\n    scrollContainer.scrollTo({\r\n      left: bestPoint.x - scrollContainer.offsetWidth / 2,\r\n      top: bestPoint.y - scrollContainer.offsetHeight / 2,\r\n      behavior: 'smooth'\r\n    });\r\n\r\n    function isPointInsidePolygon(point: any, vertices: any): boolean {\r\n      let count = 0;\r\n      for (let i = 0; i < vertices.length; i++) {\r\n        const start = vertices[i];\r\n        const end = vertices[(i + 1) % vertices.length];\r\n        if (rayIntersectsSegment(point, { start, end })) {\r\n          count++;\r\n        }\r\n      }\r\n      return count % 2 === 1;\r\n    }\r\n\r\n    function rayIntersectsSegment(point: any, segment: any): boolean {\r\n      const { x, y } = point;\r\n      const { start, end } = segment;\r\n\r\n      if (y < Math.min(start.y, end.y) || y > Math.max(start.y, end.y)) {\r\n        return false;\r\n      }\r\n\r\n      const t = (y - start.y) / (end.y - start.y);\r\n      const intersectX = start.x + t * (end.x - start.x);\r\n\r\n      return intersectX >= x;\r\n    }\r\n  }\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"d-flex align-items-center justify-content-between mb-6\">\r\n  <div>\r\n    <div *ngIf=\"planoStoreList.length === 1\" class=\"storename-txt\">\r\n      {{selectedStore?.storeName}} - Layout\r\n    </div>\r\n    <div *ngIf=\"planoStoreList.length > 1\">\r\n      <lib-select-plano [items]=\"planoStoreList\" [multi]=\"false\" [searchField]=\"'storeName'\" [idField]=\"'storeId'\"\r\n        (selected)=\"onStoreChange($event)\" [selectedValues]=\"[selectedStore]\"></lib-select-plano>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"d-flex align-items-center\">\r\n    <button (click)=\"onComplete()\" class=\"btn btn-sm btn-primary me-5\">Complete</button>\r\n    <button (click)=\"openOffCanva()\" class=\"btn btn-sm btn-outline bg-white\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n        <path\r\n          d=\"M9 3V21M5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5C3 3.89543 3.89543 3 5 3Z\"\r\n          stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n    </button>\r\n  </div>\r\n</div>\r\n\r\n<div class=\"row mb-6\">\r\n  <div class=\"col-4\">\r\n    <div class=\"area-card\">\r\n      <div>\r\n        <div> <span class=\"main-txt me-2\">{{wallCapacity || 0}}</span> <span class=\"unit-txt\">rft</span> </div>\r\n        <div class=\"sub-txt\">Wall capacity</div>\r\n      </div>\r\n      <div>\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"65\" height=\"65\" viewBox=\"0 0 65 65\" fill=\"none\">\r\n          <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n            d=\"M4.33333 4.33333V0H8.66667V4.33333H21.6667V0H26V4.33333H39V0H43.3333V4.33333H56.3333V0H60.6667V4.33333H65V8.66667H60.6667V21.6667H65V26H60.6667V39H65V43.3333H60.6667V56.3333H65V60.6667H60.6667V65H56.3333V60.6667H43.3333V65H39V60.6667H26V65H21.6667V60.6667H8.66667V65H4.33333V60.6667H0V56.3333H4.33333V43.3333H0V39H4.33333V26H0V21.6667H4.33333V8.66667H0V4.33333H4.33333ZM8.66667 8.66667V21.6667H21.6667V8.66667H8.66667ZM26 8.66667V21.6667H39V8.66667H26ZM43.3333 8.66667V21.6667H56.3333V8.66667H43.3333ZM56.3333 26H43.3333V39H56.3333V26ZM56.3333 43.3333H43.3333V56.3333H56.3333V43.3333ZM39 56.3333V43.3333H26V56.3333H39ZM21.6667 56.3333V43.3333H8.66667V56.3333H21.6667ZM8.66667 39H21.6667V26H8.66667V39ZM26 26V39H39V26H26Z\"\r\n            fill=\"#344054\" />\r\n        </svg>\r\n      </div>\r\n    </div>\r\n  </div>\r\n  <div class=\"col-4\">\r\n    <div class=\"area-card\">\r\n      <div>\r\n        <div> <span class=\"main-txt me-2\">{{facadeCapacity || 0}}</span> <span class=\"unit-txt\">rft</span> </div>\r\n        <div class=\"sub-txt\">Facade capacity</div>\r\n      </div>\r\n      <div>\r\n        <svg width=\"65\" height=\"65\" viewBox=\"0 0 65 65\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <rect x=\"0.5\" y=\"0.5\" width=\"64\" height=\"64\" fill=\"#FDFDFD\" stroke=\"black\" />\r\n        </svg>\r\n      </div>\r\n    </div>\r\n  </div>\r\n  <div class=\"col-4\">\r\n    <div class=\"area-card\">\r\n      <div>\r\n        <div> <span class=\"main-txt me-2\">{{floorCapacity || 0}}</span> <span class=\"unit-txt\">sqft</span> </div>\r\n        <div class=\"sub-txt\">Floor capacity</div>\r\n      </div>\r\n      <div>\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"102\" height=\"58\" viewBox=\"0 0 102 58\" fill=\"none\">\r\n          <path d=\"M3.54359 36.4607L29.8929 2.06432L98.0939 6.44191L99.908 55.5468L3.54359 36.4607Z\" stroke=\"#475467\"\r\n            stroke-width=\"4\" />\r\n        </svg>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class=\"row\">\r\n  <div class=\"col-4\">\r\n    <div class=\"c-card\" style=\"height: 75dvh; position: relative;\">\r\n      <div class=\"d-flex align-items-center justify-content-between mb-5\" style=\"height: 8%;\">\r\n        <div>\r\n          <div class=\"l-pane-head\">\r\n            Capacity details\r\n          </div>\r\n          <div class=\"l-pane-desc\">\r\n            Below are the capacity details of the elements\r\n          </div>\r\n        </div>\r\n        <div class=\"d-flex align-items-center\">\r\n\r\n        </div>\r\n\r\n      </div>\r\n\r\n      <div class=\"table-responsive hide-scrollbar \" style=\"height: 92%;\">\r\n        <table class=\"table\">\r\n          <thead class=\"thead-light\">\r\n            <tr>\r\n              <th>#</th>\r\n              <th> <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                  fill=\"none\">\r\n                  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                    d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                    fill=\"#344054\" />\r\n                </svg> <span>Wall</span> </th>\r\n              <th>RFT ({{wallCapacity || 0}})</th>\r\n\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <ng-container *ngFor=\"let item of layoutPolygon; let i = index\">\r\n              <tr *ngIf=\"item[2] && item[2].elementType === 'wall'\">\r\n                <td>\r\n                  {{1}}\r\n                </td>\r\n                <td>\r\n                  <div class=\"table-td\">{{item[2].elementType}} {{item[2].elementNumber}}</div>\r\n                </td>\r\n                <td>\r\n                  <div class=\"table-td\">{{item[2].distance}}</div>\r\n\r\n                </td>\r\n              </tr>\r\n            </ng-container>\r\n\r\n          </tbody>\r\n        </table>\r\n        <table class=\"table\">\r\n          <thead class=\"thead-light\">\r\n            <tr>\r\n              <th>#</th>\r\n              <th> <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\"\r\n                  fill=\"none\">\r\n                  <path\r\n                    d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                    stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg> <span>Facade</span> </th>\r\n              <th>RFT ({{facadeCapacity || 0}})</th>\r\n\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <ng-container *ngFor=\"let item of layoutPolygon; let i = index\">\r\n              <tr *ngIf=\"item[2] && item[2].elementType === 'facade'\">\r\n                <td>\r\n                  {{i}}\r\n                </td>\r\n                <td>\r\n                  <div class=\"table-td\">{{item[2].elementType}} {{item[2].elementNumber}}</div>\r\n                </td>\r\n                <td>\r\n                  <div class=\"table-td\">{{item[2].distance}}</div>\r\n\r\n                </td>\r\n              </tr>\r\n            </ng-container>\r\n\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n\r\n    </div>\r\n  </div>\r\n  <div class=\"col-8\">\r\n    <div class=\"c-card \" style=\"height: 75dvh;\">\r\n      <div style=\"height: 8%;\" class=\"d-flex align-items-center justify-content-between\">\r\n        <div>\r\n          <!-- <lib-reactive-select *ngIf=\"floorsInput.value\" [formControl]=\"floorsInput\" [idField]=\"'id'\"\r\n            [nameField]=\"'floorName'\" [data]=\"selectedStore?.floor\"></lib-reactive-select> -->\r\n          <div (click)=\"toggleFloorSelect()\" class=\"floor-select\">\r\n            <div>{{selectedFloor?.floorName}}</div>\r\n            <div><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\" />\r\n              </svg></div>\r\n            <ul *ngIf=\"floorSelect?.show\" class=\"list-unstyled mb-2\">\r\n              <li (click)=\"onFloorSelect(floor._id)\" *ngFor=\"let floor of selectedStore?.floors; let i = index\"\r\n                [ngClass]=\"floor._id === selectedFloor._id ? 'selected': ''\">\r\n                <div class=\"d-flex justify-content-between\">\r\n                  <span>{{floor?.floorName}}</span>\r\n\r\n                </div>\r\n\r\n              </li>\r\n            </ul>\r\n          </div>\r\n        </div>\r\n        <button class=\"btn btn-sm btn-outline bg-white\" (click)=\"rotatePolygons()\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n            <path\r\n              d=\"M6.36265 7.17838L7.17625 6.36238L5.90425 5.09158L5.08945 5.90518L6.36265 7.17838ZM15.671 6.36358L19.6379 10.3304L20.9099 9.0572L16.9442 5.09038L15.671 6.36358ZM19.6379 18.8252L18.8243 19.6388L20.0963 20.9096L20.9099 20.0972L19.6379 18.8252ZM10.3295 19.6388L6.36265 15.672L5.09065 16.9452L9.05626 20.9108L10.3295 19.6388ZM18.8243 19.6388C17.6543 20.8076 16.8407 21.6188 16.1459 22.1492C15.4715 22.664 15.0155 22.8284 14.5763 22.8284V24.6284C15.5675 24.6284 16.4027 24.2168 17.2367 23.5808C18.0503 22.9604 18.9635 22.0448 20.0963 20.912L18.8243 19.6388ZM9.05626 20.9108C10.1891 22.0448 11.1023 22.9592 11.9159 23.5808C12.7499 24.2168 13.5851 24.6284 14.5763 24.6284V22.8284C14.1371 22.8284 13.6823 22.664 13.0067 22.1492C12.3119 21.6188 11.4983 20.8076 10.3295 19.6388L9.05626 20.9108ZM19.6379 10.3304C20.8067 11.4992 21.6179 12.3128 22.1483 13.0076C22.6631 13.6832 22.8275 14.138 22.8275 14.5772H24.6275C24.6275 13.586 24.2159 12.7508 23.5799 11.9168C22.9595 11.1032 22.0427 10.19 20.9099 9.0572L19.6379 10.3304ZM20.9099 20.0972C22.0439 18.9632 22.9583 18.0512 23.5799 17.2376C24.2159 16.4036 24.6275 15.5684 24.6275 14.5772H22.8275C22.8275 15.0164 22.6631 15.4724 22.1483 16.1468C21.6179 16.8416 20.8067 17.6552 19.6379 18.8252L20.9099 20.0972ZM7.17625 6.36238C8.34625 5.19358 9.15985 4.38118 9.85465 3.85078C10.529 3.33598 10.985 3.17278 11.4242 3.17278V1.37158C10.433 1.37158 9.59785 1.78318 8.76385 2.41918C7.94905 3.04078 7.03705 3.95518 5.90425 5.08798L7.17625 6.36238ZM16.9442 5.09038C15.8114 3.95638 14.8982 3.04078 14.0846 2.41918C13.2506 1.78318 12.4154 1.37158 11.4242 1.37158V3.17278C11.8634 3.17278 12.3182 3.33598 12.9938 3.85078C13.6886 4.38118 14.5022 5.19238 15.671 6.36118L16.9442 5.09038ZM5.08945 5.90278C3.95665 7.03558 3.04225 7.94758 2.42065 8.76238C1.78465 9.59638 1.37305 10.4316 1.37305 11.4228H3.17305C3.17305 10.9836 3.33745 10.5276 3.85225 9.85318C4.38265 9.15838 5.19385 8.34478 6.36265 7.17478L5.08945 5.90278ZM6.36265 15.6708C5.19385 14.5008 4.38265 13.6872 3.85225 12.9924C3.33745 12.318 3.17305 11.862 3.17305 11.4228H1.37305C1.37305 12.414 1.78465 13.2492 2.42065 14.0832C3.04225 14.8968 3.95665 15.81 5.08945 16.9428L6.36265 15.6708Z\"\r\n              fill=\"#1D2939\" />\r\n            <path d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n              stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </button>\r\n      </div>\r\n      <div class=\"hide-scrollbar\" style=\"height: 92%; overflow: scroll; position: relative;\" #scrollContainer>\r\n        <canvas #gridCanvas>\r\n\r\n        </canvas>\r\n      </div>\r\n\r\n    </div>\r\n  </div>\r\n\r\n  <div *ngIf=\"planoStoreList.length > 1\" class=\"col-12 mt-6\">\r\n    <div style=\"padding: 0px !important;\" class=\"c-card\">\r\n        <lib-pagination [itemsPerPage]=\"itemsPerPage\" (pageChange)=\"onPageChange($event)\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n            [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"></lib-pagination>\r\n    </div>\r\n</div>\r\n\r\n</div>\r\n\r\n<ng-template #completeLayout let-modal>\r\n  <div class=\"card\">\r\n    <div style=\"min-height: unset; border-bottom: unset;  padding-top: 2.25rem;\" class=\"card-header\">\r\n      <div class=\"card-title\">\r\n        <span class=\"modal-header-txt\">Complete Layout</span>\r\n      </div>\r\n    </div>\r\n    <div style=\"padding-top: 1rem;\" class=\"card-body\">\r\n      <div class=\"form-check\">\r\n        <input (ngModelChange)=\"onModalTypeChange($event)\" [(ngModel)]=\"markAsCompleteType\" class=\"form-check-input\" type=\"radio\" name=\"one\" id=\"single\"\r\n          value=\"single\">\r\n        <div class=\"ms-3\">\r\n          <div class=\"modal-main-txt\">Mark as complete for only <span\r\n              class=\"highlight-txt\">{{selectedStore?.storeName}}</span></div>\r\n          <div class=\"modal-sub-txt\">This action will considered as layout completion for {{selectedStore?.storeName}}\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"w-100 h-0 border my-5 border-bottom-grey\"></div>\r\n      <div class=\"form-check mb-5\">\r\n        <input (ngModelChange)=\"onModalTypeChange($event)\" [(ngModel)]=\"markAsCompleteType\" class=\"form-check-input\" type=\"radio\" name=\"one\" id=\"multiple\"\r\n          value=\"multiple\">\r\n        <div class=\"ms-3\">\r\n          <div class=\"modal-main-txt\">Mark as complete for all {{planoStoreList.length}} stores</div>\r\n        </div>\r\n      </div>\r\n      <div *ngIf=\"markAsCompleteType === 'multiple'\" class=\"table-responsive\">\r\n        <table class=\"table\">\r\n          <thead>\r\n            <tr style=\"border-bottom: 1px solid #EAECF0; background: #FCFCFD;\">\r\n              <th>\r\n                <div class=\"form-check\">\r\n                  <input (click)=\"onModalSelectAll($event)\" [(ngModel)]=\"isAllStoreSelected\" class=\"form-check-input c-checkbox\" type=\"checkbox\">\r\n                  <label class=\"form-check-label check-label modal-storeName\">\r\n                    Store Name\r\n                  </label>\r\n                </div>\r\n              </th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr style=\"border-bottom: 1px solid #EAECF0;\" *ngFor=\"let store of planoStoreList\">\r\n              <td>\r\n                <div class=\"form-check\">\r\n                  <input [(ngModel)]=\"store.selected\" class=\"form-check-input c-checkbox\" type=\"checkbox\">\r\n                  <label class=\"form-check-label check-label modal-storeName\">\r\n                    {{store?.storeName}}\r\n                  </label>\r\n                </div>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n      <div class=\"d-flex align-items-center justify-content-end\">\r\n        <button (click)=\"modal.dismiss()\" class=\"btn btn-outline bg-white me-5\">Cancel</button>\r\n        <button (click)=\"updatePlanoStatus(); modal.dismiss()\" class=\"btn btn-sm btn-primary \">Complete</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n</ng-template>","import { Component, OnDestroy, OnInit, ViewChild, HostListener, ElementRef } from '@angular/core';\r\nimport { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject, takeUntil, debounceTime } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport * as XLSX from 'xlsx';\r\nimport { Router } from '@angular/router';\r\nimport JSZip from 'jszip';\r\nimport { DeleteLayoutComponent } from '../create-layout/popups/delete-layout/delete-layout.component'\r\n\r\n@Component({\r\n  selector: 'lib-store-layout-table',\r\n  templateUrl: './store-layout-table.component.html',\r\n  styleUrl: './store-layout-table.component.scss'\r\n})\r\nexport class StoreLayoutTableComponent implements OnInit, OnDestroy {\r\n  @ViewChild('file') fileInput!: ElementRef;\r\n  loading: boolean = true;\r\n  selectedTab: string = 'layoutBuilder';\r\n  floorNo: number = 1;\r\n  searchStore: string;\r\n  storeList: any[] = []\r\n  store: any[] = [];\r\n  paginationSizes: any = [];\r\n  selectedStore: any = {};\r\n  showDropDown: boolean = false;\r\n  totalItems: number;\r\n  dynamicData: any = {\r\n    clientId: '',\r\n    limit: 10,\r\n    offset: 1,\r\n    searchValue: '',\r\n    sortColumnName: '',\r\n    sortBy: '',\r\n    filter: []\r\n  }\r\n  layoutList: any = [];\r\n  pageSize: any = 10;\r\n  dataObject: any = [\r\n    {\r\n      Description: 'status',\r\n      Issues: [\r\n        { text: 'Draft', id: 'draft' },\r\n        { text: 'Completed', id: 'completed' },\r\n      ],\r\n    },\r\n  ];\r\n  error: any = [];\r\n  excelData: any;\r\n  showNoData: boolean = true;\r\n  private destroy$ = new Subject();\r\n  private scale = 1;\r\n  gridWidth = 5;\r\n  gridHeight = 5;\r\n  pixelSize: any = 50;\r\n  @ViewChild('createBuilder') createBuilder: any;\r\n  @ViewChild('uploadBuilder') uploadBuilder: any;\r\n\r\n  constructor(private modalDef: NgbModal, private pageInfo: PageInfoService, private toast: ToastService,\r\n    private gs: GlobalStateService, private builderService: StoreBuilderService, private Router: Router) { }\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    let getDetails = JSON.parse(localStorage.getItem('header-filters') as string)\r\n    if (getDetails) {\r\n      this.dynamicData.clientId = getDetails?.client || getDetails?.clients?.[0] || getDetails?.clients?.[1];\r\n      this.getLayoutList();\r\n      this.getStoreList()\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Planogram\");\r\n    this.pageInfo.setDescription(\"\");\r\n    this.pageInfo.setBreadcrumbs([]);\r\n  }\r\n\r\n  getLayoutList() {\r\n    this.loading = true;\r\n    this.layoutList = [];\r\n    this.builderService.layoutList(this.dynamicData).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next: (res: any) => {\r\n        this.loading = false;\r\n        if (res && res?.data?.data.length) {\r\n          this.showNoData = false;\r\n          this.layoutList = res.data.data;\r\n          this.totalItems = res.data.count;\r\n          if (this.totalItems < 9) {\r\n            this.paginationSizes = [this.totalItems];\r\n            this.pageSize = this.totalItems;\r\n          }\r\n          else {\r\n            this.paginationSizes = [10, 20, 30];\r\n            this.pageSize = this.dynamicData.limit;\r\n          }\r\n        }\r\n        else {\r\n          if (this.dynamicData.searchValue.length || this.dynamicData.filter.length) {\r\n            this.showNoData = false;\r\n          } else {\r\n            this.showNoData = true;\r\n          }\r\n          this.layoutList = [];\r\n        }\r\n      },\r\n      error: (err: any) => {\r\n        this.showNoData = true;\r\n        this.loading = false;\r\n        this.layoutList = [];\r\n        this.toast.getErrorToast(err?.error?.error || 'Something went wrong')\r\n      }\r\n    });\r\n  }\r\n\r\n  getStoreList() {\r\n    let data = {\r\n      \"clientId\": [this.dynamicData.clientId],\r\n      \"offset\": 1,\r\n      \"limit\": 10000,\r\n      \"sortColumName\": \"storeId\",\r\n      \"sortBy\": -1,\r\n      \"searchValue\": \"\",\r\n      \"export\": false,\r\n      \"status\": [\r\n        \"Live\",\r\n        \"onboarded\",\r\n        \"deployed\",\r\n        \"paired\",\r\n        \"installationfailed\",\r\n        \"Infra Issue\"\r\n      ]\r\n    }\r\n    this.builderService.getStoreList(data).subscribe((res: any) => {\r\n      if (res && res.code == 200 && res.data.result.length) {\r\n        let stores: any = [];\r\n        res.data.result.forEach((item: any) => {\r\n          stores.push({\r\n            name: item.storeName,\r\n            id: item.storeId\r\n          })\r\n        })\r\n        this.storeList = this.store = stores;\r\n      }\r\n      else {\r\n        this.storeList = [];\r\n      }\r\n    });\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    this.dynamicData.limit = 10;\r\n    this.dynamicData.filter = event?.[0]?.Issues.map((ele: any) => ele.id);\r\n    this.getLayoutList();\r\n  }\r\n\r\n  BuilderCreate() {\r\n    this.showDropDown = false;\r\n    this.selectedStore = {};\r\n    this.floorNo = 1;\r\n    this.modalDef.open(this.createBuilder, { centered: true });\r\n  }\r\n\r\n  floorDec() {\r\n    if (this.floorNo >= 2) {\r\n      this.floorNo--;\r\n    }\r\n  }\r\n\r\n  floorInc() {\r\n    this.floorNo++;\r\n  }\r\n\r\n  filterSearch() {\r\n    if (this.searchStore.trim().length) {\r\n      let store = this.searchStore.split(',');\r\n      if (store.length > 1) {\r\n        store = store.map((item: any) => item.trim().toLowerCase())\r\n        this.storeList = this.store.filter((item: any) => store.includes(item.name.toLowerCase()))\r\n      }\r\n      else {\r\n        this.storeList = this.store.filter((item: any) => item.name.toLowerCase().includes(this.searchStore.trim().toLowerCase()))\r\n      }\r\n    }\r\n    else {\r\n      this.storeList = [...this.store]\r\n    }\r\n  }\r\n\r\n  updateSelectedStore(index: number) {\r\n    this.selectedStore = this.storeList[index];\r\n    this.closeDropDown();\r\n  }\r\n\r\n  closeDropDown() {\r\n    this.showDropDown = false;\r\n  }\r\n\r\n  toggleDropDown() {\r\n    this.showDropDown = true;\r\n  }\r\n\r\n  createLayout() {\r\n    let params = {\r\n      storeName: this.selectedStore.name,\r\n      storeId: this.selectedStore.id,\r\n      clientId: this.dynamicData.clientId,\r\n      floorNumber: this.floorNo,\r\n    }\r\n\r\n    this.builderService.createLayout(params).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code == 200) {\r\n          this.toast.getSuccessToast(res?.message || 'Layout created successfully');\r\n          this.selectedStore = {};\r\n          this.floorNo = 1;\r\n          this.modalDef.dismissAll();\r\n          this.Router.navigateByUrl(`/manage/planogram/layout-builder/create?id=${res.data.id}`)\r\n        }\r\n      },\r\n      error: (err: any) => {\r\n        console.log(err)\r\n        this.toast.getErrorToast(err?.error?.error || 'Something went wrong')\r\n      }\r\n    });\r\n  }\r\n\r\n  onPageChange(event: any) {\r\n    this.dynamicData.offset = event;\r\n    this.getLayoutList();\r\n  }\r\n\r\n  onPageSizeChange(event: any) {\r\n    this.dynamicData.offset = 1;\r\n    this.dynamicData.limit = event;\r\n    this.getLayoutList();\r\n  }\r\n\r\n  search() {\r\n    this.dynamicData.limit = 10;\r\n    this.dynamicData.offset = 1;\r\n    this.dynamicData.sortColumnName = '';\r\n    this.dynamicData.sortBy = '';\r\n    this.getLayoutList();\r\n  }\r\n\r\n  onSort(data: any) {\r\n    this.dynamicData.offset = 1;\r\n    if (this.dynamicData.sortColumnName == data) {\r\n      this.dynamicData.sortBy = this.dynamicData.sortBy == 1 ? -1 : 1;\r\n    }\r\n    else {\r\n      this.dynamicData.sortBy = 1;\r\n      this.dynamicData.sortColumnName = data;\r\n    }\r\n    this.getLayoutList();\r\n  }\r\n\r\n  getHeadersFromSheet(sheet: any): string[] {\r\n    const headers: string[] = [];\r\n    const range = XLSX.utils.decode_range(sheet['!ref']);\r\n\r\n    // Loop through the columns in the first row\r\n    for (let col = range.s.c; col <= range.e.c; col++) {\r\n      const cell = sheet[XLSX.utils.encode_cell({ r: range.s.r, c: col })];\r\n      if (cell) {\r\n        headers.push(cell.v);\r\n      }\r\n    }\r\n    return headers;\r\n  }\r\n\r\n  onFileUpload(event: any) {\r\n    let data: any;\r\n    const target: DataTransfer = <DataTransfer>(event.target);\r\n    let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);\r\n    this.error = [];\r\n\r\n    if (isExcelFile) {\r\n      const reader: FileReader = new FileReader();\r\n      reader.readAsBinaryString(target.files[0]);\r\n      reader.onload = (e: any) => {\r\n        const bstr: string = e.target.result;\r\n        const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });\r\n        const wsname: string = wb.SheetNames[0];\r\n        const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n        data = XLSX.utils.sheet_to_json(ws);\r\n        const worksheet = wb.Sheets[wb.SheetNames[0]];\r\n\r\n        // Get the header row (first row)\r\n        const headers = this.getHeadersFromSheet(worksheet);\r\n        if (!data.length) {\r\n          this.fileInput.nativeElement.value = '';\r\n          return this.toast.getErrorToast('Please enter values');\r\n        }\r\n        let storeList: any = [];\r\n        let emptyList: any = [];\r\n        data.forEach((item: any, index: any) => {\r\n          let getValue = headers.filter(key => item[key] === null || item[key] === '' || item[key] == undefined);\r\n          if (getValue.length) {\r\n            getValue.forEach((item) => {\r\n              let letter = item == 'Store Name' ? 'A' : item == 'No.of.Floors' ? 'B' : item == 'Step' ? 'C' : item == 'Elements' ? 'D' : item == 'Measurements(ft)' ? 'E' : item == 'direction' ? 'F' : 'G';\r\n              emptyList.push(letter + parseInt(index + 2))\r\n            })\r\n          }\r\n          else {\r\n            let checkDuplicate = storeList.findIndex((ele: any) => ele.storeName.trim() == item['Store Name'].trim() && ele.floorNumber == item['No.of.Floors'] && ele.step == item['Step'])\r\n            if (checkDuplicate == -1) {\r\n              storeList.push(\r\n                {\r\n                  storeName: item['Store Name'].trim(),\r\n                  floorNumber: item['No.of.Floors'],\r\n                  step: item['Step'],\r\n                  elements: item['Elements'] == 'Glass/Facade' ? 'facade' : item['Elements'].toLowerCase(),\r\n                  distance: item['Measurements(ft)'],\r\n                  direction: item['Direction'].toLowerCase(),\r\n                  degree: item['Degree']\r\n                }\r\n              )\r\n            }\r\n            else {\r\n              this.error.push({ index: index + 2, message: 'Duplicate Step', ExistIndex: checkDuplicate + 2, series: 'C' });\r\n            }\r\n          }\r\n        })\r\n        if (emptyList.length) {\r\n          this.error.push({ index: emptyList.toString(), message: 'Missing Field' });\r\n        }\r\n        let uniqueStore = [...new Set(storeList.map((ele: any) => ele.storeName))];\r\n        this.excelData = {\r\n          totalStore: uniqueStore.length,\r\n          totalRow: data.length,\r\n          totalError: this.error.length\r\n        }\r\n        if (this.error.length) {\r\n          this.modalDef.dismissAll();\r\n          this.fileInput.nativeElement.value = '';\r\n          this.modalDef.open(this.uploadBuilder, { centered: true });\r\n          return;\r\n        }\r\n        this.builderService.BulkUpload({ data: storeList, clientId: this.dynamicData.clientId }).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n          next: (res: any) => {\r\n            this.modalDef.dismissAll();\r\n            if (res && res.code == 200) {\r\n              this.fileInput.nativeElement.value = '';\r\n              this.toast.getSuccessToast(res?.message || 'Bulk store upload successfully');\r\n              this.Router.navigateByUrl(`/manage/planogram/layout-builder/create?id=${res.data.id}`)\r\n            }\r\n          },\r\n          error: (err: any) => {\r\n            this.modalDef.dismissAll();\r\n            if (err?.error?.error) {\r\n              let error = err?.error?.error;\r\n              error.forEach((err: any) => {\r\n                let errorKey: any = [];\r\n                data.forEach((ele: any, index: any) => {\r\n                  let findExists = err.value.find((elem: any) => elem == ele['Store Name']);\r\n                  if (findExists) {\r\n                    errorKey.push(`A${index + 2}`)\r\n                  }\r\n                })\r\n                this.error.push({ index: errorKey.toString(), message: err.message });\r\n              })\r\n              this.excelData.totalError = this.error.length;\r\n              this.fileInput.nativeElement.value = '';\r\n              this.modalDef.open(this.uploadBuilder, { centered: true });\r\n              return;\r\n            }\r\n          }\r\n        })\r\n      }\r\n    }\r\n    else {\r\n      this.toast.getErrorToast('Please upload xlsx file')\r\n    }\r\n  }\r\n\r\n  Reupload() {\r\n    this.fileInput.nativeElement.value = '';\r\n    let ele = document.getElementById('xlsxUpload');\r\n    ele?.click();\r\n  }\r\n\r\n  showDeleteDropDown(i: any) {\r\n    this.layoutList.forEach((item: any, index: any) => {\r\n      if (i == index) {\r\n        item.deleteIndex = item?.deleteIndex ? false : true;\r\n      }\r\n      else {\r\n        item.deleteIndex = false;\r\n      }\r\n    })\r\n  }\r\n\r\n  deleteLayout(id: any) {\r\n    let modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });\r\n    modelRef.result.then((res) => {\r\n      if (res.message == 'confirm') {\r\n        this.builderService.deleteLayout(id).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n          next: (res: any) => {\r\n            if (res && res.code == 200) {\r\n              this.toast.getSuccessToast(res?.message || 'Layout deleted successfully');\r\n              this.getLayoutList();\r\n            }\r\n          },\r\n          error: (error: any) => {\r\n            this.toast.getErrorToast(error?.error?.error || 'Something went wrong');\r\n          }\r\n        });\r\n      }\r\n    })\r\n  }\r\n\r\n  normalizedPixelPerMetre(polygon: any): number {\r\n    const MIN_PIXELS_PER_METER = 50;\r\n    const MAX_PIXELS_PER_METER = 150;\r\n\r\n    let totalLength = 0;\r\n    let lineCount = 0;\r\n\r\n    polygon.forEach((line: any) => {\r\n      if (line.unit === 'ft') {\r\n        totalLength = totalLength + (line.distance * 3.28084);\r\n      } else {\r\n        totalLength = totalLength + line.distance;\r\n      }\r\n      lineCount++;\r\n    });\r\n\r\n    const averageLength = lineCount > 0 ? totalLength / lineCount : 0;\r\n\r\n    const MAX_AVERAGE_LENGTH = 50;\r\n    const MIN_AVERAGE_LENGTH = 5;\r\n\r\n    const normalizedLength = Math.min(\r\n      Math.max(averageLength, MIN_AVERAGE_LENGTH),\r\n      MAX_AVERAGE_LENGTH\r\n    );\r\n\r\n    const pixelsPerMeter =\r\n      MAX_PIXELS_PER_METER -\r\n      ((normalizedLength - MIN_AVERAGE_LENGTH) / (MAX_AVERAGE_LENGTH - MIN_AVERAGE_LENGTH)) *\r\n      (MAX_PIXELS_PER_METER - MIN_PIXELS_PER_METER);\r\n\r\n    return Math.round(pixelsPerMeter);\r\n  }\r\n\r\n  convertToPixels(value: number, unit: 'ft' | 'm'): number {\r\n    const PIXELS_PER_METER = this.pixelSize;\r\n    const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;\r\n\r\n    if (typeof value !== 'number' || value < 0) {\r\n      throw new Error('Value must be a non-negative number');\r\n    }\r\n\r\n    switch (unit) {\r\n      case 'm':\r\n        return value * PIXELS_PER_METER;\r\n      case 'ft':\r\n        return value * PIXELS_PER_FOOT;\r\n      default:\r\n        throw new Error(\"Invalid unit. Supported units are 'mt' for meters and 'ft' for feet.\");\r\n    }\r\n  }\r\n\r\n  snapToGrid(value: number, gridSize: number): number {\r\n    return Math.round(value / gridSize) * gridSize;\r\n  }\r\n\r\n  download(data: any) {\r\n    this.builderService.getPlano({ id: [data._id] }).pipe(takeUntil(this.destroy$), debounceTime(300)).subscribe({\r\n      next: (res: any) => {\r\n        if (res && res.code == 200) {\r\n          this.onExportAsZip(data.storeName, res.data[0]);\r\n        }\r\n      },\r\n      error: (error: any) => {\r\n        this.toast.getErrorToast(error?.error?.error || 'Something went wrong');\r\n      }\r\n    });\r\n  }\r\n\r\n  async onExportAsZip(store: String, data: any) {\r\n    const zip = new JSZip();\r\n    const padding = 100;\r\n    const canvas = document.createElement('canvas');\r\n    const ctx = canvas.getContext('2d')!;\r\n    canvas.width = 10000;\r\n    canvas.height = 10000;\r\n\r\n    const centerX = canvas.width / 2 / this.scale;\r\n    const centerY = canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    const renderCanvas = async (layoutPolygon: any[]): Promise<string> => {\r\n      const exportLayout: any[] = [];\r\n\r\n      layoutPolygon.forEach((instruction: any) => {\r\n        const radians: number = {\r\n          up: ((180 - instruction.angle) * Math.PI) / 180,\r\n          left: ((270 - instruction.angle) * Math.PI) / 180,\r\n          down: ((360 - instruction.angle) * Math.PI) / 180,\r\n          right: ((90 - instruction.angle) * Math.PI) / 180,\r\n        }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n        if (radians === undefined) {\r\n          throw new Error(`Invalid direction: ${instruction.direction}`);\r\n        }\r\n        this.pixelSize = this.normalizedPixelPerMetre(layoutPolygon);\r\n        const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n        const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n        const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n        const newPoint = {\r\n          x: this.snapToGrid(newX, this.gridWidth),\r\n          y: this.snapToGrid(newY, this.gridHeight),\r\n        };\r\n        const lineSegment = [\r\n          currentPoint,\r\n          newPoint,\r\n          {\r\n            elementType: instruction.elementType,\r\n            distance: instruction.distance,\r\n            unit: instruction.unit,\r\n            direction: instruction.direction,\r\n            angle: instruction.angle,\r\n            elementNumber: instruction.elementNumber,\r\n          },\r\n        ];\r\n        exportLayout.push(lineSegment);\r\n        currentPoint = newPoint;\r\n      });\r\n\r\n      let minX = Infinity,\r\n        minY = Infinity,\r\n        maxX = -Infinity,\r\n        maxY = -Infinity;\r\n\r\n      exportLayout.forEach(([point1, point2]) => {\r\n        [point1, point2].forEach((point) => {\r\n          if (point.x !== undefined) {\r\n            minX = Math.min(minX, point.x);\r\n            maxX = Math.max(maxX, point.x);\r\n          }\r\n          if (point.y !== undefined) {\r\n            minY = Math.min(minY, point.y);\r\n            maxY = Math.max(maxY, point.y);\r\n          }\r\n        });\r\n      });\r\n      minX -= padding;\r\n      minY -= padding;\r\n      maxX += padding;\r\n      maxY += padding;\r\n\r\n      canvas.width = maxX - minX;\r\n      canvas.height = maxY - minY;\r\n\r\n      ctx.fillStyle = 'white';\r\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n      ctx.save();\r\n      ctx.translate(-minX, -minY);\r\n      ctx.scale(this.scale, this.scale);\r\n\r\n      function drawArrowhead(ctx: CanvasRenderingContext2D, x: number, y: number, angle: number) {\r\n        const size = 5;\r\n        ctx.save();\r\n        ctx.translate(x, y);\r\n        ctx.rotate(angle);\r\n        ctx.beginPath();\r\n        ctx.moveTo(0, 0);\r\n        ctx.lineTo(-size, -size / 2);\r\n        ctx.lineTo(-size, size / 2);\r\n        ctx.closePath();\r\n        ctx.fillStyle = 'black';\r\n        ctx.fill();\r\n        ctx.restore();\r\n      }\r\n\r\n      ctx.beginPath();\r\n      exportLayout.forEach((edge, edgeIndex) => {\r\n        const point = edge[0];\r\n        const nextPoint = edge[1];\r\n        const properties = edge[2];\r\n\r\n        if (edgeIndex === 0) ctx.moveTo(point.x, point.y);\r\n        ctx.lineTo(nextPoint.x, nextPoint.y);\r\n\r\n        const dx = nextPoint.x - point.x;\r\n        const dy = nextPoint.y - point.y;\r\n        const length = Math.sqrt(dx * dx + dy * dy);\r\n        const offsetX = (dy / length) * 20;\r\n        const offsetY = (-dx / length) * 20;\r\n\r\n        const boxPoints = [\r\n          { x: point.x, y: point.y },\r\n          { x: nextPoint.x, y: nextPoint.y },\r\n          { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n          { x: point.x + offsetX, y: point.y + offsetY },\r\n        ];\r\n\r\n        ctx.beginPath();\r\n        ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n        boxPoints.forEach((pt, index) => {\r\n          if (properties.elementType === 'entrance') {\r\n            if (index < 2) {\r\n              ctx.lineTo(pt.x, pt.y)\r\n            }\r\n          } else {\r\n            ctx.lineTo(pt.x, pt.y);\r\n          }\r\n        });\r\n        if (properties.elementType === 'opening') {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n\r\n          ctx.strokeStyle = '#F9FAFB';\r\n\r\n          ctx.stroke();\r\n        } else {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n\r\n\r\n        const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n        const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n        ctx.save();\r\n        ctx.translate(textX, textY);\r\n\r\n        if (dx === 0) {\r\n          ctx.rotate(-Math.PI / 2);\r\n        } else if (dy !== 0) {\r\n          const angle = Math.atan2(dy, dx);\r\n          ctx.rotate(angle);\r\n        }\r\n\r\n        ctx.font = '12px Arial';\r\n        ctx.fillStyle = 'black';\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillText(\r\n          `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n          0,\r\n          0\r\n        );\r\n        ctx.restore();\r\n        if (properties.distance >= 4) {\r\n          const centerX = textX;\r\n          const centerY = textY;\r\n          const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n          const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n          const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n          const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n          function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n            const angle = Math.atan2(y2 - y1, x2 - x1);\r\n            return {\r\n              x: x1 + Math.cos(angle) * distance,\r\n              y: y1 + Math.sin(angle) * distance,\r\n            };\r\n          }\r\n\r\n          const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n          const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n          const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n          const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(rightStart.x, rightStart.y);\r\n          ctx.lineTo(rightEnd.x, rightEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n          drawArrowhead(ctx, rightEnd.x, rightEnd.y, rightAngle);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(leftStart.x, leftStart.y);\r\n          ctx.lineTo(leftEnd.x, leftEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n          drawArrowhead(ctx, leftEnd.x, leftEnd.y, leftAngle);\r\n\r\n        }\r\n\r\n        if (properties.elementType === 'entrance') {\r\n          const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n          const entranceAngle = angle + (15 * Math.PI) / 180;\r\n\r\n          const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n          const endPoint = {\r\n            x: point.x + Math.cos(entranceAngle) * lineLength,\r\n            y: point.y + Math.sin(entranceAngle) * lineLength,\r\n          };\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(point.x, point.y);\r\n          ctx.lineTo(endPoint.x, endPoint.y);\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n      });\r\n\r\n      ctx.restore();\r\n\r\n      return new Promise((resolve) => {\r\n        canvas.toBlob((blob) => {\r\n          const reader = new FileReader();\r\n          reader.onload = () => resolve(reader.result as string);\r\n          reader.readAsDataURL(blob!);\r\n          canvas.remove();\r\n        });\r\n      });\r\n    };\r\n\r\n    for (let i = 0; i < data.floors.length; i++) {\r\n      const imageDataUrl = await renderCanvas(data.floors[i].layoutPolygon);\r\n      const base64Data = imageDataUrl.split(',')[1];\r\n      zip.file(`${store}_${data.floors[i].floorName}_layout.png`, base64Data, { base64: true });\r\n    }\r\n\r\n    zip.generateAsync({ type: 'blob' }).then((blob: any) => {\r\n      const link = document.createElement('a');\r\n      link.href = URL.createObjectURL(blob);\r\n      link.download = `${data.storeName}_layouts.zip`;\r\n      link.click();\r\n    });\r\n  }\r\n\r\n  @HostListener(\"document:click\", [\"$event\"])\r\n  onOutsideClick(event: MouseEvent): void {\r\n    const closeDropDelete = (event.target as HTMLElement).closest(\".close-delete\");\r\n    if (!closeDropDelete) {\r\n      this.layoutList.forEach((item: any, index: any) => {\r\n        item.deleteIndex = false;\r\n      })\r\n    }\r\n  }\r\n  clickOutside(event: MouseEvent): void {\r\n    const clickedInside = (event.target as HTMLElement).closest(\r\n      \".dropdown-close\"\r\n    );\r\n    if (!clickedInside) {\r\n      this.closeDropDown();\r\n    }\r\n  }\r\n\r\n  navigateToElements(id: string) {\r\n    this.Router.navigateByUrl('/manage/planogram/layout-elements?id=' + id)\r\n  }\r\n\r\n\r\n}\r\n","\r\n<div class=\"mx-3 mt-5\">\r\n    <ul class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder flex-nowrap\">\r\n        <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'layoutBuilder' ? 'active' :''\">Layout builder</a>\r\n        </li>\r\n        <li class=\"nav-item cursor-pointer\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'tabClassActive' :''\"><a class=\"text-active-primary px-4 py-3\" [ngClass]=\"selectedTab === 'storeBuilder' ? 'active' :''\">Store builder</a>\r\n        </li>\r\n    </ul>\r\n</div>\r\n<input style=\"display: none;\" type=\"file\" #file id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n<div class=\"card mt-5\" *ngIf=\"selectedTab === 'layoutBuilder'\">\r\n    <div class=\"card-header border-0\" *ngIf=\"!showNoData\">\r\n        <h3 class=\"card-title align-items-start flex-column\">\r\n            <span class=\"card-label mb-2\">Store layout </span>\r\n        </h3>\r\n        <div class=\"card-toolbar\">\r\n            <div class=\"d-flex\">\r\n                <div class=\"d-flex align-items-center  position-relative my-1\">\r\n                    <span class=\"svg-icon footfallsearch svg-icon-1 position-absolute  ms-8\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n                                transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\">\r\n                            </rect>\r\n                            <path\r\n                                d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n                                fill=\"currentColor\"></path>\r\n                        </svg>\r\n                    </span>\r\n                    <input type=\"text\" class=\"form-control ps-14 mx-2 footfallsearch\"\r\n                        placeholder=\"Search\" autocomplete=\"off\" [(ngModel)]=\"dynamicData.searchValue\" (change)=\"search()\"/>\r\n\r\n                    <lib-filters [dataObject]=\"dataObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n                    <a  type=\"button\" (click)=\"BuilderCreate()\"\r\n                        class=\"btn btn-primary ms-2 rounded-3 text-nowrap ng-star-inserted\" tabindex=\"0\"><svg\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\" stroke=\"white\" stroke-width=\"1.67\"\r\n                                stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                        </svg><span class=\"ms-2 text-white\">Create Manually</span></a>\r\n                        \r\n                    <button type=\"button\" class=\"btn-outline ps-4 pe-2 btn align-items-end text-nowrap invheader mx-2\" >\r\n                        <span class=\"d-flex align-items-center\">\r\n                            <div class=\"cursor-pointer\" (click)=\"file.click()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <path\r\n                                        d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n                                        stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                                </svg>\r\n                                <span class=\"ms-2\"></span> <span>Upload</span>\r\n                            </div>\r\n                            <div class=\"vr ms-3 me-1\"></div>\r\n                            <div class=\"cursor-pointer\">\r\n                                <a href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                        <path d=\"M6 9L12 15L18 9\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </a>\r\n                            </div>\r\n                        </span>\r\n                    </button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"card-body p-0 mt-5\">\r\n        <div class=\"table-responsive\">\r\n            <table class=\"table text-nowrap bottom-border\" *ngIf=\"layoutList.length\">\r\n                <thead>\r\n                    <tr>\r\n                        <th><span class=\"cursor-pointer\" (click)=\"onSort('storeName')\">Store Name <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'storeName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n                                height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'storeName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th><span class=\"cursor-pointer\" (click)=\"onSort('layoutName')\">Layout Name <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'layoutName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n                                height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'layoutName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th><span class=\"cursor-pointer\" (click)=\"onSort('floorNumber')\">No of Floors  <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'floorNumber' && dynamicData.sortBy === 1 ? 'rotate' : ''\"\r\n                                width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'floorNumber' ? '#00A3FF' : '#667085'\"\r\n                                    stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th> <span class=\"cursor-pointer\" (click)=\"onSort('createdByName')\">Created By <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'createdByName' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n                                height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'createdByName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th><span class=\"cursor-pointer\" (click)=\"onSort('createdAt')\">Created Date <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'createdAt' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n                                height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'createdAt' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th><span class=\"cursor-pointer\" (click)=\"onSort('status')\">Status <svg\r\n                                [ngClass]=\"dynamicData.sortColumnName === 'status' && dynamicData.sortBy === 1 ? 'rotate' : ''\" width=\"16\"\r\n                                height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n                                    [attr.stroke]=\"dynamicData.sortColumnName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></span></th>\r\n                        <th></th>\r\n                    </tr>\r\n                </thead>\r\n                <tbody>\r\n                    <tr *ngFor=\"let item of layoutList;let i =index;\">\r\n                        <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.storeName}}</a></span></td>\r\n                        <td><span><a class=\"storeLink cursor-pointer\" [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\">{{item?.layoutName}}</a></span></td>\r\n                        <td>{{item.enNumber}}</td>\r\n                        <td><div class=\"symbol symbol-35px symbol-circle\"><span\r\n                                class=\"symbol-label bg-light-primary text-primary me-2\">{{item?.createdByName.slice(0,2).toUpperCase()}}</span></div>{{item?.createdByName}}</td>\r\n                        <td>{{item.createdAt}}</td>\r\n                        <td><span class=\"badge badge-light-success\">{{item.status | titlecase}}</span></td>\r\n                        <td>\r\n                            <div class=\"d-flex align-items-center\">\r\n                                <div class=\"me-10\">\r\n                                    <button (click)=\"navigateToElements(item._id)\" class=\"btn btn-outline\">\r\n                                        Add elements\r\n                                    </button>\r\n                                </div>\r\n                                <div class=\"me-10\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status !== 'draft'\" (click)=\"download(item)\" class=\"cursor-pointer\">\r\n                                        <path\r\n                                            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n                                            stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                    <a [href]=\"'/manage/planogram/layout-builder/create?id='+item._id\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" *ngIf=\"item.status === 'draft'\">\r\n                                        <path\r\n                                            d=\"M14.1667 2.49993C14.3855 2.28106 14.6454 2.10744 14.9313 1.98899C15.2173 1.87054 15.5238 1.80957 15.8333 1.80957C16.1429 1.80957 16.4494 1.87054 16.7353 1.98899C17.0213 2.10744 17.2811 2.28106 17.5 2.49993C17.7189 2.7188 17.8925 2.97863 18.0109 3.2646C18.1294 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1294 4.78262 18.0109 5.06859C17.8925 5.35455 17.7189 5.61439 17.5 5.83326L6.25 17.0833L1.66667 18.3333L2.91667 13.7499L14.1667 2.49993Z\"\r\n                                            stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg></a>\r\n                                </div>\r\n                                <div class=\"close-delete\">\r\n                                    <div class=\"position-relative\">\r\n                                        <span (click)=\"$event.stopPropagation();showDeleteDropDown(i)\" class=\"cursor-pointer\">\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"23\" viewBox=\"0 0 24 23\" fill=\"none\">\r\n                                                <path\r\n                                                    d=\"M11 11.4999C11 12.0292 11.4477 12.4583 12 12.4583C12.5523 12.4583 13 12.0292 13 11.4999C13 10.9706 12.5523 10.5416 12 10.5416C11.4477 10.5416 11 10.9706 11 11.4999Z\"\r\n                                                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                <path\r\n                                                    d=\"M11 18.2083C11 18.7375 11.4477 19.1666 12 19.1666C12.5523 19.1666 13 18.7375 13 18.2083C13 17.679 12.5523 17.2499 12 17.2499C11.4477 17.2499 11 17.679 11 18.2083Z\"\r\n                                                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                <path\r\n                                                    d=\"M11 4.79159C11 5.32086 11.4477 5.74992 12 5.74992C12.5523 5.74992 13 5.32086 13 4.79159C13 4.26231 12.5523 3.83325 12 3.83325C11.4477 3.83325 11 4.26231 11 4.79159Z\"\r\n                                                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                            </svg>\r\n                                        </span>\r\n                                        <div *ngIf=\"item?.deleteIndex\" (click)=\"$event.stopPropagation(); deleteLayout(item._id)\" class=\"option cursor-pointer\">Delete\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </td>\r\n                    </tr>\r\n                </tbody>\r\n            </table>\r\n        </div>\r\n        <ng-container>\r\n            <div class=\"row loader  d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\r\n                <div class=\"shimmer\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"stroke animate title\"></div>\r\n                        <div class=\"stroke animate link\"></div>\r\n                        <div class=\"stroke animate description\"></div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"stroke animate title\"></div>\r\n                        <div class=\"stroke animate link\"></div>\r\n                        <div class=\"stroke animate description\"></div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"!showNoData && !layoutList.length && !loading\">\r\n            <div class=\"row\">\r\n                <div class=\"col-lg-12 my-6\">\r\n                    <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                        <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n                        <div class=\"nodatamaintext mt-3\">No data found</div>\r\n                        <div class=\"nodatasubtext\">There is no result for Store Layout</div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </ng-container>\r\n        <ng-container class=\"mb-10\">\r\n            <div class=\"row h-400px mt-10\" *ngIf=\"!loading && this.showNoData\">\r\n                <div class=\"col-lg-6 text-center\">\r\n                    <div class=\"text-center\">\r\n                        <div class=\"round d-flex justify-content-center\">\r\n                            <div class=\"icon\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n                                    <path\r\n                                        d=\"M19.9999 13.333V26.6663M13.3333 19.9997H26.6666M36.6666 19.9997C36.6666 29.2044 29.2047 36.6663 19.9999 36.6663C10.7952 36.6663 3.33325 29.2044 3.33325 19.9997C3.33325 10.7949 10.7952 3.33301 19.9999 3.33301C29.2047 3.33301 36.6666 10.7949 36.6666 19.9997Z\"\r\n                                        stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"titleHead mt-3\">\r\n                            Create a store layout manually\r\n                        </div>\r\n                        <div class=\"titleContent mt-3\">\r\n                            You can create a single store layout manually by step by step\r\n                        </div>\r\n                        <div class=\"titleContent mt-8\">\r\n                            <button class=\"btn btn-outline btnClass\" (click)=\"BuilderCreate()\">\r\n                                <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                    <path d=\"M12 5V19M5 12H19\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg></span>\r\n                                Create manually\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"col-lg-6 text-center\">\r\n                    \r\n                    <div class=\"end-border position-relative text-center\">\r\n                        <span class=\"or-center bg-white step-text\">or</span>\r\n                        <div class=\"round d-flex justify-content-center\">\r\n                            <div class=\"icon\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n                                    <path\r\n                                        d=\"M35 25V31.6667C35 32.5507 34.6488 33.3986 34.0237 34.0237C33.3986 34.6488 32.5507 35 31.6667 35H8.33333C7.44928 35 6.60143 34.6488 5.97631 34.0237C5.35119 33.3986 5 32.5507 5 31.6667V25M28.3333 13.3333L20 5M20 5L11.6667 13.3333M20 5V25\"\r\n                                        stroke=\"#00A3FF\" stroke-width=\"3.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"titleHead mt-3\">\r\n                            Create a store layout using CSV\r\n                        </div>\r\n                        <div class=\"titleContent mt-3\">\r\n                            You can create a single or a multiple store layout using CSV.\r\n                        </div>\r\n                        <div class=\"d-flex justify-content-center mt-10\">\r\n                            <div class=\"titleContent text-center\">\r\n                                <div class=\"d-flex step-text\"><div>Step1 - </div><div class=\"ms-1 \"><a class=\"dowloadLink\" href=\"../../../assets/files/StoreBuilderTemplate.xlsx\" download>Download the template here</a></div></div>\r\n                                <div class=\"mt-2 d-flex step-text\"><div>Step2 - </div><div class=\"ms-1\">Add your data to the Template File</div></div>\r\n                                <div class=\"mt-2 d-flex step-text\"><div>Step3 - </div><div class=\"ms-1\">Upload it below for processing</div></div>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"titleContent mt-8\">\r\n                            <button class=\"btn btn-primary btnClass\" (click)=\"file.click()\">\r\n                                <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\">\r\n                                    <path\r\n                                        d=\"M18 12.5V15.8333C18 16.2754 17.8244 16.6993 17.5118 17.0118C17.1993 17.3244 16.7754 17.5 16.3333 17.5H4.66667C4.22464 17.5 3.80072 17.3244 3.48816 17.0118C3.17559 16.6993 3 16.2754 3 15.8333V12.5M14.6667 6.66667L10.5 2.5M10.5 2.5L6.33333 6.66667M10.5 2.5V12.5\"\r\n                                        stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg></span>\r\n                                Upload CSV\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </ng-container>\r\n        <div *ngIf=\"!loading && layoutList.length\">\r\n            <lib-pagination class=\"text-start\" [itemsPerPage]=\"dynamicData.limit\" [currentPage]=\"dynamicData.offset\"\r\n                [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n                (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<ng-template #createBuilder let-modal>\r\n    <div class=\"card scroll\">\r\n        <div class=\"card-header border-0\">\r\n            <div class=\"card-title\">\r\n                <span class=\"card-label\">Create store layout</span>\r\n            </div>\r\n        </div>\r\n        <div class=\"card-body storeCard\">\r\n            <div class=\"selectStore\">\r\n                <div class=\"mt-2\">\r\n                    <div class=\"pt-3 position-relative\" (clickOutside)=\"closeDropDown()\">\r\n                        <label for=\"inputmodel\" class=\"label pb-2\">Select Store</label>\r\n                        <div class=\"dropdown-close\">\r\n                            <div class=\"w-100\">\r\n                                <div class=\"d-flex align-items-center position-relative w-100\">\r\n                                    <input type=\"text\" class=\"form-control dropdown-input\"\r\n                                        (click)=\"toggleDropDown()\" readonly placeholder=\"Select One Store\" [ngModel]=\"selectedStore?.name\"/>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"dropdown-menu custom-dropdown-menu w-100\" *ngIf=\"showDropDown\">\r\n                                <div class=\"mx-3\">\r\n                                    <input type=\"text\" class=\"form-control mb-2\" placeholder=\"Search Store...\"\r\n                                        [(ngModel)]=\"searchStore\" (ngModelChange)=\"filterSearch()\" />\r\n                                </div>\r\n                                <div [class]=\"storeList.length > 5 ? 'h-200px overflow-auto' : 'h-auto'\">\r\n                                    <div class=\"dropdown-item form-check custom-dropdown-item\" *ngFor=\"let store of storeList;let i= index\"\r\n                                        (click)=\"updateSelectedStore(i)\">\r\n                                        <label class=\"\" [for]=\"store.name\">\r\n                                            {{ store.name }}\r\n                                        </label>\r\n                                    </div>\r\n                                </div>\r\n                                <div class=\"h-auto\" *ngIf=\"!storeList.length\">\r\n                                    <div class=\"dropdown-item form-check custom-dropdown-item\" >\r\n                                        <label class=\"\">No Data.</label>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"mt-5\">No of floors</div>\r\n                <div class=\"mt-2\">\r\n                    <div style=\"position: relative;\"><svg role=\"button\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"dec\" (click)=\"floorDec()\">\r\n                            <path d=\"M4.16602 10H15.8327\" stroke=\"#667085\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\"></path>\r\n                        </svg><input readonly=\"\" type=\"number\" [(ngModel)]=\"floorNo\" id=\"floor\"\r\n                            autocomplete=\"off\" class=\"form-control inc-dec-input\"\r\n                            ><svg role=\"button\" width=\"16\" height=\"16\"\r\n                            viewBox=\"0 0 16 16\" fill=\"none\" class=\"inc\" (click)=\"floorInc()\">\r\n                            <path d=\"M8.00065 3.33337V12.6667M3.33398 8.00004H12.6673\" stroke=\"#667085\"\r\n                                stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                        </svg></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"card-footer storeCard text-end border-0\">\r\n            <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n            <button class=\"btn btn-sm btn-primary\" (click)=\"createLayout()\" [disabled]=\"!selectedStore?.name\">Save</button>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #uploadBuilder let-modal>\r\n    <div class=\"card scroll\">\r\n        <div class=\"card-body\">\r\n            <div class=\"cardTitle\">Create store layout (CSV Upload)</div>\r\n            <div class=\"row mt-6\">\r\n                <div class=\"col-md-4\">\r\n                    <div class=\"card p-2 padding-left\">\r\n                        <div class=\"count\">{{excelData.totalStore}}</div>\r\n                        <div class=\"countTitle\">Total store</div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"col-md-4\">\r\n                    <div class=\"card p-2\">\r\n                        <div class=\"count\">{{excelData.totalRow}}</div>\r\n                        <div class=\"countTitle\">Rows processed</div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"col-md-4\">\r\n                    <div class=\"card p-2\">\r\n                        <div class=\"count text-danger\">{{excelData.totalError}}</div>\r\n                        <div class=\"countTitle text-danger\">Error</div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div class=\"mt-5\">\r\n                <div class=\"cardTitle\">Invalid details!</div>\r\n                <div class=\"countTitle fontWeight\">Please provide correct and complete layout information.</div>\r\n                <div class=\"error mt-5 p-5 pt-0 h-auto mh-200px overflow-scroll\" *ngIf=\"error\">\r\n                    <div class=\"mt-5\" *ngFor=\"let error of error;let i =index\">\r\n                        <span>{{i + 1}}&#41; {{error.message}} - <span *ngIf=\"error?.ExistIndex\">{{error.series}}{{error.ExistIndex}},</span>{{error.series}}{{error.index}}</span>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"card-footer storeCard text-end border-0\">\r\n            <button class=\"btn mx-5 btn-outline\" (click)=\"modal.dismiss()\">Cancel</button>\r\n            <button class=\"btn btn-sm btn-danger\" (click)=\"Reupload()\">Reupload</button>\r\n        </div>\r\n    </div>\r\n</ng-template>","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\nimport { PageInfoService } from 'tango-app-ui-global';\r\n@Component({\r\n  selector: 'lib-store-builder',\r\n  standalone: false,\r\n  templateUrl: './store-builder.component.html',\r\n  styleUrl: './store-builder.component.scss'\r\n})\r\nexport class StoreBuilderComponent implements OnInit, OnDestroy {\r\n currentRoute:string\r\n    routerSub:Subscription\r\n    type: 'create' | 'summary' = 'create'\r\n\r\n  \r\n    constructor(private router:Router, private pageInfo:PageInfoService){\r\n  \r\n    }\r\n    ngOnDestroy(): void {\r\n      this.routerSub.unsubscribe()\r\n    }\r\n    \r\n    ngOnInit(): void {\r\n      this.currentRoute = this.router.url;\r\n      if(this.currentRoute.startsWith('/manage/planogram/store-builder/create') ){\r\n        this.type = 'create'\r\n      }\r\n      else if(this.currentRoute.startsWith('/manage/planogram/store-builder/summary') ){\r\n        this.type = 'summary'\r\n      }\r\n     this.routerSub =  this.router.events.subscribe((event) => {\r\n        if (event instanceof NavigationEnd) {\r\n          this.currentRoute = event.urlAfterRedirects\r\n          if(this.currentRoute.startsWith('/manage/planogram/store-builder/create')){\r\n            this.type = 'create'\r\n          }\r\n          else if(this.currentRoute.startsWith('/manage/planogram/store-builder/summary')){\r\n            this.type = 'summary'\r\n          }\r\n        }\r\n      });\r\n\r\n      this.setPageData()\r\n  \r\n    }\r\n\r\n    setPageData() {\r\n      this.pageInfo.setTitle(\"Create Store Layout\");\r\n      this.pageInfo.setDescription(\"\");\r\n      this.pageInfo.setBreadcrumbs([\r\n        { title: \"Planogram\", path: \"/manage/planogram/store-layout\", isActive: false, isSeparator: false },\r\n        { title: \"Planogram\", path: \"/manage/planogram/store-layout\", isActive: false, isSeparator: true },\r\n      ]);\r\n    }\r\n}\r\n","<div class=\"c-card\">\r\n    <div *ngIf=\"type === 'create'\" class=\"active-dot\">\r\n        1\r\n    </div>\r\n    <div style=\"width: 8px;\" ></div>\r\n    <div *ngIf=\"type === 'summary'\" class=\"success-dot me-2\" >\r\n     <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n        <path d=\"M9 2L3.5 7.5L1 5\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    </svg>   \r\n    </div>    \r\n    <div [ngClass]=\"type === 'create' ? 'active-txt' : 'success-txt'\" class=\" me-4\">\r\n        Create layout\r\n    </div>\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"103\" height=\"2\" viewBox=\"0 0 103 2\" fill=\"none\">\r\n        <path d=\"M0 1H103\" stroke=\"#98A2B3\" stroke-width=\"1.5\" />\r\n    </svg>\r\n    <div [ngClass]=\"type === 'summary' ? 'active-dot' : 'inactive-dot'\" class=\" me-2\">\r\n        2\r\n    </div>\r\n    <div [ngClass]=\"type === 'summary' ? 'active-txt' : 'inactive-txt'\">\r\n        Summary\r\n    </div>\r\n</div>\r\n<router-outlet></router-outlet>","import { FormControl } from '@angular/forms';\r\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { ChangeDetectorRef, Component, ElementRef, HostListener, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { NgbModal, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { HeaderFilter } from '../../interfaces/layout-builder.interface';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { StoreOffcanvasComponentComponent } from '../store-offcanvas-component/store-offcanvas-component.component';\r\nimport { AddFloorComponent } from '../create-layout/popups/add-floor/add-floor.component';\r\nimport { ClearAllStepsComponent } from '../create-layout/popups/clear-all-steps/clear-all-steps.component';\r\nimport { DeleteLayoutComponent } from '../create-layout/popups/delete-layout/delete-layout.component';\r\nimport * as XLSX from 'xlsx';\r\n@Component({\r\n  selector: 'lib-create-store',\r\n  standalone: false,\r\n  templateUrl: './create-store.component.html',\r\n  styleUrl: './create-store.component.scss'\r\n})\r\nexport class CreateStoreComponent implements OnInit, OnDestroy {\r\n  floorsInput = new FormControl()\r\n  @ViewChild('gridCanvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('widgetCanvas', { static: false }) widgetCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('scrollContainer') scrollContainerRef!: ElementRef;\r\n\r\n\r\n  gridWidth = 1;\r\n  gridHeight = 1;\r\n\r\n  private ctx!: CanvasRenderingContext2D;\r\n  private canvas!: HTMLCanvasElement;\r\n\r\n  private widgetCtx!: CanvasRenderingContext2D;\r\n  private widgetCanvas!: HTMLCanvasElement;\r\n\r\n  elementType: 'wall' | 'facade' | 'opening' | 'entrance' = 'wall'\r\n  layoutPolygon: any[] = []\r\n\r\n  popupVisible = false;\r\n  popupPosition: any = { x: 100, y: 100 };\r\n  selectedLine: any\r\n  selectedLineIndex: number | null\r\n  movePixels = 0;\r\n  moveAngle = 0;\r\n  unit: 'ft' = 'ft'\r\n  moveDirection: 'left' | 'right' | 'up' | 'down' = 'right';\r\n\r\n  layoutMode: 'full' | 'half' = 'half'\r\n\r\n  elementSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  directionSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  lineOptionsSelect: { show: boolean, index: number } = { show: false, index: 0 }\r\n  widgetElementSelect: { show: boolean } = { show: false }\r\n  layoutOptionSelect: { show: boolean, } = { show: false }\r\n  floorSelect: { show: boolean, deleteIndex: number | null } = { show: false, deleteIndex: null }\r\n\r\n  private scale = 1;\r\n  panOffset = { x: 0, y: 0 };\r\n\r\n\r\n  breakpoints: number[] = [0, 360];\r\n  @ViewChild('circle') circleRef!: ElementRef;\r\n  @ViewChild('pointer') pointerRef!: ElementRef;\r\n\r\n  lines: { transform: string; highlight: boolean; invisible: boolean }[] = [];\r\n  private minAngle!: number;\r\n  private maxAngle!: number;\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  headerData: HeaderFilter | null | undefined;\r\n\r\n  planoStoreList: any[] = []\r\n  selectedStore: any\r\n  selectedFloor: any\r\n\r\n  undoStack: any[] = [];\r\n  redoStack: any[] = [];\r\n\r\n  planoIds: string[] = []\r\n\r\n  itemsPerPage = 1\r\n  currentPage = 0\r\n  totalItems = 1\r\n  paginationSizes = [1]\r\n  pageSize = 1\r\n\r\n  pixelPerMetre: number = 50\r\n\r\n  cumulativeRotation = 0\r\n\r\n\r\n\r\n  onPageChange(val: number) {\r\n    this.selectedStore = this.planoStoreList[val - 1];\r\n    this.selectedFloor = this.selectedStore.floor[0];\r\n    this.floorsInput.setValue(this.selectedFloor.id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n    this.redoStack = [];\r\n    this.undoStack = [];\r\n  }\r\n\r\n  saveStateToUndo(): void {\r\n    this.undoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n  }\r\n\r\n  undo(): void {\r\n    if (this.undoStack.length > 0) {\r\n      this.redoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n\r\n      this.layoutPolygon = this.undoStack.pop();\r\n\r\n      this.redrawCanvas()\r\n    }\r\n  }\r\n\r\n  redo(): void {\r\n    if (this.redoStack.length > 0) {\r\n      this.undoStack.push(JSON.parse(JSON.stringify(this.layoutPolygon)));\r\n\r\n      this.layoutPolygon = this.redoStack.pop();\r\n\r\n      this.redrawCanvas()\r\n    }\r\n  }\r\n\r\n  constructor(private cd: ChangeDetectorRef, private renderer: Renderer2, private route: ActivatedRoute,\r\n    private apiService: StoreBuilderService, private router: Router, private offcanvasService: NgbOffcanvas, private toastService: ToastService, private modalDef: NgbModal) {\r\n    this.headerData = JSON.parse(localStorage.getItem('header-filters') as string)\r\n  }\r\n\r\n  initializeLayout() {\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    const proto = [\r\n\r\n    ]\r\n\r\n    const instructions = [\r\n      {\r\n        \"elementType\": \"wall\",\r\n        \"distance\": 10,\r\n        \"unit\": \"ft\",\r\n        \"direction\": \"right\",\r\n        \"angle\": 90,\r\n        \"elementNumber\": 4,\r\n        \"fixtures\": [\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          },\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        \"elementType\": \"wall\",\r\n        \"distance\": 10,\r\n        \"unit\": \"ft\",\r\n        \"direction\": \"down\",\r\n        \"angle\": 90,\r\n        \"elementNumber\": 5,\r\n        \"fixtures\": [\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          },\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        \"elementType\": \"wall\",\r\n        \"distance\": 10,\r\n        \"unit\": \"ft\",\r\n        \"direction\": \"left\",\r\n        \"angle\": 90,\r\n        \"elementNumber\": 5,\r\n        \"fixtures\": [\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          },\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        \"elementType\": \"wall\",\r\n        \"distance\": 10,\r\n        \"unit\": \"ft\",\r\n        \"direction\": \"down\",\r\n        \"angle\": 90,\r\n        \"elementNumber\": 5,\r\n        \"fixtures\": [\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          },\r\n          {\r\n            fixtureHeight: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            fixtureLength: {\r\n              value: 800,\r\n              unit: 'mm'\r\n            },\r\n            fixtureWidth: {\r\n              value: 500,\r\n              unit: 'mm'\r\n            },\r\n            relativePosition: {\r\n              x: 0,\r\n              y: 0,\r\n              unit: 'mm'\r\n            }\r\n          }\r\n        ]\r\n      },\r\n      {\r\n        \"elementType\": \"wall\",\r\n        \"distance\": 10,\r\n        \"unit\": \"ft\",\r\n        \"direction\": \"right\",\r\n        \"angle\": 90,\r\n        \"elementNumber\": 5,\r\n      },\r\n\r\n    ]\r\n\r\n    this.generateLayoutPolygon(instructions)\r\n    this.generateFixture(instructions)\r\n\r\n    this.openWidget({\r\n      \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n      \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n    })\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.canvas = this.canvasRef.nativeElement;\r\n    this.ctx = this.canvas.getContext('2d')!;\r\n\r\n    this.canvas.width = 10000;\r\n    this.canvas.height = 10000;\r\n\r\n    this.drawGrid();\r\n\r\n    this.canvas.addEventListener('mousedown', this.onMouseDown.bind(this));\r\n    this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));\r\n\r\n    this.minAngle = Math.min(...this.breakpoints);\r\n    this.maxAngle = Math.max(...this.breakpoints);\r\n\r\n    for (let i = 0; i < 360; i += 45) {\r\n      this.lines.push({\r\n        transform: `rotate(${i}deg)`,\r\n        highlight: false,\r\n        invisible: i < this.minAngle || i > this.maxAngle\r\n      });\r\n    }\r\n\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.id) {\r\n          this.planoIds = params.id.split(',') || [];\r\n          this.getPlanoData()\r\n        }\r\n      });\r\n    this.redrawCanvas()\r\n\r\n\r\n  }\r\n\r\n  onFloorSelect(floorId: string) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    this.selectedFloor = this.selectedStore.floor.filter((floor: any) => floor.id === floorId)[0]\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n    this.redoStack = []\r\n    this.undoStack = []\r\n  }\r\n\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  onStoreChange(event: any) {\r\n    if (this.layoutPolygon[0][0].x !== this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y !== this.layoutPolygon[0][1].y) {\r\n      this.updateFloorLayout()\r\n    }\r\n    const index = this.planoStoreList.findIndex(item => item.planoId === event.planoId);\r\n    this.currentPage = index + 1\r\n    this.selectedStore = event;\r\n    this.selectedFloor = this.selectedStore.floor[0];\r\n    this.floorsInput.setValue(this.selectedFloor.id, { emitEvent: false });\r\n    this.generateLayoutPolygon(this.selectedFloor.layoutPolygon);\r\n    this.redoStack = [];\r\n    this.undoStack = [];\r\n  }\r\n\r\n  openOffCanva() {\r\n    let canvaRef = this.offcanvasService.open(StoreOffcanvasComponentComponent, { position: 'end', panelClass: 'set-height' })\r\n    canvaRef.componentInstance.store = this.selectedStore;\r\n    canvaRef.componentInstance.clientId = this.headerData?.client;\r\n    canvaRef.componentInstance.id = this.selectedStore.planoId;\r\n  }\r\n\r\n  getPlanoData() {\r\n    const payload = {\r\n      id: this.planoIds\r\n    }\r\n\r\n    this.apiService.getPlano(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.planoStoreList = res.data?.FloorDetails\r\n        this.totalItems = res.data?.FloorDetails.length\r\n        if (!this.selectedStore) {\r\n          this.selectedStore = this.planoStoreList[0]\r\n        } else {\r\n          this.selectedStore = this.planoStoreList.filter((store: any) => store.planoId === this.selectedStore.planoId)[0]\r\n        }\r\n        if (!this.selectedFloor) {\r\n          this.selectedFloor = this.selectedStore.floor[0]\r\n        } else {\r\n          this.selectedFloor = this.selectedStore.floor.filter((floor: any) => floor.id === this.selectedFloor.id)[0]\r\n          if (!this.selectedFloor) {\r\n            this.selectedFloor = this.selectedStore.floor[0]\r\n          }\r\n        }\r\n\r\n        this.floorsInput.setValue(this.selectedFloor.id, { emitEvent: false })\r\n        this.generateLayoutPolygon(this.selectedFloor.layoutPolygon)\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  updateFloorLayout() {\r\n    const payload = {\r\n      id: this.selectedFloor.id,\r\n      layoutPolygon: this.layoutPolygon.map((segment) => {\r\n        const [point1, point2, properties] = segment\r\n        return properties\r\n      }),\r\n      status: 'draft'\r\n    }\r\n\r\n    this.apiService.updateFloorLayout(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code === 200) {\r\n          this.getPlanoData()\r\n          this.toastService.getSuccessToast(res.message)\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  deleteFloor(index: number) {\r\n\r\n    this.floorSelect = {\r\n      show: !this.floorSelect.show,\r\n      deleteIndex: null\r\n    };\r\n\r\n    const modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        const payload = {\r\n          id: this.selectedStore.floor[index].id,\r\n        }\r\n\r\n        this.apiService.deleteFloor(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res.code === 200) {\r\n              this.getPlanoData()\r\n              this.toastService.getSuccessToast(res.message)\r\n            }\r\n          },\r\n          error: (err) => {\r\n            console.log(err)\r\n          }\r\n        })\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  addFloor(planoId: string, floorCount: number) {\r\n    const payload = {\r\n      id: planoId,\r\n      floorNumber: floorCount\r\n    };\r\n\r\n    this.apiService.addFloor(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code === 200) {\r\n          this.getPlanoData()\r\n          this.toastService.getSuccessToast(res.message)\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onSaveAsDraft() {\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n\r\n    this.updateFloorLayout()\r\n\r\n  }\r\n\r\n  onConfigure() {\r\n    if (this.planoStoreList.length === 1) {\r\n      for (let index = 0; index < this.selectedStore.floor.length; index++) {\r\n        let layoutInstruction\r\n        if (this.selectedStore.floor[index].id === this.selectedFloor.id) {\r\n          layoutInstruction = this.layoutPolygon.map((line) => {\r\n            const [stert, end, properties] = line\r\n            return properties\r\n          })\r\n        } else {\r\n          layoutInstruction = this.selectedStore.floor[index].layoutPolygon\r\n        }\r\n        if (!this.isFloorCompleted(layoutInstruction)) {\r\n          this.toastService.getErrorToast(`Please complete ${this.selectedStore.floor[index].floorName}`)\r\n          return\r\n        }\r\n      }\r\n    } else if (this.planoStoreList.length > 1) {\r\n      for (let i = 0; i < this.planoStoreList.length; i++) {\r\n        for (let j = 0; j < this.planoStoreList[i].floor.length; j++) {\r\n          let layoutInstruction\r\n          if (this.planoStoreList[i].floor[j].id === this.selectedFloor.id) {\r\n            layoutInstruction = this.layoutPolygon.map((line) => {\r\n              const [stert, end, properties] = line\r\n              return properties\r\n            })\r\n          } else {\r\n            layoutInstruction = this.planoStoreList[i].floor[j].layoutPolygon\r\n          }\r\n          if (!this.isFloorCompleted(layoutInstruction)) {\r\n            this.toastService.getErrorToast(`Please complete ${this.planoStoreList[i].floor[j].floorName} of ${this.planoStoreList[i].storeName}`)\r\n            return\r\n          }\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    this.updateFloorLayout()\r\n    this.router.navigate(['/manage/planogram/layout-builder/summary'], {\r\n      queryParamsHandling: 'merge'\r\n    });\r\n\r\n  }\r\n\r\n  drawWidgetRing() {\r\n    this.widgetCanvas = this.widgetCanvasRef.nativeElement;\r\n    this.widgetCtx = this.widgetCanvas.getContext('2d')!;\r\n\r\n    this.widgetCanvas.width = 229;\r\n    this.widgetCanvas.height = 229;\r\n    this.widgetCtx.clearRect(0, 0, this.widgetCanvas.width, this.widgetCanvas.height);\r\n\r\n    const direction: any = this.moveDirection\r\n    const centerX = this.widgetCanvas.width / 2;\r\n    const centerY = this.widgetCanvas.height / 2;\r\n    const outerRadius = 114.5;\r\n    const innerRadius = 85;\r\n\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, outerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fillStyle = '#F9FAFB';\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'destination-out';\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, innerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'source-over';\r\n\r\n    this.widgetCtx.beginPath();\r\n    let startAngle, endAngle, color;\r\n    switch (direction) {\r\n      case 'down':\r\n        startAngle = 0;\r\n        endAngle = Math.PI;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'up':\r\n        startAngle = Math.PI;\r\n        endAngle = Math.PI * 2;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'right':\r\n        startAngle = Math.PI * 1.5;\r\n        endAngle = Math.PI * 0.5;\r\n        color = '#EAF7FF';\r\n        break;\r\n      case 'left':\r\n        startAngle = Math.PI * 0.5;\r\n        endAngle = Math.PI * 1.5;\r\n        color = '#EAF7FF';\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    this.widgetCtx.moveTo(centerX, centerY);\r\n    this.widgetCtx.arc(centerX, centerY, outerRadius, startAngle, endAngle);\r\n    this.widgetCtx.lineTo(centerX, centerY);\r\n    this.widgetCtx.fillStyle = color;\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'destination-out';\r\n    this.widgetCtx.beginPath();\r\n    this.widgetCtx.arc(centerX, centerY, innerRadius, 0, Math.PI * 2);\r\n    this.widgetCtx.fill();\r\n\r\n    this.widgetCtx.globalCompositeOperation = 'source-over';\r\n  }\r\n\r\n  private updateWidgetPointer(): void {\r\n    let angle: number;\r\n    switch (this.moveDirection) {\r\n      case 'right':\r\n        angle = 0 + this.moveAngle;\r\n        break;\r\n      case 'down':\r\n        angle = 90 + this.moveAngle;\r\n        break;\r\n      case 'left':\r\n        angle = 180 + this.moveAngle;\r\n        break;\r\n      case 'up':\r\n        angle = 270 + this.moveAngle;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n    const pointer = this.pointerRef?.nativeElement;\r\n    this.renderer.setStyle(pointer, 'transform', `rotate(${angle}deg)`);\r\n\r\n    this.lines.forEach((line) => {\r\n      const lineAngle = parseInt(line.transform.replace('rotate(', ''), 10);\r\n      line.highlight = angle >= lineAngle && angle >= this.minAngle && lineAngle <= this.maxAngle;\r\n    });\r\n\r\n\r\n  }\r\n\r\n\r\n  drawGrid(): void {\r\n    this.ctx.save();\r\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n    this.ctx.scale(this.scale, this.scale);\r\n    this.ctx.translate(this.panOffset.x, this.panOffset.y);\r\n\r\n\r\n    // for (let x = 0; x <= this.canvas.width; x += this.gridWidth) {\r\n    //   for (let y = 0; y <= this.canvas.height; y += this.gridHeight) {\r\n    //     this.ctx.beginPath();\r\n    //     this.ctx.arc(x, y, 1, 0, Math.PI * 2);\r\n    //     this.ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\r\n    //     this.ctx.fill();\r\n    //   }\r\n    // }\r\n\r\n    this.ctx.restore();\r\n  }\r\n\r\n  drawPolygon(polygon = this.layoutPolygon) {\r\n    if (polygon.length < 1) return; // If the polygon has no edges, exit early.\r\n\r\n    this.ctx.save(); // Save the current canvas state.\r\n    this.ctx.scale(this.scale, this.scale); // Scale the canvas context to match the desired scale.\r\n    this.ctx.translate(this.panOffset.x, this.panOffset.y);\r\n\r\n\r\n    // Function to draw an arrowhead at a specific location and angle.\r\n    function drawArrowhead(ctx: any, x: any, y: any, angle: any) {\r\n      const size = 5; // Define the size of the arrowhead.\r\n      ctx.save(); // Save the current canvas state.\r\n      ctx.translate(x, y); // Move the context to the arrowhead position.\r\n      ctx.rotate(angle); // Rotate the context to match the arrow's angle.\r\n      ctx.beginPath(); // Start a new path.\r\n      ctx.moveTo(0, 0); // Move to the tip of the arrowhead.\r\n      ctx.lineTo(-size, -size / 2); // Draw one side of the arrowhead.\r\n      ctx.lineTo(-size, size / 2); // Draw the other side of the arrowhead.\r\n      ctx.closePath(); // Close the arrowhead path.\r\n      ctx.fillStyle = 'black'; // Set the arrowhead color.\r\n      ctx.fill(); // Fill the arrowhead.\r\n      ctx.restore(); // Restore the previous canvas state.\r\n    }\r\n\r\n    this.ctx.beginPath(); // Begin the main polygon path.\r\n    polygon.forEach((edge, edgeIndex) => {\r\n      const point = edge[0]; // Starting point of the edge.\r\n      const nextPoint = edge[1]; // Ending point of the edge.\r\n      const properties = edge[2]; // Properties of the edge (e.g., labels, distances).\r\n\r\n      // Draw the main polygon edge.\r\n      if (edgeIndex === 0) this.ctx.moveTo(point.x, point.y); // Move to the first edge starting point.\r\n      this.ctx.lineTo(nextPoint.x, nextPoint.y); // Draw a line to the next point.\r\n\r\n      // Calculate the perpendicular offset for the bounding box.\r\n      const dx = nextPoint.x - point.x; // X-difference between start and end points.\r\n      const dy = nextPoint.y - point.y; // Y-difference between start and end points.\r\n      const length = Math.sqrt(dx * dx + dy * dy); // Length of the edge.\r\n      const offsetX = (dy / length) * 20; // Offset in the X direction.\r\n      const offsetY = (-dx / length) * 20; // Offset in the Y direction.\r\n\r\n      // Define the bounding box points.\r\n      const boxPoints = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY },\r\n      ];\r\n\r\n      // Draw the bounding box.\r\n      this.ctx.beginPath();\r\n      this.ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n      boxPoints.forEach((pt, index) => {\r\n        if (index < 2) {\r\n          this.ctx.lineTo(pt.x, pt.y)\r\n        }\r\n\r\n      });\r\n      if (properties.elementType === 'opening') {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#008EDF'\r\n\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      } else {\r\n        this.ctx.closePath(); // Close the bounding box path.\r\n        this.ctx.fillStyle = '#F9FAFB'; // Set a translucent fill color.\r\n        this.ctx.fill(); // Fill the bounding box.\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#008EDF'\r\n        this.ctx.stroke(); // Draw the bounding box border. \r\n      }\r\n\r\n\r\n      // Position text in the middle of the bounding box.\r\n      const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n      const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n      this.ctx.save(); // Save the current canvas state.\r\n      this.ctx.translate(textX, textY); // Move the context to the text position.\r\n\r\n      // Rotate text based on the edge direction.\r\n      if (dx === 0) {\r\n        this.ctx.rotate(-Math.PI / 2); // Rotate for vertical edges.\r\n      } else if (dy !== 0) {\r\n        const angle = Math.atan2(dy, dx); // Calculate angle for diagonal edges.\r\n        this.ctx.rotate(angle); // Rotate the text to match the angle.\r\n      }\r\n\r\n      // Draw the edge properties as text.\r\n      this.ctx.font = '12px Arial'; // Set the font style and size.\r\n      this.ctx.fillStyle = 'black'; // Set the text color.\r\n      this.ctx.textAlign = 'center'; // Align text to the center.\r\n      this.ctx.textBaseline = 'middle'; // Align text vertically in the middle.\r\n      this.ctx.fillText(\r\n        `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n        0,\r\n        0\r\n      );\r\n      this.ctx.restore(); // Restore the previous canvas state.\r\n\r\n      if (properties.distance >= 4) {\r\n        // Define the midpoints of the left and right edges of the bounding box.\r\n        const centerX = textX;\r\n        const centerY = textY;\r\n        const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n        const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n        const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n        const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n        // Helper function to adjust points by a specific distance.\r\n        function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n          const angle = Math.atan2(y2 - y1, x2 - x1); // Calculate the angle.\r\n          return {\r\n            x: x1 + Math.cos(angle) * distance, // Adjust X by distance.\r\n            y: y1 + Math.sin(angle) * distance, // Adjust Y by distance.\r\n          };\r\n        }\r\n\r\n        // Define the arrow line start and end points for the right side.\r\n        const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n        const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n\r\n        // Define the arrow line start and end points for the left side.\r\n        const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n        const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n        // Draw the right arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(rightStart.x, rightStart.y);\r\n        this.ctx.lineTo(rightEnd.x, rightEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n        drawArrowhead(this.ctx, rightEnd.x, rightEnd.y, rightAngle); // Draw the arrowhead.\r\n\r\n        // Draw the left arrow.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(leftStart.x, leftStart.y);\r\n        this.ctx.lineTo(leftEnd.x, leftEnd.y);\r\n        this.ctx.strokeStyle = 'black'; // Set the arrow line color.\r\n        this.ctx.stroke(); // Draw the arrow line.\r\n        let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n        drawArrowhead(this.ctx, leftEnd.x, leftEnd.y, leftAngle); // Draw the arrowhead.\r\n\r\n      }\r\n\r\n      // For Entrance\r\n      if (properties.elementType === 'entrance') {\r\n        // Calculate the angle of the main line (edge) in radians.\r\n        const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n        // Add 15 degrees to the angle for the entrance line.\r\n        const entranceAngle = angle + (15 * Math.PI) / 180; // Convert 15 degrees to radians.\r\n\r\n        // Define the length of the entrance line.\r\n        const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n\r\n        // Calculate the endpoint of the entrance line based on the angle.\r\n        const endPoint = {\r\n          x: point.x + Math.cos(entranceAngle) * lineLength,\r\n          y: point.y + Math.sin(entranceAngle) * lineLength,\r\n        };\r\n\r\n        // Draw the entrance line.\r\n        this.ctx.beginPath();\r\n        this.ctx.moveTo(point.x, point.y);\r\n        this.ctx.lineTo(endPoint.x, endPoint.y);\r\n        this.selectedLineIndex === edgeIndex ? this.ctx.strokeStyle = '#008EDF' : this.ctx.strokeStyle = '#1D2939'\r\n        this.ctx.stroke();\r\n      }\r\n\r\n\r\n    });\r\n\r\n    this.ctx.restore(); // Restore the original canvas state.\r\n  }\r\n\r\n  @HostListener('wheel', ['$event'])\r\n  onMouseWheel(event: WheelEvent) {\r\n    if (event.ctrlKey) {\r\n      event.preventDefault();\r\n      const scaleFactor = event.deltaY < 0 ? 1.01 : 1 / 1.01;\r\n      this.adjustZoom(event, scaleFactor);\r\n    }\r\n  }\r\n\r\n  adjustZoom(event: MouseEvent, scaleFactor: number): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n\r\n    const mouseX = (event.clientX - rect.left - this.panOffset.x) / this.scale;\r\n    const mouseY = (event.clientY - rect.top - this.panOffset.y) / this.scale;\r\n\r\n    this.scale *= scaleFactor;\r\n\r\n    this.panOffset.x -= mouseX * (scaleFactor - 1) * this.scale;\r\n    this.panOffset.y -= mouseY * (scaleFactor - 1) * this.scale;\r\n\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  resetZoom(): void {\r\n    this.scale = 1;\r\n    this.panOffset = { x: 0, y: 0 };\r\n    this.redrawCanvas();\r\n  }\r\n\r\n\r\n\r\n  transformPoint(point: { x: number; y: number }): { x: number; y: number } {\r\n    return {\r\n      x: point.x * this.scale + this.panOffset.x,\r\n      y: point.y * this.scale + this.panOffset.y,\r\n    };\r\n  }\r\n\r\n  drawLine(ctx: CanvasRenderingContext2D, line: { x: number; y: number }[]): void {\r\n    if (line.length < 2) return;\r\n\r\n    ctx.beginPath();\r\n    ctx.moveTo(line[0].x, line[0].y);\r\n    for (let i = 1; i < line.length; i++) {\r\n      ctx.lineTo(line[i].x, line[i].y);\r\n    }\r\n    ctx.stroke();\r\n  }\r\n\r\n\r\n\r\n\r\n  redrawCanvas(): void {\r\n    console.log(this.storeFixtures)\r\n    this.drawGrid();\r\n    this.drawPolygon();\r\n    this.drawFixtures()\r\n  }\r\n\r\n\r\n\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onOutsideClick(event: MouseEvent): void {\r\n    const clickedInside1 = (event.target as HTMLElement).closest('.elipsis-icon-dropdown');\r\n    if (!clickedInside1) {\r\n      this.lineOptionsSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside2 = (event.target as HTMLElement).closest('.direction-dropdown');\r\n    if (!clickedInside2) {\r\n      this.directionSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside3 = (event.target as HTMLElement).closest('.element-type-dropdown');\r\n    if (!clickedInside3) {\r\n      this.elementSelect = { show: false, index: 0 };\r\n    }\r\n\r\n    const clickedInside4 = (event.target as HTMLElement).closest('.widget-element-type-dropdown');\r\n    if (!clickedInside4) {\r\n      this.widgetElementSelect = { show: false };\r\n    }\r\n\r\n    const clickedInside5 = (event.target as HTMLElement).closest('.top-elipsis-menu');\r\n    if (!clickedInside5) {\r\n      this.layoutOptionSelect = { show: false };\r\n    }\r\n\r\n    const clickedInside6 = (event.target as HTMLElement).closest('.floor-select');\r\n    if (!clickedInside6) {\r\n      this.floorSelect = { show: false, deleteIndex: null };\r\n    }\r\n  }\r\n\r\n  toggleLineOptionsSelect(index: number): void {\r\n    this.lineOptionsSelect = {\r\n      show: this.lineOptionsSelect.index !== index || !this.lineOptionsSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleDirectionSelect(index: number): void {\r\n    this.directionSelect = {\r\n      show: this.directionSelect.index !== index || !this.directionSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleElementSelect(index: number): void {\r\n    this.elementSelect = {\r\n      show: this.elementSelect.index !== index || !this.elementSelect.show,\r\n      index,\r\n    };\r\n  }\r\n\r\n  toggleWidgetElementSelect(): void {\r\n    this.widgetElementSelect = {\r\n      show: !this.widgetElementSelect.show,\r\n    };\r\n  }\r\n\r\n  toggleLayoutOptionSelect(): void {\r\n    this.layoutOptionSelect = {\r\n      show: !this.layoutOptionSelect.show,\r\n    };\r\n  }\r\n\r\n  toggleFloorSelect(): void {\r\n    this.floorSelect = {\r\n      show: !this.floorSelect.show,\r\n      deleteIndex: null\r\n    };\r\n  }\r\n\r\n\r\n  drop(event: CdkDragDrop<any[]>) {\r\n\r\n    this.saveStateToUndo()\r\n    moveItemInArray(this.layoutPolygon, event.previousIndex, event.currentIndex);\r\n\r\n    const instructions = this.layoutPolygon.map((segment) => {\r\n      const [point1, point2, properties] = segment\r\n      return properties\r\n    })\r\n\r\n    this.generateLayoutPolygon(instructions)\r\n    this.redoStack = [];\r\n\r\n\r\n  }\r\n\r\n\r\n  snapToGrid(value: number, gridSize: number): number {\r\n    return Math.round(value / gridSize) * gridSize;\r\n  }\r\n\r\n  isPointInPolygon(point: any, polygon: any[]): boolean {\r\n    let { x, y } = point;\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x, yi = polygon[i].y;\r\n      const xj = polygon[j].x, yj = polygon[j].y;\r\n\r\n      const onEdge =\r\n        (y - yi) * (xj - xi) === (x - xi) * (yj - yi) &&\r\n        Math.min(xi, xj) <= x && x <= Math.max(xi, xj) &&\r\n        Math.min(yi, yj) <= y && y <= Math.max(yi, yj);\r\n\r\n      if (onEdge) {\r\n        return true;\r\n      }\r\n\r\n      const intersect = ((yi > y) !== (yj > y)) &&\r\n        (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n\r\n  movePointWithAngle(): void {\r\n    if (this.movePixels <= 0) return;\r\n\r\n    this.saveStateToUndo()\r\n\r\n    let radians: number;\r\n\r\n    switch (this.moveDirection) {\r\n      case 'up':\r\n        radians = ((180 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    if (this.selectedLine) {\r\n      const lineIndex = ((array1 = this.layoutPolygon, array2 = this.selectedLine) => {\r\n        return array1.findIndex(innerArray =>\r\n          innerArray.length === array2.length &&\r\n          innerArray.every((item: any, index: any) => JSON.stringify(item) === JSON.stringify(array2[index]))\r\n        );\r\n      })();\r\n\r\n      const [start, end, properties] = this.layoutPolygon[lineIndex];\r\n      const newX = start.x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n      const newY = start.y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      this.layoutPolygon[lineIndex][1].x = snappedX;\r\n      this.layoutPolygon[lineIndex][1].y = snappedY;\r\n      this.layoutPolygon[lineIndex][2].angle = this.moveAngle;\r\n      this.layoutPolygon[lineIndex][2].direction = this.moveDirection;\r\n      this.layoutPolygon[lineIndex][2].distance = this.movePixels;\r\n      this.layoutPolygon[lineIndex][2].elementType = this.elementType;\r\n\r\n      this.redrawCanvas()\r\n      this.closeWidget()\r\n      this.selectedLine = null\r\n\r\n    } else {\r\n      const lastLine = this.layoutPolygon[this.layoutPolygon.length - 1];\r\n      const newX = lastLine[1].x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n      const newY = lastLine[1].y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newPoint = { x: snappedX, y: snappedY };\r\n\r\n\r\n      if (this.layoutPolygon.length > 0) {\r\n        const lastPoint = lastLine[1];\r\n        const firstPoint = this.layoutPolygon[0][0];\r\n\r\n\r\n        if (newPoint.x === firstPoint.x && newPoint.y === firstPoint.y) {\r\n          this.layoutPolygon.push([lastPoint, newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: this.getMaxElementNumber(this.layoutPolygon, this.elementType) }]);\r\n          this.closeWidget()\r\n\r\n        } else if (\r\n          !this.layoutPolygon.some(line =>\r\n            (line[0].x === newPoint.x && line[0].y === newPoint.y) ||\r\n            (line[1].x === newPoint.x && line[1].y === newPoint.y)\r\n          )\r\n        ) {\r\n          if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n            this.layoutPolygon[0] = [this.layoutPolygon[0][0], newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: 1 }]\r\n          } else {\r\n            this.layoutPolygon.push([lastPoint, newPoint, { elementType: this.elementType, distance: this.movePixels, unit: this.unit, direction: this.moveDirection, angle: this.moveAngle, elementNumber: this.getMaxElementNumber(this.layoutPolygon, this.elementType) }]);\r\n          }\r\n          this.openWidget(newPoint)\r\n        }\r\n      }\r\n\r\n      this.redoStack = [];\r\n\r\n      this.cd.detectChanges();\r\n      this.redrawCanvas()\r\n    }\r\n\r\n\r\n  }\r\n\r\n  getMaxElementNumber(data: any, elementType: string) {\r\n    if (!Array.isArray(data)) {\r\n      throw new Error(\"Invalid data format: data should be an array.\");\r\n    }\r\n\r\n    return Math.round(data.reduce((maxNumber, segment) => {\r\n      if (Array.isArray(segment)) {\r\n        const element = segment.find(item => item.elementType === elementType);\r\n        if (element && typeof element.elementNumber === 'number') {\r\n          maxNumber = Math.max(maxNumber, element.elementNumber);\r\n        }\r\n      }\r\n      return maxNumber;\r\n    }, 0)) + 1;\r\n  }\r\n\r\n  onMouseDown(event: MouseEvent): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n    const mouseX = event.clientX - rect.left;\r\n    const mouseY = event.clientY - rect.top;\r\n\r\n\r\n    for (const line of this.layoutPolygon) {\r\n      const point = line[0];\r\n      const nextPoint = line[1];\r\n\r\n      const dx = nextPoint.x - point.x;\r\n      const dy = nextPoint.y - point.y;\r\n      const length = Math.sqrt(dx * dx + dy * dy);\r\n      const offsetX = (dy / length) * 20;\r\n      const offsetY = (-dx / length) * 20;\r\n\r\n      const boxCorners = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY }\r\n      ];\r\n\r\n      if (this.isPointInPolygon({ x: mouseX, y: mouseY }, boxCorners)) {\r\n        for (let i = 0; i < this.layoutPolygon.length; i++) {\r\n          const [start, end, properties] = this.layoutPolygon[i];\r\n          if (this.isLineEqual(start, end, boxCorners[0], boxCorners[1], 0)) {\r\n            this.selectLine(line, i);\r\n            return;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n\r\n    this.selectedLine = null\r\n    this.selectedLineIndex = null\r\n    this.redrawCanvas()\r\n    this.closeWidget()\r\n  }\r\n\r\n\r\n  selectLine(line: any, index: number) {\r\n    const [start, end, properties] = line\r\n\r\n    this.selectedLine = line\r\n    this.selectedLineIndex = index\r\n    this.elementType = properties.elementType\r\n    this.movePixels = properties.distance\r\n    this.moveDirection = properties.direction\r\n    this.moveAngle = properties.angle\r\n    this.unit = properties.unit\r\n    this.openWidget(end)\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  openWidget(position: { x: number, y: number }, offset = { up: 0, right: 5, down: 15, left: 0, }) {\r\n    this.popupVisible = true\r\n    const adjustedPosition = {\r\n      x: position.x + offset.right + offset.left,\r\n      y: position.y + offset.up + offset.down,\r\n    };\r\n\r\n    this.popupPosition = adjustedPosition\r\n    this.scrollToCanvasPosition(adjustedPosition)\r\n    setTimeout(() => {\r\n      this.drawWidgetRing()\r\n      this.updateWidgetPointer()\r\n    }, 500);\r\n\r\n  }\r\n\r\n  closeWidget() {\r\n    this.popupVisible = false\r\n  }\r\n\r\n  onMouseMove(event: MouseEvent): void {\r\n    const rect = this.canvas.getBoundingClientRect();\r\n    const mouseX = event.clientX - rect.left;\r\n    const mouseY = event.clientY - rect.top;\r\n\r\n    let hoveredPolygonBox = this.layoutPolygon.some(line => {\r\n      const point = line[0];\r\n      const nextPoint = line[1];\r\n\r\n      const dx = nextPoint.x - point.x;\r\n      const dy = nextPoint.y - point.y;\r\n      const length = Math.sqrt(dx * dx + dy * dy);\r\n      const offsetX = (dy / length) * 20;\r\n      const offsetY = (-dx / length) * 20;\r\n\r\n      const boxCorners = [\r\n        { x: point.x, y: point.y },\r\n        { x: nextPoint.x, y: nextPoint.y },\r\n        { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n        { x: point.x + offsetX, y: point.y + offsetY }\r\n      ];\r\n\r\n      return this.isPointInPolygon({ x: mouseX, y: mouseY }, boxCorners);\r\n    });\r\n\r\n\r\n    this.canvas.style.cursor = hoveredPolygonBox ? 'pointer' : 'default';\r\n\r\n  }\r\n\r\n\r\n  drawLineWithLength(start: any, end: any): void {\r\n    const midX = (start.x + end.x) / 2;\r\n    const midY = (start.y + end.y) / 2;\r\n\r\n    const distance = Math.sqrt(\r\n      Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2)\r\n    ).toFixed(0);\r\n\r\n    const textSpacing = 10;\r\n    let textX = midX;\r\n    let textY = midY;\r\n\r\n    if (start.y === end.y) {\r\n      textY += textSpacing;\r\n    } else if (start.x === end.x) {\r\n      textX += textSpacing;\r\n    } else {\r\n      const angle = Math.atan2(end.y - start.y, end.x - start.x);\r\n      textX += textSpacing * Math.cos(angle);\r\n      textY += textSpacing * Math.sin(angle);\r\n    }\r\n\r\n    this.ctx.beginPath();\r\n    this.ctx.moveTo(start.x, start.y);\r\n    this.ctx.lineTo(end.x, end.y);\r\n    this.ctx.strokeStyle = 'black';\r\n    this.ctx.stroke();\r\n\r\n    this.ctx.save();\r\n    if (start.y === end.y) {\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, textX, textY);\r\n    } else if (start.x === end.x) {\r\n      this.ctx.translate(textX, textY);\r\n      this.ctx.rotate(-Math.PI / 2);\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, 0, 0);\r\n      this.ctx.restore();\r\n    } else {\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.fillText(`${distance}px`, textX, textY);\r\n    }\r\n    this.ctx.restore();\r\n  }\r\n\r\n  layoutLengthPreview() {\r\n    if (this.layoutPolygon.length === 1 && this.layoutPolygon[0][0].x === this.layoutPolygon[0][1].x && this.layoutPolygon[0][0].y === this.layoutPolygon[0][1].y) {\r\n      return\r\n    }\r\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n    let radians: number;\r\n    switch (this.moveDirection) {\r\n      case 'up':\r\n        radians = ((180 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - this.moveAngle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const lastLine = this.layoutPolygon[this.layoutPolygon.length - 1];\r\n    const newX = lastLine[1].x + Math.cos(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n    const newY = lastLine[1].y - Math.sin(radians) * this.convertToPixels(this.movePixels, this.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const previewPoint = { x: snappedX, y: snappedY };\r\n\r\n    this.redrawCanvas()\r\n    this.drawLineWithLength(lastLine[1], previewPoint)\r\n\r\n\r\n  }\r\n\r\n\r\n  rotatePolygons(): void {\r\n    this.saveStateToUndo();\r\n    this.closeWidget()\r\n\r\n    const angle = 90;\r\n    this.cumulativeRotation = (this.cumulativeRotation + angle) % 360;\r\n\r\n    const rotatePoint = (point: { x: number; y: number }, center: { x: number; y: number }, angle: number): { x: number; y: number } => {\r\n      const dx = point.x - center.x;\r\n      const dy = point.y - center.y;\r\n      const radianAngle = angle * (Math.PI / 180);\r\n\r\n      const cos = Math.cos(radianAngle);\r\n      const sin = Math.sin(radianAngle);\r\n\r\n      return {\r\n        x: center.x + dx * cos - dy * sin,\r\n        y: center.y + dx * sin + dy * cos,\r\n      };\r\n    };\r\n\r\n    const getPolygonLineCenter = (line: any[]): { x: number; y: number } => {\r\n      const [start, end] = line;\r\n      return {\r\n        x: (start.x + end.x) / 2,\r\n        y: (start.y + end.y) / 2,\r\n      };\r\n    };\r\n\r\n    const getOverallCenter = (lines: any[]): { x: number; y: number } => {\r\n      const sum = lines.reduce(\r\n        (acc, line) => {\r\n          const center = getPolygonLineCenter(line);\r\n          acc.x += center.x;\r\n          acc.y += center.y;\r\n          return acc;\r\n        },\r\n        { x: 0, y: 0 }\r\n      );\r\n\r\n      return { x: sum.x / lines.length, y: sum.y / lines.length };\r\n    };\r\n\r\n    const overallCenter = getOverallCenter(this.layoutPolygon);\r\n\r\n    this.layoutPolygon = this.layoutPolygon.map((line) => {\r\n      const [start, end, properties] = line;\r\n      return [\r\n        rotatePoint(start, overallCenter, angle),\r\n        rotatePoint(end, overallCenter, angle),\r\n        properties,\r\n      ];\r\n    });\r\n\r\n    this.redoStack = [];\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  resetOrientation(): void {\r\n    if (this.cumulativeRotation === 0) return;\r\n\r\n    const angleToReset = -this.cumulativeRotation;\r\n    const resetRotation = (point: { x: number; y: number }, center: { x: number; y: number }, angle: number): { x: number; y: number } => {\r\n      const dx = point.x - center.x;\r\n      const dy = point.y - center.y;\r\n      const radianAngle = angle * (Math.PI / 180);\r\n\r\n      const cos = Math.cos(radianAngle);\r\n      const sin = Math.sin(radianAngle);\r\n\r\n      return {\r\n        x: center.x + dx * cos - dy * sin,\r\n        y: center.y + dx * sin + dy * cos,\r\n      };\r\n    };\r\n\r\n    const getPolygonLineCenter = (line: any[]): { x: number; y: number } => {\r\n      const [start, end] = line;\r\n      return {\r\n        x: (start.x + end.x) / 2,\r\n        y: (start.y + end.y) / 2,\r\n      };\r\n    };\r\n\r\n    const getOverallCenter = (lines: any[]): { x: number; y: number } => {\r\n      const sum = lines.reduce(\r\n        (acc, line) => {\r\n          const center = getPolygonLineCenter(line);\r\n          acc.x += center.x;\r\n          acc.y += center.y;\r\n          return acc;\r\n        },\r\n        { x: 0, y: 0 }\r\n      );\r\n\r\n      return { x: sum.x / lines.length, y: sum.y / lines.length };\r\n    };\r\n\r\n    const overallCenter = getOverallCenter(this.layoutPolygon);\r\n\r\n    this.layoutPolygon = this.layoutPolygon.map((line) => {\r\n      const [start, end, properties] = line;\r\n      return [\r\n        resetRotation(start, overallCenter, angleToReset),\r\n        resetRotation(end, overallCenter, angleToReset),\r\n        properties,\r\n      ];\r\n    });\r\n\r\n    this.cumulativeRotation = 0; // Reset rotation tracker\r\n    this.redrawCanvas();\r\n  }\r\n\r\n\r\n\r\n\r\n  isLineEqual(\r\n    start1: { x: number, y: number },\r\n    end1: { x: number, y: number },\r\n    start2: { x: number, y: number },\r\n    end2: { x: number, y: number },\r\n    tolerance: number\r\n  ): boolean {\r\n    const arePointsEqual = (p1: { x: number, y: number }, p2: { x: number, y: number }) =>\r\n      Math.abs(p1.x - p2.x) <= tolerance && Math.abs(p1.y - p2.y) <= tolerance;\r\n\r\n    return (\r\n      (arePointsEqual(start1, start2) && arePointsEqual(end1, end2)) ||\r\n      (arePointsEqual(start1, end2) && arePointsEqual(end1, start2))\r\n    );\r\n  }\r\n\r\n  convertToPixels(value: number, unit: 'ft' | 'm' | 'mm'): number {\r\n    const PIXELS_PER_METER = this.pixelPerMetre;\r\n    const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;\r\n    const PIXELS_PER_MILLIMETER = PIXELS_PER_METER / 1000;\r\n\r\n\r\n    // if (typeof value !== 'number' || value < 0) {\r\n    //   throw new Error('Value must be a non-negative number');\r\n    // }\r\n\r\n    switch (unit) {\r\n      case 'm':\r\n        return value * PIXELS_PER_METER;\r\n      case 'ft':\r\n        return value * PIXELS_PER_FOOT;\r\n      case 'mm':\r\n        return value * PIXELS_PER_MILLIMETER;\r\n      default:\r\n        throw new Error(\"Invalid unit. Supported units are 'mt' for meters and 'ft' for feet.\");\r\n    }\r\n  }\r\n\r\n  onElementTypeChange(type: string, index: number) {\r\n    const [point1, point2, properties] = this.layoutPolygon[index]\r\n    properties.elementType = type\r\n    this.layoutPolygon[index] = [point1, point2, properties]\r\n    this.elementSelect = { show: false, index: 0 };\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onDistanceChange(value: 'increment' | 'decrement', index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n    if (value === 'increment') {\r\n\r\n      const newX = point2.x + Math.cos(radians) * this.convertToPixels(1, properties.unit);\r\n      const newY = point2.y - Math.sin(radians) * this.convertToPixels(1, properties.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newpoint = { x: snappedX, y: snappedY };\r\n      point2.x = newpoint.x;\r\n      point2.y = newpoint.y;\r\n      properties.distance = properties.distance + 1;\r\n    } else if (value === 'decrement') {\r\n\r\n      const newX = point2.x - Math.cos(radians) * this.convertToPixels(1, properties.unit);\r\n      const newY = point2.y + Math.sin(radians) * this.convertToPixels(1, properties.unit);\r\n\r\n      const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n      const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n      const newpoint = { x: snappedX, y: snappedY };\r\n      if (properties.distance > 1) {\r\n        point2.x = newpoint.x;\r\n        point2.y = newpoint.y;\r\n        properties.distance = properties.distance - 1;\r\n      }\r\n\r\n    }\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n    this.lineOptionsSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n  onWidgetDistanceChange(value: 'increment' | 'decrement') {\r\n    if (value === 'increment') {\r\n      this.movePixels = this.movePixels + 1;\r\n    } else if (value === 'decrement') {\r\n      if (this.movePixels > 1) {\r\n        this.movePixels = this.movePixels - 1;\r\n      }\r\n    }\r\n  }\r\n\r\n  onWidgetAngleChange(value: 'increment' | 'decrement') {\r\n    if (value === 'increment') {\r\n      if (this.moveAngle < 180) {\r\n        this.moveAngle = this.moveAngle + 5;\r\n      }\r\n    } else if (value === 'decrement') {\r\n      if (this.moveAngle > 0) {\r\n        this.moveAngle = this.moveAngle - 5;\r\n      }\r\n    }\r\n\r\n\r\n    this.updateWidgetPointer()\r\n  }\r\n\r\n  onWidgetDirectionChange(direction: 'left' | 'right' | 'up' | 'down') {\r\n    this.moveDirection = direction;\r\n    this.drawWidgetRing()\r\n    this.updateWidgetPointer()\r\n  }\r\n\r\n  onDirectionChange(value: 'up' | 'left' | 'down' | 'right', index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n\r\n    let radians: number;\r\n    switch (value) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const movementDistance = this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const newX = point1.x + Math.cos(radians) * movementDistance;\r\n    const newY = point1.y - Math.sin(radians) * movementDistance;\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    point2.x = snappedX;\r\n    point2.y = snappedY;\r\n    properties.direction = value;\r\n\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n    this.directionSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onLineDelete(index: number) {\r\n    this.saveStateToUndo()\r\n    this.layoutPolygon.splice(index, 1);\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  onAddStep(index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n    let radians = ((90 - 90) * Math.PI) / 180;;\r\n\r\n    const newX = point2.x + Math.cos(radians) * this.convertToPixels(1, this.unit);\r\n    const newY = point2.y - Math.sin(radians) * this.convertToPixels(1, this.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const newpoint = { x: snappedX, y: snappedY };\r\n\r\n    this.layoutPolygon.splice(index + 1, 0,\r\n      [point2, newpoint,\r\n        { elementType: 'wall', distance: 1, unit: this.unit, direction: 'right', angle: 90, elementNumber: this.getMaxElementNumber(this.layoutPolygon, 'wall') }]);\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n    this.lineOptionsSelect = { show: false, index: 0 }\r\n\r\n  }\r\n\r\n  onDuplicateStep(index: number) {\r\n    this.redoStack = [];\r\n    const [point1, point2, properties] = JSON.parse(JSON.stringify(this.layoutPolygon[index]));\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const newX = point2.x + Math.cos(radians) * this.convertToPixels(properties.distance, properties.unit);\r\n    const newY = point2.y - Math.sin(radians) * this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    const newpoint = { x: snappedX, y: snappedY };\r\n\r\n    properties.elementNumber = this.getMaxElementNumber(this.layoutPolygon, properties.elementType)\r\n\r\n    this.layoutPolygon.splice(index + 1, 0,\r\n      [point2, newpoint, properties]);\r\n    this.lineOptionsSelect = { show: false, index: 0 };\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n\r\n  scrollToCanvasPosition(coordinates: { x: number; y: number }): void {\r\n    const container = this.scrollContainerRef.nativeElement;\r\n\r\n    const containerRect = container.getBoundingClientRect();\r\n    const containerScrollLeft = container.scrollLeft;\r\n    const containerScrollTop = container.scrollTop;\r\n\r\n    const targetX = coordinates.x;\r\n    const targetY = coordinates.y;\r\n\r\n    const offset = {\r\n      up: 100,\r\n      down: 200,\r\n      left: 100,\r\n      right: 100,\r\n    };\r\n\r\n    const visibleLeft = containerScrollLeft + offset.left;\r\n    const visibleRight = containerScrollLeft + containerRect.width - offset.right;\r\n    const visibleTop = containerScrollTop + offset.up;\r\n    const visibleBottom = containerScrollTop + containerRect.height - offset.down;\r\n\r\n    const isXInView = targetX >= visibleLeft && targetX <= visibleRight;\r\n    const isYInView = targetY >= visibleTop && targetY <= visibleBottom;\r\n\r\n    if (!isXInView || !isYInView) {\r\n      const adjustedX = Math.max(0, targetX - offset.left);\r\n      const adjustedY = Math.max(0, targetY - offset.up);\r\n\r\n      container.scrollTo({\r\n        left: adjustedX,\r\n        top: adjustedY,\r\n        behavior: 'smooth',\r\n      });\r\n    }\r\n  }\r\n\r\n  onClearAll() {\r\n    const modelRef = this.modalDef.open(ClearAllStepsComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        this.toastService.getSuccessToast('Layout cleared successfully')\r\n        this.undoStack = []\r\n        this.redoStack = []\r\n        this.initializeLayout()\r\n        this.redrawCanvas()\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  onDeleteLayout() {\r\n    const modelRef = this.modalDef.open(DeleteLayoutComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.message === 'confirm') {\r\n        this.undoStack = []\r\n        this.redoStack = []\r\n        this.layoutPolygon = [];\r\n        this.updateFloorLayout()\r\n        this.initializeLayout()\r\n        this.redrawCanvas()\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  async exportAsPng() {\r\n    const padding = 100;\r\n    const canvas = document.createElement('canvas');\r\n    const ctx = canvas.getContext('2d')!;\r\n    canvas.width = 10000;\r\n    canvas.height = 10000;\r\n\r\n    const centerX = canvas.width / 2 / this.scale;\r\n    const centerY = canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    const renderCanvas = async (layoutPolygon: any[]): Promise<string> => {\r\n      const exportLayout: any[] = [];\r\n\r\n      layoutPolygon.forEach((instruction: any) => {\r\n        const radians: number = {\r\n          up: ((180 - instruction.angle) * Math.PI) / 180,\r\n          left: ((270 - instruction.angle) * Math.PI) / 180,\r\n          down: ((360 - instruction.angle) * Math.PI) / 180,\r\n          right: ((90 - instruction.angle) * Math.PI) / 180,\r\n        }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n        if (radians === undefined) {\r\n          throw new Error(`Invalid direction: ${instruction.direction}`);\r\n        }\r\n\r\n        const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n        const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n        const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n        const newPoint = {\r\n          x: this.snapToGrid(newX, this.gridWidth),\r\n          y: this.snapToGrid(newY, this.gridHeight),\r\n        };\r\n\r\n        const lineSegment = [\r\n          currentPoint,\r\n          newPoint,\r\n          {\r\n            elementType: instruction.elementType,\r\n            distance: instruction.distance,\r\n            unit: instruction.unit,\r\n            direction: instruction.direction,\r\n            angle: instruction.angle,\r\n            elementNumber: instruction.elementNumber,\r\n          },\r\n        ];\r\n\r\n        exportLayout.push(lineSegment);\r\n        currentPoint = newPoint;\r\n      });\r\n\r\n      let minX = Infinity,\r\n        minY = Infinity,\r\n        maxX = -Infinity,\r\n        maxY = -Infinity;\r\n\r\n      exportLayout.forEach(([point1, point2]) => {\r\n        [point1, point2].forEach((point) => {\r\n          if (point.x !== undefined) {\r\n            minX = Math.min(minX, point.x);\r\n            maxX = Math.max(maxX, point.x);\r\n          }\r\n          if (point.y !== undefined) {\r\n            minY = Math.min(minY, point.y);\r\n            maxY = Math.max(maxY, point.y);\r\n          }\r\n        });\r\n      });\r\n\r\n      minX -= padding;\r\n      minY -= padding;\r\n      maxX += padding;\r\n      maxY += padding;\r\n\r\n      canvas.width = maxX - minX;\r\n      canvas.height = maxY - minY;\r\n\r\n      ctx.fillStyle = 'white';\r\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n      ctx.save();\r\n      ctx.translate(-minX, -minY);\r\n      ctx.scale(this.scale, this.scale);\r\n\r\n      function drawArrowhead(ctx: CanvasRenderingContext2D, x: number, y: number, angle: number) {\r\n        const size = 5;\r\n        ctx.save();\r\n        ctx.translate(x, y);\r\n        ctx.rotate(angle);\r\n        ctx.beginPath();\r\n        ctx.moveTo(0, 0);\r\n        ctx.lineTo(-size, -size / 2);\r\n        ctx.lineTo(-size, size / 2);\r\n        ctx.closePath();\r\n        ctx.fillStyle = 'black';\r\n        ctx.fill();\r\n        ctx.restore();\r\n      }\r\n\r\n      ctx.beginPath();\r\n      exportLayout.forEach((edge, edgeIndex) => {\r\n        const point = edge[0];\r\n        const nextPoint = edge[1];\r\n        const properties = edge[2];\r\n\r\n        if (edgeIndex === 0) ctx.moveTo(point.x, point.y);\r\n        ctx.lineTo(nextPoint.x, nextPoint.y);\r\n\r\n        const dx = nextPoint.x - point.x;\r\n        const dy = nextPoint.y - point.y;\r\n        const length = Math.sqrt(dx * dx + dy * dy);\r\n        const offsetX = (dy / length) * 20;\r\n        const offsetY = (-dx / length) * 20;\r\n\r\n        const boxPoints = [\r\n          { x: point.x, y: point.y },\r\n          { x: nextPoint.x, y: nextPoint.y },\r\n          { x: nextPoint.x + offsetX, y: nextPoint.y + offsetY },\r\n          { x: point.x + offsetX, y: point.y + offsetY },\r\n        ];\r\n\r\n        ctx.beginPath();\r\n        ctx.moveTo(boxPoints[0].x, boxPoints[0].y);\r\n        boxPoints.forEach((pt, index) => {\r\n          if (properties.elementType === 'entrance') {\r\n            if (index < 2) {\r\n              ctx.lineTo(pt.x, pt.y)\r\n            }\r\n          } else {\r\n            ctx.lineTo(pt.x, pt.y);\r\n          }\r\n        });\r\n        if (properties.elementType === 'opening') {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n\r\n          ctx.strokeStyle = '#F9FAFB';\r\n\r\n          ctx.stroke();\r\n        } else {\r\n          ctx.closePath();\r\n          ctx.fillStyle = '#F9FAFB';\r\n          ctx.fill();\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n\r\n\r\n        const textX = (boxPoints[1].x + boxPoints[3].x) / 2;\r\n        const textY = (boxPoints[1].y + boxPoints[3].y) / 2;\r\n\r\n        ctx.save();\r\n        ctx.translate(textX, textY);\r\n\r\n        if (dx === 0) {\r\n          ctx.rotate(-Math.PI / 2);\r\n        } else if (dy !== 0) {\r\n          const angle = Math.atan2(dy, dx);\r\n          ctx.rotate(angle);\r\n        }\r\n\r\n        ctx.font = '12px Arial';\r\n        ctx.fillStyle = 'black';\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillText(\r\n          `${properties.elementType} ${properties.elementNumber} - ${properties.distance} ${properties.unit}`,\r\n          0,\r\n          0\r\n        );\r\n        ctx.restore();\r\n        if (properties.distance >= 4) {\r\n          const centerX = textX;\r\n          const centerY = textY;\r\n          const rightX = (boxPoints[1].x + boxPoints[2].x) / 2;\r\n          const rightY = (boxPoints[1].y + boxPoints[2].y) / 2;\r\n          const leftX = (boxPoints[0].x + boxPoints[3].x) / 2;\r\n          const leftY = (boxPoints[0].y + boxPoints[3].y) / 2;\r\n\r\n          function adjustPoint(x1: any, y1: any, x2: any, y2: any, distance: any) {\r\n            const angle = Math.atan2(y2 - y1, x2 - x1);\r\n            return {\r\n              x: x1 + Math.cos(angle) * distance,\r\n              y: y1 + Math.sin(angle) * distance,\r\n            };\r\n          }\r\n\r\n          const rightStart = adjustPoint(centerX, centerY, rightX, rightY, 50);\r\n          const rightEnd = adjustPoint(rightX, rightY, centerX, centerY, 10);\r\n          const leftStart = adjustPoint(centerX, centerY, leftX, leftY, 50);\r\n          const leftEnd = adjustPoint(leftX, leftY, centerX, centerY, 10);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(rightStart.x, rightStart.y);\r\n          ctx.lineTo(rightEnd.x, rightEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let rightAngle = Math.atan2(rightEnd.y - rightStart.y, rightEnd.x - rightStart.x);\r\n          drawArrowhead(ctx, rightEnd.x, rightEnd.y, rightAngle);\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(leftStart.x, leftStart.y);\r\n          ctx.lineTo(leftEnd.x, leftEnd.y);\r\n          ctx.strokeStyle = 'black';\r\n          ctx.stroke();\r\n          let leftAngle = Math.atan2(leftEnd.y - leftStart.y, leftEnd.x - leftStart.x);\r\n          drawArrowhead(ctx, leftEnd.x, leftEnd.y, leftAngle);\r\n\r\n        }\r\n\r\n        if (properties.elementType === 'entrance') {\r\n          const angle = Math.atan2(nextPoint.y - point.y, nextPoint.x - point.x);\r\n\r\n          const entranceAngle = angle + (15 * Math.PI) / 180;\r\n\r\n          const lineLength = this.convertToPixels(properties.distance, properties.unit) * 0.75;\r\n          const endPoint = {\r\n            x: point.x + Math.cos(entranceAngle) * lineLength,\r\n            y: point.y + Math.sin(entranceAngle) * lineLength,\r\n          };\r\n\r\n          ctx.beginPath();\r\n          ctx.moveTo(point.x, point.y);\r\n          ctx.lineTo(endPoint.x, endPoint.y);\r\n          ctx.strokeStyle = '#1D2939';\r\n          ctx.stroke();\r\n        }\r\n      });\r\n\r\n      ctx.restore();\r\n\r\n      return new Promise((resolve) => {\r\n        canvas.toBlob((blob: any) => {\r\n          const link = document.createElement('a');\r\n          link.download = `${this.selectedStore.storeName}_${this.selectedFloor.floorName}_layout.png`;\r\n          link.href = URL.createObjectURL(blob);\r\n          link.click();\r\n          canvas.remove();\r\n          resolve('');\r\n        });\r\n      });\r\n    };\r\n\r\n    const layoutInstructions = this.layoutPolygon.map((segment) => {\r\n      const [, , properties] = segment;\r\n      return properties;\r\n    });\r\n\r\n    await renderCanvas(layoutInstructions);\r\n  }\r\n\r\n\r\n  generateLayoutPolygon(layoutInstructions: any) {\r\n    this.pixelPerMetre = this.normalizedPixelPerMetre(layoutInstructions)\r\n\r\n    this.layoutPolygon = [];\r\n\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    if (!layoutInstructions.length) {\r\n      this.initializeLayout()\r\n      this.redrawCanvas()\r\n      return\r\n    }\r\n\r\n    let currentPoint = {\r\n      \"x\": this.snapToGrid(centerX, this.gridHeight),\r\n      \"y\": this.snapToGrid(centerY, this.gridWidth)\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      this.layoutPolygon.push(lineSegment);\r\n\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n\r\n    const lastPoint = this.layoutPolygon[this.layoutPolygon.length - 1][1]\r\n\r\n    if (this.isFloorCompleted(layoutInstructions)) {\r\n      this.findPolygonCenterAndScroll()\r\n      this.closeWidget()\r\n    } else {\r\n      this.openWidget(lastPoint)\r\n    }\r\n\r\n    this.redrawCanvas()\r\n\r\n  }\r\n\r\n  storeFixtures: any[] = []\r\n\r\n  generateLayoutPolygon2(layoutInstructions: any) {\r\n    this.pixelPerMetre = this.normalizedPixelPerMetre(layoutInstructions);\r\n\r\n    this.layoutPolygon = [];\r\n    this.storeFixtures = []; // Initialize storeFixtures.\r\n\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    if (!layoutInstructions.length) {\r\n      this.initializeLayout();\r\n      this.redrawCanvas();\r\n      return;\r\n    }\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        up: ((180 - instruction.angle) * Math.PI) / 180,\r\n        left: ((270 - instruction.angle) * Math.PI) / 180,\r\n        down: ((360 - instruction.angle) * Math.PI) / 180,\r\n        right: ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      this.layoutPolygon.push(lineSegment);\r\n\r\n      // If the wall contains fixtures, calculate their positions.\r\n      if (instruction.fixtures?.length) {\r\n        const totalFixtures = instruction.fixtures.length;\r\n        const elementLengthPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n\r\n        instruction.fixtures.forEach((fixture: any, index: number) => {\r\n          // Calculate relativePosition.x and relativePosition.y if they're zero.\r\n          if (fixture.relativePosition.x === 0 && fixture.relativePosition.y === 0) {\r\n            const fixtureWidthPixels = this.convertToPixels(fixture.fixtureWidth.value, fixture.fixtureWidth.unit);\r\n\r\n            // Calculate spacing between fixtures and position along the element's length.\r\n            const spacing = (elementLengthPixels - totalFixtures * fixtureWidthPixels) / (totalFixtures + 1);\r\n\r\n            // Position fixtures evenly along the element's length.\r\n            const relativeX = spacing * (index + 1) + fixtureWidthPixels * index;\r\n            const relativeY = 0; // Fixtures are aligned along the length of the element.\r\n\r\n            // Apply rotation based on the associated element's angle.\r\n            const angleRadians = (instruction.angle * Math.PI) / 180;\r\n            const rotatedX = relativeX * Math.cos(angleRadians) - relativeY * Math.sin(angleRadians);\r\n            const rotatedY = relativeX * Math.sin(angleRadians) + relativeY * Math.cos(angleRadians);\r\n\r\n            // Assign the calculated relative position and set unit to 'px'.\r\n            fixture.relativePosition.x = rotatedX;\r\n            fixture.relativePosition.y = rotatedY;\r\n            fixture.relativePosition.unit = 'px'; // Assume pixels for new calculation.\r\n          }\r\n\r\n          // Calculate the absolute position of the fixture in global coordinates.\r\n          const fixtureX = currentPoint.x + fixture.relativePosition.x;\r\n          const fixtureY = currentPoint.y + fixture.relativePosition.y;\r\n\r\n\r\n          // Store the fixture with adjusted coordinates and angle.\r\n          this.storeFixtures.push({\r\n            x: this.snapToGrid(fixtureX, this.gridWidth),\r\n            y: this.snapToGrid(fixtureY, this.gridHeight),\r\n            width: this.convertToPixels(fixture.fixtureWidth.value, fixture.fixtureWidth.unit),\r\n            height: this.convertToPixels(fixture.fixtureLength.value, fixture.fixtureLength.unit),\r\n            angle: instruction.angle, // Store the angle for drawing.\r\n            parentProperties: instruction,\r\n          });\r\n        });\r\n      }\r\n\r\n\r\n\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n    const lastPoint = this.layoutPolygon[this.layoutPolygon.length - 1][1];\r\n\r\n    if (this.isFloorCompleted(layoutInstructions)) {\r\n      this.findPolygonCenterAndScroll();\r\n      this.closeWidget();\r\n    } else {\r\n      this.openWidget(lastPoint);\r\n    }\r\n\r\n    this.redrawCanvas();\r\n  }\r\n\r\n  generateFixture(layoutInstructions: any) {\r\n    this.storeFixtures = []; // Initialize the storage for fixture coordinates.\r\n\r\n    layoutInstructions.forEach((instruction: any, elementIndex: any) => {\r\n      if (!instruction.fixtures || instruction.fixtures.length === 0) return; // Skip if no fixtures exist.\r\n\r\n      const radians = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      // Base point is the starting point of the layout element.\r\n      let basePoint = this.layoutPolygon[elementIndex][0];\r\n\r\n      let accumulatedOffset = 0; // Keeps track of the offset along the element for fixtures.\r\n\r\n      // Calculate the inward normal vector for the wall (perpendicular direction inward).\r\n      const nextPoint = this.layoutPolygon[elementIndex][1];\r\n      const wallVector = { x: nextPoint.x - basePoint.x, y: nextPoint.y - basePoint.y };\r\n      const wallLength = Math.sqrt(wallVector.x ** 2 + wallVector.y ** 2);\r\n      const normalVector = { x: -wallVector.y / wallLength, y: wallVector.x / wallLength }; // Perpendicular inward vector\r\n\r\n      instruction.fixtures.forEach((fixture: any, fixtureIndex: any) => {\r\n        const fixtureLengthInPixels = this.convertToPixels(fixture.fixtureLength.value, fixture.fixtureLength.unit);\r\n        const fixtureWidthInPixels = this.convertToPixels(fixture.fixtureWidth.value, fixture.fixtureWidth.unit);\r\n\r\n        // Calculate the relative position offset if defined.\r\n        const relativeOffsetX = this.convertToPixels(fixture.relativePosition.x, fixture.relativePosition.unit);\r\n        const relativeOffsetY = this.convertToPixels(fixture.relativePosition.y, fixture.relativePosition.unit);\r\n\r\n        // Adjust accumulated offset to place the fixture's center point at half its length.\r\n        const offsetWithCenterAdjustment = accumulatedOffset + fixtureLengthInPixels / 2;\r\n\r\n        // Calculate the position of the fixture along the layout element.\r\n        const relativeX = offsetWithCenterAdjustment * Math.cos(radians) + relativeOffsetX * Math.cos(radians) - relativeOffsetY * Math.sin(radians);\r\n        const relativeY = -offsetWithCenterAdjustment * Math.sin(radians) + relativeOffsetX * Math.sin(radians) + relativeOffsetY * Math.cos(radians);\r\n\r\n        // Adjust the fixture's position to ensure it is consistently inward of the layout element.\r\n        const inwardOffsetX = normalVector.x * (fixtureWidthInPixels / 2);\r\n        const inwardOffsetY = normalVector.y * (fixtureWidthInPixels / 2);\r\n\r\n        const fixturePosition = {\r\n          x: basePoint.x + relativeX + inwardOffsetX,\r\n          y: basePoint.y + relativeY + inwardOffsetY,\r\n        };\r\n\r\n        // Update relativePosition to reflect the new position relative to the start of the element.\r\n        fixture.relativePosition.x = Math.round(this.convertFromPixels(offsetWithCenterAdjustment * Math.cos(radians) + inwardOffsetX, fixture.relativePosition.unit));\r\n        fixture.relativePosition.y = Math.round(this.convertFromPixels(-offsetWithCenterAdjustment * Math.sin(radians) + inwardOffsetY, fixture.relativePosition.unit));\r\n\r\n        this.storeFixtures.push({\r\n          fixtureNumber: fixtureIndex + 1,\r\n          elementNumber: instruction.elementNumber,\r\n          position: fixturePosition,\r\n          dimensions: {\r\n            length: fixtureLengthInPixels,\r\n            width: fixtureWidthInPixels,\r\n          },\r\n          rotation: radians,\r\n        });\r\n\r\n        // Update the accumulated offset for the next fixture.\r\n        accumulatedOffset += fixtureLengthInPixels;\r\n      });\r\n\r\n\r\n    });\r\n\r\n    console.log(layoutInstructions)\r\n  }\r\n\r\n\r\n  convertFromPixels(value: number, unit: 'ft' | 'm' | 'mm'): number {\r\n    const PIXELS_PER_METER = this.pixelPerMetre;\r\n    const PIXELS_PER_FOOT = PIXELS_PER_METER / 3.28084;\r\n    const PIXELS_PER_MILLIMETER = PIXELS_PER_METER / 1000;\r\n\r\n    switch (unit) {\r\n      case 'm':\r\n        return value / PIXELS_PER_METER;\r\n      case 'ft':\r\n        return value / PIXELS_PER_FOOT;\r\n      case 'mm':\r\n        return value / PIXELS_PER_MILLIMETER;\r\n      default:\r\n        throw new Error(\"Invalid unit. Supported units are 'm' for meters, 'ft' for feet, and 'mm' for millimeters.\");\r\n    }\r\n  }\r\n\r\n\r\n\r\n\r\n\r\n\r\n  drawFixtures() {\r\n    this.storeFixtures.forEach(fixture => {\r\n      const { position, dimensions, rotation } = fixture;\r\n\r\n      this.ctx.save(); // Save the canvas state.\r\n\r\n      // Translate and rotate the canvas context to align the fixture.\r\n      this.ctx.translate(position.x, position.y);\r\n      this.ctx.rotate(-rotation);\r\n\r\n      // Draw the fixture as a rectangle.\r\n      this.ctx.beginPath();\r\n      this.ctx.rect(\r\n        -dimensions.length / 2, // Center the rectangle around the origin.\r\n        -dimensions.width / 2,\r\n        dimensions.length,\r\n        dimensions.width\r\n      );\r\n      this.ctx.fillStyle = '#D1D5DB'; // Set a neutral color for fixtures.\r\n      this.ctx.fill(); // Fill the fixture rectangle.\r\n      this.ctx.strokeStyle = '#374151'; // Set the border color.\r\n      this.ctx.stroke(); // Draw the border of the rectangle.\r\n\r\n      // Label the fixture with its number.\r\n      this.ctx.font = '12px Arial';\r\n      this.ctx.fillStyle = 'black';\r\n      this.ctx.textAlign = 'center';\r\n      this.ctx.textBaseline = 'middle';\r\n      this.ctx.fillText(\r\n        `Fixture ${fixture.fixtureNumber}`,\r\n        0,\r\n        0\r\n      );\r\n\r\n      // Draw a dot at the fixture's position.\r\n      this.ctx.beginPath();\r\n      this.ctx.arc(0, 0, 3, 0, 2 * Math.PI); // Small dot at the origin.\r\n      this.ctx.fillStyle = 'red'; // Set dot color.\r\n      this.ctx.fill();\r\n\r\n      this.ctx.restore(); // Restore the canvas state.\r\n    });\r\n  }\r\n\r\n\r\n\r\n  normalizedPixelPerMetre(polygon: any): number {\r\n    const MIN_PIXELS_PER_METER = 50;\r\n    const MAX_PIXELS_PER_METER = 150;\r\n\r\n    let totalLength = 0;\r\n    let lineCount = 0;\r\n\r\n    polygon.forEach((line: any) => {\r\n      if (line.unit === 'ft') {\r\n        totalLength = totalLength + (line.distance * 3.28084);\r\n      } else {\r\n        totalLength = totalLength + line.distance;\r\n      }\r\n      lineCount++;\r\n    });\r\n\r\n    const averageLength = lineCount > 0 ? totalLength / lineCount : 0;\r\n\r\n    const MAX_AVERAGE_LENGTH = 50;\r\n    const MIN_AVERAGE_LENGTH = 5;\r\n\r\n    const normalizedLength = Math.min(\r\n      Math.max(averageLength, MIN_AVERAGE_LENGTH),\r\n      MAX_AVERAGE_LENGTH\r\n    );\r\n\r\n    const pixelsPerMeter =\r\n      MAX_PIXELS_PER_METER -\r\n      ((normalizedLength - MIN_AVERAGE_LENGTH) / (MAX_AVERAGE_LENGTH - MIN_AVERAGE_LENGTH)) *\r\n      (MAX_PIXELS_PER_METER - MIN_PIXELS_PER_METER);\r\n\r\n    return Math.round(pixelsPerMeter);\r\n  }\r\n\r\n  isFloorCompleted(layoutInstructions: any, thresholdInFeet: number = 1): boolean {\r\n    const layoutPolygon: any[] = [];\r\n    const centerX = this.canvas.width / 2 / this.scale;\r\n    const centerY = this.canvas.height / 2 / this.scale;\r\n\r\n    let currentPoint = {\r\n      x: this.snapToGrid(centerX, this.gridHeight),\r\n      y: this.snapToGrid(centerY, this.gridWidth),\r\n    };\r\n\r\n    layoutInstructions.forEach((instruction: any) => {\r\n      const radians: number = {\r\n        'up': ((180 - instruction.angle) * Math.PI) / 180,\r\n        'left': ((270 - instruction.angle) * Math.PI) / 180,\r\n        'down': ((360 - instruction.angle) * Math.PI) / 180,\r\n        'right': ((90 - instruction.angle) * Math.PI) / 180,\r\n      }[instruction.direction as 'up' | 'left' | 'down' | 'right'];\r\n\r\n      if (radians === undefined) {\r\n        throw new Error(`Invalid direction: ${instruction.direction}`);\r\n      }\r\n\r\n      const distanceInPixels = this.convertToPixels(instruction.distance, instruction.unit);\r\n      const newX = currentPoint.x + Math.cos(radians) * distanceInPixels;\r\n      const newY = currentPoint.y - Math.sin(radians) * distanceInPixels;\r\n\r\n      const newPoint = {\r\n        x: this.snapToGrid(newX, this.gridWidth),\r\n        y: this.snapToGrid(newY, this.gridHeight),\r\n      };\r\n\r\n      const lineSegment = [\r\n        currentPoint,\r\n        newPoint,\r\n        {\r\n          elementType: instruction.elementType,\r\n          distance: instruction.distance,\r\n          unit: instruction.unit,\r\n          direction: instruction.direction,\r\n          angle: instruction.angle,\r\n          elementNumber: instruction.elementNumber,\r\n        },\r\n      ];\r\n\r\n      layoutPolygon.push(lineSegment);\r\n      currentPoint = newPoint;\r\n    });\r\n\r\n    const firstPoint = layoutPolygon?.[0]?.[0];\r\n    const lastPoint = layoutPolygon?.[layoutPolygon.length - 1]?.[1];\r\n\r\n    if (layoutPolygon.length <= 1 || !firstPoint || !lastPoint) {\r\n      return false;\r\n    }\r\n\r\n    const distanceBetweenPoints = Math.sqrt(\r\n      Math.pow(lastPoint.x - firstPoint.x, 2) + Math.pow(lastPoint.y - firstPoint.y, 2)\r\n    );\r\n\r\n    const thresholdInPixels = this.convertToPixels(thresholdInFeet, 'ft');\r\n    return distanceBetweenPoints <= thresholdInPixels;\r\n  }\r\n\r\n\r\n  validateAngleInput(event: Event, index: number) {\r\n    const inputElement = event.target as HTMLInputElement;\r\n    let value = parseInt(inputElement.value, 10);\r\n\r\n    if (isNaN(value)) {\r\n      value = 0;\r\n    }\r\n\r\n    if (value < 0) {\r\n      value = 0;\r\n    } else if (value > 180) {\r\n      value = 180;\r\n    }\r\n\r\n    inputElement.value = value.toString();\r\n    this.layoutPolygon[index][2].angle = value;\r\n\r\n\r\n  }\r\n\r\n  onAngleChange(index: number) {\r\n    this.saveStateToUndo()\r\n    const [point1, point2, properties] = this.layoutPolygon[index];\r\n\r\n    let radians: number;\r\n    switch (properties.direction) {\r\n      case 'up':\r\n        radians = ((180 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'left':\r\n        radians = ((270 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'down':\r\n        radians = ((360 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      case 'right':\r\n        radians = ((90 - properties.angle) * Math.PI) / 180;\r\n        break;\r\n      default:\r\n        return;\r\n    }\r\n\r\n    const movementDistance = this.convertToPixels(properties.distance, properties.unit);\r\n\r\n    const newX = point1.x + Math.cos(radians) * movementDistance;\r\n    const newY = point1.y - Math.sin(radians) * movementDistance;\r\n\r\n    const snappedX = this.snapToGrid(newX, this.gridWidth);\r\n    const snappedY = this.snapToGrid(newY, this.gridHeight);\r\n\r\n    point2.x = snappedX;\r\n    point2.y = snappedY;\r\n    properties.angle = this.layoutPolygon[index][2].angle;\r\n\r\n    this.layoutPolygon[index] = [point1, point2, properties];\r\n\r\n    this.redoStack = [];\r\n    this.redrawCanvas()\r\n  }\r\n\r\n  openAddFloorModal() {\r\n    const modelRef = this.modalDef.open(AddFloorComponent, { centered: true });\r\n    modelRef.result.then((val: any) => {\r\n      if (val.floorNumber) {\r\n        this.addFloor(this.selectedStore.planoId, val.floorNumber)\r\n      }\r\n    }).catch((err) => {\r\n      if (err.floorNumber) {\r\n        this.addFloor(this.selectedStore.planoId, err.floorNumber)\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n\r\n  findPolygonCenterAndScroll(polygon: any = this.layoutPolygon): void {\r\n    const vertices = polygon.flatMap((line: any) => line.slice(0, 2));\r\n\r\n    const minX = Math.min(...vertices.map((v: any) => v.x));\r\n    const maxX = Math.max(...vertices.map((v: any) => v.x));\r\n    const minY = Math.min(...vertices.map((v: any) => v.y));\r\n    const maxY = Math.max(...vertices.map((v: any) => v.y));\r\n\r\n    let center = { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\r\n\r\n    const step = 1;\r\n    let bestPoint = center;\r\n    let bestDistanceSum = Number.MAX_VALUE;\r\n\r\n    for (let x = minX; x <= maxX; x += step) {\r\n      for (let y = minY; y <= maxY; y += step) {\r\n        const point = { x, y };\r\n        if (isPointInsidePolygon(point, vertices)) {\r\n          const distanceSum = vertices.reduce(\r\n            (sum: number, vertex: any) => sum + Math.sqrt((point.x - vertex.x) ** 2 + (point.y - vertex.y) ** 2),\r\n            0\r\n          );\r\n          if (distanceSum < bestDistanceSum) {\r\n            bestDistanceSum = distanceSum;\r\n            bestPoint = point;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    const scrollContainer = this.scrollContainerRef.nativeElement;\r\n    scrollContainer.scrollTo({\r\n      left: bestPoint.x - scrollContainer.offsetWidth / 2,\r\n      top: bestPoint.y - scrollContainer.offsetHeight / 2,\r\n      behavior: 'smooth'\r\n    });\r\n\r\n    this.resetZoom()\r\n    this.resetOrientation()\r\n\r\n    function isPointInsidePolygon(point: any, vertices: any): boolean {\r\n      let count = 0;\r\n      for (let i = 0; i < vertices.length; i++) {\r\n        const start = vertices[i];\r\n        const end = vertices[(i + 1) % vertices.length];\r\n        if (rayIntersectsSegment(point, { start, end })) {\r\n          count++;\r\n        }\r\n      }\r\n      return count % 2 === 1;\r\n    }\r\n\r\n    function rayIntersectsSegment(point: any, segment: any): boolean {\r\n      const { x, y } = point;\r\n      const { start, end } = segment;\r\n\r\n      if (y < Math.min(start.y, end.y) || y > Math.max(start.y, end.y)) {\r\n        return false;\r\n      }\r\n\r\n      const t = (y - start.y) / (end.y - start.y);\r\n      const intersectX = start.x + t * (end.x - start.x);\r\n\r\n      return intersectX >= x;\r\n    }\r\n  }\r\n\r\n  exportToExcel() {\r\n\r\n    const layoutPolygon = this.layoutPolygon.map((segment) => {\r\n      const [point1, point2, properties] = segment\r\n      return properties\r\n    })\r\n\r\n    const formattedData = layoutPolygon.map((item: any, index: number) => ({\r\n      'Step': index + 1,\r\n      'Elements': `${item.elementType} ${item.elementNumber}`,\r\n      'Measurements(ft)': item.distance,\r\n      'Direction': item.direction,\r\n      'Degree': item.angle\r\n    }));\r\n\r\n    const worksheet = XLSX.utils.json_to_sheet(formattedData);\r\n\r\n    const workbook = XLSX.utils.book_new();\r\n    XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');\r\n\r\n    const fileName = `${this.selectedStore.storeName}_${this.selectedFloor.floorName}_layout.xlsx`\r\n\r\n    XLSX.writeFile(workbook, fileName);\r\n  }\r\n\r\n}\r\n","<div class=\"d-flex align-items-center justify-content-between mb-6\">\r\n    <div>\r\n        <div *ngIf=\"planoStoreList.length === 1\" class=\"storename-txt\">\r\n            {{selectedStore?.storeName}} - Layout\r\n        </div>\r\n        <div *ngIf=\"planoStoreList.length > 1\">\r\n            <lib-select-plano [items]=\"planoStoreList\" [multi]=\"false\" [searchField]=\"'storeName'\" [idField]=\"'storeId'\"\r\n                (selected)=\"onStoreChange($event)\" [selectedValues]=\"[selectedStore]\"></lib-select-plano>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"d-flex align-items-center\">\r\n        <button (click)=\"onSaveAsDraft()\" class=\"btn btn-outline bg-white me-5\">Save As Draft</button>\r\n        <button (click)=\"onConfigure()\" class=\"btn btn-sm btn-primary me-5\">Configure</button>\r\n        <button (click)=\"openOffCanva()\" class=\"btn btn-sm btn-outline bg-white\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path\r\n                    d=\"M9 3V21M5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5C3 3.89543 3.89543 3 5 3Z\"\r\n                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </button>\r\n    </div>\r\n</div>\r\n\r\n<div class=\"row\">\r\n    <div [ngClass]=\"layoutMode === 'full' ? 'col-2' : 'col-5'\">\r\n        <div class=\"c-card\" style=\"height: 75dvh; position: relative;\">\r\n            <div class=\"resize-icon\" *ngIf=\"layoutMode === 'half'\" (click)=\"layoutMode = 'full'\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                    <path\r\n                        d=\"M8.27259 12.6365L4.63623 9.00013L8.27259 5.36377M13.3635 12.6365L9.72714 9.00013L13.3635 5.36377\"\r\n                        stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </div>\r\n            <div class=\"resize-icon\" *ngIf=\"layoutMode === 'full'\" (click)=\"layoutMode = 'half'\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                    <path\r\n                        d=\"M9.72741 5.36399L13.3638 9.00036L9.72741 12.6367M4.6365 5.36399L8.27286 9.00036L4.6365 12.6367\"\r\n                        stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </div>\r\n            <div class=\"d-flex align-items-center justify-content-between mb-5\" style=\"height: 8%;\">\r\n                <div>\r\n                    <div class=\"l-pane-head\">\r\n                        Layout details\r\n                    </div>\r\n                    <div *ngIf=\"layoutMode === 'half'\" class=\"l-pane-desc\">\r\n                        Below are the sequence of steps for this layout\r\n                    </div>\r\n                </div>\r\n                <div class=\"d-flex align-items-center\">\r\n                    <ng-container *ngIf=\"layoutMode === 'half'\">\r\n                        <svg (click)=\"undo()\" class=\"me-3 cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                            height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <path [attr.fill]=\"undoStack.length ? '#1D2939' : '#D0D5DD'\"\r\n                                d=\"M7 19V17H14.1C15.15 17 16.0627 16.6667 16.838 16C17.6133 15.3333 18.0007 14.5 18 13.5C18 12.5 17.6123 11.6667 16.837 11C16.0617 10.3333 15.1493 10 14.1 10H7.8L10.4 12.6L9 14L4 9L9 4L10.4 5.4L7.8 8H14.1C15.7167 8 17.1043 8.525 18.263 9.575C19.4217 10.625 20.0007 11.9333 20 13.5C20 15.0667 19.4207 16.375 18.262 17.425C17.1033 18.475 15.716 19 14.1 19H7Z\"\r\n                                fill=\"#D0D5DD\" />\r\n                        </svg>\r\n                        <svg (click)=\"redo()\" class=\"me-6 cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                            height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <path [attr.fill]=\"redoStack.length ? '#1D2939' : '#D0D5DD'\"\r\n                                d=\"M9.9 19C8.28333 19 6.89567 18.475 5.737 17.425C4.57833 16.375 3.99933 15.0667 4 13.5C4 11.9333 4.57933 10.625 5.738 9.575C6.89667 8.525 8.284 8 9.9 8H16.2L13.6 5.4L15 4L20 9L15 14L13.6 12.6L16.2 10H9.9C8.85 10 7.93733 10.3333 7.162 11C6.38667 11.6667 5.99933 12.5 6 13.5C6 14.5 6.38767 15.3333 7.163 16C7.93833 16.6667 8.85067 17 9.9 17H17V19H9.9Z\"\r\n                                fill=\"#D0D5DD\" />\r\n                        </svg>\r\n                        <div (click)=\"toggleLayoutOptionSelect()\"\r\n                            class=\"d-flex  align-items-center justify-content-center h-100 elipsis-icon-dropdown top-elipsis-menu\">\r\n                            <div class=\"elipsis-btn\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M11 11.9997C11 12.5289 11.4477 12.958 12 12.958C12.5523 12.958 13 12.5289 13 11.9997C13 11.4704 12.5523 11.0413 12 11.0413C11.4477 11.0413 11 11.4704 11 11.9997Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                    <path\r\n                                        d=\"M11 18.708C11 19.2373 11.4477 19.6663 12 19.6663C12.5523 19.6663 13 19.2373 13 18.708C13 18.1787 12.5523 17.7497 12 17.7497C11.4477 17.7497 11 18.1787 11 18.708Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                    <path\r\n                                        d=\"M11 5.29134C11 5.82061 11.4477 6.24967 12 6.24967C12.5523 6.24967 13 5.82061 13 5.29134C13 4.76207 12.5523 4.33301 12 4.33301C11.4477 4.33301 11 4.76207 11 5.29134Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </div>\r\n                            <ul *ngIf=\"layoutOptionSelect?.show\" [ngClass]=\" (layoutOptionSelect.show ) ? 'z-1': ''\"\r\n                                class=\"list-unstyled mb-2\">\r\n                                <li>\r\n                                    <div class=\"d-flex justify-content-between w-100\">\r\n                                        <div class=\"menu-txt1\">Export</div>\r\n                                        <span>\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"14\" viewBox=\"0 0 8 14\" fill=\"none\">\r\n                                                <path d=\"M1 13L7 7L1 1\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                              </svg>\r\n                                        </span>\r\n                                    </div>\r\n                                    <div class=\"export-options\">\r\n                                        <ul>\r\n                                            <li (click)=\"exportToExcel()\" >XLSX</li>\r\n                                            <li (click)=\"exportAsPng()\" >PNG</li>\r\n                                        </ul>\r\n                                    </div>\r\n\r\n                                </li>\r\n                                <li (click)=\"onClearAll()\">\r\n                                    <div class=\"d-flex\">\r\n                                        <div class=\"menu-txt1\">Clear all</div>\r\n                                    </div>\r\n\r\n                                </li>\r\n                                <li (click)=\"onDeleteLayout()\">\r\n                                    <div class=\"d-flex\">\r\n                                        <div class=\"menu-txt1 text-danger\">Delete</div>\r\n                                    </div>\r\n                                </li>\r\n\r\n                            </ul>\r\n                        </div>\r\n\r\n                    </ng-container>\r\n\r\n\r\n\r\n                </div>\r\n\r\n            </div>\r\n\r\n            <!-- <div class=\"d-flex align-items-center flex-column mx-auto\" style=\"margin-top: 200px;\" >\r\n                <div class=\"no-steps-txt mb-3\">\r\n                    No steps have been created so far\r\n                </div>\r\n                <div class=\"no-text-desc text-center\">\r\n                    Start designing the layout by applying the steps using elements and dimensions.\r\n                </div>\r\n            </div> -->\r\n\r\n            <div class=\"table-responsive hide-scrollbar \" style=\"height: 92%;\">\r\n                <table class=\"table\">\r\n                    <thead class=\"thead-light\">\r\n                        <tr>\r\n                            <th>Steps</th>\r\n                            <th>Elements and Definition</th>\r\n                            <th>Feet</th>\r\n                            <th>Direction</th>\r\n                            <th>Degree</th>\r\n                            <th></th>\r\n                        </tr>\r\n                    </thead>\r\n                    <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\">\r\n                        <ng-container *ngFor=\"let item of layoutPolygon; let i = index\">\r\n                            <tr [ngClass]=\"selectedLineIndex === i ? 'selected-element' : ''\" *ngIf=\"item?.[2]\" cdkDrag>\r\n                                <td>\r\n                                    <div class=\"d-flex align-items-center justify-content-center w-100 h-100 drag-handler\">\r\n                                        <span class=\"mr-2  \" >\r\n                                            <svg class=\"cursor-pointer\"  xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\" viewBox=\"0 0 19 19\">\r\n                                                <circle cx=\"5\" cy=\"5\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"5\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"5\" cy=\"10\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"10\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"5\" cy=\"15\" r=\"2\" fill=\"gray\" />\r\n                                                <circle cx=\"14\" cy=\"15\" r=\"2\" fill=\"gray\" />\r\n                                              </svg>\r\n                                        </span>\r\n                                        <span>{{ i + 1}}</span>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"d-flex\">\r\n                                        <div (click)=\"toggleElementSelect(i)\"\r\n                                            class=\"element-type-dropdown me-2 position-relative\">\r\n                                            <div>\r\n                                                <svg *ngIf=\"item[2].elementType === 'wall'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                        fill=\"#344054\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'facade'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\"\r\n                                                    viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                                    <path\r\n                                                        d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                        stroke=\"#344054\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'opening'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path\r\n                                                        d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                        stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n\r\n                                                <svg *ngIf=\"item[2].elementType === 'entrance'\"\r\n                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\"\r\n                                                    viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                        fill=\"#1D2939\" />\r\n                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                        d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                        fill=\"#1D2939\" />\r\n                                                </svg>\r\n                                            </div>\r\n\r\n                                            <div class=\"down-arrow\">\r\n                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                    <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\"\r\n                                                        stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                        stroke-linejoin=\"round\" />\r\n                                                </svg>\r\n                                            </div>\r\n\r\n                                            <ul *ngIf=\"elementSelect?.show && elementSelect?.index === i\"\r\n                                                [ngClass]=\" (elementSelect.show && elementSelect.index === i) ? 'z-1': ''\"\r\n                                                class=\"list-unstyled mb-2\">\r\n                                                <li (click)=\"onElementTypeChange('wall', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'wall' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                                                height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                                    fill=\"#344054\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Wall</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'wall'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('facade', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'facade' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\"\r\n                                                                height=\"22\" viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                                                <path\r\n                                                                    d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                                    stroke=\"#344054\" stroke-linecap=\"round\"\r\n                                                                    stroke-linejoin=\"round\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Glass/Facade</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'facade'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('opening', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'opening' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                                                height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                                <path\r\n                                                                    d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                                    stroke=\"#101828\" stroke-width=\"1.5\"\r\n                                                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Opening</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'opening'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                                <li (click)=\"onElementTypeChange('entrance', i)\"\r\n                                                    [ngClass]=\"item[2].elementType === 'entrance' ? 'selected' : ''\">\r\n                                                    <div class=\"d-flex\">\r\n                                                        <div class=\"me-3\">\r\n                                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\"\r\n                                                                height=\"18\" viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                                    fill=\"#1D2939\" />\r\n                                                                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                    d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                                    fill=\"#1D2939\" />\r\n                                                            </svg>\r\n                                                        </div>\r\n                                                        <div>Entrance</div>\r\n                                                    </div>\r\n                                                    <div>\r\n                                                        <svg *ngIf=\"item[2].elementType === 'entrance'\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                            <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\"\r\n                                                                stroke=\"#00A3FF\" stroke-width=\"1.66667\"\r\n                                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                </li>\r\n                                            </ul>\r\n\r\n                                        </div>\r\n                                        <div class=\"element-name\">{{item[2].elementType}} {{item[2].elementNumber}}\r\n                                        </div>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div class=\"unit-input\">\r\n                                        <svg (click)=\"onDistanceChange('decrement', i)\" class=\"cursor-pointer\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n                                            viewBox=\"0 0 14 14\" fill=\"none\">\r\n                                            <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                        <span>{{item[2].distance}}</span>\r\n                                        <svg (click)=\"onDistanceChange('increment', i)\" class=\"cursor-pointer\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\"\r\n                                            viewBox=\"0 0 14 14\" fill=\"none\">\r\n                                            <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\"\r\n                                                stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                </td>\r\n                                <td>\r\n                                    <div (click)=\"toggleDirectionSelect(i)\"\r\n                                        class=\"direction-dropdown position-relative\">\r\n                                        <div>\r\n                                            {{item[2].direction}}\r\n                                        </div>\r\n\r\n                                        <div class=\"down-arrow\">\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n                                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                            </svg>\r\n                                        </div>\r\n\r\n                                        <ul *ngIf=\"directionSelect?.show && directionSelect?.index === i\"\r\n                                            [ngClass]=\" (directionSelect.show && directionSelect.index === i) ? 'z-1': ''\"\r\n                                            class=\"list-unstyled mb-2\">\r\n                                            <li (click)=\"onDirectionChange('up', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'up' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Up</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'up'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('down', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'down' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Down</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'down'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('right', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'right' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Right</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'right'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                            <li (click)=\"onDirectionChange('left', i)\"\r\n                                                [ngClass]=\"item[2].direction === 'left' ? 'selected' : ''\">\r\n                                                <div class=\"d-flex\">\r\n\r\n                                                    <div>Left</div>\r\n                                                </div>\r\n                                                <div>\r\n                                                    <svg *ngIf=\"item[2].direction === 'left'\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                                            stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                                            stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                </div>\r\n                                            </li>\r\n                                        </ul>\r\n\r\n                                    </div>\r\n                                </td>\r\n\r\n                                <td>\r\n                                    <input min=\"0\" max=\"180\" class=\"angle-input\" [(ngModel)]=\"item[2].angle\"\r\n                                        type=\"number\" (input)=\"validateAngleInput($event, i)\" (blur)=\"onAngleChange(i)\">\r\n                                    <!-- <span class=\"angle-input\">\r\n                                        {{item[2].angle}}°\r\n                                    </span> -->\r\n                                </td>\r\n                                <td>\r\n                                    <div (click)=\"toggleLineOptionsSelect(i)\"\r\n                                        class=\"d-flex  align-items-center justify-content-center h-100 elipsis-icon-dropdown\">\r\n                                        <svg class=\"cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"4\"\r\n                                            height=\"19\" viewBox=\"0 0 4 19\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M1 9.50016C1 10.0294 1.44771 10.4585 2 10.4585C2.55228 10.4585 3 10.0294 3 9.50016C3 8.97089 2.55228 8.54183 2 8.54183C1.44771 8.54183 1 8.97089 1 9.50016Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M0.999999 16.2085C0.999999 16.7378 1.44771 17.1668 2 17.1668C2.55228 17.1668 3 16.7378 3 16.2085C3 15.6792 2.55228 15.2502 2 15.2502C1.44771 15.2502 0.999999 15.6792 0.999999 16.2085Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M1 2.79183C1 3.3211 1.44772 3.75016 2 3.75016C2.55228 3.75016 3 3.3211 3 2.79183C3 2.26256 2.55228 1.8335 2 1.8335C1.44772 1.8335 1 2.26256 1 2.79183Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                        <ul *ngIf=\"lineOptionsSelect?.show && lineOptionsSelect?.index === i\"\r\n                                            [ngClass]=\" (lineOptionsSelect.show && lineOptionsSelect.index === i) ? 'z-1': ''\"\r\n                                            class=\"list-unstyled mb-2\">\r\n                                            <li (click)=\"onAddStep(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Add new step</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n                                            <li (click)=\"onDuplicateStep(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div>Duplicate</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n                                            <li (click)=\"onLineDelete(i)\">\r\n                                                <div class=\"d-flex\">\r\n                                                    <div class=\"text-danger\">Delete</div>\r\n                                                </div>\r\n\r\n                                            </li>\r\n\r\n                                        </ul>\r\n                                    </div>\r\n\r\n                                </td>\r\n                            </tr>\r\n                        </ng-container>\r\n\r\n                    </tbody>\r\n                </table>\r\n            </div>\r\n\r\n\r\n        </div>\r\n    </div>\r\n    <div [ngClass]=\"layoutMode === 'full' ? 'col-10' : 'col-7'\">\r\n        <div class=\"c-card \" style=\"height: 75dvh;\">\r\n            <div style=\"height: 7%;\" class=\"d-flex align-items-center justify-content-between\">\r\n                <div>\r\n                    <!-- <lib-reactive-select *ngIf=\"floorsInput.value\" [formControl]=\"floorsInput\" [idField]=\"'id'\"\r\n                        [nameField]=\"'floorName'\" [data]=\"selectedStore?.floor\"></lib-reactive-select> -->\r\n                    <div (click)=\"toggleFloorSelect()\" class=\"floor-select\">\r\n                        <div>{{selectedFloor?.floorName}}</div>\r\n                        <div><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg></div>\r\n                        <ul *ngIf=\"floorSelect?.show\" class=\"list-unstyled mb-2\">\r\n                            <li (click)=\"onFloorSelect(floor.id)\"\r\n                                *ngFor=\"let floor of selectedStore?.floor; let i = index\"\r\n                                [ngClass]=\"floor.id === selectedFloor.id ? 'selected': ''\">\r\n                                <div class=\"d-flex justify-content-between\">\r\n                                    <span>{{floor?.floorName}}</span>\r\n                                    <span *ngIf=\"selectedStore?.floor.length > 1\"\r\n                                        (click)=\"$event.stopPropagation(); floorSelect.deleteIndex = i\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"23\"\r\n                                            viewBox=\"0 0 24 23\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M11 11.4999C11 12.0292 11.4477 12.4583 12 12.4583C12.5523 12.4583 13 12.0292 13 11.4999C13 10.9706 12.5523 10.5416 12 10.5416C11.4477 10.5416 11 10.9706 11 11.4999Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M11 18.2083C11 18.7375 11.4477 19.1666 12 19.1666C12.5523 19.1666 13 18.7375 13 18.2083C13 17.679 12.5523 17.2499 12 17.2499C11.4477 17.2499 11 17.679 11 18.2083Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                            <path\r\n                                                d=\"M11 4.79159C11 5.32086 11.4477 5.74992 12 5.74992C12.5523 5.74992 13 5.32086 13 4.79159C13 4.26231 12.5523 3.83325 12 3.83325C11.4477 3.83325 11 4.26231 11 4.79159Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </span>\r\n                                </div>\r\n\r\n                                <div *ngIf=\"floorSelect.deleteIndex === i\"\r\n                                    (click)=\"$event.stopPropagation(); deleteFloor(i)\" class=\"option\">Delete</div>\r\n                            </li>\r\n                            <li (click)=\"openAddFloorModal()\">\r\n                                <span>\r\n                                    <span class=\"mr-2\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n                                            viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                            <path d=\"M8.00016 3.33325V12.6666M3.3335 7.99992H12.6668\" stroke=\"#101828\"\r\n                                                stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </span>\r\n                                    <span>Add floor</span>\r\n                                </span>\r\n\r\n                            </li>\r\n                        </ul>\r\n                    </div>\r\n                </div>\r\n                <div class=\"d-flex align-items-center\" >\r\n                <button ngbTooltip=\"Re-Orient\" (click)=\"findPolygonCenterAndScroll()\" class=\"btn btn-sm btn-outline bg-white me-3\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" fill=\"none\" viewBox=\"0 0 128 128\" id=\"recenter\">\r\n                        <path stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"7\" d=\"M38 74L49 63.5 38 53M53.5 37.5L64 48.5 74.5 37.5M90 53L79 63.5 90 74M74.5 89.5L64 78.5 53.5 89.5\"></path>\r\n                        <path stroke=\"#000\" stroke-linecap=\"round\" stroke-width=\"7\" d=\"M44 64L16 64M63.5 43.5L63.5 15.5M84 63L112 63M64.5 83.5L64.5 111.5\"></path>\r\n                        <circle cx=\"64\" cy=\"64\" r=\"5\" fill=\"#000\"></circle>\r\n                      </svg>\r\n                </button>\r\n                <button ngbTooltip=\"Rotate\" class=\"btn btn-sm btn-outline bg-white\" (click)=\"rotatePolygons()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n                        <path\r\n                            d=\"M6.36265 7.17838L7.17625 6.36238L5.90425 5.09158L5.08945 5.90518L6.36265 7.17838ZM15.671 6.36358L19.6379 10.3304L20.9099 9.0572L16.9442 5.09038L15.671 6.36358ZM19.6379 18.8252L18.8243 19.6388L20.0963 20.9096L20.9099 20.0972L19.6379 18.8252ZM10.3295 19.6388L6.36265 15.672L5.09065 16.9452L9.05626 20.9108L10.3295 19.6388ZM18.8243 19.6388C17.6543 20.8076 16.8407 21.6188 16.1459 22.1492C15.4715 22.664 15.0155 22.8284 14.5763 22.8284V24.6284C15.5675 24.6284 16.4027 24.2168 17.2367 23.5808C18.0503 22.9604 18.9635 22.0448 20.0963 20.912L18.8243 19.6388ZM9.05626 20.9108C10.1891 22.0448 11.1023 22.9592 11.9159 23.5808C12.7499 24.2168 13.5851 24.6284 14.5763 24.6284V22.8284C14.1371 22.8284 13.6823 22.664 13.0067 22.1492C12.3119 21.6188 11.4983 20.8076 10.3295 19.6388L9.05626 20.9108ZM19.6379 10.3304C20.8067 11.4992 21.6179 12.3128 22.1483 13.0076C22.6631 13.6832 22.8275 14.138 22.8275 14.5772H24.6275C24.6275 13.586 24.2159 12.7508 23.5799 11.9168C22.9595 11.1032 22.0427 10.19 20.9099 9.0572L19.6379 10.3304ZM20.9099 20.0972C22.0439 18.9632 22.9583 18.0512 23.5799 17.2376C24.2159 16.4036 24.6275 15.5684 24.6275 14.5772H22.8275C22.8275 15.0164 22.6631 15.4724 22.1483 16.1468C21.6179 16.8416 20.8067 17.6552 19.6379 18.8252L20.9099 20.0972ZM7.17625 6.36238C8.34625 5.19358 9.15985 4.38118 9.85465 3.85078C10.529 3.33598 10.985 3.17278 11.4242 3.17278V1.37158C10.433 1.37158 9.59785 1.78318 8.76385 2.41918C7.94905 3.04078 7.03705 3.95518 5.90425 5.08798L7.17625 6.36238ZM16.9442 5.09038C15.8114 3.95638 14.8982 3.04078 14.0846 2.41918C13.2506 1.78318 12.4154 1.37158 11.4242 1.37158V3.17278C11.8634 3.17278 12.3182 3.33598 12.9938 3.85078C13.6886 4.38118 14.5022 5.19238 15.671 6.36118L16.9442 5.09038ZM5.08945 5.90278C3.95665 7.03558 3.04225 7.94758 2.42065 8.76238C1.78465 9.59638 1.37305 10.4316 1.37305 11.4228H3.17305C3.17305 10.9836 3.33745 10.5276 3.85225 9.85318C4.38265 9.15838 5.19385 8.34478 6.36265 7.17478L5.08945 5.90278ZM6.36265 15.6708C5.19385 14.5008 4.38265 13.6872 3.85225 12.9924C3.33745 12.318 3.17305 11.862 3.17305 11.4228H1.37305C1.37305 12.414 1.78465 13.2492 2.42065 14.0832C3.04225 14.8968 3.95665 15.81 5.08945 16.9428L6.36265 15.6708Z\"\r\n                            fill=\"#1D2939\" />\r\n                        <path\r\n                            d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                            stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </button>    \r\n                </div>\r\n                \r\n            </div>\r\n            <div class=\"hide-scrollbar\" style=\"height: 93%; overflow: scroll; position: relative;\" #scrollContainer>\r\n                <canvas #gridCanvas>\r\n\r\n                </canvas>\r\n\r\n                <div *ngIf=\"popupVisible && popupPosition\" [style.top.px]=\"popupPosition.y\"\r\n                    [style.left.px]=\"popupPosition.x\" class=\"angle-widget\">\r\n                    <div (click)=\"toggleWidgetElementSelect()\" style=\"width: 147px;\"\r\n                        class=\"element-type-dropdown widget-element-type-dropdown d-flex justify-content-between position-relative\">\r\n                        <div>\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'wall'\">\r\n                                <svg class=\"me-3\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                    viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                        fill=\"#344054\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Wall</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'facade'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                        stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Glass...</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'opening'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                        stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Openi...</span>\r\n                            </span>\r\n\r\n                            <span class=\"d-flex align-items-center\" *ngIf=\"elementType === 'entrance'\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\" viewBox=\"0 0 21 18\"\r\n                                    fill=\"none\">\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                        fill=\"#1D2939\" />\r\n                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                        d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                        fill=\"#1D2939\" />\r\n                                </svg>\r\n                                <span class=\"type-txt\">Entra...</span>\r\n                            </span>\r\n\r\n                        </div>\r\n\r\n                        <div class=\"down-arrow\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n                                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                        </div>\r\n\r\n                        <ul *ngIf=\"widgetElementSelect?.show \" [ngClass]=\" widgetElementSelect.show ? 'z-4': ''\"\r\n                            class=\"list-unstyled mb-2\">\r\n                            <li (click)=\"elementType = 'wall'\" [ngClass]=\"elementType === 'wall' ? 'selected' : ''\"\r\n                                class=\"selected\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M1.33333 1.33333V0L2.66667 0V1.33333L6.66667 1.33333V0L8 0V1.33333L12 1.33333V0L13.3333 0V1.33333L17.3333 1.33333V0L18.6667 0V1.33333H20V2.66667H18.6667V6.66667H20V8H18.6667V12H20V13.3333H18.6667V17.3333H20V18.6667H18.6667V20H17.3333V18.6667H13.3333V20H12V18.6667H8V20H6.66667V18.6667H2.66667V20H1.33333V18.6667H0L0 17.3333H1.33333L1.33333 13.3333H0L0 12H1.33333L1.33333 8H0L0 6.66667H1.33333L1.33333 2.66667H0L0 1.33333H1.33333ZM2.66667 2.66667L2.66667 6.66667H6.66667V2.66667L2.66667 2.66667ZM8 2.66667V6.66667H12V2.66667L8 2.66667ZM13.3333 2.66667V6.66667H17.3333V2.66667H13.3333ZM17.3333 8L13.3333 8V12L17.3333 12V8ZM17.3333 13.3333L13.3333 13.3333L13.3333 17.3333H17.3333V13.3333ZM12 17.3333L12 13.3333H8L8 17.3333H12ZM6.66667 17.3333V13.3333H2.66667V17.3333H6.66667ZM2.66667 12H6.66667V8H2.66667L2.66667 12ZM8 8V12H12V8H8Z\"\r\n                                                fill=\"#344054\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Wall</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'wall'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'facade'\" [ngClass]=\"elementType === 'facade' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\"\r\n                                            viewBox=\"0 0 22 22\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M1 11V2.25C1 1.5625 1.5625 1 2.25 1H19.75C20.4375 1 21 1.5625 21 2.25V19.75C21 20.4375 20.4375 21 19.75 21H2.25C1.5625 21 1 20.4375 1 19.75V11Z\"\r\n                                                stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Glass/Facade</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'facade'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'opening'\"\r\n                                [ngClass]=\"elementType === 'opening' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                                            viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                            <path\r\n                                                d=\"M12.5 2.5H15.8333C16.2754 2.5 16.6993 2.6756 17.0118 2.98816C17.3244 3.30072 17.5 3.72464 17.5 4.16667V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H12.5M8.33333 14.1667L12.5 10M12.5 10L8.33333 5.83333M12.5 10H2.5\"\r\n                                                stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Opening</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'opening'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n                                        height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                            <li (click)=\"elementType = 'entrance'\"\r\n                                [ngClass]=\"elementType === 'entrance' ? 'selected' : ''\">\r\n                                <div class=\"d-flex\">\r\n                                    <div class=\"me-3\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"18\"\r\n                                            viewBox=\"0 0 21 18\" fill=\"none\">\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M17.9333 1.37949C8.7909 1.37949 1.37949 8.7909 1.37949 17.9333H0C0 8.02903 8.02903 0 17.9333 0V1.37949Z\"\r\n                                                fill=\"#1D2939\" />\r\n                                            <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                d=\"M19.3132 1.37949H17.9333L17.9337 16.5538H19.3132V1.37949ZM16.5542 0V17.9333H20.6927V0H16.5542Z\"\r\n                                                fill=\"#1D2939\" />\r\n                                        </svg>\r\n                                    </div>\r\n                                    <div>Entrance</div>\r\n                                </div>\r\n                                <div>\r\n                                    <svg *ngIf=\"elementType === 'entrance'\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                        width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                        <path d=\"M16.6663 5L7.49967 14.1667L3.33301 10\" stroke=\"#00A3FF\"\r\n                                            stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </li>\r\n                        </ul>\r\n\r\n                    </div>\r\n\r\n                    <div class=\"unit-input\">\r\n                        <svg (click)=\"onWidgetDistanceChange('decrement')\" class=\"cursor-pointer\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n                            <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                        <span>{{movePixels}}</span>\r\n                        <svg (click)=\"onWidgetDistanceChange('increment')\" class=\"cursor-pointer\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n                            <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                    </div>\r\n\r\n                    <div class=\"position-relative\" style=\"position: relative; width: 229px; height: 229px;\">\r\n                        <div\r\n                            style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 3;\">\r\n                            <div style=\"margin-bottom: 27px;\" class=\"d-flex justify-content-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('up')\"\r\n                                    [ngClass]=\"moveDirection === 'up' ? 'direction-selected' : ''\"\r\n                                    class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M6.00016 10.6673L6.00016 1.33398M6.00016 1.33398L1.3335 6.00065M6.00016 1.33398L10.6668 6.00065\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"d-flex justify-content-center align-items-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('left')\"\r\n                                    [ngClass]=\"moveDirection === 'left' ? 'direction-selected' : ''\"\r\n                                    style=\"margin-right: 8px;\" class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M10.6663 5.99935L1.33301 5.99935M1.33301 5.99935L5.99967 10.666M1.33301 5.99935L5.99968 1.33268\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                                <div class=\"unit-input\">\r\n                                    <svg (click)=\"onWidgetAngleChange('decrement')\" class=\"cursor-pointer\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"\r\n                                        fill=\"none\">\r\n                                        <path d=\"M2.9165 7H11.0832\" stroke=\"#667085\" stroke-width=\"2\"\r\n                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                    <span>{{moveAngle}}°</span>\r\n                                    <svg (click)=\"onWidgetAngleChange('increment')\" class=\"cursor-pointer\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"\r\n                                        fill=\"none\">\r\n                                        <path d=\"M6.99984 2.9165V11.0832M2.9165 6.99984H11.0832\" stroke=\"#667085\"\r\n                                            stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                                <div (click)=\"onWidgetDirectionChange('right')\"\r\n                                    [ngClass]=\"moveDirection === 'right' ? 'direction-selected' : ''\"\r\n                                    style=\"margin-left: 8px;\" class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M1.33366 6.00065L10.667 6.00065M10.667 6.00065L6.00033 1.33398M10.667 6.00065L6.00033 10.6673\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n\r\n                            </div>\r\n\r\n                            <div style=\"margin-top: 27px;\" class=\"d-flex justify-content-center\">\r\n                                <div (click)=\"onWidgetDirectionChange('down')\"\r\n                                    [ngClass]=\"moveDirection === 'down' ? 'direction-selected' : ''\"\r\n                                    class=\"direction-input\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M5.99984 1.33268L5.99984 10.666M5.99984 10.666L10.6665 5.99935M5.99984 10.666L1.33317 5.99935\"\r\n                                            stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                        <canvas height=\"229px\" width=\"229px\" #widgetCanvas\r\n                            style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1;\"></canvas>\r\n                        <div style=\"position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 2;\"\r\n                            #circle class=\"circle\">\r\n                            <div class=\"line\" *ngFor=\"let line of lines\"\r\n                                [ngClass]=\"{'line--highlight': line.highlight, 'line--invisible': line.invisible}\"\r\n                                [style.transform]=\"line.transform\"></div>\r\n\r\n                            <div #pointer class=\"pointer\"></div>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <button (click)=\"movePointWithAngle()\"\r\n                        [disabled]=\"!movePixels && moveAngle  !== undefined && moveAngle  !== null\"\r\n                        class=\" w-100 go-btn\">Go</button>\r\n\r\n                </div>\r\n\r\n                <!-- <div *ngIf=\"popupVisible && popupPosition\" [style.top.px]=\"popupPosition.y\" [style.left.px]=\"popupPosition.x\"\r\n                    class=\"popup\">\r\n                    <label>Move Pixels:</label>\r\n                    <select [(ngModel)]=\"elementType\">\r\n                        <option value=\"wall\">Wall</option>\r\n                        <option value=\"facade\">Glass/Facade</option>\r\n                        <option value=\"opening\">Opening</option>\r\n                        <option value=\"entrance\">Entrance</option>\r\n                    </select>\r\n                    <input type=\"number\" [(ngModel)]=\"movePixels\" />\r\n\r\n                    <select [(ngModel)]=\"moveDirection\">\r\n                        <option value=\"right\">Right</option>\r\n                        <option value=\"down\">Down</option>\r\n                        <option value=\"left\">Left</option>\r\n                        <option value=\"up\">Up</option>\r\n                    </select>\r\n                    <input type=\"number\" [(ngModel)]=\"moveAngle\" (ngModelChange)=\"layoutLengthPreview()\" />\r\n                    <button (click)=\"movePointWithAngle()\">Move with angle</button>\r\n                </div> -->\r\n            </div>\r\n\r\n        </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"planoStoreList.length > 1\" class=\"col-12 mt-6\">\r\n        <div style=\"padding: 0px !important;\" class=\"c-card\">\r\n            <lib-pagination [itemsPerPage]=\"itemsPerPage\" (pageChange)=\"onPageChange($event)\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n                [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"></lib-pagination>\r\n        </div>\r\n    </div>\r\n\r\n</div>","import { Component, Input, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n@Component({\r\n  selector: 'lib-element-form',\r\n  standalone: false,\r\n  templateUrl: './element-form.component.html',\r\n  styleUrl: './element-form.component.scss'\r\n})\r\nexport class ElementFormComponent implements OnInit {\r\n\r\n  fixtureForm: FormGroup\r\n  otherForm: FormGroup\r\n  @Input() layoutElement: any\r\n  @Input() fixtureData: any\r\n  @Input() type: 'wall-fixture' | 'wall-other' | 'floor-fixture' | 'floor-other'\r\n  @Input() planoId: string\r\n  @Input() floorId: string\r\n  @Input() clientId: string\r\n  @Input() storeId: string\r\n  @Input() storeName: string\r\n\r\n  constructor(private fb: FormBuilder, private apiService: StoreBuilderService, private activeOffcanvas: NgbActiveOffcanvas, private toastService: ToastService) {\r\n    this.fixtureForm = this.fb.group({});\r\n    this.otherForm = this.fb.group({});\r\n  }\r\n  ngOnInit(): void {\r\n    if (this.type === 'wall-fixture' || this.type === 'floor-fixture') {\r\n      this.createFixtureForm()\r\n      if (this.fixtureData) {\r\n        this.fixtureForm.patchValue({ ...this.fixtureData })\r\n      }\r\n    } else if (this.type === 'wall-other' || this.type === 'floor-other') {\r\n      this.createOtherForm()\r\n      if (this.fixtureData) {\r\n        this.otherForm.patchValue({ ...this.fixtureData })\r\n      }\r\n    }\r\n  }\r\n\r\n  createFixtureForm() {\r\n    this.fixtureForm = this.fb.group({\r\n      fixtureHeight: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      fixtureLength: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      fixtureWidth: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      detailedFixtureLength: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      detailedFixtureWidth: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      relativePosition: this.fb.group({\r\n        x: [0],\r\n        y: [0],\r\n        unit: ['ft']\r\n      }),\r\n      relativeDetailedPosition: this.fb.group({\r\n        x: [0],\r\n        y: [0],\r\n        unit: ['ft']\r\n      }),\r\n      fixtureName: [''],\r\n      fixtureCategory: [''],\r\n      fixtureBrandCategory: [''],\r\n      fixtureBrandSubCategory: [''],\r\n      mbq: [0],\r\n      fixtureCapacity: [0],\r\n      fixtureOrder: ['TTB'],\r\n      fixtureNumber: [0],\r\n      productResolutionLevel: ['L1'],\r\n    });\r\n  }\r\n\r\n  createOtherForm() {\r\n    this.otherForm = this.fb.group({\r\n      fixtureHeight: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      fixtureLength: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      fixtureWidth: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      detailedFixtureLength: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      detailedFixtureWidth: this.fb.group({\r\n        value: [0],\r\n        unit: ['mm']\r\n      }),\r\n      relativePosition: this.fb.group({\r\n        x: [0],\r\n        y: [0],\r\n        unit: ['ft']\r\n      }),\r\n      relativeDetailedPosition: this.fb.group({\r\n        x: [0],\r\n        y: [0],\r\n        unit: ['ft']\r\n      }),\r\n      fixtureCategory: [''],\r\n      fixtureName: [''],\r\n    });\r\n  }\r\n\r\n  isNotFormGroup(control: any): boolean {\r\n    return !(control instanceof FormGroup);\r\n  }\r\n\r\n  getFixtureControl(val: string): FormControl {\r\n    return this.fixtureForm.get(val) as FormControl;\r\n  }\r\n\r\n  getOtherControl(val: string): FormControl {\r\n    return this.otherForm.get(val) as FormControl;\r\n  }\r\n\r\n  onSubmit() {\r\n    let payload\r\n    if (this.type === 'wall-fixture') {\r\n\r\n      payload = {\r\n        planoId: this.planoId,\r\n        floorId: this.floorId,\r\n        fixtureId: this.fixtureData ? this.fixtureData._id : undefined,\r\n        data: {\r\n          ...this.fixtureForm.value,\r\n          associatedElementType: this.layoutElement.elementType,\r\n          associatedElementNumber: this.layoutElement.elementNumber,\r\n          fixtureType: \"wall\",\r\n          clientId: this.clientId,\r\n          storeId: this.storeId,\r\n          storeName: this.storeName,\r\n        }\r\n      }\r\n\r\n\r\n\r\n      // if(typeof payload.data.fixtureBrandCategory === 'string'){\r\n      //   payload.data.fixtureBrandCategory = payload.data.fixtureBrandCategory.split(',').map((s:string) => s.trim())\r\n      // }\r\n\r\n      // if(typeof payload.data.fixtureBrandSubCategory === 'string'){\r\n      //   payload.data.fixtureBrandSubCategory = payload.data.fixtureBrandSubCategory.split(',').map((s:string) => s.trim())\r\n      // }\r\n\r\n    } else if (this.type === 'wall-other') {\r\n      payload = {\r\n        planoId: this.planoId,\r\n        floorId: this.floorId,\r\n        fixtureId: this.fixtureData ? this.fixtureData._id : undefined,\r\n        data: {\r\n          ...this.otherForm.value,\r\n          associatedElementType: this.layoutElement.elementType,\r\n          associatedElementNumber: this.layoutElement.elementNumber,\r\n          fixtureType: \"other\",\r\n          clientId: this.clientId,\r\n          storeId: this.storeId,\r\n          storeName: this.storeName\r\n        }\r\n      }\r\n\r\n\r\n      // if( typeof payload.data.fixtureBrandCategory === 'string'){\r\n      //   payload.data.fixtureBrandCategory = payload.data.fixtureBrandCategory.split(',').map((s:string) => s.trim())\r\n      // }\r\n\r\n      // if(typeof payload.data.fixtureBrandSubCategory === 'string'){\r\n      //   payload.data.fixtureBrandSubCategory = payload.data.fixtureBrandSubCategory.split(',').map((s:string) => s.trim())\r\n      // }\r\n\r\n\r\n    } else if (this.type === 'floor-fixture') {\r\n      payload = {\r\n        planoId: this.planoId,\r\n        floorId: this.floorId,\r\n        fixtureId: this.fixtureData ? this.fixtureData._id : undefined,\r\n        data: {\r\n          clientId: this.clientId,\r\n          fixtureType: \"floor\",\r\n          storeId: this.storeId,\r\n          storeName: this.storeName,\r\n          ...this.fixtureForm.value,\r\n        }\r\n\r\n      }\r\n\r\n    } else if (this.type === 'floor-other') {\r\n      payload = {\r\n        planoId: this.planoId,\r\n        floorId: this.floorId,\r\n        fixtureId: this.fixtureData ? this.fixtureData._id : undefined,\r\n        data: {\r\n          clientId: this.clientId,\r\n          fixtureType: \"other\",\r\n          storeId: this.storeId,\r\n          storeName: this.storeName,\r\n          ...this.otherForm.value,\r\n        }\r\n\r\n      }\r\n\r\n    }\r\n\r\n    this.apiService.updertFixture(payload).subscribe({\r\n      next: (val) => {\r\n        this.toastService.getSuccessToast('Updated Successfully')\r\n        this.activeOffcanvas.close()\r\n      },\r\n      error: (err) => {\r\n        this.toastService.getErrorToast('Update failed')\r\n      }\r\n    })\r\n  }\r\n\r\n}\r\n","<div style=\"height: 100vh; overflow-y: auto;\" class=\"container\">\r\n    <h1 *ngIf=\"fixtureData\" >Id: {{fixtureData?._id}}</h1>\r\n    <form *ngIf=\"type === 'wall-fixture' || type === 'floor-fixture'\" [formGroup]=\"fixtureForm\">\r\n        <div class=\"row g-3\">\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Height Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\" getFixtureControl('fixtureHeight.value')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureHeight.value')?.invalid && fixtureForm.get('fixtureHeight.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Height Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('fixtureHeight.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('fixtureHeight.unit').invalid && getFixtureControl('fixtureHeight.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Length Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('fixtureLength.value')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureLength.value')?.invalid && fixtureForm.get('fixtureLength.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Length Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('fixtureLength.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('fixtureLength.unit').invalid && getFixtureControl('fixtureLength.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Width Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('fixtureWidth.value')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureWidth.value')?.invalid && fixtureForm.get('fixtureWidth.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Width Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('fixtureWidth.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('fixtureWidth.unit').invalid && getFixtureControl('fixtureWidth.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Length Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('detailedFixtureLength.value')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('detailedFixtureLength.value')?.invalid && fixtureForm.get('detailedFixtureLength.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Length Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('detailedFixtureLength.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('detailedFixtureLength.unit').invalid && getFixtureControl('detailedFixtureLength.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Width Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('detailedFixtureWidth.value')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('detailedFixtureWidth.value')?.invalid && fixtureForm.get('detailedFixtureWidth.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Width Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('detailedFixtureWidth.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('detailedFixtureWidth.unit').invalid && getFixtureControl('detailedFixtureWidth.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position X</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('relativePosition.x')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('relativePosition.x')?.invalid && fixtureForm.get('relativePosition.x')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position Y</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('relativePosition.y')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('relativePosition.y')?.invalid && fixtureForm.get('relativePosition.y')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('relativePosition.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('relativePosition.unit').invalid && getFixtureControl('relativePosition.unit').touched}\">\r\n                    <option value=\"ft\">ft</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position X</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('relativeDetailedPosition.x')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('relativeDetailedPosition.x')?.invalid && fixtureForm.get('relativeDetailedPosition.x')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position Y</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getFixtureControl('relativeDetailedPosition.y')\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('relativeDetailedPosition.y')?.invalid && fixtureForm.get('relativeDetailedPosition.y')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getFixtureControl('relativeDetailedPosition.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getFixtureControl('relativeDetailedPosition.unit').invalid && getFixtureControl('relativeDetailedPosition.unit').touched}\">\r\n                    <option value=\"ft\">ft</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Name</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureName\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureName')?.invalid && fixtureForm.get('fixtureName')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Category</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureCategory\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureCategory')?.invalid && fixtureForm.get('fixtureCategory')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Brand Category</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureBrandCategory\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureBrandCategory')?.invalid && fixtureForm.get('fixtureBrandCategory')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Brand Sub Category</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureBrandSubCategory\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureBrandSubCategory')?.invalid && fixtureForm.get('fixtureBrandSubCategory')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">MBQ</label>\r\n                <input type=\"number\" class=\"form-control\" formControlName=\"mbq\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('mbq')?.invalid && fixtureForm.get('mbq')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Capacity</label>\r\n                <input type=\"number\" class=\"form-control\" formControlName=\"fixtureCapacity\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureCapacity')?.invalid && fixtureForm.get('fixtureCapacity')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Order</label>\r\n                <select class=\"form-select\" formControlName=\"fixtureOrder\"\r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureOrder')?.invalid && fixtureForm.get('fixtureOrder')?.touched}\">\r\n                    <option value=\"TTB\">TTB</option>\r\n                    <option value=\"BTT\">BTT</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Number</label>\r\n                <input type=\"number\" class=\"form-control\" formControlName=\"fixtureNumber\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('fixtureNumber')?.invalid && fixtureForm.get('fixtureNumber')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Resolution Level</label>\r\n                <select class=\"form-select\" formControlName=\"productResolutionLevel\" \r\n                    [ngClass]=\"{'is-invalid': fixtureForm.get('productResolutionLevel')?.invalid && fixtureForm.get('productResolutionLevel')?.touched}\">\r\n                    <option value=\"L1\">L1</option>\r\n                    <option value=\"L2\">L2</option>\r\n                    <option value=\"L3\">L3</option>\r\n                    <option value=\"L4\">L4</option>\r\n                </select>\r\n            </div>\r\n        </div>\r\n        <div class=\"d-flex justify-content-end mb-5\" >\r\n            <button (click)=\"onSubmit()\" type=\"submit\" class=\"btn btn-primary mt-3\" [disabled]=\"fixtureForm.invalid\">Submit</button>\r\n        </div>\r\n    </form>\r\n    <form *ngIf=\"type === 'wall-other' || type === 'floor-other'\" [formGroup]=\"otherForm\">\r\n        <div class=\"row g-3\">\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Height Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\" getOtherControl('fixtureHeight.value')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('fixtureHeight.value')?.invalid && otherForm.get('fixtureHeight.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Height Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('fixtureHeight.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('fixtureHeight.unit').invalid && getOtherControl('fixtureHeight.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Length Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('fixtureLength.value')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('fixtureLength.value')?.invalid && otherForm.get('fixtureLength.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Length Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('fixtureLength.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('fixtureLength.unit').invalid && getOtherControl('fixtureLength.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Width Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('fixtureWidth.value')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('fixtureWidth.value')?.invalid && otherForm.get('fixtureWidth.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Width Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('fixtureWidth.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('fixtureWidth.unit').invalid && getOtherControl('fixtureWidth.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Length Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('detailedFixtureLength.value')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('detailedFixtureLength.value')?.invalid && otherForm.get('detailedFixtureLength.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Length Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('detailedFixtureLength.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('detailedFixtureLength.unit').invalid && getOtherControl('detailedFixtureLength.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Width Value</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('detailedFixtureWidth.value')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('detailedFixtureWidth.value')?.invalid && otherForm.get('detailedFixtureWidth.value')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Fixture Width Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('detailedFixtureWidth.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('detailedFixtureWidth.unit').invalid && getOtherControl('detailedFixtureWidth.unit').touched}\">\r\n                    <option value=\"mm\">mm</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position X</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('relativePosition.x')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('relativePosition.x')?.invalid && otherForm.get('relativePosition.x')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position Y</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('relativePosition.y')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('relativePosition.y')?.invalid && otherForm.get('relativePosition.y')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Relative Position Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('relativePosition.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('relativePosition.unit').invalid && getOtherControl('relativePosition.unit').touched}\">\r\n                    <option value=\"ft\">ft</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position X</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('relativeDetailedPosition.x')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('relativeDetailedPosition.x')?.invalid && otherForm.get('relativeDetailedPosition.x')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position Y</label>\r\n                <input type=\"number\" class=\"form-control\" [formControl]=\"getOtherControl('relativeDetailedPosition.y')\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('relativeDetailedPosition.y')?.invalid && otherForm.get('relativeDetailedPosition.y')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Detailed Relative Position Unit</label>\r\n                <select class=\"form-select\" [formControl]=\"getOtherControl('relativeDetailedPosition.unit')\"\r\n                    [ngClass]=\"{'is-invalid': getOtherControl('relativeDetailedPosition.unit').invalid && getOtherControl('relativeDetailedPosition.unit').touched}\">\r\n                    <option value=\"ft\">ft</option>\r\n                </select>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Fixture Category</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureCategory\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('fixtureCategory')?.invalid && otherForm.get('fixtureCategory')?.touched}\" />\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <label class=\"form-label\">Element Name</label>\r\n                <input type=\"text\" class=\"form-control\" formControlName=\"fixtureName\" \r\n                    [ngClass]=\"{'is-invalid': otherForm.get('fixtureName')?.invalid && otherForm.get('fixtureName')?.touched}\" />\r\n            </div>\r\n        </div>\r\n        <div class=\"d-flex justify-content-end mb-5\" >\r\n            <button (click)=\"onSubmit()\" type=\"submit\" class=\"btn btn-primary mt-3\" [disabled]=\"otherForm.invalid\">Submit</button>\r\n        </div>\r\n    </form>\r\n</div>","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { FormControl } from '@angular/forms';\r\nimport { NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ElementFormComponent } from './element-form/element-form.component';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n\r\n@Component({\r\n  selector: 'lib-layout-elements',\r\n  standalone: false,\r\n  templateUrl: './layout-elements.component.html',\r\n  styleUrl: './layout-elements.component.scss'\r\n})\r\nexport class LayoutElementsComponent implements OnInit {\r\n\r\n  private destroy$ = new Subject<void>();\r\n  planoIds: string[];\r\n  planoStoreList: any[];\r\n  totalItems: number;\r\n  selectedStore: any;\r\n  selectedFloor: any;\r\n  floorsInput:FormControl = new FormControl('');\r\n\r\n\r\n  constructor(private route:ActivatedRoute, private apiService:StoreBuilderService,\r\n     private cd:ChangeDetectorRef, private offcanvasService:NgbOffcanvas, private toastService:ToastService){}\r\n\r\n  ngOnInit(): void {\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.id) {\r\n          this.planoIds = params.id.split(',') || [];\r\n          this.getPlanoData()\r\n        }\r\n      });\r\n  }\r\n\r\n  getPlanoData() {\r\n    const payload = {\r\n      id: this.planoIds\r\n    }\r\n\r\n    this.apiService.getPlanoDetails(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.planoStoreList = res.data\r\n        this.planoStoreList.forEach((store)=>{\r\n          store.floors.forEach((floor:any) => {\r\n            floor.layoutPolygon.forEach((element:any) => {\r\n             if(!element.detailedDistance){\r\n              element.detailedDistance = 0\r\n             }\r\n            });\r\n          });\r\n        })\r\n\r\n        this.totalItems = res.data.length\r\n        if (!this.selectedStore) {\r\n          this.selectedStore = this.planoStoreList[0]\r\n        } else {\r\n          this.selectedStore = this.planoStoreList.filter((store: any) => store.planoId === this.selectedStore.planoId)[0]\r\n        }\r\n        if (!this.selectedFloor) {\r\n          this.selectedFloor = this.selectedStore.floors[0]\r\n        } else {\r\n          this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor.id === this.selectedFloor.id)[0]\r\n          if (!this.selectedFloor) {\r\n            this.selectedFloor = this.selectedStore.floors[0]\r\n          }\r\n        }\r\n        this.floorsInput.setValue(this.selectedFloor._id)\r\n        this.cd.detectChanges()\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onFloorSelect(event:any) {\r\n    this.selectedFloor = this.selectedStore.floors.filter((floor: any) => floor._id === event.target.value)[0]\r\n   \r\n  }\r\n\r\n  openElementForm(type: string, layoutElement?: any, fixtureData?: any) {\r\n    let canvaRef = this.offcanvasService.open(ElementFormComponent, {\r\n      position: 'end',\r\n      panelClass: 'set-height'\r\n    });\r\n    \r\n    canvaRef.componentInstance.type = type;\r\n    canvaRef.componentInstance.planoId = this.selectedFloor.planoId;\r\n    canvaRef.componentInstance.floorId = this.selectedFloor._id;\r\n    canvaRef.componentInstance.clientId = this.selectedStore.clientId;\r\n    canvaRef.componentInstance.storeId = this.selectedStore.storeId;\r\n    canvaRef.componentInstance.storeName = this.selectedStore.storeName;\r\n    \r\n    if (layoutElement) {\r\n      canvaRef.componentInstance.layoutElement = layoutElement;\r\n    }\r\n    \r\n    if (fixtureData) {\r\n      canvaRef.componentInstance.fixtureData = fixtureData;\r\n    }\r\n\r\n    canvaRef.result.then(()=>{this.getPlanoData()}).catch(()=>{this.getPlanoData()})\r\n  }\r\n\r\n  onDetailDistanceUpdate(element:any){\r\n   const data = {\r\n    floorId:this.selectedFloor._id,\r\n      elementType:element.elementType,\r\n      elementNumber:element.elementNumber,\r\n      detailedDistance:element.detailedDistance\r\n    }\r\n\r\n    this.apiService.updateDetailedDistance(data).subscribe({\r\n      next:()=>{\r\n        this.toastService.getSuccessToast('Updated Successfully')\r\n      }\r\n    })\r\n  }\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"c-card\">\r\n    <div class=\"row\">\r\n        <div class=\"col-12 mb-5\">\r\n            <div class=\"d-flex justify-content-end\">\r\n                <select style=\"width: 200px;\" (change)=\"onFloorSelect($event)\" [formControl]=\"floorsInput\"\r\n                    class=\"form-select\" aria-label=\"Default select example\">\r\n                    <option *ngFor=\"let floor of selectedStore?.floors\" [value]=\"floor._id\">{{floor?.floorName}}\r\n                    </option>\r\n                </select>\r\n            </div>\r\n        </div>\r\n        <div class=\"col-12 mb-5\">\r\n            <h1>Wall Elements</h1>\r\n            <div class=\"mb-3 p-2\" style=\"border: 1px dashed black; border-radius: 5px;\" *ngFor=\"let element of selectedFloor?.layoutPolygon\">\r\n                <h2>{{element?.elementType}} {{element?.elementNumber}}</h2>\r\n\r\n                <div class=\"mb-3\">\r\n                    <label for=\"detailViewDistance\" class=\"form-label\">Detail view distance</label>\r\n                    <input [(ngModel)]=\"element.detailedDistance\" style=\"width: 300px;\" type=\"number\" class=\"form-control\" id=\"detailViewDistance\">\r\n                </div>\r\n\r\n                <button (click)=\"onDetailDistanceUpdate(element)\" class=\"btn btn-primary mb-3\">Update Distance</button>\r\n\r\n                <div class=\"d-flex align-items-centre justify-content-between w-100 mb-3\" >\r\n                <h3>Wall Fixtures</h3>  \r\n                <button class=\"btn btn-primary\" (click)=\"openElementForm('wall-fixture', element)\" >Add Wall Fixture</button>\r\n                </div>\r\n                \r\n                <div  style=\"display: flex; align-items:center; flex-wrap: wrap; flex: 1;\">\r\n                    <ng-container *ngFor=\"let fixture of element.fixtures\" >\r\n                        <div (click)=\"openElementForm('wall-fixture',element, fixture )\" class=\"fixture-box me-3 mb-5\" >\r\n                            <div>{{fixture?.fixtureName}}</div>\r\n                            <div>{{fixture?.fixtureNumber}}</div>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n                <div class=\"d-flex align-items-centre justify-content-between w-100 mb-3\" >\r\n                    <h3>Wall Elements</h3>\r\n                    <button class=\"btn btn-primary\" (click)=\"openElementForm('wall-other', element)\" >Add Wall Element</button>\r\n                    </div>\r\n                <div style=\"display: flex; align-items:center; flex-wrap: wrap; flex: 1;\">\r\n                    <ng-container *ngFor=\"let fixture of element.otherElements\" >\r\n                        <div (click)=\"openElementForm('wall-other',element, fixture )\" class=\"other-box me-3 mb-5\" >\r\n                            <div>{{fixture?.fixtureName}}</div>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"col-12 mb-5\">\r\n            \r\n            <div class=\"d-flex align-items-centre justify-content-between w-100 mb-3\" >\r\n                <h1>Floor Fixtures</h1>\r\n                <button class=\"btn btn-primary\" (click)=\"openElementForm('floor-fixture')\" >Add Floor Fixture</button>\r\n                </div>\r\n            <div class=\"mb-3 p-2\" style=\"border: 1px dashed black; border-radius: 5px;\" >\r\n                <div style=\"display: flex; align-items:center; flex-wrap: wrap; flex: 1;\">\r\n                        <div (click)=\"openElementForm('floor-fixture', undefined,  fixture)\"  *ngFor=\"let fixture of selectedFloor?.centerFixture\" class=\"mb-5 fixture-box me-3\" >\r\n                            <div>{{fixture?.fixtureName}}</div>\r\n                            <div>{{fixture?.fixtureNumber}}</div>\r\n                        </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"col-12 mb-5\">\r\n            <div class=\"d-flex align-items-centre justify-content-between w-100 mb-3\" >\r\n                <h1>Floor Elements</h1>\r\n                <button class=\"btn btn-primary\" (click)=\"openElementForm('floor-other')\" >Add Floor Element</button>\r\n                </div>\r\n            <div class=\"mb-3 p-2\" style=\"border: 1px dashed black; border-radius: 5px;\" >\r\n                <div style=\"display: flex; align-items:center; flex-wrap: wrap; flex: 1;\">\r\n                        <div (click)=\"openElementForm('floor-other', undefined,  fixture)\"  *ngFor=\"let fixture of selectedFloor?.otherElements\" class=\"other-box mb-5 me-3\" >\r\n                            <div>{{fixture?.fixtureName}}</div>\r\n                        </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n</div>","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: 'lib-visualize-vm-data',\r\n  standalone: false,\r\n  templateUrl: './visualize-vm-data.component.html',\r\n  styleUrl: './visualize-vm-data.component.scss'\r\n})\r\nexport class VisualizeVmDataComponent implements OnInit {\r\n\r\n  fixtures: any[] = [];\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private apiService: StoreBuilderService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.route.queryParams.subscribe(params => {\r\n      const storeName = params['storeName'];\r\n      const date = params['date'];\r\n\r\n      // this.apiService.getVmTaskData({ storeName, date }).subscribe((res: any) => {\r\n      //   this.fixtures = res.data;\r\n      // });\r\n    });\r\n  }\r\n}\r\n","<div class=\"fixtures-container\">\r\n    <div *ngFor=\"let fixture of fixtures\" class=\"fixture-card\">\r\n      <h2>{{ fixture.fixtureName }}</h2>\r\n      <h3>Fixture Number: {{ fixture.fixtureNumber }}</h3>\r\n  \r\n      <!-- Fixture Image -->\r\n      <div class=\"fixture-image\">\r\n        <img [src]=\"fixture.fixtureImg\" [alt]=\"fixture.fixtureName\" />\r\n      </div>\r\n  \r\n      <h4>VMs:</h4>\r\n      <div class=\"vms-list\">\r\n        <div class=\"vm-item\" *ngFor=\"let vm of fixture.vms\">\r\n          <h5>{{ vm.vmtype }}</h5>\r\n          <img [src]=\"vm.vmImg\" [alt]=\"vm.vmtype\" class=\"vm-image\" />\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n  ","import { Component, Input } from \"@angular/core\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\n@Component({\r\n  selector: \"app-layout-edit-confirmation\",\r\n  templateUrl: \"./layout-edit-confirmation.component.html\",\r\n  styleUrl: \"./layout-edit-confirmation.component.scss\",\r\n})\r\nexport class LayoutEditConfirmationComponent {\r\n  @Input() title: string = \"Save Layout\";\r\n  @Input() description: string =\r\n    \"Are you sure you want to save the layout changes? Editing the layout will reset all your verification progress.\";\r\n\r\n  constructor(private activeModal: NgbActiveModal) {}\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onSubmit() {\r\n    this.activeModal.close(\"ok\");\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"d-flex flex-start mb-5\">\r\n    <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n      <path\r\n        d=\"M27.9998 24.0002V28.0002M27.9998 32.0002H28.0098M26.2898 18.8602L17.8198 33.0002C17.6451 33.3026 17.5527 33.6455 17.5518 33.9947C17.5508 34.3439 17.6413 34.6873 17.8142 34.9907C17.9871 35.2941 18.2365 35.547 18.5375 35.7241C18.8385 35.9012 19.1806 35.9964 19.5298 36.0002H36.4698C36.819 35.9964 37.1611 35.9012 37.4621 35.7241C37.7631 35.547 38.0124 35.2941 38.1854 34.9907C38.3583 34.6873 38.4488 34.3439 38.4478 33.9947C38.4468 33.6455 38.3544 33.3026 38.1798 33.0002L29.7098 18.8602C29.5315 18.5663 29.2805 18.3233 28.981 18.1547C28.6814 17.9861 28.3435 17.8975 27.9998 17.8975C27.656 17.8975 27.3181 17.9861 27.0186 18.1547C26.7191 18.3233 26.468 18.5663 26.2898 18.8602Z\"\r\n        stroke=\"#DC6803\"\r\n        stroke-width=\"2\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\">{{title}}</button>\r\n  </div>\r\n</div>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n@Component({\r\n  selector: 'app-publishtask-popup',\r\n  templateUrl: './publishtask-popup.component.html',\r\n  styleUrl: './publishtask-popup.component.scss'\r\n})\r\nexport class PublishTaskPopupComponent  implements OnInit{\r\n  @Input() type: any;\r\n  @Input() inputData: any;\r\n  taskType: any\r\n  constructor(private activeModal: NgbActiveModal,) {\r\n    \r\n  }\r\n\r\n  comments: any = ''\r\n  ngOnInit(): void {\r\n    this.taskType = this.type\r\n\r\n    if (this.type === 'vm-redo') {\r\n      this.taskType = \"vm\"\r\n    }\r\n    if (this.type === 'fixture-redo') {\r\n      this.taskType = \"fixture\"\r\n    }\r\n    if (this.type === 'layout-redo') {\r\n      this.taskType = \"layout\"\r\n    }\r\n    if (this.type === 'zone-redo') {\r\n      this.taskType = \"zone\"\r\n    }\r\n  }\r\n  cancel() {\r\n    this.activeModal.close('close');\r\n  }\r\n\r\n  onSubmit() {\r\n    let payload = { type: this.type, comments: this.comments, status: 'submit' }\r\n    this.activeModal.close(payload);\r\n  }\r\n}\r\n","<div class=\"modal show d-block\" tabindex=\"-1\" >\r\n  <div class=\"modal-dialog modal-dialog-centered\">\r\n    <div class=\"modal-content rounded-3 shadow\" >\r\n        <div >\r\n            <div class=\"modal-header border-0\" *ngIf=\"!inputData.redo\">\r\n              <h5 class=\"modal-title fw-semibold\">Publish {{taskType}} task</h5>\r\n            </div>\r\n            <div class=\"modal-header border-0\" *ngIf=\"inputData.redo\">\r\n              <h5 class=\"modal-title fw-semibold\">Re-Publish {{taskType}} task</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n               You are about to <span *ngIf=\"inputData.redo\">re-</span>assign a {{taskType}} verification task to the store. Please ensure all necessary updates are completed before publishing.\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\"  [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n      <div class=\"modal-footer border-0\">\r\n        <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"cancel()\" >Cancel</button>\r\n        <button *ngIf=\"!inputData.redo\" type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\">Publish</button>\r\n        <button *ngIf=\"inputData.redo\" type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\">Re-Publish</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, Input, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-store-task-revoke',\r\n  templateUrl: './store-task-revoke.component.html',\r\n  styleUrl: './store-task-revoke.component.scss'\r\n})\r\nexport class StoreTaskRevokeComponent implements OnInit {\r\n  @Input() type: any;\r\n  @Input() inputData: any;\r\n\r\n    taskType: any\r\n    // comments: any = '';\r\n  \r\n    constructor(private activeModal: NgbActiveModal) { }\r\n  \r\n    ngOnInit(): void {\r\n      this.taskType = this.type;\r\n    }\r\n  \r\n    cancel() {\r\n      this.activeModal.close('close');\r\n    }\r\n  \r\n    onSubmit() {\r\n      let payload = { type: this.type, status: 'submit' }\r\n      this.activeModal.close(payload);\r\n    }\r\n}\r\n","<div class=\"modal show d-block\" tabindex=\"-1\">\r\n  <div class=\"modal-dialog modal-dialog-centered\">\r\n    <div class=\"modal-content rounded-3 shadow\">\r\n      <div>\r\n        <!-- <div class=\"modal-header border-0 pb-0\" *ngIf=\"!inputData?.revoke\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n            <path d=\"M38 18L27 29M38 18L31 38L27 29M38 18L18 25L27 29\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>\r\n        </div> -->\r\n        <div class=\"modal-header border-0\">\r\n          <h5 class=\"modal-title title fw-semibold\">Revoke task</h5>\r\n        </div>\r\n\r\n        <div class=\"modal-body pt-0\">\r\n          <div class=\"bodyContent\">\r\n            <span>You are revoking the assigned task. This will put the task on hold, and the store team will receive a notification.</span>\r\n          </div>\r\n          <!-- <ng-container *ngIf=\"!inputData?.revoke\">\r\n            <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n            <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n          </ng-container> -->\r\n        </div>\r\n      </div>\r\n      <div class=\"modal-footer border-0\">\r\n        <button type=\"button\" class=\"btn btn-outline\" (click)=\"cancel()\">Cancel</button>\r\n        <button (click)=\"onSubmit()\" class=\"btn btn-red d-flex\">\r\n          <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <g clip-path=\"url(#clip0_640_5594)\">\r\n              <path\r\n                d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                stroke=\"#B42318\"\r\n                stroke-width=\"1.67\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_640_5594\">\r\n                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n          Revoke\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-delete-confirmation',\r\n  templateUrl: './delete-confirmation.component.html',\r\n  styleUrl: './delete-confirmation.component.scss'\r\n})\r\nexport class DeleteConfirmationComponent {\r\n  @Input() title: string = 'Delete action';\r\n  @Input() description: string = 'Are you sure you want to delete this item?';\r\n  @Input() confirmLabel: string = 'Delete';\r\n  @Input() confirmClass: string = 'btn-danger';\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n  ) { }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onDelete() {\r\n    this.activeModal.close('ok');\r\n  }\r\n\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"d-flex flex-start mb-5\">\r\n    <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n      <path\r\n        d=\"M27.9998 24.0002V28.0002M27.9998 32.0002H28.0098M26.2898 18.8602L17.8198 33.0002C17.6451 33.3026 17.5527 33.6455 17.5518 33.9947C17.5508 34.3439 17.6413 34.6873 17.8142 34.9907C17.9871 35.2941 18.2365 35.547 18.5375 35.7241C18.8385 35.9012 19.1806 35.9964 19.5298 36.0002H36.4698C36.819 35.9964 37.1611 35.9012 37.4621 35.7241C37.7631 35.547 38.0124 35.2941 38.1854 34.9907C38.3583 34.6873 38.4488 34.3439 38.4478 33.9947C38.4468 33.6455 38.3544 33.3026 38.1798 33.0002L29.7098 18.8602C29.5315 18.5663 29.2805 18.3233 28.981 18.1547C28.6814 17.9861 28.3435 17.8975 27.9998 17.8975C27.656 17.8975 27.3181 17.9861 27.0186 18.1547C26.7191 18.3233 26.468 18.5663 26.2898 18.8602Z\"\r\n        stroke=\"#DC6803\"\r\n        stroke-width=\"2\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn px-4\" [ngClass]=\"confirmClass\" (click)=\"onDelete()\">{{ confirmLabel }}</button>\r\n  </div>\r\n</div>\r\n","import { Component, OnInit } from '@angular/core';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\n\nconst CURRENT_PLANO_NAME = 'Current Plano';\n\n@Component({\n  selector: 'app-publish-plano-modal',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  providers: [DatePipe],\n  templateUrl: './publish-plano-modal.component.html',\n  styleUrl: './publish-plano-modal.component.scss',\n})\nexport class PublishPlanoModalComponent implements OnInit {\n  revisionName = '';\n  publishAsDraft = false;\n  private draftDefaultName = '';\n\n  constructor(\n    private activeModal: NgbActiveModal,\n    private datePipe: DatePipe,\n  ) {}\n\n  ngOnInit(): void {\n    this.draftDefaultName = `Revision: ${this.datePipe.transform(new Date(), 'MMM dd, yyyy, h:mm:ss a')}`;\n    this.revisionName = CURRENT_PLANO_NAME;\n  }\n\n  onDraftToggle() {\n    this.revisionName = this.publishAsDraft ? this.draftDefaultName : CURRENT_PLANO_NAME;\n  }\n\n  onCancel() {\n    this.activeModal.dismiss();\n  }\n\n  onPublish() {\n    this.activeModal.close({\n      revisionName: this.revisionName,\n      publishAsDraft: this.publishAsDraft,\n    });\n  }\n}\n","<div class=\"modal-wrapper\">\r\n  <h3 class=\"mb-4\">Publish Planogram</h3>\r\n\r\n  <div class=\"mb-3\">\r\n    <label class=\"form-label fw-semibold\">Revision name</label>\r\n    <input\r\n      type=\"text\"\r\n      class=\"form-control\"\r\n      [(ngModel)]=\"revisionName\"\r\n      [readonly]=\"!publishAsDraft\"\r\n    />\r\n  </div>\r\n\r\n  <p class=\"description-text\">\r\n    You're about to publish this planogram. It will be saved as a new revision\r\n    and set as the current planogram. Do you want to continue?\r\n  </p>\r\n\r\n  <div class=\"draft-option\">\r\n    <label class=\"d-flex align-items-start gap-2\">\r\n      <input\r\n        type=\"checkbox\"\r\n        class=\"form-check-input mt-1\"\r\n        [(ngModel)]=\"publishAsDraft\"\r\n        (ngModelChange)=\"onDraftToggle()\"\r\n      />\r\n      <div>\r\n        <span class=\"fw-semibold\">Publish as draft</span>\r\n        <p class=\"text-muted mb-0 small\">\r\n          Saves this as a revision without setting it as the current planogram.\r\n        </p>\r\n      </div>\r\n    </label>\r\n  </div>\r\n\r\n  <div class=\"modal-actions mt-4\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">\r\n      Cancel\r\n    </button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onPublish()\">\r\n      Publish\r\n    </button>\r\n  </div>\r\n</div>\r\n","import { Component, EventEmitter, OnInit, Output } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport dayjs from \"dayjs\";\r\nimport { NgxDaterangepickerMd } from \"ngx-daterangepicker-material\";\r\n\r\n@Component({\r\n  selector: \"date-picker\",\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, NgxDaterangepickerMd],\r\n  templateUrl: \"./date-picker.component.html\",\r\n  styleUrls: [\"./date-picker.component.scss\"],\r\n})\r\nexport class DatePickerComponent implements OnInit {\r\n  @Output() dateChange = new EventEmitter<string>();\r\n\r\n  today = dayjs().startOf(\"day\");\r\n\r\n  // Pass min/max as strings so the library's internal dayjs/esm instance\r\n  // can parse them (dayjs.isDayjs() fails across dayjs vs dayjs/esm).\r\n  minDateStr: any = dayjs().startOf(\"day\").format(\"YYYY-MM-DD\");\r\n  maxDateStr: any = dayjs().add(1, \"year\").endOf(\"day\").format(\"YYYY-MM-DD\");\r\n\r\n  selectedDate: any;\r\n\r\n  displayValue: string = \"Today\";\r\n\r\n  ngOnInit() {\r\n    this.today = dayjs().startOf(\"day\");\r\n    this.minDateStr = this.today.format(\"YYYY-MM-DD\");\r\n    this.maxDateStr = dayjs().add(1, \"year\").endOf(\"day\").format(\"YYYY-MM-DD\");\r\n\r\n    this.selectedDate = {\r\n      startDate: this.today,\r\n      endDate: this.today,\r\n    };\r\n\r\n    this.displayValue = \"Today\";\r\n  }\r\n\r\n  emitDateChange(event: any) {\r\n    if (!event?.startDate) return;\r\n\r\n    const selected = dayjs(event.startDate);\r\n\r\n    // Force reset model to allow reselecting same date\r\n    this.selectedDate = {\r\n      startDate: selected,\r\n      endDate: selected,\r\n    };\r\n\r\n    if (selected.isSame(this.today, \"day\")) {\r\n      this.displayValue = \"Today\";\r\n    } else {\r\n      this.displayValue = selected.format(\"DD MMMM, YYYY\");\r\n    }\r\n\r\n    this.dateChange.emit(selected.format(\"YYYY-MM-DD HH:mm A\"));\r\n  }\r\n\r\n  resetToToday() {\r\n    this.selectedDate = {\r\n      startDate: this.today,\r\n      endDate: this.today,\r\n    };\r\n    this.displayValue = \"Today\";\r\n    this.dateChange.emit(this.today.format(\"YYYY-MM-DD HH:mm A\"));\r\n  }\r\n}\r\n","<div class=\"date-wrapper position-relative d-inline-flex align-items-center\">\r\n\r\n    <span class=\"calendar-icon\">\r\n        <svg width=\"17\" height=\"19\" viewBox=\"0 0 17 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n                d=\"M11.6693 0.834961V4.16829M5.0026 0.834961V4.16829M0.835938 7.50163H15.8359M2.5026 2.50163H14.1693C15.0897 2.50163 15.8359 3.24782 15.8359 4.16829V15.835C15.8359 16.7554 15.0897 17.5016 14.1693 17.5016H2.5026C1.58213 17.5016 0.835938 16.7554 0.835938 15.835V4.16829C0.835938 3.24782 1.58213 2.50163 2.5026 2.50163Z\"\r\n                stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n    </span>\r\n\r\n    <input class=\"date-input\" type=\"text\" ngxDaterangepickerMd [singleDatePicker]=\"true\" [autoApply]=\"true\"\r\n        [showCancel]=\"false\" [(ngModel)]=\"selectedDate\" (datesUpdated)=\"emitDateChange($event)\" [minDate]=\"minDateStr\"\r\n        [maxDate]=\"maxDateStr\" [keepCalendarOpeningWithRange]=\"true\" [linkedCalendars]=\"false\"\r\n        [locale]=\"{ format: 'DD MMMM, YYYY', firstDay: 1 }\" readonly />\r\n\r\n    <!-- Overlay display text -->\r\n    <span class=\"display-overlay\">\r\n        {{ displayValue }}\r\n    </span>\r\n\r\n</div>","import { DatePipe, NgClass, NgFor, NgStyle } from \"@angular/common\";\r\nimport { Component, Input, OnInit, ViewChild } from \"@angular/core\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\nimport { finalize } from \"rxjs\";\r\n\r\nimport { DatePickerComponent } from \"../../../date-picker/date-picker.component\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\n\r\n@Component({\r\n  selector: \"schedule-task-popup\",\r\n  templateUrl: \"./schedule-task-popup.component.html\",\r\n  styleUrl: \"./schedule-task-popup.component.scss\",\r\n  standalone: true,\r\n  imports: [NgClass, NgStyle, NgFor, DatePickerComponent, DatePipe],\r\n})\r\nexport class ScheduleTaskPopupComponent implements OnInit {\r\n  @ViewChild(DatePickerComponent) datePicker: DatePickerComponent;\r\n\r\n  @Input() fixtures: any;\r\n  @Input() storeName: string;\r\n\r\n  mbqItems: any[] = [];\r\n  zoneColumns: string[] = [];\r\n\r\n  today = new Date();\r\n  scheduledDate: string;\r\n\r\n  showInfoBanner: boolean = false;\r\n  isDownloadButtonLoading: boolean = false;\r\n\r\n  sortOrder: number = 1;\r\n  sortedColumn: string = \"\";\r\n  private readonly numericColumns = new Set([\"partition\", \"standardCapacity\"]);\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n    private apiService: StoreBuilderService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Collect all unique zone names across all fixtures in insertion order\r\n    const zoneSet = new Set<string>();\r\n    for (const f of this.fixtures) {\r\n      for (const s of f?.shelfConfig ?? []) {\r\n        if (s.zone) zoneSet.add(s.zone);\r\n      }\r\n    }\r\n    this.zoneColumns = Array.from(zoneSet);\r\n\r\n    for (let i = 0; i < this.fixtures.length; i++) {\r\n      const f = this.fixtures[i];\r\n      const shelfDetails: any[] = f?.shelfConfig ?? [];\r\n\r\n      // Group shelves by zone and collect unique brand names per zone\r\n      const zoneAllocations: Record<string, string[]> = {};\r\n      for (const zone of this.zoneColumns) {\r\n        const shelves = shelfDetails.filter((s: any) => s.zone === zone);\r\n        zoneAllocations[zone] = [\r\n          ...new Set(shelves.flatMap((s: any) => s.productBrandName ?? [])),\r\n        ];\r\n      }\r\n\r\n      this.mbqItems.push({\r\n        wall:\r\n          f?.associatedElementType == \"wall\"\r\n            ? `Wall ${f?.associatedElementNumber}`\r\n            : \"Floor\",\r\n        ufn: `FX - ${f?.fixtureNumber}`,\r\n        brand: f?.header?.label,\r\n        type: f?.fixtureCategory,\r\n        size: `${f?.fixtureWidth?.value}${f?.fixtureWidth?.unit}`,\r\n        partition: shelfDetails.length,\r\n        // displayPartition: shelfDetails.length,\r\n        standardCapacity: f?.fixtureCapacity ?? 0,\r\n        // actualCapacity: f?.fixtureCapacity ?? 0,\r\n        zoneAllocations,\r\n      });\r\n    }\r\n  }\r\n\r\n  downloadMBQSheet() {\r\n    // const headers = [\r\n    //   \"Wall/Floor\",\r\n    //   \"UFN\",\r\n    //   \"Brand Category\",\r\n    //   \"Type\",\r\n    //   \"Size\",\r\n    //   \"Partition\",\r\n    //   \"Standard Capacity\",\r\n    //   ...this.zoneColumns.map((zone) => `${zone} Zone Allocation`),\r\n    // ];\r\n\r\n    // const rows = this.mbqItems.map((item) => [\r\n    //   item?.wall ?? \"\",\r\n    //   item?.ufn ?? \"\",\r\n    //   item?.brand ?? \"\",\r\n    //   item?.type ?? \"\",\r\n    //   item?.size ?? \"\",\r\n    //   item?.partition ?? \"\",\r\n    //   item?.standardCapacity ?? \"\",\r\n    //   ...this.zoneColumns.map(\r\n    //     (zone) => item?.zoneAllocations?.[zone]?.join(\", \") || \"-\"\r\n    //   ),\r\n    // ]);\r\n\r\n    // const worksheet = XLSX.utils.aoa_to_sheet([headers, ...rows]);\r\n    // const workbook = XLSX.utils.book_new();\r\n    // XLSX.utils.book_append_sheet(workbook, worksheet, \"MBQ\");\r\n\r\n    // const safeStoreName = (this.storeName || \"store\").replace(\r\n    //   /[\\\\/:*?\"<>|]/g,\r\n    //   \"_\"\r\n    // );\r\n    // XLSX.writeFile(workbook, `${safeStoreName}_mbq.xlsx`);\r\n\r\n    // try {\r\n\r\n    // } catch (error) {\r\n    //   console.log(\"@@ ~ downloadMBQSheet [ERR]:\", error);\r\n    // }\r\n\r\n    if (this.isDownloadButtonLoading) return;\r\n\r\n    const storeName = [this.storeName];\r\n    this.isDownloadButtonLoading = true;\r\n\r\n    this.apiService\r\n      .exportMBQSheet({ storeName })\r\n      .pipe(\r\n        finalize(() => {\r\n          this.isDownloadButtonLoading = false;\r\n        }),\r\n      )\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          const safeStoreName = (this.storeName || \"store\").replace(\r\n            /[\\\\/:*?\"<>|]/g,\r\n            \"_\",\r\n          );\r\n\r\n          this.apiService.saveAsExcelFile(res, `${safeStoreName}_mbq`);\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ downloadMBQSheet [ERR]: \", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  onSort(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder * -1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n\r\n    this.mbqItems.sort((a, b) => {\r\n      const aValue = a?.[column];\r\n      const bValue = b?.[column];\r\n\r\n      if (this.numericColumns.has(column)) {\r\n        const aNum = Number(aValue ?? 0);\r\n        const bNum = Number(bValue ?? 0);\r\n        return (aNum - bNum) * this.sortOrder;\r\n      }\r\n\r\n      const aStr = String(aValue ?? \"\");\r\n      const bStr = String(bValue ?? \"\");\r\n      return (\r\n        aStr.localeCompare(bStr, undefined, {\r\n          numeric: true,\r\n          sensitivity: \"base\",\r\n        }) * this.sortOrder\r\n      );\r\n    });\r\n  }\r\n\r\n  scheduleTask() {\r\n    this.activeModal.close({\r\n      status: \"submit\",\r\n      scheduledDate: this.scheduledDate,\r\n    });\r\n  }\r\n\r\n  onDateSelected(data: string) {\r\n    this.scheduledDate = data;\r\n    const selectedDateStr = data.substring(0, 10);\r\n    const t = this.today;\r\n    const todayStr = `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, \"0\")}-${String(t.getDate()).padStart(2, \"0\")}`;\r\n    this.showInfoBanner = selectedDateStr !== todayStr;\r\n  }\r\n\r\n  onDismissInfoBanner() {\r\n    this.datePicker.resetToToday();\r\n  }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n    <h3 class=\"mb-3\">Publish Verification Task</h3>\r\n    <p>You are about to send a verification task to <b>{{storeName}}</b>. Choose if you want to schedule the task\r\n        for later.\r\n    </p>\r\n\r\n\r\n    <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n        <h4 class=\"me-auto\">MBQ for {{storeName}}</h4>\r\n\r\n        <date-picker (dateChange)=\"onDateSelected($event)\">\r\n        </date-picker>\r\n\r\n        <button type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center justify-content-center bg-white shadow-sm mbq-download-btn\"\r\n            (click)=\"downloadMBQSheet()\" [disabled]=\"isDownloadButtonLoading\" style=\"padding: 9px 12px;\">\r\n            @if (!isDownloadButtonLoading) {\r\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                        stroke-width=\"0.384\"></g>\r\n                    <g id=\"SVGRepo_iconCarrier\">\r\n                        <path\r\n                            d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                            fill=\"#1D2939\"></path>\r\n                        <path\r\n                            d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                            fill=\"#1D2939\"></path>\r\n                    </g>\r\n                </svg>\r\n            } @else {\r\n                <svg class=\"spinner\" viewBox=\"0 0 50 50\">\r\n                    <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n                </svg>\r\n            }\r\n        </button>\r\n    </div>\r\n\r\n    @if(showInfoBanner){\r\n        <div class=\"info-banner\">\r\n            <svg width=\"17\" height=\"19\" viewBox=\"0 0 17 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                    d=\"M11.6693 0.834961V4.16829M5.0026 0.834961V4.16829M0.835938 7.50163H15.8359M2.5026 2.50163H14.1693C15.0897 2.50163 15.8359 3.24782 15.8359 4.16829V15.835C15.8359 16.7554 15.0897 17.5016 14.1693 17.5016H2.5026C1.58213 17.5016 0.835938 16.7554 0.835938 15.835V4.16829C0.835938 3.24782 1.58213 2.50163 2.5026 2.50163Z\"\r\n                    stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n\r\n            <span>\r\n                You are scheduling the layout verification task for <b>{{\r\n                        scheduledDate === (today | date:'yyyy-MM-dd')\r\n                            ? 'Today'\r\n                            : (scheduledDate | date:'dd MMMM, yyyy')\r\n                }}</b>\r\n            </span>\r\n\r\n            <svg class=\"ms-auto cursor-pointer\" (click)=\"onDismissInfoBanner()\" width=\"18\" height=\"18\"\r\n                viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </div>\r\n    }\r\n    <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n            <thead>\r\n                <tr>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('wall')\">\r\n                        Wall/Floor\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'wall' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'wall' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('ufn')\">\r\n                        UFN\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'ufn' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'ufn' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('brand')\">\r\n                        Brand Category\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'brand' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'brand' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('type')\">\r\n                        Type\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'type' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'type' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('size')\">\r\n                        Size\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'size' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'size' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('partition')\">\r\n                        Partition\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'partition' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'partition' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <!-- <th>\r\n                        Display Per Partition\r\n                        <i class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'displayPartition' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'displayPartition' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th> -->\r\n                    <th class=\"cursor-pointer\" (click)=\"onSort('standardCapacity')\">\r\n                        Standard Capacity\r\n                        <i class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'standardCapacity' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'standardCapacity' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th>\r\n                    <!-- <th>\r\n                        Actual Capacity\r\n                        <i class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'actualCapacity' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'actualCapacity' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"></i>\r\n                    </th> -->\r\n                    <th *ngFor=\"let zone of zoneColumns\">\r\n                        {{zone}} Zone Allocation\r\n                        <i class=\"fa ms-1 mt-1\" aria-hidden=\"true\"></i>\r\n                    </th>\r\n                </tr>\r\n            </thead>\r\n\r\n            <tbody>\r\n                <tr *ngFor=\"let item of mbqItems\">\r\n                    <td>{{item?.wall}}</td>\r\n                    <td>{{item?.ufn}}</td>\r\n                    <td>{{item?.brand}}</td>\r\n                    <td>{{item?.type}}</td>\r\n                    <td>{{item?.size}}</td>\r\n                    <td>{{item?.partition}}</td>\r\n                    <!-- <td>{{item?.displayPartition}}</td> -->\r\n                    <td>{{item?.standardCapacity}}</td>\r\n                    <!-- <td>{{item?.actualCapacity}}</td> -->\r\n                    <td *ngFor=\"let zone of zoneColumns\">{{item?.zoneAllocations?.[zone]?.join(', ') || '-'}}</td>\r\n                </tr>\r\n            </tbody>\r\n        </table>\r\n    </div>\r\n\r\n    <div class=\"modal-actions\">\r\n        <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n        <button type=\"button\" class=\"btn btn-primary\" (click)=\"scheduleTask()\">\r\n            {{showInfoBanner ? 'Schedule Task':'Publish Task' }}\r\n\r\n        </button>\r\n    </div>\r\n</div>","import {\r\n  AbstractControl,\r\n  ValidationErrors,\r\n  ValidatorFn,\r\n  FormArray,\r\n} from \"@angular/forms\";\r\n\r\nexport const removeEmptyFields = (obj: any): any => {\r\n  if (Array.isArray(obj)) {\r\n    return obj\r\n      .map((item) => removeEmptyFields(item))\r\n      .filter((item) => item !== null && item !== undefined && item !== \"\");\r\n  } else if (typeof obj === \"object\" && obj !== null) {\r\n    const result: any = {};\r\n    for (const key in obj) {\r\n      if (obj.hasOwnProperty(key)) {\r\n        const value = removeEmptyFields(obj[key]);\r\n        if (value !== null && value !== undefined && value !== \"\") {\r\n          result[key] = value;\r\n        }\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n  return obj;\r\n};\r\n\r\nexport const rgbToHex = (rgb?: string): string => {\r\n  if (!rgb) return \"#fff\";\r\n  const result = rgb\r\n    .replace(/\\s+/g, \"\") // remove spaces\r\n    .match(/^rgba?\\((\\d+),(\\d+),(\\d+)/i); // match r, g, b\r\n\r\n  if (!result) return \"#000000\"; // fallback\r\n\r\n  const r = parseInt(result[1]).toString(16).padStart(2, \"0\");\r\n  const g = parseInt(result[2]).toString(16).padStart(2, \"0\");\r\n  const b = parseInt(result[3]).toString(16).padStart(2, \"0\");\r\n\r\n  return `#${r}${g}${b}`.toUpperCase(); // optional: .toLowerCase()\r\n};\r\n\r\nexport const deepEqual = (a: any, b: any): boolean => {\r\n  if (a === b) {\r\n    return true;\r\n  }\r\n\r\n  if (typeof a !== typeof b) {\r\n    return false;\r\n  }\r\n\r\n  if (a === null || b === null) {\r\n    return a === b;\r\n  }\r\n\r\n  if (a instanceof Date && b instanceof Date) {\r\n    return a.getTime() === b.getTime();\r\n  }\r\n\r\n  if (typeof a === \"object\") {\r\n    if (Array.isArray(a)) {\r\n      if (!Array.isArray(b) || a.length !== b.length) {\r\n        return false;\r\n      }\r\n      for (let i = 0; i < a.length; i++) {\r\n        if (!deepEqual(a[i], b[i])) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    } else {\r\n      const aKeys = Object.keys(a);\r\n      const bKeys = Object.keys(b);\r\n      if (aKeys.length !== bKeys.length) {\r\n        return false;\r\n      }\r\n      for (const key of aKeys) {\r\n        if (!b.hasOwnProperty(key)) {\r\n          return false;\r\n        }\r\n        if (!deepEqual(a[key], b[key])) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    }\r\n  }\r\n\r\n  return false;\r\n};\r\n\r\nexport const generalValidator = (): ValidatorFn => {\r\n  return (control: AbstractControl) => {\r\n    const value = control.value;\r\n    if (!value) return null; // allow required validator to handle empty\r\n\r\n    const trimmed = value.trim();\r\n    if (trimmed.length === 0) {\r\n      // only whitespace\r\n      return { whitespace: true };\r\n    }\r\n    if (value !== trimmed) {\r\n      // leading or trailing whitespace\r\n      return { trimSpaces: true };\r\n    }\r\n    // Accept any characters otherwise\r\n    return null;\r\n  };\r\n};\r\n\r\nexport const getQueryParamNumber = ({\r\n  params,\r\n  key,\r\n  fallback,\r\n  min,\r\n  max,\r\n}: {\r\n  params: any;\r\n  key: string;\r\n  fallback: number;\r\n  min?: number;\r\n  max?: number;\r\n}): number => {\r\n  const value = Number(params?.get(key));\r\n\r\n  if (isNaN(value)) return fallback;\r\n  if (min !== undefined && value < min) return fallback;\r\n  if (max !== undefined && value > max) return fallback;\r\n\r\n  return value;\r\n};\r\n\r\nexport const getQueryParamString = ({\r\n  params,\r\n  key,\r\n  fallback,\r\n  allowed,\r\n}: {\r\n  params: any;\r\n  key: string;\r\n  fallback: string;\r\n  allowed?: string[];\r\n}): string => {\r\n  const value = params?.get(key);\r\n\r\n  if (typeof value !== \"string\") return fallback;\r\n  if (allowed && !allowed.includes(value)) return fallback;\r\n\r\n  return value;\r\n};\r\n\r\nexport function uniqueFieldInFormArrayValidator(\r\n  fieldName: string,\r\n): ValidatorFn {\r\n  return (formArray: AbstractControl): ValidationErrors | null => {\r\n    if (!(formArray instanceof FormArray)) return null;\r\n\r\n    const values = formArray.controls\r\n      .map((ctrl) => ctrl.get(fieldName)?.value?.trim?.())\r\n      .filter((v): v is string => !!v);\r\n\r\n    const duplicates = values.filter((val, idx) => values.indexOf(val) !== idx);\r\n\r\n    if (duplicates.length) {\r\n      // Mark duplicates individually\r\n      formArray.controls.forEach((ctrl) => {\r\n        const control = ctrl.get(fieldName);\r\n        if (control) {\r\n          if (duplicates.includes(control.value?.trim?.())) {\r\n            control.setErrors({ ...(control.errors || {}), notUnique: true });\r\n          } else if (control.errors?.[\"notUnique\"]) {\r\n            // Remove only notUnique error\r\n            const { notUnique, ...rest } = control.errors;\r\n            control.setErrors(Object.keys(rest).length ? rest : null);\r\n          }\r\n        }\r\n      });\r\n      return { notUnique: true };\r\n    }\r\n\r\n    // Clear if fixed\r\n    formArray.controls.forEach((ctrl) => {\r\n      const control = ctrl.get(fieldName);\r\n      if (control?.errors?.[\"notUnique\"]) {\r\n        const { notUnique, ...rest } = control.errors;\r\n        control.setErrors(Object.keys(rest).length ? rest : null);\r\n      }\r\n    });\r\n\r\n    return null;\r\n  };\r\n}\r\n\r\nexport const getNameFromEmail = (email: string) => {\r\n  if (!email || !email.includes(\"@\")) return \"\";\r\n\r\n  return email\r\n    .split(\"@\")[0] // take local part\r\n    .replace(/[._-]+/g, \" \") // replace separators\r\n    .replace(/\\d+/g, \"\") // remove numbers\r\n    .trim()\r\n    .replace(/\\b\\w/g, (c) => c.toUpperCase()); // capitalize\r\n};\r\n\r\nexport const indianPincodeValidator = (): ValidatorFn => {\r\n  return (control: AbstractControl): ValidationErrors | null => {\r\n    const value = control.value;\r\n\r\n    if (!value) return null; // let required handle empty\r\n\r\n    const trimmed = value.trim();\r\n\r\n    // whitespace-only\r\n    if (trimmed.length === 0) {\r\n      return { whitespace: true };\r\n    }\r\n\r\n    // leading or trailing spaces\r\n    if (value !== trimmed) {\r\n      return { trimSpaces: true };\r\n    }\r\n\r\n    // must be exactly 6 digits & not start with 0\r\n    const pincodeRegex = /^[1-9][0-9]{5}$/;\r\n\r\n    if (!pincodeRegex.test(trimmed)) {\r\n      return { invalidPincode: true };\r\n    }\r\n\r\n    return null;\r\n  };\r\n};\r\n\r\nexport const getFixtureCanvasLabel = (fixture: any): string => {\r\n  if (!fixture) return \"\";\r\n  return [\r\n    fixture.templateGroupName,\r\n    fixture.fixtureCategory,\r\n    fixture.fixtureWidth?.value,\r\n    fixture.fixtureWidth?.unit,\r\n  ]\r\n    .filter((v) => v !== null && v !== undefined && v !== \"\")\r\n    .join(\"-\");\r\n};\r\n\r\n/**\r\n * Computes a fixture's product capacity as the live sum of its individual\r\n * shelf capacities, mirroring the backend rule: a tray holds\r\n * productPerShelf x trayRows, a plain shelf holds productPerShelf, and\r\n * VM-only shelves carry no products. Always derive the displayed \"Products\"\r\n * count from this (the shelf config) rather than the stored fixtureCapacity,\r\n * which can be stale relative to the current shelves.\r\n */\r\nexport const getFixtureProductCapacity = (shelfConfig: any): number => {\r\n  if (!Array.isArray(shelfConfig)) return 0;\r\n  return shelfConfig.reduce((total: number, shelf: any) => {\r\n    if (!shelf || shelf.shelfType === \"vmonly\") return total;\r\n    const perShelf = Number(shelf.productPerShelf) || 0;\r\n    if (shelf.shelfType === \"tray\") {\r\n      return total + perShelf * (Number(shelf.trayRows) || 0);\r\n    }\r\n    return total + perShelf;\r\n  }, 0);\r\n};\r\n\r\nexport const lightenColor = (hex: string, amount = 0.3) => {\r\n  if (!hex) return hex;\r\n\r\n  const num = parseInt(hex.slice(1), 16);\r\n  let r = num >> 16;\r\n  let g = (num >> 8) & 255;\r\n  let b = num & 255;\r\n\r\n  r = Math.round(r + (255 - r) * amount);\r\n  g = Math.round(g + (255 - g) * amount);\r\n  b = Math.round(b + (255 - b) * amount);\r\n\r\n  return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\r\n};\r\n","import { Injectable } from \"@angular/core\";\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\n\n/**\n * Opens the read-only DXF source viewer for a floor.\n *\n * The viewer component (and its heavy dxf-viewer/three dependencies) is loaded via\n * dynamic import so it only enters the bundle as a lazy chunk when a user actually\n * opens it. Any planogram screen can inject this and call `open()`.\n */\n@Injectable({ providedIn: \"root\" })\nexport class CadSourceService {\n  constructor(private ngbModal: NgbModal) {}\n\n  /** True when there is at least one source CAD file to show (gates the button). */\n  hasSource(cadFiles: any[] | undefined | null): boolean {\n    return Array.isArray(cadFiles) && cadFiles.length > 0;\n  }\n\n  async open(storeName: string, cadFiles: any[]): Promise<void> {\n    if (!this.hasSource(cadFiles)) return;\n\n    const { DxfSourceViewerComponent } = await import(\n      \"../components/dxf-source-viewer/dxf-source-viewer.component\"\n    );\n\n    const ref = this.ngbModal.open(DxfSourceViewerComponent, {\n      size: \"xl\",\n      centered: true,\n      scrollable: false,\n      windowClass: \"dxf-source-modal\",\n    });\n\n    ref.componentInstance.storeName = storeName;\n    ref.componentInstance.cadFiles = cadFiles;\n  }\n}\n","import {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  Output,\r\n  Provider,\r\n  SimpleChanges,\r\n  ViewChild,\r\n  forwardRef\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CommonModule, NgClass, NgFor, NgIf } from '@angular/common';\r\n\r\nconst SELECT_CONTROL_VALUE_ACCESSOR: Provider = {\r\n  provide: NG_VALUE_ACCESSOR,\r\n  useExisting: forwardRef(() => ReactiveSelectComponent),\r\n  multi: true,\r\n};\r\n\r\n@Component({\r\n  selector: 'lib-reactive-select',\r\n  templateUrl: './reactive-select.component.html',\r\n  styleUrl: './reactive-select.component.scss',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    NgClass,\r\n    NgIf,\r\n    NgFor,\r\n    FormsModule\r\n  ],\r\n  providers: [SELECT_CONTROL_VALUE_ACCESSOR]\r\n})\r\nexport class ReactiveSelectComponent implements ControlValueAccessor, OnChanges {\r\n  @Input() idField: string\r\n  @Input() nameField: string\r\n  @Input() subTextField?: string\r\n  @Input() searchField: string;\r\n  @Input() label: string\r\n  @Input() data: any\r\n  @Input() action: boolean = false;\r\n  @Input() search: boolean = false;\r\n  @Input() prefix: boolean = false;\r\n  @Input() actionLabel: string = \"Add\";\r\n\r\n  /**\r\n   * Locks the control (greyed, non-clickable) while KEEPING the bound reactive\r\n   * control enabled — so its value still appears in the parent's `form.value`.\r\n   * Use this instead of `formControl.disable()` when a value must stay captured\r\n   * on submit but the field should be read-only. OR-combined with the CVA's own\r\n   * disabled state so neither source overrides the other.\r\n   */\r\n  @Input()\r\n  set disabled(value: boolean) {\r\n    this._disabledByInput = !!value;\r\n    this.isDisabled = this._disabledByInput || this._disabledByCva;\r\n  }\r\n  get disabled(): boolean {\r\n    return this._disabledByInput;\r\n  }\r\n  private _disabledByInput = false;\r\n  private _disabledByCva = false;\r\n\r\n  @Output() actionClick = new EventEmitter<any>();\r\n  @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\r\n\r\n  items: any[] = [];\r\n  visibleItems: any[] = [];\r\n  private readonly renderChunkSize = 100;\r\n\r\n  private onTouched: Function;\r\n  private onChanged: Function;\r\n\r\n  protected isDisabled: boolean;\r\n  protected isOpened: boolean = false\r\n  protected selected: Record<string, any> | null = null\r\n  protected selectedId: string | number;\r\n\r\n  searchTerm: string = '';\r\n\r\n  static activeSelect: ReactiveSelectComponent | null = null;\r\n\r\n  constructor(private cd: ChangeDetectorRef) { }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.searchField ??= this.nameField;\r\n    this.items = Array.isArray(this.data) ? [...this.data] : [];\r\n    this.resetVisibleItems();\r\n    if (this.selectedId !== undefined && this.selectedId !== null) {\r\n      this.selected =\r\n        this.items.find(\r\n          (item: Record<string, any>) => item?.[this.idField] === this.selectedId,\r\n        ) || null;\r\n    }\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent) {\r\n    if (this.isDisabled) return;\r\n\r\n    const target = event.target as HTMLElement;\r\n    if (!this.isComponentClicked(target)) {\r\n      this.isOpened = false;\r\n      if (ReactiveSelectComponent.activeSelect === this) {\r\n        ReactiveSelectComponent.activeSelect = null;\r\n      }\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  toggleDropdown() {\r\n    this.isOpened = !this.isOpened;\r\n\r\n    if (this.isOpened) {\r\n      if (\r\n        ReactiveSelectComponent.activeSelect &&\r\n        ReactiveSelectComponent.activeSelect !== this\r\n      ) {\r\n        ReactiveSelectComponent.activeSelect.isOpened = false;\r\n        ReactiveSelectComponent.activeSelect.cd.detectChanges();\r\n      }\r\n      ReactiveSelectComponent.activeSelect = this;\r\n      this.resetVisibleItems();\r\n      this.focusSearchInput();\r\n    } else {\r\n      ReactiveSelectComponent.activeSelect = null;\r\n    }\r\n  }\r\n\r\n  private focusSearchInput() {\r\n    if (!this.search) return;\r\n\r\n    setTimeout(() => {\r\n      this.searchInput?.nativeElement.focus();\r\n    }, 0);\r\n  }\r\n\r\n  writeValue(val: string | number): void {\r\n    setTimeout(() => {\r\n      this.selectedId = val\r\n      this.selected = this.items.find((item: Record<string, any>) => item?.[this.idField] === val) || null;\r\n      this.cd.detectChanges()\r\n    }, 0);\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChanged = fn\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn\r\n  }\r\n\r\n  setDisabledState?(isDisabled: boolean): void {\r\n    this._disabledByCva = isDisabled;\r\n    this.isDisabled = this._disabledByInput || this._disabledByCva;\r\n  }\r\n\r\n  onSelect(item: Record<string, any>) {\r\n    this.onTouched()\r\n    this.selected = item\r\n    this.selectedId = item?.[this.idField]\r\n    this.isOpened = false\r\n    ReactiveSelectComponent.activeSelect = null;\r\n    this.onChanged(this.selectedId)\r\n  }\r\n\r\n  isComponentClicked(targetElement: HTMLElement): boolean {\r\n    if (!targetElement) return false;\r\n    if (targetElement.classList.contains('custom-select')) {\r\n      return true;\r\n    }\r\n    if (targetElement.parentElement) {\r\n      return this.isComponentClicked(targetElement.parentElement);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  onClickAction() {\r\n    if (this.action) {\r\n      this.actionClick.emit(\"\");\r\n    }\r\n  }\r\n\r\n  onSearch() {\r\n    const sourceData = Array.isArray(this.data) ? this.data : [];\r\n\r\n    if (this.searchTerm) {\r\n      const search = this.searchTerm.toLowerCase().replace(/\\s+/g, '');\r\n\r\n      this.items = sourceData.filter((e: any) => {\r\n        const source1 = (e[this.searchField] ?? '')\r\n          .toLowerCase()\r\n          .replace(/\\s+/g, '');\r\n\r\n        const source2 = this.subTextField\r\n          ? (e[this.subTextField] ?? '').toLowerCase().replace(/\\s+/g, '')\r\n          : '';\r\n\r\n        return source1.includes(search) || source2.includes(search);\r\n      });\r\n    } else {\r\n      this.items = [...sourceData];\r\n    }\r\n\r\n    this.resetVisibleItems();\r\n  }\r\n\r\n  onListScroll(event: Event) {\r\n    const list = event.target as HTMLElement;\r\n    if (!list) return;\r\n\r\n    const threshold = 24;\r\n    const reachedBottom =\r\n      list.scrollTop + list.clientHeight >= list.scrollHeight - threshold;\r\n\r\n    if (!reachedBottom) return;\r\n    if (this.visibleItems.length >= this.items.length) return;\r\n\r\n    const nextItems = this.items.slice(\r\n      this.visibleItems.length,\r\n      this.visibleItems.length + this.renderChunkSize,\r\n    );\r\n    this.visibleItems = [...this.visibleItems, ...nextItems];\r\n  }\r\n\r\n  trackByItem = (index: number, item: any) => {\r\n    return item?.[this.idField] ?? index;\r\n  };\r\n\r\n  private resetVisibleItems() {\r\n    if (!this.items.length) {\r\n      this.visibleItems = [];\r\n      return;\r\n    }\r\n\r\n    this.visibleItems = this.items.slice(0, this.renderChunkSize);\r\n  }\r\n}\r\n","<div class=\"custom-select\">\r\n  <div class=\"form-group\">\r\n    <label *ngIf=\"label\" class=\"form-label\">{{ label }}</label>\r\n    <div class=\"position-relative\">\r\n      @if(prefix){\r\n      <span class=\"search-icon\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n          <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n          <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n        </svg>\r\n      </span>\r\n      }\r\n\r\n      <div\r\n        (click)=\"toggleDropdown()\"\r\n        [ngClass]=\"isDisabled ? 'disable' : ''\"\r\n        class=\"form-select dropselect\"\r\n        [ngStyle]=\"{ 'padding-left': prefix ? '3rem' : '1rem' }\"\r\n      >\r\n        {{ selected?.[nameField]}}\r\n      </div>\r\n\r\n      <div *ngIf=\"isOpened\" class=\"card pb-0 py-2 w-100 position-absolute end-0 z-1\">\r\n        <ul class=\"list-unstyled mb-2 drop-list\" (scroll)=\"onListScroll($event)\">\r\n          <li class=\"p-2\" *ngIf=\"search && data?.length\">\r\n            <input #searchInput class=\"form-control\" placeholder=\"Search\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearch()\" />\r\n          </li>\r\n          <li\r\n            *ngFor=\"let item of visibleItems; trackBy: trackByItem\"\r\n            (click)=\"onSelect(item)\"\r\n            [ngClass]=\"item?.[idField] === selected?.[idField] ? 'active' : ''\"\r\n            [class.disabled-click]=\"item?.disabled\"\r\n            class=\"text px-5 items cursor-pointer py-4\"\r\n          >\r\n            {{ item?.[nameField]}}\r\n            <br *ngIf=\"subTextField\" />\r\n            <span *ngIf=\"subTextField\" class=\"subText\">\r\n              {{ item?.[subTextField] }}\r\n            </span>\r\n          </li>\r\n          <li *ngIf=\"items.length === 0\" class=\"text px-5 py-4 text-center\">No data</li>\r\n        </ul>\r\n        <ul *ngIf=\"action\" class=\"list-unstyled m-0\">\r\n          <li (click)=\"onClickAction()\" class=\"action-item text px-5 items cursor-pointer py-4\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n              <path\r\n                d=\"M9.99935 4.16666V15.8333M4.16602 10H15.8327\"\r\n                stroke=\"#667085\"\r\n                stroke-width=\"1.66667\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </svg>\r\n            {{ actionLabel }}\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n  selector: 'counter-input',\r\n  templateUrl: './counter-input.component.html',\r\n  styleUrl: './counter-input.component.scss',\r\n  standalone: true,\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => CounterInputComponent),\r\n      multi: true\r\n    }\r\n  ],\r\n})\r\nexport class CounterInputComponent implements ControlValueAccessor {\r\n  @Input() step: number = 1;\r\n  @Input() placeholder: string = '0';\r\n  @Input() max: number = 2;\r\n\r\n  @Output() onIncrement = new EventEmitter<any>();\r\n  @Output() onDecrement = new EventEmitter<any>();\r\n\r\n  value: number = 0;\r\n  disabled = false;\r\n\r\n  onChange = (value: number) => { };\r\n  onTouched = () => { };\r\n\r\n  increment() {\r\n    if (!this.disabled) {\r\n      this.value += this.step;\r\n      this.onChange(this.value);\r\n      this.onIncrement.emit(this.value);\r\n    }\r\n  }\r\n\r\n  decrement() {\r\n    if (!this.disabled) {\r\n      if (this.value <= 0) return;\r\n      this.value -= this.step;\r\n      this.onChange(this.value);\r\n      this.onDecrement.emit(this.value);\r\n    }\r\n  }\r\n\r\n  onInput(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    input.value = input.value.replace(/[^0-9]/g, '');\r\n    input.value = input.value.slice(0, this.max);\r\n    const val = Number(input.value);\r\n    this.value = isNaN(val) ? 0 : val;\r\n    this.onChange(this.value);\r\n  }\r\n\r\n\r\n  // ControlValueAccessor interface methods\r\n  writeValue(value: number): void {\r\n    this.value = value || 0;\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState?(isDisabled: boolean): void {\r\n    this.disabled = isDisabled;\r\n  }\r\n}\r\n","<div class=\"counter-container\" [class.disable-counter]=\"disabled\">\r\n  <svg\r\n    role=\"button\"\r\n    width=\"15\"\r\n    height=\"14\"\r\n    viewBox=\"0 0 15 14\"\r\n    fill=\"none\"\r\n    xmlns=\"http://www.w3.org/2000/svg\"\r\n    (click)=\"decrement()\"\r\n  >\r\n    <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n  </svg>\r\n\r\n  <input\r\n    type=\"text\"\r\n    inputmode=\"numeric\"\r\n    pattern=\"[0-9]*\"\r\n    [value]=\"value\"\r\n    (maxlength)=\"(max)\"\r\n    [placeholder]=\"placeholder\"\r\n    [disabled]=\"disabled\"\r\n    (input)=\"onInput($event)\"\r\n    (blur)=\"onTouched()\"\r\n    class=\"center\"\r\n  />\r\n\r\n  <svg\r\n    role=\"button\"\r\n    width=\"15\"\r\n    height=\"14\"\r\n    viewBox=\"0 0 15 14\"\r\n    fill=\"none\"\r\n    xmlns=\"http://www.w3.org/2000/svg\"\r\n    (click)=\"increment()\"\r\n  >\r\n    <path\r\n      d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n      stroke=\"#667085\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n</div>\r\n","import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  Output,\r\n  SimpleChanges,\r\n  OnDestroy,\r\n} from \"@angular/core\";\r\nimport {\r\n  Form,\r\n  FormArray,\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FixtureTemplateDetails } from \"../../../interfaces/fixture-template.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { CounterInputComponent } from \"../../counter-input/counter-input.component\";\r\nimport { generalValidator } from \"../../../functions/plano.function\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { ReactiveSelectComponent } from \"../../reactive-select/reactive-select.component\";\r\n\r\n@Component({\r\n  selector: \"lib-instance-basic-details\",\r\n  templateUrl: \"./template-basic-details.component.html\",\r\n  styleUrl: \"./template-basic-details.component.scss\",\r\n  imports: [\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    CounterInputComponent,\r\n    ReactiveSelectComponent,\r\n  ],\r\n  standalone: true,\r\n})\r\nexport class InstanceBasicDetailsComponent implements OnChanges, OnDestroy {\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  fixtureTemplateBasicDetailsForm: FormGroup;\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n\r\n  @Input() fixtureData: any;\r\n  @Input() editMode: boolean;\r\n  @Input() isSubmitted: boolean;\r\n  @Input() revertOnEdit: boolean = false;\r\n  @Input() zoneEditMode: boolean = false;\r\n  @Input() libraryCategories: string[] = [];\r\n  @Input() libraryByCategory: Map<string, Set<number>> = new Map();\r\n  @Input() allowCategoryAndWidthEdit: boolean = false;\r\n  @Output() submitEvent = new EventEmitter<boolean>();\r\n  initialState: any = 0;\r\n\r\n  readonly shelfTypes: DropdownIF[] = [\r\n    { label: \"Shelf\", value: \"shelf\" },\r\n    { label: \"Tray\", value: \"tray\" },\r\n    { label: \"VM Only\", value: \"vmonly\" },\r\n  ];\r\n\r\n  categoryOptions: DropdownIF[] = [];\r\n  widthOptions: DropdownIF[] = [];\r\n\r\n  // The initial fixture values are displayed as a \"hidden\" <option> when they\r\n  // don't exist in the library — keeps the value visible in the control's\r\n  // selected display but absent from the dropdown's open list. Cleared once\r\n  // the user changes the value.\r\n  originalCategory: string | null = null;\r\n  originalWidth: number | null = null;\r\n  showOriginalCategoryOption: boolean = false;\r\n  showOriginalWidthOption: boolean = false;\r\n  originalWidthLabel: string = \"\";\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private toast: ToastService,\r\n    private storeBuilderService: StoreBuilderService\r\n  ) {}\r\n\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"fixtureData\"]) {\r\n      this.isPageLoading = true;\r\n      this.fixtureTemplateDetails = changes[\"fixtureData\"].currentValue;\r\n      this.initializeForm();\r\n    }\r\n    if (changes[\"editMode\"]) {\r\n      this.isEditMode = changes[\"editMode\"].currentValue;\r\n      if (this.isEditMode) {\r\n        this.fixtureTemplateBasicDetailsForm?.enable({ emitEvent: false });\r\n      }\r\n    }\r\n    if (changes[\"isSubmitted\"]) {\r\n      if (changes[\"isSubmitted\"].currentValue) {\r\n        this.submitForm();\r\n      }\r\n    }\r\n    if (\r\n      changes[\"fixtureData\"] ||\r\n      changes[\"libraryCategories\"] ||\r\n      changes[\"libraryByCategory\"]\r\n    ) {\r\n      this.recomputeCategoryOptions();\r\n      this.recomputeWidthOptions(\r\n        this.fixtureTemplateBasicDetailsForm?.get(\"fixtureCategory\")?.value,\r\n      );\r\n      this.updateOriginalOptionVisibility();\r\n    }\r\n  }\r\n\r\n  private updateOriginalOptionVisibility(): void {\r\n    this.showOriginalCategoryOption =\r\n      !!this.originalCategory &&\r\n      !this.libraryCategories?.includes(this.originalCategory);\r\n\r\n    this.showOriginalWidthOption =\r\n      this.originalWidth != null &&\r\n      !this.widthOptions.some((w) => w.value === this.originalWidth);\r\n\r\n    if (this.originalWidth != null) {\r\n      const widthUnit =\r\n        this.fixtureTemplateDetails?.fixtureWidth?.unit ?? \"\";\r\n      this.originalWidthLabel = `${this.originalWidth} ${widthUnit}`.trim();\r\n    } else {\r\n      this.originalWidthLabel = \"\";\r\n    }\r\n  }\r\n\r\n  // Category dropdown is strictly library values — if the fixture's current\r\n  // category isn't in the library, it won't appear here; the dropdown will\r\n  // render unselected to force the user to pick a valid one.\r\n  private recomputeCategoryOptions(): void {\r\n    this.categoryOptions = (this.libraryCategories ?? [])\r\n      .slice()\r\n      .sort()\r\n      .map((c) => ({ label: c, value: c }));\r\n  }\r\n\r\n  // Width dropdown is filtered to widths available for the currently-selected\r\n  // category in the form. If no category is selected (or it's not in the\r\n  // library), no width options are shown.\r\n  private recomputeWidthOptions(selectedCategory: string | null | undefined): void {\r\n    const widthUnit = this.fixtureTemplateDetails?.fixtureWidth?.unit ?? \"\";\r\n    const widths = selectedCategory\r\n      ? this.libraryByCategory?.get(selectedCategory)\r\n      : null;\r\n    if (!widths) {\r\n      this.widthOptions = [];\r\n      return;\r\n    }\r\n    this.widthOptions = Array.from(widths)\r\n      .sort((a, b) => a - b)\r\n      .map((w) => ({ label: `${w} ${widthUnit}`.trim(), value: w }));\r\n  }\r\n\r\n  initializeForm() {\r\n    this.fixtureTemplateBasicDetailsForm = this.fb.group({\r\n      description: [\r\n        this.fixtureTemplateDetails?.description ?? \"\",\r\n        generalValidator(),\r\n      ],\r\n      fixtureCategory: [\r\n        this.fixtureTemplateDetails?.fixtureCategory ?? null,\r\n        Validators.required,\r\n      ],\r\n      fixtureWidthValue: [\r\n        this.fixtureTemplateDetails?.fixtureWidth?.value ?? null,\r\n        Validators.required,\r\n      ],\r\n      headerLabel: [\r\n        this.fixtureTemplateDetails?.header?.label,\r\n        [Validators.required, generalValidator()],\r\n      ],\r\n      shelf: this.fb.array([]),\r\n      footerLabel: [\r\n        this.fixtureTemplateDetails?.footer?.label,\r\n        generalValidator(),\r\n      ],\r\n      templateGroupName: [\r\n        this.fixtureTemplateDetails?.templateGroupName,\r\n        generalValidator(),\r\n      ],\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.shelfConfig?.forEach((i) => this.addShelf(i));\r\n\r\n    this.originalCategory =\r\n      this.fixtureTemplateDetails?.fixtureCategory ?? null;\r\n    this.originalWidth =\r\n      this.fixtureTemplateDetails?.fixtureWidth?.value ?? null;\r\n    this.updateOriginalOptionVisibility();\r\n\r\n    this.fixtureTemplateBasicDetailsForm\r\n      .get(\"fixtureCategory\")\r\n      ?.valueChanges.subscribe((category: string) => {\r\n        if (category !== this.originalCategory) {\r\n          this.originalCategory = null;\r\n        }\r\n        this.recomputeWidthOptions(category);\r\n        const widthControl =\r\n          this.fixtureTemplateBasicDetailsForm.get(\"fixtureWidthValue\");\r\n        const currentWidth = widthControl?.value;\r\n        const validWidths = category ? this.libraryByCategory?.get(category) : null;\r\n        if (\r\n          currentWidth != null &&\r\n          (!validWidths || !validWidths.has(currentWidth))\r\n        ) {\r\n          widthControl?.setValue(null);\r\n        }\r\n        this.updateOriginalOptionVisibility();\r\n      });\r\n\r\n    this.fixtureTemplateBasicDetailsForm\r\n      .get(\"fixtureWidthValue\")\r\n      ?.valueChanges.subscribe((width: number) => {\r\n        if (width !== this.originalWidth) {\r\n          this.originalWidth = null;\r\n        }\r\n        this.updateOriginalOptionVisibility();\r\n      });\r\n\r\n    if (!this.isEditMode)\r\n      this.fixtureTemplateBasicDetailsForm?.disable({ emitEvent: false });\r\n    this.isPageLoading = false;\r\n  }\r\n\r\n  addShelf(shelf?: any) {\r\n    const shelfGroup = this.fb.group({\r\n      shelfType: [shelf?.shelfType ?? \"shelf\"],\r\n      productPerShelf: [shelf?.productPerShelf ?? 1],\r\n      trayRows: [shelf?.trayRows ?? 1],\r\n    });\r\n    this.updateProductPerShelfMinValidator(\r\n      shelfGroup,\r\n      shelfGroup.get(\"shelfType\")?.value\r\n    );\r\n    this.setupShelfTypeListener(shelfGroup);\r\n    this.shelfArray.push(shelfGroup);\r\n  }\r\n\r\n  setupShelfTypeListener(shelfGroup: FormGroup) {\r\n    let previousType = shelfGroup.get(\"shelfType\")?.value;\r\n    shelfGroup.get(\"shelfType\")?.valueChanges.subscribe((type) => {\r\n      const productPerShelfControl = shelfGroup.get(\"productPerShelf\");\r\n      if (type === \"vmonly\") {\r\n        productPerShelfControl?.setValue(0);\r\n      } else if (previousType === \"vmonly\") {\r\n        productPerShelfControl?.setValue(1);\r\n      }\r\n      previousType = type;\r\n\r\n      this.updateProductPerShelfMinValidator(shelfGroup, type);\r\n      const noOfRowsControl = shelfGroup.get(\"noOfRows\");\r\n      if (type === \"tray\") {\r\n        noOfRowsControl?.setValidators([\r\n          Validators.required,\r\n          Validators.min(1),\r\n        ]);\r\n        noOfRowsControl?.setValue(1);\r\n      } else {\r\n        noOfRowsControl?.clearValidators();\r\n        noOfRowsControl?.setValue(null);\r\n      }\r\n      noOfRowsControl?.updateValueAndValidity();\r\n    });\r\n  }\r\n\r\n  updateProductPerShelfMinValidator(shelfGroup: FormGroup, shelfType: string) {\r\n    const productPerShelfControl = shelfGroup.get(\"productPerShelf\");\r\n    const minValue = shelfType === \"vmonly\" ? 0 : 1;\r\n\r\n    productPerShelfControl?.setValidators([Validators.min(minValue)]);\r\n    productPerShelfControl?.updateValueAndValidity({ emitEvent: false });\r\n  }\r\n\r\n  // If index is not given, last shelf should be removed\r\n  removeShelf(index: number = this.shelfArray.controls.length - 1) {\r\n    this.shelfArray.removeAt(index);\r\n  }\r\n\r\n  get shelfArray(): FormArray {\r\n    return this.fixtureTemplateBasicDetailsForm.get(\"shelf\") as FormArray;\r\n  }\r\n\r\n  get totalProductCapacity(): number {\r\n    return this.shelfArray.controls.reduce((total, item) => {\r\n      const count = item.get(\"productPerShelf\")?.value || 0;\r\n      const isTray = item.get(\"shelfType\")?.value === \"tray\";\r\n      const rows = item.get(\"trayRows\")?.value || 1;\r\n\r\n      // If the fixture is a floor panel or tray, we need to multiply the product capacity by the number of rows\r\n      return (\r\n        total +\r\n        (isTray || this.fixtureTemplateDetails?.fixtureType === \"floor\"\r\n          ? count * rows\r\n          : count)\r\n      );\r\n    }, 0);\r\n  }\r\n\r\n  submitForm() {\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    if (this.fixtureTemplateBasicDetailsForm.invalid) {\r\n      this.fixtureTemplateBasicDetailsForm.markAllAsTouched();\r\n      this.toast.getErrorToast(\"Form is invalid\");\r\n      return;\r\n    }\r\n\r\n    if (this.fixtureTemplateBasicDetailsForm.valid) {\r\n      this.validateFixtureData();\r\n      const payload: FixtureTemplateDetails = {\r\n        ...this.fixtureTemplateDetails,\r\n        description: this.fixtureTemplateBasicDetailsForm.value.description,\r\n        ...(this.allowCategoryAndWidthEdit && {\r\n          fixtureCategory:\r\n            this.fixtureTemplateBasicDetailsForm.value.fixtureCategory,\r\n          fixtureWidth: {\r\n            ...this.fixtureTemplateDetails.fixtureWidth,\r\n            value:\r\n              this.fixtureTemplateBasicDetailsForm.value.fixtureWidthValue,\r\n          },\r\n        }),\r\n        header: {\r\n          ...this.fixtureTemplateDetails.header,\r\n          label: this.fixtureTemplateBasicDetailsForm.value.headerLabel,\r\n        },\r\n        footer: {\r\n          ...this.fixtureTemplateDetails.footer,\r\n          label: this.fixtureTemplateBasicDetailsForm.value.footerLabel,\r\n        },\r\n        fixtureCapacity: this.totalProductCapacity,\r\n        templateGroupName:\r\n          this.fixtureTemplateBasicDetailsForm.value.templateGroupName,\r\n        shelfConfig: this.fixtureTemplateBasicDetailsForm.value.shelf.map(\r\n          (ele: any, index: any) => {\r\n            ele.shelfNumber = index + 1;\r\n            ele = {\r\n              ...this?.fixtureTemplateDetails?.shelfConfig?.[index],\r\n              ...ele,\r\n            };\r\n            if (!ele?.productBrandName) {\r\n              if (this?.fixtureTemplateDetails?.shelfConfig?.[index - 1]) {\r\n                ele = {\r\n                  ...this?.fixtureTemplateDetails?.shelfConfig?.[index - 1],\r\n                  ...ele,\r\n                };\r\n              }\r\n            }\r\n            return ele;\r\n          }\r\n        ),\r\n        updatedAt: new Date(Date.now()).toISOString(),\r\n      };\r\n\r\n      const req = {\r\n        fixtureId: this.fixtureTemplateDetails._id,\r\n        data: payload,\r\n        ...(!this.fixtureData?.taskType && {\r\n          editMode: this.isEditMode,\r\n          revertOnEdit: this.revertOnEdit,\r\n        }),\r\n      };\r\n\r\n      this.storeBuilderService.updateStoreFixture(req).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.data?.id) {\r\n            let message = `Fixture updated successfully and template is created <a href='manage/planogram/fixture-template/basic-details?templateId=${res.data.id}&isEdit=false'>View</a>`;\r\n            this.toast.getSuccessToast(message);\r\n          } else {\r\n            this.toast.getSuccessToast(\"Fixture updated successfully\");\r\n          }\r\n          this.submitEvent.emit(true);\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  validateFixtureData() {\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((vm) => {\r\n      if ((vm?.startYPosition ?? 1) > (this.shelfArray.length ?? 1)) {\r\n        vm.startYPosition = this.shelfArray.length ?? 1;\r\n      }\r\n\r\n      if ((vm?.endYPosition ?? 1) > (this.shelfArray.length ?? 1)) {\r\n        vm.endYPosition = this.shelfArray.length ?? 1;\r\n      }\r\n    });\r\n  }\r\n\r\n  getShelfTitle(shelf: FormGroup, index: number): string {\r\n    const shelfType = shelf.get(\"shelfType\")?.value ?? \"panel\";\r\n    const label =\r\n      shelfType === \"vmonly\" ? \"vmonly SHELF\" : String(shelfType).toUpperCase();\r\n\r\n    return `${label} ${index + 1}`;\r\n  }\r\n\r\n  getFixtureLibrary(): string {\r\n    const d = this.fixtureTemplateDetails;\r\n    return `${d?.fixtureCategory} ${d?.fixtureWidth?.value} ${d?.fixtureWidth?.unit}`;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.submitEvent.emit(this.fixtureTemplateBasicDetailsForm.value);\r\n  }\r\n}\r\n","<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <div class=\"cols col\" style=\"max-width: 380px;\">\r\n      <h2>Fixture Details</h2>\r\n      <p>Configure your fixture details here</p>\r\n\r\n      <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n      <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n        <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n          <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n          <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n              Description cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n        <ng-container *ngIf=\"allowCategoryAndWidthEdit; else readonlyFixtureType\">\r\n          <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n            <label class=\"form-label mb-1\">Fixture type</label>\r\n            <select class=\"form-select\" formControlName=\"fixtureCategory\">\r\n              <option *ngIf=\"showOriginalCategoryOption\" [ngValue]=\"originalCategory\" hidden>{{ originalCategory }}</option>\r\n              <option *ngFor=\"let cat of categoryOptions\" [ngValue]=\"cat.value\">{{ cat.label }}</option>\r\n            </select>\r\n          </div>\r\n\r\n          <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n            <label class=\"form-label mb-1\">Fixture width</label>\r\n            <select class=\"form-select\" formControlName=\"fixtureWidthValue\">\r\n              <option *ngIf=\"showOriginalWidthOption\" [ngValue]=\"originalWidth\" hidden>{{ originalWidthLabel }}</option>\r\n              <option *ngFor=\"let w of widthOptions\" [ngValue]=\"w.value\">{{ w.label }}</option>\r\n            </select>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <ng-template #readonlyFixtureType>\r\n          <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n            <label for=\"fixtureCategoryReadonly\" class=\"form-label mb-1\">Select fixture type</label>\r\n            <input type=\"text\" class=\"form-control\" id=\"fixtureCategoryReadonly\"\r\n              [value]=\"getFixtureLibrary()\" readonly />\r\n          </div>\r\n        </ng-template>\r\n\r\n        <div class=\"form-group mb-4\" *ngIf=\"fixtureTemplateDetails?.header?.isEnabled\"\r\n          [class.disabled-click]=\"zoneEditMode\">\r\n          <label for=\"templateGroupName\" class=\"form-label mb-1\">Template Group</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"templateGroupName\" formControlName=\"templateGroupName\" />\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('templateGroupName')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('templateGroupName')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('whitespace')\">\r\n              Template group cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"form-group mb-4\" *ngIf=\"zoneEditMode || fixtureTemplateDetails?.header?.isEnabled\">\r\n          <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('required')\">\r\n              Header label is required.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n              Header label cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div formArrayName=\"shelf\" [class.disabled-click]=\"zoneEditMode\">\r\n          <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\r\n          <div class=\"mb-3\">\r\n            <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n              <label>No of shelves</label>\r\n              <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n                <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf();\">\r\n                  <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n                <span>{{ shelfArray.length }}</span>\r\n                <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf();\">\r\n                  <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n            <div class=\"shelf-container\">\r\n              <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                <p>\r\n                  {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n                  {{ i + 1 }}\r\n                </p>\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                  (click)=\"removeShelf(i)\" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\r\n                  <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n                formControlName=\"shelfType\">\r\n              </lib-reactive-select>\r\n              <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n                class=\"d-flex justify-content-between align-items-center mt-2\">\r\n                <p class=\"m-0\">No of Rows</p>\r\n                <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n                *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n                <label>Product capacity</label>\r\n                <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n                  placeholder=\"0\"></counter-input>\r\n              </div>\r\n              <ng-container *ngIf=\"\r\n                  shelf.get('shelfType')?.value !== 'vmonly' &&\r\n                  shelf.get('productPerShelf')?.touched &&\r\n                  shelf.get('productPerShelf')?.errors\r\n                \">\r\n                <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n                  Product capacity must be at least\r\n                  {{ shelf.get(\"shelfType\")?.value === \"vmonly\" ? \"0\" : \"1\" }}.\r\n                </small>\r\n              </ng-container>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <div class=\"form-group mb-4\"\r\n          *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n          [class.disabled-click]=\"zoneEditMode\">\r\n          <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n              Footer label cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n      </form>\r\n    </div>\r\n    <div class=\"cols col\">\r\n      <div class=\"d-flex justify-content-center\">\r\n        <!-- Vertical arrows -->\r\n        <div class=\"vertical-dimension\">\r\n          <div class=\"arrow up\"></div>\r\n          <div class=\"line\">\r\n            <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n          </div>\r\n          <div class=\"arrow down\"></div>\r\n        </div>\r\n\r\n        <div>\r\n          <!-- Horizontal arrows -->\r\n          <ng-container *ngTemplateOutlet=\"\r\n              dimensionArrows;\r\n              context: {\r\n                value: fixtureTemplateDetails?.fixtureWidth?.value\r\n              }\r\n            \"></ng-container>\r\n\r\n          <div class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <p>\r\n                {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n              </p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n              <div *ngFor=\"let item of shelfArray.controls; let i = index\" class=\"shelfContainer\">\r\n                @if(item.get('shelfType')?.value ==='tray'){\r\n                  <div class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value);let j=index\"\r\n                      class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                }@else {\r\n                  <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n                    </div>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <div class=\"sub-footer left-box\"></div>\r\n              <div class=\"sub-footer right-box\"></div>\r\n              <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","export const WALL_ZONES = [\r\n  { label: \"Top\", value: \"Top\" },\r\n  { label: \"Mid\", value: \"Mid\" },\r\n  { label: \"Bottom\", value: \"Bottom\" },\r\n];\r\n\r\nexport const FLOOR_ZONES = [\r\n  { label: \"All\", value: \"All\" },\r\n  { label: \"Top\", value: \"Top\" },\r\n  { label: \"Mid\", value: \"Mid\" },\r\n  { label: \"Bottom\", value: \"Bottom\" },\r\n];\r\n\r\nexport const SHELF_COLORS = [\r\n  { text: \"#009BF3\", textBg: \"#EAF8FF\", bg: \"#DAF1FF\", border: \"#99DAFF\" },\r\n  { text: \"#C11574\", textBg: \"#FDF2FA\", bg: \"#FEE4E2\", border: \"#FECDCA\" },\r\n  { text: \"#B54708\", textBg: \"#FFFAEB\", bg: \"#FEF0C7\", border: \"#FEDF89\" },\r\n  { text: \"#12B76A\", textBg: \"#ECFDF3\", bg: \"#D1FADF\", border: \"#A6F4C5\" },\r\n  { text: \"#1570EF\", textBg: \"#EFF8FF\", bg: \"#B2DDFF\", border: \"#84CAFF\" },\r\n  { text: \"#7F56D9\", textBg: \"#F4F3FF\", bg: \"#D9D6FE\", border: \"#C7BFFF\" },\r\n  { text: \"#C11574\", textBg: \"#FDF2FA\", bg: \"#FCCEEE\", border: \"#F9A8D4\" },\r\n  { text: \"#B93815\", textBg: \"#FFF6ED\", bg: \"#FDDCAB\", border: \"#FFEAD5\" },\r\n  { text: \"#027A48\", textBg: \"#F0FDF4\", bg: \"#CFFAE3\", border: \"#7FD8B3\" },\r\n  { text: \"#344054\", textBg: \"#F8F9FC\", bg: \"#E3E8F0\", border: \"#CBD5E1\" },\r\n  { text: \"#9E77ED\", textBg: \"#FAF8FF\", bg: \"#E2D4FE\", border: \"#C4B5FD\" },\r\n  { text: \"#3538CD\", textBg: \"#EEF4FF\", bg: \"#C3DAFE\", border: \"#A5BCFA\" },\r\n  { text: \"#C01048\", textBg: \"#FFF1F3\", bg: \"#FED3D9\", border: \"#FDA4AF\" },\r\n  { text: \"#DC6803\", textBg: \"#FFF7ED\", bg: \"#FFE0B2\", border: \"#FBBF77\" },\r\n  { text: \"#1C1C1C\", textBg: \"#F3F4F6\", bg: \"#D6D8DC\", border: \"#9CA3AF\" },\r\n  { text: \"#3E4784\", textBg: \"#F5F7FF\", bg: \"#CBD1FF\", border: \"#9BA3FF\" },\r\n  { text: \"#9A3412\", textBg: \"#FFFBF0\", bg: \"#FFE2B8\", border: \"#FFC187\" },\r\n  { text: \"#DC2626\", textBg: \"#FEF2F2\", bg: \"#FCA5A5\", border: \"#EF4444\" },\r\n  { text: \"#7E22CE\", textBg: \"#FAF5FF\", bg: \"#E9D5FF\", border: \"#C084FC\" },\r\n  { text: \"#0E7490\", textBg: \"#F0F9FF\", bg: \"#BAE6FD\", border: \"#38BDF8\" },\r\n  { text: \"#16A34A\", textBg: \"#F0FDF4\", bg: \"#BBF7D0\", border: \"#4ADE80\" },\r\n  { text: \"#BE123C\", textBg: \"#FFF1F2\", bg: \"#FECACA\", border: \"#FB7185\" },\r\n  { text: \"#713F12\", textBg: \"#FFFAF0\", bg: \"#FEEBC8\", border: \"#FCD34D\" },\r\n  { text: \"#3730A3\", textBg: \"#EEF2FF\", bg: \"#C7D2FE\", border: \"#A5B4FC\" },\r\n  { text: \"#4C0519\", textBg: \"#FFF1F3\", bg: \"#FAC0D5\", border: \"#F472B6\" },\r\n  { text: \"#475569\", textBg: \"#F8FAFC\", bg: \"#DCE6F2\", border: \"#B0C4DE\" },\r\n  { text: \"#059669\", textBg: \"#ECFDF5\", bg: \"#6EE7B7\", border: \"#34D399\" },\r\n  { text: \"#3B82F6\", textBg: \"#EFF6FF\", bg: \"#93C5FD\", border: \"#60A5FA\" },\r\n  { text: \"#F59E0B\", textBg: \"#FFFBEB\", bg: \"#FCD34D\", border: \"#FBBF24\" },\r\n  { text: \"#D97706\", textBg: \"#FFF7ED\", bg: \"#FDBA74\", border: \"#FB923C\" },\r\n];\r\n\r\nexport const FOOTFALL_HEATMAP_COLORS = [\r\n  { bg: \"#FCA5A5\", border: \"#EF4444\" },\r\n  { bg: \"#FDA4AF\", border: \"#F43F5E\" },\r\n  { bg: \"#FECACA\", border: \"#F87171\" },\r\n  { bg: \"#FECDD3\", border: \"#FB7185\" },\r\n  { bg: \"#FECDD3\", border: \"#E8798F\" },\r\n  { bg: \"#FBCFE8\", border: \"#EC4899\" },\r\n  { bg: \"#FEE2E2\", border: \"#FCA5A5\" },\r\n  { bg: \"#FFE4E6\", border: \"#FDA4AF\" },\r\n  { bg: \"#93C5FD\", border: \"#3B82F6\" },\r\n  { bg: \"#7DD3FC\", border: \"#0EA5E9\" },\r\n  { bg: \"#A5B4FC\", border: \"#6366F1\" },\r\n  { bg: \"#BFDBFE\", border: \"#60A5FA\" },\r\n  { bg: \"#BAE6FD\", border: \"#38BDF8\" },\r\n  { bg: \"#C7D2FE\", border: \"#818CF8\" },\r\n  { bg: \"#DBEAFE\", border: \"#93C5FD\" },\r\n  { bg: \"#E0E7FF\", border: \"#A5B4FC\" },\r\n  { bg: \"#86EFAC\", border: \"#22C55E\" },\r\n  { bg: \"#6EE7B7\", border: \"#10B981\" },\r\n  { bg: \"#BEF264\", border: \"#84CC16\" },\r\n  { bg: \"#BBF7D0\", border: \"#4ADE80\" },\r\n  { bg: \"#A7F3D0\", border: \"#34D399\" },\r\n  { bg: \"#D9F99D\", border: \"#A3E635\" },\r\n  { bg: \"#DCFCE7\", border: \"#86EFAC\" },\r\n  { bg: \"#D1FAE5\", border: \"#6EE7B7\" },\r\n];\r\n\r\nexport const PICKUP_HEATMAP_COLORS = [\r\n  { bg: \"#FCA5A5\", border: \"#EF4444\" },\r\n  { bg: \"#FECACA\", border: \"#F87171\" },\r\n  { bg: \"#93C5FD\", border: \"#3B82F6\" },\r\n  { bg: \"#BAE6FD\", border: \"#38BDF8\" },\r\n  { bg: \"#86EFAC\", border: \"#22C55E\" },\r\n  { bg: \"#BBF7D0\", border: \"#4ADE80\" },\r\n];\r\n\r\n// export const PICKUP_HEATMAP_COLORS = [\r\n//   { bg: \"#FCD6DA\", border: \"#E7D0D2\" },\r\n//   { bg: \"#FDEEDA\", border: \"#EDE6DC\" },\r\n//   { bg: \"#FCFFD5\", border: \"#E9EDCF\" },\r\n//   { bg: \"#D8E4FF\", border: \"#CED7EC\" },\r\n//   { bg: \"#E9FBFF\", border: \"#DFECEF\" },\r\n//   { bg: \"#e0f0ff\", border: \"#d7ecff\" },\r\n//   { bg: \"#f4ffe0\", border: \"#efffd0\" },\r\n// ];\r\n\r\n// export const FOOTFALL_HEATMAP_COLORS = [\r\n//   { bg: \"#FCD6DA\", border: \"#E7D0D2\" },\r\n//   { bg: \"#FEDED4\", border: \"#E1D0CB\" },\r\n//   { bg: \"#F5DFD0\", border: \"#DFD2CA\" },\r\n//   { bg: \"#FDEAD3\", border: \"#EBE2D8\" },\r\n//   { bg: \"#FDEEDA\", border: \"#EDE6DC\" },\r\n//   { bg: \"#FDEED8\", border: \"#EBE3D8\" },\r\n//   { bg: \"#FEF7D4\", border: \"#EFECDC\" },\r\n//   { bg: \"#FEFBD6\", border: \"#EFEED6\" },\r\n//   { bg: \"#FCFFD5\", border: \"#EBEDD6\" },\r\n//   { bg: \"#F9FFC9\", border: \"#E9EDCF\" },\r\n//   { bg: \"#E9FBFF\", border: \"#DFECEF\" },\r\n//   { bg: \"#DAF9FF\", border: \"#D1E8EC\" },\r\n//   { bg: \"#D9EDFF\", border: \"#D7E2EC\" },\r\n//   { bg: \"#D8E4FF\", border: \"#CED7EC\" },\r\n//   { bg: \"#D8DBFD\", border: \"#C5C8E6\" },\r\n//   { bg: \"#E0D9FF\", border: \"#D8D2EF\" },\r\n//   { bg: \"#DAD0FF\", border: \"#CEC7E9\" },\r\n//   { bg: \"#E9D7FE\", border: \"#DFD2EF\" },\r\n//   { bg: \"#FBE8FF\", border: \"#F2E4F4\" },\r\n//   { bg: \"#FAE2FF\", border: \"#EED8F2\" },\r\n//   { bg: \"#E2E6EB\", border: \"#DBE0E6\" },\r\n//   { bg: \"#EBEDEF\", border: \"#E2E6EB\" },\r\n//   { bg: \"#F0F2F4\", border: \"#EBEDEF\" },\r\n//   { bg: \"#FDFDFD\", border: \"#E0E0E0\" },\r\n// ];\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  forwardRef,\r\n  ElementRef,\r\n  HostListener,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n  selector: 'multiselect-chip-dropdown',\r\n  templateUrl: './multiselect-chip-dropdown.component.html',\r\n  styleUrls: ['./multiselect-chip-dropdown.component.scss'],\r\n  standalone: true,\r\n  imports: [\r\n    FormsModule, ReactiveFormsModule, CommonModule\r\n  ],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => MultiselectChipDropdownComponent),\r\n      multi: true\r\n    }\r\n  ]\r\n})\r\nexport class MultiselectChipDropdownComponent implements ControlValueAccessor, OnChanges {\r\n  static activeDropdown: MultiselectChipDropdownComponent | null = null;\r\n\r\n  @Input() idField!: string;\r\n  @Input() nameField!: string;\r\n  @Input() placeholder: string = \"Select\";\r\n  @Input() items: any[] = [];\r\n  @Input() search: boolean = false;\r\n  @Input() searchField!: string;\r\n  @Input() maxSelection: number = 0; // 0 = unlimited\r\n  @Input() compact: boolean = false;\r\n  @Input() extraActionLabel: string = '';\r\n  @Input() extraActionActive: boolean = false;\r\n  @Output() extraActionClick = new EventEmitter<void>();\r\n\r\n  /**\r\n   * Locks the control (no open/select/remove/clear) while KEEPING the bound\r\n   * reactive control enabled — so its value still appears in `form.value`.\r\n   * Use this instead of `formControl.disable()` when a parent needs a\r\n   * read-only chip display whose value must still be captured on submit.\r\n   * Combined with the CVA's own disabled state so neither overrides the other.\r\n   */\r\n  @Input()\r\n  set disabled(value: boolean) {\r\n    this._disabledByInput = !!value;\r\n    this.isDisabled = this._disabledByInput || this._disabledByCva;\r\n  }\r\n  get disabled(): boolean {\r\n    return this._disabledByInput;\r\n  }\r\n  private _disabledByInput = false;\r\n  private _disabledByCva = false;\r\n\r\n  selectedValues: string[] = [];\r\n  dropdownOpen: boolean = false;\r\n  isDisabled: boolean = false;\r\n\r\n  data: any[] = [];\r\n\r\n  searchTerm: string = '';\r\n\r\n  private onChange: (value: any) => void = () => { };\r\n  private onTouched: () => void = () => { };\r\n\r\n  constructor(\r\n    private elementRef: ElementRef,\r\n    private cd: ChangeDetectorRef\r\n  ) { }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.data = structuredClone(this.items);\r\n    this.searchField ??= this.nameField;\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onClick(event: MouseEvent): void {\r\n    if (!this.elementRef.nativeElement.contains(event.target)) {\r\n      this.dropdownOpen = false;\r\n      if (MultiselectChipDropdownComponent.activeDropdown === this) {\r\n        MultiselectChipDropdownComponent.activeDropdown = null;\r\n      }\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  writeValue(obj: string[]): void {\r\n    this.selectedValues = Array.isArray(obj) ? [...obj] : [];\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState?(isDisabled: boolean): void {\r\n    this._disabledByCva = isDisabled;\r\n    this.isDisabled = this._disabledByInput || this._disabledByCva;\r\n  }\r\n\r\n  toggleDropdown(): void {\r\n    if (this.isDisabled) return;\r\n\r\n    this.dropdownOpen = !this.dropdownOpen;\r\n    this.onTouched();\r\n\r\n    if (this.dropdownOpen) {\r\n      if (\r\n        MultiselectChipDropdownComponent.activeDropdown &&\r\n        MultiselectChipDropdownComponent.activeDropdown !== this\r\n      ) {\r\n        MultiselectChipDropdownComponent.activeDropdown.dropdownOpen = false;\r\n        MultiselectChipDropdownComponent.activeDropdown.cd.detectChanges();\r\n      }\r\n      MultiselectChipDropdownComponent.activeDropdown = this;\r\n    } else {\r\n      MultiselectChipDropdownComponent.activeDropdown = null;\r\n    }\r\n  }\r\n\r\n  isItemSelected(value: string): boolean {\r\n    return this.selectedValues.includes(value);\r\n  }\r\n\r\n  toggleItemSelection(item: any): void {\r\n    if (this.isDisabled) return;\r\n\r\n    const id = item[this.idField];\r\n    const index = this.selectedValues.indexOf(id);\r\n    if (index > -1) {\r\n      this.selectedValues.splice(index, 1);\r\n    } else {\r\n      if (this.isAtMaxSelection) return;\r\n      this.selectedValues.push(id);\r\n    }\r\n    this.onChange(this.selectedValues);\r\n    this.onTouched();\r\n  }\r\n\r\n  get isAtMaxSelection(): boolean {\r\n    return (\r\n      this.maxSelection > 0 && this.selectedValues.length >= this.maxSelection\r\n    );\r\n  }\r\n\r\n  isItemDisabledByMax(item: any): boolean {\r\n    if (!this.maxSelection) return false;\r\n    return (\r\n      this.isAtMaxSelection && !this.isItemSelected(item[this.idField])\r\n    );\r\n  }\r\n\r\n  removeChip(value: string): void {\r\n    if (this.isDisabled) return;\r\n\r\n    const index = this.selectedValues.indexOf(value);\r\n    if (index > -1) {\r\n      this.selectedValues.splice(index, 1);\r\n      this.onChange(this.selectedValues);\r\n      this.onTouched();\r\n    }\r\n  }\r\n\r\n  getItemLabel(value: string): string {\r\n    // Look up labels in the full `items` list, not `data`. `data` is the\r\n    // search-filtered display list — using it here would make selected\r\n    // chips fall back to the raw id while the user is searching.\r\n    const item = this.items.find(i => i[this.idField] === value)\r\n      ?? this.data.find(i => i[this.idField] === value);\r\n    return item ? item[this.nameField] : value;\r\n  }\r\n\r\n  toggleSelectAll(event: Event): void {\r\n    if (this.isDisabled || this.maxSelection > 0) return;\r\n\r\n    const target = event.target as HTMLInputElement;\r\n    if (target.checked) {\r\n      this.selectedValues = this.availableItemsToSelect.map(item => item[this.idField]);\r\n    } else {\r\n      this.selectedValues = [];\r\n    }\r\n    this.onChange(this.selectedValues);\r\n    this.onTouched();\r\n  }\r\n\r\n  get availableItemsToSelect() {\r\n    return this.data.filter(e => !e['disabled'] || this.selectedValues.includes(e[this.idField]));\r\n  }\r\n\r\n  isAllSelected(): boolean {\r\n    return this.data.length > 0 && this.selectedValues.length === this.availableItemsToSelect.length;\r\n  }\r\n\r\n  isIndeterminate(): boolean {\r\n    return this.availableItemsToSelect.length > 0 && !this.isAllSelected();\r\n  }\r\n\r\n  clearAll() {\r\n    if (this.isDisabled) return;\r\n    this.selectedValues = [];\r\n    this.onChange(this.selectedValues);\r\n    this.onTouched();\r\n  }\r\n\r\n  onSearch() {\r\n    if (this.searchTerm) {\r\n      const searchWords = this.searchTerm\r\n        .toLowerCase()\r\n        .split(/\\s+/)\r\n        .map(word => word.replace(/\\s/g, ''));\r\n\r\n      this.data = this.items.filter((e: any) => {\r\n        const fieldValue = (e[this.searchField] ?? \"\").toLowerCase().replace(/\\s/g, \"\");\r\n        return searchWords.every(term => fieldValue.includes(term));\r\n      });\r\n    } else {\r\n      this.data = structuredClone(this.items);\r\n    }\r\n  }\r\n}\r\n","<div class=\"multiselect-container\" [class.disabled]=\"isDisabled\" [class.compact]=\"compact\">\r\n  <div class=\"chip-list\" (click)=\"toggleDropdown()\">\r\n    <ng-container *ngIf=\"selectedValues.length; else multiPlaceholder\">\r\n      <div class=\"chip\" *ngFor=\"let value of selectedValues\">\r\n        {{ getItemLabel(value) }}\r\n        <span class=\"chip-remove\" (click)=\"removeChip(value)\">&times;</span>\r\n      </div>\r\n    </ng-container>\r\n    <ng-template #multiPlaceholder>\r\n      <p class=\"multi-placeholder\">{{ placeholder }}</p>\r\n    </ng-template>\r\n  </div>\r\n\r\n  <span *ngIf=\"selectedValues.length; else downArrow\" (click)=\"clearAll()\" class=\"chip-remove cursor-pointer\">\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n      <path\r\n        d=\"M6.25 5.89645L7.57322 4.57322C7.67085 4.47559 7.82915 4.47559 7.92678 4.57322C8.02441 4.67085 8.02441 4.82915 7.92678 4.92678L6.60355 6.25L7.92678 7.57322C8.02441 7.67085 8.02441 7.82915 7.92678 7.92678C7.82915 8.02441 7.67085 8.02441 7.57322 7.92678L6.25 6.60355L4.92678 7.92678C4.82915 8.02441 4.67085 8.02441 4.57322 7.92678C4.47559 7.82915 4.47559 7.67085 4.57322 7.57322L5.89645 6.25L4.57322 4.92678C4.47559 4.82915 4.47559 4.67085 4.57322 4.57322C4.67085 4.47559 4.82915 4.47559 4.92678 4.57322L6.25 5.89645ZM6.25 11.5C3.35051 11.5 1 9.14949 1 6.25C1 3.35051 3.35051 1 6.25 1C9.14949 1 11.5 3.35051 11.5 6.25C11.5 9.14949 9.14949 11.5 6.25 11.5ZM6.25 11C8.87335 11 11 8.87335 11 6.25C11 3.62665 8.87335 1.5 6.25 1.5C3.62665 1.5 1.5 3.62665 1.5 6.25C1.5 8.87335 3.62665 11 6.25 11Z\"\r\n        fill=\"black\"\r\n      />\r\n    </svg>\r\n  </span>\r\n\r\n  <ng-template #downArrow>\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n      <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    </svg>\r\n  </ng-template>\r\n\r\n  <div class=\"dropdown-panel\" [class.open]=\"dropdownOpen\">\r\n    <div *ngIf=\"search && items.length\" class=\"p-2\">\r\n      <input class=\"form-control\" placeholder=\"Search\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearch()\" />\r\n    </div>\r\n    <button\r\n      type=\"button\"\r\n      *ngIf=\"extraActionLabel\"\r\n      class=\"dropdown-extra-action\"\r\n      [class.active]=\"extraActionActive\"\r\n      (click)=\"extraActionClick.emit()\">\r\n      {{ extraActionLabel }}\r\n    </button>\r\n    <div class=\"dropdown-option\" *ngIf=\"data.length && !maxSelection; else noData\">\r\n      <label>\r\n        <input\r\n          type=\"checkbox\"\r\n          [checked]=\"isAllSelected()\"\r\n          [indeterminate]=\"isIndeterminate()\"\r\n          (change)=\"toggleSelectAll($event)\"\r\n          [disabled]=\"isDisabled || !availableItemsToSelect.length\"\r\n        />\r\n        Select All\r\n      </label>\r\n    </div>\r\n    <ng-template #noData>\r\n      <div class=\"dropdown-option disabled-click\" *ngIf=\"!data.length\">\r\n        <label> No Items</label>\r\n      </div>\r\n    </ng-template>\r\n    <div class=\"scroll\">\r\n      <div\r\n        class=\"dropdown-option\"\r\n        *ngFor=\"let item of data\"\r\n        [class.disabled-click]=\"(item?.disabled || isItemDisabledByMax(item)) && !isItemSelected(item[idField])\"\r\n      >\r\n        <label>\r\n          <input\r\n            type=\"checkbox\"\r\n            [checked]=\"isItemSelected(item[idField])\"\r\n            (change)=\"toggleItemSelection(item)\"\r\n            [disabled]=\"isDisabled || isItemDisabledByMax(item)\"\r\n          />\r\n          {{ item[nameField] }}\r\n        </label>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { FixtureTemplateDetails, ShelfConfig } from '../interfaces/fixture-template.interface';\r\nimport { BehaviorSubject, lastValueFrom, Subject, } from 'rxjs';\r\nimport { StoreBuilderService } from './store-builder.service';\r\nimport { BrandDetails } from '../interfaces/vm-library.interface';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class PlanoDataService implements OnDestroy {\r\n  brandsList = new BehaviorSubject<BrandDetails[]>([]);\r\n\r\n  fixtureTemplateDetails = new BehaviorSubject<FixtureTemplateDetails | null>(null);\r\n  private _originalFixtureTemplateDetails?: FixtureTemplateDetails; // This is the initial data from DB, used to compare the form changes and display the popup for save.\r\n\r\n  private fixtureTemplateFormTrigger = new Subject<{ status: string, goBack: boolean }>();\r\n  fixtureTemplateForm$ = this.fixtureTemplateFormTrigger.asObservable();\r\n   private nextFixture = new Subject<any>();\r\n   nextFixture$ = this.nextFixture.asObservable();\r\n\r\n  fixtureTemplateErrorTabs = {\r\n    basicDetails: false,\r\n    products: false,\r\n    vms: false,\r\n  }\r\n\r\n  constructor(private storeBuilderService: StoreBuilderService, private toast: ToastService) { }\r\n\r\n  get originalFixtureTemplateDetails() {\r\n    return this._originalFixtureTemplateDetails;\r\n  }\r\n\r\n  emit(data: any) {\r\n    this.nextFixture.next(data);\r\n  }\r\n\r\n  async fetchFixtureTemplateDetails(templateId: string, forceFetch: boolean = false) {\r\n    if (this.fixtureTemplateDetails.value && !forceFetch) return;\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(this.storeBuilderService.getFixtureTemplateDetails(templateId));\r\n\r\n      if (res?.data) {\r\n        const config: ShelfConfig[] = res.data.shelfConfig?.map((s: ShelfConfig, i: number) => {\r\n          return {\r\n            ...s,\r\n            shelfType: s?.shelfType || 'tray'\r\n          }\r\n        }) ?? [];\r\n\r\n        const fixtureData: FixtureTemplateDetails = {\r\n          ...res.data,\r\n          shelfConfig: config,\r\n        }\r\n\r\n        this._originalFixtureTemplateDetails = structuredClone(fixtureData);\r\n        this.fixtureTemplateDetails.next(fixtureData);\r\n      }\r\n\r\n    } catch (error) {\r\n      console.log(\"@@ ~ fetchFixtureTemplateDetails [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  async fetchBrandsList(clientId: string, forceFetch: boolean = false) {\r\n    if (this.brandsList.value.length && !forceFetch) return;\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(this.storeBuilderService.getBrandList(clientId));\r\n      if (res?.data) {\r\n        this.brandsList.next(res.data);\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getBrandsList [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  async submitFixtureTemplateDetails(newData: FixtureTemplateDetails, templateId: string): Promise<boolean> {\r\n    try {\r\n      const res: any = await lastValueFrom(this.storeBuilderService.updateFixtureTemplate(newData, templateId));\r\n      if (res?.status === 'success') {\r\n        this.fixtureTemplateDetails.next(newData);\r\n        this._originalFixtureTemplateDetails = structuredClone(newData);\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n\r\n    } catch (error: any) {\r\n      console.log(\"@@ ~ submitFixtureTemplateDetails [ERR]:\", error);\r\n      this.toast.getErrorToast(error?.error?.error)\r\n      return false;\r\n    }\r\n  }\r\n\r\n  triggerFixtureTemplateFormSubmission(data: { status: string, goBack: boolean }) {\r\n    this.fixtureTemplateFormTrigger.next(data);\r\n  }\r\n\r\n  updateFixtureTemplateDetails(newData: FixtureTemplateDetails | null) {\r\n    this.fixtureTemplateDetails.next(newData);\r\n  }\r\n\r\n  updateBrandsList(newData: BrandDetails[]) {\r\n    this.brandsList.next(newData);\r\n  }\r\n\r\n  // ==========================================\r\n  ngOnDestroy(): void {\r\n    this.fixtureTemplateDetails.complete();\r\n    this.brandsList.complete();\r\n  }\r\n}\r\n","import {\r\n  AfterViewChecked,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n  ChangeDetectorRef,\r\n} from \"@angular/core\";\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { debounceTime, Subject, Subscription, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport {\r\n  FixtureTemplateDetails,\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport { BrandDetails } from \"../../../interfaces/vm-library.interface\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { generalValidator, rgbToHex } from \"../../../functions/plano.function\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { MultiselectChipDropdownComponent } from \"../../multiselect-chip-dropdown/multiselect-chip-dropdown.component\";\r\nimport { NgbTooltipModule } from \"@ng-bootstrap/ng-bootstrap\";\r\n@Component({\r\n  selector: \"lib-instance-products\",\r\n  templateUrl: \"./template-products.component.html\",\r\n  styleUrl: \"./template-products.component.scss\",\r\n  standalone: true,\r\n  imports: [\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    MultiselectChipDropdownComponent,\r\n    NgbTooltipModule,\r\n  ],\r\n})\r\nexport class InstanceProductsComponent\r\n  implements OnDestroy, AfterViewChecked, OnChanges\r\n{\r\n  clientId: string;\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  selectedLevel: \"fixture\" | \"section\" | \"shelf\" | \"spot\" | string = \"fixture\";\r\n\r\n  selectedLibrary: \"product\" | \"brand\" | string = \"brand\";\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n\r\n  brandsList: BrandDetails[] = [];\r\n  categoriesList: DropdownIF[] = [];\r\n  categoriesListMap: Map<string, DropdownIF[]> = new Map();\r\n\r\n  shelvesList: DropdownIF[];\r\n\r\n  fixtureLevelForm: FormGroup;\r\n  sectionLevelForm: FormGroup;\r\n  shelfLevelForm: FormGroup;\r\n  spotLevelForm: FormGroup;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  isViewportLoading: boolean = true;\r\n\r\n  private isViewportInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  @Input() fixtureData: any;\r\n  @Input() editMode: boolean;\r\n  @Input() isSubmitted: boolean;\r\n  @Output() submitEvent = new EventEmitter<boolean>();\r\n  @Input() isRollout: boolean;\r\n  @Input() revertOnEdit: boolean = false;\r\n  @Input() zoneEditMode: boolean = false;\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private ps: PlanoDataService,\r\n    private toast: ToastService,\r\n    private gs: GlobalStateService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"fixtureData\"]) {\r\n      this.isPageLoading = true;\r\n\r\n      this.gs.dataRangeValue\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe(async (data) => {\r\n          if (data?.client) {\r\n            this.clientId = data?.client;\r\n          } else {\r\n            let headerData = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string,\r\n            );\r\n            this.clientId = headerData?.client;\r\n          }\r\n\r\n          this.ps.brandsList\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe((e) => (this.brandsList = e));\r\n\r\n          await this.ps.fetchBrandsList(this.clientId);\r\n\r\n          this.fixtureTemplateDetails = changes[\"fixtureData\"].currentValue;\r\n          setTimeout(() => this.addColorToShelves());\r\n          if (!this.isPageLoading) return;\r\n\r\n          this.shelvesList =\r\n            this.fixtureTemplateDetails?.shelfConfig?.map((e) => {\r\n              return {\r\n                label: `${e?.shelfType?.toUpperCase()} ${e?.shelfNumber}`,\r\n                value: `${e?.shelfType} ${e?.shelfNumber}`,\r\n              };\r\n            }) ?? [];\r\n\r\n          this.setTabByLevel();\r\n          this.initFixtureLevelForm();\r\n          this.initSectionLevelForm();\r\n          this.initShelfLevelForm();\r\n          this.initSpotLevelForm();\r\n          this.isPageLoading = false;\r\n        });\r\n    }\r\n\r\n    if (changes[\"editMode\"]) {\r\n      this.isEditMode = changes[\"editMode\"].currentValue;\r\n      if (this.isEditMode) {\r\n        this.fixtureLevelForm?.enable({ emitEvent: false });\r\n        this.sectionLevelForm?.enable({ emitEvent: false });\r\n        this.shelfLevelForm?.enable({ emitEvent: false });\r\n        this.spotLevelForm?.enable({ emitEvent: false });\r\n      }\r\n    }\r\n\r\n    if (changes[\"isSubmitted\"]) {\r\n      if (changes[\"isSubmitted\"].currentValue) {\r\n        this.submitForm();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isViewportInitialized) {\r\n      this.isViewportInitialized = this.addColorToShelves();\r\n    }\r\n  }\r\n\r\n  private setTabByLevel() {\r\n    if (this.zoneEditMode) {\r\n      this.selectedLevel = \"section\";\r\n      return;\r\n    }\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\":\r\n        this.selectedLevel = \"fixture\";\r\n        break;\r\n      case \"L2\":\r\n        this.selectedLevel = \"shelf\";\r\n        break;\r\n      case \"L3\":\r\n        this.selectedLevel = \"section\";\r\n        break;\r\n      case \"L4\":\r\n        this.selectedLevel = \"spot\";\r\n        break;\r\n    }\r\n  }\r\n\r\n  private getLevelByTab() {\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\":\r\n        return \"L1\";\r\n      case \"section\":\r\n        return \"L3\";\r\n      case \"shelf\":\r\n        return \"L2\";\r\n      case \"spot\":\r\n        return \"L4\";\r\n    }\r\n  }\r\n\r\n  initFixtureLevelForm() {\r\n    this.fixtureLevelForm = this.fb.group({\r\n      productBrandName: [this.fixtureTemplateDetails?.productBrandName],\r\n      productCategory: [this.fixtureTemplateDetails?.productCategory],\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.productBrandName?.forEach((e) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesList = [...this.categoriesList, ...categories];\r\n    });\r\n\r\n    this.fixtureLevelForm\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((v: string[]) => {\r\n        this.categoriesList = [];\r\n        v.forEach((e) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesList = [...this.categoriesList, ...categories];\r\n        });\r\n\r\n        const validCategoryIds = this.categoriesList?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          this.fixtureLevelForm?.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        this.fixtureLevelForm\r\n          ?.get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n      });\r\n\r\n    this.fixtureLevelForm?.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => setTimeout(() => this.addColorToShelves()));\r\n\r\n    if (!this.isEditMode) this.fixtureLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  initSectionLevelForm() {\r\n    this.sectionLevelForm = this.fb.group({\r\n      section: this.fb.array([]),\r\n    });\r\n\r\n    const sectionGroupArray = this.groupShelvesByZone(\r\n      this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n    );\r\n\r\n    sectionGroupArray.forEach((s, i) => this.addSection(s, i));\r\n\r\n    if (sectionGroupArray.length === 0) {\r\n      this.addSection();\r\n    }\r\n\r\n    const allSectionShelves = sectionGroupArray\r\n      .map((se) => se?.shelves?.map((s) => s))\r\n      .flat();\r\n\r\n    this.shelvesList = this.shelvesList.map((item) => {\r\n      return {\r\n        ...item,\r\n        disabled: allSectionShelves?.includes(`${item?.value}`),\r\n      };\r\n    });\r\n\r\n    this.sectionArray.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((s: SectionConfig[]) => {\r\n        const allSectionShelves = s\r\n          .map((se) => se?.shelves?.map((s) => s))\r\n          .flat();\r\n        this.shelvesList = this.shelvesList.map((item) => {\r\n          return {\r\n            ...item,\r\n            disabled: allSectionShelves?.includes(`${item?.value}`),\r\n          };\r\n        });\r\n      });\r\n\r\n    if (!this.isEditMode) this.sectionLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  get isAllShelvesUsedInSections() {\r\n    return this.shelvesList.filter((s) => !s.disabled).length <= 0;\r\n  }\r\n\r\n  initShelfLevelForm() {\r\n    this.shelfLevelForm = this.fb.group({\r\n      shelf: this.fb.array([]),\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.shelfConfig?.forEach((e, i) =>\r\n      this.addShelf(e, i),\r\n    );\r\n\r\n    if (!this.isEditMode) this.shelfLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  initSpotLevelForm() {\r\n    this.spotLevelForm = this.fb.group({\r\n      brand: [\"\", Validators.required],\r\n      productCategory: [\"\", Validators.required],\r\n    });\r\n\r\n    if (!this.isEditMode) this.spotLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  setTab(tab: string) {\r\n    this.selectedLevel = tab;\r\n    setTimeout(() => this.addColorToShelves());\r\n  }\r\n\r\n  get shelfArray(): FormArray {\r\n    return this.shelfLevelForm.get(\"shelf\") as FormArray;\r\n  }\r\n\r\n  get sectionArray(): FormArray {\r\n    return this.sectionLevelForm.get(\"section\") as FormArray;\r\n  }\r\n\r\n  addSection(\r\n    section?: SectionConfig,\r\n    i: number = this.sectionArray.controls.length,\r\n  ) {\r\n    const sectionGroup = this.fb.group({\r\n      zone: [section?.zone, [Validators.required, generalValidator()]],\r\n      shelves: [section?.shelves ?? [], Validators.required],\r\n      productBrandName: [section?.productBrandName],\r\n      productCategory: [section?.productCategory ?? \"\"],\r\n    });\r\n\r\n    this.sectionArray.push(sectionGroup);\r\n\r\n    const mapId = `section${i}`;\r\n    section?.productBrandName?.forEach((e: any) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesListMap.set(mapId, [\r\n        ...(this.categoriesListMap.get(mapId) ?? []),\r\n        ...categories,\r\n      ]);\r\n    });\r\n\r\n    this.setupSectionListener(sectionGroup, mapId);\r\n  }\r\n\r\n  addShelf(shelf: ShelfConfig, i: number) {\r\n    const shelfGroup = this.fb.group({\r\n      productBrandName: [shelf?.productBrandName],\r\n      productCategory: [shelf?.productCategory ?? \"\"],\r\n    });\r\n\r\n    this.shelfArray.push(shelfGroup);\r\n\r\n    const mapId = `shelf${i}`;\r\n    shelf?.productBrandName?.forEach((e: any) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesListMap.set(mapId, [\r\n        ...(this.categoriesListMap.get(mapId) ?? []),\r\n        ...categories,\r\n      ]);\r\n    });\r\n\r\n    this.setupShelfListener(shelfGroup, mapId);\r\n\r\n    setTimeout(() => this.addColorToShelves());\r\n  }\r\n\r\n  setupShelfListener(shelfGroup: FormGroup, i: string) {\r\n    shelfGroup\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((brands) => {\r\n        this.categoriesListMap.set(i, []);\r\n        brands.forEach((e: any) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesListMap.set(i, [\r\n            ...(this.categoriesListMap.get(i) ?? []),\r\n            ...categories,\r\n          ]);\r\n        });\r\n\r\n        // Reset category selection if previously selected categories are no longer valid\r\n        const validCategoryIds =\r\n          this.categoriesListMap?.get(i)?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          shelfGroup.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        shelfGroup\r\n          .get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    shelfGroup\r\n      .get(\"productCategory\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n  }\r\n\r\n  setupSectionListener(sectionGroup: FormGroup, i: string) {\r\n    sectionGroup\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((brands) => {\r\n        this.categoriesListMap.set(i, []);\r\n        brands.forEach((e: any) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesListMap.set(i, [\r\n            ...(this.categoriesListMap.get(i) ?? []),\r\n            ...categories,\r\n          ]);\r\n        });\r\n\r\n        // Reset category selection if previously selected categories are no longer valid\r\n        const validCategoryIds =\r\n          this.categoriesListMap?.get(i)?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          sectionGroup.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        sectionGroup\r\n          .get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"productCategory\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"shelves\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((s) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"zone\")\r\n      ?.valueChanges.pipe(debounceTime(300), takeUntil(this.destroy$))\r\n      .subscribe(() => this.addColorToShelves());\r\n  }\r\n\r\n  removeSection(index: number) {\r\n    if (!this.isEditMode) return;\r\n    this.sectionArray.removeAt(index);\r\n    setTimeout(() => this.addColorToShelves());\r\n  }\r\n\r\n  private getFormByLevel() {\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\":\r\n        return this.fixtureLevelForm;\r\n      case \"section\":\r\n        return this.sectionLevelForm;\r\n      case \"shelf\":\r\n        return this.shelfLevelForm;\r\n      case \"spot\":\r\n        return this.spotLevelForm;\r\n      default:\r\n        return this.fixtureLevelForm;\r\n    }\r\n  }\r\n\r\n  addColorToShelves(): boolean {\r\n    const level = document.getElementById(`${this.selectedLevel}-level`);\r\n    if (!level) return false;\r\n\r\n    const bodies = level.querySelector<HTMLElement>(\".body-block\");\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies.children) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n\r\n      .map((div) => {\r\n        const last = div.lastElementChild;\r\n        return last && last.tagName.toLowerCase() === \"div\"\r\n          ? (last as HTMLElement)\r\n          : null;\r\n      })\r\n      .filter((d): d is HTMLElement => !!d);\r\n\r\n    if (!shelfDivs.length) {\r\n      setTimeout(() => this.addColorToShelves(), 100);\r\n      return false;\r\n    }\r\n\r\n    switch (this.selectedLevel) {\r\n      case \"section\": {\r\n        this.constructSequentialSection(shelfDivs);\r\n\r\n        const sectionArray =\r\n          (this.sectionLevelForm?.value?.section as SectionConfig[]) ?? [];\r\n        const allSectionShelves: string[] = [];\r\n\r\n        sectionArray.forEach((se, i) => {\r\n          const shelfIds =\r\n            se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ?? [];\r\n          allSectionShelves.push(...shelfIds);\r\n\r\n          const secDivs = shelfDivs.filter((item) =>\r\n            shelfIds.includes(item.id),\r\n          );\r\n          secDivs.forEach(\r\n            (d) => (d.style.backgroundColor = this.shelfColors[i].bg),\r\n          );\r\n        });\r\n\r\n        const unassignedShelves = shelfDivs.filter(\r\n          (item) => !allSectionShelves.includes(item.id),\r\n        );\r\n        unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n        const sectionBody = document.getElementById(\"section-body-block\");\r\n        if (sectionBody) {\r\n          let sectionGroupHeight = 0;\r\n\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = sectionBody.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n\r\n      case \"shelf\":\r\n        bodyChildren.forEach((div, i) => {\r\n          div.style.backgroundColor = this.shelfColors[i].bg;\r\n\r\n          const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n          if (bc) {\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX}px, ${bcY}px)`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"fixture\":\r\n      case \"spot\":\r\n      default:\r\n        shelfDivs.forEach(\r\n          (d) => (d.style.backgroundColor = this.shelfColors[0].bg),\r\n        );\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const shelfConfigs: ShelfConfig[] = this.applySectionConfigToShelves(\r\n      this.sectionLevelForm?.value?.section as SectionConfig[],\r\n    );\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of shelfConfigs) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  get isAllShelfAddToSection() {\r\n    return this.shelvesList.every((s) => s.disabled);\r\n  }\r\n\r\n  getPayloadByLevel(status?: string): FixtureTemplateDetails | null {\r\n    const form = this.getFormByLevel();\r\n    const level = this.getLevelByTab();\r\n\r\n    if (\r\n      form.invalid ||\r\n      (this.selectedLevel === \"section\" && !this.isAllShelfAddToSection)\r\n    ) {\r\n      form.markAllAsTouched();\r\n\r\n      const errorMsg = form.invalid\r\n        ? \"Form is invalid\"\r\n        : \"Assign all shelves to a section\";\r\n\r\n      this.toast.getErrorToast(errorMsg);\r\n      return null;\r\n    }\r\n\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: [],\r\n              productCategory: [],\r\n            };\r\n          }) ?? [];\r\n\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          // status: status,\r\n          shelfConfig: config,\r\n          productResolutionLevel: level,\r\n          productBrandName: [...form?.value.productBrandName],\r\n          productCategory: [...form?.value.productCategory],\r\n        };\r\n      }\r\n      case \"section\": {\r\n        const config: ShelfConfig[] = this.applySectionConfigToShelves(\r\n          this.sectionLevelForm?.value?.section as SectionConfig[],\r\n        );\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          // status: status,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n      }\r\n      case \"shelf\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: form?.value?.shelf[i]?.productBrandName ?? [],\r\n              productCategory: form?.value?.shelf[i]?.productCategory ?? [],\r\n            };\r\n          }) ?? [];\r\n\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          // status: status,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n      }\r\n      case \"spot\":\r\n      default:\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          // status: status,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n        };\r\n    }\r\n  }\r\n\r\n  async submitForm() {\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    const payload: FixtureTemplateDetails | null = this.getPayloadByLevel();\r\n    if (!payload) return;\r\n\r\n    const req = {\r\n      fixtureId: this.fixtureTemplateDetails._id,\r\n      data: {\r\n        ...payload,\r\n        updatedAt: new Date(Date.now()).toISOString(),\r\n        ...(this.isRollout && { isMerchEdited: true }),\r\n      },\r\n      ...(!this.fixtureData?.taskType && !this.isRollout\r\n        ? { editMode: this.isEditMode, revertOnEdit: this.revertOnEdit }\r\n        : {}),\r\n    };\r\n\r\n    this.storeBuilderService.updateStoreFixture(req).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.data?.id) {\r\n          let message = `Fixture updated successfully and template is created <a href='manage/planogram/fixture-template/basic-details?templateId=${res.data.id}&isEdit=false'>View</a>`;\r\n          this.toast.getSuccessToast(message);\r\n        } else {\r\n          this.toast.getSuccessToast(\"Fixture updated successfully\");\r\n        }\r\n        // this.toast.getSuccessToast(\"Fixture updated successfully\")\r\n        // setTimeout(() => this.addColorToShelves())\r\n        this.submitEvent.emit(true);\r\n      },\r\n    });\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L3\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L3\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    let data =\r\n      this.selectedLevel == \"fixture\"\r\n        ? this.fixtureLevelForm.value\r\n        : this.selectedLevel == \"section\"\r\n          ? this.sectionLevelForm?.value\r\n          : this.selectedLevel == \"shelf\"\r\n            ? this.shelfLevelForm?.value\r\n            : this.spotLevelForm?.value;\r\n    this.submitEvent.emit(data);\r\n  }\r\n}\r\n","<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <!-- ====================================Left Column==================================== -->\r\n    <div class=\"cols col\" style=\"max-width: 380px;\">\r\n      <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n        <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n          <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n            (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n            {{ library | titlecase }} Library\r\n          </button>\r\n        </li>\r\n      </ul>\r\n\r\n      <div *ngIf=\"selectedLibrary === 'brand'\">\r\n        <div *ngIf=\"selectedLevel !== 'spot'\">\r\n          <h2>Add products by brand level</h2>\r\n          <p>Place the product brand in the designated placement area.</p>\r\n        </div>\r\n        <!-- Fixture level within Brand Library  -->\r\n        <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n          <div class=\"form-group mb-4\">\r\n            <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n            <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n              [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n              [search]=\"true\"></multiselect-chip-dropdown>\r\n            <!-- <ng-container\r\n              *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n            >\r\n              <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n                Please select product brand\r\n              </small>\r\n            </ng-container> -->\r\n          </div>\r\n          <div class=\"form-group mb-4\">\r\n            <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n            <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n              [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n              [search]=\"true\"></multiselect-chip-dropdown>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Section level within Brand Library -->\r\n        <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n          <div formArrayName=\"section\" class=\"array-wrapper\">\r\n            <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n              class=\"array-container\">\r\n              <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n              <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n                <svg [class.disabled-click]=\"!isEditMode || zoneEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n                  fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n                  <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n                <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n                <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n                    required. </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n                    Section name cannot be only whitespace.\r\n                  </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n                    No leading or trailing whitespace allowed.\r\n                  </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n                <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n                <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  formControlName=\"shelves\" [search]=\"true\"></multiselect-chip-dropdown>\r\n                <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n                <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n                  formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n                <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n                    Please select product brand\r\n                  </small>\r\n                </ng-container> -->\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n                <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n                <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n                  [search]=\"true\"></multiselect-chip-dropdown>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"w-100 d-flex justify-content-end mt-4\" [class.disabled-click]=\"zoneEditMode\">\r\n            <span [ngbTooltip]=\"\r\n                isAllShelvesUsedInSections\r\n                  ? 'All shelves are assigned. No shelves available for new sections.'\r\n                  : 'You cannot create more sections than the total shelves available.'\r\n              \" [disableTooltip]=\"\r\n                sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n              \">\r\n              <button [disabled]=\"\r\n                  sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n                \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n                Add section\r\n              </button>\r\n            </span>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Shelf level within Brand Library -->\r\n        <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n          <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n            <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n              <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n              <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n                <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n                  formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n                <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n                    Please select product brand\r\n                  </small>\r\n                </ng-container> -->\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n                <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n                  [search]=\"true\"></multiselect-chip-dropdown>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Spot level within Brand Library -->\r\n        <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n        <div *ngIf=\"selectedLevel === 'spot'\"\r\n          class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n          <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n            <path\r\n              d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n          <p>This feature is not available yet.</p>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Coming soon for all levels -->\r\n      <div *ngIf=\"selectedLibrary === 'product'\"\r\n        class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n        <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n          <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n          <path\r\n            d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n        <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n        <p>This feature is not available yet. Start adding product from brand library</p>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- =======================================Right Column =======================================-->\r\n    <div class=\"cols col\">\r\n      <h6>Product brand placements</h6>\r\n\r\n      <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode || zoneEditMode\">\r\n        <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n          <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n            [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n            {{ level | titlecase }} level\r\n          </button>\r\n        </li>\r\n      </ul>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n        <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container *ngTemplateOutlet=\"\r\n                dimensionArrows;\r\n                context: {\r\n                  value: fixtureTemplateDetails?.fixtureWidth?.value\r\n                }\r\n              \"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div id=\"brand-category\" class=\"brand-category\"\r\n                  *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                  <span class=\"brand\">\r\n                    <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n                      <span class=\"badge draft me-1\">\r\n                        {{ b }}\r\n                      </span>\r\n                    </ng-container>\r\n                  </span>\r\n                  <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n                    <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n                      {{ c }}\r\n                      <ng-container *ngIf=\"!last\">, </ng-container>\r\n                    </ng-container>\r\n                  </span>\r\n                </div>\r\n\r\n                <ng-template #brandCategoryTooltip>\r\n                  <div>\r\n                    <p>\r\n                      <b>Brands: </b>\r\n                      <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                    <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n                      <b>Categories: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                  </div>\r\n                </ng-template>\r\n\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n        <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" id=\"section-body-block\">\r\n                <!---------------------------------------------------------------------->\r\n                <!-- <div id=\"body-loader\">\r\n                  <div class=\"loader\"></div>\r\n                </div> -->\r\n                <!---------------------------------------------------------------------->\r\n                @for (item of sectionByZones; track $index) {\r\n                  <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"badge draft me-1\">\r\n                      {{ item.zone }}\r\n                    </span>\r\n                    <div class=\"w-100 d-flex justify-content-center\">\r\n                      <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                      <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                      <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                    </div>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                      <p *ngIf=\"item?.section?.categories?.length\">\r\n                        <b>Categories: </b>\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                }\r\n                <!---------------------------------------------------------------------->\r\n\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n                  So keep this block always at the bottom of this ngFor loop -->\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n        <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  <!---------------------------------------------------------------------->\r\n                  <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n                    *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n                      <ng-container\r\n                        *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                    <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n                    </span>\r\n                    <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n                      <ng-container\r\n                        *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        <ng-container\r\n                          *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                      <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n                        <b>Categories: </b>\r\n                        <ng-container\r\n                          *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                  <!---------------------------------------------------------------------->\r\n\r\n                  <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n                  So keep this block always at the bottom of this ngFor loop -->\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\">\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n        <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n          style=\"height: 50vh\">\r\n          <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n            <path\r\n              d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n          <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n        </div>\r\n\r\n        <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <ng-container\r\n              *ngTemplateOutlet=\"\r\n                dimensionArrows;\r\n                context: {\r\n                  value: fixtureTemplateDetails?.fixtureLength?.value\r\n                }\r\n              \"\r\n            ></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <div\r\n                class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n              >\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                  @if(item.shelfType ==='shelf'){\r\n                  <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf  \">\r\n                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n                  </div>\r\n                  }@else {\r\n                  <div [id]=\"item.shelfType! + (i + 1)\" class=\"block  \">\r\n                    <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product hide-product\"></div>\r\n                    </div>\r\n                  </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <div\r\n                class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n              >\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div> -->\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { firstValueFrom, lastValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  VmLibraryList,\r\n  VMTypeDetails,\r\n} from \"../../../interfaces/vm-library.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport {\r\n  FixtureTemplateDetails,\r\n  SectionConfig,\r\n  ShelfConfig,\r\n  VMConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { CommonModule, TitleCasePipe } from \"@angular/common\";\r\nimport { ReactiveSelectComponent } from \"../../reactive-select/reactive-select.component\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../../functions/plano.function\";\r\nimport { NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\n@Component({\r\n  selector: \"lib-instance-vms\",\r\n  templateUrl: \"./template-vms.component.html\",\r\n  styleUrl: \"./template-vms.component.scss\",\r\n  providers: [TitleCasePipe],\r\n  standalone: true,\r\n  imports: [\r\n    ReactiveSelectComponent,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    NgbTooltip,\r\n  ],\r\n})\r\nexport class InstanceVmsComponent\r\n  implements OnDestroy, AfterViewChecked, OnChanges\r\n{\r\n  @Input() fixtureData: any;\r\n  @Input() editMode: boolean;\r\n  @Input() isSubmitted: boolean;\r\n  @Output() submitEvent = new EventEmitter<boolean>();\r\n  @Input() isRollout: boolean;\r\n  @Input() revertOnEdit: boolean = false;\r\n\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  clientId: string;\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n\r\n  fixtureVmForm: FormGroup;\r\n\r\n  vmTypeList: DropdownIF[] = [];\r\n\r\n  vmList: VmLibraryList[] = [];\r\n  vmListMap: Map<string, DropdownIF[]> = new Map();\r\n\r\n  startYPositionList: DropdownIF[][] = [];\r\n  endYPositionsList: DropdownIF[][] = [];\r\n\r\n  xZonesList = [\r\n    { label: \"Left\", value: \"left\" },\r\n    { label: \"Right\", value: \"right\" },\r\n    { label: \"Middle\", value: \"middle\" },\r\n    { label: \"Stretch\", value: \"stretch\" },\r\n  ];\r\n  yZonesList = [\r\n    { label: \"Top\", value: \"top\" },\r\n    { label: \"Bottom\", value: \"bottom\" },\r\n    { label: \"Middle\", value: \"middle\" },\r\n    { label: \"Stretch\", value: \"stretch\" },\r\n  ];\r\n  positionsList = [\r\n    { label: \"Front\", value: \"front\" },\r\n    { label: \"Back\", value: \"back\" },\r\n  ];\r\n\r\n  imgCDN: string;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private gs: GlobalStateService,\r\n    private titleCasePipe: TitleCasePipe,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"fixtureData\"]) {\r\n      this.isPageLoading = true;\r\n      this.gs.environment.subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n      this.gs.dataRangeValue.subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        await Promise.all([this.getVmTypes(), this.getVmsList()]);\r\n\r\n        this.fixtureTemplateDetails = changes[\"fixtureData\"].currentValue;\r\n\r\n        this.initVmForm();\r\n        setTimeout(() => this.applyShelfColors());\r\n        setTimeout(() => this.handleVmPositionAndSize());\r\n\r\n        this.vmArray?.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((val) => {\r\n            // this.vmArray.controls.forEach((e, i) => {\r\n            // if (!e.value.vmType) {\r\n            //   console.log(\"@@ ~ e:\", e.value);\r\n            //   const selectVMType = this.vmTypeList.find(\r\n            //     (v) => v.value === e.value.vmId\r\n            //   );\r\n            //   if (selectVMType) {\r\n            //     console.log(\"@@ ~ selectVM:\", selectVMType);\r\n            //   }\r\n            // }\r\n            // });\r\n\r\n            this.handleVmPositionAndSize();\r\n          });\r\n      });\r\n    }\r\n\r\n    if (changes[\"editMode\"]) {\r\n      this.isEditMode = changes[\"editMode\"].currentValue;\r\n      if (this.isEditMode) {\r\n        this.fixtureVmForm?.enable({ emitEvent: false });\r\n      }\r\n    }\r\n\r\n    if (changes[\"isSubmitted\"]) {\r\n      if (changes[\"isSubmitted\"].currentValue) {\r\n        this.submitForm();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n  }\r\n\r\n  initVmForm() {\r\n    this.fixtureVmForm = this.fb.group({\r\n      vmConfig: this.fb.array([]),\r\n    });\r\n\r\n    if (this.fixtureTemplateDetails?.vmConfig?.length) {\r\n      this.fixtureTemplateDetails?.vmConfig?.forEach((e) => this.addVM(e));\r\n    }\r\n    // else {\r\n    //   this.addVM();\r\n    // }\r\n\r\n    if (!this.isEditMode) this.fixtureVmForm?.disable({ emitEvent: false });\r\n    this.isPageLoading = false;\r\n  }\r\n\r\n  get vmArray(): FormArray {\r\n    return this.fixtureVmForm?.get(\"vmConfig\") as FormArray;\r\n  }\r\n\r\n  async getVmsList() {\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getVMNameList(this.clientId),\r\n      );\r\n      if (res?.status === \"success\") {\r\n        this.vmList = res?.data?.map((item: any) => {\r\n          return {\r\n            id: item._id,\r\n            name: item.vmName,\r\n            displayName: item.vmName + (item?.vmType ? `(${item.vmType})` : \"\"),\r\n            width: item.vmWidth.value,\r\n            height: item.vmHeight.value,\r\n            type: item.vmType,\r\n            ...(item.vmImageUrl\r\n              ? { imgUrl: `${this.imgCDN}${item.vmImageUrl}` }\r\n              : {}),\r\n          };\r\n        });\r\n        if (this.fixtureData?.taskType?.includes(\"fixture\")) {\r\n          this.fixtureData.vmConfig.forEach((vm: any) => {\r\n            let findVm = this.vmList.findIndex(\r\n              (ele: any) =>\r\n                ele?.name?.toLowerCase() == vm?.vmName?.toLowerCase() &&\r\n                ele?.vmType?.toLowerCase() == vm?.vmType?.toLowerCase(),\r\n            );\r\n\r\n            if (findVm == -1) {\r\n              this.vmList.push({\r\n                id: vm.vmName,\r\n                name: vm.vmName,\r\n                displayName: vm.vmName + (vm?.vmType ? `(${vm.vmType})` : \"\"),\r\n                width: 100,\r\n                height: 100,\r\n                type: vm.vmType,\r\n                ...(vm.vmImage\r\n                  ? { imgUrl: `${this.imgCDN}${vm.vmImage}` }\r\n                  : {}),\r\n              } as any);\r\n            } else {\r\n              this.vmList[findVm].id = vm.vmName;\r\n              if (vm?.vmImage) {\r\n                this.vmList[findVm].imgUrl = `${this.imgCDN}${vm.vmImage}`;\r\n              }\r\n            }\r\n          });\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n    } finally {\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  async getVmTypes() {\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService.getVmTypesList(this.clientId),\r\n      );\r\n      if (res?.data) {\r\n        this.vmTypeList = res.data.map((b: VMTypeDetails) => {\r\n          return { label: b.vmType ?? \"\", value: b.vmType ?? \"\" };\r\n        });\r\n        if (this.fixtureData?.taskType?.includes(\"fixture\")) {\r\n          let fixtureVM = this.fixtureData.vmConfig.map((vm: any) => {\r\n            return { label: vm.vmType ?? \"\", value: vm.vmType ?? \"\" };\r\n          });\r\n          let mergedArray = [...this.vmTypeList, ...fixtureVM];\r\n          this.vmTypeList = [...new Set(mergedArray.map((ele: any) => ele))];\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmTypes [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  getSelectedVM(vm: any) {\r\n    const selectedVM = this.vmList.find((v) => v.id === vm?.value?.vmId);\r\n    return selectedVM;\r\n  }\r\n\r\n  onImgError(event: Event) {\r\n    const target = event.target as HTMLImageElement;\r\n    target.src = \"assets/tango/Images/vm-placeholder.png\";\r\n  }\r\n\r\n  addVM(vm?: VMConfig, i: number = this.vmArray.controls.length) {\r\n    const vmGroup = this.fb.group({\r\n      vmType: [vm?.vmType, Validators.required],\r\n      vmId: [vm?.vmId ?? vm?.vmName, Validators.required],\r\n      vmName: [vm?.vmName ?? \"\"],\r\n      startYPosition: [vm?.startYPosition, Validators.required],\r\n      endYPosition: [vm?.endYPosition, Validators.required],\r\n      xZone: [vm?.xZone ?? \"\"],\r\n      yZone: [vm?.yZone ?? \"\"],\r\n      position: [vm?.position ?? \"\"],\r\n    });\r\n\r\n    this.vmArray.push(vmGroup);\r\n\r\n    const mapId = `vm${i}`;\r\n\r\n    if (vm?.vmType) {\r\n      this.vmListMap.set(\r\n        mapId,\r\n        this.vmList\r\n          .filter((v) => v.type === vm?.vmType)\r\n          .map((v) => {\r\n            return { value: v.id, label: v.displayName };\r\n          }),\r\n      );\r\n    } else {\r\n      this.vmListMap.set(\r\n        mapId,\r\n        this.vmList.map((v) => {\r\n          return { value: v.id, label: v.displayName };\r\n        }),\r\n      );\r\n    }\r\n\r\n    this.setupVMListener(vmGroup, mapId);\r\n\r\n    const yPositions: DropdownIF[] =\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((e, i) => ({\r\n        label: `${e?.shelfType === \"vmonly\" ? \"VM Only\" : this.titleCasePipe.transform(e?.shelfType)} ${e?.shelfNumber}`,\r\n        value: e?.shelfNumber ?? i + 1,\r\n      })) ?? [];\r\n\r\n    this.startYPositionList.push(yPositions);\r\n    this.endYPositionsList.push(yPositions);\r\n\r\n    this.onChangeStartY(this.vmArray.length - 1, vm?.startYPosition ?? 1);\r\n  }\r\n\r\n  setupVMListener(vmGroup: FormGroup, i: string) {\r\n    vmGroup\r\n      .get(\"vmType\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((vmType) => {\r\n        this.vmListMap.set(i, []);\r\n\r\n        if (vmType) {\r\n          this.vmListMap.set(\r\n            i,\r\n            this.vmList\r\n              .filter((v) => v.type === vmType)\r\n              .map((v) => {\r\n                return { value: v.id, label: v.displayName };\r\n              }),\r\n          );\r\n        } else {\r\n          this.vmListMap.set(\r\n            i,\r\n            this.vmList.map((v) => {\r\n              return { value: v.id, label: v.displayName };\r\n            }),\r\n          );\r\n        }\r\n\r\n        vmGroup.get(\"vmId\")?.reset();\r\n      });\r\n\r\n    // vmGroup\r\n    //   .get(\"vmId\")\r\n    //   ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n    //   .subscribe((vmId) => {\r\n    //     console.log(\"@@ ~ vmName:\", vmId);\r\n    //   });\r\n  }\r\n\r\n  onChangeStartY(i: number, event: any) {\r\n    const endY = this.endYPositionsList[i];\r\n\r\n    const newEndY: DropdownIF[] =\r\n      endY?.map((k) => {\r\n        return {\r\n          label: k.label,\r\n          value: k.value,\r\n          disabled: k.value < event,\r\n        };\r\n      }) ?? [];\r\n\r\n    this.endYPositionsList[i] = newEndY;\r\n\r\n    if (event > this.vmArray.controls[i].get(\"endYPosition\")?.value) {\r\n      this.vmArray.controls[i].get(\"endYPosition\")?.reset();\r\n    }\r\n  }\r\n\r\n  removeVM(index: number) {\r\n    this.vmArray.removeAt(index);\r\n    this.startYPositionList.splice(index, 1);\r\n    this.endYPositionsList.splice(index, 1);\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.vmArray?.controls.forEach((e, i) => {\r\n      let startShelf = e?.value?.startYPosition || 1;\r\n      let endShelf =\r\n        e?.value?.endYPosition ||\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ||\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.value?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.value?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = `${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"shelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 260;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) d.style.backgroundColor = this.shelfColors[0].bg;\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) d.style.backgroundColor = this.shelfColors[i].bg;\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            // div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              // d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            // d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  async submitForm() {\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    if (this.fixtureVmForm.invalid) {\r\n      this.fixtureVmForm.markAllAsTouched();\r\n      this.toast.getErrorToast(\"Form is invalid\");\r\n      return;\r\n    }\r\n\r\n    if (this.fixtureVmForm.valid) {\r\n      const payload: FixtureTemplateDetails = {\r\n        ...this.fixtureTemplateDetails,\r\n        vmConfig: this.vmArray.controls.map((e) => {\r\n          return e.value;\r\n        }),\r\n        updatedAt: new Date(Date.now()).toISOString(),\r\n        ...(this.isRollout && { isVmEdited: true }),\r\n      };\r\n\r\n      if (\r\n        this.fixtureData?.taskType?.includes(\"fixture\") &&\r\n        payload?.vmConfig?.length\r\n      ) {\r\n        payload.vmConfig?.forEach((vm: any, index: any) => {\r\n          let findVm = this.fixtureData.vmConfig.find(\r\n            (ele: any) => ele?.vmName == vm?.vmId || ele?.vmName == vm?.vmName,\r\n          );\r\n          if (findVm && payload?.vmConfig?.length) {\r\n            payload.vmConfig[index].vmName = findVm?.vmName;\r\n            payload.vmConfig[index].vmImage = findVm?.vmImage;\r\n          }\r\n        });\r\n      }\r\n      const req = {\r\n        fixtureId: this.fixtureTemplateDetails._id,\r\n        data: payload,\r\n        ...(!this.fixtureData?.taskType && !this.isRollout\r\n          ? { editMode: this.isEditMode, revertOnEdit: this.revertOnEdit }\r\n          : {}),\r\n      };\r\n\r\n      this.storeBuilderService.updateStoreFixture(req).subscribe({\r\n        next: (res: any) => {\r\n          // this.toast.getSuccessToast(\"Fixture updated successfully\")\r\n          if (res?.data?.id) {\r\n            let message = `Fixture updated successfully and template is created <a href='manage/planogram/fixture-template/basic-details?templateId=${res.data.id}&isEdit=false'>View</a>`;\r\n            this.toast.getSuccessToast(message);\r\n          } else {\r\n            this.toast.getSuccessToast(\"Fixture updated successfully\");\r\n          }\r\n          this.submitEvent.emit(true);\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    let vmConfig: any = this.vmArray.controls.map((e) => {\r\n      return e.value;\r\n    });\r\n    if (this.fixtureData?.taskType?.includes(\"fixture\") && vmConfig?.length) {\r\n      vmConfig?.forEach((vm: any, index: any) => {\r\n        let findVm = this.fixtureData.vmConfig.find(\r\n          (ele: any) => ele?.vmName == vm?.vmId || ele?.vmName == vm?.vmName,\r\n        );\r\n        if (findVm && vmConfig?.length) {\r\n          vmConfig[index].vmName = findVm?.vmName;\r\n          vmConfig[index].vmImage = findVm?.vmImage;\r\n        }\r\n      });\r\n    }\r\n    vmConfig = { vmConfig: vmConfig };\r\n    this.submitEvent.emit(vmConfig);\r\n  }\r\n}\r\n","<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <!--============================Left Column============================ -->\r\n    <div class=\"cols col\" style=\"max-width: 380px;\">\r\n      <h2>All visual merchandise from library</h2>\r\n      <p>Configure your VMs position and placements</p>\r\n      <form [formGroup]=\"fixtureVmForm\">\r\n        <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n          <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n            <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n              <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n              <!-- *ngIf=\"i != 0\" -->\r\n              <svg (click)=\"removeVM(i)\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n                xmlns=\"http://www.w3.org/2000/svg\" class=\"cursor-pointer\" [class.disabled-click]=\"!isEditMode\">\r\n                <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\" />\r\n              </svg>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"vmTypeList\"\r\n                formControlName=\"vmType\" [search]=\"true\">\r\n              </lib-reactive-select>\r\n\r\n              <ng-container *ngIf=\"vm.get('vmType')?.touched && vm.get('vmType')?.errors\">\r\n                <small *ngIf=\"vm.get('vmType')?.hasError('required')\" class=\"text-danger\"> Choose a VM Type </small>\r\n              </ng-container>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n                formControlName=\"vmId\" [search]=\"true\" [prefix]=\"true\">\r\n              </lib-reactive-select>\r\n\r\n              <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n                <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n              </ng-container>\r\n            </div>\r\n\r\n            <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n              <div class=\"d-flex gap-3\">\r\n                <div class=\"preview\">\r\n                  <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n                  <ng-template #placeholder>\r\n                    <div class=\"vm-placeholder\">\r\n                      <h3>{{ selectedVM?.name }}</h3>\r\n                      <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n                <div style=\"overflow: hidden\">\r\n                  <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n                  <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm\r\n                  </p>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"d-flex gap-4 mb-4\">\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"startYPositionList[i]\"\r\n                  formControlName=\"startYPosition\" (ngModelChange)=\"onChangeStartY(i, $event)\">\r\n                </lib-reactive-select>\r\n                <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"endYPositionsList[i]\"\r\n                  formControlName=\"endYPosition\">\r\n                </lib-reactive-select>\r\n                <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"d-flex gap-4 mb-4\">\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n                  Vertical zone\r\n                  <svg width=\"18px\" height=\"18px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    transform=\"rotate(90)\">\r\n                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                      stroke-width=\"1.9200000000000004\"></g>\r\n                    <g id=\"SVGRepo_iconCarrier\">\r\n                      <path d=\"M5 12L19 12\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M16 16L20 12L16 8\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\"\r\n                        stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M8 8L4 12L8 16\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                    </g>\r\n                  </svg>\r\n                </label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\"\r\n                  formControlName=\"yZone\">\r\n                </lib-reactive-select>\r\n              </div>\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n                  Horizontal zone\r\n                  <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    transform=\"rotate(0)\">\r\n                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                      stroke-width=\"1.9200000000000004\"></g>\r\n                    <g id=\"SVGRepo_iconCarrier\">\r\n                      <path d=\"M5 12L19 12\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M16 16L20 12L16 8\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\"\r\n                        stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M8 8L4 12L8 16\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                    </g>\r\n                  </svg>\r\n                </label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\"\r\n                  formControlName=\"xZone\">\r\n                </lib-reactive-select>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\"\r\n                formControlName=\"position\">\r\n              </lib-reactive-select>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n          <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual\r\n            Merchandise</button>\r\n        </div>\r\n      </form>\r\n    </div>\r\n\r\n    <!--============================Right Column=========================== -->\r\n    <div class=\"cols col\">\r\n      <div class=\"d-flex justify-content-center\">\r\n        <!-- Vertical arrows -->\r\n        <div class=\"vertical-dimension\">\r\n          <div class=\"arrow up\"></div>\r\n          <div class=\"line\">\r\n            <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n          </div>\r\n          <div class=\"arrow down\"></div>\r\n        </div>\r\n\r\n        <div>\r\n          <!-- Horizontal arrows -->\r\n          <ng-container *ngTemplateOutlet=\"\r\n              dimensionArrows;\r\n              context: {\r\n                value: fixtureTemplateDetails?.fixtureWidth?.value\r\n              }\r\n            \"></ng-container>\r\n\r\n          <div id=\"vm-products\" class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div id=\"header-block\" class=\"header-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block\" class=\"body-block\">\r\n              <!----------------------------------[VM BLOCK]--------------------------------------->\r\n              <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n                <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                  <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n                    <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n                    <ng-template #placeholder>\r\n                      <div class=\"vm-placeholder\">\r\n                        <h3>{{ selectedVM?.name }}</h3>\r\n                      </div>\r\n                    </ng-template>\r\n                  </ng-container>\r\n                </div>\r\n              </ng-container>\r\n\r\n              <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n              <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n                  [ngbTooltip]=\"brandCategoryTooltip\">\r\n                  <span class=\"brand\">\r\n                    <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                      <span class=\"badge draft me-1\">\r\n                        {{ b }}\r\n                      </span>\r\n                    </ng-container>\r\n                  </span>\r\n                  <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                    <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                      {{ c }}\r\n                      <ng-container *ngIf=\"!last\">, </ng-container>\r\n                    </ng-container>\r\n                  </span>\r\n                </div>\r\n                <ng-template #brandCategoryTooltip>\r\n                  <div>\r\n                    <p>\r\n                      <b>Brands: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                    <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                      <b>Categories: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                  </div>\r\n                </ng-template>\r\n              </div>\r\n              <!------------------------------------------------------------------------->\r\n\r\n              <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n              <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                @for (item of sectionByZones; track $index) {\r\n                  <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"badge draft me-1\">\r\n                      {{ item.zone }}\r\n                    </span>\r\n                    <div class=\"w-100 d-flex justify-content-center\">\r\n                      <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                      <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                      <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                    </div>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                      <p *ngIf=\"item?.section?.categories?.length\">\r\n                        <b>Categories: </b>\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                }\r\n              </div>\r\n              <!------------------------------------------------------------------------->\r\n\r\n              <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\"\r\n                class=\"shelfContainer\">\r\n                <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                  <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                      <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                    <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                    <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                      <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                  </div>\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                      <p *ngIf=\"item.productCategory?.length\">\r\n                        <b>Categories: </b>\r\n                        <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                @if(item.shelfType ==='tray'){\r\n                  <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                  </div>\r\n                }@else {\r\n                  <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                    [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <div class=\"sub-footer left-box\"></div>\r\n              <div class=\"sub-footer right-box\"></div>\r\n              <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div style=\"max-width: 200px;width:100%\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport * as fabric from \"fabric\";\r\nimport { debounceTime, fromEvent, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"store-plano-tree-view\",\r\n  templateUrl: \"./store-plano-tree-view.component.html\",\r\n  styleUrl: \"./store-plano-tree-view.component.scss\",\r\n  standalone: true,\r\n})\r\nexport class StorePlanoTreeViewComponent\r\n  implements OnChanges, OnDestroy, AfterViewInit\r\n{\r\n  @Input() allFixture: any[];\r\n  @Output() selectedInstance = new EventEmitter<any>();\r\n\r\n  @ViewChild(\"templateCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n\r\n  canvas!: fabric.Canvas;\r\n\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  cdnUrl: string;\r\n\r\n  allMasterTemplates: any[] = [];\r\n  selectedMasterTemplates: any[] = [];\r\n  subTemplates: any[] = [];\r\n\r\n  selectedGroupName: string | null;\r\n  selectedMasterId: string;\r\n\r\n  isPageLoading: boolean = true;\r\n  preventClick: boolean = false; // Flag used to restrict further clicks on canvas items while an API call is in progress.\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(private gs: GlobalStateService) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (\r\n      changes[\"allFixture\"]?.currentValue &&\r\n      !changes[\"allFixture\"]?.firstChange\r\n    ) {\r\n      this.buildTreeView();\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 600,\r\n      width: 800,\r\n      subTargetCheck: true,\r\n    });\r\n\r\n    this.resizeCanvasToParentSize();\r\n\r\n    fromEvent(window, \"resize\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(() => this.resizeCanvasToParentSize());\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    this.buildTreeView();\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8): number {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  getGroupCenterBottom(group: fabric.Group): { gx: number; gy: number } {\r\n    const center = group.getCenterPoint();\r\n    const centerX = center.x;\r\n    const bottomY = group.top! + group.height!;\r\n    return { gx: centerX, gy: bottomY };\r\n  }\r\n\r\n  createAdaptiveText(\r\n    text: string,\r\n    options: {\r\n      fontSize: number;\r\n      maxHeight: number;\r\n      width: number;\r\n      left: number;\r\n      top: number;\r\n      fill: string;\r\n      fontWeight?: string;\r\n    },\r\n  ): fabric.Textbox {\r\n    let fontSize = options.fontSize;\r\n    let textElement: fabric.Textbox;\r\n\r\n    do {\r\n      textElement = new fabric.Textbox(text, {\r\n        fontSize: fontSize,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: options.fontWeight || \"500\",\r\n        fill: options.fill,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: options.width,\r\n        left: options.left,\r\n        top: options.top,\r\n      });\r\n      fontSize -= 0.5;\r\n    } while (textElement.height > options.maxHeight && fontSize > 2);\r\n\r\n    return textElement;\r\n  }\r\n\r\n  buildTreeView() {\r\n    this.canvas?.clear();\r\n    this.preventClick = true;\r\n    this.allMasterTemplates = this.allFixture;\r\n\r\n    // Once the master template is fetched, render the group names.\r\n    this.renderGroupNames();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  zoomIn() {\r\n    let zoom = this.canvas.getZoom();\r\n    const targetZoom = Math.min(zoom + 0.2, 3);\r\n    this.smoothZoom(targetZoom);\r\n  }\r\n\r\n  zoomOut() {\r\n    let zoom = this.canvas.getZoom();\r\n    const targetZoom = Math.max(zoom - 0.2, 0.2);\r\n    this.smoothZoom(targetZoom);\r\n  }\r\n\r\n  smoothZoom(targetZoom: number) {\r\n    const center = new fabric.Point(\r\n      this.canvas.getWidth() / 2,\r\n      this.canvas.getHeight() / 2,\r\n    );\r\n    const currentZoom = this.canvas.getZoom();\r\n    const steps = 10;\r\n    const stepSize = (targetZoom - currentZoom) / steps;\r\n    let step = 0;\r\n\r\n    const animate = () => {\r\n      if (step < steps) {\r\n        this.canvas.zoomToPoint(center, currentZoom + stepSize * (step + 1));\r\n        step++;\r\n        requestAnimationFrame(animate);\r\n      } else {\r\n        this.canvas.zoomToPoint(center, targetZoom);\r\n      }\r\n    };\r\n\r\n    animate();\r\n  }\r\n\r\n  resizeCanvasToParentSize() {\r\n    const canvasCol = document.getElementById(\r\n      \"tree-canvas-card\",\r\n    ) as HTMLElement;\r\n    if (canvasCol) {\r\n      const width = canvasCol.offsetWidth - 32;\r\n      const height = canvasCol.offsetHeight - 32;\r\n      this.changeCanvasSize(width, height);\r\n    }\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  // ==================== RENDERING METHODS ====================\r\n  renderGroupNames() {\r\n    this.selectedGroupName = null;\r\n    const masterGroupNames = [\r\n      ...new Set(\r\n        this.allMasterTemplates\r\n          .filter((f) => f.templateType === \"master\")\r\n          .map((m) => m.templateGroupName),\r\n      ),\r\n    ];\r\n\r\n    if (!masterGroupNames.length) {\r\n      console.log(\r\n        \"@@ ~ renderGroupNames [ERR]: (noe group names found): \",\r\n        masterGroupNames,\r\n      );\r\n      return;\r\n    }\r\n\r\n    this.selectedGroupName ??= masterGroupNames[0];\r\n\r\n    const y = 50;\r\n    const groupSpacing = 20;\r\n\r\n    const groups: fabric.Group[] = [];\r\n    let totalWidth = 0;\r\n\r\n    masterGroupNames.forEach((g) => {\r\n      if (!g) return;\r\n      const label = g;\r\n      const fontSize = 12;\r\n      const paddingX = 30;\r\n      const paddingY = 16;\r\n\r\n      const mainText = new fabric.FabricText(label, {\r\n        fontSize: fontSize,\r\n        fill: \"#363F72\",\r\n        fontFamily: \"Inter, Arial, sans-serif\",\r\n        fontWeight: \"500\",\r\n        originX: \"left\",\r\n        originY: \"top\",\r\n      });\r\n\r\n      const rectWidth = mainText.width! + 2 * paddingX;\r\n      const rectHeight = mainText.height! + 2 * paddingY;\r\n      const rectLeft = 30;\r\n      const rectTop = 18;\r\n\r\n      const mainRect = new fabric.Rect({\r\n        rx: 6,\r\n        ry: 6,\r\n        width: rectWidth,\r\n        height: rectHeight,\r\n        fill: this.selectedGroupName === label ? \"#F8F9FC\" : \"#fff\",\r\n        stroke: this.selectedGroupName === label ? \"#AFB5D9\" : \"#D0D5DD\",\r\n        strokeWidth: 2,\r\n        left: rectLeft,\r\n        top: rectTop,\r\n      });\r\n\r\n      mainText.set({\r\n        left: rectLeft + paddingX,\r\n        top: rectTop + (rectHeight - mainText.height!) / 2,\r\n      });\r\n\r\n      const bubbleW = 36;\r\n      const bubbleH = 18;\r\n      const bubbleLeft = rectLeft + rectWidth / 2 - bubbleW / 2;\r\n      const bubbleTop = rectHeight + bubbleH / 2;\r\n\r\n      const bubbleRect = new fabric.Rect({\r\n        rx: 4,\r\n        ry: 4,\r\n        width: bubbleW,\r\n        height: bubbleH,\r\n        fill: this.selectedGroupName === label ? \"#8389c5\" : \"#98A2B3\",\r\n        left: bubbleLeft,\r\n        top: bubbleTop,\r\n      });\r\n\r\n      const groupCount = this.allMasterTemplates.filter(\r\n        (m) => m.templateGroupName === g && m.templateType === \"master\",\r\n      ).length;\r\n\r\n      const numberText = new fabric.FabricText(groupCount.toString(), {\r\n        fontSize: 8,\r\n        fill: \"#fff\",\r\n        fontFamily: \"Inter, Arial, sans-serif\",\r\n        fontWeight: \"700\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        left: bubbleLeft + bubbleW / 2,\r\n        top: bubbleTop + bubbleH / 2,\r\n      });\r\n\r\n      const group = new fabric.Group(\r\n        [mainRect, mainText, bubbleRect, numberText],\r\n        {\r\n          left: 0,\r\n          top: 0,\r\n          selectable: false,\r\n          hoverCursor: \"pointer\",\r\n        },\r\n      ) as fabric.Group & {\r\n        groupName: string;\r\n        masterCount: number;\r\n        mainRect: fabric.Rect;\r\n        bubbleRect: fabric.Rect;\r\n      };\r\n\r\n      group.groupName = label;\r\n      group.masterCount = groupCount;\r\n      group.mainRect = mainRect;\r\n      group.bubbleRect = bubbleRect;\r\n\r\n      group.on(\"mousedown\", (opt: any) => {\r\n        if (this.selectedGroupName === label) return;\r\n\r\n        if (this.preventClick) return;\r\n        this.preventClick = true;\r\n\r\n        const prevGroup = this.canvas\r\n          .getObjects()\r\n          .find(\r\n            (obj) =>\r\n              obj instanceof fabric.Group &&\r\n              (obj as any).groupName === this.selectedGroupName,\r\n          ) as fabric.Group & {\r\n          mainRect: fabric.Rect;\r\n          bubbleRect: fabric.Rect;\r\n        };\r\n\r\n        if (prevGroup) {\r\n          prevGroup.mainRect.set({ fill: \"#ffffff\", stroke: \"#D0D5DD\" });\r\n          prevGroup.bubbleRect.set({ fill: \"#98A2B3\" });\r\n        }\r\n\r\n        group.mainRect.set({ fill: \"#F8F9FC\", stroke: \"#AFB5D9\" });\r\n        group.bubbleRect.set({ fill: \"#8389c5\" });\r\n\r\n        // Clear both masters and subs arrows, before rendering new set.\r\n        this.clearArrowById(this.selectedGroupName!);\r\n        this.clearArrowById(this.selectedMasterId);\r\n\r\n        this.selectedGroupName = label;\r\n        this.canvas.requestRenderAll();\r\n\r\n        const target = opt.target;\r\n        if (target && target instanceof fabric.Group) {\r\n          const parentGroup = target as fabric.Group;\r\n          const { gx, gy } = this.getGroupCenterBottom(parentGroup);\r\n          this.renderMasterFixtures(gx, gy + 50, parentGroup);\r\n        }\r\n      });\r\n\r\n      groups.push(group);\r\n      totalWidth += group.width! + groupSpacing;\r\n    });\r\n\r\n    totalWidth -= groupSpacing;\r\n\r\n    const canvasWidth = this.canvas.getWidth();\r\n    let x = (canvasWidth - totalWidth) / 2;\r\n\r\n    groups.forEach((group) => {\r\n      group.set({ left: x, top: y });\r\n      x += group.width! + groupSpacing;\r\n      this.canvas.add(group);\r\n    });\r\n\r\n    const selectedGroupFabricGroup = groups[0];\r\n\r\n    const { gx, gy } = this.getGroupCenterBottom(selectedGroupFabricGroup);\r\n    this.renderMasterFixtures(gx, gy + 50, selectedGroupFabricGroup);\r\n  }\r\n\r\n  async renderMasterFixtures(x: number, y: number, group?: any) {\r\n    this.selectedMasterTemplates = this.allMasterTemplates.filter(\r\n      (f) =>\r\n        f.templateType === \"master\" &&\r\n        f.templateGroupName === this.selectedGroupName,\r\n    );\r\n\r\n    this.selectedMasterId = this.selectedMasterTemplates[0]._id;\r\n    this.clearOldFixtureTemplatesFromCanvas(\"master\");\r\n    this.clearOldFixtureTemplatesFromCanvas(\"sub\");\r\n\r\n    const masters: any[] = await this.renderFixtures(\r\n      this.selectedMasterTemplates,\r\n      x,\r\n      y,\r\n    );\r\n\r\n    masters.forEach((m) => this.drawArrow(group, m, group.groupName));\r\n\r\n    const selectedMasterFabricGroup = masters[0];\r\n    const { gx, gy } = this.getGroupCenterBottom(selectedMasterFabricGroup);\r\n    this.renderSubFixtures(selectedMasterFabricGroup, gx, gy + 50);\r\n  }\r\n\r\n  async renderSubFixtures(group: any, x: number, y: number) {\r\n    this.subTemplates =\r\n      this.allFixture?.filter(\r\n        (f) => f.masterTemplateId === this.selectedMasterId,\r\n      ) ?? [];\r\n    if (this.subTemplates.length) {\r\n      const sub: any[] = await this.renderFixtures(\r\n        this.subTemplates,\r\n        x,\r\n        y,\r\n        group,\r\n      );\r\n      sub.forEach((m) => this.drawArrow(group, m, group.fixtureId));\r\n    }\r\n\r\n    this.preventClick = false;\r\n  }\r\n\r\n  async renderFixtures(\r\n    templates: any[],\r\n    x: number,\r\n    y: number,\r\n    parentFabric?: any,\r\n  ) {\r\n    const groupSpacing = 20;\r\n\r\n    type FixtureGroup = fabric.Group & {\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      groupName: string;\r\n      templateType: string;\r\n      name: string;\r\n      parentFabric: any;\r\n    };\r\n\r\n    const groups: FixtureGroup[] = await Promise.all(\r\n      templates.map(async (mf) => {\r\n        const actualShelves =\r\n          mf?.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ?? [];\r\n\r\n        const isMaster = mf.templateType === \"master\";\r\n        const height = this.toPixels(\r\n          mf.fixtureStaticLength.value,\r\n          mf.fixtureStaticLength.unit,\r\n        );\r\n        const width = this.toPixels(\r\n          mf.fixtureStaticWidth.value,\r\n          mf.fixtureStaticWidth.unit,\r\n        );\r\n        const mainContainer = this.createMainContainer(mf, x, y, isMaster);\r\n        const topContainer = this.createTopContainer(mf, x, y, isMaster);\r\n        const innerTopBox = this.createInnerTopBox(mf, x, y, isMaster);\r\n        const innerBottomBox = this.createInnerBottomBox(mf, x, y, isMaster);\r\n        const midContainer = this.createMidContainer(mf, x, y, isMaster);\r\n        const firstBox = this.createFirstBox(mf, x, y, isMaster);\r\n        const lastBox = this.createLastBox(mf, x, y, isMaster);\r\n        const { container: bottomContainer, text: bottomTextContent } =\r\n          this.createBottomContainer(mf, x, y);\r\n\r\n        const topWidth = width / 1.05;\r\n        const topHeight = (15 / 100) * height;\r\n        const topX = x + (width - topWidth) / 2;\r\n        const topY = y + this.verticalMargin;\r\n        const innerBoxHeight = topHeight / 2;\r\n\r\n        const innerTopText = new fabric.Textbox(\r\n          `Fixture ${mf?.associatedElementFixtureNumber}`,\r\n          {\r\n            left: topX + topWidth / 2,\r\n            top: topY + innerBoxHeight / 2,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n            fill: \"#009BF3\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: topWidth,\r\n            height: innerBoxHeight,\r\n            textAlign: \"center\",\r\n          },\r\n        );\r\n\r\n        const secondBoxY = topY + innerBoxHeight;\r\n        const textContent = getFixtureCanvasLabel(mf);\r\n\r\n        // Create adaptive text for inner bottom\r\n        const innerBottomText = this.createAdaptiveText(textContent, {\r\n          fontSize: 5,\r\n          maxHeight: innerBoxHeight,\r\n          width: topWidth,\r\n          left: topX + topWidth / 2,\r\n          top: secondBoxY + innerBoxHeight / 2,\r\n          fill: \"#FFFFFF\",\r\n          fontWeight: \"500\",\r\n        });\r\n\r\n        // Create first box text with ellipsis handling\r\n        const midWidth = width / 1.05;\r\n        const midHeight = (77 / 100) * height;\r\n        const midX = x + (width - midWidth) / 2;\r\n        const midY = topY + topHeight + this.verticalMargin;\r\n        const shelfCount = mf.shelfConfig.length;\r\n        const boxHeight = midHeight / (shelfCount + 2);\r\n        const firstBoxY = midY;\r\n\r\n        const labelText = mf?.header?.label ?? \"\";\r\n        let displayLabel = labelText;\r\n\r\n        if (labelText) {\r\n          let tempTextbox = new fabric.Textbox(labelText, {\r\n            fontSize: 7,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            width: midWidth,\r\n          });\r\n\r\n          if (tempTextbox.height > boxHeight) {\r\n            let ellipsis = \"...\";\r\n            let left = 0;\r\n            let right = labelText.length;\r\n\r\n            while (left < right) {\r\n              let mid = Math.floor((left + right) / 2);\r\n              let testText = labelText.slice(0, mid) + ellipsis;\r\n              tempTextbox.set({ text: testText });\r\n              if (tempTextbox.height > boxHeight) {\r\n                right = mid;\r\n              } else {\r\n                left = mid + 1;\r\n              }\r\n            }\r\n            displayLabel = labelText.slice(0, Math.max(0, left - 1)) + ellipsis;\r\n          }\r\n        }\r\n\r\n        const firstBoxText = new fabric.Textbox(displayLabel, {\r\n          left: midX + midWidth / 2,\r\n          top: firstBoxY + boxHeight / 2,\r\n          fontSize: 7,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"600\",\r\n          fill: isMaster ? \"#363F72\" : \"#009BF3\",\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          textAlign: \"center\",\r\n        });\r\n\r\n        // Create shelves using helper method\r\n        const shelves = this.createShelves(mf, x, y, isMaster);\r\n\r\n        // Add VM configurations to shelves if they exist\r\n        if (mf?.vmConfig?.length) {\r\n          for (let i = 0; i < mf.vmConfig.length; i++) {\r\n            try {\r\n              const vm = mf.vmConfig[i];\r\n              const startIndex = vm.startYPosition - 1;\r\n              const endIndex = vm.endYPosition - 1;\r\n              const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n              const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n              let vmHeightPx: number = shelfHeightSpan;\r\n              let vmY: number = shelfTopY;\r\n\r\n              if (vm.yZone && vm.yZone !== \"stretch\") {\r\n                vmHeightPx = shelfHeightSpan / 3;\r\n                switch (vm.yZone) {\r\n                  case \"top\":\r\n                    vmY = shelfTopY;\r\n                    break;\r\n                  case \"middle\":\r\n                    vmY = shelfTopY + vmHeightPx;\r\n                    break;\r\n                  case \"bottom\":\r\n                    vmY = shelfTopY + 2 * vmHeightPx;\r\n                    break;\r\n                  default:\r\n                    vmY = shelfTopY;\r\n                }\r\n              }\r\n\r\n              let vmX = midX;\r\n              let vmWidth = midWidth;\r\n\r\n              if (!vm.xZone || vm.xZone === \"stretch\") {\r\n                vmWidth = midWidth;\r\n                vmX = midX;\r\n              } else {\r\n                const sectionWidth = midWidth / 3;\r\n                switch (vm.xZone) {\r\n                  case \"left\":\r\n                    vmWidth = sectionWidth;\r\n                    vmX = midX;\r\n                    break;\r\n                  case \"middle\":\r\n                    vmWidth = sectionWidth;\r\n                    vmX = midX + sectionWidth;\r\n                    break;\r\n                  case \"right\":\r\n                    vmWidth = sectionWidth;\r\n                    vmX = midX + 2 * sectionWidth;\r\n                    break;\r\n                  default:\r\n                    vmWidth = midWidth;\r\n                    vmX = midX;\r\n                }\r\n              }\r\n\r\n              if (vm.vmImageUrl) {\r\n                try {\r\n                  const vmImage: any = await fabric.FabricImage.fromURL(\r\n                    `${this.cdnUrl}${vm.vmImageUrl}`,\r\n                    {\r\n                      crossOrigin: \"anonymous\",\r\n                    },\r\n                  );\r\n                  vmImage.set({\r\n                    left: vmX + vmWidth / 2,\r\n                    top: vmY + vmHeightPx / 2,\r\n                    originX: \"center\",\r\n                    originY: \"center\",\r\n                    scaleX: vmWidth / vmImage.width!,\r\n                    scaleY: vmHeightPx / vmImage.height!,\r\n                    selectable: false,\r\n                    evented: false,\r\n                  });\r\n                  shelves.push(vmImage);\r\n                } catch (err) {\r\n                  console.error(\r\n                    `Error loading image for VM: ${vm.vmImageUrl}`,\r\n                    err,\r\n                  );\r\n                }\r\n              } else {\r\n                const vmBox = new fabric.Rect({\r\n                  left: vmX,\r\n                  top: vmY,\r\n                  width: vmWidth,\r\n                  height: vmHeightPx,\r\n                  fill: \"#6938EF\",\r\n                  selectable: false,\r\n                  evented: false,\r\n                });\r\n\r\n                const vmText = this.createAdaptiveText(vm.vmName || \"\", {\r\n                  fontSize: 5,\r\n                  maxHeight: vmHeightPx,\r\n                  width: vmWidth,\r\n                  left: vmX + vmWidth / 2,\r\n                  top: vmY + vmHeightPx / 2,\r\n                  fill: \"white\",\r\n                  fontWeight: \"600\",\r\n                });\r\n\r\n                shelves.push(vmBox, vmText);\r\n              }\r\n            } catch (error) {\r\n              console.log(\"@@ ~ Error in drawing VM: \", error);\r\n            }\r\n          }\r\n        }\r\n\r\n        // Create last box text\r\n        const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n        const lastBoxText = new fabric.Textbox(\r\n          `${mf?.footer?.label ? mf.footer.label : \"\"}`,\r\n          {\r\n            left: midX + midWidth / 2,\r\n            top: lastBoxY + boxHeight / 2,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: isMaster ? \"#363F72\" : \"#009BF3\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            textAlign: \"center\",\r\n            width: midWidth,\r\n            height: boxHeight,\r\n          },\r\n        );\r\n\r\n        const groupChildren = [\r\n          mainContainer,\r\n          ...(!isMaster ? [topContainer, innerTopBox, innerTopText] : []),\r\n          innerBottomBox,\r\n          innerBottomText,\r\n          midContainer,\r\n          firstBox,\r\n          firstBoxText,\r\n          ...shelves,\r\n          lastBox,\r\n          lastBoxText,\r\n          bottomContainer,\r\n          bottomTextContent,\r\n        ];\r\n\r\n        const fixtureGroup = new fabric.Group(groupChildren, {\r\n          left: x,\r\n          top: y,\r\n          evented: true,\r\n          subTargetCheck: true,\r\n          selectable: false,\r\n          hoverCursor: \"pointer\",\r\n          // angle: mf.relativePosition?.angle ?? 0\r\n        }) as fabric.Group & {\r\n          fixtureId: string;\r\n          fixtureType: \"wall\" | \"floor\";\r\n          groupName: string;\r\n          templateType: string;\r\n          name: string;\r\n          parentFabric: any;\r\n        };\r\n\r\n        fixtureGroup.fixtureId = mf._id;\r\n        fixtureGroup.fixtureType = mf.fixtureType;\r\n        fixtureGroup.groupName = mf?.templateGroupName ?? \"\";\r\n        fixtureGroup.templateType = mf?.templateType ?? \"sub\";\r\n        fixtureGroup.name = mf.templateType ?? \"fixture\";\r\n        fixtureGroup.parentFabric = parentFabric;\r\n\r\n        fixtureGroup.on(\"mousedown\", (opt: any) => {\r\n          const childName = opt.subTargets?.[0]?.name;\r\n\r\n          if (\r\n            childName === undefined &&\r\n            isMaster &&\r\n            this.selectedMasterId !== mf._id &&\r\n            !this.preventClick\r\n          ) {\r\n            this.preventClick = true;\r\n            this.clearArrowById(this.selectedMasterId);\r\n            this.clearOldFixtureTemplatesFromCanvas(\"sub\");\r\n            this.selectedMasterId = mf._id;\r\n\r\n            const { gx, gy } = this.getGroupCenterBottom(fixtureGroup);\r\n            this.renderSubFixtures(fixtureGroup, gx, gy + 50);\r\n          }\r\n\r\n          if (fixtureGroup.templateType === \"sub\") {\r\n            this.selectedInstance.emit(mf);\r\n          }\r\n        });\r\n\r\n        return fixtureGroup;\r\n      }),\r\n    );\r\n\r\n    let totalWidth = 0;\r\n    groups.forEach((group) => {\r\n      totalWidth += group.width! + groupSpacing;\r\n    });\r\n\r\n    totalWidth -= groupSpacing;\r\n    let nx = x - totalWidth / 2;\r\n\r\n    groups.forEach((group) => {\r\n      group.set({ left: nx, top: y });\r\n      nx += group.width! + groupSpacing;\r\n      this.canvas.add(group);\r\n    });\r\n    return groups;\r\n  }\r\n\r\n  createMainContainer(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Rect {\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const radius = 3;\r\n\r\n    let mainContainerHeight = height + 1;\r\n    if (isMaster) {\r\n      const topHeight = (15 / 100) * height;\r\n      mainContainerHeight = height - topHeight / 2 + 1;\r\n    }\r\n\r\n    const mainContainerTop = isMaster\r\n      ? y + ((15 / 100) * height) / 2 - 1\r\n      : y - 1;\r\n\r\n    return new fabric.Rect({\r\n      left: x,\r\n      top: mainContainerTop,\r\n      width: width,\r\n      height: mainContainerHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n  }\r\n\r\n  createTopContainer(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Rect {\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const topWidth = width / 1.05;\r\n    const topHeight =\r\n      (15 / 100) *\r\n      this.toPixels(mf.fixtureStaticLength.value, mf.fixtureStaticLength.unit);\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n    const radius = 3;\r\n\r\n    return new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n  }\r\n\r\n  createInnerTopBox(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Path {\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const topWidth = width / 1.05;\r\n    const topHeight =\r\n      (15 / 100) *\r\n      this.toPixels(mf.fixtureStaticLength.value, mf.fixtureStaticLength.unit);\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n    const radius = 3;\r\n    const innerBoxHeight = topHeight / 2;\r\n\r\n    return new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n  }\r\n\r\n  createInnerBottomBox(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Path {\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const topWidth = width / 1.05;\r\n    const topHeight =\r\n      (15 / 100) *\r\n      this.toPixels(mf.fixtureStaticLength.value, mf.fixtureStaticLength.unit);\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n    const radius = 3;\r\n    const innerBoxHeight = topHeight / 2;\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    if (isMaster) {\r\n      return new fabric.Path(\r\n        `M ${topX + radius} ${secondBoxY} \r\n          L ${topX + topWidth - radius} ${secondBoxY} \r\n          Q ${topX + topWidth} ${secondBoxY} ${topX + topWidth} ${\r\n            secondBoxY + radius\r\n          } \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n            topX + topWidth - radius\r\n          } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n            secondBoxY + innerBoxHeight - radius\r\n          } \r\n          L ${topX} ${secondBoxY + radius} \r\n          Q ${topX} ${secondBoxY} ${topX + radius} ${secondBoxY} Z`,\r\n        {\r\n          fill: \"#363F72\",\r\n          stroke: \"#717BBC\",\r\n          strokeWidth: 0.27,\r\n        },\r\n      );\r\n    } else {\r\n      return new fabric.Path(\r\n        `M ${topX} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n            topX + topWidth - radius\r\n          } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n            secondBoxY + innerBoxHeight - radius\r\n          } \r\n          L ${topX} ${secondBoxY} Z`,\r\n        {\r\n          fill: \"#009BF3\",\r\n          stroke: \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n        },\r\n      );\r\n    }\r\n  }\r\n\r\n  createMidContainer(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Rect {\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const topHeight = (15 / 100) * height;\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = y + topHeight + this.verticalMargin;\r\n    const radius = 3;\r\n\r\n    return new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n  }\r\n\r\n  createFirstBox(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Path {\r\n    const actualShelves =\r\n      mf.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ?? [];\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const topHeight = (15 / 100) * height;\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = y + topHeight + this.verticalMargin;\r\n    const boxHeight = midHeight / (mf.shelfConfig.length + 2);\r\n    const firstBoxY = midY;\r\n    const radius = 3;\r\n\r\n    return new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: isMaster ? \"#EAECF5\" : \"#DAF1FF\",\r\n        stroke: isMaster ? \"#AFB5D9\" : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n  }\r\n\r\n  createLastBox(mf: any, x: number, y: number, isMaster: boolean): fabric.Path {\r\n    const actualShelves =\r\n      mf.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ?? [];\r\n\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const topHeight = (15 / 100) * height;\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = y + topHeight + this.verticalMargin;\r\n    const boxHeight = midHeight / (mf.shelfConfig.length + 2);\r\n    const lastBoxY = midY + boxHeight * (mf.shelfConfig.length + 1);\r\n    const radius = 3;\r\n\r\n    return new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: isMaster ? \"#EAECF5\" : \"#DAF1FF\",\r\n        stroke: isMaster ? \"#AFB5D9\" : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n  }\r\n\r\n  createBottomContainer(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n  ): { container: fabric.Rect; text: fabric.Textbox } {\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const topHeight = (15 / 100) * height;\r\n    const midHeight = (77 / 100) * height;\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = y + topHeight + midHeight + this.verticalMargin;\r\n    const radius = 3;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const actualShelfCount =\r\n      mf?.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\")?.length ?? 0;\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelfCount} . Products -  ${getFixtureProductCapacity(mf.shelfConfig)} . VM - ${mf.vmConfig.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2 + 4,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    return { container: bottomContainer, text: bottomTextContent };\r\n  }\r\n\r\n  createShelves(\r\n    mf: any,\r\n    x: number,\r\n    y: number,\r\n    isMaster: boolean,\r\n  ): fabric.Object[] {\r\n    const actualShelves =\r\n      mf.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ?? [];\r\n\r\n    const width = this.toPixels(\r\n      mf.fixtureStaticWidth.value,\r\n      mf.fixtureStaticWidth.unit,\r\n    );\r\n    const height = this.toPixels(\r\n      mf.fixtureStaticLength.value,\r\n      mf.fixtureStaticLength.unit,\r\n    );\r\n    const topHeight = (15 / 100) * height;\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = y + topHeight + this.verticalMargin;\r\n    const boxHeight = midHeight / (mf.shelfConfig.length + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const shelves: fabric.Object[] = [];\r\n\r\n    if (mf.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n      const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = mf?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit shelf height\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (mf.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < mf.shelfConfig?.length; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (mf.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = mf.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text = mf.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // Single-line ellipsis within shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const padding = 2;\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (mf.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of mf.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (mf.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    return shelves;\r\n  }\r\n\r\n  clearOldFixtureTemplatesFromCanvas(templateType: string) {\r\n    const groupsToRemove = this.canvas\r\n      .getObjects()\r\n      .filter(\r\n        (obj) =>\r\n          obj instanceof fabric.Group &&\r\n          (obj as any).templateType === templateType,\r\n      );\r\n\r\n    if (groupsToRemove) {\r\n      groupsToRemove.forEach((group) => this.canvas.remove(group));\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  drawArrow(fromGroup: fabric.Group, toGroup: fabric.Group, arrowId: string) {\r\n    const from = fromGroup.aCoords ?? fromGroup.calcOCoords();\r\n    const to = toGroup.aCoords ?? toGroup.calcOCoords();\r\n\r\n    const fromX = (from.bl.x + from.br.x) / 2;\r\n    const fromY = (from.bl.y + from.br.y) / 2;\r\n\r\n    const toX = (to.tl.x + to.tr.x) / 2;\r\n    const toY = (to.tl.y + to.tr.y) / 2;\r\n\r\n    const horizontalOffset = toX - fromX;\r\n    const verticalOffset = toY - fromY;\r\n    const curveSize = 14;\r\n\r\n    let pathData = \"\";\r\n\r\n    if (Math.abs(horizontalOffset) < 5) {\r\n      // Direct vertical line\r\n      pathData = `M ${fromX} ${fromY} L ${toX} ${toY}`;\r\n    } else {\r\n      const midY = fromY + verticalOffset / 2;\r\n      const direction = horizontalOffset > 0 ? 1 : -1;\r\n\r\n      const curve1X = fromX + direction * curveSize;\r\n      const curve2X = toX - direction * curveSize;\r\n\r\n      pathData = [\r\n        `M ${fromX} ${fromY}`,\r\n        `L ${fromX} ${midY - curveSize}`,\r\n        `Q ${fromX} ${midY} ${curve1X} ${midY}`,\r\n        `L ${curve2X} ${midY}`,\r\n        `Q ${toX} ${midY} ${toX} ${midY + curveSize}`,\r\n        `L ${toX} ${toY}`,\r\n      ].join(\" \");\r\n    }\r\n\r\n    const arrowLine = new fabric.Path(pathData, {\r\n      stroke: \"#AFB5D9\",\r\n      strokeWidth: 1.8,\r\n      fill: \"\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    // Arrowhead\r\n    const angle = Math.atan2(toY - (toY - 10), toX - toX);\r\n    const headlen = 10;\r\n    const arrowHead = new fabric.Path(\r\n      [\r\n        `M ${toX} ${toY}`,\r\n        `L ${toX - headlen * Math.cos(angle - Math.PI / 5)} ${\r\n          toY - headlen * Math.sin(angle - Math.PI / 5)\r\n        }`,\r\n        `M ${toX} ${toY}`,\r\n        `L ${toX - headlen * Math.cos(angle + Math.PI / 5)} ${\r\n          toY - headlen * Math.sin(angle + Math.PI / 5)\r\n        }`,\r\n      ].join(\" \"),\r\n      {\r\n        stroke: \"#AFB5D9\",\r\n        strokeWidth: 1.8,\r\n        selectable: false,\r\n        evented: false,\r\n      },\r\n    );\r\n\r\n    // Grouping both line and arrowhead\r\n    const arrowGroup = new fabric.Group([arrowLine, arrowHead], {\r\n      selectable: false,\r\n      evented: false,\r\n    }) as fabric.Group & { arrowId: string };\r\n\r\n    // Attach custom arrow ID\r\n    arrowGroup.arrowId = arrowId;\r\n\r\n    this.canvas.add(arrowGroup);\r\n  }\r\n\r\n  clearArrowById(arrowId: string) {\r\n    const arrowGroup = this.canvas\r\n      .getObjects()\r\n      .filter(\r\n        (obj) =>\r\n          obj instanceof fabric.Group && (obj as any).arrowId === arrowId,\r\n      );\r\n\r\n    if (arrowGroup) {\r\n      arrowGroup.forEach((group) => this.canvas.remove(group));\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div id=\"tree-canvas-card\" class=\"w-100 p-6\">\r\n  <canvas id=\"template-canvas\" #templateCanvas></canvas>\r\n  <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n    <div class=\"d-flex align-items-center\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\" class=\"me-1\">\r\n        <circle cx=\"4.8431\" cy=\"5.49996\" r=\"4.8431\" fill=\"#6172F3\" />\r\n      </svg>\r\n      <p class=\"m-0 me-3\">Master Template</p>\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" class=\"me-1\">\r\n        <circle cx=\"5.44466\" cy=\"5.49996\" r=\"4.8431\" fill=\"#33B5FF\" />\r\n      </svg>\r\n      <p class=\"m-0\">Fixture Instance</p>\r\n    </div>\r\n    <div class=\"zoom\">\r\n      <div class=\"zoom-in\" (click)=\"zoomIn()\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n          <path d=\"M12 5V19M5 12H19\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </div>\r\n      <div class=\"divider\"></div>\r\n      <div class=\"zoom-out\" (click)=\"zoomOut()\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n          <path d=\"M5 12H19\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { DomSanitizer, SafeHtml } from \"@angular/platform-browser\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\n@Component({\r\n  selector: \"lib-action-confirm-popup\",\r\n  templateUrl: \"./action-confirm-popup.component.html\",\r\n  styleUrl: \"./action-confirm-popup.component.scss\",\r\n})\r\nexport class ActionConfirmPopupComponent implements OnInit {\r\n  @Input() type:\r\n    | \"redo\"\r\n    | \"acceptAI\"\r\n    | \"keepPlano\"\r\n    | \"rejectResponse\"\r\n    | \"deleteVM\"\r\n    | \"acceptResponse\" = \"keepPlano\";\r\n\r\n  title: string = \"\";\r\n  description: string = \"\";\r\n  btnText: string = \"\";\r\n  private icon: string | null = ``;\r\n\r\n  safeIcon?: SafeHtml;\r\n\r\n  remark: string;\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n    private sanitizer: DomSanitizer\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    switch (this.type) {\r\n      case \"acceptAI\":\r\n        this.title = \"Accepting AI Output\";\r\n        this.description =\r\n          \"Your planogram will be updated according to the AI output or any updates made to it. Please ensure all changes match the store image.\";\r\n        this.btnText = \"Save & Accept\";\r\n        this.icon = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <g clip-path=\"url(#clip0_228_5774)\">\r\n                            <path\r\n                                d=\"M4.16602 1.6665L4.32435 2.44984C4.43782 3.01234 4.69457 3.53603 5.06977 3.97021C5.44497 4.40439 5.9259 4.73435 6.46602 4.92817L6.66602 4.99984L6.46602 5.0715C5.9259 5.26532 5.44497 5.59529 5.06977 6.02947C4.69457 6.46365 4.43782 6.98733 4.32435 7.54984L4.16602 8.33317L4.00768 7.54984C3.89422 6.98733 3.63746 6.46365 3.26226 6.02947C2.88706 5.59529 2.40613 5.26532 1.86602 5.0715L1.66602 4.99984L1.86602 4.92817C2.40613 4.73435 2.88706 4.40439 3.26226 3.97021C3.63746 3.53603 3.89422 3.01234 4.00768 2.44984L4.16602 1.6665ZM6.66602 13.3332L6.85768 14.3965C6.90745 14.6739 7.02674 14.9341 7.20439 15.1528C7.38204 15.3716 7.61226 15.5417 7.87352 15.6473L8.33268 15.8332L7.87352 16.019C7.61221 16.1244 7.38189 16.2944 7.20409 16.513C7.0263 16.7316 6.90683 16.9917 6.85685 17.269L6.66602 18.3332L6.47435 17.2698C6.42458 16.9925 6.30529 16.7322 6.12764 16.5135C5.94999 16.2947 5.71978 16.1246 5.45852 16.019L4.99935 15.8332L5.45852 15.6473C5.71983 15.5419 5.95014 15.372 6.12794 15.1534C6.30573 14.9348 6.4252 14.6746 6.47518 14.3973L6.66602 13.3332ZM13.3327 2.49984L13.796 4.7115C14.0322 5.83907 14.5565 6.88621 15.3178 7.75081C16.0791 8.61541 17.0515 9.26796 18.1402 9.64484L19.166 9.99984L18.1402 10.3548C17.0515 10.7317 16.0791 11.3843 15.3178 12.2489C14.5565 13.1135 14.0322 14.1606 13.796 15.2882L13.3327 17.4998L12.8693 15.2882C12.6332 14.1606 12.1089 13.1135 11.3476 12.2489C10.5862 11.3843 9.61382 10.7317 8.52518 10.3548L7.49935 9.99984L8.52518 9.64484C9.61382 9.26796 10.5862 8.61541 11.3476 7.75081C12.1089 6.88621 12.6332 5.83907 12.8693 4.7115L13.3327 2.49984Z\"\r\n                                stroke=\"black\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </g>\r\n                        <defs>\r\n                            <clipPath id=\"clip0_228_5774\">\r\n                                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                            </clipPath>\r\n                        </defs>\r\n                    </svg>\r\n                    `;\r\n        break;\r\n      case \"redo\":\r\n        this.title = \"Redo\";\r\n        this.description =\r\n          \"No action has been taken. This will reassign the task back to the store.\";\r\n        this.btnText = \"Redo\";\r\n        this.icon = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <path d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n                          fill=\"black\" />\r\n                      </svg>\r\n                    `;\r\n        break;\r\n      case \"keepPlano\":\r\n        this.title = \"Keep planogram\";\r\n        this.description =\r\n          \"Your planogram will be updated according to the changes you’ve made. Please confirm that all updates match the store image.\";\r\n        this.btnText = \"Yes, Update\";\r\n\r\n        this.icon = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                      </svg>\r\n                    `;\r\n        break;\r\n      case \"rejectResponse\":\r\n        this.title = \"Reject Store Response\";\r\n        this.description =\r\n          \"No changes will be applied to this fixture in the current planogram. Do you want to proceed?\";\r\n        this.btnText = \"Yes, Confirm\";\r\n\r\n        this.icon = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                      </svg>\r\n                    `;\r\n        break;\r\n      case \"acceptResponse\":\r\n        this.title = \"Accept Store Response\";\r\n        this.description =\r\n          \"Your planogram will be updated with the store response — header label and the brand for each zone will be patched onto the existing template. Please confirm.\";\r\n        this.btnText = \"Save & Accept\";\r\n        this.icon = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n                          stroke=\"#101828\" stroke-width=\"1.5\" />\r\n                      </svg>\r\n                    `;\r\n        break;\r\n      case \"deleteVM\":\r\n        this.title = \"Delete Visual Merchandise\";\r\n        this.description =\r\n          \"Are you sure you want to delete this visual merchandise? This action cannot be undone.\";\r\n\r\n        this.btnText = \"Yes, Delete\";\r\n        this.icon = null;\r\n        break;\r\n    }\r\n\r\n    if (this.icon) {\r\n      this.safeIcon = this.sanitizer.bypassSecurityTrustHtml(this.icon);\r\n    }\r\n  }\r\n\r\n  onCancel() {\r\n    this.activeModal.close({ action: \"notOk\", remark: null });\r\n  }\r\n\r\n  onOk() {\r\n    this.activeModal.close({ action: \"ok\", remark: this.remark });\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n    <div class=\"d-flex gap-3 align-items-center mb-5\">\r\n        <div *ngIf=\"safeIcon\" [innerHTML]=\"safeIcon\"></div>\r\n        <h3 class=\"title\">{{ title }}</h3>\r\n    </div>\r\n\r\n    <p class=\"description\">{{ description }}</p>\r\n\r\n    <div *ngIf=\"type != 'deleteVM'\" class=\"d-flex flex-column gap-2 mb-4\">\r\n        <label for=\"remark\">Remarks</label>\r\n        <textarea class=\"form-control\" id=\"remark\" [(ngModel)]=\"remark\" rows=\"3\"\r\n            placeholder=\"Enter your remark here...\"></textarea>\r\n    </div>\r\n\r\n    <div class=\"modal-actions mt-5\">\r\n        <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n        <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onOk()\">\r\n            {{btnText}}\r\n        </button>\r\n    </div>\r\n</div>","\r\nimport { NgFor, NgIf } from \"@angular/common\";\r\nimport {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { SHELF_COLORS } from \"../../../../data/fixture-template.data\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { firstValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { rgbToHex } from \"../../../../functions/plano.function\";\r\nimport { NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\n@Component({\r\n  selector: \"fixture\",\r\n  standalone: true,\r\n  imports: [NgIf, NgFor, NgbTooltip],\r\n  templateUrl: \"./fixture.component.html\",\r\n  styleUrl: \"./fixture.component.scss\",\r\n})\r\nexport class FixtureComponent\r\nimplements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixture: any;\r\n  \r\n  // @Input() vmList: VmLibraryList[] = [];\r\n  \r\n  @Input() showColors: boolean = true;\r\n  @Input() showVMs: boolean = true;\r\n  @Input() showBCs: boolean = true;\r\n  @Input() showHeaderFooterAlways: boolean = false;\r\n\r\n  @ViewChild(\"fixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n  \r\n  clientId: string;\r\n  \r\n  imgCDN: string;\r\n  shelfColors = SHELF_COLORS;\r\n  \r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n  \r\n  // vmList: VmLibraryList[] = [];\r\n  isPageLoading: boolean = true;\r\n  \r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n  \r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n  \r\n  ngOnInit() {\r\n    this.gs.environment\r\n    .pipe(takeUntil(this.destroy$))\r\n    .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n    \r\n    this.isPageLoading = true;\r\n    \r\n    this.gs.dataRangeValue\r\n    .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        \r\n        this.isPageLoading = false;\r\n      });\r\n    }\r\n    \r\n    ngOnChanges(changes: SimpleChanges): void {\r\n      if (changes[\"fixture\"]?.currentValue) {\r\n        this.sanitizeVmConfig();\r\n        // console.log(\"@@ ~ Plano fixture:\", this.fixture);\r\n        setTimeout(() => {\r\n          this.applyShelfColors();\r\n          this.handleVmPositionAndSize();\r\n        }, 400);\r\n      }\r\n    }\r\n    \r\n  private sanitizeVmConfig(): void {\r\n    const shelfCount = this.fixture?.shelfConfig?.length ?? 1;\r\n\r\n    this.fixture?.vmConfig?.forEach((vm: any) => {\r\n      if (!vm?.startYPosition && !vm?.endYPosition) {\r\n        if (vm?.xZone === 'stretch' && vm?.yZone === 'stretch') {\r\n          vm.startYPosition = shelfCount;\r\n          vm.endYPosition = shelfCount;\r\n        } else {\r\n          vm.startYPosition = 1;\r\n          vm.endYPosition = shelfCount;\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  // getSelectedVM(vm: any) {\r\n  //   if (vm?.vmId) {\r\n  //     return this.vmList.find((v) => v.id === vm.vmId);\r\n  //   } else {\r\n  //     return this.vmList.find(\r\n  //       (v) => v.name === vm.vmName && v.type === vm.vmType\r\n  //     );\r\n  //   }\r\n  // }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    if (!this.showVMs) return true;\r\n\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixture?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition;\r\n      let endShelf = e?.endYPosition;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.fixture?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixture?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            if (this.showColors) {\r\n              secDivs.forEach((d) => {\r\n                if (!d) return;\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n                if (cap) {\r\n                  cap.style.border = `1px solid ${this.shelfColors[i].border}`;\r\n                }\r\n              });\r\n            }\r\n          });\r\n\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            if (cap) {\r\n              const sY =\r\n                y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n              cap.style.transform = `translateY(${sY}px)`;\r\n            }\r\n            y += d.offsetHeight;\r\n          });\r\n\r\n          if (!this.showBCs) return true;\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                if (this.showColors) {\r\n                  bc.style.borderColor = color.border;\r\n                  bc.style.backgroundColor = \"#fff\";\r\n                }\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          let y = 0;\r\n\r\n          shelfDivs.forEach((div, i) => {\r\n            const cap = div.querySelector(\".capacity\") as HTMLElement;\r\n            if (!cap) {\r\n              y += div.offsetHeight;\r\n              return;\r\n            }\r\n            const sY =\r\n              y + (div.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[i].border}`;\r\n            y += div.offsetHeight;\r\n\r\n            if (this.showColors) {\r\n              div.style.backgroundColor = this.shelfColors[i].bg;\r\n              div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            }\r\n\r\n            if (!this.showBCs) return;\r\n\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            if (this.showColors) {\r\n              bc.style.borderColor = this.shelfColors[i].border;\r\n              bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            }\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        let y = 0;\r\n        shelfDivs.forEach((d) => {\r\n          if (!d) return;\r\n\r\n          if (this.showColors) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n          }\r\n\r\n          const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n          const sY =\r\n            y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n          cap.style.transform = `translateY(${sY}px)`;\r\n          cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n          y += d.offsetHeight;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixture?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixture?.shelfConfig?.map((s: any) => {\r\n        const shelfLabel = `${s.shelfType} ${s.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...s,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","@if(isPageLoading){\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n}@else {\r\n\r\n    <section #fixtureRoot id=\"fixture-view\">\r\n        <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\"\r\n                *ngIf=\"(fixture?.header?.isEnabled && fixture?.fixtureType === 'wall') || (showHeaderFooterAlways && fixture?.header?.label)\">\r\n                <p>{{ fixture?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"fixture?.vmConfig?.length && showVMs\">\r\n                    <ng-container *ngFor=\"let vm of fixture?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN + vm?.vmImageUrl\"\r\n                                    alt=\"Vm Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"fixture?.productResolutionLevel === 'L1' && showBCs\">\r\n                    <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixture?.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of fixture?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"fixture?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"fixture?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"fixture?.productResolutionLevel === 'L3' && showBCs\">\r\n                    <!-- <div id=\"body-loader\">\r\n                    <div class=\"loader\"></div>\r\n                </div> -->\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixture?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"fixture?.productResolutionLevel === 'L2' && showBCs\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                            <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            </div>\r\n                            <div class=\"capacity\">{{item.productPerShelf * item.trayRows}}</div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n\r\n                            @if(item.shelfType ==='shelf'){\r\n                                <div class=\"capacity\">{{item.productPerShelf}}</div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n                *ngIf=\"(fixture?.footer?.isEnabled && fixture?.fixtureType === 'wall') || (showHeaderFooterAlways && fixture?.footer?.label)\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixture?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </section>\r\n}","import { NgClass, NgFor, NgIf } from \"@angular/common\";\r\nimport {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { SHELF_COLORS } from \"../../../../data/fixture-template.data\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { rgbToHex } from \"../../../../functions/plano.function\";\r\nimport { NgbModal, NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { ActionConfirmPopupComponent } from \"../action-confirm-popup/action-confirm-popup.component\";\r\n\r\n@Component({\r\n  selector: \"editable-fixture\",\r\n  standalone: true,\r\n  imports: [NgIf, NgFor, NgbTooltip, NgClass, FormsModule],\r\n  templateUrl: \"./editable-fixture.component.html\",\r\n  styleUrl: \"./editable-fixture.component.scss\",\r\n})\r\nexport class EditableFixtureComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  // @Input() vmList: VmLibraryList[] = [];\r\n  @Input() fixture: any;\r\n  editingAiFixture: any | null = null;\r\n\r\n  editFixtureQuickDetails: FixtureQuickDetail[] = [];\r\n\r\n  @Input() showColors: boolean = false;\r\n  @Input() showVMs: boolean = true;\r\n  @Input() showBCs: boolean = false;\r\n  @Input() editMode: boolean = true;\r\n\r\n  @Output() onCancel = new EventEmitter<void>();\r\n  @Output() onDone = new EventEmitter<any>();\r\n  @Output() editTab = new EventEmitter<any>();\r\n\r\n  @ViewChild(\"fixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n  isQuickEditSubmitted = false;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n    private ngbModal: NgbModal,\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        this.isPageLoading = false;\r\n      });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"fixture\"] || changes[\"editMode\"] || changes[\"planoFixture\"]) {\r\n      this.editingAiFixture = structuredClone(this.fixture);\r\n      \r\n      this.editFixtureQuickDetails = this.buildFixtureQuickDetails(\r\n        this.editingAiFixture,\r\n      );\r\n      \r\n      // console.log(\"@@ ~ AI Fixture:\", this.fixture);\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 400);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  getQuickItem(key: string) {\r\n    return this.editFixtureQuickDetails.find((i) => i.key === key);\r\n  }\r\n\r\n  private isLeaderShelf(shelfNumber: number): boolean {\r\n    const leaderShelves = this.getLeaderShelves(this.editingAiFixture);\r\n    return leaderShelves.has(shelfNumber);\r\n  }\r\n\r\n  private getLeaderShelves(fixture: any): Set<number> {\r\n    const leaderShelves = new Set<number>();\r\n    if (!fixture?.shelfConfig) return leaderShelves;\r\n\r\n    const shelves = Array.isArray(fixture.shelfConfig)\r\n      ? [...fixture.shelfConfig]\r\n      : [];\r\n\r\n    shelves.sort((a: any, b: any) => a.shelfNumber - b.shelfNumber);\r\n\r\n    let previousShelfType: string | null = null;\r\n    let previousShelfNumber: number | null = null;\r\n\r\n    shelves.forEach((s: any) => {\r\n      const shelfNum = Number(s.shelfNumber);\r\n      const currentShelfType = s.shelfType;\r\n\r\n      if (\r\n        previousShelfType === null ||\r\n        previousShelfType !== currentShelfType ||\r\n        (previousShelfNumber !== null && shelfNum !== previousShelfNumber + 1)\r\n      ) {\r\n        leaderShelves.add(shelfNum);\r\n      }\r\n\r\n      previousShelfType = currentShelfType;\r\n      previousShelfNumber = shelfNum;\r\n    });\r\n\r\n    return leaderShelves;\r\n  }\r\n\r\n  private getShelvesInSameGroup(\r\n    fixture: any,\r\n    targetShelfNumber: number,\r\n  ): number[] {\r\n    const shelvesInGroup: number[] = [];\r\n    if (!fixture?.shelfConfig) return shelvesInGroup;\r\n\r\n    const shelves = Array.isArray(fixture.shelfConfig)\r\n      ? [...fixture.shelfConfig]\r\n      : [];\r\n\r\n    shelves.sort((a: any, b: any) => a.shelfNumber - b.shelfNumber);\r\n\r\n    const targetShelf = shelves.find(\r\n      (s: any) => Number(s.shelfNumber) === targetShelfNumber,\r\n    );\r\n    if (!targetShelf) return shelvesInGroup;\r\n\r\n    const targetShelfType = targetShelf.shelfType;\r\n\r\n    let groupStartIndex = -1;\r\n    let previousShelfType: string | null = null;\r\n    let previousShelfNumber: number | null = null;\r\n\r\n    for (let i = 0; i < shelves.length; i++) {\r\n      const s = shelves[i];\r\n      const shelfNum = Number(s.shelfNumber);\r\n      const currentShelfType = s.shelfType;\r\n\r\n      if (\r\n        previousShelfType === null ||\r\n        previousShelfType !== currentShelfType ||\r\n        (previousShelfNumber !== null && shelfNum !== previousShelfNumber + 1)\r\n      ) {\r\n        groupStartIndex = i;\r\n      }\r\n\r\n      if (shelfNum === targetShelfNumber) {\r\n        break;\r\n      }\r\n\r\n      previousShelfType = currentShelfType;\r\n      previousShelfNumber = shelfNum;\r\n    }\r\n\r\n    if (groupStartIndex >= 0) {\r\n      previousShelfNumber = null;\r\n      for (let i = groupStartIndex; i < shelves.length; i++) {\r\n        const s = shelves[i];\r\n        const shelfNum = Number(s.shelfNumber);\r\n        const currentShelfType = s.shelfType;\r\n\r\n        if (\r\n          currentShelfType === targetShelfType &&\r\n          (previousShelfNumber === null || shelfNum === previousShelfNumber + 1)\r\n        ) {\r\n          shelvesInGroup.push(shelfNum);\r\n          previousShelfNumber = shelfNum;\r\n        } else {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return shelvesInGroup;\r\n  }\r\n\r\n  buildFixtureQuickDetails(fixture: any) {\r\n    if (!fixture) return [];\r\n\r\n    const list: FixtureQuickDetail[] = [];\r\n\r\n    const safe = (v: any) =>\r\n      v === null || v === undefined || v === \"\" ? \"-\" : v;\r\n\r\n    list.push({\r\n      key: \"fixtureHeader\",\r\n      label: \"Fixture Header:\",\r\n      value: safe(fixture?.header?.label),\r\n      editable: true,\r\n      meta: { type: \"fixture\" },\r\n    });\r\n\r\n    const shelves = Array.isArray(fixture.shelfConfig)\r\n      ? fixture.shelfConfig\r\n      : [];\r\n\r\n    const leaderShelves = this.getLeaderShelves(fixture);\r\n\r\n    shelves\r\n      .sort((a: any, b: any) => a.shelfNumber - b.shelfNumber)\r\n      .forEach((s: any) => {\r\n        const shelfNum = Number(safe(s.shelfNumber));\r\n        const isShelf = s.shelfType === \"shelf\";\r\n\r\n        const key = `${isShelf ? \"shelf\" : \"tray\"}${shelfNum}`;\r\n        const label = isShelf\r\n          ? `Shelf ${shelfNum} capacity:`\r\n          : `Tray ${shelfNum} capacity:`;\r\n\r\n        let capacity = \"0\";\r\n\r\n        if (s.productPerShelf) {\r\n          if (isShelf) {\r\n            capacity = String(s.productPerShelf);\r\n          } else {\r\n            const trayRows = s.trayRows || 1;\r\n            capacity = trayRows ? String(s.productPerShelf * trayRows) : \"0\";\r\n          }\r\n        }\r\n\r\n        list.push({\r\n          key,\r\n          label,\r\n          value: capacity,\r\n          editable: true,\r\n          meta: {\r\n            type: isShelf ? \"shelf\" : \"tray\",\r\n            shelfNumber: shelfNum,\r\n          },\r\n        });\r\n      });\r\n    return list;\r\n  }\r\n\r\n  // getSelectedVM(vm: any) {\r\n  //   if (vm?.vmId) {\r\n  //     return this.vmList.find((v) => v.id === vm.vmId);\r\n  //   } else {\r\n  //     return this.vmList.find(\r\n  //       (v) => v.name === vm.vmName && v.type === vm.vmType\r\n  //     );\r\n  //   }\r\n  // }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    if (!this.showVMs) return true;\r\n\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.editingAiFixture?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ?? this.editingAiFixture?.shelfConfig?.length ?? 1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.editingAiFixture?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            // const cap = d.querySelector(\".edit-input\") as HTMLElement;\r\n            // const sY =\r\n            //   y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            // cap.style.transform = `translateY(${sY}px)`;\r\n            // y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.editingAiFixture?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            if (this.showColors) {\r\n              secDivs.forEach((d) => {\r\n                if (!d) return;\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n              });\r\n            }\r\n          });\r\n\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            const cap = d.querySelector(\".input-container\") as HTMLElement;\r\n            if (cap) {\r\n              // const sY = y - cap.offsetTop + 10;\r\n              const sY =\r\n                y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n              cap.style.transform = `translateY(${sY}px)`;\r\n            }\r\n            y += d.offsetHeight;\r\n          });\r\n\r\n          if (!this.showBCs) return true;\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                if (this.showColors) {\r\n                  bc.style.borderColor = color.border;\r\n                  bc.style.backgroundColor = \"#fff\";\r\n                }\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          let y = 0;\r\n\r\n          shelfDivs.forEach((div, i) => {\r\n            const cap = div.querySelector(\".input-container\") as HTMLElement;\r\n            if (!cap) {\r\n              y += div.offsetHeight;\r\n              return;\r\n            }\r\n            const sY =\r\n              y + (div.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            y += div.offsetHeight;\r\n\r\n            if (this.showColors) {\r\n              div.style.backgroundColor = this.shelfColors[i].bg;\r\n              div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            }\r\n\r\n            if (!this.showBCs) return;\r\n\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            if (this.showColors) {\r\n              bc.style.borderColor = this.shelfColors[i].border;\r\n              bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            }\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          // let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            // const cap = d.querySelector(\".edit-input\") as HTMLElement;\r\n            // const sY =\r\n            //   y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            // cap.style.transform = `translateY(${sY}px)`;\r\n            // y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        // let y = 0;\r\n        shelfDivs.forEach((d) => {\r\n          if (!d) return;\r\n\r\n          if (this.showColors) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n          }\r\n\r\n          // const cap = d.querySelector(\".edit-input\") as HTMLElement;\r\n          // const sY =\r\n          //   y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n          // cap.style.transform = `translateY(${sY}px)`;\r\n          // y += d.offsetHeight;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.editingAiFixture?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.editingAiFixture?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.editingAiFixture?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.editingAiFixture?.shelfConfig?.map((s: any) => {\r\n        const shelfLabel = `${s.shelfType} ${s.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...s,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  onCapacityInput(event: Event, item: FixtureQuickDetail): void {\r\n    const input = event.target as HTMLInputElement;\r\n    let v = input.value.replace(/[^0-9]/g, \"\").slice(0, 2);\r\n\r\n    input.value = v;\r\n    item.value = v;\r\n\r\n    this.onQuickValueChange(item, item.value);\r\n    setTimeout(() => {\r\n      this.applyShelfColors();\r\n    }, 50);\r\n  }\r\n\r\n  onQuickValueChange(item: FixtureQuickDetail, newValue: string): void {\r\n    const targetFixture = this.editingAiFixture;\r\n\r\n    if (!targetFixture || !item?.meta) return;\r\n\r\n    const value = newValue?.trim();\r\n    item.value = value;\r\n\r\n    if (item.meta.type === \"fixture\" && item.key === \"fixtureHeader\") {\r\n      targetFixture.header.label = value || \"\";\r\n      return;\r\n    }\r\n\r\n    const shelfNumber = item.meta.shelfNumber;\r\n    if (!shelfNumber) return;\r\n\r\n    const shelf = (targetFixture.shelfConfig ?? []).find(\r\n      (s: any) => Number(s.shelfNumber) === shelfNumber,\r\n    );\r\n\r\n    if (!shelf) return;\r\n\r\n    const numericValue = Number(value);\r\n    if (isNaN(numericValue) || numericValue < 0) return;\r\n\r\n    // Shelf → direct mapping\r\n    if (item.meta.type === \"shelf\") {\r\n      shelf.productPerShelf = numericValue;\r\n\r\n      if (this.isLeaderShelf(shelfNumber)) {\r\n        const shelvesInGroup = this.getShelvesInSameGroup(\r\n          targetFixture,\r\n          shelfNumber,\r\n        );\r\n\r\n        shelvesInGroup.forEach((shelfNum) => {\r\n          if (shelfNum !== shelfNumber) {\r\n            const groupShelf = (targetFixture.shelfConfig ?? []).find(\r\n              (s: any) => Number(s.shelfNumber) === shelfNum,\r\n            );\r\n            if (groupShelf && groupShelf.shelfType === shelf.shelfType) {\r\n              groupShelf.productPerShelf = numericValue;\r\n\r\n              const isShelf = groupShelf.shelfType === \"shelf\";\r\n              const key = `${isShelf ? \"shelf\" : \"tray\"}${shelfNum}`;\r\n              const quickItem = this.getQuickItem(key);\r\n              if (quickItem) {\r\n                quickItem.value = String(numericValue);\r\n              }\r\n            }\r\n          }\r\n        });\r\n      }\r\n\r\n      return;\r\n    }\r\n  }\r\n\r\n  onTrayProductChange(event: Event, shelf: any) {\r\n    const input = event.target as HTMLInputElement;\r\n    let v = input.value.replace(/[^0-9]/g, \"\").slice(0, 2);\r\n    input.value = v;\r\n\r\n    const numericValue = v ? Number(v) : null;\r\n    if (numericValue === null) return;\r\n\r\n    shelf.productPerShelf = numericValue;\r\n\r\n    if (this.isLeaderShelf(Number(shelf.shelfNumber))) {\r\n      const shelvesInGroup = this.getShelvesInSameGroup(\r\n        this.editingAiFixture,\r\n        Number(shelf.shelfNumber),\r\n      );\r\n\r\n      shelvesInGroup.forEach((shelfNum) => {\r\n        if (shelfNum !== Number(shelf.shelfNumber)) {\r\n          const groupShelf = (this.editingAiFixture.shelfConfig ?? []).find(\r\n            (s: any) => Number(s.shelfNumber) === shelfNum,\r\n          );\r\n          if (groupShelf && groupShelf.shelfType === shelf.shelfType) {\r\n            groupShelf.productPerShelf = numericValue;\r\n\r\n            const key = `tray${shelfNum}`;\r\n            const quickItem = this.getQuickItem(key);\r\n            if (quickItem && groupShelf.trayRows) {\r\n              quickItem.value = String(numericValue * groupShelf.trayRows);\r\n            }\r\n          }\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  onTrayRowChange(event: Event, shelf: any) {\r\n    const input = event.target as HTMLInputElement;\r\n    let v = input.value.replace(/[^0-9]/g, \"\").slice(0, 2);\r\n    input.value = v;\r\n\r\n    const numericValue = v ? Number(v) : null;\r\n    if (numericValue === null) return;\r\n\r\n    shelf.trayRows = numericValue;\r\n\r\n    // Only update the group if this is a leader shelf\r\n    if (this.isLeaderShelf(Number(shelf.shelfNumber))) {\r\n      const shelvesInGroup = this.getShelvesInSameGroup(\r\n        this.editingAiFixture,\r\n        Number(shelf.shelfNumber),\r\n      );\r\n\r\n      shelvesInGroup.forEach((shelfNum) => {\r\n        if (shelfNum !== Number(shelf.shelfNumber)) {\r\n          const groupShelf = (this.editingAiFixture.shelfConfig ?? []).find(\r\n            (s: any) => Number(s.shelfNumber) === shelfNum,\r\n          );\r\n          if (groupShelf && groupShelf.shelfType === shelf.shelfType) {\r\n            groupShelf.trayRows = numericValue;\r\n\r\n            const key = `tray${shelfNum}`;\r\n            const quickItem = this.getQuickItem(key);\r\n            if (quickItem && groupShelf.productPerShelf) {\r\n              quickItem.value = String(\r\n                numericValue * groupShelf.productPerShelf,\r\n              );\r\n            }\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    setTimeout(() => {\r\n      this.applyShelfColors();\r\n      this.handleVmPositionAndSize();\r\n    }, 50);\r\n  }\r\n\r\n  isInvalidTray(shelf: any): boolean {\r\n    return (\r\n      shelf.shelfType === \"tray\" &&\r\n      (shelf.trayRows == null ||\r\n        shelf.trayRows === \"\" ||\r\n        isNaN(+shelf.trayRows) ||\r\n        shelf.trayRows < 0 ||\r\n        shelf.productPerShelf == null ||\r\n        shelf.productPerShelf === \"\" ||\r\n        isNaN(+shelf.productPerShelf) ||\r\n        shelf.productPerShelf < 0)\r\n    );\r\n  }\r\n\r\n  onClickDone() {\r\n    this.isQuickEditSubmitted = true;\r\n    if (this.isQuickValuesContainsError()) return;\r\n\r\n    this.onDone.emit(this.editingAiFixture);\r\n  }\r\n\r\n  onClickCancel() {\r\n    this.onCancel.emit();\r\n  }\r\n\r\n  isQuickValuesContainsError(): boolean {\r\n    const quickList = this.editFixtureQuickDetails ?? [];\r\n    const fixture = this.editingAiFixture;\r\n    const shelfError = quickList\r\n      .filter((l) => l.editable && l.meta?.type === \"shelf\")\r\n      .some((l) => this.isInvalidQuickValue(l.value));\r\n\r\n    if (shelfError) return true;\r\n\r\n    const fixtureError = quickList\r\n      .filter((l) => l.editable && l.meta?.type === \"fixture\")\r\n      .some((l) => this.isInvalidHeaderValue(l.value));\r\n\r\n    if (fixtureError) return true;\r\n\r\n    const trayError = (fixture?.shelfConfig ?? []).some((s: any) => {\r\n      if (s.shelfType !== \"tray\") return false;\r\n\r\n      const rowsInvalid =\r\n        s.trayRows == null ||\r\n        s.trayRows === \"\" ||\r\n        isNaN(+s.trayRows) ||\r\n        +s.trayRows < 0;\r\n\r\n      const capacityInvalid =\r\n        s.productPerShelf == null ||\r\n        s.productPerShelf === \"\" ||\r\n        isNaN(+s.productPerShelf) ||\r\n        +s.productPerShelf < 0;\r\n\r\n      return rowsInvalid || capacityInvalid;\r\n    });\r\n\r\n    if (trayError) return true;\r\n\r\n    return false;\r\n  }\r\n\r\n  get headerItem() {\r\n    return this.getQuickItem(\"fixtureHeader\");\r\n  }\r\n\r\n  getQuickItemOnce(key: string) {\r\n    return this.getQuickItem(key);\r\n  }\r\n\r\n  isInvalidQuickValue(value: any): boolean {\r\n    return value == null || value === \"\";\r\n  }\r\n\r\n  isInvalidHeaderValue(value: any): boolean {\r\n    return value == null || value === \"\";\r\n  }\r\n\r\n  editVm() {\r\n    if (!this.editMode) return;\r\n\r\n    this.editTab.emit({\r\n      tab: \"vms\",\r\n      fixtureData: this.editingAiFixture,\r\n    });\r\n  }\r\n\r\n  async deleteVm(vmIndex: any) {\r\n    const result = await this.confirmAction(\"deleteVM\");\r\n    if (result?.action === \"notOk\") return false;\r\n\r\n    this.editingAiFixture.vmConfig.splice(vmIndex, 1);\r\n  }\r\n\r\n  async confirmAction(\r\n    type: \"redo\" | \"acceptAI\" | \"keepPlano\" | \"deleteVM\",\r\n  ): Promise<{ action: string; remark: string | null } | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ActionConfirmPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        backdrop: \"static\",\r\n      });\r\n      modelRef.componentInstance.type = type;\r\n\r\n      return await modelRef.result.then<{\r\n        action: string;\r\n        remark: string | null;\r\n      }>((result) => result);\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n\r\ninterface FixtureQuickDetail {\r\n  key: string;\r\n  label: string;\r\n  value: string;\r\n  editable: boolean;\r\n  isDifferent?: boolean;\r\n\r\n  meta?: {\r\n    type: \"fixture\" | \"shelf\" | \"tray\";\r\n    shelfNumber?: number;\r\n  };\r\n}\r\n","@if(isPageLoading){\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n}@else {\r\n\r\n    <div *ngIf=\"editMode\" class=\"quick-edit-actions\">\r\n        <button class=\"btn btn-outline quick-btn\" type=\"button\" (click)=\"onClickCancel()\">\r\n            Cancel\r\n        </button>\r\n        <button class=\"btn btn-primary quick-btn\" type=\"button\" (click)=\"onClickDone()\">\r\n            Submit\r\n        </button>\r\n    </div>\r\n\r\n    <section #fixtureRoot id=\"fixture-view\">\r\n        <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\"\r\n                *ngIf=\"editingAiFixture?.header?.isEnabled && editingAiFixture?.fixtureType === 'wall'\">\r\n                @if(editMode){\r\n\r\n                    <div class=\"d-flex flex-column align-items-start w-100\">\r\n                        <input [class.diff]=\"editingAiFixture?.header?.isDifferent\"\r\n                            class=\"col-6 value edit-input form-control w-100\" type=\"text\" maxlength=\"150\"\r\n                            [ngModel]=\"headerItem?.value\" (ngModelChange)=\"onQuickValueChange(headerItem!, $event)\" />\r\n\r\n                        @if (isInvalidHeaderValue(headerItem?.value) && isQuickEditSubmitted) {\r\n                            <p class=\"text-danger m-0 mt-1 ms-1\" style=\"font-size: 11px;\">\r\n                                Cannot be empty\r\n                            </p>\r\n                        }\r\n                    </div>\r\n\r\n                }@else {\r\n                    <p [class.diff]=\"editingAiFixture?.header?.isDifferent\">{{ editingAiFixture?.header?.label }}</p>\r\n                }\r\n\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"editingAiFixture?.vmConfig?.length && showVMs\">\r\n                    <ng-container *ngFor=\"let vm of editingAiFixture?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImage; else placeholder\" [src]=\"imgCDN + vm?.vmImage\" alt=\"Vm Image\"\r\n                                    class=\"cursor-pointer\" [class.diff-border]=\"vm?.isDifferent\" />\r\n\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder cursor-pointer\" [class.diff-border]=\"vm?.isDifferent\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n\r\n                                <div *ngIf=\"editMode\" class=\"vm-actions\">\r\n                                    <svg (click)=\"deleteVm(i)\" class=\"cursor-pointer\" style=\"height: 22px;\" width=\"26\"\r\n                                        height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <rect x=\"1\" y=\"1\" width=\"24\" height=\"24\" rx=\"12\" fill=\"#F2F4F7\" />\r\n                                        <rect x=\"1\" y=\"1\" width=\"24\" height=\"24\" rx=\"12\" stroke=\"#EAECF0\"\r\n                                            stroke-width=\"2\" />\r\n                                        <path\r\n                                            d=\"M8.5 10H9.5M9.5 10H17.5M9.5 10V17C9.5 17.2652 9.60536 17.5196 9.79289 17.7071C9.98043 17.8946 10.2348 18 10.5 18H15.5C15.7652 18 16.0196 17.8946 16.2071 17.7071C16.3946 17.5196 16.5 17.2652 16.5 17V10H9.5ZM11 10V9C11 8.73478 11.1054 8.48043 11.2929 8.29289C11.4804 8.10536 11.7348 8 12 8H14C14.2652 8 14.5196 8.10536 14.7071 8.29289C14.8946 8.48043 15 8.73478 15 9V10M12 12.5V15.5M14 12.5V15.5\"\r\n                                            stroke=\"#475467\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n\r\n                                    <svg (click)=\"editVm()\" class=\"cursor-pointer ms-1\" style=\"height: 22px;\" width=\"26\"\r\n                                        height=\"26\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <rect x=\"1\" y=\"1\" width=\"24\" height=\"24\" rx=\"12\" fill=\"#F2F4F7\" />\r\n                                        <rect x=\"1\" y=\"1\" width=\"24\" height=\"24\" rx=\"12\" stroke=\"#EAECF0\"\r\n                                            stroke-width=\"2\" />\r\n                                        <g clip-path=\"url(#clip0_476_30801)\">\r\n                                            <path\r\n                                                d=\"M15.5 8.50015C15.6313 8.36883 15.7872 8.26466 15.9588 8.19359C16.1304 8.12252 16.3143 8.08594 16.5 8.08594C16.6857 8.08594 16.8696 8.12252 17.0412 8.19359C17.2128 8.26466 17.3687 8.36883 17.5 8.50015C17.6313 8.63147 17.7355 8.78737 17.8066 8.95895C17.8776 9.13054 17.9142 9.31443 17.9142 9.50015C17.9142 9.68587 17.8776 9.86977 17.8066 10.0413C17.7355 10.2129 17.6313 10.3688 17.5 10.5002L10.75 17.2502L8 18.0002L8.75 15.2502L15.5 8.50015Z\"\r\n                                                stroke=\"#475467\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                        </g>\r\n                                        <defs>\r\n                                            <clipPath id=\"clip0_476_30801\">\r\n                                                <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(7 7)\" />\r\n                                            </clipPath>\r\n                                        </defs>\r\n                                    </svg>\r\n\r\n                                </div>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"editingAiFixture?.productResolutionLevel === 'L1' && showBCs\">\r\n                    <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"editingAiFixture?.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of editingAiFixture?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"editingAiFixture?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of editingAiFixture?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of editingAiFixture?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"editingAiFixture?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of editingAiFixture?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"editingAiFixture?.productResolutionLevel === 'L3' && showBCs\">\r\n                    <!-- <div id=\"body-loader\">\r\n                    <div class=\"loader\"></div>\r\n                </div> -->\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of editingAiFixture?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"editingAiFixture?.productResolutionLevel === 'L2' && showBCs\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n\r\n                            <!-- Tray visual -->\r\n                            <div *ngFor=\"let row of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            </div>\r\n\r\n                            <!-- Tray inputs -->\r\n                            <div class=\"input-container\">\r\n                                <ng-container *ngIf=\"getQuickItem('tray' + item.shelfNumber) as quickItem\">\r\n                                    <div class=\"row-container d-flex gap-1 align-items-center\"\r\n                                        [ngClass]=\"{'border-red': isInvalidTray(item) && isQuickEditSubmitted}\">\r\n                                        <!-- ngbTooltip=\"Total rows x Capacity per row = Total capacity\" -->\r\n                                        <!-- Tray rows -->\r\n                                        <input class=\"value edit-input form-control\" style=\"right: 58px;\" type=\"text\"\r\n                                            inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\" placeholder=\"R\"\r\n                                            [disabled]=\"!editMode\" [value]=\"item.trayRows\"\r\n                                            (input)=\"onTrayRowChange($event, item)\" />\r\n                                        x\r\n                                        <!-- Products per row -->\r\n                                        <input class=\"value edit-input form-control\" type=\"text\" inputmode=\"numeric\"\r\n                                            pattern=\"[0-9]*\" autocomplete=\"off\" placeholder=\"C\" [disabled]=\"!editMode\"\r\n                                            [value]=\"item.productPerShelf\"\r\n                                            (input)=\"onTrayProductChange($event, item)\" />\r\n                                        =\r\n                                        <span style=\"font-size: 14px; font-weight: 400;\"\r\n                                            [class.diff]=\"item?.isDifferent\">{{item.trayRows && item.productPerShelf ? item.trayRows * item.productPerShelf : 0}}</span>\r\n                                    </div>\r\n                                </ng-container>\r\n                            </div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n\r\n                            @if(item.shelfType ==='shelf'){\r\n                                <div class=\"input-container\">\r\n                                    <input [class.diff]=\"item?.isDifferent\" class=\"value edit-input form-control\"\r\n                                        type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" autocomplete=\"off\"\r\n                                        [disabled]=\"!editMode\" [value]=\"getQuickItem(item.shelfType + (i + 1))?.value\"\r\n                                        (input)=\"onCapacityInput($event, getQuickItem(item.shelfType + (i + 1))!)\"\r\n                                        [ngClass]=\"{\r\n                                        'border-red': isInvalidQuickValue(getQuickItem(item.shelfType + (i + 1))?.value) && isQuickEditSubmitted\r\n                                    }\" />\r\n                                </div>\r\n                            }\r\n\r\n                        </div>\r\n                    }\r\n\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n                *ngIf=\"editingAiFixture?.footer?.isEnabled && editingAiFixture?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ editingAiFixture?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </section>\r\n}","import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { ActionConfirmPopupComponent } from \"./action-confirm-popup/action-confirm-popup.component\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n@Component({\r\n  selector: \"lib-verification-feedback\",\r\n  templateUrl: \"./verification-feedback.component.html\",\r\n  styleUrl: \"./verification-feedback.component.scss\",\r\n})\r\nexport class VerificationFeedbackComponent\r\n  implements OnInit, OnChanges, OnDestroy\r\n{\r\n  @Input() floorData: any;\r\n  @Input() totalFixtures: any[] = [];\r\n  @Input() feedbackDetails: any;\r\n\r\n  @Input() cdn: string;\r\n  @Input() showAction: boolean = true;\r\n  // @Input() vmList: VmLibraryList[] = [];\r\n\r\n  @Output() changeFixture = new EventEmitter<{\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n  }>();\r\n\r\n  @Output() action = new EventEmitter<any>();\r\n\r\n  selectedFeedbackData: {\r\n    currentFixture: any;\r\n    aiFeedbackFixture: any;\r\n  };\r\n\r\n  isPageLoading: boolean = true;\r\n\r\n  currentFixtureIndex: number;\r\n\r\n  planoFixture: any;\r\n  aiFixture: any;\r\n\r\n  // Live fixture capacity = sum of individual shelf capacities (see plano.function),\r\n  // kept consistent with the planogram canvas instead of the stored fixtureCapacity.\r\n  get planoFixtureCapacity(): number {\r\n    return getFixtureProductCapacity(this.planoFixture?.shelfConfig);\r\n  }\r\n\r\n  selectedImageForPreview: string | null = null;\r\n  imagePreviewZoom: number = 1;\r\n  imagePreviewPanX: number = 0;\r\n  imagePreviewPanY: number = 0;\r\n  isPanning: boolean = false;\r\n  private panLastX: number = 0;\r\n  private panLastY: number = 0;\r\n\r\n  isAIQuickEdit = false;\r\n  isImageLoading: boolean = false;\r\n  private previousImageUrl: string = \"\";\r\n\r\n  clientId: string;\r\n  imgCDN: string;\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private ngbModal: NgbModal,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        // await this.getVmsList();\r\n        this.isPageLoading = false;\r\n      });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"feedbackDetails\"]?.currentValue) {\r\n      this.onCancelAIQuickEdit();\r\n      this.currentFixtureIndex =\r\n        this.totalFixtures.findIndex(\r\n          (f: any) =>\r\n            f._id === this.feedbackDetails?.fixtureFeedback?.fixtureId,\r\n        ) + 1;\r\n        \r\n        this.planoFixture = structuredClone(\r\n          this.feedbackDetails?.fixtureFeedback?.FixtureData,\r\n        );\r\n        \r\n        this.aiFixture = this.processAIFixtureData();\r\n        \r\n        this.moveStretchVMsFromPlanoToAI();\r\n        if (this.aiFixture?.fixtureType === 'wall') {\r\n          this.processSpecialVMShelves();\r\n        }\r\n        // this.updateVMlistWithAiData();\r\n        \r\n        if (!this.isApproved) {\r\n          this.compareFixture(this.aiFixture, this.planoFixture);\r\n        }\r\n\r\n        const newImageUrl =\r\n        this.cdn && this.aiFixture?.fixtureImage\r\n        ? this.cdn + this.aiFixture.fixtureImage\r\n        : \"\";\r\n\r\n        \r\n        if (newImageUrl && newImageUrl !== this.previousImageUrl) {\r\n          this.previousImageUrl = newImageUrl;\r\n          this.isImageLoading = true;\r\n        } else if (!newImageUrl) {\r\n          this.isImageLoading = false;\r\n          this.previousImageUrl = \"\";\r\n        } else {\r\n          this.isImageLoading = false;\r\n        }\r\n        \r\n        console.log(\"@@ ~ fixtureId:\", this.feedbackDetails?.fixtureFeedback?.fixtureId);\r\n        console.log(\"@@ ~ imagePath:\", this.cdn + this.aiFixture?.fixtureImage);\r\n    }\r\n  }\r\n\r\n  processAIFixtureData() {\r\n    let aiData = structuredClone({\r\n      ...this.planoFixture,\r\n      ...this.feedbackDetails?.fixtureFeedback?.fixtureAIData,\r\n      header: {\r\n        ...this.planoFixture?.header,\r\n        ...this.feedbackDetails?.fixtureFeedback?.fixtureAIData?.header,\r\n      },\r\n    });\r\n    let productCount = 0;\r\n    aiData?.shelfConfig?.forEach((s: any, index: number) => {\r\n      // if (\r\n      //   s.shelfType == \"tray\" &&\r\n      //   !s?.originalProductCount &&\r\n      //   !aiData?.updatedBy\r\n      // ) {\r\n      //   s.originalProductCount = s.productPerShelf;\r\n      //   s.productPerShelf = Math.floor(s.productPerShelf / s.trayRows);\r\n      //   // s.trayRows = s.trayRows == 0 ? 1 : s.trayRows;\r\n      //   // s.productPerShelf <= 21 ? 3 : 7;\r\n\r\n      //   // s.originalProductCount = s.productPerShelf;\r\n      //   // s.productPerShelf = Math.floor(\r\n      //   //   s.productPerShelf / (s.productPerShelf <= 21 ? 3 : 7)\r\n      //   // );\r\n      // }\r\n\r\n      if (s.shelfType == \"shelf\") {\r\n        productCount += s.productPerShelf;\r\n      } else {\r\n        productCount += s.productPerShelf * s.trayRows;\r\n      }\r\n\r\n      let shelfZone = this.planoFixture?.shelfConfig.find(\r\n        (shelve: any) => s.shelfNumber == shelve.shelfNumber,\r\n      );\r\n\r\n      if (shelfZone) {\r\n        aiData.shelfConfig[index] = { ...shelfZone, ...s };\r\n      } else {\r\n        s.zone = \"Bottom\";\r\n      }\r\n    });\r\n    aiData.fixtureCapacity = productCount;\r\n    return aiData;\r\n  }\r\n\r\n  moveStretchVMsFromPlanoToAI() {\r\n    if (!this.aiFixture || !this.planoFixture) return;\r\n\r\n    if (!this.aiFixture.vmConfig) {\r\n      this.aiFixture.vmConfig = [];\r\n    }\r\n\r\n    const aiShelves = this.aiFixture?.shelfConfig || [];\r\n    const planoShelves = this.planoFixture?.shelfConfig || [];\r\n\r\n    if (aiShelves.length === 0 || planoShelves.length === 0) return;\r\n\r\n    const aiFirstShelf = aiShelves[0];\r\n    const aiLastShelf = aiShelves[aiShelves.length - 1];\r\n    const planoFirstShelf = planoShelves[0];\r\n    const planoLastShelf = planoShelves[planoShelves.length - 1];\r\n\r\n    if (!aiFirstShelf?.shelfNumber || !aiLastShelf?.shelfNumber) return;\r\n    if (!planoFirstShelf?.shelfNumber || !planoLastShelf?.shelfNumber) return;\r\n\r\n    const aiFirstShelfNumber = aiFirstShelf.shelfNumber;\r\n    const aiLastShelfNumber = aiLastShelf.shelfNumber;\r\n    const planoFirstShelfNumber = planoFirstShelf.shelfNumber;\r\n    const planoLastShelfNumber = planoLastShelf.shelfNumber;\r\n\r\n    const matchesStretchCriteria = (vm: any, shelfNumber: number) => {\r\n      return (\r\n        vm?.xZone === \"stretch\" &&\r\n        vm?.yZone === \"stretch\" &&\r\n        vm?.startYPosition === shelfNumber &&\r\n        vm?.endYPosition === shelfNumber\r\n      );\r\n    };\r\n\r\n    const hasFirstShelfVM = this.aiFixture.vmConfig.some((vm: any) =>\r\n      matchesStretchCriteria(vm, aiFirstShelfNumber),\r\n    );\r\n\r\n    if (!hasFirstShelfVM) {\r\n      const planoVM = this.planoFixture?.vmConfig?.find((vm: any) =>\r\n        matchesStretchCriteria(vm, planoFirstShelfNumber),\r\n      );\r\n\r\n      if (planoVM) {\r\n        const clonedVM = structuredClone(planoVM);\r\n        clonedVM.startYPosition = aiFirstShelfNumber;\r\n        clonedVM.endYPosition = aiFirstShelfNumber;\r\n        this.aiFixture.vmConfig.push(clonedVM);\r\n      }\r\n    }\r\n\r\n    const hasLastShelfVM = this.aiFixture.vmConfig.some((vm: any) =>\r\n      matchesStretchCriteria(vm, aiLastShelfNumber),\r\n    );\r\n\r\n    if (!hasLastShelfVM) {\r\n      const planoVM = this.planoFixture?.vmConfig?.find((vm: any) =>\r\n        matchesStretchCriteria(vm, planoLastShelfNumber),\r\n      );\r\n\r\n      if (planoVM) {\r\n        const clonedVM = structuredClone(planoVM);\r\n        clonedVM.startYPosition = aiLastShelfNumber;\r\n        clonedVM.endYPosition = aiLastShelfNumber;\r\n        this.aiFixture.vmConfig.push(clonedVM);\r\n      }\r\n    }\r\n  }\r\n\r\n  processSpecialVMShelves() {\r\n    if (\r\n      !this.aiFixture?.vmConfig?.length ||\r\n      !this.aiFixture?.shelfConfig?.length\r\n    )\r\n      return;\r\n\r\n    const shelves = this.aiFixture.shelfConfig;\r\n    const vms = this.aiFixture.vmConfig;\r\n\r\n    const isStretchVM = (vm: any, shelfNumber: number) =>\r\n      vm.xZone === \"stretch\" &&\r\n      vm.yZone === \"stretch\" &&\r\n      vm.startYPosition === shelfNumber &&\r\n      vm.endYPosition === shelfNumber;\r\n\r\n    // --- Handle legacy workaround: shelf with type \"shelf\" and 0 capacity used as vmonly ---\r\n    const firstShelfRaw = shelves[0];\r\n    if (\r\n      firstShelfRaw.shelfType === 'shelf' &&\r\n      firstShelfRaw.productPerShelf === 0 &&\r\n      vms.some((vm: any) => isStretchVM(vm, firstShelfRaw.shelfNumber))\r\n    ) {\r\n      firstShelfRaw.shelfType = 'vmonly';\r\n    }\r\n\r\n    const lastShelfRaw = shelves[shelves.length - 1];\r\n    if (\r\n      lastShelfRaw.shelfType === 'shelf' &&\r\n      lastShelfRaw.productPerShelf === 0 &&\r\n      vms.some((vm: any) => isStretchVM(vm, lastShelfRaw.shelfNumber))\r\n    ) {\r\n      lastShelfRaw.shelfType = 'vmonly';\r\n    }\r\n\r\n    // --- Top Masking: ensure first shelf is vmonly ---\r\n    const firstShelf = shelves[0];\r\n    const topMaskingVM = vms.find((vm: any) =>\r\n      isStretchVM(vm, firstShelf.shelfNumber),\r\n    );\r\n\r\n    let didTopMaskingIncrement = false;\r\n\r\n    if (topMaskingVM && firstShelf.shelfType !== \"vmonly\") {\r\n      // Insert vmonly shelf at position 0 with shelfNumber 1\r\n      shelves.unshift({\r\n        shelfNumber: 1,\r\n        shelfType: \"vmonly\",\r\n        productPerShelf: 0,\r\n        trayRows: 0,\r\n        zone: \"Top\",\r\n      });\r\n\r\n      // Increment all other shelf numbers by 1\r\n      for (let i = 1; i < shelves.length; i++) {\r\n        shelves[i].shelfNumber = shelves[i].shelfNumber + 1;\r\n      }\r\n\r\n      didTopMaskingIncrement = true;\r\n    }\r\n\r\n    // --- Bottom Slander: ensure last shelf is vmonly ---\r\n    const lastShelf = shelves[shelves.length - 1];\r\n    // VM positions are still using original numbers, so check against the original shelf number\r\n    const bottomSlanderShelfNumber = didTopMaskingIncrement\r\n      ? lastShelf.shelfNumber - 1\r\n      : lastShelf.shelfNumber;\r\n    const bottomSlanderVM = vms.find((vm: any) =>\r\n      isStretchVM(vm, bottomSlanderShelfNumber),\r\n    );\r\n\r\n    let didBottomSlanderAdd = false;\r\n\r\n    if (bottomSlanderVM && lastShelf.shelfType !== \"vmonly\") {\r\n      const newShelfNumber = lastShelf.shelfNumber + 1;\r\n      shelves.push({\r\n        shelfNumber: newShelfNumber,\r\n        shelfType: \"vmonly\",\r\n        productPerShelf: 0,\r\n        trayRows: 0,\r\n        zone: \"Bottom\",\r\n      });\r\n\r\n      didBottomSlanderAdd = true;\r\n    }\r\n\r\n    // --- Update VM positions based on what was added ---\r\n    const topOffset = didTopMaskingIncrement ? 1 : 0;\r\n    const bottomOffset = didBottomSlanderAdd ? 1 : 0;\r\n\r\n    if (topOffset || bottomOffset) {\r\n      vms.forEach((vm: any) => {\r\n        if (vm === topMaskingVM || vm === bottomSlanderVM) return;\r\n        vm.startYPosition = vm.startYPosition + topOffset;\r\n        vm.endYPosition = vm.endYPosition + topOffset;\r\n      });\r\n\r\n      if (bottomSlanderVM && didBottomSlanderAdd) {\r\n        // +topOffset for the top vmonly + +bottomOffset for the bottom vmonly\r\n        bottomSlanderVM.startYPosition =\r\n          bottomSlanderVM.startYPosition + topOffset + bottomOffset;\r\n        bottomSlanderVM.endYPosition =\r\n          bottomSlanderVM.endYPosition + topOffset + bottomOffset;\r\n      }\r\n    }\r\n  }\r\n\r\n  compareFixture(aiFixture: any, currentFixture: any) {\r\n    if (!aiFixture || !currentFixture) return;\r\n    /* ================= HEADER ================= */\r\n    const aiHeader = (aiFixture.header?.label ?? \"\").trim().toLowerCase();\r\n    const curHeader = (currentFixture.header?.label ?? \"\").trim().toLowerCase();\r\n\r\n    aiFixture.header.isDifferent = aiHeader !== curHeader;\r\n\r\n    /* ================= SHELVES ================= */\r\n    const currentShelfMap = new Map<number, any>(\r\n      (currentFixture.shelfConfig ?? []).map((s: any) => [s.shelfNumber, s]),\r\n    );\r\n\r\n    (aiFixture.shelfConfig ?? []).forEach((aiShelf: any) => {\r\n      aiShelf.isDifferent = false;\r\n\r\n      const curShelf = currentShelfMap.get(aiShelf.shelfNumber);\r\n      if (!curShelf) {\r\n        aiShelf.isDifferent = true;\r\n        return;\r\n      }\r\n\r\n      if (\r\n        aiShelf.shelfType !== curShelf.shelfType ||\r\n        aiShelf.productPerShelf !== curShelf.productPerShelf ||\r\n        aiShelf.trayRows !== curShelf.trayRows\r\n      ) {\r\n        aiShelf.isDifferent = true;\r\n      }\r\n    });\r\n\r\n    /* ================= VMs ================= */\r\n    const vmKey = (v: any) =>\r\n      `${v.vmType}|${v.vmName}|${v.startYPosition}|${v.endYPosition}`\r\n        .toLowerCase()\r\n        .trim();\r\n\r\n    const currentVMSet = new Set((currentFixture.vmConfig ?? []).map(vmKey));\r\n\r\n    (aiFixture.vmConfig ?? []).forEach((aiVM: any) => {\r\n      aiVM.isDifferent = !currentVMSet.has(vmKey(aiVM));\r\n    });\r\n  }\r\n\r\n  // updateVMlistWithAiData() {\r\n  //   this.aiFixture?.vmConfig?.forEach((aiVm: any) => {\r\n  //     // console.log(\"@@ ~ aiVm:\", aiVm);\r\n\r\n  //     const vmInList = this.vmList.find(\r\n  //       (vm) => vm.name === aiVm?.vmName && vm.type === aiVm?.vmType\r\n  //     );\r\n\r\n  //     if (vmInList) {\r\n  //       // vmInList.id = aiVm.vmName;\r\n  //       if (aiVm?.vmImage) {\r\n  //         vmInList.imgUrl = `${this.imgCDN}${aiVm.vmImage}`;\r\n  //       }\r\n  //     } else {\r\n  //       this.vmList.push({\r\n  //         id: aiVm.vmName,\r\n  //         name: aiVm.vmName,\r\n  //         displayName: aiVm.vmName + (aiVm?.vmType ? `(${aiVm.vmType})` : \"\"),\r\n  //         width: 100,\r\n  //         height: 100,\r\n  //         type: aiVm.vmType,\r\n  //         ...(aiVm.vmImage ? { imgUrl: `${this.imgCDN}${aiVm.vmImage}` } : {}),\r\n  //       } as any);\r\n  //     }\r\n  //   });\r\n  // }\r\n\r\n  get isApproved() {\r\n    return this.feedbackDetails?.fixtureFeedback?.approvalStatus === \"approved\";\r\n  }\r\n\r\n  onChangeFixture(change: \"next\" | \"previous\") {\r\n    this.changeFixture.emit({\r\n      currentFixture: this.feedbackDetails.fixtureFeedback.fixtureId,\r\n      action: change,\r\n    });\r\n    this.onCancelAIQuickEdit();\r\n    // this.onCancelPlanoQuickEdit();\r\n  }\r\n\r\n  async onClickKeepPlano() {\r\n    try {\r\n      const result = await this.confirmAction(\"keepPlano\");\r\n      if (result?.action === \"notOk\") return false;\r\n\r\n      this.action.emit({\r\n        action: \"keepPlano\",\r\n        type: \"agree\",\r\n        fixtureData: this.planoFixture,\r\n        feedback: this.feedbackDetails?.fixtureFeedback,\r\n        remarks: result?.remark,\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        taskType: \"fixture\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ onClickKeepPlano [ERR]:\", error);\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  async onClickAcceptAI() {\r\n    try {\r\n      const result = await this.confirmAction(\"acceptAI\");\r\n      if (result?.action === \"notOk\") return false;\r\n\r\n      this.action.emit({\r\n        action: \"acceptAi\",\r\n        type: \"agree\",\r\n        fixtureData: this.aiFixture,\r\n        feedback: this.feedbackDetails?.fixtureFeedback,\r\n        remarks: result?.remark,\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        taskType: \"fixture\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ onClickAcceptAI [ERR]:\", error);\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  async onClickRedo() {\r\n    if (this.isAIQuickEdit) return;\r\n\r\n    try {\r\n      const result = await this.confirmAction(\"redo\");\r\n      if (result?.action === \"notOk\") return;\r\n\r\n      this.action.emit({\r\n        action: \"redo\",\r\n        type: \"disagree\",\r\n        fixtureData: null,\r\n        feedback: this.feedbackDetails?.fixtureFeedback,\r\n        remark: result,\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        taskType: \"fixture\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ onClickRedo [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  onEditAIFeedback(dataToEdit?: any) {\r\n    this.action.emit({\r\n      action: \"editWithAi\",\r\n      type: \"agree\",\r\n      fixtureData: dataToEdit?.fixtureData ?? this.aiFixture,\r\n      feedback: this.feedbackDetails?.fixtureFeedback,\r\n      planoId: this.floorData.planoId,\r\n      floorId: this.floorData._id,\r\n      taskType: \"fixture\",\r\n      tab: dataToEdit?.tab,\r\n    });\r\n  }\r\n\r\n  onEditFeedback() {\r\n    this.action.emit({\r\n      action: \"editWithPlano\",\r\n      type: \"agree\",\r\n      fixtureData: this.planoFixture,\r\n      feedback: this.feedbackDetails?.fixtureFeedback,\r\n      planoId: this.floorData.planoId,\r\n      floorId: this.floorData._id,\r\n      taskType: \"fixture\",\r\n    });\r\n  }\r\n\r\n  toggleAIQuickEdit() {\r\n    this.isAIQuickEdit = !this.isAIQuickEdit;\r\n  }\r\n\r\n  onCancelAIQuickEdit() {\r\n    this.isAIQuickEdit = false;\r\n  }\r\n\r\n  async onSaveAIQuickEdit(newAiData: any) {\r\n    try {\r\n      const result = await this.confirmAction(\"acceptAI\");\r\n      if (result?.action === \"notOk\") return false;\r\n\r\n      this.aiFixture = structuredClone(newAiData);\r\n\r\n      this.action.emit({\r\n        action: \"acceptAi\",\r\n        type: \"agree\",\r\n        fixtureData: this.aiFixture,\r\n        feedback: this.feedbackDetails?.fixtureFeedback,\r\n        remarks: result?.remark,\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        taskType: \"fixture\",\r\n      });\r\n\r\n      this.isAIQuickEdit = false;\r\n    } catch (error) {\r\n      console.log(\"@@ ~ onSaveAIQuickEdit [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  async confirmAction(\r\n    type: \"redo\" | \"acceptAI\" | \"keepPlano\",\r\n  ): Promise<{ action: string; remark: string | null } | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ActionConfirmPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        backdrop: \"static\",\r\n      });\r\n      modelRef.componentInstance.type = type;\r\n\r\n      return await modelRef.result.then<{\r\n        action: string;\r\n        remark: string | null;\r\n      }>((result) => result);\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  onClickImagePreview(event: MouseEvent, imgUrl: string) {\r\n    event.stopPropagation();\r\n    this.selectedImageForPreview = imgUrl;\r\n    this.imagePreviewZoom = 1;\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  closeImagePreview() {\r\n    this.selectedImageForPreview = null;\r\n    this.imagePreviewZoom = 1;\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  onPreviewZoomIn() {\r\n    this.imagePreviewZoom = Math.min(this.imagePreviewZoom + 0.25, 5);\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewZoomOut() {\r\n    this.imagePreviewZoom = Math.max(this.imagePreviewZoom - 0.25, 0.25);\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewZoomSlider(event: Event) {\r\n    const value = +(event.target as HTMLInputElement).value;\r\n    this.imagePreviewZoom = value / 100;\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewWheel(event: WheelEvent) {\r\n    event.preventDefault();\r\n    if (event.deltaY < 0) {\r\n      this.onPreviewZoomIn();\r\n    } else {\r\n      this.onPreviewZoomOut();\r\n    }\r\n  }\r\n\r\n  onPreviewPanStart(event: MouseEvent) {\r\n    if (this.imagePreviewZoom <= 1) return;\r\n    this.isPanning = true;\r\n    this.panLastX = event.clientX;\r\n    this.panLastY = event.clientY;\r\n  }\r\n\r\n  onPreviewPanMove(event: MouseEvent) {\r\n    if (!this.isPanning) return;\r\n    const dx = event.clientX - this.panLastX;\r\n    const dy = event.clientY - this.panLastY;\r\n    this.panLastX = event.clientX;\r\n    this.panLastY = event.clientY;\r\n    this.imagePreviewPanX += dx;\r\n    this.imagePreviewPanY += dy;\r\n  }\r\n\r\n  onPreviewPanEnd() {\r\n    this.isPanning = false;\r\n  }\r\n\r\n  private resetPan() {\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  onImageLoad() {\r\n    this.isImageLoading = false;\r\n  }\r\n\r\n  onImageError() {\r\n    this.isImageLoading = false;\r\n  }\r\n\r\n  onImageLoadStart() {\r\n    this.isImageLoading = true;\r\n  }\r\n\r\n  onImageLoadEnd() {\r\n    this.isImageLoading = false;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n\r\ninterface FixtureQuickDetail {\r\n  key: string;\r\n  label: string;\r\n  value: string;\r\n  editable: boolean;\r\n  isDifferent?: boolean;\r\n\r\n  meta?: {\r\n    type: \"fixture\" | \"shelf\" | \"tray\";\r\n    shelfNumber?: number;\r\n  };\r\n}\r\n","<section id=\"verification-feedback\">\r\n\r\n    <div *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n        <div ngbAccordionItem=\"details\" [collapsed]=\"feedbackDetails?.taskInfoToggle\">\r\n            <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n                <div class=\"w-100\">\r\n                    <h2>Fixture verification assigned</h2>\r\n                    <p>{{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n                </div>\r\n            </div>\r\n\r\n            <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                    <ng-template>\r\n                        <div class=\"log-block\">\r\n                            <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n                                xmlns=\"http://www.w3.org/2000/svg\">\r\n                                <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                                <path\r\n                                    d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                                    stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n\r\n                            <div class=\"d-flex gap-1 flex-column\">\r\n                                <h4>{{feedbackDetails?.fixtureFeedback?.taskData?.createdByName}}</h4>\r\n                                <p>\r\n                                    {{feedbackDetails?.fixtureFeedback?.taskData?.createdAt | date: 'hh:mma, dd MMM yyyy'}}\r\n                                </p>\r\n                                <h5>Assigner</h5>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <div class=\"log-block\">\r\n                            <!-- User avatar -->\r\n                            <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n                                xmlns=\"http://www.w3.org/2000/svg\">\r\n                                <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                                <path\r\n                                    d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                                    stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n\r\n                            <div class=\"d-flex gap-1 flex-column\">\r\n                                <h4> {{feedbackDetails?.fixtureFeedback?.taskData?.userName}}</h4>\r\n                                <p>\r\n                                    {{feedbackDetails?.fixtureFeedback?.taskData?.submitTime_string}}\r\n                                </p>\r\n                                <h5>Assignee</h5>\r\n                            </div>\r\n                        </div>\r\n\r\n\r\n                        @if (feedbackDetails?.globalComments?.length) {\r\n                            <h5 class=\"mb-2\">Comments</h5>\r\n                            <div class=\"log-block\" *ngFor=\"let c of feedbackDetails?.globalComments;let i= index\">\r\n                                <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                                    <path\r\n                                        d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                                        stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n\r\n                                <div class=\"d-flex gap-1 flex-column\">\r\n                                    <h4>{{c?.userName}}</h4>\r\n                                    <p>{{c?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n                                    <h5>{{c?.comment}}</h5>\r\n                                </div>\r\n                            </div>\r\n                        }\r\n                    </ng-template>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <hr *ngIf=\"feedbackDetails?.fixtureFeedback?.taskData\">\r\n\r\n    <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n        <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n            viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n\r\n        <h3 class=\"m-0\">{{planoFixture?.header?.label}}</h3>\r\n\r\n        <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n\r\n            <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n            </svg>\r\n\r\n            <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n                {{ planoFixture.fixtureCategory | titlecase}}\r\n            </span>\r\n\r\n            <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n            </svg>\r\n\r\n            <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n                {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n            </span>\r\n\r\n            <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n            </svg>\r\n\r\n            <span  class=\"badge inactive me-1\">\r\n                Fixture Capacity: {{ planoFixtureCapacity }}\r\n            </span>\r\n\r\n            <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n            </svg>\r\n\r\n            <span  class=\"badge inactive me-1\">\r\n                Visual Merch Capacity: {{ planoFixture?.vmConfig?.length || 0 }}\r\n            </span>\r\n\r\n        </div>\r\n\r\n        <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n            {{currentFixtureIndex}}/{{totalFixtures.length}}\r\n        </h3>\r\n\r\n        <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n            viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n    </div>\r\n\r\n    @if( this.aiFixture?.fixtureId){\r\n        <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n            @if (showAction) {\r\n                <div class=\"col-4 p-2\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"d-flex align-items-center gap-3\">\r\n                            @if (!isApproved && showAction) {\r\n                                <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditFeedback()\">\r\n                                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <g clip-path=\"url(#clip0_228_12536)\">\r\n                                            <path\r\n                                                d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n                                                stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </g>\r\n                                        <defs>\r\n                                            <clipPath id=\"clip0_228_12536\">\r\n                                                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                            </clipPath>\r\n                                        </defs>\r\n                                    </svg>\r\n                                </button>\r\n\r\n                                <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickKeepPlano()\"\r\n                                    [disabled]=\"isAIQuickEdit\">\r\n                                    Keep plano\r\n                                </button>\r\n                            }\r\n                        </div>\r\n                        <div class=\"mb-4\">\r\n                            <div class=\"d-flex align-items-center gap-2  my-4\">\r\n                                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path\r\n                                        d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n                                        stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n\r\n                                <div class=\"d-flex align-items-center gap-3\">\r\n                                    <h4 class=\"m-0\">Existing template </h4>\r\n                                    <svg [ngbTooltip]=\"planoFixture?.fixtureName\" width=\"20\" height=\"20\"\r\n                                        viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <g clip-path=\"url(#clip0_496_31664)\">\r\n                                            <path\r\n                                                d=\"M10.0013 13.3337V10.0003M10.0013 6.66699H10.0096M18.3346 10.0003C18.3346 14.6027 14.6037 18.3337 10.0013 18.3337C5.39893 18.3337 1.66797 14.6027 1.66797 10.0003C1.66797 5.39795 5.39893 1.66699 10.0013 1.66699C14.6037 1.66699 18.3346 5.39795 18.3346 10.0003Z\"\r\n                                                stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </g>\r\n                                        <defs>\r\n                                            <clipPath id=\"clip0_496_31664\">\r\n                                                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                            </clipPath>\r\n                                        </defs>\r\n                                    </svg>\r\n\r\n                                </div>\r\n\r\n                                @if (isApproved) {\r\n                                    <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'keepPlano' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithPlano' \"\r\n                                        class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n                                        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                            d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n                                            fill=\"#12B76A\" />\r\n                                    </svg>\r\n                                }\r\n                            </div>\r\n                        </div>\r\n                        <fixture [fixture]=\"planoFixture\"></fixture>\r\n                    </div>\r\n                </div>\r\n\r\n                <div class=\"col-4 p-2\">\r\n                    <div class=\"wrapper\">\r\n                        @if (!isApproved && showAction) {\r\n                            <div class=\"d-flex align-items-center gap-3\">\r\n                                <button class=\"btn redo-btn\" (click)=\"onClickRedo()\" [class.disabled]=\"isAIQuickEdit\" *ngIf=\"!feedbackDetails?.fixtureFeedback?.hideRedo\">\r\n                                    Redo\r\n                                </button>\r\n\r\n                                <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onEditAIFeedback()\"\r\n                                    [disabled]=\"isAIQuickEdit\">\r\n                                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <g clip-path=\"url(#clip0_228_12536)\">\r\n                                            <path\r\n                                                d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n                                                stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </g>\r\n                                        <defs>\r\n                                            <clipPath id=\"clip0_228_12536\">\r\n                                                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                            </clipPath>\r\n                                        </defs>\r\n                                    </svg>\r\n                                </button>\r\n\r\n                                <button class=\"btn primary-btn\" type=\"button\" (click)=\"onClickAcceptAI()\"\r\n                                    [disabled]=\"isAIQuickEdit\">\r\n                                    Accept store response\r\n                                </button>\r\n                            </div>\r\n                        }\r\n\r\n                        <div class=\"mb-4\">\r\n                            <div class=\"d-flex align-items-center gap-2  my-4\">\r\n                                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path\r\n                                        d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n                                        stroke=\"#101828\" stroke-width=\"1.5\" />\r\n                                </svg>\r\n\r\n\r\n                                <h4>Store response </h4>\r\n                                <span  class=\"badge inactive me-1\" *ngIf=\"!isAIQuickEdit\">\r\n                                    Capacity: {{aiFixture?.fixtureCapacity || 0 }}\r\n                                </span>\r\n                                @if (isApproved) {\r\n                                    <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'acceptAi' || feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'editWithAi'\"\r\n                                        class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n                                        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                            d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n                                            fill=\"#12B76A\" />\r\n                                    </svg>\r\n\r\n                                    <svg *ngIf=\"feedbackDetails?.fixtureFeedback?.answers[0]?.userAction === 'redo' \"\r\n                                        class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <path\r\n                                            d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n                                            fill=\"black\" />\r\n                                    </svg>\r\n                                }@else {\r\n                                    <svg *ngIf=\"showAction && !isAIQuickEdit\" class=\"ms-auto cursor-pointer\"\r\n                                        (click)=\"toggleAIQuickEdit()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                        fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <path\r\n                                            d=\"M9 15.0002H15.75M12.375 2.62517C12.6734 2.3268 13.078 2.15918 13.5 2.15918C13.7089 2.15918 13.9158 2.20033 14.1088 2.28029C14.3019 2.36024 14.4773 2.47743 14.625 2.62517C14.7727 2.77291 14.8899 2.9483 14.9699 3.14132C15.0498 3.33435 15.091 3.54124 15.091 3.75017C15.091 3.9591 15.0498 4.16599 14.9699 4.35902C14.8899 4.55204 14.7727 4.72743 14.625 4.87517L5.25 14.2502L2.25 15.0002L3 12.0002L12.375 2.62517Z\"\r\n                                            stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                }\r\n\r\n\r\n                            </div>\r\n                        </div>\r\n                        <editable-fixture [fixture]=\"aiFixture\" [editMode]=\"isAIQuickEdit\"\r\n                            (onCancel)=\"onCancelAIQuickEdit()\" (onDone)=\"onSaveAIQuickEdit($event)\"\r\n                            (editTab)=\"onEditAIFeedback($event)\"></editable-fixture>\r\n                    </div>\r\n                </div>\r\n            }\r\n\r\n            <div class=\"p-2\" [ngClass]=\"{'col-4':showAction,'col':!showAction}\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"mb-4\" [ngStyle]=\"{'margin-top':showAction && !isApproved ? '50px' : '12px'}\">\r\n                        <div class=\"d-flex align-items-center gap-2  my-4\">\r\n                            <h4>Store Image </h4>\r\n                        </div>\r\n                    </div>\r\n                    @if(cdn && aiFixture?.fixtureImage){\r\n                        <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, cdn + aiFixture?.fixtureImage)\">\r\n                            @if(isImageLoading) {\r\n                                <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n                            }\r\n                            <img [src]=\"cdn + aiFixture?.fixtureImage\" \r\n                                 alt=\"Store response image\"\r\n                                 [style.display]=\"isImageLoading ? 'none' : 'block'\"\r\n                                 (loadstart)=\"onImageLoadStart()\"\r\n                                 (load)=\"onImageLoad()\"\r\n                                 (error)=\"onImageError()\"\r\n                                 (loadend)=\"onImageLoadEnd()\">\r\n                        </div>\r\n                    }@else {\r\n                        <div class=\"text-center my-7\">\r\n                            <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\"\r\n                                xmlns=\"http://www.w3.org/2000/svg\">\r\n                                <path\r\n                                    d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n                                    fill=\"#EAECF0\" />\r\n                                <path\r\n                                    d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n                                    fill=\"#6BCAFF\" />\r\n                                <path\r\n                                    d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n                                    fill=\"#00A3FF\" />\r\n                                <path\r\n                                    d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n                                    fill=\"#00A3FF\" />\r\n                                <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n                                <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n                                <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n                            </svg>\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div id=\"vm-comparison\" *ngIf=\"feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig.length\">\r\n            <h5 class=\"mb-1\">Visual Merchandise Images from AI output:</h5>\r\n\r\n            <div class=\"row g-0\">\r\n\r\n                @for (vm of feedbackDetails?.fixtureFeedback?.fixtureAIData?.vmConfig; track $index) {\r\n                    <div class=\"p-2\" [ngClass]=\"{'col-6':showAction, 'col-12':!showAction}\">\r\n                        <div class=\"vm-container\" (click)=\"onClickImagePreview($event, cdn+vm?.vmImage)\">\r\n                            <div class=\"vm-img\">\r\n                                <img [src]=\"cdn+vm?.vmImage\" alt=\"VM Image\">\r\n                            </div>\r\n                            <div class=\"d-flex flex-column gap-2 vm-details \">\r\n                                <h5>{{vm?.vmType}}</h5>\r\n                                <h5>{{vm?.vmName}}</h5>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                }\r\n            </div>\r\n        </div>\r\n    }@else {\r\n        <div class=\"my-6\">\r\n            <div class=\"text-center\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                    <path\r\n                        d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n                        stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n                </svg>\r\n            </div>\r\n            <div class=\"mt-3 text-center\">\r\n                <div class=\"fw-bold h3 mt-2\">No response</div>\r\n                <div class=\"mt-4\">No AI response found for this fixture.</div>\r\n            </div>\r\n        </div>\r\n    }\r\n\r\n\r\n    @if (feedbackDetails?.fixtureFeedback?.answers?.[0]?.comments.length) {\r\n        <div id=\"fixture-comments\">\r\n            <h5 class=\"mb-2\">Comments</h5>\r\n\r\n            <div class=\"log-block\"\r\n                *ngFor=\"let c of feedbackDetails?.fixtureFeedback?.answers[0]?.comments;let i= index\">\r\n                <!-- User avatar -->\r\n                <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                    <path\r\n                        d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                        stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n\r\n                <div class=\"d-flex gap-1 flex-column\">\r\n\r\n                    <div class=\"d-flex gap-1 flex-column\">\r\n                        <h4>{{c?.userName}}</h4>\r\n                        <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n                    </div>\r\n\r\n                    @if(c?.responsetype === 'comment'){\r\n                        <h5>{{c?.comment}}</h5>\r\n                    }@else if(c?.responsetype === 'agree'){\r\n\r\n                        <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n                            Marked as \"Keep Plano\".\r\n                        </h5>\r\n                        <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithPlano'\">\r\n                            Marked as \"Keep Plano with Modification\".\r\n                        </h5>\r\n                        <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'acceptAi'\">\r\n                            Marked as \"Accept AI\".\r\n                        </h5>\r\n                        <h5 *ngIf=\"feedbackDetails?.fixtureFeedback?.answers?.[0]?.userAction === 'editWithAi'\">\r\n                            Marked as \"Accept AI with Modification\".\r\n                        </h5>\r\n                        <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n                    }@else if(c?.responsetype === 'disagree'){\r\n                        <h5>\r\n                            Marked as \"Redo\"\r\n                        </h5>\r\n                        <h5 *ngIf=\"c?.comment\">Note: {{c.comment}}</h5>\r\n                    }\r\n                </div>\r\n            </div>\r\n        </div>\r\n    }\r\n\r\n    <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n        <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n        <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n            <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n            <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\"\r\n                   [value]=\"imagePreviewZoom * 100\"\r\n                   (input)=\"onPreviewZoomSlider($event)\" />\r\n            <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n            <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n        </div>\r\n        <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n             (mousedown)=\"onPreviewPanStart($event)\"\r\n             (mousemove)=\"onPreviewPanMove($event)\"\r\n             (mouseup)=\"onPreviewPanEnd()\"\r\n             (mouseleave)=\"onPreviewPanEnd()\"\r\n             (wheel)=\"onPreviewWheel($event)\">\r\n            <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n                 [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n                 draggable=\"false\" />\r\n        </div>\r\n    </div>\r\n\r\n    <ng-template #skeletonLoader>\r\n        <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <br />\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <br />\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <br />\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <br />\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n</section>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { SHELF_COLORS } from \"../../../../data/fixture-template.data\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n@Component({\r\n  selector: \"zone-editable-fixture\",\r\n  templateUrl: \"./zone-editable-fixture.component.html\",\r\n  styleUrl: \"./zone-editable-fixture.component.scss\",\r\n})\r\nexport class ZoneEditableFixtureComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixture: any;\r\n  @Input() planoFixture: any;\r\n\r\n  // @Input() vmList: VmLibraryList[] = [];\r\n\r\n  @Input() showColors: boolean = true;\r\n  @Input() showVMs: boolean = true;\r\n  @Input() showBCs: boolean = true;\r\n  @Input() showHeaderFooterAlways: boolean = false;\r\n  @Input() editable: boolean = true;\r\n\r\n  headerOptions: { label: string }[] = [];\r\n  brandOptions: { brandName: string }[] = [];\r\n  allPidsOptions: { brandName: string }[] = [];\r\n\r\n  selectedHeader: { label: string }[] = [];\r\n  brandsByZone: Record<string, string[]> = {};\r\n  othersModeByZone: Record<string, boolean> = {};\r\n  templateGroupName: string = \"\";\r\n\r\n  templateGroupOptions: string[] = [];\r\n  templateGroupSuggestions: string[] = [];\r\n  showTemplateGroupSuggestions: boolean = false;\r\n  private templateGroupLoaded: boolean = false;\r\n\r\n  private allPidsLoaded: boolean = false;\r\n  private originalHeaderLabel: string = \"\";\r\n  private originalBrandsByZone: Record<string, string[]> = {};\r\n  private originalTemplateGroupName: string = \"\";\r\n\r\n  @ViewChild(\"fixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  // Zone-verification diff palette: red when store response brands differ from\r\n  // the current plano for that zone; neutral grey when they match.\r\n  private readonly ZONE_DIFF_COLOR = { bg: \"#FEE4E2\", border: \"#F04438\" };\r\n  private readonly ZONE_MATCH_COLOR = { bg: \"#F2F4F7\", border: \"#EAECF0\" };\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  // vmList: VmLibraryList[] = [];\r\n  isPageLoading: boolean = true;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  get isValid(): boolean {\r\n    if (!this.templateGroupName?.trim()) return false;\r\n\r\n    const headerLabel = this.fixture?.header?.label?.trim();\r\n    if (!headerLabel) return false;\r\n\r\n    const zones = this.uniqueZones();\r\n    for (const zone of zones) {\r\n      if (!this.brandsByZone[zone]?.length) return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  get validationMessage(): string {\r\n    if (!this.templateGroupName?.trim()) {\r\n      return \"Enter a Template Group Name before accepting.\";\r\n    }\r\n\r\n    const headerLabel = this.fixture?.header?.label?.trim();\r\n    if (!headerLabel) return \"Pick a header before accepting.\";\r\n\r\n    const emptyZones: string[] = [];\r\n    for (const zone of this.uniqueZones()) {\r\n      if (!this.brandsByZone[zone]?.length) emptyZones.push(zone);\r\n    }\r\n    if (emptyZones.length) {\r\n      return `Pick at least one brand for: ${emptyZones.join(\", \")}`;\r\n    }\r\n    return \"\";\r\n  }\r\n\r\n  private uniqueZones(): string[] {\r\n    const zones = new Set<string>();\r\n    (this.fixture?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      if (shelf?.zone) zones.add(shelf.zone);\r\n    });\r\n    return Array.from(zones);\r\n  }\r\n\r\n  get isDirty(): boolean {\r\n    if ((this.fixture?.header?.label ?? \"\") !== this.originalHeaderLabel) {\r\n      return true;\r\n    }\r\n    if ((this.templateGroupName ?? \"\") !== this.originalTemplateGroupName) {\r\n      return true;\r\n    }\r\n    const zoneKeys = new Set([\r\n      ...Object.keys(this.brandsByZone),\r\n      ...Object.keys(this.originalBrandsByZone),\r\n    ]);\r\n    for (const zone of zoneKeys) {\r\n      const current = [...(this.brandsByZone[zone] ?? [])].sort();\r\n      const original = [...(this.originalBrandsByZone[zone] ?? [])].sort();\r\n      if (current.length !== original.length) return true;\r\n      for (let i = 0; i < current.length; i++) {\r\n        if (current[i] !== original[i]) return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        this.isPageLoading = false;\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"fixture\"]?.currentValue) {\r\n      this.sanitizeVmConfig();\r\n      await this.initInlineEditState();\r\n\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 400);\r\n    }\r\n  }\r\n\r\n  private async initInlineEditState() {\r\n    const currentLabel: string = this.fixture?.header?.label ?? \"\";\r\n    this.originalHeaderLabel = currentLabel;\r\n    this.selectedHeader = currentLabel ? [{ label: currentLabel }] : [];\r\n\r\n    this.originalTemplateGroupName = this.planoFixture?.templateGroupName ?? \"\";\r\n    this.templateGroupName = this.originalTemplateGroupName;\r\n    if (this.fixture) {\r\n      this.fixture.templateGroupName = this.templateGroupName;\r\n    }\r\n    this.showTemplateGroupSuggestions = false;\r\n    this.refreshTemplateGroupSuggestions();\r\n\r\n    this.originalBrandsByZone = this.snapshotBrandsByZone();\r\n    this.brandsByZone = structuredClone(this.originalBrandsByZone);\r\n    this.othersModeByZone = {};\r\n\r\n    await Promise.all([\r\n      this.loadHeaders(),\r\n      this.loadTemplateGroupOptions(),\r\n    ]);\r\n    this.refreshTemplateGroupSuggestions();\r\n    await this.loadBrandsForHeader(currentLabel);\r\n    await this.detectOthersSourcedZones();\r\n  }\r\n\r\n  private async loadTemplateGroupOptions() {\r\n    if (this.templateGroupLoaded) return;\r\n    try {\r\n      const result: any = await firstValueFrom(\r\n        this.apiService.getTemplateGroupList(),\r\n      );\r\n      const list: string[] = Array.isArray(result?.data) ? result.data : [];\r\n      this.templateGroupOptions = list.filter((v) => typeof v === \"string\");\r\n      this.templateGroupLoaded = true;\r\n    } catch (error) {\r\n      console.log(`@@ ~ loadTemplateGroupOptions [ERR]:`, error);\r\n      this.templateGroupOptions = [];\r\n    }\r\n  }\r\n\r\n  onTemplateGroupNameChange(value: string) {\r\n    this.templateGroupName = value ?? \"\";\r\n    if (this.fixture) {\r\n      this.fixture.templateGroupName = this.templateGroupName;\r\n    }\r\n    this.refreshTemplateGroupSuggestions();\r\n    this.showTemplateGroupSuggestions = this.templateGroupSuggestions.length > 0;\r\n  }\r\n\r\n  onTemplateGroupFocus() {\r\n    this.refreshTemplateGroupSuggestions();\r\n    this.showTemplateGroupSuggestions = this.templateGroupSuggestions.length > 0;\r\n  }\r\n\r\n  onTemplateGroupBlur() {\r\n    setTimeout(() => (this.showTemplateGroupSuggestions = false), 150);\r\n  }\r\n\r\n  onPickTemplateGroupSuggestion(value: string) {\r\n    this.templateGroupName = value;\r\n    if (this.fixture) {\r\n      this.fixture.templateGroupName = value;\r\n    }\r\n    this.showTemplateGroupSuggestions = false;\r\n    this.refreshTemplateGroupSuggestions();\r\n  }\r\n\r\n  private refreshTemplateGroupSuggestions() {\r\n    const query = (this.templateGroupName ?? \"\").trim().toLowerCase();\r\n    if (!this.templateGroupOptions.length) {\r\n      this.templateGroupSuggestions = [];\r\n      return;\r\n    }\r\n    if (!query) {\r\n      this.templateGroupSuggestions = [...this.templateGroupOptions];\r\n      return;\r\n    }\r\n    this.templateGroupSuggestions = this.templateGroupOptions.filter((opt) =>\r\n      opt.toLowerCase().includes(query),\r\n    );\r\n  }\r\n\r\n  private async detectOthersSourcedZones() {\r\n    if (!this.brandOptions.length) return;\r\n    const knownBrands = new Set(this.brandOptions.map((b) => b.brandName));\r\n\r\n    const zonesWithForeignBrands: string[] = [];\r\n    for (const [zone, brands] of Object.entries(this.brandsByZone)) {\r\n      if (brands.some((b) => !knownBrands.has(b))) {\r\n        zonesWithForeignBrands.push(zone);\r\n      }\r\n    }\r\n\r\n    if (!zonesWithForeignBrands.length) return;\r\n\r\n    await this.ensureAllPidsLoaded();\r\n    zonesWithForeignBrands.forEach(\r\n      (zone) => (this.othersModeByZone[zone] = true),\r\n    );\r\n  }\r\n\r\n  private async ensureAllPidsLoaded() {\r\n    if (this.allPidsLoaded) return;\r\n    try {\r\n      const result: any = await firstValueFrom(\r\n        this.apiService.getPIDList(\"others\"),\r\n      );\r\n      const list: string[] = result?.data ?? [];\r\n      this.allPidsOptions = list.map((brandName) => ({ brandName }));\r\n      this.allPidsLoaded = true;\r\n    } catch (error) {\r\n      console.log(`@@ ~ ensureAllPidsLoaded [ERR]:`, error);\r\n      this.allPidsOptions = [];\r\n    }\r\n  }\r\n\r\n  brandOptionsForZone(zone: string): { brandName: string }[] {\r\n    return this.othersModeByZone[zone] ? this.allPidsOptions : this.brandOptions;\r\n  }\r\n\r\n  isToggleAvailable(): boolean {\r\n    return !!this.selectedHeader?.[0]?.label;\r\n  }\r\n\r\n  async onToggleOthers(zone: string) {\r\n    const nextActive = !this.othersModeByZone[zone];\r\n    this.othersModeByZone = { ...this.othersModeByZone, [zone]: nextActive };\r\n\r\n    if (nextActive) {\r\n      await this.ensureAllPidsLoaded();\r\n    }\r\n\r\n    this.brandsByZone = { ...this.brandsByZone, [zone]: [] };\r\n    this.applyBrandsToFixture();\r\n  }\r\n\r\n  private getZoneBrandsFromConfig(config: any[], zone: string): string[] {\r\n    const shelf = (config ?? []).find((s: any) => s?.zone === zone);\r\n    return Array.isArray(shelf?.productBrandName) ? shelf.productBrandName : [];\r\n  }\r\n\r\n  private zoneBrandKey(brands: string[]): string {\r\n    return [...(brands ?? [])]\r\n      .filter((b) => typeof b === \"string\")\r\n      .map((b) => b.trim())\r\n      .filter(Boolean)\r\n      .sort()\r\n      .join(\"|\");\r\n  }\r\n\r\n  private isZoneBrandsDifferent(zone: string | undefined): boolean {\r\n    if (!zone) return false;\r\n    const responseBrands = this.getZoneBrandsFromConfig(\r\n      this.fixture?.shelfConfig,\r\n      zone,\r\n    );\r\n    const planoBrands = this.getZoneBrandsFromConfig(\r\n      this.planoFixture?.shelfConfig,\r\n      zone,\r\n    );\r\n    return this.zoneBrandKey(responseBrands) !== this.zoneBrandKey(planoBrands);\r\n  }\r\n\r\n  private zoneColor(zone: string | undefined): { bg: string; border: string } {\r\n    return this.isZoneBrandsDifferent(zone)\r\n      ? this.ZONE_DIFF_COLOR\r\n      : this.ZONE_MATCH_COLOR;\r\n  }\r\n\r\n  private snapshotBrandsByZone(): Record<string, string[]> {\r\n    const result: Record<string, string[]> = {};\r\n    (this.fixture?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      if (!zone || result[zone]) return;\r\n      result[zone] = Array.isArray(shelf?.productBrandName)\r\n        ? [...shelf.productBrandName]\r\n        : [];\r\n    });\r\n    return result;\r\n  }\r\n\r\n  private async loadHeaders() {\r\n    try {\r\n      const result: any = await firstValueFrom(\r\n        this.apiService.getHeadersList(),\r\n      );\r\n      const list: string[] = result?.data ?? [];\r\n      this.headerOptions = list.map((label) => ({ label }));\r\n    } catch (error) {\r\n      console.log(`@@ ~ loadHeaders [ERR]:`, error);\r\n      this.headerOptions = [];\r\n    }\r\n  }\r\n\r\n  private async loadBrandsForHeader(header: string) {\r\n    if (!header) {\r\n      this.brandOptions = [];\r\n      return;\r\n    }\r\n    try {\r\n      const result: any = await firstValueFrom(\r\n        this.apiService.getPIDList(header),\r\n      );\r\n      const list: string[] = result?.data ?? [];\r\n      this.brandOptions = list.map((brandName) => ({ brandName }));\r\n    } catch (error) {\r\n      console.log(`@@ ~ loadBrandsForHeader [ERR]:`, error);\r\n      this.brandOptions = [];\r\n    }\r\n  }\r\n\r\n  async onHeaderChange(selected: { label: string } | null) {\r\n    const newLabel = selected?.label ?? \"\";\r\n    if (!this.fixture) return;\r\n\r\n    this.fixture.header = { ...(this.fixture.header ?? {}), label: newLabel };\r\n    this.selectedHeader = newLabel ? [{ label: newLabel }] : [];\r\n\r\n    await this.loadBrandsForHeader(newLabel);\r\n\r\n    const allowed = new Set(this.brandOptions.map((b) => b.brandName));\r\n    const next: Record<string, string[]> = {};\r\n    Object.keys(this.brandsByZone).forEach((zone) => {\r\n      next[zone] = (this.brandsByZone[zone] ?? []).filter((b) =>\r\n        allowed.has(b),\r\n      );\r\n    });\r\n    this.brandsByZone = next;\r\n    this.othersModeByZone = {};\r\n    this.applyBrandsToFixture();\r\n  }\r\n\r\n  onZoneBrandsChange(zone: string, brands: string[]) {\r\n    this.brandsByZone = { ...this.brandsByZone, [zone]: brands ?? [] };\r\n    this.applyBrandsToFixture();\r\n  }\r\n\r\n  resetToOriginal() {\r\n    if (!this.fixture) return;\r\n\r\n    this.fixture.header = {\r\n      ...(this.fixture.header ?? {}),\r\n      label: this.originalHeaderLabel,\r\n    };\r\n    this.selectedHeader = this.originalHeaderLabel\r\n      ? [{ label: this.originalHeaderLabel }]\r\n      : [];\r\n\r\n    this.templateGroupName = this.originalTemplateGroupName;\r\n    this.fixture.templateGroupName = this.templateGroupName;\r\n\r\n    this.brandsByZone = structuredClone(this.originalBrandsByZone);\r\n    this.othersModeByZone = {};\r\n    this.applyBrandsToFixture();\r\n  }\r\n\r\n  private applyBrandsToFixture() {\r\n    (this.fixture?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      if (!zone) return;\r\n      shelf.productBrandName = [...(this.brandsByZone[zone] ?? [])];\r\n    });\r\n  }\r\n\r\n  private sanitizeVmConfig(): void {\r\n    const shelfCount = this.fixture?.shelfConfig?.length ?? 1;\r\n\r\n    this.fixture?.vmConfig?.forEach((vm: any) => {\r\n      if (!vm?.startYPosition && !vm?.endYPosition) {\r\n        if (vm?.xZone === \"stretch\" && vm?.yZone === \"stretch\") {\r\n          vm.startYPosition = shelfCount;\r\n          vm.endYPosition = shelfCount;\r\n        } else {\r\n          vm.startYPosition = 1;\r\n          vm.endYPosition = shelfCount;\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  // getSelectedVM(vm: any) {\r\n  //   if (vm?.vmId) {\r\n  //     return this.vmList.find((v) => v.id === vm.vmId);\r\n  //   } else {\r\n  //     return this.vmList.find(\r\n  //       (v) => v.name === vm.vmName && v.type === vm.vmType\r\n  //     );\r\n  //   }\r\n  // }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    if (!this.showVMs) return true;\r\n\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixture?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition;\r\n      let endShelf = e?.endYPosition;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.fixture?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixture?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            if (this.showColors) {\r\n              const color = this.zoneColor(se.zone);\r\n              secDivs.forEach((d) => {\r\n                if (!d) return;\r\n                d.style.backgroundColor = color.bg;\r\n                const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n                if (cap) {\r\n                  cap.style.border = `1px solid ${color.border}`;\r\n                }\r\n              });\r\n            }\r\n          });\r\n\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            if (cap) {\r\n              const sY =\r\n                y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n              cap.style.transform = `translateY(${sY}px)`;\r\n            }\r\n            y += d.offsetHeight;\r\n          });\r\n\r\n          if (!this.showBCs) return true;\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const color = this.zoneColor(sz.zone);\r\n\r\n                if (this.showColors) {\r\n                  bc.style.borderColor = color.border;\r\n                  bc.style.backgroundColor = \"#fff\";\r\n                }\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          let y = 0;\r\n\r\n          shelfDivs.forEach((div, i) => {\r\n            const cap = div.querySelector(\".capacity\") as HTMLElement;\r\n            if (!cap) {\r\n              y += div.offsetHeight;\r\n              return;\r\n            }\r\n            const sY =\r\n              y + (div.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[i].border}`;\r\n            y += div.offsetHeight;\r\n\r\n            if (this.showColors) {\r\n              div.style.backgroundColor = this.shelfColors[i].bg;\r\n              div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            }\r\n\r\n            if (!this.showBCs) return;\r\n\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            if (this.showColors) {\r\n              bc.style.borderColor = this.shelfColors[i].border;\r\n              bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            }\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        let y = 0;\r\n        shelfDivs.forEach((d) => {\r\n          if (!d) return;\r\n\r\n          if (this.showColors) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n          }\r\n\r\n          const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n          const sY =\r\n            y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n          cap.style.transform = `translateY(${sY}px)`;\r\n          cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n          y += d.offsetHeight;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixture?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixture?.shelfConfig?.map((s: any) => {\r\n        const shelfLabel = `${s.shelfType} ${s.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...s,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","@if(isPageLoading){\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n}@else {\r\n\r\n    <section #fixtureRoot id=\"fixture-view\">\r\n        <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n            <!-- Template group name -->\r\n            <div class=\"template-group-editor\" [class.readonly]=\"!editable\">\r\n                <label for=\"zoneTemplateGroupName\" class=\"form-label mb-1\">Template Group Name</label>\r\n                <div class=\"template-group-autocomplete\">\r\n                    <input\r\n                        id=\"zoneTemplateGroupName\"\r\n                        type=\"text\"\r\n                        class=\"form-control\"\r\n                        autocomplete=\"off\"\r\n                        [ngModel]=\"templateGroupName\"\r\n                        (ngModelChange)=\"onTemplateGroupNameChange($event)\"\r\n                        (focus)=\"onTemplateGroupFocus()\"\r\n                        (blur)=\"onTemplateGroupBlur()\"\r\n                        [disabled]=\"!editable\"\r\n                        placeholder=\"Template Group Name\" />\r\n\r\n                    <ul class=\"suggestions-panel\"\r\n                        *ngIf=\"editable && showTemplateGroupSuggestions && templateGroupSuggestions.length\">\r\n                        <li *ngFor=\"let option of templateGroupSuggestions\"\r\n                            class=\"suggestion-item\"\r\n                            (mousedown)=\"onPickTemplateGroupSuggestion(option)\">\r\n                            {{ option }}\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n                <small class=\"text-danger\"\r\n                    *ngIf=\"editable && !templateGroupName?.trim()\">\r\n                    Template Group Name is required.\r\n                </small>\r\n            </div>\r\n\r\n            <!-- Header block -->\r\n            <div class=\"header-block zone-header-editor\"\r\n                *ngIf=\"(fixture?.header?.isEnabled && fixture?.fixtureType === 'wall') || showHeaderFooterAlways\">\r\n\r\n                <div class=\"zone-header-select\" [class.readonly]=\"!editable\">\r\n                    <lib-select-plano\r\n                        [items]=\"headerOptions\"\r\n                        [multi]=\"false\"\r\n                        [idField]=\"'label'\"\r\n                        [searchField]=\"'label'\"\r\n                        [selectedValues]=\"selectedHeader\"\r\n                        [disabled]=\"!editable\"\r\n                        [compact]=\"true\"\r\n                        [label]=\"'Header'\"\r\n                        (selected)=\"onHeaderChange($event)\">\r\n                    </lib-select-plano>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"fixture?.vmConfig?.length && showVMs\">\r\n                    <ng-container *ngFor=\"let vm of fixture?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN + vm?.vmImageUrl\"\r\n                                    alt=\"Vm Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"fixture?.productResolutionLevel === 'L1' && showBCs\">\r\n                    <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixture?.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of fixture?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"fixture?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"fixture?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"fixture?.productResolutionLevel === 'L3' && showBCs\">\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category zone-brand-editor\">\r\n                            <div class=\"zone-brand-select\" [class.readonly]=\"!editable\">\r\n                                <multiselect-chip-dropdown\r\n                                    [items]=\"brandOptionsForZone(item.zone)\"\r\n                                    [idField]=\"'brandName'\"\r\n                                    [nameField]=\"'brandName'\"\r\n                                    [search]=\"true\"\r\n                                    [compact]=\"true\"\r\n                                    [maxSelection]=\"3\"\r\n                                    [placeholder]=\"'Select brands'\"\r\n                                    [extraActionLabel]=\"isToggleAvailable() ? (othersModeByZone[item.zone] ? 'Hide others' : 'Show others') : ''\"\r\n                                    [extraActionActive]=\"!!othersModeByZone[item.zone]\"\r\n                                    (extraActionClick)=\"onToggleOthers(item.zone)\"\r\n                                    [ngModel]=\"brandsByZone[item.zone]\"\r\n                                    (ngModelChange)=\"onZoneBrandsChange(item.zone, $event)\">\r\n                                </multiselect-chip-dropdown>\r\n                            </div>\r\n                        </div>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixture?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"fixture?.productResolutionLevel === 'L2' && showBCs\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                            <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            </div>\r\n                            <div class=\"capacity\">{{item.productPerShelf * item.trayRows}}</div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n\r\n                            @if(item.shelfType ==='shelf'){\r\n                                <div class=\"capacity\">{{item.productPerShelf}}</div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n                *ngIf=\"(fixture?.footer?.isEnabled && fixture?.fixtureType === 'wall') || (showHeaderFooterAlways && fixture?.footer?.label)\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixture?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </section>\r\n}","import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ActionConfirmPopupComponent } from \"../verification-feedback/action-confirm-popup/action-confirm-popup.component\";\r\nimport { ZoneEditableFixtureComponent } from \"../verification-feedback/zone-editable-fixture/zone-editable-fixture.component\";\r\nimport { getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n\r\n@Component({\r\n  selector: \"lib-zone-verification-feedback\",\r\n  templateUrl: \"./zone-verification-feedback.component.html\",\r\n  styleUrl: \"./zone-verification-feedback.component.scss\",\r\n})\r\nexport class ZoneVerificationFeedbackComponent implements OnChanges {\r\n  @Input() floorData: any;\r\n  @Input() feedbackDetails: any;\r\n  @Input() zoneTask: any;\r\n  @Input() zoneFeedback: any;\r\n  @Input() totalFixtures: any[] = [];\r\n  @Input() cdn: string;\r\n  @Input() showAction: boolean = true;\r\n\r\n  @Output() changeFixture = new EventEmitter<{\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n  }>();\r\n\r\n  @Output() action = new EventEmitter<any>();\r\n\r\n  @ViewChild(ZoneEditableFixtureComponent)\r\n  editableFixture?: ZoneEditableFixtureComponent;\r\n\r\n  constructor(private ngbModal: NgbModal) {}\r\n\r\n  planoFixture: any;\r\n  zoneFixture: any;\r\n\r\n  // Live fixture capacity = sum of individual shelf capacities (see plano.function),\r\n  // kept consistent with the planogram canvas instead of the stored fixtureCapacity.\r\n  get planoFixtureCapacity(): number {\r\n    return getFixtureProductCapacity(this.planoFixture?.shelfConfig);\r\n  }\r\n  currentFixtureIndex: number = 0;\r\n\r\n  selectedImageForPreview: string | null = null;\r\n  imagePreviewZoom: number = 1;\r\n  imagePreviewPanX: number = 0;\r\n  imagePreviewPanY: number = 0;\r\n  isPanning: boolean = false;\r\n  private panLastX: number = 0;\r\n  private panLastY: number = 0;\r\n\r\n  isImageLoading: boolean = false;\r\n  private previousImageUrl: string = \"\";\r\n\r\n  async ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"feedbackDetails\"] || changes[\"zoneFeedback\"] || changes[\"cdn\"]) {\r\n      this.planoFixture = this.feedbackDetails?.fixtureFeedback?.FixtureData;\r\n      this.currentFixtureIndex =\r\n        this.totalFixtures.findIndex(\r\n          (f: any) =>\r\n            f._id === this.feedbackDetails?.fixtureFeedback?.fixtureId,\r\n        ) + 1;\r\n      this.zoneFixture = this.buildZoneFixture(\r\n        this.zoneFeedback,\r\n        this.planoFixture,\r\n      );\r\n\r\n      const newImageUrl = this.zoneImageUrl;\r\n\r\n      if (newImageUrl && newImageUrl !== this.previousImageUrl) {\r\n        this.previousImageUrl = newImageUrl;\r\n        this.isImageLoading = true;\r\n      } else if (!newImageUrl) {\r\n        this.previousImageUrl = \"\";\r\n        this.isImageLoading = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  private buildZoneFixture(row: any, planoFixture: any): any {\r\n    const ans = row?.answers?.[0];\r\n    if (!ans) return null;\r\n    if (!Array.isArray(ans.shelfConfig) || ans.shelfConfig.length === 0) {\r\n      return null;\r\n    }\r\n    return {\r\n      fixtureId: row?.fixtureId,\r\n      fixture: ans.fixture,\r\n      fixtureType: ans.fixtureType ?? planoFixture?.fixtureType,\r\n      fixtureCategory: ans.fixtureCategory ?? planoFixture?.fixtureCategory,\r\n      fixtureCapacity: ans.fixtureCapacity,\r\n      fixtureImage: ans.fixtureImage,\r\n      isEmpty: ans.isEmpty,\r\n      header: {\r\n        ...(planoFixture?.header ?? {}),\r\n        ...(ans.header ?? {}),\r\n      },\r\n      footer: planoFixture?.footer,\r\n      productResolutionLevel: planoFixture?.productResolutionLevel,\r\n      shelfConfig: ans.shelfConfig,\r\n      vmConfig: [],\r\n    };\r\n  }\r\n\r\n  get hasZoneTask(): boolean {\r\n    return !!this.zoneTask;\r\n  }\r\n\r\n  get isTaskOpen(): boolean {\r\n    return this.zoneTask?.checklistStatus === \"open\";\r\n  }\r\n\r\n  get hasFixtureResponse(): boolean {\r\n    return !!this.zoneFixture;\r\n  }\r\n\r\n  get currentUserAction(): string | null {\r\n    return this.zoneFeedback?.answers?.[0]?.userAction ?? null;\r\n  }\r\n\r\n  get isApproved(): boolean {\r\n    const action = this.currentUserAction;\r\n    return (\r\n      action === \"keepPlano\" ||\r\n      action === \"acceptResponse\" ||\r\n      action === \"editAccepted\"\r\n    );\r\n  }\r\n\r\n  // True for any action taken (approve-style or redo). Used to hide the action row\r\n  // once the user has decided — mirrors fixture verification.\r\n  get isActioned(): boolean {\r\n    return this.isApproved || this.currentUserAction === \"redo\";\r\n  }\r\n\r\n  get isClFixture(): boolean {\r\n    // Match the compliance-side CL rule: header.label === 'CL' OR templateGroupName\r\n    // === 'CL'. planoFixture is the live store fixture record so templateGroupName\r\n    // is always populated; this catches CL fixtures whose mobile-side header was\r\n    // reported with a brand-specific label.\r\n    return (\r\n      this.planoFixture?.header?.label === \"CL\" ||\r\n      this.planoFixture?.templateGroupName === \"CL\"\r\n    );\r\n  }\r\n\r\n  get zoneImageUrl(): string {\r\n    const rel =\r\n      this.zoneFixture?.fixtureImage ??\r\n      this.zoneFeedback?.answers?.[0]?.fixtureImage ??\r\n      \"\";\r\n    return this.cdn && rel ? this.cdn + rel : \"\";\r\n  }\r\n\r\n  get canShowActions(): boolean {\r\n    return (\r\n      this.showAction &&\r\n      !!this.zoneTask &&\r\n      this.zoneTask?.checklistStatus === \"submit\" &&\r\n      !this.isActioned &&\r\n      !this.isClFixture\r\n    );\r\n  }\r\n\r\n  async onClickKeepPlano() {\r\n    try {\r\n      const result = await this.confirmAction(\"rejectResponse\");\r\n      if (!result || result.action === \"notOk\") return;\r\n\r\n      this.editableFixture?.resetToOriginal();\r\n\r\n      this.action.emit({\r\n        action: \"keepPlano\",\r\n        type: \"agree\",\r\n        fixtureData: this.planoFixture,\r\n        feedback: this.zoneFeedback,\r\n        remarks: result.remark,\r\n        planoId: this.floorData?.planoId,\r\n        floorId: this.floorData?._id,\r\n        taskType: \"zoneVerification\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ Zone onClickKeepPlano [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  async onClickAcceptResponse() {\r\n    if (!this.hasFixtureResponse) return;\r\n    if (!this.editableFixture?.isValid) return;\r\n    try {\r\n      const result = await this.confirmAction(\"acceptResponse\");\r\n      if (!result || result.action === \"notOk\") return;\r\n\r\n      const isModified = !!this.editableFixture?.isDirty;\r\n\r\n      this.action.emit({\r\n        action: isModified ? \"editAccepted\" : \"acceptResponse\",\r\n        type: \"agree\",\r\n        fixtureData: this.zoneFixture,\r\n        feedback: this.zoneFeedback,\r\n        remarks: result.remark,\r\n        planoId: this.floorData?.planoId,\r\n        floorId: this.floorData?._id,\r\n        taskType: \"zoneVerification\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ Zone onClickAcceptResponse [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  onClickEditResponse() {\r\n    if (!this.hasFixtureResponse) return;\r\n    this.action.emit({\r\n      action: \"editWithResponse\",\r\n      type: \"agree\",\r\n      fixtureData: this.zoneFixture,\r\n      feedback: this.zoneFeedback,\r\n      planoId: this.floorData?.planoId,\r\n      floorId: this.floorData?._id,\r\n      taskType: \"zoneVerification\",\r\n    });\r\n  }\r\n\r\n  async onClickRedo() {\r\n    if (!this.hasFixtureResponse) return;\r\n    try {\r\n      const result = await this.confirmAction(\"redo\");\r\n      if (!result || result.action === \"notOk\") return;\r\n\r\n      this.editableFixture?.resetToOriginal();\r\n\r\n      this.action.emit({\r\n        action: \"redo\",\r\n        type: \"disagree\",\r\n        fixtureData: null,\r\n        feedback: this.zoneFeedback,\r\n        remarks: result.remark,\r\n        planoId: this.floorData?.planoId,\r\n        floorId: this.floorData?._id,\r\n        taskType: \"zoneVerification\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ Zone onClickRedo [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  private async confirmAction(\r\n    type: \"keepPlano\" | \"acceptResponse\" | \"rejectResponse\" | \"redo\",\r\n  ): Promise<{ action: string; remark: string | null } | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ActionConfirmPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        backdrop: \"static\",\r\n      });\r\n      modelRef.componentInstance.type = type;\r\n\r\n      return await modelRef.result.then<{\r\n        action: string;\r\n        remark: string | null;\r\n      }>((result) => result);\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  onChangeFixture(action: \"next\" | \"previous\") {\r\n    const fixtureId = this.feedbackDetails?.fixtureFeedback?.fixtureId;\r\n    if (!fixtureId) return;\r\n    this.changeFixture.emit({ currentFixture: fixtureId, action });\r\n  }\r\n\r\n  onClickImagePreview(event: MouseEvent, imgUrl: string) {\r\n    event.stopPropagation();\r\n    this.selectedImageForPreview = imgUrl;\r\n    this.imagePreviewZoom = 1;\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  closeImagePreview() {\r\n    this.selectedImageForPreview = null;\r\n    this.imagePreviewZoom = 1;\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  onPreviewZoomIn() {\r\n    this.imagePreviewZoom = Math.min(this.imagePreviewZoom + 0.25, 5);\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewZoomOut() {\r\n    this.imagePreviewZoom = Math.max(this.imagePreviewZoom - 0.25, 0.25);\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewZoomSlider(event: Event) {\r\n    const value = +(event.target as HTMLInputElement).value;\r\n    this.imagePreviewZoom = value / 100;\r\n    if (this.imagePreviewZoom <= 1) this.resetPan();\r\n  }\r\n\r\n  onPreviewWheel(event: WheelEvent) {\r\n    event.preventDefault();\r\n    if (event.deltaY < 0) {\r\n      this.onPreviewZoomIn();\r\n    } else {\r\n      this.onPreviewZoomOut();\r\n    }\r\n  }\r\n\r\n  onPreviewPanStart(event: MouseEvent) {\r\n    if (this.imagePreviewZoom <= 1) return;\r\n    this.isPanning = true;\r\n    this.panLastX = event.clientX;\r\n    this.panLastY = event.clientY;\r\n  }\r\n\r\n  onPreviewPanMove(event: MouseEvent) {\r\n    if (!this.isPanning) return;\r\n    const dx = event.clientX - this.panLastX;\r\n    const dy = event.clientY - this.panLastY;\r\n    this.panLastX = event.clientX;\r\n    this.panLastY = event.clientY;\r\n    this.imagePreviewPanX += dx;\r\n    this.imagePreviewPanY += dy;\r\n  }\r\n\r\n  onPreviewPanEnd() {\r\n    this.isPanning = false;\r\n  }\r\n\r\n  private resetPan() {\r\n    this.imagePreviewPanX = 0;\r\n    this.imagePreviewPanY = 0;\r\n  }\r\n\r\n  onImageLoad() {\r\n    this.isImageLoading = false;\r\n  }\r\n\r\n  onImageError() {\r\n    this.isImageLoading = false;\r\n  }\r\n\r\n  onImageLoadStart() {\r\n    this.isImageLoading = true;\r\n  }\r\n\r\n  onImageLoadEnd() {\r\n    this.isImageLoading = false;\r\n  }\r\n}\r\n","<section id=\"verification-feedback\">\r\n\r\n  <!-- Task info accordion -->\r\n  <div *ngIf=\"hasZoneTask\" id=\"task-info\" ngbAccordion #accordion=\"ngbAccordion\">\r\n    <div ngbAccordionItem=\"details\">\r\n      <div ngbAccordionHeader ngbAccordionToggle class=\"accordion-button task-info-header\">\r\n        <div class=\"w-100\">\r\n          <h2>Zone verification assigned</h2>\r\n          <p>{{ zoneTask?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy' }}</p>\r\n        </div>\r\n      </div>\r\n\r\n      <div ngbAccordionCollapse>\r\n        <div ngbAccordionBody>\r\n          <ng-template>\r\n            <div class=\"log-block\">\r\n              <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                <path\r\n                  d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                  stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </svg>\r\n\r\n              <div class=\"d-flex gap-1 flex-column\">\r\n                <h4>{{ zoneTask?.createdByName }}</h4>\r\n                <p>{{ zoneTask?.createdAt | date: 'hh:mma, dd MMM yyyy' }}</p>\r\n                <h5>Assigner</h5>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"log-block\">\r\n              <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                <path\r\n                  d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                  stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </svg>\r\n\r\n              <div class=\"d-flex gap-1 flex-column\">\r\n                <h4>{{ zoneTask?.userName }}</h4>\r\n                <p>{{ zoneTask?.submitTime_string || zoneTask?.startTime_string }}</p>\r\n                <h5>Assignee</h5>\r\n              </div>\r\n            </div>\r\n\r\n            <ng-container *ngIf=\"zoneTask?.comments?.length\">\r\n              <h5 class=\"mb-2\">Comments</h5>\r\n              <div class=\"log-block\" *ngFor=\"let c of zoneTask?.comments\">\r\n                <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                  <path\r\n                    d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                    stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n                <div class=\"d-flex gap-1 flex-column\">\r\n                  <h4>{{ c?.userName }}</h4>\r\n                  <p>{{ c?.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}</p>\r\n                  <h5>{{ c?.comment }}</h5>\r\n                </div>\r\n              </div>\r\n            </ng-container>\r\n          </ng-template>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <hr *ngIf=\"hasZoneTask\">\r\n\r\n  <!-- Empty state: no task assigned -->\r\n  <ng-container *ngIf=\"!hasZoneTask\">\r\n    <div class=\"my-6\">\r\n      <div class=\"text-center\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n          <path\r\n            d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n            stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n        </svg>\r\n      </div>\r\n      <div class=\"mt-3 text-center\">\r\n        <div class=\"fw-bold h3 mt-2\">No response</div>\r\n        <div class=\"mt-4\">No zone verification task has been assigned for this floor.</div>\r\n      </div>\r\n    </div>\r\n  </ng-container>\r\n\r\n  <!-- Empty state: task assigned but not yet submitted (only on a fresh task — during a\r\n       redo's open period we keep the previous round's responses visible like fixture does) -->\r\n  <ng-container *ngIf=\"hasZoneTask && isTaskOpen && !zoneTask?.redoStatus\">\r\n    <div class=\"my-6\">\r\n      <div class=\"text-center\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n          <path\r\n            d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n            stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n        </svg>\r\n      </div>\r\n      <div class=\"mt-3 text-center\">\r\n        <div class=\"fw-bold h3 mt-2\">No response</div>\r\n        <div class=\"mt-4\">Task assigned. Awaiting submission from the store.</div>\r\n      </div>\r\n    </div>\r\n  </ng-container>\r\n\r\n  <!-- Header strip + 3-column comparison: visible when task is inprogress / submit, OR during\r\n       a redo's open period (we render the previous round's data read-only since canShowActions\r\n       already gates the action buttons on checklistStatus === 'submit') -->\r\n  <ng-container *ngIf=\"hasZoneTask && (!isTaskOpen || zoneTask?.redoStatus)\">\r\n\r\n    <div id=\"feedback-handler\" class=\"d-flex align-items-center gap-6 my-6 px-3 fixture-navigate\">\r\n      <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n        viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n\r\n      <h3 class=\"m-0\">{{ planoFixture?.header?.label }}</h3>\r\n\r\n      <div class=\"d-flex align-items-center gap-3 flex-wrap\">\r\n        <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n        </svg>\r\n\r\n        <span *ngIf=\"planoFixture?.fixtureCategory\" class=\"badge inactive me-1\">\r\n          {{ planoFixture.fixtureCategory | titlecase }}\r\n        </span>\r\n\r\n        <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n        </svg>\r\n\r\n        <span *ngIf=\"planoFixture?.fixtureWidth?.value\" class=\"badge inactive me-1\">\r\n          {{ planoFixture.fixtureWidth.value }} {{ planoFixture.fixtureWidth?.unit ?? 'ft' }}\r\n        </span>\r\n\r\n        <svg width=\"5\" height=\"5\" viewBox=\"0 0 5 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <circle cx=\"2.5\" cy=\"2.5\" r=\"2.5\" fill=\"#EAECF0\" />\r\n        </svg>\r\n\r\n        <span class=\"badge inactive me-1\">\r\n          Fixture Capacity: {{ planoFixtureCapacity }}\r\n        </span>\r\n      </div>\r\n\r\n      <h3 *ngIf=\"showAction\" class=\"m-0 ms-auto\">\r\n        {{ currentFixtureIndex }}/{{ totalFixtures.length }}\r\n      </h3>\r\n\r\n      <svg *ngIf=\"showAction\" (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\"\r\n        viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n    </div>\r\n\r\n    <div id=\"fixture-comparison\" class=\"row g-0 my-3\">\r\n\r\n      @if (showAction) {\r\n        <!-- Column 1: Existing template (current plano) -->\r\n        <!-- <div class=\"col-4 p-2\">\r\n        <div class=\"wrapper\">\r\n          @if (canShowActions && hasFixtureResponse) {\r\n            <div class=\"d-flex align-items-center gap-3\">\r\n              <button class=\"btn primary-btn ms-auto\" type=\"button\" (click)=\"onClickKeepPlano()\">\r\n                Keep plano\r\n              </button>\r\n            </div>\r\n          }\r\n          <div class=\"mb-4\">\r\n            <div class=\"d-flex align-items-center gap-2 my-4\">\r\n              <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M2.725 5.80008L10 10.0084L17.275 5.80008M10 18.4001V10.0001M17.5 13.3334V6.66675C17.4997 6.37448 17.4225 6.08742 17.2763 5.83438C17.13 5.58134 16.9198 5.37122 16.6667 5.22508L10.8333 1.89175C10.58 1.74547 10.2926 1.66846 10 1.66846C9.70744 1.66846 9.42003 1.74547 9.16667 1.89175L3.33333 5.22508C3.08022 5.37122 2.86998 5.58134 2.72372 5.83438C2.57745 6.08742 2.5003 6.37448 2.5 6.66675V13.3334C2.5003 13.6257 2.57745 13.9127 2.72372 14.1658C2.86998 14.4188 3.08022 14.6289 3.33333 14.7751L9.16667 18.1084C9.42003 18.2547 9.70744 18.3317 10 18.3317C10.2926 18.3317 10.58 18.2547 10.8333 18.1084L16.6667 14.7751C16.9198 14.6289 17.13 14.4188 17.2763 14.1658C17.4225 13.9127 17.4997 13.6257 17.5 13.3334Z\"\r\n                  stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </svg>\r\n              <h4 class=\"m-0\">Existing template</h4>\r\n              <svg *ngIf=\"isApproved && currentUserAction === 'keepPlano'\"\r\n                class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n                <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                  d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n                  fill=\"#12B76A\" />\r\n              </svg>\r\n            </div>\r\n          </div>\r\n          <fixture [fixture]=\"planoFixture\" [showVMs]=\"true\" [showHeaderFooterAlways]=\"true\"></fixture>\r\n        </div>\r\n      </div> -->\r\n\r\n        <!-- Column 2: Store response (zone-grouped) -->\r\n        <div class=\"col-6 p-2\">\r\n          <div class=\"wrapper\">\r\n            @if (isClFixture) {\r\n              <div class=\"my-6\">\r\n                <div class=\"text-center\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                    <path\r\n                      d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n                      stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n                  </svg>\r\n                </div>\r\n                <div class=\"mt-3 text-center\">\r\n                  <div class=\"fw-bold h3 mt-2\">CL Excluded</div>\r\n                </div>\r\n              </div>\r\n            } @else {\r\n              @if (canShowActions && hasFixtureResponse) {\r\n                <div class=\"d-flex align-items-center gap-3\">\r\n                  <!-- <button class=\"btn quick-btn ms-auto\" type=\"button\" (click)=\"onClickEditResponse()\">\r\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <path\r\n                        d=\"M9.16602 3.3332H3.33268C2.89065 3.3332 2.46673 3.50879 2.15417 3.82135C1.84161 4.13391 1.66602 4.55784 1.66602 4.99986V16.6665C1.66602 17.1086 1.84161 17.5325 2.15417 17.845C2.46673 18.1576 2.89065 18.3332 3.33268 18.3332H14.9993C15.4414 18.3332 15.8653 18.1576 16.1779 17.845C16.4904 17.5325 16.666 17.1086 16.666 16.6665V10.8332M15.416 2.0832C15.7475 1.75168 16.1972 1.56543 16.666 1.56543C17.1349 1.56543 17.5845 1.75168 17.916 2.0832C18.2475 2.41472 18.4338 2.86436 18.4338 3.3332C18.4338 3.80204 18.2475 4.25168 17.916 4.5832L9.99935 12.4999L6.66602 13.3332L7.49935 9.99986L15.416 2.0832Z\"\r\n                        stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                  </button> -->\r\n                  <button class=\"btn redo-btn\" type=\"button\" (click)=\"onClickRedo()\">\r\n                    Redo\r\n                  </button>\r\n                  <button class=\"btn btn-outline btn-outline-cus ms-auto\" type=\"button\" (click)=\"onClickKeepPlano()\">\r\n                    Reject\r\n                  </button>\r\n                  <button class=\"btn primary-btn\" type=\"button\"\r\n                    [disabled]=\"!editableFixture?.isValid\"\r\n                    [title]=\"editableFixture?.validationMessage || ''\"\r\n                    (click)=\"onClickAcceptResponse()\">\r\n                    Accept\r\n                  </button>\r\n                </div>\r\n              }\r\n              <div class=\"mb-4\">\r\n                <div class=\"d-flex align-items-center gap-2 my-4\">\r\n                  <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <path\r\n                      d=\"M15.6504 14.6191H4.34863V10.7373C4.23826 10.7455 4.12644 10.75 4.01367 10.75C3.97137 10.75 3.92943 10.7463 3.8877 10.7451V15.8037C3.88788 16.447 4.42222 16.9883 5.09863 16.9883H14.9004C15.5768 16.9883 16.1102 16.447 16.1104 15.8037V10.7451C16.0708 10.7462 16.0311 10.75 15.9912 10.75C15.8768 10.75 15.7629 10.7449 15.6504 10.7363V14.6191ZM15.4639 3.01172H4.53418C4.48723 3.01187 4.44973 3.03776 4.43457 3.06152V3.0625L2.67871 5.80371L2.66016 5.83301C2.04768 6.82786 2.64325 8.11739 3.73438 8.26367C3.83174 8.27561 3.92224 8.28222 4.01074 8.28223C4.58889 8.28223 5.09978 8.03419 5.45605 7.64746L6.00977 7.04688L6.56152 7.64941C6.91341 8.03371 7.42301 8.28215 8.00488 8.28223C8.58433 8.28223 9.09759 8.03349 9.44922 7.64941L10.002 7.04492L10.5557 7.64941C10.9073 8.03349 11.4206 8.28223 12 8.28223C12.5792 8.2821 13.0918 8.03337 13.4434 7.64941L13.9971 7.04492L14.5498 7.64941C14.9014 8.03349 15.4147 8.28223 15.9941 8.28223C16.0791 8.28222 16.1716 8.27533 16.2676 8.26367C17.3635 8.11504 17.9623 6.8008 17.3232 5.80371L15.5645 3.0625L15.5635 3.06152C15.5483 3.03769 15.511 3.01172 15.4639 3.01172Z\"\r\n                      stroke=\"#101828\" stroke-width=\"1.5\" />\r\n                  </svg>\r\n                  <h4>Store response</h4>\r\n                  <span *ngIf=\"hasFixtureResponse\" class=\"badge inactive me-1\">\r\n                    Capacity: {{ zoneFixture?.fixtureCapacity || 0 }}\r\n                  </span>\r\n                  <svg\r\n                    *ngIf=\"isApproved && (currentUserAction === 'acceptResponse' || currentUserAction === 'editAccepted')\"\r\n                    class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <rect y=\"8.74228e-07\" width=\"20\" height=\"20\" rx=\"10\" fill=\"#D1FADF\" />\r\n                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                      d=\"M14.2464 6.15839L8.27969 11.9167L6.69635 10.2251C6.40469 9.95005 5.94635 9.93339 5.61302 10.1667C5.28802 10.4084 5.19635 10.8334 5.39635 11.1751L7.27135 14.2251C7.45469 14.5084 7.77135 14.6834 8.12969 14.6834C8.47135 14.6834 8.79635 14.5084 8.97969 14.2251C9.27969 13.8334 15.0047 7.00839 15.0047 7.00839C15.7547 6.24172 14.8464 5.56672 14.2464 6.15005L14.2464 6.15839Z\"\r\n                      fill=\"#12B76A\" />\r\n                  </svg>\r\n\r\n                  <svg *ngIf=\"isApproved && (currentUserAction === 'keepPlano')\" class=\"ms-auto\" width=\"20\" height=\"20\"\r\n                    viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n\r\n                    <rect width=\"20\" height=\"20\" rx=\"10\" fill=\"#FEE4E2\" />\r\n\r\n                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                      d=\"M6.225 6.225C6.56667 5.88333 7.11667 5.88333 7.45833 6.225L10 8.76667L12.5417 6.225C12.8833 5.88333 13.4333 5.88333 13.775 6.225C14.1167 6.56667 14.1167 7.11667 13.775 7.45833L11.2333 10L13.775 12.5417C14.1167 12.8833 14.1167 13.4333 13.775 13.775C13.4333 14.1167 12.8833 14.1167 12.5417 13.775L10 11.2333L7.45833 13.775C7.11667 14.1167 6.56667 14.1167 6.225 13.775C5.88333 13.4333 5.88333 12.8833 6.225 12.5417L8.76667 10L6.225 7.45833C5.88333 7.11667 5.88333 6.56667 6.225 6.225Z\"\r\n                      fill=\"#F04438\" />\r\n                  </svg>\r\n                  <svg *ngIf=\"currentUserAction === 'redo'\"\r\n                    class=\"ms-auto\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <path\r\n                      d=\"M8.25065 15.8335C6.90343 15.8335 5.74704 15.396 4.78148 14.521C3.81593 13.646 3.33343 12.5557 3.33398 11.2502C3.33398 9.94461 3.81676 8.85433 4.78232 7.97933C5.74787 7.10433 6.90398 6.66683 8.25065 6.66683H13.5007L11.334 4.50016L12.5007 3.3335L16.6673 7.50016L12.5007 11.6668L11.334 10.5002L13.5007 8.3335H8.25065C7.37565 8.3335 6.6151 8.61127 5.96898 9.16683C5.32287 9.72238 5.0001 10.4168 5.00065 11.2502C5.00065 12.0835 5.32371 12.7779 5.96982 13.3335C6.61593 13.8891 7.37621 14.1668 8.25065 14.1668H14.1673V15.8335H8.25065Z\"\r\n                      fill=\"black\" />\r\n                  </svg>\r\n                </div>\r\n              </div>\r\n              @if (hasFixtureResponse) {\r\n                <zone-editable-fixture\r\n                  [fixture]=\"zoneFixture\"\r\n                  [planoFixture]=\"planoFixture\"\r\n                  [showVMs]=\"false\"\r\n                  [showHeaderFooterAlways]=\"true\"\r\n                  [editable]=\"canShowActions\">\r\n                </zone-editable-fixture>\r\n              } @else {\r\n                <div class=\"my-6\">\r\n                  <div class=\"text-center\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                      <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                      <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                      <path\r\n                        d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n                        stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n                    </svg>\r\n                  </div>\r\n                  <div class=\"mt-3 text-center\">\r\n                    <div>No response for this fixture yet.</div>\r\n                  </div>\r\n                </div>\r\n              }\r\n            }\r\n          </div>\r\n        </div>\r\n      }\r\n\r\n      <!-- Column 3: Store image -->\r\n      <div class=\"p-2\" [ngClass]=\"{'col-6': showAction, 'col': !showAction}\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"mb-4\" [ngStyle]=\"{'margin-top':'12px'}\">\r\n            <div class=\"d-flex align-items-center gap-2 my-4\">\r\n              <h4>Store Image</h4>\r\n            </div>\r\n          </div>\r\n          @if (zoneImageUrl) {\r\n            <div class=\"fixture-image\" (click)=\"onClickImagePreview($event, zoneImageUrl)\">\r\n              @if (isImageLoading) {\r\n                <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n              }\r\n              <img [src]=\"zoneImageUrl\" alt=\"Store response image\"\r\n                [style.display]=\"isImageLoading ? 'none' : 'block'\" (loadstart)=\"onImageLoadStart()\"\r\n                (load)=\"onImageLoad()\" (error)=\"onImageError()\" (loadend)=\"onImageLoadEnd()\">\r\n            </div>\r\n\r\n              <div class=\"img-preview\" *ngIf=\"selectedImageForPreview\" (click)=\"closeImagePreview()\">\r\n                <button class=\"preview-close\" (click)=\"$event.stopPropagation(); closeImagePreview()\">&#x2715;</button>\r\n                <div class=\"preview-zoom-controls\" (click)=\"$event.stopPropagation()\">\r\n                  <button (click)=\"onPreviewZoomOut()\">&#x2212;</button>\r\n                  <input type=\"range\" class=\"zoom-slider\" min=\"25\" max=\"500\" step=\"25\" [value]=\"imagePreviewZoom * 100\"\r\n                    (input)=\"onPreviewZoomSlider($event)\" />\r\n                  <span>{{ (imagePreviewZoom * 100).toFixed(0) }}%</span>\r\n                  <button (click)=\"onPreviewZoomIn()\">&#x2B;</button>\r\n                </div>\r\n                <div class=\"preview-image-container\" (click)=\"$event.stopPropagation()\"\r\n                  (mousedown)=\"onPreviewPanStart($event)\" (mousemove)=\"onPreviewPanMove($event)\"\r\n                  (mouseup)=\"onPreviewPanEnd()\" (mouseleave)=\"onPreviewPanEnd()\" (wheel)=\"onPreviewWheel($event)\">\r\n                  <img [src]=\"selectedImageForPreview\" class=\"full-img\"\r\n                    [style.transform]=\"'scale(' + imagePreviewZoom + ') translate(' + imagePreviewPanX / imagePreviewZoom + 'px,' + imagePreviewPanY / imagePreviewZoom + 'px)'\"\r\n                    draggable=\"false\" />\r\n                </div>\r\n              </div>\r\n            } @else {\r\n              <div class=\"my-6\">\r\n                <div class=\"text-center\">\r\n                  <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <path\r\n                      d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n                      fill=\"#EAECF0\" />\r\n                    <path\r\n                      d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n                      fill=\"#6BCAFF\" />\r\n                    <path\r\n                      d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n                      fill=\"#00A3FF\" />\r\n                    <path\r\n                      d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n                      fill=\"#00A3FF\" />\r\n                    <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n                    <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n                    <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n                  </svg>\r\n                </div>\r\n              </div>\r\n            }\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    @if (zoneFeedback?.answers?.[0]?.comments?.length) {\r\n      <div id=\"fixture-comments\">\r\n        <h5 class=\"mb-2\">Comments</h5>\r\n\r\n        <div class=\"log-block\" *ngFor=\"let c of zoneFeedback?.answers?.[0]?.comments; let i = index\">\r\n          <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n            <path\r\n              d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n\r\n          <div class=\"d-flex gap-1 flex-column\">\r\n            <div class=\"d-flex gap-1 flex-column\">\r\n              <h4>{{ c?.userName }}</h4>\r\n              <p>{{ c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy' }}</p>\r\n            </div>\r\n\r\n            @if (c?.responsetype === 'comment') {\r\n              <h5>{{ c?.comment }}</h5>\r\n            } @else if (c?.responsetype === 'agree') {\r\n              <h5 *ngIf=\"zoneFeedback?.answers?.[0]?.userAction === 'keepPlano'\">\r\n                Marked as \"Keep Plano\".\r\n              </h5>\r\n              <h5 *ngIf=\"zoneFeedback?.answers?.[0]?.userAction === 'acceptResponse'\">\r\n                Marked as \"Accept Response\".\r\n              </h5>\r\n              <h5 *ngIf=\"zoneFeedback?.answers?.[0]?.userAction === 'editAccepted'\">\r\n                Marked as \"Accept Response with Modification\".\r\n              </h5>\r\n              <h5 *ngIf=\"c?.comment\">Note: {{ c.comment }}</h5>\r\n            } @else if (c?.responsetype === 'disagree') {\r\n              <h5>Marked as \"Redo\"</h5>\r\n              <h5 *ngIf=\"c?.comment\">Note: {{ c.comment }}</h5>\r\n            }\r\n          </div>\r\n        </div>\r\n      </div>\r\n    }\r\n  </ng-container>\r\n\r\n  <ng-template #skeletonLoader>\r\n    <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n      <div class=\"shimmer rounded\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n          <br />\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n          <br />\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n          <br />\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n          <br />\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </ng-template>\r\n</section>","import {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  TemplateRef,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\n\r\nimport { Location, TitleCasePipe } from \"@angular/common\";\r\n\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  Validators,\r\n} from \"@angular/forms\";\r\n\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\nimport {\r\n  Subject,\r\n  Subscription,\r\n  debounceTime,\r\n  firstValueFrom,\r\n  fromEvent,\r\n  takeUntil,\r\n} from \"rxjs\";\r\n\r\nimport { NgbAccordionDirective, NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport * as fabric from \"fabric\";\r\n\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\n\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { CadSourceService } from \"../../services/cad-source.service\";\r\nimport { LayoutEditConfirmationComponent } from \"../popups/layout-edit-confirmation/layout-edit-confirmation.component\";\r\nimport { PublishTaskPopupComponent } from \"./popups/publishtask-popup/publishtask-popup.component\";\r\nimport { StoreTaskRevokeComponent } from \"./popups/store-task-revoke/store-task-revoke.component\";\r\nimport { DeleteConfirmationComponent } from \"../popups/delete-confirmation/delete-confirmation.component\";\r\nimport { DropdownIF } from \"../../interfaces/plano-general.interface\";\r\nimport { PublishPlanoModalComponent } from \"../popups/publish-plano-modal/publish-plano-modal.component\";\r\nimport { ScheduleTaskPopupComponent } from \"./popups/schedule-task-popup/schedule-task-popup.component\";\r\nimport dayjs from \"dayjs\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../functions/plano.function\";\r\n\r\ntype BoundFixtureGroup = {\r\n  fixtureGroup: fabric.Group;\r\n  offsetX: number;\r\n  offsetY: number;\r\n  _tempOldTop?: number;\r\n  _tempOldLeft?: number;\r\n};\r\n\r\n@Component({\r\n  selector: \"lib-manage-store-plano\",\r\n  templateUrl: \"./manage-store-plano.component.html\",\r\n  styleUrl: \"./manage-store-plano.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class ManageStorePlanoComponent\r\n  implements AfterViewInit, OnDestroy, OnInit\r\n{\r\n  @ViewChild(\"baseCanvas\")\r\n  canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  @ViewChild(\"noStoreVideo\") noStoreVideoModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"applyLogics\") applyLogicsModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"approveLayoutModal\") approveLayoutModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"bodyAccordion\") bodyAccordion?: NgbAccordionDirective;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  destroy$ = new Subject();\r\n\r\n  clientId: string;\r\n\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  wallBindings = new Map<fabric.Group, BoundFixtureGroup[]>();\r\n\r\n  layoutForm: FormGroup;\r\n  selectedFloorId = new FormControl(\"\");\r\n  floorsList: DropdownIF[][] = [];\r\n  fixtureConfigSubscriptions: Subscription[] = [];\r\n  fixtureTemplateIdSubscriptions: Subscription[] = [];\r\n  otherElementsSubscriptions: Subscription[] = [];\r\n\r\n  planoData: any;\r\n\r\n  floorData: any;\r\n  readonly originalFloorData: any; // used to rollback to original layout state on click cancel while editing.\r\n\r\n  cdnUrl: string;\r\n  fixtureTemplates: any[] = [];\r\n  allFixtures: any[] = []; // all fixtures including the master templates for tree view\r\n  allFixtureInstances: any[] = []; // only the layout fixtures instances.\r\n  storeFeedback: any;\r\n  zoneFeedback: any;\r\n  selectedZoneFeedback: any;\r\n\r\n  // CL detection: header.label null/missing or 'CL' (legacy mobile clients), OR the\r\n  // newer answers[0].templateGroupName snapshot === 'CL' (mobile writes this alongside\r\n  // the other fixture-snapshot fields in answers[0] for zone submissions, catching\r\n  // brand-labeled CL fixtures). Older zone rows without templateGroupName still fall\r\n  // back to the header-label check.\r\n  private isClComplianceRow(row: any): boolean {\r\n    const ans = row?.answers?.[0];\r\n    const label = ans?.header?.label;\r\n    if (label == null || label === \"CL\") return true;\r\n    return ans?.templateGroupName === \"CL\";\r\n  }\r\n\r\n  get zonePendingCount(): number {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (!task) return 0;\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    let pending = 0;\r\n    for (const row of rows) {\r\n      const ans = row?.answers?.[0];\r\n      if (!ans) continue;\r\n      if (this.isClComplianceRow(row)) continue;\r\n      const hasResponse =\r\n        Array.isArray(ans?.shelfConfig) && ans.shelfConfig.length > 0;\r\n      if (hasResponse && !ans?.userAction) pending++;\r\n    }\r\n    return pending;\r\n  }\r\n\r\n  get zoneRedoCount(): number {\r\n    // Iterate compliance rows directly so a redo flag is detected even if the floor\r\n    // data isn't refreshed yet. CL skip uses isClComplianceRow (header label OR row's\r\n    // templateGroupName snapshot) — same rule as the BE rollup.\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    let count = 0;\r\n    for (const row of rows) {\r\n      const ans = row?.answers?.[0];\r\n      if (!ans) continue;\r\n      if (this.isClComplianceRow(row)) continue;\r\n      if (ans.userAction === \"redo\") count++;\r\n    }\r\n    return count;\r\n  }\r\n\r\n  // Redo can be published once every non-CL fixture has been actioned AND at least one is redo.\r\n  // Also requires the task to still be in 'submit' state — once redo is published, the task\r\n  // reopens (status='open') and the button must hide until mobile resubmits.\r\n  get zoneRedoStatus(): boolean {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (task?.checklistStatus !== \"submit\") return false;\r\n    return this.zonePendingCount === 0 && this.zoneRedoCount > 0;\r\n  }\r\n\r\n  get zoneTaskStyle(): { name: string; class: string; email?: string } {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (!task) return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n    const status = task.checklistStatus;\r\n    // Assignee email of the person the zone task is assigned to. Not shown for\r\n    // Approved or Yet-to-Assign states (no active assignment to surface).\r\n    const email = task.userEmail ?? \"\";\r\n    // Collapse 'open' and 'inprogress' into a single \"Task Assigned\" state,\r\n    // matching the verification table's column convention.\r\n    if (status === \"open\" || status === \"inprogress\") {\r\n      // After a redo is published, the task reopens with redoStatus=true.\r\n      if (task.redoStatus === true) {\r\n        return { name: \"Redo\", class: \"taskAssigned\", email };\r\n      }\r\n      return { name: \"Task Assigned\", class: \"taskAssigned\", email };\r\n    }\r\n    // status === 'submit'\r\n    // Match fixture verification's wording: when there are pending redos to publish,\r\n    // fixture's getStatus() returns \"Yet to Assign\" — same convention used here.\r\n    if (this.zoneRedoStatus) {\r\n      return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n    }\r\n    if (this.zonePendingCount === 0) {\r\n      return { name: \"Approved\", class: \"completed\" };\r\n    }\r\n    return { name: \"Review Pending\", class: \"reviewPending\", email };\r\n  }\r\n\r\n  // Top \"Publish\" button visibility: appears once layout+fixture+vm are Approved,\r\n  // regardless of zone state. Supports legacy stores (no zone task) by enabling\r\n  // immediately, and gates active zone tasks via topPublishDisabled below.\r\n  get showTopPublish(): boolean {\r\n    return (\r\n      this.taskStyle.layout.name === \"Approved\" &&\r\n      this.taskStyle.fixture.name === \"Approved\" &&\r\n      this.taskStyle.vm.name === \"Approved\"\r\n    );\r\n  }\r\n\r\n  // Top \"Publish\" button disabled when a zone task exists and isn't Approved yet.\r\n  // Keeps the disabledPublish signal from BE (taskInfo.disabled / editing) intact.\r\n  get topPublishDisabled(): boolean {\r\n    const zoneTaskExists = !!this.zoneFeedback?.zoneVerificationTask;\r\n    const zoneApproved =\r\n      !zoneTaskExists || this.zoneTaskStyle.name === \"Approved\";\r\n    return this.disabledPublish || !zoneApproved;\r\n  }\r\n\r\n  // Tells inside-fixture editors whether to ask the BE to revert downstream\r\n  // verifications on save. True whenever any verification (fixture / vm / zone) is\r\n  // past YetToAssign, mirroring updateStorePlano's always-on revertOnEdit. AI\r\n  // verification flows (keepPlano / modifyPlano / modifyAiResponse / zone editAccepted)\r\n  // and rollout edits are filtered earlier by the children's `!fixtureData?.taskType\r\n  // && !isRollout` gate, so widening this here only affects normal layout-edit-mode\r\n  // fixture saves — which is exactly the case that should invalidate downstream tasks.\r\n  get shouldRevertOnEdit(): boolean {\r\n    return (\r\n      this.taskStyle.fixture.class !== \"yetToAssign\" ||\r\n      this.taskStyle.vm.class !== \"yetToAssign\" ||\r\n      this.zoneTaskStyle.class !== \"yetToAssign\"\r\n    );\r\n  }\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  selectedFixtureFeedback: any;\r\n  editFixture: boolean = false;\r\n  editFixtureSection: \"basic-details\" | \"products\" | \"vms\" = \"basic-details\";\r\n  activeFeedbackTab: \"fixture\" | \"zone\" = \"fixture\";\r\n  editFromTab: \"fixture\" | \"zone\" = \"fixture\";\r\n  submitFixture = false;\r\n\r\n  highlightedFixtureFormId: string | null = null;\r\n\r\n  storeMetrics = {\r\n    floorCount: 0,\r\n    fixtureCount: 0,\r\n    vmCount: 0,\r\n  };\r\n\r\n  isPageLoading: boolean = true;\r\n  isRightPanelCollapsed: boolean = true;\r\n  isLeftPanelCollapsed: boolean = true;\r\n  selectedView: \"tree\" | \"detail\" = \"detail\";\r\n\r\n  publishingState:\r\n    | \"layout\"\r\n    | \"layout-redo\"\r\n    | \"fixture\"\r\n    | \"fixture-redo\"\r\n    | \"vm\"\r\n    | \"vm-redo\"\r\n    | \"complete\"\r\n    | \"\" = \"\";\r\n  disabledPublish: boolean = false;\r\n  disableEdit: boolean = true;\r\n  isSavingLayout: boolean = false;\r\n\r\n  // Flipped to true by any layout-level mutation (add / delete / move / template\r\n  // change). Reset to false on successful save. Gates the per-fixture edit icon\r\n  // so the user must save layout changes first.\r\n  layoutHasUnsavedChanges: boolean = false;\r\n  taskInfo: any;\r\n  taskStyle: {\r\n    layout: { name: string; class: string; email?: string };\r\n    fixture: { name: string; class: string; email?: string };\r\n    vm: { name: string; class: string; email?: string };\r\n  } = {\r\n    layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n  };\r\n\r\n  otherElementList: DropdownIF[] = [\r\n    { label: \"POS Counter\", value: \"POS Counter\" },\r\n    { label: \"Discussion Table\", value: \"Discussion Table\" },\r\n    { label: \"Mirror\", value: \"Mirror\" },\r\n    { label: \"Others\", value: \"Others\" },\r\n  ];\r\n  storeList: any = [];\r\n  selectedStoreName: any;\r\n\r\n  // vmList: VmLibraryList[] = [];\r\n  // isUserInteractedWithCanvas: boolean = false;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  isButtonLoading = false;\r\n  isStoreTourLoading = false;\r\n\r\n  layoutBounds: any;\r\n  showLayout: boolean = false;\r\n  clCount: number = 0;\r\n  wallCount: number = 0;\r\n  toggle: boolean = true;\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private route: ActivatedRoute,\r\n    private fb: FormBuilder,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private toastService: ToastService,\r\n    private modalService: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private location: Location,\r\n    private router: Router,\r\n    private cd: ChangeDetectorRef,\r\n    public cadSource: CadSourceService,\r\n  ) {\r\n    this.createForm();\r\n\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        // await this.getVmsList();\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.planoId) {\r\n          this.getStoreFixtures(params?.planoId);\r\n          this.getStoreList(params?.planoId);\r\n          if (params?.floorId) {\r\n            this.floorData = { _id: params?.floorId };\r\n          }\r\n        }\r\n      });\r\n\r\n    this.selectedFloorId.valueChanges.subscribe(async (id) => {\r\n      const clickedFloor = this.planoData?.floors?.find(\r\n        (f: any) => f._id === id,\r\n      );\r\n\r\n      if ([\"draft\", \"allocationPending\"].includes(clickedFloor.status)) {\r\n        this.router.navigateByUrl(\r\n          `manage/planogram/onboard-planogram?planoId=${clickedFloor.planoId}&floorId=${clickedFloor._id}`,\r\n        );\r\n      } else {\r\n        this.floorData = null;\r\n        this.createForm();\r\n        // Keep the form disabled during the floor-switch loading window so the\r\n        // template's edit-mode buttons (Save / Cancel / Add Entrance) don't flash.\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        this.removeHighlight();\r\n        this.isLeftPanelCollapsed = true;\r\n        this.isRightPanelCollapsed = true;\r\n\r\n        // Reset per-floor selection state so stale references from the previous\r\n        // floor don't bleed into the new floor's render and feedback panels.\r\n        this.selectedFixture = null;\r\n        this.selectedFixtureFeedback = null;\r\n        this.selectedZoneFeedback = null;\r\n        this.allFixtureInstances = [];\r\n        this.allFixtures = [];\r\n        this.wallCount = this.clCount = 0;\r\n\r\n        this.floorData = clickedFloor;\r\n        this.extractAllFixtures(this.floorData);\r\n\r\n        try {\r\n          await Promise.all([\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id),\r\n            this.getStoreFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n              {},\r\n            ),\r\n            this.getZoneVerificationFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n            ),\r\n          ]);\r\n        } catch {}\r\n\r\n        this.renderFloor();\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        const newParams = new URLSearchParams(window.location.search);\r\n        newParams.set(\"planoId\", this.floorData.planoId);\r\n        newParams.set(\"floorId\", this.floorData._id);\r\n\r\n        this.location.replaceState(\r\n          window.location.pathname,\r\n          newParams.toString(),\r\n        );\r\n        this.selectedFloorId.setValue(this.floorData._id, { emitEvent: false });\r\n      }\r\n    });\r\n\r\n    this.canvas = new fabric.Canvas(this.canvasRef?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n    });\r\n\r\n    fromEvent(this.canvas as any, \"object:modified\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(async (e: any) => {\r\n        const movedObj: any = e.target;\r\n\r\n        if (!movedObj) return;\r\n\r\n        if (this.layoutForm?.enabled) {\r\n          this.layoutHasUnsavedChanges = true;\r\n        }\r\n\r\n        if (movedObj?.type === \"activeSelection\") {\r\n          this.applyGroupTransform(movedObj);\r\n        }\r\n\r\n        const action = e.transform?.action;\r\n\r\n        const isResize =\r\n          action === \"scale\" || action === \"scaleX\" || action === \"scaleY\";\r\n\r\n        if (isResize) {\r\n          const type = movedObj?.objType ?? \"group\";\r\n\r\n          const updatedConfig = {\r\n            x: movedObj.left,\r\n            y: movedObj.top,\r\n            width: movedObj.getScaledWidth(),\r\n            height: movedObj.getScaledHeight(),\r\n            angle: movedObj.angle,\r\n            elementData: movedObj.data,\r\n          };\r\n\r\n          switch (type) {\r\n            case \"wall\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.angle = updatedConfig.angle;\r\n\r\n              const newWall = await this.drawWall(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                this.wallThickness,\r\n                updatedConfig.width - 0.27,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newWall as any).objType = \"wall\";\r\n              (newWall as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newWall);\r\n              break;\r\n            }\r\n\r\n            case \"others\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.relativePosition.angle =\r\n                updatedConfig.angle;\r\n\r\n              const newOther = this.drawOtherElementsWithLabel(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                updatedConfig.angle,\r\n                updatedConfig.width - 2,\r\n                updatedConfig.height - 2,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newOther as any).objType = \"others\";\r\n              (newOther as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newOther);\r\n              break;\r\n            }\r\n\r\n            case \"entrance\": {\r\n              break;\r\n            }\r\n\r\n            case \"fixture\": {\r\n              break;\r\n            }\r\n\r\n            default:\r\n              break;\r\n          }\r\n\r\n          this.canvas.requestRenderAll();\r\n        }\r\n\r\n        this.updateWallCoordinates();\r\n        this.updateFixtureCoordinates();\r\n        this.updateOtherElementsCoordinates();\r\n        this.updateEntranceCoordinates();\r\n      });\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    this.listenToDeleteKey();\r\n    this.togglePanel(\"left\", true);\r\n  }\r\n\r\n  async updateAllPositions() {\r\n    this.updateWallCoordinates();\r\n    this.updateFixtureCoordinates();\r\n    this.updateOtherElementsCoordinates();\r\n    this.updateEntranceCoordinates();\r\n\r\n    this.floorData.cadLayout = false;\r\n  }\r\n\r\n  applyGroupTransform(selection: fabric.ActiveSelection) {\r\n    const matrix = selection.calcTransformMatrix();\r\n\r\n    selection.getObjects().forEach((obj: any) => {\r\n      const objMatrix = obj.calcTransformMatrix();\r\n      const finalMatrix = fabric.util.multiplyTransformMatrices(\r\n        matrix,\r\n        objMatrix,\r\n      );\r\n\r\n      const point = new fabric.Point(0, 0).transform(finalMatrix);\r\n\r\n      obj.set({\r\n        left: point.x,\r\n        top: point.y,\r\n        angle: selection.angle + (obj.angle ?? 0),\r\n      });\r\n\r\n      obj.setCoords();\r\n    });\r\n\r\n    // Ungroup after applying transform\r\n    this.canvas.discardActiveObject();\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Manage Store Plano\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  onFixtureSave() {\r\n    this.submitFixture = true;\r\n    // this.selectedFixtureData.taskType = this.publishingState;\r\n    setTimeout(() => {\r\n      this.submitFixture = false;\r\n    }, 100);\r\n  }\r\n\r\n  async onFixturePageCancel() {\r\n    // this.submitFixture = false;\r\n    this.selectedFixtureData = null;\r\n    this.editFixtureSection = \"basic-details\";\r\n    this.editFixture = false;\r\n    this.editFromTab = \"fixture\";\r\n    // this.layoutForm.disable({ emitEvent: false });\r\n    await this.renderFloor(false);\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  onFixtureSubmit(event: any) {\r\n    if (!event && !this.selectedFixtureData) return;\r\n\r\n    if (event?.shelf && this.selectedFixtureData?.shelfConfig) {\r\n      event.shelf = event.shelf.map((shelf: any, index: any) => {\r\n        let findShelf = this.selectedFixtureData.shelfConfig.find(\r\n          (ele: any) => ele.shelfNumber == index + 1,\r\n        );\r\n        if (findShelf) {\r\n          shelf = { ...findShelf, ...shelf };\r\n        } else {\r\n          let details =\r\n            this.selectedFixtureData.shelfConfig[\r\n              this.selectedFixtureData.shelfConfig.length - 1\r\n            ];\r\n          details.shelfNumber = index + 1;\r\n          shelf = { ...details, ...shelf };\r\n        }\r\n        return shelf;\r\n      });\r\n\r\n      this.selectedFixtureData[\"shelfConfig\"] = event?.shelf;\r\n      this.selectedFixtureData[\"description\"] = event?.description ?? \"\";\r\n      this.selectedFixtureData[\"templateGroupName\"] =\r\n        event?.templateGroupName ?? \"\";\r\n      this.selectedFixtureData.header.label = event?.headerLabel ?? \"\";\r\n      this.selectedFixtureData.footer.label = event?.footerLabel ?? \"\";\r\n    } else if (event?.section) {\r\n      event.section.forEach((sec: any) => {\r\n        let number = sec?.shelves?.map((ele: any) =>\r\n          parseInt(ele.split(\" \")[1]),\r\n        );\r\n        this.selectedFixtureData?.shelfConfig.forEach((shelf: any) => {\r\n          if (number.includes(shelf.shelfNumber)) {\r\n            shelf.zone = sec.zone;\r\n            shelf.productBrandName = sec.productBrandName;\r\n            shelf.productCategory = sec.productCategory;\r\n          }\r\n        });\r\n      });\r\n    } else if (event?.vmConfig && this.selectedFixtureData?.vmConfig) {\r\n      this.selectedFixtureData[\"vmConfig\"] = event?.vmConfig;\r\n    } else {\r\n      if (event) {\r\n        // this.getVmsList();\r\n        this.createForm();\r\n        this.selectedFixtureData = null;\r\n        this.editFixtureSection = \"basic-details\";\r\n        this.editFixture = false;\r\n        if (this.editFromTab === \"zone\") {\r\n          this.persistZoneEditAccepted();\r\n          this.editFromTab = \"fixture\";\r\n        }\r\n        this.getStoreFixtures(this.planoData?._id);\r\n      }\r\n    }\r\n  }\r\n\r\n  togglePanel(side: \"left\" | \"right\", action?: boolean) {\r\n    if (side === \"left\") {\r\n      this.isLeftPanelCollapsed = action ?? !this.isLeftPanelCollapsed;\r\n      if (!this.isLeftPanelCollapsed) this.isRightPanelCollapsed = true;\r\n    } else {\r\n      this.isRightPanelCollapsed = action ?? !this.isRightPanelCollapsed;\r\n      if (!this.isRightPanelCollapsed) this.isLeftPanelCollapsed = true;\r\n\r\n      if (!this.selectedFixtureFeedback) {\r\n        this.onChangeFixtureOnFeedbackPanel({});\r\n      }\r\n    }\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 400);\r\n  }\r\n\r\n  onFeedbackTabChange(tab: \"fixture\" | \"zone\") {\r\n    if (this.activeFeedbackTab === tab) return;\r\n    this.activeFeedbackTab = tab;\r\n\r\n    // Panel min-width animates over 300ms (see [class^=\"col\"] transition).\r\n    // Resize per frame so the canvas tracks the container width as it animates,\r\n    // then fit the layout once the transition settles.\r\n    const duration = 350;\r\n    const start = performance.now();\r\n    const step = () => {\r\n      this.resizeCanvas();\r\n      if (performance.now() - start < duration) {\r\n        requestAnimationFrame(step);\r\n      } else {\r\n        this.fitCanvasToLayoutAnimated();\r\n      }\r\n    };\r\n    requestAnimationFrame(step);\r\n  }\r\n\r\n  openSourceCad() {\r\n    const storeName = this.floorData?.storeName ?? this.planoData?.storeName;\r\n    this.cadSource.open(storeName, this.floorData?.cadFiles);\r\n  }\r\n\r\n  getZoneVerificationFeedback(planoId: string, floorId: string) {\r\n    return new Promise((resolve) => {\r\n      this.apiService\r\n        .getZoneVerificationFeedback({ planoId, floorId })\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            this.zoneFeedback = res?.data ?? null;\r\n            if (this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId) {\r\n              this.selectZoneFeedback(\r\n                this.selectedFixtureFeedback.fixtureFeedback.fixtureId,\r\n              );\r\n            }\r\n            this.calculatePublishingState();\r\n            resolve(true);\r\n          },\r\n          error: () => {\r\n            this.zoneFeedback = null;\r\n            this.calculatePublishingState();\r\n            resolve(true);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  selectZoneFeedback(fixtureId: string) {\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    this.selectedZoneFeedback =\r\n      rows.find((row: any) => row?.fixtureId?.toString?.() === fixtureId) ??\r\n      null;\r\n  }\r\n\r\n  getStoreFeedback(\r\n    planoId: string,\r\n    floorId: string,\r\n    filter: any,\r\n    checkPublishState: boolean = true,\r\n  ) {\r\n    return new Promise((resolve, reject) => {\r\n      let data: any = {\r\n        planoId: planoId,\r\n        floorId: floorId,\r\n      };\r\n      if (filter) {\r\n        data = { ...data, ...filter };\r\n      }\r\n\r\n      this.apiService.getStoreFeedback(data).subscribe({\r\n        next: async (res: any) => {\r\n          this.storeFeedback = res.data;\r\n          if (res.data?.layoutData?.length) {\r\n            await this.processLayoutFeedback(res.data.layoutData);\r\n          } else {\r\n            await this.processLayoutFeedback([]);\r\n          }\r\n\r\n          if (res.data?.fixtureData?.length) {\r\n            if (\r\n              res.data?.fixtureData.length &&\r\n              !res.data?.fixtureData?.[0]?.fixtureId\r\n            ) {\r\n              this.showLayout = true;\r\n            }\r\n            this.processFixtureFeedback(res.data.fixtureData);\r\n          } else {\r\n            this.processFixtureFeedback([]);\r\n          }\r\n\r\n          if (res.data?.VmData?.length) {\r\n            this.processVmFeedback(res.data.VmData);\r\n          } else {\r\n            this.processVmFeedback([]);\r\n          }\r\n\r\n          if (checkPublishState) {\r\n            // this.calculatePublishingState()\r\n          }\r\n\r\n          if (this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId) {\r\n            this.onChangeFixtureOnFeedbackPanel({\r\n              currentFixture:\r\n                this.selectedFixtureFeedback.fixtureFeedback.fixtureId,\r\n            });\r\n          }\r\n          resolve(true);\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to fetch store feedback\");\r\n          reject();\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  calculatePublishingState() {\r\n    let disableEdit = false;\r\n    for (let i = 0; i < this.floorData.layoutPolygon.length; i++) {\r\n      const element = this.floorData.layoutPolygon[i];\r\n      for (let j = 0; j < element.fixtures.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        if (fixture.issue) {\r\n          disableEdit = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.floorData?.centerFixture) {\r\n      for (let i = 0; i < this.floorData.centerFixture.length; i++) {\r\n        const fixture = this.floorData.centerFixture[i];\r\n\r\n        if (fixture.issue) {\r\n          disableEdit = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (disableEdit) {\r\n      this.disableEdit = true;\r\n    } else {\r\n      this.disableEdit = false;\r\n    }\r\n\r\n    let layoutData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"layout\",\r\n    );\r\n    let fixtureData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"fixture\",\r\n    );\r\n    let vmData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"fixture\",\r\n    );\r\n    const zoneTaskExists = !!this.zoneFeedback?.zoneVerificationTask;\r\n    const zoneApproved =\r\n      !zoneTaskExists || this.zoneTaskStyle.name == \"Approved\";\r\n\r\n    const allNonZoneApproved =\r\n      this.taskStyle.layout.name == \"Approved\" &&\r\n      this.taskStyle.fixture.name == \"Approved\" &&\r\n      this.taskStyle.vm.name == \"Approved\";\r\n\r\n    if (allNonZoneApproved && zoneApproved) {\r\n      this.publishingState = \"complete\";\r\n    } else if (allNonZoneApproved && !zoneApproved) {\r\n      // Only zone review is blocking — no publish action to take here.\r\n      this.publishingState = \"\";\r\n    } else if (this.taskStyle.fixture.name == \"Approved\") {\r\n      this.publishingState = \"vm\";\r\n      if (\r\n        vmData &&\r\n        ((vmData.status == \"submit\" && vmData.feedbackStatus == \"disagree\") ||\r\n          vmData?.redoStatus)\r\n      ) {\r\n        this.publishingState = \"vm-redo\";\r\n      }\r\n    } else {\r\n      this.publishingState = \"fixture\";\r\n      if (\r\n        fixtureData &&\r\n        ((fixtureData.status == \"submit\" &&\r\n          fixtureData.feedbackStatus == \"disagree\") ||\r\n          fixtureData?.redoStatus)\r\n      ) {\r\n        this.publishingState = !this.floorData.isEdited\r\n          ? \"fixture-redo\"\r\n          : \"fixture\";\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  async processLayoutFeedback(storeFeedback: any[]) {\r\n    const layoutFeedback = storeFeedback.find(\r\n      (feedback) => feedback.type === \"layout\",\r\n    );\r\n\r\n    const wallElements = this.floorData.layoutPolygon.filter(\r\n      (element: any) => element.elementType === \"wall\",\r\n    );\r\n\r\n    if (layoutFeedback) {\r\n      const issues = layoutFeedback?.answers?.[0]?.issues;\r\n\r\n      if (issues) {\r\n        for (let i = 0; i < issues.length; i++) {\r\n          const issue = issues[i];\r\n\r\n          if (issue.issueType === \"extraFixture\") {\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              const template: any = await this.getTemplate(\r\n                fixture.fixtureConfigId,\r\n              );\r\n\r\n              if (!template) {\r\n                return;\r\n              }\r\n\r\n              const fixtureId = `new-${crypto.randomUUID()}`;\r\n\r\n              const ghostFixture = {\r\n                ...template?.data,\r\n                fixtureConfigId: template?.data?._id,\r\n                _id: fixtureId,\r\n                relativePosition: { x: 0, y: 0, unit: \"ft\" },\r\n                shelfConfig: fixture.shelfConfig,\r\n                ghost: true,\r\n                issue: true,\r\n                issueData: fixture,\r\n                taskType: \"layout\",\r\n              };\r\n\r\n              // const fixtureGroup = this.patchFixture({ fixtureName: ghostFixture.fixtureName, fixtureConfigId: ghostFixture.fixtureConfigId, _id: ghostFixture._id });\r\n\r\n              if (fixture.associatedElementType === \"wall\") {\r\n                let wallIndex: number;\r\n\r\n                const assocWallNum = fixture.associatedElementNumber;\r\n                if (assocWallNum >= wallElements.length) {\r\n                  wallIndex = wallElements.length;\r\n                } else if (assocWallNum <= 0) {\r\n                  wallIndex = 0;\r\n                } else {\r\n                  wallIndex = assocWallNum;\r\n                }\r\n\r\n                const elementFixtures: any = wallElements.find(\r\n                  (element: any) =>\r\n                    element.elementType === \"wall\" &&\r\n                    element.elementNumber === wallIndex,\r\n                ).fixtures;\r\n                const assocFixtureNum = fixture.associatedElementFixtureNumber;\r\n\r\n                if (assocFixtureNum > elementFixtures.length) {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.push(ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).push(fixtureGroup);\r\n                } else if (assocFixtureNum <= 0) {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.unshift(ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).insert(0, fixtureGroup);\r\n                } else {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.splice(assocFixtureNum - 1, 0, ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).insert(assocFixtureNum - 1, fixtureGroup);\r\n                }\r\n              } else if (fixture.associatedElementType === \"floor\") {\r\n                const assocFixtureNum = fixture.associatedElementFixtureNumber;\r\n\r\n                if (assocFixtureNum > this.floorData.centerFixture.length) {\r\n                  this.floorData.centerFixture.push(ghostFixture);\r\n                  // this.getFormFloorFixtures.push(fixtureGroup);\r\n                } else if (assocFixtureNum <= 0) {\r\n                  this.floorData.centerFixture.unshift(ghostFixture);\r\n                  // this.getFormFloorFixtures.insert(0, fixtureGroup);\r\n                } else {\r\n                  this.floorData.centerFixture.splice(\r\n                    assocFixtureNum - 1,\r\n                    0,\r\n                    ghostFixture,\r\n                  );\r\n                  // this.getFormFloorFixtures.insert(assocFixtureNum - 1, fixtureGroup);\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          if (\r\n            issue.issueType === \"fixtureMissing\" ||\r\n            issue.issueType === \"fixtureMismatch\"\r\n          ) {\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"layout\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"layout\",\r\n                };\r\n              }\r\n            }\r\n\r\n            // }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  processFixtureFeedback(storeFeedback: any[]) {\r\n    const fixtureFeedback = storeFeedback.filter(\r\n      (feedback) => feedback.type === \"fixture\",\r\n    );\r\n\r\n    let findFixtureTask = this.taskInfo?.taskDetails?.find(\r\n      (task: any) => task.type == \"fixture\",\r\n    );\r\n\r\n    for (const feedback of fixtureFeedback ?? []) {\r\n      const aiData = feedback?.fixtureAIData;\r\n      if (!aiData) continue;\r\n\r\n      const fixture = this.allFixtureInstances.find(\r\n        (f: any) => f._id === aiData.fixtureId,\r\n      );\r\n      if (!fixture) continue;\r\n\r\n      feedback.FixtureData = structuredClone(fixture);\r\n\r\n      const status =\r\n        (findFixtureTask?.status === \"submit\" || findFixtureTask?.redoStatus) &&\r\n        feedback?.answers?.[0]?.status\r\n          ? feedback.answers[0].status\r\n          : \"\";\r\n\r\n      Object.assign(fixture, {\r\n        issue: false,\r\n        issueData: aiData,\r\n        taskType: \"fixture\",\r\n        status,\r\n        breach: findFixtureTask?.breach,\r\n        taskStatus: findFixtureTask?.status,\r\n      });\r\n    }\r\n  }\r\n\r\n  processVmFeedback(storeFeedback: any[]) {\r\n    const fixtureFeedback = storeFeedback.filter(\r\n      (feedback) => feedback.type === \"vm\",\r\n    );\r\n\r\n    if (fixtureFeedback.length) {\r\n      for (let i = 0; i < fixtureFeedback.length; i++) {\r\n        const issues = fixtureFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n        if (issues?.length) {\r\n          for (let j = 0; j < issues.length; j++) {\r\n            const issue = issues[j];\r\n\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"vm\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"vm\",\r\n                };\r\n              }\r\n            }\r\n          }\r\n          // }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  transferArrayItem<T = any>(\r\n    currentArray: T[],\r\n    targetArray: T[],\r\n    currentIndex: number,\r\n    targetIndex: number,\r\n  ): void {\r\n    const from = Math.max(0, Math.min(currentArray.length - 1, currentIndex));\r\n    const to = Math.max(0, Math.min(targetArray.length, targetIndex));\r\n\r\n    if (currentArray.length) {\r\n      targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);\r\n    }\r\n  }\r\n\r\n  reorderFixture(floorData: any) {\r\n    // Walls\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\") {\r\n        let wallAssociatedIndex = 1;\r\n\r\n        element.fixtures.forEach((fixture: any) => {\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = element.elementNumber;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            // fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    // Center floor fixtures\r\n    let floorAssociatedIndex = 1;\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        // fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  getElementValue(group: any) {\r\n    return group.get(\"elementNumber\")?.value;\r\n  }\r\n\r\n  private getWallByNumber(elementNumber: number): any | undefined {\r\n    return this.floorData?.layoutPolygon?.find(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === elementNumber,\r\n    );\r\n  }\r\n\r\n  roundToTwo(num: number) {\r\n    return Math.round(num * 100) / 100;\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string, enable: boolean = true) {\r\n    this.removeHighlight();\r\n    this.isPageLoading = true;\r\n    if (!this.fixtureTemplates.length) {\r\n      await this.getFixtureTemplates();\r\n    }\r\n    this.selectedFixture = null;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId], treeView: true })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          if (this.floorData?._id) {\r\n            this.floorData = structuredClone(\r\n              res.data[0].floors.find(\r\n                (floor: any) => floor?._id === this.floorData?._id,\r\n              ),\r\n            );\r\n          } else {\r\n            this.floorData = structuredClone(res.data[0].floors[0]);\r\n          }\r\n\r\n          if ([\"draft\", \"allocationPending\"].includes(this.floorData.status)) {\r\n            this.router.navigateByUrl(\r\n              `manage/planogram/onboard-planogram?planoId=${this.floorData.planoId}&floorId=${this.floorData._id}`,\r\n            );\r\n          }\r\n\r\n          this.floorsList = this.planoData.floors.map((f: any) => ({\r\n            label: f.floorNum,\r\n            value: f._id,\r\n            // disabled: f.status === \"completed\",\r\n          }));\r\n\r\n          this.extractAllFixtures(this.floorData);\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n\r\n          this.storeMetrics.floorCount = this.planoData?.floors?.length;\r\n\r\n          this.disableEdit = false;\r\n          try {\r\n            await Promise.all([\r\n              this.taskDetails(this.floorData.planoId, this.floorData._id),\r\n              this.getStoreFeedback(\r\n                this.floorData.planoId,\r\n                this.floorData._id,\r\n                {},\r\n              ),\r\n              this.getZoneVerificationFeedback(\r\n                this.floorData.planoId,\r\n                this.floorData._id,\r\n              ),\r\n            ]);\r\n          } catch {}\r\n\r\n          this.renderFloor();\r\n\r\n          this.isPageLoading = false;\r\n          if (enable) {\r\n            this.layoutForm?.disable({ emitEvent: false });\r\n          }\r\n          // this.cd.detectChanges();\r\n        },\r\n        error: (err: any) => {\r\n          this.isPageLoading = false;\r\n          this.toastService.getErrorToast(\"Failed to fetch plano\");\r\n        },\r\n      });\r\n  }\r\n\r\n  extractAllFixtures(floorData: any) {\r\n    const extractedFixture = [\r\n      ...(floorData?.masterTemplates ?? []),\r\n      ...(floorData?.centerFixture ?? []),\r\n    ];\r\n\r\n    floorData?.layoutPolygon?.forEach((lp: any) => {\r\n      this.wallCount += lp.fixtures.length;\r\n      this.clCount += lp.fixtures.filter(\r\n        (ele: any) => ele.header.label == \"CL\",\r\n      )?.length;\r\n      extractedFixture.push(...(lp.fixtures ?? []));\r\n    });\r\n\r\n    this.allFixtures = extractedFixture;\r\n\r\n    this.allFixtureInstances = [\r\n      ...this.floorData!.layoutPolygon.flatMap((e: any) => e?.fixtures ?? []),\r\n      ...(this.floorData?.centerFixture ?? []),\r\n    ];\r\n  }\r\n\r\n  async renderFloor(update: boolean = true) {\r\n    this.storeMetrics.fixtureCount = this.floorData.fixtureCount;\r\n    this.storeMetrics.vmCount = this.floorData.vmCount;\r\n    this.drawInitialContent();\r\n    if (update) {\r\n      this.createForm();\r\n\r\n      this.floorData.layoutPolygon.forEach((wall: any) => {\r\n        if (wall.elementType === \"wall\") {\r\n          const wallItem = this.patchWallElements({\r\n            elementType: wall.elementType,\r\n            elementNumber: wall.elementNumber,\r\n          });\r\n\r\n          wall.fixtures.forEach((fixture: any) => {\r\n            if (fixture?.fixtureName === \"space\") return;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: fixture.fixtureName,\r\n              fixtureConfigId: fixture.fixtureConfigId,\r\n              _id: fixture._id,\r\n            });\r\n            (wallItem.get(\"fixtures\") as FormArray).push(fixtureGroup);\r\n          });\r\n\r\n          wall.otherElements?.forEach((ele: any) => {\r\n            const eleGroup = this.fb.group({\r\n              type: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? ele.fixtureName\r\n                  : \"Others\",\r\n              ],\r\n              customName: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? \"\"\r\n                  : ele.fixtureName,\r\n              ],\r\n            });\r\n            (wallItem.get(\"otherElements\") as FormArray).push(eleGroup);\r\n          });\r\n\r\n          this.getFormWalls.push(wallItem);\r\n        }\r\n      });\r\n\r\n      if (this.floorData?.centerFixture?.length) {\r\n        this.floorData?.centerFixture.forEach((fixture: any) => {\r\n          const fixtureGroup = this.patchFixture({\r\n            fixtureName: fixture.fixtureName,\r\n            fixtureConfigId: fixture.fixtureConfigId,\r\n            _id: fixture._id,\r\n          });\r\n          (this.layoutForm.get(\"floorFixtures\") as FormArray).push(\r\n            fixtureGroup,\r\n          );\r\n        });\r\n      }\r\n\r\n      if (this.floorData?.otherElements?.length) {\r\n        this.floorData?.otherElements?.forEach((ele: any) => {\r\n          const eleGroup = this.fb.group({\r\n            type: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? ele.fixtureName\r\n                : \"Others\",\r\n            ],\r\n            customName: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? \"\"\r\n                : ele.fixtureName,\r\n            ],\r\n          });\r\n\r\n          (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n            eleGroup,\r\n          );\r\n        });\r\n      }\r\n    }\r\n\r\n    this.subscribeToFixtureConfigIdChanges();\r\n    this.subscribeToOtherElementsChanges();\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    this.canvas.clear();\r\n    this.reorderFixture(this.floorData);\r\n    await this.drawLayoutElements();\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.updateAllPositions();\r\n\r\n    if (\r\n      this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId &&\r\n      !this.isRightPanelCollapsed &&\r\n      this.activeHighlight\r\n    ) {\r\n      this.canvas.add(this.activeHighlight);\r\n      this.keepHighlightOnTop();\r\n    }\r\n    // this.drawBg();\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  // Bounding box of just the wall + entrance objects — the store perimeter.\r\n  // Used as the fit target so stray fixtures placed outside the layout (common\r\n  // on CAD imports, where a fixture's relativePosition can be unset/garbage)\r\n  // can't inflate the frame. Returns zero-size when there is no wall/entrance\r\n  // on the canvas so callers can fall back to full bounds.\r\n  private getWallPerimeterBounds() {\r\n    const objects = this.canvas\r\n      .getObjects()\r\n      .filter((o: any) => o?.objType === \"wall\" || o?.objType === \"entrance\");\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    if (this.layoutForm.enabled) return;\r\n\r\n    // Fit to the wall/entrance perimeter (the true store extent) rather than the\r\n    // union of every object. On CAD-imported stores a few fixtures can land far\r\n    // outside the layout, and using the full bounds would blow up the frame and\r\n    // collapse the zoom to near-zero, leaving the layout invisibly small. Fall\r\n    // back to full bounds only when there is no wall/entrance to anchor on.\r\n    const perimeter = this.getWallPerimeterBounds();\r\n    const bounds =\r\n      perimeter.width && perimeter.height\r\n        ? perimeter\r\n        : this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    // Clamp to the same bounds the manual wheel-zoom uses so a degenerate or\r\n    // oversized layout can never shrink the view to an invisible speck.\r\n    const targetZoom = Math.max(\r\n      0.05,\r\n      Math.min(Math.min(scaleX, scaleY) * 0.9, 5),\r\n    ); // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom; // center Y\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        let width = this.toPixels(element.distance, element.unit);\r\n        if (width < height) width = this.wallThickness + 1;\r\n        await this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n    }\r\n\r\n    // For cad layouts only.\r\n    this.layoutBounds = this.getFullLayoutBounds();\r\n\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n      if (element.elementType !== \"wall\") continue;\r\n\r\n      const fixtureGroups: fabric.Group[] = [];\r\n\r\n      for (let j = 0; j < element?.fixtures?.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        const fixtureHeight = this.toPixels(\r\n          fixture.fixtureStaticLength.value,\r\n          fixture.fixtureStaticLength.unit,\r\n        );\r\n        const fixtureWidth = this.toPixels(\r\n          fixture.fixtureStaticWidth.value,\r\n          fixture.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        let x = this.toPixels(\r\n          fixture.relativePosition.x,\r\n          fixture.relativePosition.unit,\r\n        );\r\n        let y = this.toPixels(\r\n          fixture.relativePosition.y,\r\n          fixture.relativePosition.unit,\r\n        );\r\n\r\n        // override the fixture position for initial cad layouts.\r\n        if (this.floorData?.cadLayout) {\r\n          const baseX = this.toPixels(\r\n            element.relativePosition.x,\r\n            element.relativePosition.unit,\r\n          );\r\n\r\n          const baseY = this.toPixels(\r\n            element.relativePosition.y,\r\n            element.relativePosition.unit,\r\n          );\r\n          const startBuffer = 40;\r\n          const spacing = 136;\r\n          const offset = startBuffer + spacing * j;\r\n\r\n          const angleRad = fabric.util.degreesToRadians(element.angle);\r\n\r\n          const dirX = Math.cos(angleRad);\r\n          const dirY = Math.sin(angleRad);\r\n\r\n          const normalOffset = this.wallThickness;\r\n\r\n          const normX = Math.cos(angleRad + Math.PI / 2) * normalOffset;\r\n          const normY = Math.sin(angleRad + Math.PI / 2) * normalOffset;\r\n\r\n          x = baseX + dirX * offset + normX;\r\n          y = baseY + dirY * offset + normY;\r\n        }\r\n\r\n        const fixtureObj = await this.drawFixture(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          fixtureHeight,\r\n          fixtureWidth,\r\n          fixture,\r\n        );\r\n        fixtureGroups.push(fixtureObj as fabric.Group);\r\n      }\r\n\r\n      for (let j = 0; j < element?.otherElements?.length; j++) {\r\n        const otherElement = element.otherElements[j];\r\n        const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n        const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n        const a = otherElement.relativePosition.angle;\r\n        const h = this.toPixels(\r\n          otherElement.fixtureStaticLength.value,\r\n          otherElement.fixtureStaticLength.unit,\r\n        );\r\n        const w = this.toPixels(\r\n          otherElement.fixtureStaticWidth.value,\r\n          otherElement.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        this.drawOtherElementsWithLabel(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          a,\r\n          w,\r\n          h,\r\n          otherElement,\r\n        );\r\n      }\r\n    }\r\n\r\n    if (this.floorData?.cadLayout && this.floorData?.centerFixture?.length) {\r\n      const fixtures = this.floorData.centerFixture;\r\n\r\n      // Layout polygon (your existing method)\r\n      const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n\r\n      // Occupied areas (ALL objects)\r\n      const occupiedRects = this.getOccupiedRects();\r\n\r\n      // Fixture size\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtures[0].fixtureStaticWidth.value,\r\n        fixtures[0].fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtures[0].fixtureStaticLength.value,\r\n        fixtures[0].fixtureStaticLength.unit,\r\n      );\r\n\r\n      // Grid shape (wide bias if you want)\r\n      const total = fixtures.length;\r\n      const maxRows = 2; // you can tweak\r\n      const rows = Math.min(maxRows, total);\r\n      const columns = Math.ceil(total / rows);\r\n\r\n      const gridWidth = columns * fixtureWidthPx;\r\n      const gridHeight = rows * fixtureHeightPx;\r\n\r\n      // Layout bounds\r\n      const bounds = this.getFullLayoutBounds();\r\n      const centerX = bounds.left + bounds.width / 2;\r\n      const centerY = bounds.top + bounds.height / 2;\r\n\r\n      // Check if grid fits\r\n      const gridFits = (x: number, y: number) => {\r\n        const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n        // Inside polygon\r\n        if (\r\n          !this.isPointInsidePolygon({ x, y }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon({ x: x + gridWidth, y }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon({ x, y: y + gridHeight }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon(\r\n            { x: x + gridWidth, y: y + gridHeight },\r\n            layoutPolygon,\r\n          )\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n        // No overlap\r\n        for (const occ of occupiedRects) {\r\n          if (this.rectsOverlap(gridRect, occ)) {\r\n            return false;\r\n          }\r\n        }\r\n\r\n        return true;\r\n      };\r\n\r\n      let bestScore = -Infinity;\r\n      let bestPos: { x: number; y: number } | null = null;\r\n\r\n      const step = fixtureWidthPx / 2;\r\n\r\n      for (\r\n        let y = bounds.top;\r\n        y <= bounds.top + bounds.height - gridHeight;\r\n        y += step\r\n      ) {\r\n        for (\r\n          let x = bounds.left;\r\n          x <= bounds.left + bounds.width - gridWidth;\r\n          x += step\r\n        ) {\r\n          if (!gridFits(x, y)) continue;\r\n\r\n          const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n          const emptyMargin = this.computeEmptyMargin(\r\n            gridRect,\r\n            bounds,\r\n            occupiedRects,\r\n          );\r\n\r\n          const dx = centerX - (x + gridWidth / 2);\r\n          const dy = centerY - (y + gridHeight / 2);\r\n          const centerPenalty = dx * dx + dy * dy;\r\n\r\n          // Biggest empty space wins, center is a soft stabilizer\r\n          const score = emptyMargin * 1000 - centerPenalty * 0.001;\r\n\r\n          if (score > bestScore) {\r\n            bestScore = score;\r\n            bestPos = { x, y };\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!bestPos) {\r\n        console.warn(\"No valid center-fixture placement found\");\r\n        return;\r\n      }\r\n\r\n      // Assign positions\r\n      fixtures.forEach((fixture: any, index: number) => {\r\n        const row = Math.floor(index / columns);\r\n        const col = index % columns;\r\n\r\n        const x = bestPos!.x + col * fixtureWidthPx;\r\n        const y = bestPos!.y + row * fixtureHeightPx;\r\n\r\n        fixture.relativePosition.x = this.fromPixels(x, \"ft\");\r\n        fixture.relativePosition.y = this.fromPixels(y, \"ft\");\r\n      });\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawOtherElementsWithLabel(this.canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private isPointInsidePolygon(\r\n    point: { x: number; y: number },\r\n    polygon: { x: number; y: number }[],\r\n  ): boolean {\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x,\r\n        yi = polygon[i].y;\r\n      const xj = polygon[j].x,\r\n        yj = polygon[j].y;\r\n\r\n      const intersect =\r\n        yi > point.y !== yj > point.y &&\r\n        point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n  private getOccupiedRects(): { x: number; y: number; w: number; h: number }[] {\r\n    return this.canvas.getObjects().map((obj) => {\r\n      const r = obj.getBoundingRect();\r\n      return {\r\n        x: r.left,\r\n        y: r.top,\r\n        w: r.width,\r\n        h: r.height,\r\n      };\r\n    });\r\n  }\r\n\r\n  private rectsOverlap(\r\n    a: { x: number; y: number; w: number; h: number },\r\n    b: { x: number; y: number; w: number; h: number },\r\n  ): boolean {\r\n    return !(\r\n      a.x + a.w <= b.x ||\r\n      a.x >= b.x + b.w ||\r\n      a.y + a.h <= b.y ||\r\n      a.y >= b.y + b.h\r\n    );\r\n  }\r\n\r\n  private computeEmptyMargin(\r\n    gridRect: { x: number; y: number; w: number; h: number },\r\n    bounds: { left: number; top: number; width: number; height: number },\r\n    occupiedRects: { x: number; y: number; w: number; h: number }[],\r\n  ): number {\r\n    let minMargin = Infinity;\r\n\r\n    // distance to layout bounds\r\n    minMargin = Math.min(\r\n      minMargin,\r\n      gridRect.x - bounds.left,\r\n      bounds.left + bounds.width - (gridRect.x + gridRect.w),\r\n      gridRect.y - bounds.top,\r\n      bounds.top + bounds.height - (gridRect.y + gridRect.h),\r\n    );\r\n\r\n    // distance to other objects\r\n    for (const occ of occupiedRects) {\r\n      // horizontal gap\r\n      if (occ.y < gridRect.y + gridRect.h && occ.y + occ.h > gridRect.y) {\r\n        if (occ.x + occ.w <= gridRect.x) {\r\n          minMargin = Math.min(minMargin, gridRect.x - (occ.x + occ.w));\r\n        } else if (occ.x >= gridRect.x + gridRect.w) {\r\n          minMargin = Math.min(minMargin, occ.x - (gridRect.x + gridRect.w));\r\n        }\r\n      }\r\n\r\n      // vertical gap\r\n      if (occ.x < gridRect.x + gridRect.w && occ.x + occ.w > gridRect.x) {\r\n        if (occ.y + occ.h <= gridRect.y) {\r\n          minMargin = Math.min(minMargin, gridRect.y - (occ.y + occ.h));\r\n        } else if (occ.y >= gridRect.y + gridRect.h) {\r\n          minMargin = Math.min(minMargin, occ.y - (gridRect.y + gridRect.h));\r\n        }\r\n      }\r\n    }\r\n\r\n    return minMargin;\r\n  }\r\n\r\n  drawFixtureRowLabel(text: string, x: number, y: number) {\r\n    const label = new fabric.Text(text, {\r\n      left: x,\r\n      top: y,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#333\",\r\n      originX: \"left\",\r\n      originY: \"bottom\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(label);\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const lockSvgString = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <path d=\"M7 11V7C7 5.67392 7.52678 4.40215 8.46447 3.46447C9.40215 2.52678 10.6739 2 12 2C13.3261 2 14.5979 2.52678 15.5355 3.46447C16.4732 4.40215 17 5.67392 17 7V11M5 11H19C20.1046 11 21 11.8954 21 13V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V13C3 11.8954 3.89543 11 5 11Z\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(lockSvgString);\r\n\r\n    let lockSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    const wallCenterX = width / 2;\r\n    const wallCenterY = height / 2;\r\n\r\n    lockSvg.scaleToWidth(20);\r\n    lockSvg.scaleToHeight(20);\r\n\r\n    if (isVertical) {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: -90,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    } else {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: 0,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    }\r\n\r\n    lockSvg.set({\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    lockSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n      elementData.isLocked = !elementData?.isLocked;\r\n      this.renderFloor(false);\r\n    });\r\n\r\n    elements.push(lockSvg);\r\n\r\n    let modCenterX = x;\r\n    let modCenterY = y;\r\n    let angle = elementData.angle;\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: modCenterX,\r\n      top: modCenterY,\r\n      hasControls: true,\r\n      lockScalingX: isVertical,\r\n      lockScalingY: !isVertical,\r\n      selectable: this.layoutForm.enabled,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n    if ([\"fixture\", \"fixture-redo\"].includes(this.publishingState)) {\r\n      fixtureColor = {\r\n        primary:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#a5a6a8\"\r\n            : fixtureData.status == \"agree\"\r\n              ? \"#6CE9A6\"\r\n              : \"#51C1FF\",\r\n        fill:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#f3f4f8\"\r\n            : fixtureData.status == \"agree\"\r\n              ? \"#6CE9A6\"\r\n              : \"#EAF8FF\",\r\n        vmFill:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#a5a6a8\"\r\n            : \"#6938EF\",\r\n      };\r\n    }\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n\r\n    // Resolve the angle the fixture group will render at. For first-render of a\r\n    // CAD-uploaded layout, the wall angle is the source of truth (otherwise we\r\n    // honor the fixture's own saved angle). When that angle lies in the\r\n    // upside-down range (90°, 270°), we flip the fixture body 180° in place so\r\n    // it renders canonical (header at top, storage at bottom). Trade-off: on\r\n    // flipped walls the storage box ends up visually touching the wall instead\r\n    // of the header. Mirrors the same logic in onboard-store-plano.\r\n    let angle = fixtureData?.relativePosition?.angle ?? 0;\r\n    if (this.floorData.cadLayout && fixtureData.fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(\r\n        fixtureData.associatedElementNumber,\r\n      );\r\n      angle = wallData?.angle ?? 0;\r\n    }\r\n    const normAngle = ((((angle as number) % 360) + 360) % 360);\r\n    const shouldFlipBody =\r\n      this.floorData.cadLayout &&\r\n      fixtureData.fixtureType === \"wall\" &&\r\n      normAngle > 90 &&\r\n      normAngle < 270;\r\n\r\n    // To rotate the body 180° while keeping the same on-canvas region, shift\r\n    // the anchor by R(originalAngle)·(width, height) — the canvas position of\r\n    // the un-rotated bbox's bottom-right corner relative to the anchor — and\r\n    // add 180° to the rotation. fabric still pivots around top-left.\r\n    let renderX = x;\r\n    let renderY = y;\r\n    let renderAngle = angle as number;\r\n    if (shouldFlipBody) {\r\n      const rad = ((angle as number) * Math.PI) / 180;\r\n      const cosA = Math.cos(rad);\r\n      const sinA = Math.sin(rad);\r\n      renderX = x + cosA * width - sinA * height;\r\n      renderY = y + sinA * width + cosA * height;\r\n      renderAngle = (angle as number) + 180;\r\n    }\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topFieldText =\r\n      (fixtureData.fixtureType === \"wall\"\r\n        ? `Wall-${fixtureData.associatedElementNumber} - `\r\n        : \"Floor - \") +\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`;\r\n\r\n    const topText = new fabric.Textbox(topFieldText, {\r\n      left: topX + topWidth / 2,\r\n      top: topY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const finalFontSize = fontSize + 0.5;\r\n          const measureText = (str: string) => {\r\n            const t = new fabric.Text(str, {\r\n              fontSize: finalFontSize,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n            });\r\n            return t.width ?? 0;\r\n          };\r\n\r\n          if (measureText(text) > maxTextWidth) {\r\n            let truncated = text;\r\n            while (truncated.length > 1 && measureText(truncated + '...') > maxTextWidth) {\r\n              truncated = truncated.slice(0, -1);\r\n            }\r\n            const truncatedWidth = measureText(truncated + '...');\r\n            wrappedText = createTextbox(finalFontSize);\r\n            wrappedText.set({ text: truncated + '...', width: truncatedWidth });\r\n            wrappedText.initDimensions();\r\n          }\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const shelfCount = fixtureData?.shelfConfig?.length ?? 0;\r\n        let startPos = vm?.startYPosition;\r\n        let endPos = vm?.endYPosition;\r\n\r\n        if (!startPos && !endPos) {\r\n          if (vm?.xZone === \"stretch\" && vm?.yZone === \"stretch\") {\r\n            startPos = shelfCount;\r\n            endPos = shelfCount;\r\n          } else {\r\n            startPos = 1;\r\n            endPos = shelfCount;\r\n          }\r\n        }\r\n\r\n        const startIndex = startPos - 1;\r\n        const endIndex = endPos - 1;\r\n\r\n        if (startIndex > shelfCount || endIndex > shelfCount) continue;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${\r\n        getFixtureProductCapacity(fixtureData?.shelfConfig)\r\n      } . VM - ${fixtureData?.vmConfig?.length ?? 0}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const svgString = `\r\n      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"white\"/>\r\n      <path d=\"M14.9998 6.60001C15.1574 6.44243 15.3445 6.31742 15.5504 6.23214C15.7563 6.14685 15.977 6.10296 16.1998 6.10296C16.4227 6.10296 16.6434 6.14685 16.8492 6.23214C17.0551 6.31742 17.2422 6.44243 17.3998 6.60001C17.5574 6.7576 17.6824 6.94468 17.7677 7.15058C17.853 7.35648 17.8969 7.57715 17.8969 7.80001C17.8969 8.02288 17.853 8.24355 17.7677 8.44945C17.6824 8.65535 17.5574 8.84243 17.3998 9.00001L9.29982 17.1L5.99982 18L6.89982 14.7L14.9998 6.60001Z\" stroke=\"#1D2939\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(svgString);\r\n\r\n    let editSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    editSvg.set({\r\n      scaleX: 1,\r\n      scaleY: 1,\r\n      left: x + width - 30,\r\n      top: y + 14,\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true, // allow events\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    editSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n\r\n      if (this.hasUnsavedLayoutChanges()) {\r\n        this.toastService.getErrorToast(\r\n          \"Save your layout changes before editing the fixture\",\r\n        );\r\n        return;\r\n      }\r\n\r\n      this.selectedFixture = {\r\n        fixtureType: fixtureData.fixtureType,\r\n        wallIndex: fixtureData.associatedElementNumber,\r\n        fixtureIndex: fixtureData.associatedElementFixtureNumber,\r\n        fixtureId: fixtureData._id,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      }\r\n      delete this?.selectedFixtureData?.taskType;\r\n      this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      this.editFixture = true;\r\n    });\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n        editSvg,\r\n      ],\r\n      {\r\n        left: renderX,\r\n        top: renderY,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: this.layoutForm.enabled,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        angle: renderAngle,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    if (\r\n      !fixtureData?.issue &&\r\n      !fixtureData?.unsavedChanges &&\r\n      this.layoutForm.enabled\r\n    ) {\r\n      fixtureGroup.on(\"mouseover\", function () {\r\n        editSvg.set(\"visible\", true);\r\n        canvas.renderAll();\r\n      });\r\n      fixtureGroup.on(\"mouseout\", function () {\r\n        editSvg.set(\"visible\", false);\r\n        canvas.renderAll();\r\n      });\r\n    }\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      if (this.layoutForm.disabled) {\r\n        this.togglePanel(\"right\", false);\r\n      } else {\r\n        this.highlightFixtureInAccordion(fixtureData);\r\n      }\r\n\r\n      this.highlightFixture(target);\r\n      this.selectFixtureOnCanvasClick(target, true);\r\n      this.selectedFixture.fixtureData = fixtureData;\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    // this.canvas.on(\"object:moving\", (e) => {\r\n    //   const target = e.target as any;\r\n    //   if (!target || target.objType !== \"fixture\") return;\r\n\r\n    //   const angleDeg = target.angle || 0;\r\n    //   const angle = (angleDeg * Math.PI) / 180;\r\n    //   if (!target._lastLeft) {\r\n    //     target._lastLeft = target.left;\r\n    //     target._lastTop = target.top;\r\n    //   }\r\n    //   const dx = target.left - target._lastLeft;\r\n    //   const dy = target.top - target._lastTop;\r\n    //   const projected = dx * Math.cos(angle) + dy * Math.sin(angle);\r\n    //   target.left = target._lastLeft + projected * Math.cos(angle);\r\n    //   target.top = target._lastTop + projected * Math.sin(angle);\r\n    //   target._lastLeft = target.left;\r\n    //   target._lastTop = target.top;\r\n    // });\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(fixtureGroup);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n    const angle = this.floorData?.cadLayout ? 0 : elementData.angle;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: this.layoutForm.enabled,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      selectable: this.layoutForm.enabled,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  // getFixtureMetaToRender(fixture: any, wallData: any) {\r\n\r\n  //   return {\r\n  //     x,\r\n  //     y,\r\n  //     fixtureHeight,\r\n  //     fixtureWidth,\r\n  //   };\r\n  // }\r\n\r\n  subscribeToFixtureConfigIdChanges() {\r\n    this.fixtureConfigSubscriptions.forEach((sub) => sub.unsubscribe());\r\n    this.fixtureConfigSubscriptions = [];\r\n\r\n    this.getFormWalls.controls.forEach((control, i) => {\r\n      const wallGroup = control as FormGroup;\r\n      const fixturesArray = wallGroup.get(\"fixtures\") as FormArray;\r\n\r\n      fixturesArray.controls.forEach((fixtureControl, j) => {\r\n        const fixtureGroup = fixtureControl as FormGroup;\r\n        const sub = fixtureGroup\r\n          .get(\"fixtureConfigId\")\r\n          ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n          .subscribe((newValue) => {\r\n            this.changeFixtureTemplate(newValue, \"wall\", j, i);\r\n          });\r\n\r\n        if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n      });\r\n    });\r\n\r\n    this.getFormFloorFixtures.controls.forEach((fixtureControl, k) => {\r\n      const fixtureGroup = fixtureControl as FormGroup;\r\n      const sub = fixtureGroup\r\n        .get(\"fixtureConfigId\")\r\n        ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n        .subscribe((newValue) => {\r\n          this.changeFixtureTemplate(newValue, \"floor\", k);\r\n        });\r\n\r\n      if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n    });\r\n  }\r\n\r\n  subscribeToOtherElementsChanges() {\r\n    this.otherElementsSubscriptions.forEach((sub) => sub?.unsubscribe());\r\n    this.otherElementsSubscriptions = [];\r\n\r\n    // Wall-level otherElements label subscriptions\r\n    this.getFormWalls.controls.forEach((control) => {\r\n      const wallGroup = control as FormGroup;\r\n      const otherArray = wallGroup.get(\"otherElements\") as FormArray;\r\n\r\n      otherArray.controls.forEach((ctrl, otherIdx) => {\r\n        const elementGroup = ctrl as FormGroup;\r\n        const typeControl = elementGroup.get(\"type\") as FormControl;\r\n        const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n\r\n        const wallMeta = this.floorData.layoutPolygon.find(\r\n          (el: any) =>\r\n            el.elementType === wallGroup.get(\"elementType\")?.value &&\r\n            el.elementNumber === wallGroup.get(\"elementNumber\")?.value,\r\n        );\r\n        const elementRef = wallMeta?.otherElements?.[otherIdx];\r\n        if (!elementRef) return;\r\n\r\n        // when type changes (dropdown)\r\n        const subType = typeControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((selected: string) => {\r\n            // if user picks \"Others\", prefer customName if present, otherwise set fixtureName to \"Others\"\r\n            elementRef.fixtureName =\r\n              selected === \"Others\"\r\n                ? customNameControl?.value || \"Others\"\r\n                : selected;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          });\r\n\r\n        // when customName changes (text input visible only when type === 'Others')\r\n        const subCustom = customNameControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((custom: string) => {\r\n            if (typeControl.value === \"Others\") {\r\n              elementRef.fixtureName = custom;\r\n              this.updateCanvasOtherElementLabel(elementRef);\r\n            }\r\n          });\r\n\r\n        this.otherElementsSubscriptions.push(subType, subCustom);\r\n      });\r\n    });\r\n\r\n    // Floor-level otherElements label subscriptions\r\n    this.getFormFloorOtherElements.controls.forEach((ctrl, idx) => {\r\n      const elementGroup = ctrl as FormGroup;\r\n      const typeControl = elementGroup.get(\"type\") as FormControl;\r\n      const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n      const elementRef = this.floorData?.otherElements?.[idx];\r\n      if (!elementRef) return;\r\n\r\n      const subType = typeControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((selected: string) => {\r\n          elementRef.fixtureName =\r\n            selected === \"Others\"\r\n              ? customNameControl?.value || \"Others\"\r\n              : selected;\r\n          this.updateCanvasOtherElementLabel(elementRef);\r\n        });\r\n\r\n      const subCustom = customNameControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((custom: string) => {\r\n          if (typeControl.value === \"Others\") {\r\n            elementRef.fixtureName = custom;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          }\r\n        });\r\n\r\n      this.otherElementsSubscriptions.push(subType, subCustom);\r\n    });\r\n  }\r\n\r\n  updateCanvasOtherElementLabel(elementRef: any) {\r\n    if (!this.canvas) return;\r\n    const group = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj?.objType === \"others\" && obj?.data._id === elementRef._id,\r\n      ) as any;\r\n\r\n    if (!group) return;\r\n    group.data = elementRef;\r\n\r\n    const textObj = (group.getObjects() || []).find(\r\n      (o: any) => o?.type === \"text\" || o?.type === \"textbox\",\r\n    ) as fabric.Text | fabric.Textbox | undefined;\r\n\r\n    if (textObj) {\r\n      (textObj as any).set({ text: elementRef.fixtureName });\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  selectFixtureOnCanvasClick(target: any, collapseTaskInfo: boolean = false) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        vmConfig: target.vmConfig,\r\n      };\r\n\r\n      this.selectFixtureFeedback(\r\n        this.selectedFixture.fixtureId,\r\n        collapseTaskInfo,\r\n      );\r\n    }\r\n  }\r\n\r\n  selectFixtureFeedback(fixtureId: string, collapseTaskInfo: boolean = false) {\r\n    const currentFixtureFeedback = this.storeFeedback.fixtureData.find(\r\n      (fb: any) => fb.fixtureId === fixtureId,\r\n    );\r\n\r\n    const rawFixture = structuredClone(\r\n      this.allFixtureInstances.find((fi: any) => fi._id === fixtureId),\r\n    );\r\n\r\n    if (currentFixtureFeedback) {\r\n      this.selectedFixtureFeedback = {\r\n        globalComments: this.storeFeedback.fixtureComment,\r\n        fixtureFeedback: {\r\n          ...currentFixtureFeedback,\r\n          FixtureData: rawFixture,\r\n        },\r\n        taskInfoToggle: collapseTaskInfo,\r\n      };\r\n    } else {\r\n      this.selectedFixtureFeedback = {\r\n        globalComments: [],\r\n        fixtureFeedback: {\r\n          fixtureId: fixtureId,\r\n          FixtureData: rawFixture,\r\n          fixtureAIData: null,\r\n        },\r\n        taskInfoToggle: collapseTaskInfo,\r\n      };\r\n    }\r\n\r\n    this.selectZoneFeedback(fixtureId);\r\n  }\r\n\r\n  async getFixtureTemplates(): Promise<void> {\r\n    const payload = {\r\n      clientId: this.clientId,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getAllTemplates(payload),\r\n      );\r\n      const data = res?.data;\r\n\r\n      if (data) {\r\n        this.fixtureTemplates = data.map((t: any) => {\r\n          return {\r\n            _id: t._id,\r\n            name: t.fixtureName.includes(\"-ft\")\r\n              ? t.fixtureName\r\n              : `${t.fixtureName} - ${t.fixtureWidth.value} ${t.fixtureWidth.unit}`,\r\n            subtext: `${t.productBrandName?.join(\", \")}`,\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Error fetching fixture templates:\", error);\r\n    }\r\n  }\r\n\r\n  createForm() {\r\n    this.layoutForm = this.fb.group({\r\n      walls: this.fb.array([]),\r\n      floorFixtures: this.fb.array([]),\r\n      floorOtherElements: this.fb.array([]),\r\n    });\r\n  }\r\n\r\n  get getFormWalls() {\r\n    return this.layoutForm.get(\"walls\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorFixtures() {\r\n    return this.layoutForm.get(\"floorFixtures\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorOtherElements() {\r\n    return this.layoutForm.get(\"floorOtherElements\") as FormArray;\r\n  }\r\n\r\n  get getEntrances() {\r\n    return this.floorData?.layoutPolygon?.filter(\r\n      (ele: any) => ele.elementType === \"entrance\",\r\n    );\r\n  }\r\n\r\n  get showFixturePreview() {\r\n    return (\r\n      this.publishingState === \"fixture\" &&\r\n      !this.disabledPublish &&\r\n      !this.editFixture\r\n    );\r\n  }\r\n\r\n  getWallOtherElements(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"otherElements\") as FormArray;\r\n  }\r\n\r\n  getFormFixtures(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"fixtures\") as FormArray;\r\n  }\r\n\r\n  patchWallElements({ elementType, elementNumber }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      elementType: [elementType ? elementType : \"\", [Validators.required]],\r\n      elementNumber: [elementNumber ? elementNumber : 0, [Validators.required]],\r\n      fixtures: this.fb.array([]),\r\n      otherElements: this.fb.array([]),\r\n    });\r\n    return item;\r\n  }\r\n\r\n  patchFixture({ fixtureName, fixtureConfigId, _id }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      fixtureName: [fixtureName ? fixtureName : \"\", [Validators.required]],\r\n      fixtureConfigId: [\r\n        fixtureConfigId ? fixtureConfigId : \"\",\r\n        [Validators.required],\r\n      ],\r\n      _id: [_id ? _id : \"\", [Validators.required]],\r\n    });\r\n    return item;\r\n  }\r\n\r\n  addWallSpace(wallIndex: number, operation: \"increment\" | \"decrement\") {\r\n    if (this.layoutForm.disabled) return;\r\n    const clickedWallNumber = wallIndex + 1;\r\n    const mmToFeet = 305;\r\n    const fixtureHeight = 1524 / mmToFeet; // ~5 ft (horizontal increment)\r\n    const fixtureWidth = 1220 / mmToFeet; // ~4 ft (vertical increment)\r\n\r\n    const layout = this.floorData.layoutPolygon;\r\n\r\n    const getWall = (num: number) =>\r\n      layout.find(\r\n        (el: any) => el.elementType === \"wall\" && el.elementNumber === num,\r\n      );\r\n\r\n    const amount = operation === \"increment\" ? 1 : -1;\r\n\r\n    const w1 = getWall(1);\r\n    const w2 = getWall(2);\r\n    const w3 = getWall(3);\r\n    const w4 = getWall(4);\r\n    const w5 = getWall(5);\r\n    const entrance = layout.find((el: any) => el.elementType === \"entrance\");\r\n\r\n    // ----------------------------------------------\r\n    // Horizontal growth  (Wall-1 / Wall-3)\r\n    // ----------------------------------------------\r\n    if (clickedWallNumber === 1 || clickedWallNumber === 3) {\r\n      if (w1) w1.distance += amount * fixtureWidth;\r\n      if (w3) w3.distance += amount * fixtureWidth;\r\n\r\n      if (w2) {\r\n        w2.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.x =\r\n            (fx.relativePosition.x || 0) + amount * fixtureWidth;\r\n        });\r\n      }\r\n    }\r\n\r\n    // ----------------------------------------------\r\n    // Vertical growth  (Wall-2 / Wall-4 / Wall-5)\r\n    // ----------------------------------------------\r\n    if (\r\n      clickedWallNumber === 2 ||\r\n      clickedWallNumber === 4 ||\r\n      clickedWallNumber === 5\r\n    ) {\r\n      if (w2) w2.distance += amount * fixtureHeight;\r\n\r\n      if (w3) {\r\n        w3.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.y =\r\n            (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n        });\r\n      }\r\n\r\n      const entranceY = entrance?.distance || 0;\r\n      const existingW4 = w4?.distance || 0;\r\n      const existingW5 = w5?.distance || 0;\r\n\r\n      // Grow wall-4 if we clicked wall-4 OR wall-2\r\n      if ((clickedWallNumber === 4 || clickedWallNumber === 2) && w4) {\r\n        w4.distance = this.roundToTwo(existingW4 + amount * fixtureHeight);\r\n      }\r\n\r\n      // Grow wall-5 if we clicked wall-5 OR wall-2\r\n      if ((clickedWallNumber === 5 || clickedWallNumber === 2) && w5) {\r\n        w5.distance = this.roundToTwo(existingW5 + amount * fixtureHeight);\r\n\r\n        if (w4) {\r\n          w4.fixtures.forEach((fx: any) => {\r\n            fx.relativePosition.y =\r\n              (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n          });\r\n        }\r\n      }\r\n\r\n      // Prevent overflow: shrink back if total > w2 size\r\n      const totalUsed = entranceY + (w4?.distance || 0) + (w5?.distance || 0);\r\n      if (totalUsed > w2!.distance) {\r\n        if (w5) {\r\n          w5.distance = this.roundToTwo(\r\n            w5.distance - (totalUsed - w2!.distance),\r\n          );\r\n        }\r\n      }\r\n    }\r\n\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  deleteFixture(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      this.getFormFixtures(wallIndex!).removeAt(fixtureIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.fixtures)) {\r\n        wall.fixtures.splice(fixtureIndex, 1);\r\n      }\r\n    } else if (fixtureType === \"floor\") {\r\n      this.getFormFloorFixtures.removeAt(fixtureIndex);\r\n\r\n      if (Array.isArray(this.floorData.centerFixture)) {\r\n        this.floorData.centerFixture.splice(fixtureIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  // Returns true if the layout has pending changes the user must save before\r\n  // they can edit an individual fixture. Set by all layout mutation handlers\r\n  // (add / delete / move / template change), cleared on successful save.\r\n  private hasUnsavedLayoutChanges(): boolean {\r\n    if (this.layoutHasUnsavedChanges) return true;\r\n    const wallFixtures = (this.floorData?.layoutPolygon ?? []).flatMap(\r\n      (el: any) => el?.fixtures ?? [],\r\n    );\r\n    const floorFixtures = this.floorData?.centerFixture ?? [];\r\n    return [...wallFixtures, ...floorFixtures].some(\r\n      (f: any) => f?.unsavedChanges,\r\n    );\r\n  }\r\n\r\n  removeOtherElement(\r\n    elementType: \"wall\" | \"floor\",\r\n    elementIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (elementType === \"wall\") {\r\n      this.getWallOtherElements(wallIndex!).removeAt(elementIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.otherElements)) {\r\n        wall.otherElements.splice(elementIndex, 1);\r\n      }\r\n    } else if (elementType === \"floor\") {\r\n      this.getFormFloorOtherElements.removeAt(elementIndex);\r\n\r\n      if (Array.isArray(this.floorData.otherElements)) {\r\n        this.floorData.otherElements.splice(elementIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n  }\r\n\r\n  changeFixtureTemplate(\r\n    configId: string,\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    this.apiService\r\n      .getFixtureTemplate(configId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (fixtureType === \"wall\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            this.getFormFixtures(wallIndex!).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            const wallRef = this.getWallByNumber(wallIndex! + 1)!;\r\n            wallRef.fixtures[fixtureIndex] = {\r\n              ...wallRef.fixtures[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          } else if (fixtureType === \"floor\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            (this.layoutForm.get(\"floorFixtures\") as FormArray).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            this.floorData.centerFixture[fixtureIndex] = {\r\n              ...this.floorData.centerFixture[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          }\r\n\r\n          this.renderFloor(false);\r\n          this.publishingState = \"layout\";\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to fetch templates\");\r\n        },\r\n      });\r\n  }\r\n\r\n  onDrop(\r\n    event: any,\r\n    destinationWallIndex: number | \"floor\",\r\n    destinationFixtureIndex?: number,\r\n  ) {\r\n    const data = event.data;\r\n\r\n    if (this.layoutForm.disabled) return;\r\n    const isSourceFloor = data.wallIndex === \"floor\";\r\n    const isDestinationFloor = destinationWallIndex === \"floor\";\r\n\r\n    const sourceFormArray: FormArray = isSourceFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(data.wallIndex);\r\n\r\n    const destinationFormArray: FormArray = isDestinationFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(destinationWallIndex as number);\r\n\r\n    const sourceWallMeta = isSourceFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls.at(data.wallIndex).get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const destinationWallMeta = isDestinationFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls\r\n            .at(destinationWallIndex as number)\r\n            .get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const sFixtureIndex = sourceWallMeta.findIndex(\r\n      (fixture: any) =>\r\n        fixture._id ===\r\n        sourceFormArray.at(data.fixtureIndex)?.get(\"_id\")?.value,\r\n    );\r\n\r\n    const dFixtureIndex =\r\n      destinationFixtureIndex !== undefined\r\n        ? destinationWallMeta.findIndex(\r\n            (fixture: any) =>\r\n              fixture._id ===\r\n              destinationFormArray.at(destinationFixtureIndex)?.get(\"_id\")\r\n                ?.value,\r\n          )\r\n        : destinationFormArray.length;\r\n\r\n    const sPosition = {\r\n      fixtureNumber: sourceWallMeta[sFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n    const dPosition = {\r\n      fixtureNumber: destinationWallMeta[dFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n\r\n    if (sourceWallMeta === destinationWallMeta) {\r\n      destinationWallMeta[dFixtureIndex].fixtureNumber =\r\n        sPosition.fixtureNumber;\r\n      destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber =\r\n        sPosition.associatedElementFixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    } else {\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    }\r\n\r\n    this.transferArrayItem(\r\n      sourceFormArray.controls,\r\n      destinationFormArray.controls,\r\n      data.fixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.transferArrayItem(\r\n      sourceWallMeta,\r\n      destinationWallMeta,\r\n      sFixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 2,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  // downloadCanvas() {\r\n  //   if (!this.canvas) return;\r\n\r\n  //   const originalViewport = [\r\n  //     ...this.canvas.viewportTransform!,\r\n  //   ] as fabric.TMat2D;\r\n  //   this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n  //   const bounds = this.getFullLayoutBounds();\r\n\r\n  //   const bg = this.createExportLayoutBackground();\r\n  //   this.canvas.insertAt(0, bg);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const dataURL = this.canvas.toDataURL({\r\n  //     format: \"png\",\r\n  //     left: bounds.left,\r\n  //     top: bounds.top,\r\n  //     width: bounds.width,\r\n  //     height: bounds.height,\r\n  //     multiplier: 2,\r\n  //   });\r\n\r\n  //   this.canvas.remove(bg);\r\n  //   this.canvas.setViewportTransform(originalViewport);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const link = document.createElement(\"a\");\r\n  //   link.href = dataURL;\r\n  //   link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n  //   link.click();\r\n  // }\r\n\r\n  private createExportLayoutBackground() {\r\n    const points = this.buildLayoutPolygonFromWalls();\r\n\r\n    return new fabric.Polygon(points, {\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n      objectCaching: false,\r\n    });\r\n  }\r\n\r\n  private buildLayoutPolygonFromWalls() {\r\n    return this.floorData.layoutPolygon\r\n      .filter((w: any) => w.elementType === \"wall\")\r\n      .map((w: any) => ({\r\n        x: this.toPixels(w.relativePosition.x, \"ft\"),\r\n        y: this.toPixels(w.relativePosition.y, \"ft\"),\r\n      }));\r\n  }\r\n\r\n  async handleFeedbackAction(userAction: any) {\r\n    if (userAction?.taskType === \"zoneVerification\") {\r\n      return this.handleZoneFeedbackAction(userAction);\r\n    }\r\n\r\n    this.editFromTab = \"fixture\";\r\n\r\n    try {\r\n      let targetFixture: any = {\r\n        ...(this.floorData.layoutPolygon\r\n          .flatMap((p: any) => p.fixtures)\r\n          .concat(this.floorData.centerFixture)\r\n          .find((f: any) => f._id === this.selectedFixture.fixtureId) || null),\r\n        userAction: userAction.action,\r\n      };\r\n\r\n      this.selectedFixtureData = { ...targetFixture };\r\n\r\n      // editWithAi / editWithPlano — open the edit panel, no API calls\r\n      if (\r\n        userAction.action === \"editWithAi\" ||\r\n        userAction.action === \"editWithPlano\"\r\n      ) {\r\n        if (userAction.action === \"editWithAi\") {\r\n          targetFixture = this.mergeAiFixtureData(targetFixture, userAction.fixtureData);\r\n        }\r\n\r\n        this.selectedFixtureData = {\r\n          ...targetFixture,\r\n          taskType: \"fixture\",\r\n        };\r\n\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n\r\n        this.editFixture = true;\r\n        setTimeout(() => {\r\n          this.editFixtureSection = userAction?.tab ?? \"basic-details\";\r\n          this.cd.detectChanges();\r\n        }, 100);\r\n\r\n        return;\r\n      }\r\n\r\n      const answerId = userAction.feedback?.answers?.[0]?._id;\r\n      if (!answerId) return;\r\n\r\n      // acceptAi / keepPlano — merge fixture data and save\r\n      if (userAction.action === \"acceptAi\") {\r\n        targetFixture = this.mergeAiFixtureData(targetFixture, userAction.fixtureData);\r\n      }\r\n\r\n      if (userAction.action === \"keepPlano\") {\r\n        const currentLabel = targetFixture.header?.label;\r\n        targetFixture = {\r\n          ...targetFixture,\r\n          ...userAction.fixtureData,\r\n          header: {\r\n            ...targetFixture.header,\r\n            ...userAction.fixtureData?.header,\r\n          },\r\n        };\r\n        if (!targetFixture.header?.label?.trim()) {\r\n          targetFixture.header.label = currentLabel;\r\n        }\r\n      }\r\n\r\n      // Step 1: Update fixture data (skip for redo — only status update needed)\r\n      if (userAction.action !== \"redo\") {\r\n        await firstValueFrom(\r\n          this.apiService.updateStoreFixture({\r\n            fixtureId: this.selectedFixture.fixtureId,\r\n            data: targetFixture,\r\n            taskType: \"fixture\",\r\n          }),\r\n        );\r\n      }\r\n\r\n      // Step 2: Update compliance status\r\n      const feedback = userAction.feedback;\r\n      const payload = {\r\n        _id: feedback._id,\r\n        answerId: answerId,\r\n        type: userAction.type,\r\n        userAction: userAction.action,\r\n        comments: userAction.remarks,\r\n        taskType: userAction.taskType,\r\n        planoId: userAction.planoId,\r\n        floorId: userAction.floorId,\r\n      };\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.updateFixtureComplianceStatus(payload),\r\n      );\r\n\r\n      if (!res && userAction.type != \"agree\") {\r\n        return;\r\n      }\r\n\r\n      // Step 3: Refresh\r\n      this.createForm();\r\n      await this.getStoreFixtures(this.planoData._id);\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\"Failed to execute user action\");\r\n    }\r\n  }\r\n\r\n  private mergeAiFixtureData(targetFixture: any, fixtureData: any): any {\r\n    const currentLabel = targetFixture.header?.label;\r\n\r\n    const merged = {\r\n      ...targetFixture,\r\n      ...fixtureData,\r\n      header: {\r\n        ...targetFixture.header,\r\n        ...fixtureData?.header,\r\n      },\r\n    };\r\n\r\n    const aiLabel = fixtureData?.header?.label?.trim();\r\n    if (!aiLabel || aiLabel.toLowerCase().includes(\"header not identified\")) {\r\n      merged.header.label = currentLabel;\r\n    }\r\n\r\n    return merged;\r\n  }\r\n\r\n  private replaceFixtureInFloorData(fixtureId: string, mergedFixture: any) {\r\n    if (!this.floorData) return;\r\n    const replaceInArray = (arr: any[] | undefined) => {\r\n      if (!Array.isArray(arr)) return false;\r\n      const idx = arr.findIndex((f: any) => f?._id === fixtureId);\r\n      if (idx >= 0) {\r\n        arr[idx] = { ...arr[idx], ...mergedFixture, _id: arr[idx]._id };\r\n        return true;\r\n      }\r\n      return false;\r\n    };\r\n\r\n    if (Array.isArray(this.floorData.layoutPolygon)) {\r\n      for (const lp of this.floorData.layoutPolygon) {\r\n        if (replaceInArray(lp?.fixtures)) return;\r\n      }\r\n    }\r\n    replaceInArray(this.floorData.centerFixture);\r\n  }\r\n\r\n  private buildLocalActionComment(\r\n    responsetype: string,\r\n    comment: string | null | undefined,\r\n  ): any {\r\n    let userData: any = {};\r\n    try {\r\n      const raw = localStorage.getItem(\"user-info\");\r\n      if (raw) userData = JSON.parse(raw);\r\n    } catch {\r\n      userData = {};\r\n    }\r\n    return {\r\n      userId: userData?._id,\r\n      userName: userData?.userName,\r\n      role: userData?.role,\r\n      responsetype,\r\n      comment: comment ?? null,\r\n      timeStamp: new Date(),\r\n    };\r\n  }\r\n\r\n  // Zone-verification merge: overlay only header.label, templateGroupName, and per-zone\r\n  // productBrandName from the response onto the existing template.\r\n  private mergeZoneFixtureData(targetFixture: any, responseFixture: any): any {\r\n    const merged = structuredClone(targetFixture);\r\n\r\n    const responseLabel = responseFixture?.header?.label?.trim();\r\n    if (responseLabel) {\r\n      merged.header = { ...(merged.header ?? {}), label: responseLabel };\r\n    }\r\n\r\n    const responseTemplateGroupName = responseFixture?.templateGroupName?.trim();\r\n    if (responseTemplateGroupName) {\r\n      merged.templateGroupName = responseTemplateGroupName;\r\n    }\r\n\r\n    const zoneToBrand = new Map<string, string[]>();\r\n    (responseFixture?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      const brand = shelf?.productBrandName;\r\n      if (!zone || !Array.isArray(brand) || brand.length === 0) return;\r\n      if (!zoneToBrand.has(zone)) {\r\n        zoneToBrand.set(zone, brand);\r\n      }\r\n    });\r\n\r\n    (merged.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const brand = shelf?.zone ? zoneToBrand.get(shelf.zone) : null;\r\n      if (brand) {\r\n        shelf.productBrandName = [...brand];\r\n      }\r\n    });\r\n\r\n    return merged;\r\n  }\r\n\r\n  async handleZoneFeedbackAction(userAction: any) {\r\n    try {\r\n      const fixtureId = this.selectedFixture?.fixtureId;\r\n      if (!fixtureId) return;\r\n\r\n      const fixtureIndex = this.allFixtureInstances.findIndex(\r\n        (f: any) => f._id === fixtureId,\r\n      );\r\n      if (fixtureIndex < 0) return;\r\n\r\n      const baseFixture = structuredClone(\r\n        this.allFixtureInstances[fixtureIndex],\r\n      );\r\n\r\n      // editWithResponse: open the edit panel pre-populated with merged data\r\n      if (userAction.action === \"editWithResponse\") {\r\n        this.editFromTab = \"zone\";\r\n        const merged = this.mergeZoneFixtureData(\r\n          baseFixture,\r\n          userAction.fixtureData,\r\n        );\r\n        this.selectedFixtureData = {\r\n          ...merged,\r\n          userAction: userAction.action,\r\n          taskType: \"zoneVerification\",\r\n        };\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n        this.editFixture = true;\r\n        setTimeout(() => {\r\n          this.editFixtureSection = \"basic-details\";\r\n          this.cd.detectChanges();\r\n        }, 100);\r\n        return;\r\n      }\r\n\r\n      const answerId = userAction.feedback?.answers?.[0]?._id;\r\n      const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n      if (!answerId || !taskId) return;\r\n\r\n      // redo: don't touch the planoFixture — only record the rejection on the compliance doc\r\n      // so the redo round can re-collect this fixture's response from mobile.\r\n      if (userAction.action === \"redo\") {\r\n        await firstValueFrom(\r\n          this.apiService.updateZoneVerificationStatus({\r\n            _id: userAction.feedback._id,\r\n            answerId,\r\n            taskId,\r\n            type: userAction.type,\r\n            userAction: userAction.action,\r\n            comments: userAction.remarks,\r\n          }),\r\n        );\r\n\r\n        const zoneRowsRedo = this.zoneFeedback?.zoneVerificationData ?? [];\r\n        const zoneRowRedo = zoneRowsRedo.find(\r\n          (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n        );\r\n        if (zoneRowRedo?.answers?.[0]) {\r\n          zoneRowRedo.answers[0].userAction = userAction.action;\r\n          zoneRowRedo.answers[0].status = userAction.type;\r\n          const ans = zoneRowRedo.answers[0];\r\n          ans.comments = ans.comments ?? [];\r\n          ans.comments.push(\r\n            this.buildLocalActionComment(userAction.type, userAction.remarks),\r\n          );\r\n        }\r\n        this.selectFixtureFeedback(fixtureId);\r\n        return;\r\n      }\r\n\r\n      // keepPlano / acceptResponse / editAccepted: build merged fixture and persist\r\n      let mergedFixture = baseFixture;\r\n      if (\r\n        userAction.action === \"acceptResponse\" ||\r\n        userAction.action === \"editAccepted\"\r\n      ) {\r\n        mergedFixture = this.mergeZoneFixtureData(\r\n          baseFixture,\r\n          userAction.fixtureData,\r\n        );\r\n      }\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateStoreFixture({\r\n          fixtureId,\r\n          data: mergedFixture,\r\n          taskType: \"zoneVerification\",\r\n        }),\r\n      );\r\n\r\n      const modifiedAnswer =\r\n        userAction.action === \"editAccepted\"\r\n          ? this.buildZoneModifiedAnswer(userAction.fixtureData)\r\n          : null;\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateZoneVerificationStatus({\r\n          _id: userAction.feedback._id,\r\n          answerId,\r\n          taskId,\r\n          type: userAction.type,\r\n          userAction: userAction.action,\r\n          comments: userAction.remarks,\r\n          ...(modifiedAnswer ? { modifiedAnswer } : {}),\r\n        }),\r\n      );\r\n\r\n      // Local state update — keep UI in sync without re-fetching.\r\n      this.allFixtureInstances[fixtureIndex] = mergedFixture;\r\n      this.replaceFixtureInFloorData(fixtureId, mergedFixture);\r\n      this.renderFloor(false);\r\n\r\n      const zoneRows = this.zoneFeedback?.zoneVerificationData ?? [];\r\n      const zoneRow = zoneRows.find(\r\n        (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n      );\r\n      if (zoneRow?.answers?.[0]) {\r\n        zoneRow.answers[0].userAction = userAction.action;\r\n        zoneRow.answers[0].status = userAction.type;\r\n        const ans = zoneRow.answers[0];\r\n        ans.comments = ans.comments ?? [];\r\n        ans.comments.push(\r\n          this.buildLocalActionComment(userAction.type, userAction.remarks),\r\n        );\r\n\r\n        if (modifiedAnswer) {\r\n          // Apply the same overlay the backend will apply on next read, so the\r\n          // panel reflects the edits without waiting for a refetch.\r\n          ans.header = {\r\n            ...(ans.header ?? {}),\r\n            label: modifiedAnswer.header.label,\r\n          };\r\n          (ans.shelfConfig ?? []).forEach((shelf: any) => {\r\n            const brands =\r\n              shelf?.zone && modifiedAnswer.shelfBrandsByZone[shelf.zone];\r\n            if (brands) shelf.productBrandName = [...brands];\r\n          });\r\n          ans.modifiedAnswer = modifiedAnswer;\r\n        }\r\n      }\r\n\r\n      this.calculatePublishingState();\r\n      this.selectFixtureFeedback(fixtureId);\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\"Failed to execute zone action\");\r\n    }\r\n  }\r\n\r\n  private buildZoneModifiedAnswer(fixtureData: any): {\r\n    header: { label: string };\r\n    shelfBrandsByZone: Record<string, string[]>;\r\n  } {\r\n    const shelfBrandsByZone: Record<string, string[]> = {};\r\n    (fixtureData?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      if (!zone || shelfBrandsByZone[zone]) return;\r\n      shelfBrandsByZone[zone] = Array.isArray(shelf?.productBrandName)\r\n        ? [...shelf.productBrandName]\r\n        : [];\r\n    });\r\n    return {\r\n      header: { label: fixtureData?.header?.label ?? \"\" },\r\n      shelfBrandsByZone,\r\n    };\r\n  }\r\n\r\n  private async persistZoneEditAccepted() {\r\n    try {\r\n      const fixtureId = this.selectedFixture?.fixtureId;\r\n      if (!fixtureId) return;\r\n      const zoneRows = this.zoneFeedback?.zoneVerificationData ?? [];\r\n      const zoneRow = zoneRows.find(\r\n        (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n      );\r\n      const answerId = zoneRow?.answers?.[0]?._id;\r\n      const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n      if (!answerId || !taskId) return;\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateZoneVerificationStatus({\r\n          _id: zoneRow._id,\r\n          answerId,\r\n          taskId,\r\n          type: \"agree\",\r\n          userAction: \"editAccepted\",\r\n          comments: null,\r\n        }),\r\n      );\r\n\r\n      if (zoneRow?.answers?.[0]) {\r\n        zoneRow.answers[0].userAction = \"editAccepted\";\r\n        zoneRow.answers[0].status = \"agree\";\r\n        const ans = zoneRow.answers[0];\r\n        ans.comments = ans.comments ?? [];\r\n        ans.comments.push(this.buildLocalActionComment(\"agree\", null));\r\n      }\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\r\n        \"Failed to record zone edit acceptance\",\r\n      );\r\n    }\r\n  }\r\n\r\n  rotateWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n    if (wall.angle + 90 < 360) {\r\n      wall.angle += 90;\r\n    } else {\r\n      wall.angle = 0;\r\n    }\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewWall(eleNumber: number) {\r\n    const getWallEndPoint = (wall: any) => {\r\n      const angleRad = (wall.angle * Math.PI) / 180;\r\n      const length = wall.distance;\r\n\r\n      return {\r\n        x: wall.relativePosition.x + length * Math.cos(angleRad),\r\n        y: wall.relativePosition.y + length * Math.sin(angleRad),\r\n        unit: wall.relativePosition.unit,\r\n      };\r\n    };\r\n\r\n    const index = this.floorData.layoutPolygon.findIndex(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === eleNumber,\r\n    );\r\n\r\n    if (index === -1 && eleNumber !== 0) return;\r\n\r\n    let startPosition;\r\n\r\n    if (eleNumber === 0) {\r\n      startPosition = {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n    } else {\r\n      const prevWall = this.floorData.layoutPolygon[index];\r\n      startPosition = getWallEndPoint(prevWall);\r\n    }\r\n\r\n    const baseWall =\r\n      eleNumber === 0\r\n        ? { angle: 0, direction: \"right\", unit: \"ft\" }\r\n        : this.floorData.layoutPolygon[index];\r\n\r\n    const newWall = {\r\n      elementType: \"wall\",\r\n      distance: 15,\r\n      unit: baseWall.unit,\r\n      direction: baseWall.direction,\r\n      angle: baseWall.angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: startPosition,\r\n      fixtures: [],\r\n      otherElements: [],\r\n      newAdded: true,\r\n    };\r\n\r\n    this.floorData.layoutPolygon.splice(\r\n      eleNumber === 0 ? 0 : index + 1,\r\n      0,\r\n      newWall,\r\n    );\r\n\r\n    this.updateWallElementNumber();\r\n    this.updateWallCoordinates();\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewEntrance() {\r\n    const layoutPolygon = this.floorData?.layoutPolygon ?? [];\r\n    const eleNumber =\r\n      layoutPolygon.filter((ele: any) => ele.elementType === \"entrance\")\r\n        ?.length ?? 0;\r\n\r\n    const gapPx = 24;\r\n    const defaultEntranceWidthPx = 80;\r\n\r\n    let xFt = 0;\r\n    let yFt = 0;\r\n    let angle = 0;\r\n    let isPositionResolved = false;\r\n\r\n    // 1) If entrance(s) already exist, place next to the latest one.\r\n    const existingEntranceObjects = (this.canvas?.getObjects() ?? [])\r\n      .filter((obj: any) => obj?.objType === \"entrance\")\r\n      .sort(\r\n        (a: any, b: any) =>\r\n          Number(a?.data?.elementNumber || 0) -\r\n          Number(b?.data?.elementNumber || 0),\r\n      );\r\n\r\n    const latestEntranceObj = existingEntranceObjects.at(-1) as any;\r\n\r\n    if (latestEntranceObj) {\r\n      const leftPx = latestEntranceObj.left ?? 0;\r\n      const topPx = latestEntranceObj.top ?? 0;\r\n      const widthPx =\r\n        latestEntranceObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n      const anchorAngle = Number(latestEntranceObj.angle || 0);\r\n      const angleRad = (anchorAngle * Math.PI) / 180;\r\n      const stepPx = widthPx + gapPx;\r\n\r\n      xFt = this.fromPixels(leftPx + stepPx * Math.cos(angleRad), \"ft\");\r\n      yFt = this.fromPixels(topPx + stepPx * Math.sin(angleRad), \"ft\");\r\n      angle = anchorAngle;\r\n      isPositionResolved = true;\r\n    }\r\n\r\n    if (!isPositionResolved) {\r\n      const existingEntrances = layoutPolygon\r\n        .filter((ele: any) => ele.elementType === \"entrance\")\r\n        .sort(\r\n          (a: any, b: any) =>\r\n            Number(a?.elementNumber || 0) - Number(b?.elementNumber || 0),\r\n        );\r\n\r\n      const latestEntrance = existingEntrances.at(-1);\r\n      if (latestEntrance) {\r\n        const anchorAngle = Number(latestEntrance?.angle || 0);\r\n        const angleRad = (anchorAngle * Math.PI) / 180;\r\n        const stepFt =\r\n          Number(\r\n            latestEntrance?.distance ||\r\n              this.fromPixels(defaultEntranceWidthPx, \"ft\"),\r\n          ) + this.fromPixels(gapPx, \"ft\");\r\n\r\n        xFt =\r\n          Number(latestEntrance?.relativePosition?.x || 0) +\r\n          stepFt * Math.cos(angleRad);\r\n        yFt =\r\n          Number(latestEntrance?.relativePosition?.y || 0) +\r\n          stepFt * Math.sin(angleRad);\r\n        angle = anchorAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 2) If no entrance, place next to wall-1.\r\n    if (!isPositionResolved) {\r\n      const wall1 = layoutPolygon.find(\r\n        (ele: any) =>\r\n          ele.elementType === \"wall\" && Number(ele.elementNumber) === 1,\r\n      );\r\n\r\n      if (wall1) {\r\n        const wallAngle = Number(wall1?.angle || 0);\r\n        const wallAngleRad = (wallAngle * Math.PI) / 180;\r\n        const alongWallFt = Math.min(Number(wall1?.distance || 0) / 2, 4);\r\n        const sideOffsetFt = 1.5;\r\n        const wallX = Number(wall1?.relativePosition?.x || 0);\r\n        const wallY = Number(wall1?.relativePosition?.y || 0);\r\n\r\n        xFt =\r\n          wallX +\r\n          alongWallFt * Math.cos(wallAngleRad) +\r\n          sideOffsetFt * -Math.sin(wallAngleRad);\r\n        yFt =\r\n          wallY +\r\n          alongWallFt * Math.sin(wallAngleRad) +\r\n          sideOffsetFt * Math.cos(wallAngleRad);\r\n        angle = wallAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 3) If no wall (e.g. layoutPolygon is empty), place next to any canvas object.\r\n    if (!isPositionResolved) {\r\n      const anchorObj = (this.canvas?.getObjects() ?? []).find((obj: any) => {\r\n        return !!obj?.objType && obj?.isDissectionLine !== true;\r\n      }) as any;\r\n\r\n      if (anchorObj) {\r\n        const leftPx = anchorObj.left ?? 0;\r\n        const topPx = anchorObj.top ?? 0;\r\n        const widthPx = anchorObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n\r\n        xFt = this.fromPixels(leftPx + widthPx + gapPx, \"ft\");\r\n        yFt = this.fromPixels(topPx, \"ft\");\r\n        angle = Number(anchorObj?.angle || 0);\r\n      }\r\n    }\r\n\r\n    const newEntrance = {\r\n      elementType: \"entrance\",\r\n      distance: 6,\r\n      unit: \"ft\",\r\n      direction: \"up\",\r\n      angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: {\r\n        x: xFt,\r\n        y: yFt,\r\n        unit: \"ft\",\r\n      },\r\n      fixtures: [],\r\n      otherElements: [],\r\n    };\r\n\r\n    this.floorData.layoutPolygon.push(newEntrance);\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n    this.updateEntranceCoordinates();\r\n  }\r\n\r\n  private isAddingFixture = false;\r\n\r\n  async addNewFixture(fixtureType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n    // Re-entry guard: getTemplate awaits an HTTP call, and a double-fired click\r\n    // (or rapid second click) would race past the await with the same\r\n    // existingFixtures snapshot, computing the same placement and pushing two\r\n    // fixtures at identical coordinates.\r\n    if (this.isAddingFixture) return;\r\n    this.isAddingFixture = true;\r\n    try {\r\n      await this.addNewFixtureInternal(fixtureType, wallIndex);\r\n    } finally {\r\n      this.isAddingFixture = false;\r\n    }\r\n  }\r\n\r\n  private async addNewFixtureInternal(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    wallIndex?: number,\r\n  ) {\r\n    const template: any = await this.getTemplate(this.fixtureTemplates[0]._id);\r\n    const templateData = template.data;\r\n    const fixtureId = `new-${crypto.randomUUID()}`;\r\n    const fixtureGroup = this.patchFixture({\r\n      fixtureName: templateData.fixtureName,\r\n      fixtureConfigId: templateData._id,\r\n      _id: fixtureId,\r\n    });\r\n\r\n    const fixtureData = {\r\n      ...templateData,\r\n      fixtureConfigId: templateData._id,\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      _id: fixtureId,\r\n      unsavedChanges: true,\r\n      newAdded: true,\r\n    };\r\n    this.layoutHasUnsavedChanges = true;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n\r\n      const w = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n      const wp = this.fromPixels(w, \"ft\");\r\n\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n        const cosA = Math.cos(angleRad);\r\n        const sinA = Math.sin(angleRad);\r\n\r\n        // Project all existing fixtures onto the wall axis to get occupied ranges (in ft).\r\n        // Projection recovers t correctly even with the 1ft perpendicular offset applied\r\n        // during placement: (−sinA·cosA + cosA·sinA) cancels to 0.\r\n        const existingFixtures = (wallData.fixtures || []).filter(\r\n          (f: any) => f.fixtureName !== \"space\",\r\n        );\r\n\r\n        const occupied: Array<[number, number]> = existingFixtures.map(\r\n          (f: any) => {\r\n            const fWidth = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticWidth.value,\r\n                f.fixtureStaticWidth.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n            const fHeight = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticLength.value,\r\n                f.fixtureStaticLength.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n\r\n            // CAD-uploaded fixtures on inverted walls (wall angle ∈ (90°, 270°))\r\n            // have their saved (x, y) shifted by R(wallAngle)·(w, h) to keep the\r\n            // canonical visual after a 180° body flip — see drawFixture. To\r\n            // recover the wall-axis position the gap-finder needs, unshift any\r\n            // fixture whose saved angle differs from the wall angle by ~180°.\r\n            const fAngle = (f.relativePosition.angle ?? 0) as number;\r\n            const angleDiff =\r\n              ((((fAngle - angleDeg) % 360) + 360) % 360);\r\n            const isFlipped = Math.abs(angleDiff - 180) < 1;\r\n\r\n            let projX = f.relativePosition.x;\r\n            let projY = f.relativePosition.y;\r\n            if (isFlipped) {\r\n              projX -= cosA * fWidth - sinA * fHeight;\r\n              projY -= sinA * fWidth + cosA * fHeight;\r\n            }\r\n\r\n            const tStart = (projX - x0) * cosA + (projY - y0) * sinA;\r\n            return [Math.max(0, tStart), Math.max(0, tStart) + fWidth] as [\r\n              number,\r\n              number,\r\n            ];\r\n          },\r\n        );\r\n\r\n        occupied.sort((a, b) => a[0] - b[0]);\r\n\r\n        // Walk from wall start; find first gap that fits the new fixture.\r\n        // EPSILON absorbs floating-point drift from repeated unit round-trips.\r\n        const EPSILON = 0.001;\r\n        let placementT: number | null = null;\r\n        let cursor = 0;\r\n\r\n        for (const [rangeStart, rangeEnd] of occupied) {\r\n          if (rangeStart - cursor >= wp - EPSILON) {\r\n            placementT = cursor;\r\n            break;\r\n          }\r\n          cursor = Math.max(cursor, rangeEnd);\r\n        }\r\n\r\n        // No gap found → place after last fixture.\r\n        // Overflow beyond wall length is intentional per requirements.\r\n        if (placementT === null) {\r\n          placementT = cursor;\r\n        }\r\n\r\n        const fx = x0 + placementT * cosA;\r\n        const fy = y0 + placementT * sinA;\r\n        const offset = 0.9;\r\n        const fx_offset = fx + offset * -sinA;\r\n        const fy_offset = fy + offset * cosA;\r\n\r\n        fixtureData.relativePosition.x = fx_offset;\r\n        fixtureData.relativePosition.y = fy_offset;\r\n        fixtureData.relativePosition.angle = angleDeg;\r\n\r\n        // If the wall angle puts the fixture in the upside-down range, bake\r\n        // the same 180° body flip drawFixture applies during CAD first-render\r\n        // (shift anchor by R(wallAngle)·(w, h) and rotate +180°). drawFixture's\r\n        // own flip path is gated on cadLayout=true, so for fixtures added\r\n        // post-CAD via the side panel we have to bake the flip here — it\r\n        // makes the new fixture land canonical instead of upside-down.\r\n        const normWallAngle = (((angleDeg % 360) + 360) % 360);\r\n        if (normWallAngle > 90 && normWallAngle < 270) {\r\n          const widthFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticWidth.value,\r\n              fixtureData.fixtureStaticWidth.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          const heightFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticLength.value,\r\n              fixtureData.fixtureStaticLength.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          fixtureData.relativePosition.x =\r\n            fx_offset + cosA * widthFt - sinA * heightFt;\r\n          fixtureData.relativePosition.y =\r\n            fy_offset + sinA * widthFt + cosA * heightFt;\r\n          fixtureData.relativePosition.angle = angleDeg + 180;\r\n        }\r\n      }\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"fixtures\") as FormArray).push(\r\n        fixtureGroup,\r\n      );\r\n      this.getWallByNumber(wallIndex! + 1)?.fixtures.push(fixtureData);\r\n    } else if (fixtureType === \"floor\") {\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtureData.fixtureStaticLength.value,\r\n        fixtureData.fixtureStaticLength.unit,\r\n      );\r\n\r\n      // N-shape grid placement: col fills left-to-right, each column fills bottom row (row=1) first then top row (row=0)\r\n      const newIndex = this.floorData.centerFixture.length;\r\n      const newCol = Math.floor(newIndex / 2);\r\n      const newRow = newIndex % 2 === 0 ? 1 : 0;\r\n\r\n      let gridOriginX: number;\r\n      let gridOriginY: number;\r\n\r\n      if (this.floorData.centerFixture.length > 0) {\r\n        // Recover grid origin from fixture at index 0 (always placed at row=1, col=0)\r\n        const f0 = this.floorData.centerFixture[0];\r\n        const f0x = this.toPixels(\r\n          f0.relativePosition.x,\r\n          f0.relativePosition.unit,\r\n        );\r\n        const f0y = this.toPixels(\r\n          f0.relativePosition.y,\r\n          f0.relativePosition.unit,\r\n        );\r\n        // f0 is at row=1 → gridOriginY = f0y - 1 * fixtureHeightPx; col=0 → gridOriginX = f0x\r\n        gridOriginX = f0x;\r\n        gridOriginY = f0y - fixtureHeightPx;\r\n      } else {\r\n        // No existing center fixtures — find best grid origin via polygon scan (same as drawLayoutElements)\r\n        const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n        const occupiedRects = this.getOccupiedRects();\r\n        const bounds = this.getFullLayoutBounds();\r\n\r\n        // Reserve space for 2 rows and 1 column as the starting grid footprint\r\n        const gridW = fixtureWidthPx;\r\n        const gridH = 2 * fixtureHeightPx;\r\n\r\n        const centerX = bounds.left + bounds.width / 2;\r\n        const centerY = bounds.top + bounds.height / 2;\r\n\r\n        const fitsInPolygon = (x: number, y: number) =>\r\n          this.isPointInsidePolygon({ x, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x: x + gridW, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x, y: y + gridH }, layoutPolygon) &&\r\n          this.isPointInsidePolygon(\r\n            { x: x + gridW, y: y + gridH },\r\n            layoutPolygon,\r\n          );\r\n\r\n        const overlapsOccupied = (x: number, y: number) =>\r\n          occupiedRects.some((occ) =>\r\n            this.rectsOverlap({ x, y, w: gridW, h: gridH }, occ),\r\n          );\r\n\r\n        const scanForBestOrigin = (skipOverlap: boolean) => {\r\n          let bestScore = -Infinity;\r\n          let bestPos: { x: number; y: number } | null = null;\r\n          const step = fixtureWidthPx / 2;\r\n\r\n          for (\r\n            let y = bounds.top;\r\n            y <= bounds.top + bounds.height - gridH;\r\n            y += step\r\n          ) {\r\n            for (\r\n              let x = bounds.left;\r\n              x <= bounds.left + bounds.width - gridW;\r\n              x += step\r\n            ) {\r\n              if (!fitsInPolygon(x, y)) continue;\r\n              if (!skipOverlap && overlapsOccupied(x, y)) continue;\r\n\r\n              const gridRect = { x, y, w: gridW, h: gridH };\r\n              const emptyMargin = this.computeEmptyMargin(\r\n                gridRect,\r\n                bounds,\r\n                occupiedRects,\r\n              );\r\n              const dx = centerX - (x + gridW / 2);\r\n              const dy = centerY - (y + gridH / 2);\r\n              const score = emptyMargin * 1000 - (dx * dx + dy * dy) * 0.001;\r\n\r\n              if (score > bestScore) {\r\n                bestScore = score;\r\n                bestPos = { x, y };\r\n              }\r\n            }\r\n          }\r\n          return bestPos;\r\n        };\r\n\r\n        const bestPos = scanForBestOrigin(false) ??\r\n          scanForBestOrigin(true) ?? {\r\n            x: centerX - gridW / 2,\r\n            y: centerY - gridH / 2,\r\n          };\r\n\r\n        gridOriginX = bestPos.x;\r\n        gridOriginY = bestPos.y;\r\n      }\r\n\r\n      const x = gridOriginX + newCol * fixtureWidthPx;\r\n      const y = gridOriginY + newRow * fixtureHeightPx;\r\n\r\n      fixtureData.relativePosition.x = this.fromPixels(x, \"ft\");\r\n      fixtureData.relativePosition.y = this.fromPixels(y, \"ft\");\r\n\r\n      (this.layoutForm.get(\"floorFixtures\") as FormArray).push(fixtureGroup);\r\n      this.floorData.centerFixture.push(fixtureData);\r\n    }\r\n\r\n    await this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n    this.updateFixtureCoordinates();\r\n  }\r\n\r\n  addNewOtherElements(posType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    const posData = {\r\n      _id: `new-${crypto.randomUUID()}`,\r\n      fixtureName: `POS Counter`,\r\n      fixtureType: \"other\",\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      fixtureStaticLength: {\r\n        value: 3,\r\n        unit: \"ft\",\r\n      },\r\n      fixtureStaticWidth: {\r\n        value: 5,\r\n        unit: \"ft\",\r\n      },\r\n    };\r\n\r\n    let x = posData.relativePosition.x;\r\n    let y = posData.relativePosition.y;\r\n    let a = posData.relativePosition.angle;\r\n\r\n    const h = this.toPixels(\r\n      posData.fixtureStaticLength.value,\r\n      posData.fixtureStaticLength.unit,\r\n    );\r\n    const w = this.toPixels(\r\n      posData.fixtureStaticWidth.value,\r\n      posData.fixtureStaticWidth.unit,\r\n    );\r\n\r\n    const newOtherGroup = this.fb.group({\r\n      type: [posData.fixtureName || \"POS Counter\"], // default selected label\r\n      customName: [\"\"],\r\n    });\r\n\r\n    if (posType == \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const length = wallData.distance;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n\r\n        const fx = x0 + (length / 2) * Math.cos(angleRad);\r\n        const fy = y0 + (length / 2) * Math.sin(angleRad);\r\n        const offset = 2.5;\r\n        const fx_offset = fx + offset * -Math.sin(angleRad);\r\n        const fy_offset = fy + offset * Math.cos(angleRad);\r\n\r\n        x = this.toPixels(fx_offset, \"ft\");\r\n        y = this.toPixels(fy_offset, \"ft\");\r\n        a = angleDeg;\r\n      }\r\n\r\n      Object.assign(posData, {\r\n        associatedElementNumber: wallIndex! + 1,\r\n        associatedElementType: \"wall\",\r\n      });\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"otherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      wallData.otherElements.push({ ...posData, newAdded: true });\r\n    } else if (posType === \"floor\") {\r\n      (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      this.floorData.otherElements.push({ ...posData, newAdded: true });\r\n    }\r\n\r\n    const rectGroup = this.drawOtherElementsWithLabel(\r\n      this.canvas,\r\n      x,\r\n      y,\r\n      a,\r\n      w,\r\n      h,\r\n      posData,\r\n    );\r\n\r\n    // make active\r\n    try {\r\n      this.canvas.setActiveObject(rectGroup);\r\n      this.canvas.requestRenderAll();\r\n    } catch {}\r\n\r\n    this.subscribeToOtherElementsChanges();\r\n    this.updateOtherElementsCoordinates();\r\n  }\r\n\r\n  findEmptyCenterSpot(\r\n    objectWidthPx: number,\r\n    objectHeightPx: number,\r\n    tempOccupied: {\r\n      x: number;\r\n      y: number;\r\n      width: number;\r\n      height: number;\r\n    }[] = [],\r\n  ) {\r\n    const objects = this.canvas.getObjects();\r\n    const CENTER_OFFSET_X = -300;\r\n    const CENTER_OFFSET_Y = 0;\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const centerX = bounds.left + bounds.width / 2 + CENTER_OFFSET_X;\r\n\r\n    const centerY = bounds.top + bounds.height / 2 + CENTER_OFFSET_Y;\r\n\r\n    // 2. Spiral search parameters\r\n    const step = 20;\r\n    const maxRadius = Math.max(bounds.width, bounds.height);\r\n\r\n    for (let radius = 0; radius < maxRadius; radius += step) {\r\n      for (let angle = 0; angle < 360; angle += 30) {\r\n        const rad = (angle * Math.PI) / 180;\r\n\r\n        // 🔧 FIX: center → top-left\r\n        const x = centerX + radius * Math.cos(rad) - objectWidthPx / 2;\r\n        const y = centerY + radius * Math.sin(rad) - objectHeightPx / 2;\r\n\r\n        const testRect = {\r\n          left: x,\r\n          top: y,\r\n          width: objectWidthPx,\r\n          height: objectHeightPx,\r\n        };\r\n\r\n        // 3. Check collision with existing canvas objects\r\n        const canvasCollision = objects.some((obj) => {\r\n          const rect = obj.getBoundingRect();\r\n          return !(\r\n            rect.left > testRect.left + testRect.width ||\r\n            rect.left + rect.width < testRect.left ||\r\n            rect.top > testRect.top + testRect.height ||\r\n            rect.top + rect.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (canvasCollision) continue;\r\n\r\n        // 4. Check collision with temp placed fixtures (CAD batch)\r\n        const tempCollision = tempOccupied.some((o) => {\r\n          return !(\r\n            o.x > testRect.left + testRect.width ||\r\n            o.x + o.width < testRect.left ||\r\n            o.y > testRect.top + testRect.height ||\r\n            o.y + o.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (tempCollision) continue;\r\n\r\n        return { x, y };\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  async cancelEdit() {\r\n    this.highlightedFixtureFormId = null;\r\n    await this.getStoreFixtures(this.planoData._id);\r\n  }\r\n\r\n  listenToDeleteKey() {\r\n    document.addEventListener(\"keydown\", (e) => {\r\n      if (e.key === \"Delete\" && this.layoutForm.enabled) {\r\n        const active = this.canvas?.getActiveObject() as any;\r\n\r\n        if (active && (active as any).objType === \"entrance\") {\r\n          this.deleteEntrance();\r\n        }\r\n\r\n        if (active && (active as any).objType === \"wall\") {\r\n          if (active?.data?.elementNumber) {\r\n            this.deleteWall(active?.data?.elementNumber);\r\n          }\r\n        }\r\n\r\n        if (active && (active as any).objType === \"fixture\") {\r\n          if (active?.fixtureType) {\r\n            this.deleteFixture(\r\n              active?.fixtureType,\r\n              active?.fixtureIndex - 1,\r\n              active?.wallIndex - 1,\r\n            );\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  deleteEntrance() {\r\n    const active = this.canvas.getActiveObject() as any;\r\n\r\n    if (active && active.objType === \"entrance\") {\r\n      const i = this.floorData.layoutPolygon.findIndex(\r\n        (el: any) =>\r\n          el.elementType === \"entrance\" &&\r\n          el.elementNumber === active.data.elementNumber,\r\n      );\r\n\r\n      if (i >= 0) {\r\n        this.floorData.layoutPolygon.splice(i, 1);\r\n        this.renderFloor(true);\r\n      }\r\n\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  async deleteWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (ele: any) =>\r\n        ele.elementType === \"wall\" && ele.elementNumber === eleNumber,\r\n    );\r\n    if (wall.fixtures.length || wall.otherElements.length)\r\n      if (!(await this.confirmDeleteWall())) return;\r\n\r\n    const i = this.floorData.layoutPolygon.findIndex(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n\r\n    this.floorData.layoutPolygon.splice(i, 1);\r\n    this.updateWallElementNumber();\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateWallElementNumber() {\r\n    const onlyWalls = this.floorData.layoutPolygon?.filter(\r\n      (el: any) => el.elementType === \"wall\",\r\n    );\r\n\r\n    onlyWalls?.forEach((item: any, index: number) => {\r\n      item.elementNumber = index + 1;\r\n    });\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  fromPixels(pixels: number, unit: string, dpi = 2.8): number {\r\n    let value: number;\r\n\r\n    // pixels = pixels >= this.wallThickness ? pixels - this.wallThickness : this.wallThickness;\r\n\r\n    if (unit === \"mm\") {\r\n      value = (pixels / dpi) * 25.4;\r\n    } else if (unit === \"ft\") {\r\n      value = pixels / (12 * dpi);\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(value.toFixed(4));\r\n  }\r\n\r\n  async confirmEdit(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(LayoutEditConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async confirmDeleteWall(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(DeleteConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n\r\n      modelRef.componentInstance.title = \"Delete wall\";\r\n      modelRef.componentInstance.description =\r\n        \"Are you sure you want to delete this wall along with its associated fixtures and elements?\";\r\n\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  updateFixtureCoordinates(fixtures?: any) {\r\n    const fixturesFromCanvas =\r\n      fixtures ??\r\n      this.canvas\r\n        .getObjects()\r\n        .filter((obj) => (obj as any).fixtureId)\r\n        .map((obj) => ({\r\n          id: (obj as any).fixtureId,\r\n          x: obj.left,\r\n          y: obj.top,\r\n          angle: obj?.angle ?? 0,\r\n        }));\r\n    const posMap = new Map();\r\n\r\n    for (const fixture of fixturesFromCanvas) {\r\n      posMap.set(fixture.id, {\r\n        x: this.fromPixels(fixture.x, \"ft\"),\r\n        y: this.fromPixels(fixture.y, \"ft\"),\r\n        angle: fixture.angle,\r\n      });\r\n    }\r\n\r\n    this.floorData.centerFixture.forEach((cf: any) => {\r\n      const latestFixturePos = posMap.get(cf._id);\r\n      if (latestFixturePos) {\r\n        cf.relativePosition.x = latestFixturePos.x;\r\n        cf.relativePosition.y = latestFixturePos.y;\r\n        cf.relativePosition.angle = latestFixturePos.angle;\r\n      }\r\n    });\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.fixtures?.forEach((wf: any) => {\r\n        const latestFixturePos = posMap.get(wf._id);\r\n        if (latestFixturePos) {\r\n          wf.relativePosition.x = latestFixturePos.x;\r\n          wf.relativePosition.y = latestFixturePos.y;\r\n          wf.relativePosition.angle = latestFixturePos.angle;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateOtherElementsCoordinates() {\r\n    const othersFromCanvas = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"others\")\r\n      .map((obj) => ({\r\n        id: (obj as any).data?._id,\r\n        label: (obj as any).data?.fixtureName,\r\n        x: obj.left,\r\n        y: obj.top,\r\n        angle: obj?.angle ?? 0,\r\n        width: this.fromPixels(obj.getScaledWidth() - 2, \"ft\"),\r\n        height: this.fromPixels(obj.getScaledHeight() - 2, \"ft\"),\r\n      }));\r\n\r\n    const posMap = new Map<\r\n      string,\r\n      { x: number; y: number; angle: number; h: number; w: number }\r\n    >();\r\n    for (const other of othersFromCanvas) {\r\n      if (other.id) {\r\n        posMap.set(other.id, {\r\n          x: this.fromPixels(other.x, \"ft\"),\r\n          y: this.fromPixels(other.y, \"ft\"),\r\n          angle: other.angle,\r\n          h: other.height,\r\n          w: other.width,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (Array.isArray(this.floorData.otherElements)) {\r\n      this.floorData.otherElements.forEach((el: any) => {\r\n        const latestOthersPos = posMap.get(el._id);\r\n        if (latestOthersPos) {\r\n          el.relativePosition.x = latestOthersPos.x;\r\n          el.relativePosition.y = latestOthersPos.y;\r\n          el.relativePosition.angle = latestOthersPos.angle;\r\n          el.fixtureStaticLength.value = latestOthersPos.h;\r\n          el.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.otherElements?.forEach((wf: any) => {\r\n        const latestOthersPos = posMap.get(wf._id);\r\n        if (latestOthersPos) {\r\n          wf.relativePosition.x = latestOthersPos.x;\r\n          wf.relativePosition.y = latestOthersPos.y;\r\n          wf.relativePosition.angle = latestOthersPos.angle;\r\n          wf.fixtureStaticLength.value = latestOthersPos.h;\r\n          wf.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateWallCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"wall\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth() - 0.27, \"ft\"),\r\n          height: this.fromPixels(obj.getScaledHeight() - 0.27, \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const wall of data) {\r\n      posMap.set(\r\n        `${wall.elementData.elementType}${wall.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === wall.elementData.elementType &&\r\n            obj.elementData.elementNumber === wall.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const wallPos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (wallPos) {\r\n        w.relativePosition.x = wallPos.left;\r\n        w.relativePosition.y = wallPos.top;\r\n        w.angle = wallPos.angle;\r\n        w.distance = wallPos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  updateEntranceCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"entrance\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const entrance of data) {\r\n      posMap.set(\r\n        `${entrance.elementData.elementType}${entrance.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === entrance.elementData.elementType &&\r\n            obj.elementData.elementNumber ===\r\n              entrance.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const entrancePos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (entrancePos) {\r\n        w.relativePosition.x = entrancePos.left;\r\n        w.relativePosition.y = entrancePos.top;\r\n        w.angle = entrancePos.angle;\r\n        w.distance = entrancePos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  async updateLayout(editMode: boolean = false) {\r\n    if (editMode) {\r\n      if (!(await this.confirmEdit())) {\r\n        this.disabledPublish = this.taskInfo.disabled;\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        this.renderFloor(false);\r\n        return;\r\n      }\r\n      if (this.taskStyle.fixture.class == \"reviewPending\") {\r\n        this.disabledPublish = false;\r\n        this.publishingState === \"fixture\";\r\n      }\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((element: any) => {\r\n      element.fixtures = element.fixtures.filter(\r\n        (fixture: any) => !fixture?.ghost && fixture.fixtureName !== \"space\",\r\n      );\r\n    });\r\n    this.floorData.centerFixture = this.floorData.centerFixture\r\n      .filter((fixture: any) => !fixture?.ghost)\r\n      .map((fixture: any) => {\r\n        const { associatedElementType, associatedElementNumber, ...rest } =\r\n          fixture;\r\n        return rest;\r\n      });\r\n    this.reorderFixture(this.floorData);\r\n\r\n    const payload = {\r\n      floorId: this.floorData._id,\r\n      data: this.floorData,\r\n      editMode: editMode,\r\n      // Layout edits invalidate downstream verifications (fixture, VM, zone), so any\r\n      // layout-edit save should trigger the BE's revertOnEdit cleanup. The BE's\r\n      // deleteMany is idempotent — if no dependent tasks exist, nothing happens.\r\n      revertOnEdit: editMode === true,\r\n    };\r\n\r\n    this.isSavingLayout = true;\r\n    this.apiService.updateStorePlano(payload).subscribe({\r\n      next: (res) => {\r\n        this.createForm();\r\n        this.getStoreFixtures(this.planoData._id);\r\n        this.isSavingLayout = false;\r\n        this.layoutHasUnsavedChanges = false;\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to update layout\");\r\n        this.isSavingLayout = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  async assignTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n    };\r\n\r\n    if (this.publishingState === \"layout\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"layout-redo\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.layoutData[\r\n          this.storeFeedback.layoutData.length - 1\r\n        ].taskId;\r\n    } else if (this.publishingState === \"fixture\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"fixture-redo\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.fixtureData[\r\n          this.storeFeedback.fixtureData.length - 1\r\n        ].taskId;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.VmData[this.storeFeedback.VmData.length - 1].taskId;\r\n    }\r\n\r\n    let result;\r\n\r\n    if (this.publishingState === \"fixture\") {\r\n      const modalRef = this.modalService.open(ScheduleTaskPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        scrollable: true,\r\n        backdrop: \"static\",\r\n        windowClass: \"schedule-task-modal\",\r\n      });\r\n      modalRef.componentInstance.type = this.publishingState;\r\n      modalRef.componentInstance.storeName = this.planoData?.storeName;\r\n      modalRef.componentInstance.fixtures = this.allFixtureInstances;\r\n\r\n      result = await modalRef.result;\r\n\r\n      if (result?.scheduledDate) {\r\n        payload.scheduledDate = result.scheduledDate;\r\n      }\r\n    } else {\r\n      const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        scrollable: true,\r\n        backdrop: \"static\",\r\n        windowClass: \"custom-height-modal\",\r\n      });\r\n      modalRef.componentInstance.type = this.publishingState;\r\n      modalRef.componentInstance.inputData = payload;\r\n      result = await modalRef.result;\r\n    }\r\n\r\n    if (result.status === \"submit\") {\r\n      let taskType = this.publishingState;\r\n      if (this.publishingState === \"vm-redo\") {\r\n        taskType = \"vm\";\r\n      }\r\n      if (this.publishingState === \"fixture-redo\") {\r\n        taskType = \"fixture\";\r\n      }\r\n      if (this.publishingState === \"layout-redo\") {\r\n        taskType = \"layout\";\r\n      }\r\n      if (result?.comments && result?.comments != \"\") {\r\n        let commentPayload = {\r\n          floorId: this.floorData._id,\r\n          planoId: this.floorData.planoId,\r\n          taskType: taskType,\r\n          comment: result.comments,\r\n        };\r\n        this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n          next: (res: any) => {},\r\n        });\r\n      }\r\n\r\n      this.apiService.createTask(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.showLayout = false;\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n            this.getStoreFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n              {},\r\n            );\r\n            this.toastService.getSuccessToast(res?.data?.message);\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to publish task\");\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] revoke — mirrors the fixture revoke flow but targets the zone task.\r\n  // Uses the existing StoreTaskRevokeComponent + revokeTask BE endpoint with type 'zoneVerification'.\r\n  revokeZoneTask() {\r\n    const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n    if (!taskId) return;\r\n\r\n    const payload: any = {\r\n      redo: this.zoneFeedback?.zoneVerificationTask?.redoStatus === true,\r\n      checkListName: \"Zone Verification\",\r\n      type: \"zoneVerification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n      taskId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(StoreTaskRevokeComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = payload.redo ? \"zone-redo\" : \"zone\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    modalRef.result.then((result) => {\r\n      if (result?.status !== \"submit\") return;\r\n\r\n      if (result.comments) {\r\n        this.apiService\r\n          .updateGlobalComment({\r\n            floorId: this.floorData._id,\r\n            planoId: this.floorData.planoId,\r\n            taskType: \"zoneVerification\",\r\n            comment: result.comments,\r\n          })\r\n          .subscribe({ next: () => {} });\r\n      }\r\n\r\n      this.apiService.revokeTask(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n            this.getZoneVerificationFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n            );\r\n            this.toastService.getSuccessToast(res?.message);\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to revoke zone task\");\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] initial publish — assigns a zone verification task to the store.\r\n  // Mirrors the fixture initial publish flow. Reuses PublishTaskPopupComponent with type 'zone'.\r\n  async publishZoneVerification() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"Zone Verification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = \"zone\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    let result: any;\r\n    try {\r\n      result = await modalRef.result;\r\n    } catch {\r\n      return;\r\n    }\r\n    if (result?.status !== \"submit\") return;\r\n\r\n    // Create the task first so we have the new taskId to attach to the global\r\n    // comment — otherwise the comment would be saved with taskId: undefined and\r\n    // would never be picked up by the zone task's commentLookup join.\r\n    this.apiService.createTask(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          const newTaskId = res?.data?.taskId;\r\n          if (result?.comments) {\r\n            this.apiService\r\n              .updateGlobalComment({\r\n                floorId: this.floorData._id,\r\n                planoId: this.floorData.planoId,\r\n                taskType: \"zoneVerification\",\r\n                taskId: newTaskId,\r\n                comment: result.comments,\r\n              })\r\n              .subscribe({ next: () => {} });\r\n          }\r\n\r\n          this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n          this.getZoneVerificationFeedback(\r\n            this.floorData.planoId,\r\n            this.floorData._id,\r\n          );\r\n          this.toastService.getSuccessToast(res?.data?.message);\r\n        }\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to publish zone verification\");\r\n      },\r\n    });\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] redo publish — independent of the layout/fixture/vm chain.\r\n  // Reuses PublishTaskPopupComponent with a new 'zone-redo' type.\r\n  async publishZoneRedo() {\r\n    const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n    if (!taskId) return;\r\n\r\n    const payload: any = {\r\n      redo: true,\r\n      checkListName: \"Zone Verification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      taskId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = \"zone-redo\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    let result: any;\r\n    try {\r\n      result = await modalRef.result;\r\n    } catch {\r\n      return;\r\n    }\r\n    if (result?.status !== \"submit\") return;\r\n\r\n    if (result?.comments) {\r\n      this.apiService\r\n        .updateGlobalComment({\r\n          floorId: this.floorData._id,\r\n          planoId: this.floorData.planoId,\r\n          taskType: \"zoneVerification\",\r\n          taskId,\r\n          comment: result.comments,\r\n        })\r\n        .subscribe({ next: () => {} });\r\n    }\r\n\r\n    this.apiService.createTask(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n          this.getZoneVerificationFeedback(\r\n            this.floorData.planoId,\r\n            this.floorData._id,\r\n          );\r\n          this.toastService.getSuccessToast(res?.data?.message);\r\n        }\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to publish zone redo\");\r\n      },\r\n    });\r\n  }\r\n\r\n  onClickEdit() {\r\n    if (\r\n      this.disableEdit ||\r\n      [\"taskAssigned\"].includes(this.taskStyle.fixture.class) ||\r\n      (this.taskStyle.fixture.class == \"reviewPending\" && !this.showLayout)\r\n    ) {\r\n      return;\r\n    }\r\n    // if (this.taskStyle.fixture.name !== \"Approved\") {\r\n      this.togglePanel(\"right\", true);\r\n      this.togglePanel(\"left\", false);\r\n\r\n      this.disabledPublish = true;\r\n      this.createForm();\r\n      this.layoutForm.enable({ emitEvent: false });\r\n      this.highlightedFixtureFormId = null;\r\n      this.renderFloor();\r\n    // } else {\r\n    //   this.router.navigateByUrl(\r\n    //     `manage/planogram/manage-rollout?planoId=${this.floorData.planoId}&floorId=${this.floorData._id}`,\r\n    //   );\r\n    // }\r\n  }\r\n\r\n  taskDetails(planoId: any, floorId: any) {\r\n    return new Promise((resolve, reject) => {\r\n      this.taskInfo = {};\r\n      this.taskStyle = {\r\n        layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n        fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n        vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n      };\r\n      this.apiService.getTaskInfo({ planoId, floorId }).subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.disabledPublish = res?.data?.disabled || false;\r\n            this.taskInfo = res?.data;\r\n            this.taskInfo?.taskDetails?.forEach((ele: any) => {\r\n              if (ele.type == \"layout\") {\r\n                this.taskStyle.layout = this.getStatus(\"layout\");\r\n              }\r\n              if (ele.type == \"fixture\") {\r\n                this.taskStyle.fixture = this.getStatus(\"fixture\");\r\n              }\r\n              if (ele.type == \"fixture\") {\r\n                this.taskStyle.vm = this.taskStyle.fixture;\r\n              }\r\n            });\r\n            this.calculatePublishingState();\r\n          }\r\n          resolve(true);\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to get task details\");\r\n          reject();\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  getStatus(type: any) {\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    // Assignee email of the person the task is assigned to. Not shown for Approved\r\n    // or Yet-to-Assign states (no active assignment to surface).\r\n    const email = data?.userEmail ?? \"\";\r\n    if (data) {\r\n      if (\r\n        data.status == \"submit\" &&\r\n        (data.feedbackStatus == \"complete\" || !data?.feedbackStatus)\r\n      ) {\r\n        return { name: \"Approved\", class: \"completed\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"pending\") {\r\n        return { name: \"Review Pending\", class: \"reviewPending\", email };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"disagree\") {\r\n        return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n      } else {\r\n        if (data.redoStatus && !data.breach) {\r\n          return { name: \"Redo\", class: \"taskAssigned\", email };\r\n        } else if (data.breach) {\r\n          return { name: \"Flagged\", class: \"flagged\", email };\r\n        }\r\n        if (\r\n          data?.date &&\r\n          dayjs(data.date, \"YYYY-MM-DD\").isAfter(dayjs(), \"day\")\r\n        ) {\r\n          return {\r\n            name: `Task scheduled: ${dayjs(data.date).format(\"DD MMMM, YYYY\")}`,\r\n            class: \"taskAssigned\",\r\n            email,\r\n          };\r\n        } else {\r\n          return { name: \"Task Assigned\", class: \"taskAssigned\", email };\r\n        }\r\n      }\r\n    }\r\n    return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n  }\r\n\r\n  getElementNumber(group: any): number | null {\r\n    return group.get(\"elementNumber\")?.value ?? null;\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    if (this.layoutForm.enabled) return;\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n\r\n    this.canvas?.getObjects()?.forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        this.canvas.remove(obj);\r\n      }\r\n    });\r\n\r\n    this.activeHighlight = null;\r\n    this.canvas?.requestRenderAll();\r\n  }\r\n\r\n  keepHighlightOnTop = () => {\r\n    if (!this.activeHighlight) return;\r\n    const objs = this.canvas.getObjects();\r\n    this.canvas.moveObjectTo(this.activeHighlight, objs.length - 1);\r\n  };\r\n\r\n  // In edit mode, when a fixture is clicked on the canvas, open the matching\r\n  // accordion item in the left panel, scroll it into view and highlight the\r\n  // fixture row so the user can locate it in the form quickly.\r\n  highlightFixtureInAccordion(fixtureData: any): void {\r\n    if (!fixtureData || this.layoutForm.disabled) return;\r\n\r\n    let accordionItemId: string;\r\n\r\n    if (fixtureData.fixtureType === \"wall\") {\r\n      const formIdx = this.getFormWalls.controls.findIndex(\r\n        (c) =>\r\n          c.get(\"elementNumber\")?.value === fixtureData.associatedElementNumber,\r\n      );\r\n      if (formIdx < 0) {\r\n        this.highlightedFixtureFormId = null;\r\n        return;\r\n      }\r\n      accordionItemId = `accordion-wall-${formIdx}`;\r\n    } else if (fixtureData.fixtureType === \"floor\") {\r\n      accordionItemId = \"accordion-floor\";\r\n    } else {\r\n      return;\r\n    }\r\n\r\n    this.highlightedFixtureFormId = fixtureData._id ?? null;\r\n\r\n    if (this.isLeftPanelCollapsed) {\r\n      this.togglePanel(\"left\", false);\r\n    }\r\n\r\n    this.bodyAccordion?.expand(accordionItemId);\r\n\r\n    setTimeout(() => {\r\n      const el = document.getElementById(accordionItemId);\r\n      el?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n    }, 350);\r\n  }\r\n\r\n  onChangeFixtureOnFeedbackPanel(\r\n    {\r\n      currentFixture,\r\n      action,\r\n    }: {\r\n      currentFixture?: string;\r\n      action?: \"next\" | \"previous\";\r\n    },\r\n    collapseTaskInfo: boolean = false,\r\n  ) {\r\n    let indexToSelect = currentFixture\r\n      ? this.allFixtureInstances.findIndex((f: any) => f._id === currentFixture)\r\n      : 0;\r\n\r\n    if (action === \"next\") {\r\n      if (indexToSelect == this.allFixtureInstances.length - 1) {\r\n        indexToSelect = 0;\r\n      } else {\r\n        indexToSelect++;\r\n      }\r\n    } else if (action === \"previous\") {\r\n      if (indexToSelect == 0) {\r\n        indexToSelect = this.allFixtureInstances.length - 1;\r\n      } else {\r\n        indexToSelect--;\r\n      }\r\n    } else if (!currentFixture && !action) {\r\n      indexToSelect = 0;\r\n    }\r\n\r\n    const fixtureIdToSelect = this.allFixtureInstances[indexToSelect]?._id;\r\n\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj.objType === \"fixture\" && obj.fixtureId === fixtureIdToSelect,\r\n      ) as fabric.Group | undefined;\r\n\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture);\r\n    this.selectFixtureOnCanvasClick(actionFixture, collapseTaskInfo);\r\n  }\r\n\r\n  revokeTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n    };\r\n\r\n    if (this.publishingState === \"layout\") {\r\n      payload.type = \"layout\";\r\n      // this.updateLayout()\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"layout-redo\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.type = \"layout\";\r\n      payload.redo = true;\r\n    } else if (this.publishingState === \"fixture\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.type = \"fixture\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"fixture-redo\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.type = \"fixture\";\r\n      payload.redo = true;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.type = \"vm\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.type = \"vm\";\r\n      payload.redo = true;\r\n    }\r\n    payload.taskId = this.taskInfo?.taskDetails.find(\r\n      (ele: any) => ele.type == payload.type,\r\n    )?.taskId;\r\n\r\n    const modalRef = this.modalService.open(StoreTaskRevokeComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\", // <-- Add a custom class here\r\n    });\r\n    modalRef.componentInstance.type = this.publishingState;\r\n    modalRef.componentInstance.inputData = payload;\r\n    modalRef.result.then((result) => {\r\n      if (result.status === \"submit\") {\r\n        let taskType = this.publishingState;\r\n        if (this.publishingState === \"vm-redo\") {\r\n          taskType = \"vm\";\r\n        }\r\n        if (this.publishingState === \"fixture-redo\") {\r\n          taskType = \"fixture\";\r\n        }\r\n        if (this.publishingState === \"layout-redo\") {\r\n          taskType = \"layout\";\r\n        }\r\n        if (result.comments && result.comments != \"\") {\r\n          let commentPayload = {\r\n            floorId: this.floorData._id,\r\n            planoId: this.floorData.planoId,\r\n            taskType: taskType,\r\n            comment: result.comments,\r\n          };\r\n          this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n            next: (res: any) => {},\r\n          });\r\n        }\r\n        this.apiService.revokeTask(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\") {\r\n              this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n              this.toastService.getSuccessToast(res?.message);\r\n            }\r\n          },\r\n          error: () => {\r\n            this.toastService.getErrorToast(\"Failed to publish task\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  publish() {\r\n    const modalRef = this.modalService.open(PublishPlanoModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n\r\n    modalRef.result.then((res: any) => {\r\n      if (res) {\r\n        const publishAsDraft = res.publishAsDraft;\r\n        let data = structuredClone(this.planoData);\r\n        data.floorId = this.floorData._id;\r\n        data.floorData = this.floorData;\r\n        delete data.floors;\r\n        delete data.floorData.masterTemplates;\r\n        data.revisionName = res.revisionName;\r\n        data.isActive = !publishAsDraft;\r\n        this.apiService.publish(data).subscribe({\r\n          next: (apiRes: any) => {\r\n            if (apiRes && apiRes.code == 200) {\r\n              if (!publishAsDraft) {\r\n                this.floorData.verificationStatus = true;\r\n              }\r\n              this.toastService.getSuccessToast(apiRes?.message);\r\n            }\r\n          },\r\n          error: (err: any) => {\r\n            console.log(err);\r\n            this.toastService.getErrorToast(\"Failed to publish plano\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  async goToStoreTourPage() {\r\n    if (this.isStoreTourLoading) return;\r\n    this.isStoreTourLoading = true;\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getPlanoStoreVideoParams({\r\n          storeId: this.planoData.storeId,\r\n        }),\r\n      );\r\n\r\n      if (res?.data) {\r\n        let params = res?.data;\r\n        const urlTree = this.router.createUrlTree([\"/manage/trax/gallery\"], {\r\n          queryParams: params,\r\n        });\r\n        const url = this.router.serializeUrl(urlTree);\r\n        window.open(url, \"_blank\");\r\n      } else {\r\n        this.openNoVideoFoundModal();\r\n        return;\r\n      }\r\n    } catch (error) {\r\n      this.openNoVideoFoundModal();\r\n      console.log(\"@@ ~ goToStoreTourPage [ERR]:\", error);\r\n    } finally {\r\n      this.isStoreTourLoading = false;\r\n    }\r\n  }\r\n\r\n  async openNoVideoFoundModal() {\r\n    try {\r\n      await this.modalService.open(this.noStoreVideoModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  goToStoreCameraPage() {\r\n    const urlTree = this.router.createUrlTree([\"/manage/stores/cameras\"], {\r\n      queryParams: {\r\n        storeId: this.planoData.storeId,\r\n      },\r\n    });\r\n\r\n    const url = this.router.serializeUrl(urlTree);\r\n    window.open(url, \"_blank\");\r\n  }\r\n\r\n  getStoreList(planoId?: string) {\r\n    this.apiService\r\n      .getPlanoStoreList(this.clientId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.storeList = res.data;\r\n            this.storeList = this.storeList.map((ele: any) => {\r\n              return { ...ele, storeName: ele.storeName.toUpperCase() };\r\n            });\r\n            if (planoId) {\r\n              this.selectedStoreName = this.storeList.find(\r\n                (ele: any) => ele.planoId.toString() == planoId.toString(),\r\n              );\r\n            }\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async onSelected(event: any) {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    const newParams = new URLSearchParams(window.location.search);\r\n    newParams.set(\"planoId\", event.planoId);\r\n    newParams.set(\"floorId\", event.floorId);\r\n\r\n    this.location.replaceState(window.location.pathname, newParams.toString());\r\n    this.isRightPanelCollapsed = true;\r\n    this.isLeftPanelCollapsed = true;\r\n    this.wallCount = this.clCount = 0;\r\n    this.showLayout = false;\r\n    await this.getStoreFixtures(event._id);\r\n  }\r\n\r\n  async applyPIDLogics() {}\r\n\r\n  async onClickApplyLogics() {\r\n    try {\r\n      await this.modalService.open(this.applyLogicsModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  async onClickApproveLayout() {\r\n    try {\r\n      await this.modalService.open(this.approveLayoutModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  async approveLayout() {\r\n    this.isButtonLoading = true;\r\n\r\n    try {\r\n      const floorId = this.floorData._id;\r\n\r\n      const publishData = {\r\n        ...structuredClone(this.planoData),\r\n        floorId,\r\n        floorData: {\r\n          ...this.floorData,\r\n          masterTemplates: undefined,\r\n        },\r\n        floors: undefined,\r\n      };\r\n      await Promise.all([\r\n        firstValueFrom(\r\n          this.apiService.updateStorePlano({\r\n            floorId,\r\n            data: this.floorData,\r\n          }),\r\n        ),\r\n        firstValueFrom(this.apiService.publish(publishData)),\r\n        firstValueFrom(this.apiService.approvePlanoLayout(floorId)),\r\n      ]);\r\n\r\n      this.toastService.getSuccessToast(\"Layout approved successfully\");\r\n      this.modalService.dismissAll();\r\n    } catch (error) {\r\n      console.error(\"approveLayout failed:\", error);\r\n      this.toastService.getErrorToast(\"Failed to approve layout\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"manage-plano\">\r\n  <!-- Loading State -->\r\n  <div *ngIf=\"isPageLoading\" class=\"row\">\r\n    <div class=\"col-12 m-0\">\r\n      <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n    </div>\r\n    <div class=\"col-3\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n    <div class=\"col-6\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n    <div class=\"col-3\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Content -->\r\n  <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n    <!-- Header Accordion -->\r\n    <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n      <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n        <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n          <div class=\"d-flex gap-4 align-items-center\">\r\n            <div class=\"d-flex align-items-center\">\r\n              <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n                <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n              </div>\r\n              <div>\r\n                <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n                  [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n                </lib-select-plano>\r\n              </div>\r\n            </div>\r\n\r\n            <lib-reactive-select *ngIf=\"floorsList.length && !isPageLoading\" [formControl]=\"selectedFloorId\"\r\n              [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n            </lib-reactive-select>\r\n\r\n            <div class=\"cus-btn\" [class.disabled-click]=\"isStoreTourLoading\" (click)=\"goToStoreTourPage()\">\r\n              View store tour\r\n\r\n              <svg *ngIf=\"!isStoreTourLoading\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\r\n                xmlns=\"http://www.w3.org/2000/svg\">\r\n                <g clip-path=\"url(#clip0_408_16498)\">\r\n                  <path\r\n                    d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\"\r\n                    stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                  <path d=\"M5 4L8 6L5 8V4Z\" stroke=\"#33B5FF\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </g>\r\n                <defs>\r\n                  <clipPath id=\"clip0_408_16498\">\r\n                    <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                  </clipPath>\r\n                </defs>\r\n              </svg>\r\n              <span *ngIf=\"isStoreTourLoading\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n                aria-hidden=\"true\"></span>\r\n\r\n            </div>\r\n            <div class=\"cus-btn\" (click)=\"goToStoreCameraPage()\">\r\n              View camera\r\n\r\n              <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <g clip-path=\"url(#clip0_422_36321)\">\r\n                  <path\r\n                    d=\"M9 6.5V9.5C9 9.76522 8.89464 10.0196 8.70711 10.2071C8.51957 10.3946 8.26522 10.5 8 10.5H2.5C2.23478 10.5 1.98043 10.3946 1.79289 10.2071C1.60536 10.0196 1.5 9.76522 1.5 9.5V4C1.5 3.73478 1.60536 3.48043 1.79289 3.29289C1.98043 3.10536 2.23478 3 2.5 3H5.5M7.5 1.5H10.5M10.5 1.5V4.5M10.5 1.5L5 7\"\r\n                    stroke=\"#00A3FF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </g>\r\n                <defs>\r\n                  <clipPath id=\"clip0_422_36321\">\r\n                    <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                  </clipPath>\r\n                </defs>\r\n              </svg>\r\n\r\n\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"d-flex align-items-center gap-4\">\r\n            <div *ngIf=\"!editFixture\" class=\"updateClass\"\r\n                [ngbTooltip]=\"floorData?.updatedByName ? 'Updated by ' + floorData.updatedByName : null\">\r\n                Last Update: {{ floorData?.lastUpdateIso | date:'d MMM yyyy, hh:mm a' }}\r\n            </div>\r\n\r\n<!-- Source CAD button temporarily disabled\r\n            <button *ngIf=\"cadSource.hasSource(floorData?.cadFiles)\" type=\"button\"\r\n                class=\"btn btn-outline text-nowrap d-flex align-items-center gap-2\"\r\n                ngbTooltip=\"View the source CAD drawing\" (click)=\"openSourceCad()\">\r\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <path d=\"M9.5 1.5H4a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5l-3.5-3.5Z\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>\r\n                  <path d=\"M9.5 1.5V5H13M6 8.5l2 2 2-2M8 10.5V7\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                </svg>\r\n                Source CAD\r\n            </button>\r\n-->\r\n\r\n\r\n\r\n            <div class=\"d-flex gap-4 align-items-center\">\r\n              <!-- Edit Fixture Mode -->\r\n              <ng-container *ngIf=\"editFixture\">\r\n                <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onFixturePageCancel()\">\r\n                  Cancel\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n                  Save & Close\r\n                </button>\r\n              </ng-container>\r\n\r\n              <!-- Normal Mode: per-task publish buttons live inside their respective cards below.\r\n                   Top-right shows the final overall \"Publish\" once layout+fixture+vm are approved.\r\n                   When a zone task exists and isn't Approved yet, the button stays visible but\r\n                   disabled (so the store can't be published until zone verification completes).\r\n                   Legacy stores without a zone task are unblocked immediately. -->\r\n              <ng-container *ngIf=\"showTopPublish\">\r\n                <div class=\"indicator completed\" *ngIf=\"floorData?.verificationStatus\">Published</div>\r\n                <button *ngIf=\"!floorData?.verificationStatus\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n                  (click)=\"publish()\" [disabled]=\"topPublishDisabled\">\r\n                  Publish\r\n                </button>\r\n              </ng-container>\r\n\r\n\r\n\r\n              <!-- Revoke buttons live inside their respective cards (Layout / Fixtures / VM / Zone) below. -->\r\n\r\n              <button ngbAccordionButton></button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <div ngbAccordionCollapse>\r\n          <div ngbAccordionBody>\r\n            <ng-template>\r\n            <div id=\"header\" class=\"row mx-0 gap-3\">\r\n              <!-- Plano Completion -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <h3 class=\"d-flex align-items-center gap-2\">\r\n                  Plano Completion %\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n                    ngbTooltip=\"% of overall planogram completion\">\r\n                    <g clip-path=\"url(#clip0_1517_129805)\">\r\n                      <path\r\n                        d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_1517_129805\">\r\n                        <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </h3>\r\n                <div class=\"row align-items-center mt-2\">\r\n                  <div class=\"col-9\">\r\n                    <div class=\"progress\" style=\"height: 4px\">\r\n                      <div class=\"progress-bar\" [ngClass]=\"\r\n                          taskInfo?.planoProgress <= 50\r\n                            ? 'bg-warning'\r\n                            : taskInfo?.planoProgress === 75\r\n                            ? 'bg-primary'\r\n                            : 'bg-success'\r\n                        \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n                        [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Layout -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\"\r\n                      [ngbTooltip]=\"taskStyle.layout.email ? 'Assigned to ' + taskStyle.layout.email : null\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.layout.name }}\r\n                    </div>\r\n                  </div>\r\n                  <!-- Layout actions disabled for now — no layout-related actions are needed.\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594lay)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594lay\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                  -->\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Fixtures -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\"\r\n                      [ngbTooltip]=\"taskStyle.fixture.email ? 'Assigned to ' + taskStyle.fixture.email : null\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.fixture.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594fix)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594fix\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Visual Merchandise -->\r\n              <!--\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex flex-column gap-2\">\r\n                  <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n                    <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n                    <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.vm.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594vm)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594vm\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n              -->\r\n\r\n              <!-- Zone Verification -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3>Zone Verification</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\"\r\n                      [ngbTooltip]=\"zoneTaskStyle.email ? 'Assigned to ' + zoneTaskStyle.email : null\">\r\n                      <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      {{ zoneTaskStyle.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n                    class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n                    Publish Task\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n                    class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n                    Publish Redo\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594z)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594z\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Body -->\r\n    <div id=\"body\" class=\"row\">\r\n      <!-- Left Column -->\r\n      <div [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture  }\">\r\n        <div class=\"s-card\">\r\n          <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n            <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n              <!-- Walls Section -->\r\n              <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n                <ng-container formArrayName=\"walls\">\r\n                  <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n                    <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\" class=\"mb-5\">\r\n                      <div class=\"d-flex\" ngbAccordionHeader>\r\n                        <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                          <div class=\"d-flex align-items-center\">\r\n                            <span class=\"me-2 wall-label\">\r\n                              {{ group.get(\"elementType\")?.value | titlecase }} {{ group.get(\"elementNumber\")?.value }}\r\n                            </span>\r\n\r\n                            @if(layoutForm.enabled){\r\n                              <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n                                (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                    d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n                                    fill=\"#475467\" stroke=\"#475467\" stroke-width=\"0.00064\" />\r\n                                </svg>\r\n                              </span>\r\n                              <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n                                (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <g clip-path=\"url(#clip0_62_8)\">\r\n                                    <path\r\n                                      d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n                                      fill=\"#475467\" />\r\n                                  </g>\r\n                                  <defs>\r\n                                    <clipPath id=\"clip0_62_8\">\r\n                                      <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                    </clipPath>\r\n                                  </defs>\r\n                                </svg>\r\n                              </span>\r\n                              <span class=\"me-1\" ngbTooltip=\"Remove this wall and its fixtures.\"\r\n                                (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <g clip-path=\"url(#clip0_63_25)\">\r\n                                    <path\r\n                                      d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n                                      fill=\"#F32B2B\" />\r\n                                  </g>\r\n                                  <defs>\r\n                                    <clipPath id=\"clip0_63_25\">\r\n                                      <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                    </clipPath>\r\n                                  </defs>\r\n                                </svg>\r\n                              </span>\r\n                            }\r\n                          </div>\r\n                          <div class=\"divider\"></div>\r\n                        </button>\r\n                      </div>\r\n\r\n                      <div ngbAccordionCollapse>\r\n                        <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                          <ng-template>\r\n                            <div style=\"min-height: 50px\" dndDropzone (dndDrop)=\"onDrop($event, i)\">\r\n                              <!-- Fixtures -->\r\n                              <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n                                <div formArrayName=\"fixtures\">\r\n                                  <ng-container *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n                                    <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n                                      [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [dndEffectAllowed]=\"'all'\"\r\n                                      class=\"row g-0 mb-5 fixture-row\"\r\n                                      [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n                                      [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n                                      <div class=\"col-1\">\r\n                                        <div class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                          <svg dndDragImageRef\r\n                                            [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n                                            width=\"25px\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                            <path\r\n                                              d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                              fill=\"grey\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n\r\n                                      <div class=\"col-10\">\r\n                                        <lib-reactive-select formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n                                          [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n                                          [subTextField]=\"'subtext'\" [search]=\"true\">\r\n                                        </lib-reactive-select>\r\n                                      </div>\r\n\r\n                                      <div class=\"col-1\">\r\n                                        <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                          [class.disabled-click]=\"layoutForm.disabled\">\r\n                                          <svg (click)=\"deleteFixture('wall', j, i)\"\r\n                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\"\r\n                                            viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </ng-container>\r\n                                </div>\r\n                              </ng-container>\r\n\r\n                              <div class=\"d-flex justify-content-end\">\r\n                                <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                  (click)=\"addNewFixture('wall', i)\">\r\n                                  Add fixture\r\n                                </a>\r\n                              </div>\r\n\r\n                              <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                              <!-- Other Elements -->\r\n                              <ng-container *ngIf=\"getWallOtherElements(i).controls.length\">\r\n                                <div formArrayName=\"otherElements\">\r\n                                  <ng-container *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n                                    <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                      <div class=\"col-11\">\r\n                                        <label class=\"form-label mb-1\">Element {{ j + 1 }}</label>\r\n\r\n                                        <!-- Dropdown bound to 'type' -->\r\n                                        <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                                          [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n                                        </lib-reactive-select>\r\n\r\n                                        <!-- Show custom text input only when 'Others' is selected -->\r\n                                        <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n                                          class=\"form-control mt-2\" formControlName=\"customName\"\r\n                                          placeholder=\"Enter custom element name\" />\r\n                                      </div>\r\n\r\n                                      <div class=\"col-1\">\r\n                                        <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                          [class.disabled-click]=\"layoutForm.disabled\">\r\n                                          <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\"\r\n                                            viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </ng-container>\r\n                                </div>\r\n                              </ng-container>\r\n\r\n                              <div class=\"d-flex justify-content-end\">\r\n                                <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                  (click)=\"addNewOtherElements('wall', i)\">\r\n                                  Add element\r\n                                </a>\r\n                              </div>\r\n                            </div>\r\n                          </ng-template>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </ng-container>\r\n                </ng-container>\r\n              </ng-container>\r\n\r\n              <ng-template #addWallAction>\r\n                <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                  class=\"btn btn-secondary w-100 p-2\">\r\n                  Insert new wall\r\n                </button>\r\n              </ng-template>\r\n\r\n              <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n              <!-- Floor Section -->\r\n              <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n                <div class=\"d-flex\" ngbAccordionHeader>\r\n                  <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                    <span class=\"me-2 wall-label\">Floor</span>\r\n                    <div class=\"divider\"></div>\r\n                  </button>\r\n                </div>\r\n\r\n                <div ngbAccordionCollapse>\r\n                  <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                    <ng-template>\r\n                      <div style=\"min-height: 50px\" dndDropzone (dndDrop)=\"onDrop($event, 'floor')\">\r\n                        <!-- Floor Fixtures -->\r\n                        <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n                          <div formArrayName=\"floorFixtures\">\r\n                            <ng-container *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n                              <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n                                [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [dndEffectAllowed]=\"'all'\"\r\n                                [dndDisableDragIf]=\"layoutForm.disabled\"\r\n                                class=\"row g-0 mb-5 fixture-row\"\r\n                                [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n                                <div class=\"col-1\">\r\n                                  <div class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                    <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n                                      viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                      <path\r\n                                        d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                        fill=\"grey\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n\r\n                                <div class=\"col-10\">\r\n                                  <lib-reactive-select formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n                                    [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n                                    [search]=\"true\" [subTextField]=\"'subtext'\">\r\n                                  </lib-reactive-select>\r\n                                </div>\r\n\r\n                                <div class=\"col-1\">\r\n                                  <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                    <svg (click)=\"deleteFixture('floor', j)\"\r\n                                      style=\"cursor: pointer; margin-bottom: 18px\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                      width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                      <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                        stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </ng-container>\r\n                          </div>\r\n                        </ng-container>\r\n\r\n                        <div class=\"d-flex justify-content-end\">\r\n                          <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                            (click)=\"addNewFixture('floor')\">\r\n                            Add fixture\r\n                          </a>\r\n                        </div>\r\n\r\n                        <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                        <!-- Floor Other Elements -->\r\n                        <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n                          <div formArrayName=\"floorOtherElements\">\r\n                            <ng-container *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n                              <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                <div class=\"col-11\">\r\n                                  <label class=\"form-label mb-1\">Element {{ j + 1 }}</label>\r\n\r\n                                  <!-- Dropdown for type -->\r\n                                  <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                                    [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n                                  </lib-reactive-select>\r\n\r\n                                  <!-- Conditional input for custom name -->\r\n                                  <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n                                    class=\"form-control mt-2\" formControlName=\"customName\"\r\n                                    placeholder=\"Enter custom element name\" />\r\n                                </div>\r\n\r\n                                <div class=\"col-1\">\r\n                                  <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                    <svg (click)=\"removeOtherElement('floor', j)\"\r\n                                      style=\"cursor: pointer; margin-bottom: 18px\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                      width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                      <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                        stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </ng-container>\r\n                          </div>\r\n                        </ng-container>\r\n\r\n                        <div class=\"d-flex justify-content-end\">\r\n                          <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                            (click)=\"addNewOtherElements('floor')\">\r\n                            Add element\r\n                          </a>\r\n                        </div>\r\n                      </div>\r\n                    </ng-template>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </form>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Center Column -->\r\n      <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n        <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n          <!-- Canvas View -->\r\n          <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n            <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n          </div>\r\n\r\n          <!-- Tree View -->\r\n          <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n            <store-plano-tree-view [allFixture]=\"allFixtures\"></store-plano-tree-view>\r\n          </div>\r\n\r\n          <!-- Top Controls -->\r\n          <div style=\"top: 24px; left: 26px; position: absolute;\" id=\"segment-btn\" class=\"pb-5\">\r\n            <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n              <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n                <li class=\"nav-item flex-fill\">\r\n                  <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n                    (click)=\"selectedView = 'detail'\">\r\n                    Detail View\r\n                  </button>\r\n                </li>\r\n                <li class=\"nav-item flex-fill\">\r\n                  <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\"\r\n                    (click)=\"selectedView = 'tree'\">\r\n                    Tree View\r\n                  </button>\r\n                </li>\r\n              </ul>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- PID Allocation -->\r\n          <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n            class=\"position-absolute\">\r\n            <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n              Apply Logics\r\n            </button>\r\n          </div> -->\r\n\r\n          <!-- Entrance Button -->\r\n          <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n            class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n            <button type=\"button\" style=\"padding: 9px 19px !important;\"\r\n              class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n              Add Entrance\r\n            </button>\r\n          </div>\r\n\r\n          <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n            <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              (click)=\"cancelEdit()\">\r\n              Cancel\r\n            </button>\r\n          </div>\r\n\r\n\r\n          <!-- Edit Button -->\r\n          <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n            [disabled]=\"disableEdit || ['taskAssigned'].includes(taskStyle.fixture.class) || (taskStyle.fixture.class == 'reviewPending' && !showLayout) || ['taskAssigned'].includes(zoneTaskStyle.class) || (zoneTaskStyle.class == 'reviewPending' && !showLayout)\"\r\n            style=\"top: 24px; right: 164px\" type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"onClickEdit()\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_1322_5325)\">\r\n                <path\r\n                  d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                  stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_1322_5325\">\r\n                  <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n            Edit\r\n          </button>\r\n\r\n          <!-- Rotate Button -->\r\n          <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"rotateCanvas(canvas,90)\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n              <path\r\n                d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                fill=\"#1D2939\" />\r\n              <path d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n          </button>\r\n\r\n          <!-- Submit Button -->\r\n          <button *ngIf=\"!layoutForm.disabled\"\r\n            style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n            type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n            [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n            <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n              aria-hidden=\"true\"></span>\r\n            Save\r\n          </button>\r\n\r\n          <!-- Download Button -->\r\n          <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"downloadCanvas()\">\r\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n              stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                stroke-width=\"0.384\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path\r\n                  d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                  fill=\"#1D2939\"></path>\r\n                <path\r\n                  d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                  fill=\"#1D2939\"></path>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- Panel Collapse Handlers -->\r\n        <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n          <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n\r\n        <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n          <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Edit Fixture Body -->\r\n      <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n        <div id=\"edit-body\" class=\"row\">\r\n          <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n                [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Basic details\r\n              </a>\r\n            </li>\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n                [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Products\r\n              </a>\r\n            </li>\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n                [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Visual Merchandise\r\n              </a>\r\n            </li>\r\n          </ul>\r\n\r\n          <div class=\"col\">\r\n            <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n              <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n                [isSubmitted]=\"submitFixture\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n                [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-basic-details>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n              <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n                [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n                (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-products>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n              <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n                [revertOnEdit]=\"shouldRevertOnEdit\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-vms>\r\n            </ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n        [style]=\"{'min-width': isRightPanelCollapsed ? '0' : editFixture || showLayout ? '340px' : activeFeedbackTab === 'fixture' ? '1050px' : '750px'}\">\r\n        <ng-container *ngTemplateOutlet=\"feedbackCol\"></ng-container>\r\n      </div>\r\n    </div>\r\n\r\n  </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n  <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n    <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n      <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n    } -->\r\n\r\n    <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n      [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n          class=\"nav-link\" role=\"tab\">\r\n          Fixture Verification\r\n        </a>\r\n      </li>\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n          class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n          Zone Verification\r\n          <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n            {{ zonePendingCount }}\r\n          </span>\r\n        </a>\r\n      </li>\r\n    </ul>\r\n\r\n    <div class=\"feedback-tab-content\">\r\n      <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n        <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n          <div class=\"card-body\">\r\n\r\n            <!-- Title -->\r\n            <div class=\"storeTitle mb-3\">Store response</div>\r\n            <hr>\r\n\r\n            <!-- Section Header -->\r\n            <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n              <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n              <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n              <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n            </div>\r\n            <div class=\"smallText text-muted d-block mb-4\">\r\n              Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n            </div>\r\n\r\n\r\n            <div *ngIf=\"toggle\" class=\"mt-10\">\r\n              <!-- Column Headings -->\r\n              <div class=\"row text-muted small fw-semibold mb-5\">\r\n                <div class=\"col-6\"></div>\r\n                <div class=\"col-3 text-center lightText\">Before</div>\r\n                <div class=\"col-3 text-center lightText\">After</div>\r\n              </div>\r\n\r\n              <!-- Wall Fixtures -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Wall Fixtures</div>\r\n                <div class=\"col-3 text-center\">\r\n                  {{wallCount - clCount}}\r\n                </div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-up\"\r\n                    *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n                  <i class=\"bi bi-arrow-down\"\r\n                    *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Euro Centre Fixtures -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Euro Centre Fixtures</div>\r\n                <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-down\"\r\n                    *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n                  <i class=\"bi bi-arrow-up\"\r\n                    *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n                  {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Contact Lenses -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Contact Lenses</div>\r\n                <div class=\"col-3 text-center\">{{clCount}}</div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n                  <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n                  {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n                </div>\r\n              </div>\r\n\r\n              <hr>\r\n\r\n              <!-- Total Section -->\r\n              <div class=\"row align-items-center\">\r\n                <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n                <div class=\"col-3 text-center totalText\">\r\n                  <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n                </div>\r\n                <div class=\"col-3 text-center totalText\">\r\n                  <div class=\"total-box\"\r\n                    [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n                    {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n                <div id=\"fixture-comments\" class=\"mt-10\">\r\n                  <h5 class=\"mb-2\">Comments</h5>\r\n\r\n                  <div class=\"log-block\"\r\n                    *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n                    <!-- User avatar -->\r\n                    <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                      <path\r\n                        d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                        stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n\r\n                    <div class=\"d-flex gap-1 flex-column\">\r\n\r\n                      <div class=\"d-flex gap-1 flex-column\">\r\n                        <h4>{{c?.userName}}</h4>\r\n                        <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n                      </div>\r\n\r\n                      @if(c?.responsetype === 'comment'){\r\n                        <h5>{{c?.comment}}</h5>\r\n                      }\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n\r\n          </div>\r\n        </div>\r\n\r\n        <lib-verification-feedback [floorData]=\"floorData\"\r\n          [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture}\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n          (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" [totalFixtures]=\"allFixtureInstances\"\r\n          [cdn]=\"cdnUrl\" (action)=\"handleFeedbackAction($event)\" [showAction]=\"!editFixture\"\r\n          *ngIf=\"!showLayout\"></lib-verification-feedback>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n        <lib-zone-verification-feedback [floorData]=\"floorData\" [feedbackDetails]=\"selectedFixtureFeedback\"\r\n          [zoneTask]=\"zoneFeedback?.zoneVerificationTask\" [zoneFeedback]=\"selectedZoneFeedback\"\r\n          [totalFixtures]=\"allFixtureInstances\" [cdn]=\"cdnUrl\" [showAction]=\"!editFixture\"\r\n          (changeFixture)=\"onChangeFixtureOnFeedbackPanel($event,true)\" (action)=\"handleFeedbackAction($event)\"\r\n          [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\"></lib-zone-verification-feedback>\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n  <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer w-100 p-4 rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke mt-0 animate title\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n  <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #noStoreVideo let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">No Store Video Found</h2>\r\n      <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n      <p>This will analyze the current layout and apply the pre-defined fixture logics.</p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end gap-3\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">Approve layout/plan</h2>\r\n      <p>\r\n        Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\r\n      </p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end gap-3\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n        <span *ngIf=\"!isButtonLoading\">Approve</span>\r\n        <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n          <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n        </svg>\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-cannot-perform',\r\n  templateUrl: './cannot-perform.component.html',\r\n  styleUrl: './cannot-perform.component.scss'\r\n})\r\nexport class CannotPerformComponent {\r\n  @Input() title: string = 'Navigate without saving';\r\n  @Input() description: string = 'You have unsaved changes, Leaving without saving might loss all changes.';\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n  ) { }\r\n\r\n  ok() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"d-flex flex-start mb-5\">\r\n    <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n      <path\r\n        d=\"M27.9998 24.0002V28.0002M27.9998 32.0002H28.0098M26.2898 18.8602L17.8198 33.0002C17.6451 33.3026 17.5527 33.6455 17.5518 33.9947C17.5508 34.3439 17.6413 34.6873 17.8142 34.9907C17.9871 35.2941 18.2365 35.547 18.5375 35.7241C18.8385 35.9012 19.1806 35.9964 19.5298 36.0002H36.4698C36.819 35.9964 37.1611 35.9012 37.4621 35.7241C37.7631 35.547 38.0124 35.2941 38.1854 34.9907C38.3583 34.6873 38.4488 34.3439 38.4478 33.9947C38.4468 33.6455 38.3544 33.3026 38.1798 33.0002L29.7098 18.8602C29.5315 18.5663 29.2805 18.3233 28.981 18.1547C28.6814 17.9861 28.3435 17.8975 27.9998 17.8975C27.656 17.8975 27.3181 17.9861 27.0186 18.1547C26.7191 18.3233 26.468 18.5663 26.2898 18.8602Z\"\r\n        stroke=\"#DC6803\"\r\n        stroke-width=\"2\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-primary x-4\" (click)=\"ok()\">Ok</button>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-exit-confirmation',\r\n  templateUrl: './exit-confirmation.component.html',\r\n  styleUrl: './exit-confirmation.component.scss'\r\n})\r\nexport class ExitConfirmationComponent {\r\n  @Input() title: string = 'Navigate without saving';\r\n  @Input() description: string = 'You have unsaved changes, Leaving without saving might loss all changes.';\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n  ) { }\r\n\r\n  onExit() {\r\n    this.activeModal.close('notOk');\r\n  }\r\n\r\n  onSave() {\r\n    this.activeModal.close('ok');\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"d-flex flex-start mb-5\">\r\n    <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n      <path\r\n        d=\"M27.9998 24.0002V28.0002M27.9998 32.0002H28.0098M26.2898 18.8602L17.8198 33.0002C17.6451 33.3026 17.5527 33.6455 17.5518 33.9947C17.5508 34.3439 17.6413 34.6873 17.8142 34.9907C17.9871 35.2941 18.2365 35.547 18.5375 35.7241C18.8385 35.9012 19.1806 35.9964 19.5298 36.0002H36.4698C36.819 35.9964 37.1611 35.9012 37.4621 35.7241C37.7631 35.547 38.0124 35.2941 38.1854 34.9907C38.3583 34.6873 38.4488 34.3439 38.4478 33.9947C38.4468 33.6455 38.3544 33.3026 38.1798 33.0002L29.7098 18.8602C29.5315 18.5663 29.2805 18.3233 28.981 18.1547C28.6814 17.9861 28.3435 17.8975 27.9998 17.8975C27.656 17.8975 27.3181 17.9861 27.0186 18.1547C26.7191 18.3233 26.468 18.5663 26.2898 18.8602Z\"\r\n        stroke=\"#DC6803\"\r\n        stroke-width=\"2\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onExit()\">Leave Without Saving</button>\r\n    <button type=\"button\" class=\"btn btn-danger px-4\" (click)=\"onSave()\">Save</button>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: \"lib-variant-popup\",\r\n  templateUrl: \"./variant-popup.component.html\",\r\n  styleUrl: \"./variant-popup.component.scss\",\r\n})\r\nexport class VariantPopupComponent {\r\n  @Input() title: string = \"Create Variant\";\r\n  @Input() description: string = \"Are you sure you want to create variant ?\";\r\n\r\n  constructor(private activeModal: NgbActiveModal) {}\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onComplete() {\r\n    this.activeModal.close(\"ok\");\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"mb-4\">\r\n    @if(title == 'Create Variant') {\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n        <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n        <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n        <path d=\"M29 18L19 30H28L27 38L37 26H28L29 18Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>\r\n    }\r\n    @else {\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"><rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"></rect><g clip-path=\"url(#clip0_5545_6743)\"><path d=\"M13.333 20.0007H12.6663C12.3127 20.0007 11.9736 19.8602 11.7235 19.6101C11.4735 19.3601 11.333 19.0209 11.333 18.6673V12.6673C11.333 12.3137 11.4735 11.9746 11.7235 11.7245C11.9736 11.4745 12.3127 11.334 12.6663 11.334H18.6663C19.02 11.334 19.3591 11.4745 19.6092 11.7245C19.8592 11.9746 19.9997 12.3137 19.9997 12.6673V13.334M17.333 16.0007H23.333C24.0694 16.0007 24.6663 16.5976 24.6663 17.334V23.334C24.6663 24.0704 24.0694 24.6673 23.333 24.6673H17.333C16.5966 24.6673 15.9997 24.0704 15.9997 23.334V17.334C15.9997 16.5976 16.5966 16.0007 17.333 16.0007Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></g><rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"></rect><defs><clipPath id=\"clip0_5545_6743\"><rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(10 10)\"></rect></clipPath></defs></svg>\r\n    }\r\n  </div>\r\n  <h3 class=\"mb-4\">{{title}}</h3>\r\n\r\n  <p [innerHTML]=\"description\"></p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onComplete()\">{{title == 'Create Variant' ? 'Create variant' : 'Duplicate'}}</button>\r\n  </div>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n  name: 'timeAgo',\r\n  standalone: true\r\n})\r\nexport class TimeAgoPipe implements PipeTransform {\r\n\r\n  transform(value: string | Date | null | undefined): string {\r\n    if (!value) return ' - ';\r\n    const now = new Date();\r\n    const input = new Date(value);\r\n    const diffMs = now.getTime() - input.getTime();\r\n\r\n    const diffMinutes = Math.floor(diffMs / (1000 * 60));\r\n    const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\r\n    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\r\n\r\n    if (diffMinutes < 1) {\r\n      return 'Just now';\r\n    } else if (diffMinutes <= 30) {\r\n      return 'Few minutes ago';\r\n    } else if (diffHours === 1) {\r\n      return '1 hour ago';\r\n    } else if (diffHours === 2) {\r\n      return '2 hours ago';\r\n    } else if (this.isToday(input)) {\r\n      return 'Today';\r\n    } else if (this.isYesterday(input)) {\r\n      return 'Yesterday';\r\n    } else if (diffDays === 2) {\r\n      return '2 days ago';\r\n    } else {\r\n      return this.formatDate(input); // fallback to DD/MM/YYYY\r\n    }\r\n  }\r\n\r\n  private isToday(date: Date): boolean {\r\n    const today = new Date();\r\n    return date.getDate() === today.getDate() &&\r\n      date.getMonth() === today.getMonth() &&\r\n      date.getFullYear() === today.getFullYear();\r\n  }\r\n\r\n  private isYesterday(date: Date): boolean {\r\n    const yesterday = new Date();\r\n    yesterday.setDate(yesterday.getDate() - 1);\r\n    return date.getDate() === yesterday.getDate() &&\r\n      date.getMonth() === yesterday.getMonth() &&\r\n      date.getFullYear() === yesterday.getFullYear();\r\n  }\r\n\r\n  private formatDate(date: Date): string {\r\n    const day = date.getDate().toString().padStart(2, '0');\r\n    const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n    const year = date.getFullYear();\r\n    return `${day}/${month}/${year}`;\r\n  }\r\n}\r\n","import { Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { distinctUntilChanged, filter, map } from 'rxjs/operators';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { FixtureTemplateDetails } from '../../interfaces/fixture-template.interface';\r\nimport { PlanoDataService } from '../../services/plano-data.service';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { DeleteConfirmationComponent } from '../popups/delete-confirmation/delete-confirmation.component';\r\nimport { CannotPerformComponent } from '../popups/cannot-perform/cannot-perform.component';\r\nimport { CanExitGuard } from '../../functions/exit.guard';\r\nimport { ExitConfirmationComponent } from '../popups/exit-confirmation/exit-confirmation.component';\r\nimport { deepEqual } from '../../functions/plano.function';\r\nimport { VariantPopupComponent } from '../popups/variant-popup/variant-popup.component';\r\nimport { Location } from '@angular/common';\r\nimport { LayoutEditConfirmationComponent } from '../popups/layout-edit-confirmation/layout-edit-confirmation.component';\r\n\r\n@Component({\r\n  selector: \"lib-fixture-template\",\r\n  templateUrl: \"./fixture-template.component.html\",\r\n  styleUrl: \"./fixture-template.component.scss\",\r\n})\r\nexport class FixtureTemplateComponent\r\n  implements OnInit, CanExitGuard, OnDestroy {\r\n  isPageLoading: boolean = true;\r\n  // isError: boolean = false;\r\n  isEditMode: boolean = false;\r\n\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n\r\n  selectedProductPlacementLevel: string = \"fixture\";\r\n  canGoBack: boolean = false;\r\n  url: any = [];\r\n\r\n  private destroy$ = new Subject<void>();\r\n  @ViewChild(\"errorModal\") errorModalRef!: TemplateRef<any>;\r\n\r\n\r\n  errorTabs: {\r\n    basicDetails: boolean;\r\n    products: boolean;\r\n    vms: boolean;\r\n  };\r\n  inputWidth: number = 50;\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private ps: PlanoDataService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private router: Router,\r\n    private toast: ToastService,\r\n    private ngbModal: NgbModal,\r\n    private location: Location\r\n  ) { }\r\n\r\n  async ngOnInit(): Promise<void> {\r\n\r\n    this.isPageLoading = true;\r\n    const params = this.route.snapshot.queryParams;\r\n    const id = params[\"templateId\"];\r\n\r\n    this.route.queryParamMap\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(params => {\r\n        this.isEditMode = params.get('isEdit') === 'true';\r\n      });\r\n\r\n    if (!id) {\r\n      this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n      return;\r\n    }\r\n\r\n    this.url = this.router.url.split('?')?.[0]?.split('/');\r\n\r\n    this.router.events.subscribe((event) => {\r\n      if (event instanceof NavigationEnd) {\r\n        if (event.urlAfterRedirects) {\r\n          this.url = event.urlAfterRedirects.split(\"?\")?.[0]?.split(\"/\");\r\n        }\r\n      }\r\n    });\r\n\r\n\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params[\"level\"]) {\r\n          this.selectedProductPlacementLevel = params[\"level\"];\r\n        }\r\n      });\r\n\r\n    this.route.queryParams\r\n      .pipe(\r\n        map((params) => params[\"templateId\"]),\r\n        filter((id) => !!id),\r\n        distinctUntilChanged(),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe(\r\n        async (id) => await this.ps.fetchFixtureTemplateDetails(id, true)\r\n      );\r\n\r\n    this.ps.fixtureTemplateDetails\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        this.fixtureTemplateDetails = data;\r\n        if (this.fixtureTemplateDetails) {\r\n          this.isPageLoading = false;\r\n          let length = this.fixtureTemplateDetails.fixtureName?.length || 10;\r\n          this.inputWidth = length * 10 + 10;\r\n        }\r\n      });\r\n  }\r\n\r\n  onFixtureNameChange(value: string) {\r\n    this.canGoBack = false;\r\n  }\r\n\r\n  async onDuplicate(type?: string) {\r\n    if (typeof type != \"undefined\") {\r\n      if (!(await this.confirmCreation())) return;\r\n    } else {\r\n      if (!(await this.confirmDuplicateCreation())) return;\r\n    }\r\n    this.storeBuilderService\r\n      .duplicateFixtureTemplate({\r\n        templateId: this.fixtureTemplateDetails?._id,\r\n      })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.toast.getSuccessToast(res.data.message);\r\n            this.router.navigate(\r\n              [\"/manage/planogram/fixture-template/basic-details\"],\r\n              { queryParams: { templateId: res?.data?.id, isEdit: false } }\r\n            );\r\n          }\r\n        },\r\n        error: (err) => {\r\n          if (typeof type != undefined) {\r\n            this.toast.getErrorToast(\r\n              err?.error?.error || \"Failed to duplicate Template\"\r\n            );\r\n            console.log(\"@@ ~ duplicateFixtureTemplate [err]:\", err);\r\n          } else {\r\n            this.toast.getErrorToast(\r\n              err?.error?.error || \"Failed to create variant\"\r\n            );\r\n            console.log(\"@@ ~ duplicateFixtureTemplate [err]:\", err);\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async confirmCreation(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(VariantPopupComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Create Variant\";\r\n    modelRef.componentInstance.description = `You’re about to create a variant from the master template “<b>${this.fixtureTemplateDetails?.fixtureName}</b>”. Once created, you can update it and map it to one or more stores for tracking and updates.`;\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async confirmDuplicateCreation(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(VariantPopupComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Duplicate fixture template\";\r\n    modelRef.componentInstance.description = `Are you sure you want to duplicate this Template?`;\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Delete fixture template\";\r\n    modelRef.componentInstance.description =\r\n      \"Are you sure you want to delete this Template?\";\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async onDelete() {\r\n    if (this.fixtureTemplateDetails?.store) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Can't delete Fixture template!`;\r\n      modelRef.componentInstance.description = `Since this template is live in \"${this.fixtureTemplateDetails?.store.length} planograms,\" deleting is not allowed.`;\r\n      return;\r\n    }\r\n\r\n    if (!(await this.confirmDeletion())) return;\r\n    this.storeBuilderService\r\n      .deleteFixtureTemplate({ templateId: this.fixtureTemplateDetails?._id })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.toast.getSuccessToast(res.message);\r\n            this.router.navigate([\"manage/planogram/fixture-templates\"]);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to delete Template\"\r\n          );\r\n          console.log(\"@@ ~ deleteFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async onSubmit(data: { status: string; goBack: boolean }) {\r\n    type TabKey = \"basic-details\" | \"products\" | \"vms\";\r\n    this.canGoBack = data.goBack;\r\n    this.errorTabs = this.ps.fixtureTemplateErrorTabs;\r\n\r\n    const currentTab = this.router.url.split(\"?\")[0].split(\"/\").pop() as TabKey;\r\n\r\n    const tabHasError: Record<TabKey, boolean> = {\r\n      \"basic-details\": this.errorTabs.basicDetails,\r\n      products: this.errorTabs.products,\r\n      vms: this.errorTabs.vms,\r\n    };\r\n\r\n    const otherTabsHaveErrors = Object.values(tabHasError).some(Boolean);\r\n    if (otherTabsHaveErrors && !tabHasError[currentTab]) {\r\n      await this.showErrorDialog();\r\n    }\r\n\r\n    this.ps.triggerFixtureTemplateFormSubmission(data);\r\n  }\r\n\r\n  async showErrorDialog(): Promise<void> {\r\n    this.canGoBack = false;\r\n\r\n    try {\r\n      await this.ngbModal.open(this.errorModalRef, { centered: true }).result;\r\n    } catch {\r\n      return;\r\n    }\r\n\r\n    const path = this.errorTabs.vms\r\n      ? \"vms\"\r\n      : this.errorTabs.products\r\n        ? \"products\"\r\n        : this.errorTabs.basicDetails\r\n          ? \"basic-details\"\r\n          : \"basic-details\"; // fallback\r\n\r\n    this.router.navigate([\"/manage/planogram/fixture-template\", path], {\r\n      queryParamsHandling: \"preserve\",\r\n    });\r\n  }\r\n\r\n\r\n  async confirmEdit(): Promise<boolean> {\r\n    if ((this.fixtureTemplateDetails?.storeCount ?? 0) <= 0) return true;\r\n    try {\r\n      const modelRef = this.ngbModal.open(LayoutEditConfirmationComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Edit template`;\r\n      modelRef.componentInstance.description = `You are about to edit an active template. Please review and publish the changes`;\r\n      return await modelRef.result.then<boolean>((result) => result === 'ok')\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async onClickEdit() {\r\n    if (!await this.confirmEdit()) return;\r\n    this.isEditMode = true;\r\n\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      replaceUrl: true,\r\n      queryParams: { isEdit: true },\r\n      queryParamsHandling: \"merge\",\r\n    });\r\n  }\r\n\r\n  async canDeactivate(): Promise<boolean> {\r\n    this.errorTabs = this.ps.fixtureTemplateErrorTabs;\r\n    if (this.canGoBack || !this.isEditMode) {\r\n      return true;\r\n    }\r\n    const { ignoreUpdate, ...originalTrimmed } =\r\n      this.ps.originalFixtureTemplateDetails!;\r\n    const { ignoreUpdate: _, ...currentTrimmed } = this.fixtureTemplateDetails!;\r\n\r\n    if (!deepEqual(originalTrimmed, currentTrimmed)) {\r\n      const result = await this.confirmExit();\r\n\r\n      if (result === null) {\r\n        return false;\r\n      }\r\n\r\n      if (result) {\r\n        this.canGoBack =\r\n          !this.errorTabs.basicDetails &&\r\n          !this.errorTabs.products &&\r\n          !this.errorTabs.vms;\r\n        await this.onSubmit({ status: \"draft\", goBack: this.canGoBack });\r\n        return false;\r\n      }\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  async confirmExit(): Promise<boolean | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ExitConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  findReplace() {\r\n    this.router.navigateByUrl(\r\n      `manage/planogram/findAndReplace?selectedFixture=${this.fixtureTemplateDetails?._id}`\r\n    );\r\n  }\r\n\r\n  goBack() {\r\n    this.location.back();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.ps.updateFixtureTemplateDetails(null);\r\n  }\r\n}","<section id=\"fixture-template\" *ngIf=\"!isPageLoading\">\r\n  <!-- Header section -->\r\n  <div class=\"header\">\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <button type=\"button\" class=\"btn btn-outline p-3\" (click)=\"goBack()\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n            stroke=\"#344054\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n      </button>\r\n      <span\r\n        [ngbTooltip]=\"fixtureTemplateDetails?.fixtureName\"\r\n        style=\"all: unset; font-size: 1.5rem; font-weight: bold; max-width: 600px\"\r\n        [ngClass]=\"(fixtureTemplateDetails?.fixtureName?.length ?? 0) > 200 ? 'ellipsis' : ''\"\r\n        >\r\n        {{ fixtureTemplateDetails?.fixtureName }}\r\n      </span>\r\n      <!-- *ngIf=\"!isEditMode\" -->\r\n      <!-- <input\r\n        class=\"m-0\"\r\n        [(ngModel)]=\"fixtureTemplateDetails!.fixtureName\"\r\n        (ngModelChange)=\"onFixtureNameChange($event)\"\r\n        *ngIf=\"isEditMode\"\r\n        [style.width.px]=\"inputWidth < 200 ? 200 : inputWidth\"\r\n        style=\"all: unset; font-size: 1.5rem; font-weight: bold\"\r\n      /> -->\r\n      @if(fixtureTemplateDetails?.templateType !== 'master') {\r\n      <div class=\"badge\" [ngClass]=\"fixtureTemplateDetails?.status\">{{ fixtureTemplateDetails?.status | titlecase }}</div>\r\n      } @else {\r\n      <div class=\"badge badge-secondary\">Master</div>\r\n      }\r\n    </div>\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <p\r\n        class=\"m-0\"\r\n        *ngIf=\"fixtureTemplateDetails?.updatedAt && fixtureTemplateDetails?.templateType !== 'master'\"\r\n        [ngbTooltip]=\"fixtureTemplateDetails?.updatedAt | date : 'medium'\"\r\n      >\r\n        Last update: {{ fixtureTemplateDetails?.updatedAt | timeAgo }}\r\n      </p>\r\n      <div *ngIf=\"!isEditMode\">\r\n        <button\r\n          type=\"button\"\r\n          class=\"btn btn-outline d-flex align-items-center gap-3\"\r\n          (click)=\"onClickEdit()\"\r\n          *ngIf=\"fixtureTemplateDetails?.templateType !== 'master'\"\r\n          [disabled]=\"url.includes('assign-stores')\"\r\n        >\r\n          <!-- [disabled]=\"this.fixtureTemplateDetails?.status === 'active'\" -->\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <g clip-path=\"url(#clip0_1322_5325)\">\r\n              <path\r\n                d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                stroke=\"#344054\"\r\n                stroke-width=\"1.67\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_1322_5325\">\r\n                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n          Edit\r\n        </button>\r\n        <button\r\n          type=\"button\"\r\n          class=\"btn btn-primary d-flex align-items-center gap-3\"\r\n          (click)=\"onDuplicate('master')\"\r\n          *ngIf=\"fixtureTemplateDetails?.templateType === 'master'\"\r\n        >\r\n          Create variant\r\n        </button>\r\n      </div>\r\n\r\n      <div\r\n        *ngIf=\"isEditMode && fixtureTemplateDetails?.templateType !== 'master'\"\r\n        class=\"d-flex gap-5 justify-content-center align-items-center\"\r\n      >\r\n        <!-- <div\r\n          *ngIf=\"fixtureTemplateDetails?.status !== 'active'\"\r\n          ngbTooltip=\"Spot product placement isn't available yet\"\r\n          [disableTooltip]=\"selectedProductPlacementLevel !== 'spot'\"\r\n        >\r\n          <button\r\n            type=\"button\"\r\n            class=\"btn btn-outline\"\r\n            (click)=\"onSubmit({ status: 'draft', goBack: false })\"\r\n            [disabled]=\"selectedProductPlacementLevel === 'spot'\"\r\n          >\r\n            Save as draft\r\n          </button>\r\n        </div> -->\r\n        <div ngbTooltip=\"Spot product placement isn't available yet\" [disableTooltip]=\"selectedProductPlacementLevel !== 'spot'\">\r\n          <button\r\n            type=\"button\"\r\n            class=\"btn btn-primary\"\r\n            (click)=\"onSubmit({ status: 'complete', goBack: false })\"\r\n            [disabled]=\"selectedProductPlacementLevel === 'spot' || url.includes('assign-stores')\"\r\n          >\r\n            Save\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"dropdown\" *ngIf=\"fixtureTemplateDetails?.templateType !== 'master'\">\r\n        <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </button>\r\n\r\n        <ul class=\"dropdown-menu\">\r\n          <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\"> Duplicate</a></li>\r\n          <li><a class=\"dropdown-item cursor-pointer\" (click)=\"findReplace()\" *ngIf=\"!isEditMode\"> Find & Replace</a></li>\r\n          <li><a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\">Delete</a></li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n    <li class=\"nav-item\" role=\"presentation\">\r\n      <a\r\n        [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n        [queryParams]=\"{ templateId: fixtureTemplateDetails?._id, isEdit: isEditMode }\"\r\n        [routerLinkActiveOptions]=\"{ exact: false }\"\r\n        routerLinkActive=\"active\"\r\n        [state]=\"{ skipHistory: true }\"\r\n        [replaceUrl]=\"true\"\r\n        class=\"nav-link\"\r\n        role=\"tab\"\r\n      >\r\n        Basic details\r\n      </a>\r\n    </li>\r\n    <li class=\"nav-item\" role=\"presentation\">\r\n      <a\r\n        [routerLink]=\"['/manage/planogram/fixture-template/products']\"\r\n        [queryParams]=\"{ templateId: fixtureTemplateDetails?._id, isEdit: isEditMode }\"\r\n        routerLinkActive=\"active\"\r\n        [state]=\"{ skipHistory: true }\"\r\n        [replaceUrl]=\"true\"\r\n        class=\"nav-link\"\r\n        role=\"tab\"\r\n      >\r\n        Products\r\n      </a>\r\n    </li>\r\n    <li class=\"nav-item\" role=\"presentation\">\r\n      <a\r\n        [routerLink]=\"['/manage/planogram/fixture-template/vms']\"\r\n        [queryParams]=\"{ templateId: fixtureTemplateDetails?._id, isEdit: isEditMode }\"\r\n        routerLinkActive=\"active\"\r\n        [state]=\"{ skipHistory: true }\"\r\n        [replaceUrl]=\"true\"\r\n        class=\"nav-link\"\r\n        role=\"tab\"\r\n      >\r\n        Visual Merchandise\r\n      </a>\r\n    </li>\r\n    <li class=\"nav-item\" role=\"presentation\">\r\n      <a\r\n        [routerLink]=\"['/manage/planogram/fixture-template/summary']\"\r\n        [queryParams]=\"{ templateId: fixtureTemplateDetails?._id, isEdit: isEditMode }\"\r\n        routerLinkActive=\"active\"\r\n        [state]=\"{ skipHistory: true }\"\r\n        [replaceUrl]=\"true\"\r\n        class=\"nav-link\"\r\n        role=\"tab\"\r\n      >\r\n        Summary\r\n      </a>\r\n    </li>\r\n    <li *ngIf=\"fixtureTemplateDetails?.templateType === 'sub'\" class=\"nav-item\" role=\"presentation\">\r\n      <a\r\n        [routerLink]=\"['/manage/planogram/fixture-template/assign-stores']\"\r\n        [queryParams]=\"{ templateId: fixtureTemplateDetails?._id, isEdit: isEditMode }\"\r\n        routerLinkActive=\"active\"\r\n        class=\"nav-link\"\r\n        role=\"tab\"\r\n      >\r\n        Assign Stores\r\n      </a>\r\n    </li>\r\n  </ul>\r\n\r\n  <div class=\"content-wrapper\">\r\n    <router-outlet></router-outlet>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<ng-template #errorModal let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h4 class=\"mb-3\">To save fixture template, please resolve the errors in these sections:</h4>\r\n      <ul>\r\n        <li *ngIf=\"errorTabs.basicDetails\" class=\"text-danger\"><p>Basic Details</p></li>\r\n        <li *ngIf=\"errorTabs.products\" class=\"text-danger\"><p>Products</p></li>\r\n        <li *ngIf=\"errorTabs.vms\" class=\"text-danger\"><p>VM</p></li>\r\n      </ul>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end\">\r\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"modal.close()\">Ok</button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n","import { Component } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-bulk-upload-fixture-template',\r\n  templateUrl: './bulk-upload-fixture-template.component.html',\r\n  styleUrl: './bulk-upload-fixture-template.component.scss'\r\n})\r\nexport class BulkUploadFixtureTemplateComponent {\r\n  selectedFile: File | null = null;\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal\r\n  ) { }\r\n\r\n\r\n  onFileSelected(event: any): void {\r\n    const file = event.target.files[0];\r\n    if (file) {\r\n      const fileExtension = file.name.split('.').pop()?.toLowerCase();\r\n      if (fileExtension === 'xlsx' || fileExtension === 'xls') {\r\n        this.selectedFile = file;\r\n      } else {\r\n        // Handle invalid file type\r\n        alert('Please select a valid Excel file (.xlsx or .xls)');\r\n        event.target.value = '';\r\n      }\r\n    }\r\n  }\r\n\r\n  downloadEmptyFixtureTemplate(): void {\r\n  }\r\n  downloadFixtureTemplateWithExample(): void {\r\n  }\r\n\r\n  uploadFile(): void {\r\n    if (this.selectedFile) {\r\n      // TODO: Implement file upload functionality\r\n      console.log('Uploading file:', this.selectedFile);\r\n    } else {\r\n      alert('Please select a file to upload');\r\n    }\r\n  }\r\n\r\n  closeModal(): void {\r\n    this.activeModal.close();\r\n  }\r\n}\r\n","<div class=\"modal-container\">\r\n  <h3>Fixture template (Bulk action)</h3>\r\n\r\n  <div class=\"wrapper\">\r\n    <svg\r\n      style=\"width: 80px; height: 80px\"\r\n      width=\"56\"\r\n      height=\"56\"\r\n      viewBox=\"0 0 95 94\"\r\n      fill=\"none\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      class=\"mb-4\"\r\n    >\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n      <path\r\n        d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n        stroke=\"#00A3FF\"\r\n        stroke-width=\"3.33333\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n\r\n    <h3>Bulk Upload Fixture templates</h3>\r\n\r\n    <div class=\"upload-description\">\r\n      <div class=\"upload-steps\">\r\n        <p class=\"card-description mb-0\">Step1 - Download template</p>\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadEmptyFixtureTemplate()\">Download empty template</a>\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadFixtureTemplateWithExample()\"\r\n          >Download template with 8 record</a\r\n        >\r\n        <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n        <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n      </div>\r\n      <button class=\"btn btn-primary d-inline-flex align-items-center w-fit\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Upload\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"modal-actions\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeModal()\">Close</button>\r\n  </div>\r\n</div>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { DropdownIF } from '../../../../interfaces/plano-general.interface';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: 'app-create-fixture-template',\r\n  templateUrl: './create-fixture-template.component.html',\r\n  styleUrl: './create-fixture-template.component.scss'\r\n})\r\nexport class CreateFixtureTemplateComponent implements OnInit {\r\n  @Input() clientId: string;\r\n\r\n  fixtureTypesList: DropdownIF[] = [];\r\n  selectedFixtureType: any;\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    if (this.clientId) this.getFixtureTypesList()\r\n  }\r\n\r\n  getFixtureTypesList() {\r\n    this.storeBuilderService.getFixtureLibNameList(this.clientId, 'all').subscribe({\r\n      next: (res: any) => {\r\n        if (res?.data) {\r\n          this.fixtureTypesList = res?.data?.map((item: any) => {\r\n            return {\r\n              label: item.fixtureName,\r\n              value: item.id\r\n            }\r\n          })\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getFixtureTypesList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n\r\n  onCreate() {\r\n    if (this.selectedFixtureType) {\r\n      const newFixtureData = {\r\n        clientId: this.clientId,\r\n        fixtureLibraryId: this.selectedFixtureType,\r\n        templateType:'master'\r\n      }\r\n\r\n      this.storeBuilderService.createFixtureTemplate(newFixtureData).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.toast.getSuccessToast(res?.data?.message ?? 'Fixture Template created successfully');\r\n            this.activeModal.close(res?.data?.fixtureData);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(err);\r\n          console.log(\"@@ ~ createFixtureTemplate [ERR]:\", err)\r\n        }\r\n      })\r\n    }\r\n  }\r\n\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <h3 class=\"mb-4\">Create fixture template</h3>\r\n  <lib-reactive-select\r\n    [(ngModel)]=\"selectedFixtureType\"\r\n    [idField]=\"'value'\"\r\n    [nameField]=\"'label'\"\r\n    [data]=\"fixtureTypesList\"\r\n    [label]=\"'Select fixture Type'\"\r\n    class=\"mb-4\"\r\n    [search]=\"true\"\r\n  >\r\n  </lib-reactive-select>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" [disabled]=\"!selectedFixtureType\" (click)=\"onCreate()\">Create</button>\r\n  </div>\r\n</div>\r\n","import * as fabric from \"fabric\";\r\nimport {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Input,\r\n  OnDestroy,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport {\r\n  TreeFilterState,\r\n  TreeFilterOptions,\r\n} from \"../../interfaces/fixture-template.interface\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { debounceTime, fromEvent, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { Router } from \"@angular/router\";\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { LayoutEditConfirmationComponent } from \"../popups/layout-edit-confirmation/layout-edit-confirmation.component\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"fixture-template-tree\",\r\n  templateUrl: \"./fixture-template-tree.component.html\",\r\n  styleUrl: \"./fixture-template-tree.component.scss\",\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n})\r\nexport class TemplateTreeComponent implements OnDestroy, AfterViewInit {\r\n  @Input() viewMode: \"group\" | \"master\" = \"group\";\r\n  @Input() clientId?: string; // Used to fetch all masters when mode is set to group.\r\n  @Input() masterFixtureData?: any; // Required when viewMode is set to master.\r\n  @Input() allFixture?: any[]; // Required when viewMode is set to store.\r\n\r\n  @ViewChild(\"templateCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  canvas!: fabric.Canvas;\r\n\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  cdnUrl: string;\r\n\r\n  allMasterTemplates: any[] = [];\r\n  selectedMasterTemplates: any[] = [];\r\n  subTemplates: any[] = [];\r\n\r\n  selectedGroupName: string;\r\n  selectedMasterId: string;\r\n  selectedSubTemplateId: string;\r\n\r\n  isPageLoading: boolean = true;\r\n  preventClick: boolean = false; // Flag used to restrict further clicks on canvas items while an API call is in progress.\r\n\r\n  // Filter state\r\n  filterOptions: TreeFilterOptions = {\r\n    templateGroupNames: [],\r\n    fixtureNames: [],\r\n    storeNames: [],\r\n  };\r\n  activeFilters: TreeFilterState = {\r\n    templateGroupNames: [],\r\n    fixtureNames: [],\r\n    storeNames: [],\r\n  };\r\n  private initialLoadDone = false;\r\n  filterSearch: { [key: string]: string } = {};\r\n  openFilterKey: string | null = null;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private router: Router,\r\n    private ngbModal: NgbModal,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  @HostListener(\"document:click\", [\"$event\"])\r\n  onDocumentClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n    if (this.openFilterKey && !target.closest(\".filter-chip\")) {\r\n      this.openFilterKey = null;\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 600,\r\n      width: 800,\r\n      subTargetCheck: true,\r\n    });\r\n\r\n    this.resizeCanvasToParentSize();\r\n\r\n    fromEvent(window, \"resize\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(() => this.resizeCanvasToParentSize());\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    this.fetchFilterOptions();\r\n    this.buildTreeView();\r\n\r\n    this.canvas.on(\"mouse:down\", async (opt: any) => {\r\n      const parent = opt.target as any;\r\n      const childName = opt.subTargets?.[0]?.name;\r\n\r\n      if (!childName) return;\r\n\r\n      if (childName === \"editIcon\") {\r\n        if (!(await this.confirmEdit(parent.storeCount))) return;\r\n        this.router.navigate(\r\n          [\"/manage/planogram/fixture-template/basic-details\"],\r\n          {\r\n            queryParams: {\r\n              templateId: parent.fixtureId,\r\n              isEdit: true,\r\n            },\r\n          },\r\n        );\r\n      }\r\n\r\n      if (childName === \"copyIcon\") {\r\n        const target =\r\n          parent.templateType === \"master\" ? parent : opt.subTargets?.[0].group;\r\n        this.onDuplicate(target);\r\n      }\r\n    });\r\n  }\r\n\r\n  async confirmEdit(count: number): Promise<boolean> {\r\n    if (count <= 0) return true;\r\n    try {\r\n      const modelRef = this.ngbModal.open(LayoutEditConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Edit template`;\r\n      modelRef.componentInstance.description = `You are about to edit an active template. Please review and publish the changes`;\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  buildTreeView() {\r\n    this.preventClick = true;\r\n    if (this.viewMode === \"group\" && this.clientId) {\r\n      this.getMasterTemplateList();\r\n    }\r\n\r\n    if (this.viewMode === \"master\" && this.masterFixtureData) {\r\n      this.selectedMasterId = this.masterFixtureData._id;\r\n\r\n      const canvasWidth = this.canvas.getWidth();\r\n      let x = canvasWidth / 2;\r\n      let y = 50;\r\n      this.renderMasterFixtures(x, y);\r\n    }\r\n  }\r\n\r\n  getMasterTemplateList() {\r\n    const params: any = { clientId: this.clientId };\r\n\r\n    // Pass active filters to the API\r\n    if (this.activeFilters.templateGroupNames.length) {\r\n      params.templateGroupNames = this.activeFilters.templateGroupNames;\r\n    }\r\n    if (this.activeFilters.fixtureNames.length) {\r\n      params.fixtureNames = this.activeFilters.fixtureNames;\r\n    }\r\n    if (this.activeFilters.storeNames.length) {\r\n      params.storeNames = this.activeFilters.storeNames;\r\n    }\r\n\r\n    this.storeBuilderService\r\n      .getTemplateTreeList(params)\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.preventClick = true;\r\n          this.allMasterTemplates = res?.data ?? [];\r\n\r\n          // Once the master template is fetched, render the group names.\r\n          this.renderGroupNames();\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ getMasterTemplateList [ERR]: \", err);\r\n          this.preventClick = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        // Pinch-to-zoom (trackpad) or Ctrl+scroll (mouse)\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n      } else {\r\n        // Two-finger trackpad swipe → pan canvas\r\n        const vpt = this.canvas.viewportTransform;\r\n        if (vpt) {\r\n          vpt[4] -= e.deltaX;\r\n          vpt[5] -= e.deltaY;\r\n          this.canvas.requestRenderAll();\r\n        }\r\n      }\r\n\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  zoomIn() {\r\n    let zoom = this.canvas.getZoom();\r\n    const targetZoom = Math.min(zoom + 0.2, 3);\r\n    this.smoothZoom(targetZoom);\r\n  }\r\n\r\n  zoomOut() {\r\n    let zoom = this.canvas.getZoom();\r\n    const targetZoom = Math.max(zoom - 0.2, 0.2);\r\n    this.smoothZoom(targetZoom);\r\n  }\r\n\r\n  private smoothZoom(targetZoom: number) {\r\n    const center = new fabric.Point(\r\n      this.canvas.getWidth() / 2,\r\n      this.canvas.getHeight() / 2,\r\n    );\r\n    const currentZoom = this.canvas.getZoom();\r\n    const steps = 10;\r\n    const stepSize = (targetZoom - currentZoom) / steps;\r\n    let step = 0;\r\n\r\n    const animate = () => {\r\n      if (step < steps) {\r\n        this.canvas.zoomToPoint(center, currentZoom + stepSize * (step + 1));\r\n        step++;\r\n        requestAnimationFrame(animate);\r\n      } else {\r\n        this.canvas.zoomToPoint(center, targetZoom);\r\n      }\r\n    };\r\n\r\n    animate();\r\n  }\r\n\r\n  zoomToFit() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return;\r\n\r\n    // Calculate bounding box of all objects\r\n    let minX = Infinity;\r\n    let minY = Infinity;\r\n    let maxX = -Infinity;\r\n    let maxY = -Infinity;\r\n\r\n    objects.forEach((obj) => {\r\n      const bounds = obj.getBoundingRect();\r\n      minX = Math.min(minX, bounds.left);\r\n      minY = Math.min(minY, bounds.top);\r\n      maxX = Math.max(maxX, bounds.left + bounds.width);\r\n      maxY = Math.max(maxY, bounds.top + bounds.height);\r\n    });\r\n\r\n    const contentWidth = maxX - minX;\r\n    const contentHeight = maxY - minY;\r\n    const canvasWidth = this.canvas.getWidth();\r\n    const canvasHeight = this.canvas.getHeight();\r\n\r\n    const padding = 40;\r\n    const scaleX = (canvasWidth - padding * 2) / contentWidth;\r\n    const scaleY = (canvasHeight - padding * 2) / contentHeight;\r\n    const zoom = Math.min(scaleX, scaleY, 1); // Don't zoom in beyond 1x\r\n\r\n    // Reset viewport, then set zoom and center\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const centerX = (minX + maxX) / 2;\r\n    const centerY = (minY + maxY) / 2;\r\n\r\n    this.canvas.zoomToPoint(\r\n      new fabric.Point(canvasWidth / 2, canvasHeight / 2),\r\n      zoom,\r\n    );\r\n\r\n    // Pan so the content center aligns with canvas center\r\n    const vpt = this.canvas.viewportTransform!;\r\n    vpt[4] = canvasWidth / 2 - centerX * zoom;\r\n    vpt[5] = canvasHeight / 2 - centerY * zoom;\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  resizeCanvasToParentSize() {\r\n    const canvasCol = document.getElementById(\r\n      \"tree-canvas-card\",\r\n    ) as HTMLElement;\r\n    if (canvasCol) {\r\n      const width = canvasCol.offsetWidth - 32;\r\n      const height = canvasCol.offsetHeight - 32;\r\n      this.changeCanvasSize(width, height);\r\n    }\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  // --- Filter methods ---\r\n\r\n  fetchFilterOptions() {\r\n    if (!this.clientId) return;\r\n    this.storeBuilderService\r\n      .getTreeFilterOptions(this.clientId)\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.data) {\r\n            this.filterOptions = {\r\n              templateGroupNames: res.data.templateGroupNames ?? [],\r\n              fixtureNames: res.data.fixtureNames ?? [],\r\n              storeNames: res.data.storeNames ?? [],\r\n            };\r\n          }\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ fetchFilterOptions [ERR]: \", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  getFilteredOptions(key: string): string[] {\r\n    const options = (this.filterOptions as any)[key] ?? [];\r\n    const search = (this.filterSearch[key] ?? \"\").toLowerCase();\r\n    if (!search) return options;\r\n    return options.filter((o: string) => o.toLowerCase().includes(search));\r\n  }\r\n\r\n  isFilterSelected(key: string, value: string): boolean {\r\n    return ((this.activeFilters as any)[key] ?? []).includes(value);\r\n  }\r\n\r\n  toggleFilter(key: string, value: string) {\r\n    const arr: string[] = (this.activeFilters as any)[key];\r\n    const idx = arr.indexOf(value);\r\n    if (idx > -1) {\r\n      arr.splice(idx, 1);\r\n    } else {\r\n      arr.push(value);\r\n    }\r\n  }\r\n\r\n  toggleFilterDropdown(key: string) {\r\n    this.openFilterKey = this.openFilterKey === key ? null : key;\r\n    this.filterSearch[key] = \"\";\r\n  }\r\n\r\n  hasActiveFilters(): boolean {\r\n    return (\r\n      this.activeFilters.templateGroupNames.length > 0 ||\r\n      this.activeFilters.fixtureNames.length > 0 ||\r\n      this.activeFilters.storeNames.length > 0\r\n    );\r\n  }\r\n\r\n  applyFilters() {\r\n    this.openFilterKey = null;\r\n    if (!this.canvas || !this.clientId) return;\r\n\r\n    // Clear canvas and re-fetch with filters from API\r\n    this.canvas.clear();\r\n    this.selectedGroupName = \"\";\r\n    this.selectedMasterId = \"\";\r\n    this.selectedSubTemplateId = \"\";\r\n    this.preventClick = true;\r\n\r\n    this.getMasterTemplateList();\r\n  }\r\n\r\n  clearAllFilters() {\r\n    this.activeFilters = {\r\n      templateGroupNames: [],\r\n      fixtureNames: [],\r\n      storeNames: [],\r\n    };\r\n    this.openFilterKey = null;\r\n    this.applyFilters();\r\n  }\r\n\r\n  getActiveFilterCount(key: string): number {\r\n    return ((this.activeFilters as any)[key] ?? []).length;\r\n  }\r\n\r\n  renderGroupNames() {\r\n    const masters = this.allMasterTemplates.filter(\r\n      (m) => m.templateType === \"master\",\r\n    );\r\n    const masterGroupNames = Array.from(\r\n      new Set(\r\n        masters\r\n          .filter((f) => f.templateGroupName)\r\n          .map((m) => m.templateGroupName),\r\n      ),\r\n    );\r\n\r\n    if (!masterGroupNames.length) {\r\n      console.log(\r\n        \"@@ ~ renderGroupNames [ERR]: (noe group names found): \",\r\n        masterGroupNames,\r\n      );\r\n      return;\r\n    }\r\n\r\n    if (!this.selectedGroupName || !masterGroupNames.includes(this.selectedGroupName)) {\r\n      this.selectedGroupName = masterGroupNames[0];\r\n    }\r\n\r\n    const y = 50;\r\n    const groupSpacing = 20;\r\n\r\n    const groups: fabric.Group[] = [];\r\n    let totalWidth = 0;\r\n\r\n    masterGroupNames.forEach((g) => {\r\n      if (!g) return;\r\n      const label = g;\r\n      const fontSize = 12;\r\n      const paddingX = 30;\r\n      const paddingY = 16;\r\n\r\n      const mainText = new fabric.FabricText(label, {\r\n        fontSize: fontSize,\r\n        fill: \"#363F72\",\r\n        fontFamily: \"Inter, Arial, sans-serif\",\r\n        fontWeight: \"500\",\r\n        originX: \"left\",\r\n        originY: \"top\",\r\n      });\r\n\r\n      const rectWidth = mainText.width! + 2 * paddingX;\r\n      const rectHeight = mainText.height! + 2 * paddingY;\r\n      const rectLeft = 30;\r\n      const rectTop = 18;\r\n\r\n      const mainRect = new fabric.Rect({\r\n        rx: 6,\r\n        ry: 6,\r\n        width: rectWidth,\r\n        height: rectHeight,\r\n        fill: this.selectedGroupName === label ? \"#F8F9FC\" : \"#fff\",\r\n        stroke: this.selectedGroupName === label ? \"#AFB5D9\" : \"#D0D5DD\",\r\n        strokeWidth: 2,\r\n        left: rectLeft,\r\n        top: rectTop,\r\n      });\r\n\r\n      mainText.set({\r\n        left: rectLeft + paddingX,\r\n        top: rectTop + (rectHeight - mainText.height!) / 2,\r\n      });\r\n\r\n      const bubbleW = 36;\r\n      const bubbleH = 18;\r\n      const bubbleLeft = rectLeft + rectWidth / 2 - bubbleW / 2;\r\n      const bubbleTop = rectHeight + bubbleH / 2;\r\n\r\n      const bubbleRect = new fabric.Rect({\r\n        rx: 4,\r\n        ry: 4,\r\n        width: bubbleW,\r\n        height: bubbleH,\r\n        fill: this.selectedGroupName === label ? \"#8389c5\" : \"#98A2B3\",\r\n        left: bubbleLeft,\r\n        top: bubbleTop,\r\n      });\r\n\r\n      const groupCount = masters.filter(\r\n        (m) => m.templateGroupName === g,\r\n      ).length;\r\n\r\n      const numberText = new fabric.FabricText(groupCount.toString(), {\r\n        fontSize: 8,\r\n        fill: \"#fff\",\r\n        fontFamily: \"Inter, Arial, sans-serif\",\r\n        fontWeight: \"700\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        left: bubbleLeft + bubbleW / 2,\r\n        top: bubbleTop + bubbleH / 2,\r\n      });\r\n\r\n      const group = new fabric.Group(\r\n        [mainRect, mainText, bubbleRect, numberText],\r\n        {\r\n          left: 0,\r\n          top: 0,\r\n          selectable: false,\r\n          hoverCursor: \"pointer\",\r\n        },\r\n      ) as fabric.Group & {\r\n        groupName: string;\r\n        masterCount: number;\r\n        mainRect: fabric.Rect;\r\n        bubbleRect: fabric.Rect;\r\n      };\r\n\r\n      group.groupName = label;\r\n      group.masterCount = groupCount;\r\n      group.mainRect = mainRect;\r\n      group.bubbleRect = bubbleRect;\r\n\r\n      group.on(\"mousedown\", (opt: any) => {\r\n        if (this.selectedGroupName === label) return;\r\n\r\n        if (this.preventClick) return;\r\n        this.preventClick = true;\r\n\r\n        const prevGroup = this.canvas\r\n          .getObjects()\r\n          .find(\r\n            (obj) =>\r\n              obj instanceof fabric.Group &&\r\n              (obj as any).groupName === this.selectedGroupName,\r\n          ) as fabric.Group & {\r\n          mainRect: fabric.Rect;\r\n          bubbleRect: fabric.Rect;\r\n        };\r\n\r\n        if (prevGroup) {\r\n          prevGroup.mainRect.set({ fill: \"#ffffff\", stroke: \"#D0D5DD\" });\r\n          prevGroup.bubbleRect.set({ fill: \"#98A2B3\" });\r\n        }\r\n\r\n        group.mainRect.set({ fill: \"#F8F9FC\", stroke: \"#AFB5D9\" });\r\n        group.bubbleRect.set({ fill: \"#8389c5\" });\r\n\r\n        // Clear store names, subs, masters arrows before rendering new set.\r\n        this.clearOldFixtureTemplatesFromCanvas(\"storeNames\");\r\n        this.clearArrowById(this.selectedSubTemplateId);\r\n        this.clearArrowById(this.selectedGroupName);\r\n        this.clearArrowById(this.selectedMasterId);\r\n\r\n        this.selectedGroupName = label;\r\n        this.canvas.requestRenderAll();\r\n\r\n        const target = opt.target;\r\n        if (target && target instanceof fabric.Group) {\r\n          const parentGroup = target as fabric.Group;\r\n          const { gx, gy } = this.getGroupCenterBottom(parentGroup);\r\n          this.renderMasterFixtures(gx, gy + 50, parentGroup);\r\n        }\r\n      });\r\n\r\n      groups.push(group);\r\n      totalWidth += group.width! + groupSpacing;\r\n    });\r\n\r\n    totalWidth -= groupSpacing;\r\n\r\n    const canvasWidth = this.canvas.getWidth();\r\n    let x = (canvasWidth - totalWidth) / 2;\r\n\r\n    groups.forEach((group) => {\r\n      group.set({ left: x, top: y });\r\n      x += group.width! + groupSpacing;\r\n      this.canvas.add(group);\r\n    });\r\n\r\n    const selectedGroupFabricGroup = groups[0];\r\n\r\n    const { gx, gy } = this.getGroupCenterBottom(selectedGroupFabricGroup);\r\n    this.renderMasterFixtures(gx, gy + 50, selectedGroupFabricGroup);\r\n  }\r\n\r\n  async renderMasterFixtures(x: number, y: number, group?: any) {\r\n    if (this.viewMode === \"master\") {\r\n      this.selectedMasterTemplates = [this.masterFixtureData];\r\n      this.selectedMasterId = this.masterFixtureData._id;\r\n    } else {\r\n      this.selectedMasterTemplates = this.allMasterTemplates.filter(\r\n        (f) =>\r\n          f.templateType === \"master\" &&\r\n          f.templateGroupName === this.selectedGroupName,\r\n      );\r\n      this.selectedMasterId = this.selectedMasterTemplates[0]._id;\r\n      this.clearOldFixtureTemplatesFromCanvas(\"storeNames\");\r\n      this.clearArrowById(this.selectedSubTemplateId);\r\n      this.clearOldFixtureTemplatesFromCanvas(\"master\");\r\n      this.clearOldFixtureTemplatesFromCanvas(\"sub\");\r\n    }\r\n\r\n    const masters: any[] = await this.renderFixtures(\r\n      this.selectedMasterTemplates,\r\n      x,\r\n      y,\r\n    );\r\n\r\n    if (this.viewMode !== \"master\")\r\n      masters.forEach((m) => this.drawArrow(group, m, group.groupName));\r\n\r\n    const selectedMasterFabricGroup = masters[0];\r\n    const { gx, gy } = this.getGroupCenterBottom(selectedMasterFabricGroup);\r\n    this.renderSubFixtures(selectedMasterFabricGroup, gx, gy + 50);\r\n  }\r\n\r\n  async renderSubFixtures(group: any, x: number, y: number) {\r\n    const params: any = { masterId: this.selectedMasterId };\r\n    if (this.activeFilters.storeNames.length) {\r\n      params.storeNames = this.activeFilters.storeNames;\r\n    }\r\n\r\n    this.storeBuilderService\r\n      .getTemplateTreeList(params)\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          this.subTemplates = res?.data ?? [];\r\n          if (this.subTemplates.length) {\r\n            const sub: any[] = await this.renderFixtures(\r\n              this.subTemplates,\r\n              x,\r\n              y,\r\n              group,\r\n            );\r\n\r\n            sub.forEach((m) => this.drawArrow(group, m, group.fixtureId));\r\n          } else {\r\n            this.toast.getPrimaryToast(\"Master does not have any variant\");\r\n          }\r\n          this.preventClick = false;\r\n          if (!this.initialLoadDone) {\r\n            this.initialLoadDone = true;\r\n            this.zoomToFit();\r\n          }\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ getMasterTemplateList [ERR]: \", err);\r\n          this.preventClick = false;\r\n          if (!this.initialLoadDone) {\r\n            this.initialLoadDone = true;\r\n            this.zoomToFit();\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async renderFixtures(\r\n    templates: any[],\r\n    x: number,\r\n    y: number,\r\n    parentFabric?: any,\r\n  ) {\r\n    const groupSpacing = 20;\r\n\r\n    type FixtureGroup = fabric.Group & {\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      groupName: string;\r\n      templateType: string;\r\n      name: string;\r\n      parentFabric: any;\r\n      storeCount: number;\r\n    };\r\n\r\n    // Process all templates in parallel and wait for completion\r\n    const groups: FixtureGroup[] = await Promise.all(\r\n      templates.map(async (mf) => {\r\n        const isMaster = mf.templateType === \"master\";\r\n\r\n        const height = this.toPixels(\r\n          mf.fixtureStaticLength.value,\r\n          mf.fixtureStaticLength.unit,\r\n        );\r\n        const width = this.toPixels(\r\n          mf.fixtureStaticWidth.value,\r\n          mf.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        const radius = 3;\r\n\r\n        let mainContainerHeight = height + 1;\r\n        if (isMaster) {\r\n          const topHeight = (15 / 100) * height;\r\n          mainContainerHeight = height - topHeight / 2 + 1;\r\n        }\r\n\r\n        const mainContainerTop = isMaster\r\n          ? y + ((15 / 100) * height) / 2 - 1\r\n          : y - 1;\r\n\r\n        const mainContainer = new fabric.Rect({\r\n          left: x,\r\n          top: mainContainerTop,\r\n          width: width,\r\n          height: mainContainerHeight,\r\n          rx: radius,\r\n          ry: radius,\r\n          stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        const topWidth = width / 1.05;\r\n        const topHeight = (15 / 100) * height;\r\n        const topX = x + (width - topWidth) / 2;\r\n        const topY = y + this.verticalMargin;\r\n\r\n        const topContainer = new fabric.Rect({\r\n          left: topX,\r\n          top: topY,\r\n          width: topWidth,\r\n          height: topHeight,\r\n          rx: radius,\r\n          ry: radius,\r\n          stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        const innerBoxHeight = topHeight / 2;\r\n        const innerTopBox = new fabric.Path(\r\n          `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n          {\r\n            stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"transparent\",\r\n          },\r\n        );\r\n\r\n        const innerTopText = new fabric.Textbox(\r\n          `Assigned to ${mf.storeCount ?? 0} Stores`,\r\n          {\r\n            left: topX + topWidth / 2,\r\n            top: topY + innerBoxHeight / 2,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n            fill: \"#009BF3\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: topWidth,\r\n            height: innerBoxHeight,\r\n            textAlign: \"center\",\r\n          },\r\n        );\r\n\r\n        const secondBoxY = topY + innerBoxHeight;\r\n\r\n        let innerBottomBox: fabric.Path;\r\n\r\n        if (isMaster) {\r\n          innerBottomBox = new fabric.Path(\r\n            `M ${topX + radius} ${secondBoxY} \r\n          L ${topX + topWidth - radius} ${secondBoxY} \r\n          Q ${topX + topWidth} ${secondBoxY} ${topX + topWidth} ${\r\n            secondBoxY + radius\r\n          } \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n            topX + topWidth - radius\r\n          } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n            secondBoxY + innerBoxHeight - radius\r\n          } \r\n          L ${topX} ${secondBoxY + radius} \r\n          Q ${topX} ${secondBoxY} ${topX + radius} ${secondBoxY} Z`,\r\n            {\r\n              fill: \"#363F72\",\r\n              stroke: \"#717BBC\",\r\n              strokeWidth: 0.27,\r\n            },\r\n          );\r\n        } else {\r\n          innerBottomBox = new fabric.Path(\r\n            `M ${topX} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n            topX + topWidth - radius\r\n          } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n            secondBoxY + innerBoxHeight - radius\r\n          } \r\n          L ${topX} ${secondBoxY} Z`,\r\n            {\r\n              fill: \"#009BF3\",\r\n              stroke: \"#51C1FF\",\r\n              strokeWidth: 0.27,\r\n            },\r\n          );\r\n        }\r\n\r\n        let fontSize = 5;\r\n        let innerBottomText;\r\n\r\n        const textContent = getFixtureCanvasLabel(mf);\r\n\r\n        const createBottomText = (fs: any) =>\r\n          new fabric.Textbox(textContent, {\r\n            left: topX + topWidth / 2,\r\n            top: secondBoxY + innerBoxHeight / 2,\r\n            fontSize: fs,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n            fill: \"#FFFFFF\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            textAlign: \"center\",\r\n            width: topWidth,\r\n          });\r\n\r\n        do {\r\n          innerBottomText = createBottomText(fontSize);\r\n          fontSize -= 0.5;\r\n        } while (innerBottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n        const midWidth = width / 1.05;\r\n        const midHeight = (77 / 100) * height;\r\n        const midX = x + (width - midWidth) / 2;\r\n        const midY = topY + topHeight + this.verticalMargin;\r\n\r\n        const midContainer = new fabric.Rect({\r\n          left: midX,\r\n          top: midY,\r\n          width: midWidth,\r\n          height: midHeight,\r\n          rx: radius,\r\n          ry: radius,\r\n          stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        const shelfCount = mf.shelfConfig?.length;\r\n        const boxHeight = midHeight / (shelfCount + 2);\r\n        const firstBoxY = midY;\r\n\r\n        const firstBox = new fabric.Path(\r\n          `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n          {\r\n            fill: isMaster ? \"#EAECF5\" : \"#DAF1FF\",\r\n            stroke: isMaster ? \"#AFB5D9\" : \"#6BCAFF\",\r\n            strokeWidth: 0.27,\r\n          },\r\n        );\r\n\r\n        // Truncate mf.header.label with ellipsis if it exceeds the available width\r\n        const labelText = mf?.header?.label ?? \"\";\r\n        const firstBoxTextFontSize = 7;\r\n        const firstBoxTextFontFamily = \"Inter\";\r\n        const firstBoxTextFontWeight = \"600\";\r\n        const firstBoxTextWidth = midWidth - 40; // leave space for icons on right\r\n\r\n        // Truncate with ellipsis if needed\r\n        let displayLabel = labelText;\r\n        if (labelText) {\r\n          let tempTextbox = new fabric.Textbox(labelText, {\r\n            fontSize: firstBoxTextFontSize,\r\n            fontFamily: firstBoxTextFontFamily,\r\n            fontWeight: firstBoxTextFontWeight,\r\n            width: firstBoxTextWidth,\r\n          });\r\n          // If the text is too wide, truncate and add ellipsis\r\n          if (tempTextbox.height > boxHeight) {\r\n            let ellipsis = \"...\";\r\n            // Binary search for max fitting length\r\n            let left = 0;\r\n            let right = labelText.length;\r\n\r\n            while (left < right) {\r\n              let mid = Math.floor((left + right) / 2);\r\n              let testText = labelText.slice(0, mid) + ellipsis;\r\n              tempTextbox.set({ text: testText });\r\n              if (tempTextbox.height > boxHeight) {\r\n                right = mid;\r\n              } else {\r\n                left = mid + 1;\r\n              }\r\n            }\r\n            // left-1 is the max fitting length\r\n            displayLabel = labelText.slice(0, Math.max(0, left - 1)) + ellipsis;\r\n          }\r\n        }\r\n\r\n        const firstBoxText = new fabric.Textbox(displayLabel, {\r\n          left: midX + 6,\r\n          top: firstBoxY + boxHeight / 2,\r\n          fontSize: firstBoxTextFontSize,\r\n          fontFamily: firstBoxTextFontFamily,\r\n          fontWeight: firstBoxTextFontWeight,\r\n          fill: isMaster ? \"#363F72\" : \"#009BF3\",\r\n          originX: \"left\",\r\n          originY: \"center\",\r\n          width: firstBoxTextWidth,\r\n          height: boxHeight,\r\n          textAlign: \"left\",\r\n        });\r\n\r\n        const iconSize = 10;\r\n        const iconSpacing = 4;\r\n\r\n        const firstBoxTextBounds = firstBox.getBoundingRect();\r\n        const iconsTop =\r\n          firstBoxTextBounds.top + firstBoxTextBounds.height / 2 - iconSize / 2;\r\n        const iconsPaddingRight = 6;\r\n        const iconsTotalWidth = iconSize * 2 + iconSpacing;\r\n        const iconsLeftStart =\r\n          midX + midWidth - iconsTotalWidth - iconsPaddingRight;\r\n\r\n        const editIconLeft = iconsLeftStart;\r\n        const editIconTop = iconsTop;\r\n        const editIconPath = new fabric.Path(\r\n          \"M7.10354 1.06035C7.21145 0.952436 7.33956 0.866834 7.48056 0.808432C7.62155 0.75003 7.77267 0.71997 7.92528 0.71997C8.0779 0.71997 8.22902 0.75003 8.37001 0.808432C8.51101 0.866834 8.63912 0.952436 8.74703 1.06035C8.85495 1.16826 8.94055 1.29637 8.99895 1.43737C9.05735 1.57837 9.08741 1.72948 9.08741 1.8821C9.08741 2.03471 9.05735 2.18583 8.99895 2.32682C8.94055 2.46782 8.85495 2.59593 8.74703 2.70384L3.20024 8.25064L0.94043 8.86695L1.55674 6.60715L7.10354 1.06035Z\",\r\n          {\r\n            left: editIconLeft,\r\n            top: editIconTop,\r\n            scaleX: iconSize / 10,\r\n            scaleY: iconSize / 10,\r\n            fill: \"\",\r\n            stroke: \"#009BF3\",\r\n            strokeWidth: 0.704355,\r\n            originX: \"left\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n            evented: true,\r\n            strokeLineCap: \"round\",\r\n            strokeLineJoin: \"round\",\r\n          },\r\n        );\r\n        (editIconPath as any).name = \"editIcon\";\r\n\r\n        const copyIconLeft = editIconLeft + iconSize + iconSpacing;\r\n        const copyIconTop = editIconTop;\r\n        const copyIconPath = new fabric.Path(\r\n          \"M2.07735 5.99077L1.66647 5.99077C1.44853 5.99077 1.23952 5.9042 1.08541 5.75009C0.931303 5.59598 0.844727 5.38697 0.844727 5.16903L0.844727 1.47116C0.844727 1.25322 0.931303 1.04421 1.08541 0.890098C1.23952 0.735991 1.44853 0.649414 1.66647 0.649414L5.36434 0.649414C5.58228 0.649414 5.79129 0.735991 5.9454 0.890098C6.09951 1.04421 6.18609 1.25322 6.18609 1.47116L6.18609 1.88204M4.54259 3.52553L8.24046 3.52553C8.69429 3.52553 9.0622 3.89344 9.0622 4.34728L9.0622 8.04514C9.0622 8.49898 8.69429 8.86689 8.24046 8.86689L4.54259 8.86689C4.08875 8.86689 3.72084 8.49898 3.72084 8.04514L3.72084 4.34728C3.72084 3.89344 4.08875 3.52553 4.54259 3.52553Z\",\r\n          {\r\n            left: copyIconLeft,\r\n            top: copyIconTop,\r\n            scaleX: iconSize / 10,\r\n            scaleY: iconSize / 10,\r\n            fill: \"\",\r\n            stroke: isMaster ? \"#363F72\" : \"#009BF3\",\r\n            strokeWidth: 0.704355,\r\n            originX: \"left\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n            evented: true,\r\n            strokeLineCap: \"round\",\r\n            strokeLineJoin: \"round\",\r\n          },\r\n        );\r\n\r\n        (copyIconPath as any).name = \"copyIcon\";\r\n\r\n        const shelves = [];\r\n        const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n        if (mf.productResolutionLevel === \"L1\") {\r\n          const boxY = firstBoxY + boxHeight;\r\n\r\n          const shelf = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: shelfHeight,\r\n            stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          const text = mf?.productBrandName?.join(\" + \") || \"\";\r\n\r\n          // Wrap text within fixture width, shrink font if needed to fit within shelf height\r\n          const maxTextWidth = midWidth * 0.9;\r\n          const maxTextHeight = shelfHeight * 0.8;\r\n          let fontSizeL1 = 6; // start slightly larger; will shrink to fit\r\n\r\n          const createWrappedTextbox = (fs: number) =>\r\n            new fabric.Textbox(text, {\r\n              left: midX + midWidth / 2,\r\n              top: boxY + shelfHeight / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              width: maxTextWidth,\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"500\",\r\n              textAlign: \"center\",\r\n              fill: \"#333\",\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          let wrappedText = createWrappedTextbox(fontSizeL1);\r\n          while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n            fontSizeL1 -= 0.5;\r\n            wrappedText = createWrappedTextbox(fontSizeL1);\r\n          }\r\n\r\n          const padding = 2;\r\n          const background = new fabric.Rect({\r\n            left: midX + midWidth / 2,\r\n            top: boxY + shelfHeight / 2,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n            height: wrappedText.getScaledHeight() + 2,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(shelf, background, wrappedText);\r\n        } else if (mf.productResolutionLevel === \"L2\") {\r\n          for (let i = 0; i < shelfCount; i++) {\r\n            const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n            const shelf = new fabric.Rect({\r\n              left: midX,\r\n              top: boxY,\r\n              width: midWidth,\r\n              height: boxHeight,\r\n              stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n              strokeWidth: 0.27,\r\n              fill: \"white\",\r\n            });\r\n\r\n            shelves.push(shelf);\r\n\r\n            if (mf.shelfConfig?.[i].shelfType === \"tray\") {\r\n              const trayRows = mf.shelfConfig?.[i].trayRows || 1;\r\n              const rowSpacing = boxHeight / trayRows;\r\n\r\n              for (let r = 1; r < trayRows; r++) {\r\n                const lineY = boxY + r * rowSpacing;\r\n\r\n                const trayLine = new fabric.Line(\r\n                  [midX, lineY, midX + midWidth, lineY],\r\n                  {\r\n                    stroke: \"#999\",\r\n                    strokeWidth: 0.2,\r\n                    selectable: false,\r\n                    evented: false,\r\n                  },\r\n                );\r\n\r\n                shelves.push(trayLine);\r\n              }\r\n            }\r\n\r\n            const text =\r\n              mf.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n            // L2: Single-line with ellipsis within shelf rect (midWidth)\r\n            const horizontalPadding = 6; // padding inside shelf rect\r\n            const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n            const maxTextHeight = boxHeight * 0.8;\r\n            const baseFontSize = 5;\r\n\r\n            // Use single-line text measurement to avoid multi-line wrapping during measurement\r\n            const measure = (t: string) =>\r\n              new fabric.Text(t, {\r\n                fontSize: baseFontSize,\r\n                fontFamily: \"Inter\",\r\n                fontWeight: \"500\",\r\n              });\r\n\r\n            let displayText = text;\r\n            let measured = measure(displayText);\r\n\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              const ellipsis = \"...\";\r\n              let leftIdx = 0;\r\n              let rightIdx = text.length;\r\n\r\n              while (leftIdx < rightIdx) {\r\n                const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n                const candidate = text.slice(0, midIdx) + ellipsis;\r\n                measured = measure(candidate);\r\n                if ((measured.width ?? 0) > maxTextWidth) {\r\n                  rightIdx = midIdx;\r\n                } else {\r\n                  leftIdx = midIdx + 1;\r\n                }\r\n              }\r\n              displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n              measured = measure(displayText);\r\n            }\r\n\r\n            const padding = 2;\r\n            const background = new fabric.Rect({\r\n              left: midX + midWidth / 2,\r\n              top: boxY + boxHeight / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              width: midWidth, // match shelf rect width\r\n              height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n              fill: \"rgba(255, 255, 255, 0.5)\",\r\n              selectable: false,\r\n              evented: false,\r\n              rx: 1,\r\n              ry: 1,\r\n            });\r\n\r\n            const finalText = new fabric.Text(displayText, {\r\n              left: midX + midWidth / 2,\r\n              top: boxY + boxHeight / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: baseFontSize,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"500\",\r\n              fill: \"#333\",\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(background, finalText);\r\n          }\r\n        } else if (mf.productResolutionLevel === \"L3\") {\r\n          const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n          let previousZone: string | null = null;\r\n\r\n          for (const shelf of mf.shelfConfig) {\r\n            const zone = shelf.zone || \"Unknown\";\r\n            if (zone !== previousZone) {\r\n              sequentialGroups.push({ zone, shelves: [shelf] });\r\n              previousZone = zone;\r\n            } else {\r\n              sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n            }\r\n          }\r\n\r\n          let currentShelfIndex = 0;\r\n\r\n          for (const group of sequentialGroups) {\r\n            const { zone, shelves: shelvesInGroup } = group;\r\n\r\n            const groupStartIndex = currentShelfIndex;\r\n            const groupLength = shelvesInGroup.length;\r\n\r\n            const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n            const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n            for (let j = 0; j < shelvesInGroup.length; j++) {\r\n              const shelfData = shelvesInGroup[j];\r\n              const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n              const shelfRect = new fabric.Rect({\r\n                left: midX,\r\n                top: boxY,\r\n                width: midWidth,\r\n                height: boxHeight,\r\n                stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n                strokeWidth: 0.27,\r\n                fill: \"white\",\r\n              });\r\n\r\n              shelves.push(shelfRect);\r\n\r\n              if (shelfData.shelfType === \"tray\") {\r\n                const trayRows = shelfData.trayRows || 0;\r\n                const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n                const rowSpacing = boxHeight / trayRows;\r\n                const columnSpacing = midWidth / productPerShelf;\r\n\r\n                for (let r = 1; r < trayRows; r++) {\r\n                  const lineY = boxY + r * rowSpacing;\r\n\r\n                  const trayLine = new fabric.Line(\r\n                    [midX, lineY, midX + midWidth, lineY],\r\n                    {\r\n                      stroke: \"#999\",\r\n                      strokeWidth: 0.2,\r\n                      selectable: false,\r\n                      evented: false,\r\n                    },\r\n                  );\r\n\r\n                  shelves.push(trayLine);\r\n                }\r\n\r\n                for (let c = 1; c < productPerShelf; c++) {\r\n                  const lineX = midX + c * columnSpacing;\r\n\r\n                  const verticalLine = new fabric.Line(\r\n                    [lineX, boxY, lineX, boxY + boxHeight],\r\n                    {\r\n                      stroke: \"#999\",\r\n                      strokeWidth: 0.2,\r\n                      selectable: false,\r\n                      evented: false,\r\n                    },\r\n                  );\r\n\r\n                  shelves.push(verticalLine);\r\n                }\r\n              }\r\n              currentShelfIndex++;\r\n            }\r\n\r\n            const groupBottomLine = new fabric.Line(\r\n              [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n              {\r\n                stroke: isMaster ? \"#717BBC\" : \"#51C1FF\",\r\n                strokeWidth: 1,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(groupBottomLine);\r\n\r\n            if (mf.fixtureType === \"wall\") {\r\n              const labelPadding = 2;\r\n              const labelText = new fabric.Textbox(zone, {\r\n                left: midX + midWidth - labelPadding,\r\n                top: groupBottomY,\r\n                fontSize: 5,\r\n                fontFamily: \"Inter\",\r\n                fontWeight: \"600\",\r\n                fill: \"#707070\",\r\n                originX: \"right\",\r\n                originY: \"bottom\",\r\n                width: midWidth / 2,\r\n                textAlign: \"right\",\r\n              });\r\n\r\n              shelves.push(labelText);\r\n            }\r\n\r\n            const groupCenterX = midX + midWidth / 2;\r\n            const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n            const sectionBrands = new Set();\r\n\r\n            shelvesInGroup?.forEach((shelf) => {\r\n              shelf.productBrandName?.forEach((brand: string) => {\r\n                sectionBrands.add(brand);\r\n              });\r\n            });\r\n\r\n            if ([...sectionBrands].length) {\r\n              const text = [...sectionBrands].join(\" + \");\r\n              const padding = 2;\r\n              const maxTextWidth = midWidth;\r\n              const rectWidth = midWidth * 0.9;\r\n              const maxTextHeight = 20;\r\n\r\n              let fontSize = 6;\r\n              let wrappedText;\r\n\r\n              const createTextbox = (fs: any) => {\r\n                return new fabric.Textbox(text, {\r\n                  fontSize: fs,\r\n                  fontFamily: \"Inter\",\r\n                  fontWeight: \"400\",\r\n                  width: maxTextWidth,\r\n                  textAlign: \"center\",\r\n                  originX: \"center\",\r\n                  originY: \"center\",\r\n                  fill: \"#101828\",\r\n                  selectable: false,\r\n                  evented: false,\r\n                  left: groupCenterX,\r\n                  top: groupCenterY,\r\n                });\r\n              };\r\n\r\n              do {\r\n                wrappedText = createTextbox(fontSize);\r\n                fontSize -= 0.5;\r\n              } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n              const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n              const groupCenterText = new fabric.Rect({\r\n                left: groupCenterX,\r\n                top: groupCenterY,\r\n                originX: \"center\",\r\n                originY: \"center\",\r\n                width: rectWidth,\r\n                height: rectHeight,\r\n                fill: \"rgba(255, 255, 255, 0.5)\",\r\n                selectable: false,\r\n                evented: false,\r\n                rx: 1,\r\n                ry: 1,\r\n              });\r\n\r\n              shelves.push(groupCenterText, wrappedText);\r\n            }\r\n          }\r\n        }\r\n\r\n        if (mf?.vmConfig?.length) {\r\n          for (let i = 0; i < mf.vmConfig.length; i++) {\r\n            try {\r\n              const vm = mf.vmConfig[i];\r\n              const startIndex = vm.startYPosition - 1;\r\n              const endIndex = vm.endYPosition - 1;\r\n\r\n              const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n              const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n              let vmHeightPx: number = shelfHeightSpan;\r\n              let y: number = shelfTopY;\r\n\r\n              if (vm.yZone && vm.yZone !== \"stretch\") {\r\n                vmHeightPx = shelfHeightSpan / 3;\r\n\r\n                switch (vm.yZone) {\r\n                  case \"top\":\r\n                    y = shelfTopY;\r\n                    break;\r\n                  case \"middle\":\r\n                    y = shelfTopY + vmHeightPx;\r\n                    break;\r\n                  case \"bottom\":\r\n                    y = shelfTopY + 2 * vmHeightPx;\r\n                    break;\r\n                  default:\r\n                    y = shelfTopY;\r\n                }\r\n              }\r\n\r\n              let x = midX;\r\n              let width = midWidth;\r\n\r\n              if (!vm.xZone || vm.xZone === \"stretch\") {\r\n                width = midWidth;\r\n                x = midX;\r\n              } else {\r\n                const sectionWidth = midWidth / 3;\r\n                switch (vm.xZone) {\r\n                  case \"left\":\r\n                    width = sectionWidth;\r\n                    x = midX;\r\n                    break;\r\n                  case \"middle\":\r\n                    width = sectionWidth;\r\n                    x = midX + sectionWidth;\r\n                    break;\r\n                  case \"right\":\r\n                    width = sectionWidth;\r\n                    x = midX + 2 * sectionWidth;\r\n                    break;\r\n                  default:\r\n                    width = midWidth;\r\n                    x = midX;\r\n                }\r\n              }\r\n\r\n              if (vm?.vmImageUrl) {\r\n                try {\r\n                  const vmImage: any = await fabric.FabricImage.fromURL(\r\n                    `${this.cdnUrl}${vm.vmImageUrl}`,\r\n                    {\r\n                      crossOrigin: \"anonymous\",\r\n                    },\r\n                  );\r\n\r\n                  vmImage.set({\r\n                    left: x + width / 2,\r\n                    top: y + vmHeightPx / 2,\r\n                    originX: \"center\",\r\n                    originY: \"center\",\r\n                    scaleX: width / vmImage.width!,\r\n                    scaleY: vmHeightPx / vmImage.height!,\r\n                    selectable: false,\r\n                    evented: false,\r\n                  });\r\n\r\n                  shelves.push(vmImage);\r\n                } catch (err) {\r\n                  console.error(\r\n                    `Error loading image for VM: ${vm.vmImageUrl}`,\r\n                    err,\r\n                  );\r\n                }\r\n              } else {\r\n                const vmBox = new fabric.Rect({\r\n                  left: x,\r\n                  top: y,\r\n                  width,\r\n                  height: vmHeightPx,\r\n                  fill: \"#6938EF\",\r\n                  selectable: false,\r\n                  evented: false,\r\n                });\r\n\r\n                let fontSize = 5;\r\n                let vmText;\r\n\r\n                const createVmText = (fs: number) =>\r\n                  new fabric.Textbox(vm.vmName || \"\", {\r\n                    left: x + width / 2,\r\n                    top: y + vmHeightPx / 2,\r\n                    originX: \"center\",\r\n                    originY: \"center\",\r\n                    fontSize: fs,\r\n                    fontFamily: \"Inter\",\r\n                    fontWeight: \"600\",\r\n                    fill: \"white\",\r\n                    textAlign: \"center\",\r\n                    width: width,\r\n                    selectable: false,\r\n                    evented: false,\r\n                  });\r\n\r\n                do {\r\n                  vmText = createVmText(fontSize);\r\n                  fontSize -= 0.5;\r\n                } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n                shelves.push(vmBox, vmText);\r\n              }\r\n            } catch (error) {\r\n              console.log(\"@@ ~ Error in drawing VM: \", error);\r\n            }\r\n          }\r\n        }\r\n\r\n        const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n        const lastBox = new fabric.Path(\r\n          `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n          {\r\n            fill: isMaster ? \"#EAECF5\" : \"#DAF1FF\",\r\n            stroke: isMaster ? \"#AFB5D9\" : \"#6BCAFF\",\r\n            strokeWidth: 0.27,\r\n          },\r\n        );\r\n\r\n        const lastBoxText = new fabric.Textbox(\r\n          `${mf?.footer?.label ? mf.footer.label : \"\"}`,\r\n          {\r\n            left: midX + midWidth / 2,\r\n            top: lastBoxY + boxHeight / 2,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: isMaster ? \"#363F72\" : \"#009BF3\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            textAlign: \"center\",\r\n            width: midWidth,\r\n            heigth: boxHeight,\r\n          },\r\n        );\r\n\r\n        const bottomWidth = width / 1.05;\r\n        const bottomHeight = (3 / 100) * height;\r\n        const bottomX = x + (width - bottomWidth) / 2;\r\n        const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n        const bottomContainer = new fabric.Rect({\r\n          left: bottomX,\r\n          top: bottomY,\r\n          width: bottomWidth,\r\n          height: bottomHeight,\r\n          rx: radius,\r\n          ry: radius,\r\n          stroke: \"transparent\",\r\n          fill: \"transparent\",\r\n        });\r\n\r\n        const actualShelfCount =\r\n          mf?.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\")\r\n            ?.length ?? 0;\r\n\r\n        const bottomTextContent = new fabric.Textbox(\r\n          `Shelves - ${actualShelfCount} . Products -  ${getFixtureProductCapacity(mf.shelfConfig)} . VM - ${mf.vmConfig.length}`,\r\n          {\r\n            left: bottomX + bottomWidth / 2,\r\n            top: bottomY + bottomHeight / 2,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n            fill: \"#333\",\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            textAlign: \"center\",\r\n            width: bottomWidth,\r\n            heigth: bottomHeight,\r\n          },\r\n        );\r\n\r\n        const groupChildren = [\r\n          mainContainer,\r\n          ...(!isMaster ? [topContainer, innerTopBox, innerTopText] : []),\r\n          innerBottomBox,\r\n          innerBottomText,\r\n          midContainer,\r\n          firstBox,\r\n          firstBoxText,\r\n          ...(!isMaster ? [editIconPath] : []),\r\n          copyIconPath,\r\n          ...shelves,\r\n          lastBox,\r\n          lastBoxText,\r\n          bottomContainer,\r\n          bottomTextContent,\r\n        ];\r\n\r\n        const fixtureGroup = new fabric.Group(groupChildren, {\r\n          left: x,\r\n          top: y,\r\n          evented: true,\r\n          subTargetCheck: true,\r\n          selectable: false,\r\n          hoverCursor: \"pointer\",\r\n          // angle: mf.relativePosition?.angle ?? 0\r\n        }) as FixtureGroup;\r\n\r\n        fixtureGroup.fixtureId = mf._id;\r\n        fixtureGroup.fixtureType = mf.fixtureType;\r\n        fixtureGroup.groupName = mf?.templateGroupName ?? \"\";\r\n        fixtureGroup.templateType = mf.templateType;\r\n        fixtureGroup.name = mf.templateType ?? \"fixture\";\r\n        fixtureGroup.storeCount = mf?.storeCount ?? 0;\r\n        fixtureGroup.parentFabric = parentFabric;\r\n\r\n        fixtureGroup.on(\"mousedown\", (opt: any) => {\r\n          const childName = opt.subTargets?.[0]?.name;\r\n\r\n          if (childName !== undefined) return;\r\n\r\n          if (\r\n            isMaster &&\r\n            this.selectedMasterId !== mf._id &&\r\n            !this.preventClick\r\n          ) {\r\n            this.preventClick = true;\r\n            this.clearOldFixtureTemplatesFromCanvas(\"storeNames\");\r\n            this.clearArrowById(this.selectedSubTemplateId);\r\n            this.clearArrowById(this.selectedMasterId);\r\n            this.clearOldFixtureTemplatesFromCanvas(\"sub\");\r\n            this.selectedMasterId = mf._id;\r\n\r\n            const { gx, gy } = this.getGroupCenterBottom(\r\n              fixtureGroup as fabric.Group,\r\n            );\r\n            this.renderSubFixtures(fixtureGroup, gx, gy + 50);\r\n          }\r\n\r\n          if (\r\n            !isMaster &&\r\n            this.selectedSubTemplateId !== mf._id &&\r\n            !this.preventClick\r\n          ) {\r\n            this.clearOldFixtureTemplatesFromCanvas(\"storeNames\");\r\n            this.clearArrowById(this.selectedSubTemplateId);\r\n            this.selectedSubTemplateId = mf._id;\r\n\r\n            const { gx, gy } = this.getGroupCenterBottom(\r\n              fixtureGroup as fabric.Group,\r\n            );\r\n            this.renderStoreNames(fixtureGroup, mf.store ?? [], gx, gy + 50);\r\n          }\r\n        });\r\n\r\n        return fixtureGroup;\r\n      }),\r\n    );\r\n\r\n    let totalWidth = 0;\r\n    groups.forEach((group) => {\r\n      totalWidth += group.width! + groupSpacing;\r\n    });\r\n\r\n    totalWidth -= groupSpacing;\r\n    let nx = x - totalWidth / 2;\r\n\r\n    groups.forEach((group) => {\r\n      group.set({ left: nx, top: y });\r\n      nx += group.width! + groupSpacing;\r\n      this.canvas.add(group);\r\n    });\r\n    return groups;\r\n  }\r\n\r\n  renderStoreNames(\r\n    parentGroup: fabric.Group,\r\n    stores: { storeName?: string; storeId?: string }[],\r\n    x: number,\r\n    y: number,\r\n  ) {\r\n    if (!stores.length) {\r\n      this.toast.getPrimaryToast(\"No stores assigned to this variant\");\r\n      return;\r\n    }\r\n\r\n    const groupSpacing = 15;\r\n    const groups: fabric.Group[] = [];\r\n    let totalWidth = 0;\r\n\r\n    stores.forEach((store) => {\r\n      const label = store.storeName || \"Unnamed Store\";\r\n      const fontSize = 11;\r\n      const paddingX = 20;\r\n      const paddingY = 12;\r\n\r\n      const text = new fabric.FabricText(label, {\r\n        fontSize,\r\n        fill: \"#363F72\",\r\n        fontFamily: \"Inter, Arial, sans-serif\",\r\n        fontWeight: \"500\",\r\n        originX: \"left\",\r\n        originY: \"top\",\r\n      });\r\n\r\n      const rectWidth = text.width! + 2 * paddingX;\r\n      const rectHeight = text.height! + 2 * paddingY;\r\n\r\n      const rect = new fabric.Rect({\r\n        rx: 6,\r\n        ry: 6,\r\n        width: rectWidth,\r\n        height: rectHeight,\r\n        fill: \"#F8F9FC\",\r\n        stroke: \"#AFB5D9\",\r\n        strokeWidth: 1.5,\r\n      });\r\n\r\n      text.set({\r\n        left: paddingX,\r\n        top: (rectHeight - text.height!) / 2,\r\n      });\r\n\r\n      const group = new fabric.Group([rect, text], {\r\n        selectable: false,\r\n        hoverCursor: \"default\",\r\n      }) as fabric.Group & { templateType: string };\r\n\r\n      group.templateType = \"storeNames\";\r\n\r\n      groups.push(group);\r\n      totalWidth += group.width! + groupSpacing;\r\n    });\r\n\r\n    totalWidth -= groupSpacing;\r\n    let nx = x - totalWidth / 2;\r\n\r\n    groups.forEach((group) => {\r\n      group.set({ left: nx, top: y });\r\n      nx += group.width! + groupSpacing;\r\n      this.canvas.add(group);\r\n      this.drawArrow(parentGroup, group, this.selectedSubTemplateId);\r\n    });\r\n  }\r\n\r\n  getGroupCenterBottom(group: fabric.Group): { gx: number; gy: number } {\r\n    const center = group.getCenterPoint();\r\n    const centerX = center.x;\r\n    const bottomY = group.top! + group.height!;\r\n    return { gx: centerX, gy: bottomY };\r\n  }\r\n\r\n  clearOldFixtureTemplatesFromCanvas(templateType: string) {\r\n    const groupsToRemove = this.canvas\r\n      .getObjects()\r\n      .filter(\r\n        (obj) =>\r\n          obj instanceof fabric.Group &&\r\n          (obj as any).templateType === templateType,\r\n      );\r\n\r\n    if (groupsToRemove) {\r\n      groupsToRemove.forEach((group) => this.canvas.remove(group));\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  drawArrow(fromGroup: fabric.Group, toGroup: fabric.Group, arrowId: string) {\r\n    const from = fromGroup.aCoords ?? fromGroup.calcOCoords();\r\n    const to = toGroup.aCoords ?? toGroup.calcOCoords();\r\n\r\n    const fromX = (from.bl.x + from.br.x) / 2;\r\n    const fromY = (from.bl.y + from.br.y) / 2;\r\n\r\n    const toX = (to.tl.x + to.tr.x) / 2;\r\n    const toY = (to.tl.y + to.tr.y) / 2;\r\n\r\n    const horizontalOffset = toX - fromX;\r\n    const verticalOffset = toY - fromY;\r\n    const curveSize = 14;\r\n\r\n    let pathData = \"\";\r\n\r\n    if (Math.abs(horizontalOffset) < 5) {\r\n      // Direct vertical line\r\n      pathData = `M ${fromX} ${fromY} L ${toX} ${toY}`;\r\n    } else {\r\n      const midY = fromY + verticalOffset / 2;\r\n      const direction = horizontalOffset > 0 ? 1 : -1;\r\n\r\n      const curve1X = fromX + direction * curveSize;\r\n      const curve2X = toX - direction * curveSize;\r\n\r\n      pathData = [\r\n        `M ${fromX} ${fromY}`,\r\n        `L ${fromX} ${midY - curveSize}`,\r\n        `Q ${fromX} ${midY} ${curve1X} ${midY}`,\r\n        `L ${curve2X} ${midY}`,\r\n        `Q ${toX} ${midY} ${toX} ${midY + curveSize}`,\r\n        `L ${toX} ${toY}`,\r\n      ].join(\" \");\r\n    }\r\n\r\n    const arrowLine = new fabric.Path(pathData, {\r\n      stroke: \"#AFB5D9\",\r\n      strokeWidth: 1.8,\r\n      fill: \"\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    // Arrowhead\r\n    const angle = Math.atan2(toY - (toY - 10), toX - toX);\r\n    const headlen = 10;\r\n    const arrowHead = new fabric.Path(\r\n      [\r\n        `M ${toX} ${toY}`,\r\n        `L ${toX - headlen * Math.cos(angle - Math.PI / 5)} ${\r\n          toY - headlen * Math.sin(angle - Math.PI / 5)\r\n        }`,\r\n        `M ${toX} ${toY}`,\r\n        `L ${toX - headlen * Math.cos(angle + Math.PI / 5)} ${\r\n          toY - headlen * Math.sin(angle + Math.PI / 5)\r\n        }`,\r\n      ].join(\" \"),\r\n      {\r\n        stroke: \"#AFB5D9\",\r\n        strokeWidth: 1.8,\r\n        selectable: false,\r\n        evented: false,\r\n      },\r\n    );\r\n\r\n    // Grouping both line and arrowhead\r\n    const arrowGroup = new fabric.Group([arrowLine, arrowHead], {\r\n      selectable: false,\r\n      evented: false,\r\n    }) as fabric.Group & { arrowId: string };\r\n\r\n    // Attach custom arrow ID\r\n    arrowGroup.arrowId = arrowId;\r\n\r\n    this.canvas.add(arrowGroup);\r\n  }\r\n\r\n  clearArrowById(arrowId: string) {\r\n    if (!arrowId) return;\r\n\r\n    const arrowGroup = this.canvas\r\n      .getObjects()\r\n      .filter(\r\n        (obj) =>\r\n          obj instanceof fabric.Group && (obj as any).arrowId === arrowId,\r\n      );\r\n\r\n    if (arrowGroup.length) {\r\n      arrowGroup.forEach((group) => this.canvas.remove(group));\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onDuplicate(fixture: any) {\r\n    this.storeBuilderService\r\n      .duplicateFixtureTemplate({ templateId: fixture.fixtureId })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            const currentFixture =\r\n              fixture.templateType === \"master\"\r\n                ? fixture\r\n                : fixture.parentFabric;\r\n\r\n            this.clearArrowById(this.selectedMasterId);\r\n            this.clearOldFixtureTemplatesFromCanvas(\"sub\");\r\n            this.selectedMasterId = currentFixture.fixtureId;\r\n\r\n            const { gx, gy } = this.getGroupCenterBottom(currentFixture);\r\n            this.renderSubFixtures(currentFixture, gx, gy + 50);\r\n            this.toast.getSuccessToast(res.data.message);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to create variant\",\r\n          );\r\n          console.log(\"@@ ~ duplicateFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div id=\"tree-canvas-card\" class=\"w-100 p-6\">\r\n  <!-- Filter bar -->\r\n  <div class=\"tree-filter-bar\" *ngIf=\"viewMode === 'group'\">\r\n    <div class=\"filter-chips\">\r\n      <div class=\"filter-chip\" *ngFor=\"let filterKey of ['templateGroupNames', 'fixtureNames', 'storeNames']\">\r\n        <button\r\n          class=\"filter-btn\"\r\n          [class.active]=\"getActiveFilterCount(filterKey) > 0\"\r\n          (click)=\"toggleFilterDropdown(filterKey)\"\r\n        >\r\n          {{ filterKey === 'templateGroupNames' ? 'Template Group' : filterKey === 'fixtureNames' ? 'Master Template' : 'Store Name' }}\r\n          <span class=\"filter-count\" *ngIf=\"getActiveFilterCount(filterKey) > 0\">{{ getActiveFilterCount(filterKey) }}</span>\r\n          <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M1 1L5 5L9 1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>\r\n        </button>\r\n\r\n        <div class=\"filter-dropdown\" *ngIf=\"openFilterKey === filterKey\">\r\n          <div class=\"filter-search\">\r\n            <input\r\n              type=\"text\"\r\n              placeholder=\"Search...\"\r\n              [(ngModel)]=\"filterSearch[filterKey]\"\r\n              (click)=\"$event.stopPropagation()\"\r\n            />\r\n          </div>\r\n          <div class=\"filter-options\">\r\n            <label\r\n              class=\"filter-option\"\r\n              *ngFor=\"let option of getFilteredOptions(filterKey)\"\r\n              (click)=\"$event.stopPropagation()\"\r\n            >\r\n              <input\r\n                type=\"checkbox\"\r\n                [checked]=\"isFilterSelected(filterKey, option)\"\r\n                (change)=\"toggleFilter(filterKey, option)\"\r\n              />\r\n              <span>{{ option }}</span>\r\n            </label>\r\n            <div class=\"filter-empty\" *ngIf=\"getFilteredOptions(filterKey).length === 0\">\r\n              No options found\r\n            </div>\r\n          </div>\r\n          <div class=\"filter-actions\">\r\n            <button class=\"filter-apply-btn\" (click)=\"applyFilters()\">Apply</button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <button class=\"filter-clear-btn\" *ngIf=\"hasActiveFilters()\" (click)=\"clearAllFilters()\">\r\n        Clear all\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <canvas id=\"template-canvas\" #templateCanvas></canvas>\r\n  <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n    <div class=\"d-flex align-items-center\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\" class=\"me-1\">\r\n        <circle cx=\"4.8431\" cy=\"5.49996\" r=\"4.8431\" fill=\"#6172F3\" />\r\n      </svg>\r\n      <p class=\"m-0 me-3\">Master Template</p>\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\" class=\"me-1\">\r\n        <circle cx=\"5.44466\" cy=\"5.49996\" r=\"4.8431\" fill=\"#33B5FF\" />\r\n      </svg>\r\n      <p class=\"m-0\">Variant/Child Template</p>\r\n    </div>\r\n    <div class=\"zoom\">\r\n      <div class=\"zoom-in\" (click)=\"zoomIn()\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n          <path d=\"M12 5V19M5 12H19\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </div>\r\n      <div class=\"divider\"></div>\r\n      <div class=\"zoom-out\" (click)=\"zoomOut()\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n          <path d=\"M5 12H19\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import {\r\n  Component,\r\n  EventEmitter,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Subject } from \"rxjs\";\r\n\r\nexport interface FilterOption {\r\n  name: string;\r\n  value: any;\r\n  checked: boolean;\r\n}\r\n\r\nexport interface FilterConfig {\r\n  title: string;\r\n  type: \"multi\" | \"single\";\r\n  isOpened: boolean;\r\n  options: FilterOption[];\r\n}\r\n\r\n@Component({\r\n  selector: \"lib-dynamic-filter\",\r\n  standalone: true,\r\n  imports: [FormsModule, CommonModule],\r\n  templateUrl: \"./dynamic-filter.component.html\",\r\n  styleUrl: \"./dynamic-filter.component.scss\",\r\n})\r\nexport class DynamicFilterComponent implements OnInit, OnChanges, OnDestroy {\r\n  @Input() filterObject: FilterConfig[] = [];\r\n\r\n  isFilterOpen = false;\r\n  displayedOptions: FilterOption[][] = [];\r\n  isFilterApplied: boolean = false;\r\n  filters: FilterConfig[] = [];\r\n\r\n  @Output() applyFilters = new EventEmitter<any>();\r\n  @Output() resetFilters = new EventEmitter<any>();\r\n  @Output() filterChanged = new EventEmitter<any>();\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  ngOnInit(): void {\r\n    this.initializeFilters();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"filterObject\"]?.currentValue) {\r\n      this.initializeFilters();\r\n    }\r\n  }\r\n\r\n  initializeFilters(): void {\r\n    // Deep clone the filterObject to avoid mutating the input\r\n    this.filters = this.filterObject.map((filter) => ({\r\n      ...filter,\r\n      isOpened: false,\r\n      options: filter.options.map((opt) => ({ ...opt })),\r\n    }));\r\n\r\n    this.displayedOptions = this.filters.map((f) =>\r\n      f.options ? [...f.options] : []\r\n    );\r\n\r\n    this.checkIfFilterApplied();\r\n  }\r\n\r\n  @HostListener(\"document:click\", [\"$event\"])\r\n  handleDocumentClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n\r\n    if (target.closest(\".item-button\") || target.closest(\".item-dropdown\"))\r\n      return;\r\n\r\n    this.filters.forEach((f, i) => {\r\n      if (f.isOpened) this.resetSearch(i);\r\n      f.isOpened = false;\r\n    });\r\n\r\n    if (target.closest(\".filter-dropdown\")) return;\r\n\r\n    this.isFilterOpen = false;\r\n  }\r\n\r\n  toggleFilter(event: MouseEvent) {\r\n    event.stopPropagation();\r\n    this.isFilterOpen = !this.isFilterOpen;\r\n  }\r\n\r\n  toggleItem(event: MouseEvent, itemIndex: number) {\r\n    event.stopPropagation();\r\n\r\n    this.filters.forEach((f, i) => {\r\n      if (i === itemIndex) {\r\n        f.isOpened = !f.isOpened;\r\n        if (!f.isOpened) this.resetSearch(i);\r\n      } else {\r\n        if (f.isOpened) this.resetSearch(i);\r\n        f.isOpened = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  resetSearch(filterIndex: number) {\r\n    this.displayedOptions[filterIndex] = [...this.filters[filterIndex].options];\r\n  }\r\n\r\n  onSingleSelect(filter: FilterConfig, option: FilterOption) {\r\n    const index = this.filters.indexOf(filter);\r\n    if (index === -1) return;\r\n\r\n    this.filters[index].options.forEach((o) => (o.checked = false));\r\n    option.checked = true;\r\n\r\n    this.displayedOptions[index] = [...this.filters[index].options];\r\n    this.filters[index].isOpened = false;\r\n\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  onOptionChange(filter: FilterConfig, option: FilterOption) {\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  isAllVisibleSelected(filterIndex: number): boolean {\r\n    const visible = this.displayedOptions[filterIndex];\r\n    return visible.length > 0 && visible.every((v) => v.checked);\r\n  }\r\n\r\n  isAllVisibleSelectedByFilter(filter: FilterConfig): boolean {\r\n    const i = this.filters.indexOf(filter);\r\n    if (i === -1) return false;\r\n    return this.isAllVisibleSelected(i);\r\n  }\r\n\r\n  toggleSelectAllVisible(event: any, filterIndex: number) {\r\n    const checked = event.target.checked;\r\n    this.displayedOptions[filterIndex].forEach((opt) => (opt.checked = checked));\r\n\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  toggleSelectAllVisibleByFilter(event: any, filter: FilterConfig) {\r\n    const i = this.filters.indexOf(filter);\r\n    if (i === -1) return;\r\n    this.toggleSelectAllVisible(event, i);\r\n  }\r\n\r\n  onSearch(event: any, filterIndex: number) {\r\n    const term = event.target.value.toLowerCase().trim();\r\n    const fullList = this.filters[filterIndex].options;\r\n\r\n    if (!term) {\r\n      this.displayedOptions[filterIndex] = [...fullList];\r\n      return;\r\n    }\r\n\r\n    this.displayedOptions[filterIndex] = fullList.filter((o) =>\r\n      o.name.toLowerCase().includes(term)\r\n    );\r\n  }\r\n\r\n  getSelectedData() {\r\n    return this.filters.map((f) => {\r\n      if (f.type === \"single\") {\r\n        const sel = f.options.find((o) => o.checked);\r\n        return { title: f.title, selected: sel ? sel.value : null };\r\n      }\r\n\r\n      return {\r\n        title: f.title,\r\n        selected: f.options.filter((o) => o.checked).map((o) => o.value),\r\n      };\r\n    });\r\n  }\r\n\r\n  emitFilterChanges() {\r\n    this.filterChanged.emit(this.getSelectedData());\r\n    this.checkIfFilterApplied();\r\n  }\r\n\r\n  checkIfFilterApplied() {\r\n    const selectedData = this.getSelectedData();\r\n    this.isFilterApplied = selectedData.some((data) => {\r\n      if (data.selected === null) return false;\r\n      if (Array.isArray(data.selected)) return data.selected.length > 0;\r\n      return true;\r\n    });\r\n  }\r\n\r\n  onApplyFilter() {\r\n    this.isFilterOpen = false;\r\n    this.filters.forEach((f) => (f.isOpened = false));\r\n    const finalData = this.getSelectedData();\r\n    this.applyFilters.emit(finalData);\r\n  }\r\n\r\n  onResetFilter() {\r\n    this.filters.forEach((f) => f.options.forEach((o) => (o.checked = false)));\r\n\r\n    this.filters.forEach((_, i) => {\r\n      this.displayedOptions[i] = [...this.filters[i].options];\r\n    });\r\n\r\n    this.isFilterOpen = false;\r\n    this.filters.forEach((f) => (f.isOpened = false));\r\n\r\n    this.resetFilters.emit(this.getSelectedData());\r\n    this.isFilterApplied = false;\r\n  }\r\n\r\n  getSelectedCount(index: number) {\r\n    return this.filters[index].options.filter((o) => o.checked).length;\r\n  }\r\n\r\n  getSelectedItem(index: number) {\r\n    return this.filters[index].options.find((o) => o.checked) ?? null;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div class=\"position-relative\">\r\n    <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n        Filter\r\n        @if(isFilterApplied){\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n            <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n        </svg>\r\n        }\r\n\r\n    </button>\r\n\r\n    @if(isFilterOpen){\r\n    <div class=\"filter-dropdown\">\r\n\r\n        <div class=\"filter-header\">\r\n            <h2>Filter Options</h2>\r\n            <div class=\"d-flex gap-2\">\r\n                <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n                <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\">Apply</button>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"filter-body\">\r\n\r\n            @for (filter of filters; let fi = $index; track fi) {\r\n\r\n            <div class=\"item-wrapper\">\r\n\r\n                <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n                    <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n                        @if(filter.type === 'multi'){\r\n                        {{filter.title}}\r\n                        @if(getSelectedCount(fi) > 0){\r\n                        <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n                        }\r\n                        }\r\n                        @else {\r\n                        {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n                        }\r\n                    </div>\r\n\r\n                </div>\r\n\r\n                @if(filter.isOpened){\r\n                <div class=\"item-dropdown\">\r\n\r\n                    @if(filter.type === 'multi'){\r\n                    <div>\r\n                        <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n                            (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n                        <label [for]=\"'selectAll' + fi\">Select all</label>\r\n                    </div>\r\n\r\n                    <hr>\r\n\r\n                    <div class=\"my-2\">\r\n                        <span class=\"search-icon\">\r\n                            <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n                                <path\r\n                                    d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"1.3\" />\r\n                            </svg>\r\n                        </span>\r\n                        <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n                            (input)=\"onSearch($event, fi)\">\r\n                    </div>\r\n                    }\r\n\r\n                    @if(displayedOptions[fi].length == 0){\r\n                    <span class=\"no-data\">No Data</span>\r\n                    }\r\n                    @else {\r\n\r\n                    @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n                    @if(filter.type === 'single'){\r\n                    <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n                        <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n                        <label>{{ option.name }}</label>\r\n                    </div>\r\n                    }\r\n\r\n                    @if(filter.type === 'multi'){\r\n                    <div class=\"mb-4\">\r\n                        <input type=\"checkbox\" [id]=\"'option-' + fi + '-' + oi\" [(ngModel)]=\"option.checked\"\r\n                            (change)=\"onOptionChange(filter, option)\">\r\n                        <label [for]=\"'option-' + fi + '-' + oi\">{{ option.name }}</label>\r\n                    </div>\r\n                    }\r\n\r\n                    }\r\n                    }\r\n\r\n                </div>\r\n                }\r\n\r\n            </div>\r\n\r\n            }\r\n\r\n        </div>\r\n    </div>\r\n    }\r\n</div>\r\n","import { Component, inject } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'lib-cancel-confirmation-modal',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  templateUrl: './cancel-confirmation-modal.component.html',\r\n  styleUrl: './cancel-confirmation-modal.component.scss'\r\n})\r\nexport class CancelConfirmationModalComponent {\r\n  activeModal = inject(NgbActiveModal);\r\n\r\n  onKeepProcessing(): void {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onCancelBatchProcess(): void {\r\n    this.activeModal.close(true);\r\n  }\r\n}\r\n","<div class=\"modal-content-custom\">\r\n    <!-- Modal Header -->\r\n    <div class=\"modal-header-custom\">\r\n        <h5 class=\"modal-title\">Abort batch process?</h5>\r\n    </div>\r\n    \r\n    <!-- Modal Body -->\r\n    <div class=\"modal-body-custom\">\r\n        <p class=\"description-text\">This will cancel the batch process and discard any progress. Are you sure you want to continue?</p>\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)=\"onKeepProcessing()\">Keep Processing</button>\r\n        <button type=\"button\" class=\"btn btn-primary-custom\" (click)=\"onCancelBatchProcess()\">Cancel Batch Process</button>\r\n    </div>\r\n</div>\r\n","import { Component, inject, ViewChild, ElementRef, Input, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n  selector: 'lib-reschedule-modal',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './reschedule-modal.component.html',\r\n  styleUrl: './reschedule-modal.component.scss'\r\n})\r\nexport class RescheduleModalComponent implements OnInit {\r\n  activeModal = inject(NgbActiveModal);\r\n  \r\n  @ViewChild('dateInput') dateInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  @Input() initialScheduleDate: string | null = null;\r\n  @Input() initialSchedule: boolean = false;\r\n  \r\n  schedule: boolean = false;\r\n  scheduleDate: string = '';\r\n\r\n  ngOnInit(): void {\r\n    // Pre-fill the schedule value\r\n    this.schedule = this.initialSchedule;\r\n    \r\n    // Pre-fill the schedule date if it exists\r\n    if (this.initialScheduleDate) {\r\n      // Convert the date to YYYY-MM-DD format if needed\r\n      const date = new Date(this.initialScheduleDate);\r\n      if (!isNaN(date.getTime())) {\r\n        const dateStr = date.toISOString().split('T')[0];\r\n        const tomorrow = new Date();\r\n        tomorrow.setDate(tomorrow.getDate() + 1);\r\n        const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n        // Only use the initial date if it's tomorrow or later\r\n        this.scheduleDate = dateStr >= tomorrowStr ? dateStr : tomorrowStr;\r\n      }\r\n    }\r\n    \r\n    // If schedule is enabled, ensure date is set to tomorrow (or later)\r\n    if (this.schedule) {\r\n      const tomorrow = new Date();\r\n      tomorrow.setDate(tomorrow.getDate() + 1);\r\n      const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n      if (!this.scheduleDate || this.scheduleDate < tomorrowStr) {\r\n        this.scheduleDate = tomorrowStr;\r\n      }\r\n    }\r\n  }\r\n\r\n  get minDate(): string {\r\n    const tomorrow = new Date();\r\n    tomorrow.setDate(tomorrow.getDate() + 1);\r\n    return tomorrow.toISOString().split('T')[0];\r\n  }\r\n\r\n  openDatePicker(event: Event): void {\r\n    // Ensure date is set to tomorrow if empty or invalid\r\n    if (this.schedule && (!this.scheduleDate || this.scheduleDate < this.minDate)) {\r\n      this.scheduleDate = this.minDate;\r\n    }\r\n    \r\n    const input = event.target as HTMLInputElement;\r\n    if (input && 'showPicker' in input && typeof (input as any).showPicker === 'function') {\r\n      // Modern browsers support showPicker()\r\n      (input as any).showPicker();\r\n    } else {\r\n      // Fallback: focus the input which should trigger the picker\r\n      input.focus();\r\n      input.click();\r\n    }\r\n  }\r\n\r\n  onCancel(): void {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onScheduleChange(): void {\r\n    if (this.schedule) {\r\n      // Always set default date to tomorrow when schedule is checked\r\n      // This ensures the input always shows tomorrow, not today\r\n      const tomorrow = new Date();\r\n      tomorrow.setDate(tomorrow.getDate() + 1);\r\n      const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n      \r\n      // Only update if scheduleDate is empty or if it's today's date\r\n      if (!this.scheduleDate || this.scheduleDate < tomorrowStr) {\r\n        this.scheduleDate = tomorrowStr;\r\n      }\r\n    } else {\r\n      // Clear schedule date when schedule is unchecked\r\n      this.scheduleDate = '';\r\n    }\r\n  }\r\n\r\n  onReschedule(): void {\r\n    // If schedule is true, ensure date is set\r\n    if (this.schedule && !this.scheduleDate) {\r\n      return; // Don't allow reschedule with schedule=true without a date\r\n    }\r\n    this.activeModal.close({ \r\n      schedule: this.schedule, \r\n      scheduleDate: this.schedule ? this.scheduleDate : null \r\n    });\r\n  }\r\n}\r\n","<div class=\"modal-content-custom\">\r\n    <!-- Modal Header -->\r\n    <div class=\"modal-header-custom\">\r\n        <h5 class=\"modal-title\">Reschedule</h5>\r\n    </div>\r\n    \r\n    <!-- Modal Body -->\r\n    <div class=\"modal-body-custom\">\r\n        <p class=\"description-text\">Update the schedule settings for this find and replace task.</p>\r\n        <p class=\"description-text\">You can enable or disable scheduling and set a new date.</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                (ngModelChange)=\"onScheduleChange()\">\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                required\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)=\"onReschedule()\" [disabled]=\"schedule && !scheduleDate\">\r\n            {{ schedule ? 'Reschedule' : 'Rollout' }}\r\n        </button>\r\n    </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-revoke-confirmation',\r\n  templateUrl: './revoke-confirmation.component.html',\r\n  styleUrl: './revoke-confirmation.component.scss'\r\n})\r\nexport class RevokeConfirmationComponent {\r\n  @Input() title: string = 'Revoke Find and Replace';\r\n  @Input() description: string = 'Are you sure you want to revoke this find and replace?';\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n  ) { }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onRevoke() {\r\n    this.activeModal.close('ok');\r\n  }\r\n\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"d-flex flex-start mb-5\">\r\n    <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\" />\r\n      <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\" />\r\n      <path\r\n        d=\"M27.9998 24.0002V28.0002M27.9998 32.0002H28.0098M26.2898 18.8602L17.8198 33.0002C17.6451 33.3026 17.5527 33.6455 17.5518 33.9947C17.5508 34.3439 17.6413 34.6873 17.8142 34.9907C17.9871 35.2941 18.2365 35.547 18.5375 35.7241C18.8385 35.9012 19.1806 35.9964 19.5298 36.0002H36.4698C36.819 35.9964 37.1611 35.9012 37.4621 35.7241C37.7631 35.547 38.0124 35.2941 38.1854 34.9907C38.3583 34.6873 38.4488 34.3439 38.4478 33.9947C38.4468 33.6455 38.3544 33.3026 38.1798 33.0002L29.7098 18.8602C29.5315 18.5663 29.2805 18.3233 28.981 18.1547C28.6814 17.9861 28.3435 17.8975 27.9998 17.8975C27.656 17.8975 27.3181 17.9861 27.0186 18.1547C26.7191 18.3233 26.468 18.5663 26.2898 18.8602Z\"\r\n        stroke=\"#DC6803\"\r\n        stroke-width=\"2\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-danger px-4\" (click)=\"onRevoke()\">Revoke</button>\r\n  </div>\r\n</div>\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { DynamicFilterComponent, FilterConfig } from '../components/dynamic-filter/dynamic-filter.component';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { FindReplace, FindReplaceRequest, FindReplaceResponse } from '../models/find-replace.model';\r\nimport { Subject, Subscription, takeUntil, debounceTime, distinctUntilChanged } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CommonSharedModule, ToastService } from 'tango-app-ui-shared';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { DeleteConfirmationComponent } from '../../popups/delete-confirmation/delete-confirmation.component';\r\nimport { CancelConfirmationModalComponent } from '../find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component';\r\nimport { RescheduleModalComponent } from './reschedule-modal/reschedule-modal.component';\r\nimport { RevokeConfirmationComponent } from '../../popups/revoke-confirmation/revoke-confirmation.component';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\n\r\n@Component({\r\n  selector: 'lib-find-replace-table',\r\n  standalone: true,\r\n  imports: [DynamicFilterComponent, CommonModule, FormsModule, CommonSharedModule],\r\n  templateUrl: './find-replace-table.component.html',\r\n  styleUrl: './find-replace-table.component.scss'\r\n})\r\nexport class FindReplaceTableComponent implements OnInit, OnDestroy {\r\n  findReplaceList: FindReplace[] = [];\r\n\r\n  searchTerm: string = '';\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  sortedColumn: string = '';\r\n  sortOrder: number = -1;\r\n\r\n  appliedFilters: any = {\r\n    status: []\r\n  };\r\n\r\n  filterObject: FilterConfig[] = [\r\n    {\r\n      title: \"Status\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Draft\", value: \"draft\", checked: false },\r\n        { name: \"Batch Running\", value: \"batch-running\", checked: false },\r\n        { name: \"Yet To Approve\", value: \"yet-to-approve\", checked: false },\r\n        { name: \"Scheduled\", value: \"scheduled\", checked: false },\r\n        { name: \"Completed\", value: \"approved\", checked: false },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n  clientId: string = '';\r\n  isRefreshing: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private findReplaceSub?: Subscription;\r\n  private searchSubject = new Subject<string>();\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private router: Router,\r\n    private ngbModal: NgbModal,\r\n    private toast: ToastService,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService\r\n  ) {\r\n    // Setup search debounce\r\n    this.searchSubject.pipe(\r\n      debounceTime(1000),\r\n      distinctUntilChanged(),\r\n      takeUntil(this.destroy$)\r\n    ).subscribe(() => {\r\n      this.onSearch();\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    \r\n    // Get client ID\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          const headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string || '{}'\r\n          );\r\n          if (headerData?.client) {\r\n            this.clientId = headerData.client;\r\n          }\r\n        }\r\n        // Load data once clientId is available\r\n        if (this.clientId) {\r\n          this.getFindReplaceList();\r\n        }\r\n      });\r\n    \r\n    // Also try to get clientId from localStorage immediately\r\n    try {\r\n      const headerData = JSON.parse(\r\n        localStorage.getItem(\"header-filters\") as string || '{}'\r\n      );\r\n      if (headerData?.client && !this.clientId) {\r\n        this.clientId = headerData.client;\r\n        this.getFindReplaceList();\r\n      }\r\n    } catch (e) {\r\n      // Ignore parse errors\r\n    }\r\n  }\r\n\r\n  getFindReplaceList() {\r\n    this.findReplaceSub?.unsubscribe(); // Cancel previous request\r\n\r\n    // Only show page loading if not refreshing (to avoid flickering)\r\n    if (!this.isRefreshing) {\r\n      this.isPageLoading = true;\r\n      this.findReplaceList = [];\r\n    }\r\n\r\n    const payload: any = {\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      searchValue: this.searchTerm || undefined,\r\n      filter: this.appliedFilters.status?.length > 0 ? this.appliedFilters : undefined,\r\n      sortColumnName: this.sortedColumn || undefined,\r\n      sortBy: this.sortOrder,\r\n      clientId: this.clientId\r\n    };\r\n\r\n    this.findReplaceSub = this.storeBuilderService\r\n      .getAllFindReplaceData(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          const response = res as FindReplaceResponse;\r\n          if (response && response?.code === 200) {\r\n            this.totalItems = response?.data?.count || 0;\r\n            this.findReplaceList = response?.data?.data ?? [];\r\n            if (this.totalItems < 10) {\r\n              this.paginationSizes = [this.totalItems];\r\n            } else {\r\n              this.paginationSizes = [10, 20, 30];\r\n            }\r\n          }\r\n          this.isPageLoading = false;\r\n          this.isError = false;\r\n          this.isRefreshing = false;\r\n        },\r\n        error: (err) => {\r\n          this.isPageLoading = false;\r\n          this.isError = true;\r\n          this.isRefreshing = false;\r\n          console.error('Error fetching find replace data:', err);\r\n        },\r\n      });\r\n  }\r\n\r\n  onSearchInput(event: Event) {\r\n    const value = (event.target as HTMLInputElement).value;\r\n    this.searchTerm = value;\r\n    this.searchSubject.next(value);\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = '';\r\n    this.sortOrder = -1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getFindReplaceList();\r\n  }\r\n\r\n  clearSearch() {\r\n    this.searchTerm = '';\r\n    this.onSearch();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    // Map UI column names to API column names\r\n    const columnMap: Record<string, string> = {\r\n      'name': 'name',\r\n      'created': 'createdAt',\r\n      'stores': 'storeCount',\r\n      'target': 'target',\r\n      'status': 'status'\r\n    };\r\n\r\n    const apiColumn = columnMap[column] || column;\r\n\r\n    if (this.sortedColumn === apiColumn) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = apiColumn;\r\n      this.sortOrder = -1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getFindReplaceList();\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    if (event && Array.isArray(event)) {\r\n      event.forEach((ele: any) => {\r\n        if (ele.title === 'Status' || ele.title === 'status') {\r\n          this.appliedFilters.status = ele.selected || [];\r\n        }\r\n      });\r\n    } else if (event && typeof event === 'object') {\r\n      // Handle reset filters\r\n      this.appliedFilters.status = [];\r\n    }\r\n    this.offset = 1;\r\n    this.getFindReplaceList();\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.getFindReplaceList();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.getFindReplaceList();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Find & Replace\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  getStatusBadgeClass(status: string): string {\r\n    const statusMap: Record<string, string> = {\r\n      'draft': 'draft',\r\n      'batch-running': 'batch-running',\r\n      'yet-to-approve': 'yet-to-approve',\r\n      'approved': 'approved',\r\n      'scheduled': 'scheduled',\r\n    };\r\n    return statusMap[status] || 'badge-secondary';\r\n  }\r\n\r\n  getStatusDisplay(status: string): string {\r\n    const statusMap: Record<string, string> = {\r\n      'draft': 'Draft',\r\n      'batch-running': 'Batch Running',\r\n      'yet-to-approve': 'Yet To Approve',\r\n      'approved': 'Completed',\r\n      'scheduled': 'Scheduled',\r\n    };\r\n    return statusMap[status] || status;\r\n  }\r\n\r\n  getTargetDisplay(target?: string): string {\r\n    if (!target) return '-';\r\n    const targetMap: Record<string, string> = {\r\n      'merch': 'Merch',\r\n      'vm': 'Visual Merch',\r\n      'both': 'Both'\r\n    };\r\n    return targetMap[target] || target;\r\n  }\r\n\r\n  getReplaceDisplay(item: FindReplace): string {\r\n    if (item?.replacePrompt) return item.replacePrompt;\r\n    const parts: string[] = [];\r\n    if (item?.replaceBrand?.brandName) parts.push(`Brand: ${item.replaceBrand.brandName}`);\r\n    if (item?.replaceVm?.vmName) parts.push(`VM: ${item.replaceVm.vmName}`);\r\n    return parts.length ? parts.join(' / ') : '';\r\n  }\r\n\r\n  formatDate(dateString?: string): string {\r\n    if (!dateString) return '-';\r\n    // If it's already formatted (from API), return as is\r\n    if (typeof dateString === 'string' && dateString.includes(' ')) {\r\n      return dateString;\r\n    }\r\n    const date = new Date(dateString);\r\n    return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });\r\n  }\r\n\r\n  onFindAndReplaceClick(): void {\r\n    this.router.navigate(['/manage/planogram/find-replace/prepare']);\r\n  }\r\n\r\n  onNameClick(item: FindReplace): void {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n\r\n    const draftStatuses = ['draft'];\r\n    const batchStatuses = ['batch-running'];\r\n    const reviewStatuses = ['yet-to-approve', 'approved', 'scheduled'];\r\n\r\n    if (draftStatuses.includes(item.status)) {\r\n      this.router.navigate(['/manage/planogram/find-replace/prepare'], {\r\n        queryParams: { id: item._id }\r\n      });\r\n    } else if (reviewStatuses.includes(item.status)) {\r\n      this.router.navigate(['/manage/planogram/find-replace/review'], {\r\n        queryParams: { id: item._id }\r\n      });\r\n    } else if (batchStatuses.includes(item.status)) {\r\n      this.router.navigate(['/manage/planogram/find-replace'], {\r\n        queryParams: { id: item._id }\r\n      });\r\n    }\r\n  }\r\n\r\n  shouldShowDelete(item: FindReplace): boolean {\r\n    return item.status === 'draft';\r\n  }\r\n\r\n  shouldShowCancel(item: FindReplace): boolean {\r\n    return item.status === 'batch-running' ;\r\n  }\r\n\r\n  shouldShowEdit(item: FindReplace): boolean {\r\n    return item.status === 'yet-to-approve';\r\n  }\r\n\r\n  shouldShowReschedule(item: FindReplace): boolean {\r\n    return  item.status === 'scheduled';\r\n  }\r\n\r\n  shouldShowRevoke(item: FindReplace): boolean {\r\n    return false;\r\n    return item.status === 'approved';\r\n  }\r\n\r\n  hasAnyAction(item: FindReplace): boolean {\r\n    return this.shouldShowDelete(item) || this.shouldShowCancel(item) || this.shouldShowReschedule(item) || this.shouldShowEdit(item) || this.shouldShowRevoke(item);\r\n  }\r\n\r\n  onEdit(item: FindReplace): void {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n    this.router.navigate(['/manage/planogram/find-replace/review'], {\r\n      queryParams: { id: item._id }\r\n    });\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Delete Find and Replace';\r\n    modelRef.componentInstance.description = 'Are you sure you want to delete this find and replace?';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok').catch(() => false);\r\n  }\r\n\r\n  async onDelete(item: FindReplace): Promise<void> {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n\r\n    if (!await this.confirmDeletion()) return;\r\n\r\n    this.storeBuilderService.deleteFindReplaceAi({ id: item._id }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success' || res?.code === 200) {\r\n          this.toast.getSuccessToast(res?.message || 'Find and replace deleted successfully');\r\n          this.getFindReplaceList();\r\n        } else {\r\n          this.toast.getErrorToast(res?.message || 'Failed to delete find and replace');\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to delete find and replace');\r\n        console.error('Error deleting find replace:', err);\r\n      }\r\n    });\r\n  }\r\n\r\n  async confirmCancel(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CancelConfirmationModalComponent, { centered: true });\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === true).catch(() => false);\r\n  }\r\n\r\n  async onCancel(item: FindReplace): Promise<void> {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n\r\n    if (!await this.confirmCancel()) return;\r\n\r\n    this.storeBuilderService.cancelFindReplace({ findReplaceId: item._id }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success' || res?.code === 200) {\r\n          this.toast.getSuccessToast(res?.message || 'Find and replace cancelled successfully');\r\n          this.getFindReplaceList();\r\n        } else {\r\n          this.toast.getErrorToast(res?.message || 'Failed to cancel find and replace');\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to cancel find and replace');\r\n        console.error('Error cancelling find replace:', err);\r\n      }\r\n    });\r\n  }\r\n\r\n  async onReschedule(item: FindReplace): Promise<void> {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n\r\n    const modalRef = this.ngbModal.open(RescheduleModalComponent, {\r\n      centered: true,\r\n      size: 'md',\r\n      backdrop: 'static',\r\n      windowClass: 'reschedule-modal'\r\n    });\r\n\r\n    // Pass the initial schedule values to the modal\r\n    modalRef.componentInstance.initialSchedule = item.schedule || false;\r\n    modalRef.componentInstance.initialScheduleDate = item.scheduleDate || null;\r\n\r\n    try {\r\n      const result = await modalRef.result;\r\n      if (result) {\r\n        // Prepare data for saveAsDraft API\r\n        // The API expects id (not _id) and all required fields\r\n        const draftData: any = {\r\n          id: item._id,\r\n          schedule: result.schedule,\r\n          scheduleDate: result.scheduleDate\r\n        };\r\n\r\n        // Call saveAsDraft API first\r\n        this.storeBuilderService.saveAsDraft(draftData).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === 'success' || res?.code === 200) {\r\n              // If schedule is false, call approveReplace API\r\n              if (!result.schedule) {\r\n                this.storeBuilderService.approveReplace({\r\n                  findReplaceId: item._id\r\n                }).subscribe({\r\n                  next: (approveRes: any) => {\r\n                    if (approveRes?.status === 'success' || approveRes?.code === 200) {\r\n                      this.toast.getSuccessToast(approveRes?.message || 'Find and replace approved successfully');\r\n                      this.getFindReplaceList();\r\n                    } else {\r\n                      this.toast.getErrorToast(approveRes?.message || 'Failed to approve find and replace');\r\n                    }\r\n                  },\r\n                  error: (approveErr) => {\r\n                    this.toast.getErrorToast(approveErr?.error?.error || approveErr?.error?.message || 'Failed to approve find and replace');\r\n                    console.error('Error approving find replace:', approveErr);\r\n                  }\r\n                });\r\n              } else {\r\n                // Schedule is true, just show success message\r\n                this.toast.getSuccessToast(res?.message || 'Find and replace rescheduled successfully');\r\n                this.getFindReplaceList();\r\n              }\r\n            } else {\r\n              this.toast.getErrorToast(res?.message || 'Failed to reschedule find and replace');\r\n            }\r\n          },\r\n          error: (err) => {\r\n            this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to reschedule find and replace');\r\n            console.error('Error rescheduling find replace:', err);\r\n          }\r\n        });\r\n      }\r\n    } catch (error) {\r\n      // User dismissed the modal\r\n      console.log('Reschedule modal dismissed');\r\n    }\r\n  }\r\n\r\n  async confirmRevoke(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(RevokeConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Revoke Find and Replace';\r\n    modelRef.componentInstance.description = 'Are you sure you want to revoke this find and replace?';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok').catch(() => false);\r\n  }\r\n\r\n  async onRevoke(item: FindReplace): Promise<void> {\r\n    if (!item._id) {\r\n      return;\r\n    }\r\n\r\n    if (!await this.confirmRevoke()) return;\r\n\r\n    this.storeBuilderService.revokeFindReplace({ findReplaceId: item._id }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success' || res?.code === 200) {\r\n          this.toast.getSuccessToast(res?.message || 'Find and replace revoked successfully');\r\n          this.getFindReplaceList();\r\n        } else {\r\n          this.toast.getErrorToast(res?.message || 'Failed to revoke find and replace');\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to revoke find and replace');\r\n        console.error('Error revoking find replace:', err);\r\n      }\r\n    });\r\n  }\r\n\r\n  onRefreshItem(item: FindReplace): void {\r\n    if (this.isRefreshing || !item._id) {\r\n      return;\r\n    }\r\n\r\n    this.isRefreshing = true;\r\n    \r\n    // Update batch progress first, similar to find-replace-layout component\r\n    this.storeBuilderService.updateBatchProgress({\r\n      findReplaceId: item._id\r\n    })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (response: any) => {\r\n          // After updating batch progress, refresh the table data\r\n          this.getFindReplaceList();\r\n        },\r\n        error: (error) => {\r\n          console.error('Error updating batch progress:', error);\r\n          // Still refresh the table even if update fails\r\n          this.getFindReplaceList();\r\n        }\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.findReplaceSub?.unsubscribe();\r\n  }\r\n}\r\n","<div class=\"content-wrapper\">\r\n    <div>\r\n        <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n            <div>\r\n                <h4>Find and Replace</h4>\r\n                <span>{{ totalItems }} - Total Records</span>\r\n            </div>\r\n\r\n            <div class=\"d-flex align-items-center gap-3\">\r\n                <div style=\"position: relative\">\r\n                    <input \r\n                        type=\"text\" \r\n                        [(ngModel)]=\"searchTerm\"\r\n                        (input)=\"onSearchInput($event)\"\r\n                        style=\"padding-left: 3rem; padding-right: 3rem\" \r\n                        class=\"form-control\"\r\n                        name=\"search\" \r\n                        autocomplete=\"off\" \r\n                        placeholder=\"Search\" />\r\n\r\n                    <span class=\"search-icon\">\r\n                        <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                            <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n                            <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\"\r\n                                stroke-linecap=\"round\" />\r\n                        </svg>\r\n                    </span>\r\n\r\n                    <button \r\n                        *ngIf=\"searchTerm\" \r\n                        type=\"button\" \r\n                        aria-label=\"Clear\" \r\n                        (click)=\"clearSearch()\"\r\n                        class=\"clear-search\">\r\n                        <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\">\r\n                            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n                            <g id=\"SVGRepo_iconCarrier\">\r\n                                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\"></path>\r\n                                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\"></path>\r\n                                <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\"></circle>\r\n                            </g>\r\n                        </svg>\r\n                    </button>\r\n                </div>\r\n\r\n                <lib-dynamic-filter [filterObject]=\"filterObject\" (applyFilters)=\"applyFilters($event)\" (resetFilters)=\"applyFilters($event)\"></lib-dynamic-filter>\r\n\r\n                <!-- <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n                            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                    </svg>\r\n                    <span class=\"ms-2\"></span> Export\r\n                </button> -->\r\n\r\n                <button type=\"button\" class=\"btn btn-primary d-inline-flex align-items-center\" (click)=\"onFindAndReplaceClick()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\" stroke=\"white\" stroke-width=\"1.67\"\r\n                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <span class=\"ms-2 text-white\">Find And Replace</span>\r\n                </button>\r\n\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Loading State -->\r\n        <div *ngIf=\"isPageLoading\">\r\n            <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n                <div class=\"shimmer\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"stroke animate title\"></div>\r\n                        <div class=\"stroke animate link\"></div>\r\n                        <div class=\"stroke animate description\"></div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"stroke animate title\"></div>\r\n                        <div class=\"stroke animate link\"></div>\r\n                        <div class=\"stroke animate description\"></div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                    <div class=\"wrapper\">\r\n                        <div class=\"stroke animate title\"></div>\r\n                        <div class=\"stroke animate link\"></div>\r\n                        <div class=\"stroke animate description\"></div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- No Data State -->\r\n        <div *ngIf=\"!isPageLoading && findReplaceList.length === 0 && !isError\"\r\n            class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">No data found</div>\r\n            <div class=\"nodatasubtext\">There is no result for find and replace table</div>\r\n        </div>\r\n\r\n        <!-- Error State -->\r\n        <div *ngIf=\"isError && !isPageLoading\"\r\n            class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n            <div class=\"nodatamaintext mt-3\">Error loading data</div>\r\n            <div class=\"nodatasubtext\">Please try again later</div>\r\n        </div>\r\n\r\n        <!-- Table -->\r\n        <section id=\"list-view\" *ngIf=\"!isPageLoading && findReplaceList.length > 0\">\r\n            <div class=\"table-responsive\">\r\n                <table class=\"w-100 table bottom-border text-nowrap\">\r\n                    <thead>\r\n                        <tr>\r\n                            <th>\r\n                                <span class=\"cursor-pointer\" (click)=\"onSortTable('name')\">\r\n                                    Name\r\n                                    <i class=\"fa ms-1 mt-1\" \r\n                                       [ngClass]=\"sortedColumn === 'name' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n                                       aria-hidden=\"true\"></i>\r\n                                </span>\r\n                            </th>\r\n                            <th>\r\n                                <span class=\"cursor-pointer\" (click)=\"onSortTable('created')\">\r\n                                    Created\r\n                                    <i class=\"fa ms-1 mt-1\" \r\n                                       [ngClass]=\"sortedColumn === 'created' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n                                       aria-hidden=\"true\"></i>\r\n                                </span>\r\n                            </th>\r\n                            <th>\r\n                                Scheduled\r\n                            </th>\r\n                            <th>\r\n                                <span class=\"cursor-pointer\" (click)=\"onSortTable('stores')\">\r\n                                    Stores\r\n                                    <i class=\"fa ms-1 mt-1\" \r\n                                       [ngClass]=\"sortedColumn === 'stores' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n                                       aria-hidden=\"true\"></i>\r\n                                </span>\r\n                            </th>\r\n                            <th>\r\n                                <span class=\"cursor-pointer\" (click)=\"onSortTable('target')\">\r\n                                    Target\r\n                                    <i class=\"fa ms-1 mt-1\" \r\n                                       [ngClass]=\"sortedColumn === 'target' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n                                       aria-hidden=\"true\"></i>\r\n                                </span>\r\n                            </th>\r\n                            <th>\r\n                                Find\r\n                            </th>\r\n                            <th>\r\n                                Replace\r\n                            </th>\r\n                            <th>\r\n                                <span class=\"cursor-pointer\" (click)=\"onSortTable('status')\">\r\n                                    Status\r\n                                    <i class=\"fa ms-1 mt-1\" \r\n                                       [ngClass]=\"sortedColumn === 'status' ? (sortOrder === 1 ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-arrow-down'\"\r\n                                       aria-hidden=\"true\"></i>\r\n                                </span>\r\n                            </th>\r\n                            <th>Action</th>\r\n                        </tr>\r\n                    </thead>\r\n                    <tbody>\r\n                        <tr *ngFor=\"let item of findReplaceList\">\r\n                            <td>\r\n                                <div class=\"d-flex align-items-center\">\r\n                                    <a class=\"cursor-pointer text-decoration-underline\" (click)=\"onNameClick(item)\">\r\n                                        {{ item.name === '' || !item.name ? 'Untitled' : item.name }}\r\n                                    </a>\r\n                                </div>\r\n                            </td>\r\n                            <td>{{ formatDate(item.createdAt) }}</td>\r\n                            <td class=\"text-muted\">{{ item.scheduleDate ? formatDate(item.scheduleDate) : '-' }}</td>\r\n                            <td class=\"text-muted\">{{ item.storeCount || 0 }}</td>\r\n                            <td class=\"text-muted\">{{ getTargetDisplay(item.target) }}</td>\r\n                            <td class=\"text-muted\">\r\n                                <span *ngIf=\"item.findPrompt\" [title]=\"item.findPrompt\">\r\n                                    {{ item.findPrompt.length > 50 ? (item.findPrompt.substring(0, 50) + '...') : item.findPrompt }}\r\n                                </span>\r\n                                <span *ngIf=\"!item.findPrompt\">-</span>\r\n                            </td>\r\n                            <td class=\"text-muted\">\r\n                                <ng-container *ngIf=\"getReplaceDisplay(item) as replaceDisplay; else noReplace\">\r\n                                    <span [title]=\"replaceDisplay\">\r\n                                        {{ replaceDisplay.length > 50 ? (replaceDisplay.substring(0, 50) + '...') : replaceDisplay }}\r\n                                    </span>\r\n                                </ng-container>\r\n                                <ng-template #noReplace>-</ng-template>\r\n                            </td>\r\n                            <td>\r\n                                <div class=\"d-flex align-items-center gap-2\">\r\n                                    <div class=\"badge\" [ngClass]=\"getStatusBadgeClass(item.status)\">\r\n                                        {{ getStatusDisplay(item.status) }}\r\n                                    </div>\r\n                                    <svg \r\n                                        *ngIf=\"item.status === 'batch-running'\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" \r\n                                        width=\"24\" \r\n                                        height=\"24\" \r\n                                        viewBox=\"0 0 24 24\" \r\n                                        fill=\"none\" \r\n                                        stroke=\"currentColor\" \r\n                                        stroke-width=\"2\" \r\n                                        stroke-linecap=\"round\" \r\n                                        stroke-linejoin=\"round\"\r\n                                        class=\"refresh-icon\"\r\n                                        [class.spinning]=\"isRefreshing\"\r\n                                        [class.disabled]=\"isRefreshing\"\r\n                                        (click)=\"onRefreshItem(item)\"\r\n                                        title=\"Refresh status\">\r\n                                        <path d=\"M21 12a9 9 0 1 1-3-6.7\" />\r\n                                        <polyline points=\"21 3 21 9 15 9\" />\r\n                                    </svg>\r\n                                </div>\r\n                            </td>\r\n                            <td>\r\n                                <div class=\"dropdown\" *ngIf=\"hasAnyAction(item)\">\r\n                                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                                        <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                                    </button>\r\n                                    <ul class=\"dropdown-menu dropdown-menu-end\">\r\n                                        <li *ngIf=\"shouldShowDelete(item)\">\r\n                                            <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete(item)\">Delete</a>\r\n                                        </li>\r\n                                        <li *ngIf=\"shouldShowEdit(item)\">\r\n                                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(item)\">Edit</a>\r\n                                        </li>\r\n                                        <li *ngIf=\"shouldShowCancel(item)\">\r\n                                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onCancel(item)\">Cancel</a>\r\n                                        </li>\r\n                                        <li *ngIf=\"shouldShowReschedule(item)\">\r\n                                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onReschedule(item)\">Reschedule</a>\r\n                                        </li>\r\n                                        <li *ngIf=\"shouldShowRevoke(item)\">\r\n                                            <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onRevoke(item)\">Revoke</a>\r\n                                        </li>\r\n                                    </ul>\r\n                                </div>\r\n                            </td>\r\n                        </tr>\r\n                    </tbody>\r\n                </table>\r\n            </div>\r\n        </section>\r\n\r\n        <!-- Pagination -->\r\n        <lib-pagination\r\n            *ngIf=\"!isPageLoading && findReplaceList.length !== 0\"\r\n            [itemsPerPage]=\"limit\"\r\n            [currentPage]=\"offset\"\r\n            [totalItems]=\"totalItems\"\r\n            [paginationSizes]=\"paginationSizes\"\r\n            [pageSize]=\"paginationSize()\"\r\n            (pageChange)=\"onPageChange($event)\"\r\n            (pageSizeChange)=\"onPageSizeChange($event)\">\r\n        </lib-pagination>\r\n    </div>\r\n</div>\r\n\r\n<ng-template #verticalDots>\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n        <path\r\n            d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n        <path\r\n            d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n        <path\r\n            d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n    </svg>\r\n</ng-template>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { VmLibraryList } from \"../../../interfaces/vm-library.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { lastValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-template-details\",\r\n  templateUrl: \"./template-details.component.html\",\r\n  styleUrl: \"./template-details.component.scss\",\r\n})\r\nexport class TemplateDetailsComponent {\r\n  @Input() fixtureTemplateDetails: any;\r\n  @Input() vmList: VmLibraryList[] = [];\r\n  @Output() onClose = new EventEmitter<any>();\r\n\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n  fixtureImage: string;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      color: any;\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = false;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    if (changes[\"fixtureTemplateDetails\"]?.currentValue) {\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 300);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  getSelectedVM(vm: any) {\r\n    return this.vmList.find((v) => v.id === vm?.vmId);\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 253;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid  ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) {\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                d.style.border = `1.4px solid  ${this.shelfColors[i].border}`;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (let i = 0; i < this.fixtureTemplateDetails?.shelfConfig.length; i++) {\r\n      const s = this.fixtureTemplateDetails?.shelfConfig[i];\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      (s?.products ?? []).some((p: any) => p.status !== \"proper\");\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n            color: this.shelfColors[i],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  openZoneLevelProductModal(zoneData: any, level: string) {}\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixture-product-details\" *ngIf=\"!isPageLoading\">\r\n    <div class=\"d-flex w-100 justify-content-between p-3 align-items-center\" (click)=\"onClickClose()\">\r\n        <h4 class=\"m-0\">Template details</h4>\r\n        <svg class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n    </div>\r\n    <!-- <hr> -->\r\n    <!-- <div class=\"d-flex align-items-center gap-6 mt-7 mt-5 px-3 mb-5\">\r\n\r\n        <h3 class=\"m-0\">{{fixtureTemplateDetails?.header?.label}}</h3>\r\n\r\n    </div> -->\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport mt-10\">\r\n        <!-- Header block -->\r\n        <div class=\"header-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n            <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n        </div>\r\n\r\n        <!-- Body block -->\r\n        <div id=\"body-block-sum\" class=\"body-block\">\r\n            <!----------------------------------[VM BLOCK]--------------------------------------->\r\n            <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n                <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n                    <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                        <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n                            <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n                                alt=\"Vm Image\" />\r\n                            <ng-template #placeholder>\r\n                                <div class=\"vm-placeholder\">\r\n                                    <h3>{{ selectedVM?.name }}</h3>\r\n                                </div>\r\n                            </ng-template>\r\n                        </ng-container>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n\r\n            <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\">\r\n                        <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ b }}\r\n                            </span>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                        <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                            {{ c }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"badge inactive mt-1\">\r\n                        Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n                    </span>\r\n                </div>\r\n                <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                        <p>\r\n                            <b>Brands: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                        <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                            <b>Categories: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                    </div>\r\n                </ng-template>\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                @for (item of sectionByZones; track $index) {\r\n                    <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n                        (click)=\"openZoneLevelProductModal(item,'section')\">\r\n                        <div class=\"d-flex\">\r\n                            <span class=\"badge me-1\"\r\n                                [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{ item?.section?.capacity }}\r\n                            </span>\r\n                        </div>\r\n                        <div class=\"w-100 d-flex justify-content-center\">\r\n                            <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                            <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                            <p *ngIf=\"item?.section?.categories?.length\">\r\n                                <b>Categories: </b>\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                }\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <div [id]=\"'sumShelfContainer' + i\" class=\"shelfContainer\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                    <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                        <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"item.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{item?.productPerShelf }}\r\n                            </span>\r\n\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-- @if(item.shelfType ==='shelf'){\r\n                <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n                    @if(item.products.length){\r\n                    <div *ngFor=\"let product of item.products\" class=\"product\"\r\n                        [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n                        @if(product.status != 'missing'){\r\n                        <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n                            alt=\"Product Image\" />\r\n                        <ng-template #placeholder>\r\n                            <div></div>\r\n                        </ng-template>\r\n                        }\r\n                    </div>\r\n                    }@else {\r\n                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    }\r\n                </div>\r\n                }@else {\r\n                <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                    @if(item.products.length){\r\n                    <div *ngFor=\"let row of item.distributedRows\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of row\" class=\"product\"\r\n                            [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n                            @if(product.status != 'missing'){\r\n                            <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n                                alt=\"Product Image\" />\r\n                            <ng-template #placeholder>\r\n                                <div></div>\r\n                            </ng-template>\r\n                            }\r\n                        </div>\r\n                    </div>\r\n                    }@else{\r\n                    <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                    }\r\n                </div>\r\n                } -->\r\n                @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                        <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        </div>\r\n                    </div>\r\n                }@else {\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                        [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                }\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Footer block -->\r\n        <div class=\"footer-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n            <div class=\"sub-footer left-box\"></div>\r\n            <div class=\"sub-footer right-box\"></div>\r\n            <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"hero-block\">\r\n        <div class=\"row g-0 m-0 w-100\">\r\n            <div class=\"col px-4\">\r\n                <p>Fixture name:</p>\r\n                <p>Fixture type:</p>\r\n                <p>Size (Width):</p>\r\n                <p>Total shelves:</p>\r\n                <p>Total product capacity:</p>\r\n            </div>\r\n            <div class=\"col px-4\">\r\n                <p><b>{{fixtureTemplateDetails?.header?.label}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCategory}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureWidth?.value}}{{fixtureTemplateDetails?.fixtureWidth?.unit}}</b>\r\n                </p>\r\n                <p><b>{{fixtureTemplateDetails?.shelfConfig?.length}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCapacity}}</b></p>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import { Component, Input, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\n\r\n/**\r\n * Shared \"Access denied\" panel for the email-gated features. Reused two ways:\r\n *  - Inline, with [feature] bound (e.g. inside the Find & Replace tab).\r\n *  - As a route component (the findReplaceAccessGuard redirect target), reading\r\n *    the feature name from the `feature` query param.\r\n * Mirrors the access-denied markup used by the Looks page.\r\n */\r\n@Component({\r\n  selector: 'lib-access-denied',\r\n  templateUrl: './access-denied.component.html',\r\n  styleUrl: './access-denied.component.scss',\r\n})\r\nexport class AccessDeniedComponent implements OnInit {\r\n  @Input() feature = '';\r\n\r\n  constructor(private route: ActivatedRoute) {}\r\n\r\n  ngOnInit(): void {\r\n    if (!this.feature) {\r\n      this.feature = this.route.snapshot.queryParamMap.get('feature') || 'this feature';\r\n    }\r\n  }\r\n}\r\n","<section class=\"access-denied-wrapper\">\r\n  <div class=\"row mx-0 my-5\">\r\n    <div class=\"card p-5 col-md-12\">\r\n      <div class=\"access-denied text-center py-10\">\r\n        <div class=\"access-denied-icon mb-4\">\r\n          <i class=\"bi bi-shield-lock\"></i>\r\n        </div>\r\n        <h3 class=\"mb-2\">Access denied</h3>\r\n        <p class=\"text-muted mb-0\">\r\n          You don't have permission to access {{ feature }}. Contact your\r\n          administrator to be added to the allowed users list.\r\n        </p>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n","import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { debounceTime, distinctUntilChanged, lastValueFrom, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { BulkUploadFixtureTemplateComponent } from './popups/bulk-upload-fixture-template/bulk-upload-fixture-template.component';\r\nimport { CreateFixtureTemplateComponent } from './popups/create-fixture-template/create-fixture-template.component';\r\nimport { FixtureTemplateDetails, FixtureTemplateList } from '../../interfaces/fixture-template.interface';\r\nimport { DeleteConfirmationComponent } from '../popups/delete-confirmation/delete-confirmation.component';\r\nimport { PlanoDataService } from '../../services/plano-data.service';\r\nimport { CannotPerformComponent } from '../popups/cannot-perform/cannot-perform.component';\r\nimport { VariantPopupComponent } from '../popups/variant-popup/variant-popup.component';\r\nimport { getQueryParamNumber, getQueryParamString } from '../../functions/plano.function';\r\nimport { LayoutEditConfirmationComponent } from '../popups/layout-edit-confirmation/layout-edit-confirmation.component';\r\n\r\n@Component({\r\n  selector: \"lib-fixture-template-table\",\r\n  templateUrl: \"./fixture-template-table.component.html\",\r\n  styleUrl: \"./fixture-template-table.component.scss\",\r\n})\r\nexport class FixtureTemplateTableComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  fixtureTemplatesList: FixtureTemplateList[] = [];\r\n  viewMode: \"list\" | \"grid\" | \"tree\" | string = \"list\";\r\n  fixtureTemplateChildList: any = [];\r\n  activeTab: string = \"all-templates\"; // 'all-templates' or 'find-replace'\r\n\r\n  // Find & Replace is email-gated (planostaticdatas `allowedFindReplaceUsers`).\r\n  // frAccessChecked gates the tab/panel until the check resolves so neither flashes.\r\n  frAccessChecked = false;\r\n  frAllowed = false;\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n  childSortedColumn: string = \"\";\r\n  childSortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  childLimit: number = 10;\r\n  childOffset: number = 1;\r\n  childTotalItems: number = 0;\r\n  childPaginationSizes = [10, 20, 30];\r\n  filterObject: any[] = [];\r\n\r\n  // filterObject = [\r\n  //   {\r\n  //     Description: \"Status\",\r\n  //     Issues: [\r\n  //       { text: \"Active\", id: \"active\" },\r\n  //       { text: \"Inactive\", id: \"inactive\" },\r\n  //       { text: \"Draft\", id: \"draft\" },\r\n  //     ],\r\n  //   },\r\n  // ];\r\n\r\n  appliedFilters = {\r\n    status: [],\r\n    brand: [],\r\n    category: [],\r\n    // category: []\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n  fixtureTemplateInfo: any;\r\n  vmList: any = [];\r\n  cdnUrl: string;\r\n  hideBrand:boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private templateSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private planoDataService: PlanoDataService,\r\n    private gs: GlobalStateService,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n    private cd:ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    this.checkFindReplaceAccess();\r\n    this.route.queryParamMap\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        const view = params.get(\"view\");\r\n        if (view === \"list\" || view === \"grid\" || view === \"tree\") {\r\n          this.viewMode = view;\r\n        }\r\n        \r\n        // Get active tab from query params\r\n        const tabParam = getQueryParamString({\r\n          params,\r\n          key: \"tab\",\r\n          fallback: \"all-templates\",\r\n        });\r\n        this.activeTab = tabParam === \"find-replace\" ? \"find-replace\" : \"all-templates\";\r\n      });\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe((data: any) => {\r\n        this.isPageLoading = true;\r\n\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        this.getFixtureLibList();\r\n        this.getBrandsList();\r\n\r\n        this.route.queryParamMap\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((params) => {\r\n            this.viewMode = getQueryParamString({\r\n              params,\r\n              key: \"view\",\r\n              fallback: \"list\",\r\n              allowed: [\"grid\", \"list\", \"tree\"],\r\n            });\r\n\r\n            // Get active tab from query params\r\n            const tabParam = getQueryParamString({\r\n              params,\r\n              key: \"tab\",\r\n              fallback: \"all-templates\",\r\n            });\r\n            this.activeTab = tabParam === \"find-replace\" ? \"find-replace\" : \"all-templates\";\r\n\r\n            this.searchTerm = getQueryParamString({\r\n              params,\r\n              key: \"search\",\r\n              fallback: \"\",\r\n            });\r\n            this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n            this.limit = getQueryParamNumber({\r\n              params,\r\n              key: \"limit\",\r\n              fallback: 10,\r\n              min: 1,\r\n              max: 30,\r\n            });\r\n\r\n            this.offset = getQueryParamNumber({\r\n              params,\r\n              key: \"offset\",\r\n              fallback: 1,\r\n              min: 1,\r\n            });\r\n\r\n            this.getFixtureTemplatesList();\r\n          });\r\n      });\r\n  }\r\n\r\n  async getVmsList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: \"\",\r\n      sortBy: 1,\r\n      searchValue: \"\",\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: [],\r\n      },\r\n      export: false,\r\n      emptyDownload: false,\r\n    };\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getVmLibraryList(payload)\r\n      );\r\n      if (res?.status === \"success\") {\r\n        this.vmList = res?.data?.data.map((item: any) => {\r\n          return {\r\n            id: item._id,\r\n            name: item.vmName,\r\n            displayName:\r\n              item.vmName + (item?.vmType ? ` ( ${item.vmType} ) ` : \"\"),\r\n            brand: item.vmBrand,\r\n            type: item.vmType,\r\n            width: item.vmWidth.value,\r\n            height: item.vmHeight.value,\r\n            placement: item.isDoubleSided,\r\n            noOfAssigned: item.templateCount,\r\n            status: item.status,\r\n            ...(item.vmImageUrl\r\n              ? { imgUrl: `${this.cdnUrl}${item.vmImageUrl}` }\r\n              : {}),\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n    } finally {\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Fixture Template\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  /** Resolve whether the session user may use Find & Replace. Never throws.\r\n   *  Hides the tab when denied; the tab content falls back to an access-denied\r\n   *  panel for anyone who deep-links to ?tab=find-replace. */\r\n  private async checkFindReplaceAccess(): Promise<void> {\r\n    try {\r\n      const res: any = await lastValueFrom(this.storeBuilderService.getFindReplaceAccess());\r\n      this.frAllowed = !!res?.data?.allowed;\r\n    } catch (err) {\r\n      console.log(\"@@ ~ checkFindReplaceAccess [ERR]:\", err);\r\n      this.frAllowed = false;\r\n    } finally {\r\n      this.frAccessChecked = true;\r\n    }\r\n  }\r\n\r\n  getFixtureLibList() {\r\n    this.storeBuilderService.getFixtureNameList(this.clientId).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          const fixtureFilterObj = this.filterObject.find(\r\n            (f) => f.Description === \"Fixture Category\"\r\n          );\r\n          if (fixtureFilterObj) {\r\n            fixtureFilterObj.Issues =\r\n              res?.data?.map((item: any) => {\r\n                return { text: item.fixtureName, id: item.fixtureName };\r\n              }) ?? [];\r\n          } else {\r\n            this.filterObject.push({\r\n              Description: \"Fixture Category\",\r\n              Issues:\r\n                res?.data?.map((item: any) => {\r\n                  return { text: item.fixtureName, id: item.fixtureName };\r\n                }) ?? [],\r\n            });\r\n          }\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ exportFixtureLibraryList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n\r\n  getFixtureTemplatesList() {\r\n    this.templateSub?.unsubscribe(); // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.fixtureTemplatesList = [];\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: false,\r\n      emptyDownload: false,\r\n    };\r\n\r\n    this.templateSub = this.storeBuilderService\r\n      .getFixtureTemplateList(payload)\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.totalItems = res?.data?.count;\r\n            this.fixtureTemplatesList = res?.data?.data.map((item: any) => {\r\n              return {\r\n                name: item?.fixtureName ?? \"-\",\r\n                type: item?.fixtureCategory ?? \"-\",\r\n                size: item?.fixtureWidth?.value ?? 0,\r\n                brands: item?.productBrandName ?? [],\r\n                categories: item?.productCategory ?? [],\r\n                // vmCapacity: item?.vmCapacity ?? 0,\r\n                status: item?.status ?? \"draft\",\r\n                id: item?._id,\r\n                childCount: item?.childCount,\r\n                // storeCount: item?.storeCount ?? 0,\r\n                // storeList: item?.storeList ?? [],\r\n              };\r\n            });\r\n            this.paginationSizes =\r\n              this.totalItems < 10 ? [this.totalItems] : [10, 20, 30];\r\n          }\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ getFixtureTemplatesList [ERR]: \", err);\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n\r\n    this.totalItems = this.fixtureTemplatesList.length;\r\n  }\r\n\r\n  getBrandsList() {\r\n    this.planoDataService.brandsList\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((e) => {\r\n        const brandFilterObj = this.filterObject.find(\r\n          (f) => f.Description === \"Brands\"\r\n        );\r\n\r\n        if (brandFilterObj) {\r\n          brandFilterObj.Issues = e.map((b) => {\r\n            return { text: b.brandName ?? \"\", id: b.brandName ?? \"\" };\r\n          });\r\n        } else {\r\n          this.filterObject.push({\r\n            Description: \"Brands\",\r\n            Issues: e.map((b) => {\r\n              return { text: b.brandName ?? \"\", id: b.brandName ?? \"\" };\r\n            }),\r\n          });\r\n        }\r\n      });\r\n    this.planoDataService.fetchBrandsList(this.clientId);\r\n  }\r\n\r\n  downloadEmptyTemplate() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 1,\r\n      sortColumnName: \"\",\r\n      sortBy: 1,\r\n      searchValue: \"\",\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: [],\r\n      },\r\n      export: true,\r\n      emptyDownload: true,\r\n    };\r\n\r\n    this.storeBuilderService.getFixtureTemplateListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, \"Fixture Templates\");\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ exportFixtureTemplateList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n\r\n  exportTemplateList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 1,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: true,\r\n      emptyDownload: false,\r\n    };\r\n\r\n    this.storeBuilderService.getFixtureTemplateListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, \"Fixture Template List\");\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ exportFixtureTemplateList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(BulkUploadFixtureTemplateComponent, {\r\n      centered: true,\r\n    });\r\n\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.componentInstance.totalItemCount = this.totalItems;\r\n    modelRef.result.then((result) => {\r\n      if (result === \"refresh\") {\r\n        this.getFixtureTemplatesList();\r\n      }\r\n    });\r\n  }\r\n\r\n  onClickCreateFixtureTemplate() {\r\n    const modelRef = this.ngbModal.open(CreateFixtureTemplateComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n    });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.result.then((result) => {\r\n      if (result) {\r\n        this.router.navigate(\r\n          [\"/manage/planogram/fixture-template/basic-details\"],\r\n          { queryParams: { templateId: result._id, isEdit: true } }\r\n        );\r\n      }\r\n    });\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onTabChange(tab: string) {\r\n    if (this.activeTab !== tab) {\r\n      this.activeTab = tab;\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        queryParams: {\r\n          tab: tab,\r\n        },\r\n        queryParamsHandling: \"merge\",\r\n        replaceUrl: true,\r\n      });\r\n    }\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getFixtureTemplatesList();\r\n  }\r\n\r\n  redirectToreplace() {\r\n    this.router.navigate([\"/manage/planogram/findAndReplace\"], {});\r\n  }\r\n\r\n  onChildSortTable(column: string, templateId: any, index: number) {\r\n    if (this.childSortedColumn === column) {\r\n      this.childSortOrder = this.childSortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.childSortedColumn = column;\r\n      this.childSortOrder = 1;\r\n    }\r\n\r\n    this.childOffset = 1;\r\n    this.childLimit = 10;\r\n    this.getVariantList(templateId, index);\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    // const status = event\r\n    //   .find((e: any) => e.Description == \"Status\")\r\n    //   ?.Issues.map((i: any) => i?.id);\r\n    const status: any = [];\r\n    const brand = event\r\n      .find((e: any) => e.Description == \"Brands\")\r\n      ?.Issues.map((i: any) => i?.id);\r\n    const category = event\r\n      .find((e: any) => e.Description == \"Fixture Category\")\r\n      ?.Issues.map((i: any) => i?.id);\r\n    // const category = event[3].Issues.map((i: any) => i.id);\r\n\r\n    this.isFilterApplied = status || category || brand;\r\n    this.appliedFilters = { status, category, brand };\r\n    this.offset = 1;\r\n    this.getFixtureTemplatesList();\r\n  }\r\n\r\n  toggleViewMode(mode: \"list\" | \"grid\" | \"tree\") {\r\n    this.viewMode = mode;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  childPaginationSize(): number {\r\n    return this.childTotalItems < 10 ? this.childTotalItems : this.childLimit;\r\n  }\r\n\r\n  onChildPageChange(pageOffset: number, templateId: any, index: any) {\r\n    this.childOffset = Number(pageOffset);\r\n    this.getVariantList(templateId, index);\r\n  }\r\n\r\n  onChildPageSizeChange(pageSize: number, templateId: any, index: any) {\r\n    this.childOffset = 1;\r\n    this.childLimit = Number(pageSize);\r\n    this.getVariantList(templateId, index);\r\n  }\r\n\r\n  async onDuplicate(fixtureId: string, index: number = -1, type?: string) {\r\n    if (typeof type != \"undefined\") {\r\n      if (!(await this.confirmCreation(this.fixtureTemplatesList[index]?.name)))\r\n        return;\r\n    } else {\r\n      if (!(await this.confirmDuplicateCreation())) return;\r\n    }\r\n\r\n    this.storeBuilderService\r\n      .duplicateFixtureTemplate({ templateId: fixtureId })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.router.navigate(\r\n              [\"/manage/planogram/fixture-template/basic-details\"],\r\n              {\r\n                queryParams: { templateId: res?.data?.id, isEdit: true },\r\n              }\r\n            );\r\n            this.toast.getSuccessToast(res.data.message);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to duplicate Template\"\r\n          );\r\n          console.log(\"@@ ~ duplicateFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async confirmCreation(name: string): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(VariantPopupComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Create Variant\";\r\n    modelRef.componentInstance.description = `You’re about to create a variant from the master template “<b>${name}</b>”. Once created, you can update it and map it to one or more stores for tracking and updates.`;\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async confirmDuplicateCreation(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(VariantPopupComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Duplicate fixture template\";\r\n    modelRef.componentInstance.description = `Are you sure you want to duplicate this Template?`;\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Delete fixture template\";\r\n    modelRef.componentInstance.description =\r\n      \"Are you sure you want to delete this Template?\";\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async onDelete(\r\n    fixtureId: string,\r\n    usageCount: number = 0,\r\n    templateId?: any,\r\n    index: number = -1\r\n  ) {\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Can’t delete Fixture template!`;\r\n      modelRef.componentInstance.description = `Since this template is live in \"${usageCount} planograms,\" deleting is not allowed.`;\r\n      return;\r\n    }\r\n\r\n    if (!(await this.confirmDeletion())) return;\r\n    this.storeBuilderService\r\n      .deleteFixtureTemplate({ templateId: fixtureId })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            if (templateId && index != -1) {\r\n              this.fixtureTemplatesList[index].open = true;\r\n              this.fixtureTemplatesList[index].childCount =\r\n                this.fixtureTemplatesList[index].childCount - 1;\r\n              this.getVariantList(templateId, index);\r\n            }\r\n            this.toast.getSuccessToast(res.message);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to delete Template\"\r\n          );\r\n          console.log(\"@@ ~ deleteFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async confirmEdit(count: number): Promise<boolean> {\r\n    if (count <= 0) return true;\r\n    try {\r\n      const modelRef = this.ngbModal.open(LayoutEditConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Edit template`;\r\n      modelRef.componentInstance.description = `You are about to edit an active template. Please review and publish the changes`;\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async onEdit(fixture: FixtureTemplateDetails) {\r\n    if (await this.confirmEdit(fixture?.storeCount ?? 0)) {\r\n      this.router.navigate(\r\n        [\"/manage/planogram/fixture-template/basic-details\"],\r\n        {\r\n          queryParams: { templateId: fixture._id, isEdit: true },\r\n        }\r\n      );\r\n    }\r\n  }\r\n\r\n  onClickCard(event: any, template: FixtureTemplateList) {\r\n    this.router.navigate([\"/manage/planogram/fixture-template/basic-details\"], {\r\n      queryParams: { templateId: template.id },\r\n    });\r\n  }\r\n\r\n  getVariantList(templateId: any, index: any) {\r\n    if (!this.fixtureTemplatesList[index]?.open) return;\r\n\r\n    this.fixtureTemplatesList.forEach((ele, i) => {\r\n      if (i != index) {\r\n        ele.open = false;\r\n      }\r\n    });\r\n    this.fixtureTemplatesList[index][\"loading\"] = true;\r\n    this.fixtureTemplateChildList = [];\r\n    this.hideBrand = false;\r\n\r\n    let payload = {\r\n      masterTemplateId: templateId,\r\n      limit: this.childLimit,\r\n      offset: this.childOffset,\r\n      sortColumnName: this.childSortedColumn,\r\n      sortBy: this.childSortOrder,\r\n      clientId: this.clientId,\r\n      searchValue: this.searchTerm,\r\n    };\r\n\r\n    this.storeBuilderService.getTemplateChildList(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.childTotalItems = res?.data?.count;\r\n          this.fixtureTemplateInfo = null;\r\n          this.fixtureTemplateChildList = res?.data?.data;\r\n          this.childPaginationSizes =\r\n            this.childTotalItems < 10 ? [this.childTotalItems] : [10, 20, 30];\r\n        }\r\n        this.fixtureTemplatesList[index].loading = false;\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ getFixtureTemplatesList [ERR]: \", err);\r\n        this.fixtureTemplatesList[index].loading = false;\r\n      },\r\n    });\r\n\r\n    this.childTotalItems = this.fixtureTemplateChildList.length;\r\n  }\r\n\r\n  reset() {\r\n    this.childSortOrder = 1;\r\n    this.childSortedColumn = \"\";\r\n    this.childLimit = 10;\r\n    this.childOffset = 1;\r\n    this.fixtureTemplatesList.forEach((ele) => {\r\n      ele[\"templateDetails\"] = false;\r\n    });\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        view: this.viewMode,\r\n        search: this.searchTerm,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  enableRow(index: number,childIndex?:number,type:string='master') {\r\n    this.fixtureTemplatesList.forEach((ele) => {\r\n      ele[\"templateDetails\"] = false;\r\n    });\r\n    if(typeof childIndex != 'undefined') {\r\n      this.fixtureTemplateChildList.forEach((ele:any) => {\r\n        ele[\"templateDetails\"] = false;\r\n      });\r\n    }\r\n    if (this.fixtureTemplatesList[index]) {\r\n      this.hideBrand = true;\r\n      this.fixtureTemplatesList[index].templateDetails = true;\r\n      let templateId = this.fixtureTemplatesList[index].id ?? \"\";\r\n      if(typeof childIndex != 'undefined') {\r\n        this.fixtureTemplateChildList[childIndex].templateDetails = true;\r\n        templateId = this.fixtureTemplateChildList[childIndex]?._id ?? '';\r\n      }\r\n      this.storeBuilderService\r\n        .getFixtureTemplateDetails(templateId)\r\n        .subscribe((res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.fixtureTemplateInfo = res.data;\r\n          }\r\n        });\r\n    }\r\n  }\r\n\r\n  onClickClose() {\r\n    this.fixtureTemplateInfo = null;\r\n    this.hideBrand = false;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.templateSub?.unsubscribe();\r\n  }\r\n}","<!-- Tabs Navigation -->\r\n<div class=\"d-flex justify-content-start mb-4\">\r\n  <ul class=\"nav nav-line-tabs nav-line-tabs-2x\">\r\n    <li class=\"nav-item\">\r\n      <a\r\n        class=\"nav-link\"\r\n        [routerLink]=\"[]\"\r\n        [queryParams]=\"{ tab: 'all-templates' }\"\r\n        [queryParamsHandling]=\"'merge'\"\r\n        [class.active]=\"activeTab === 'all-templates'\"\r\n        (click)=\"onTabChange('all-templates')\"\r\n      >\r\n        All Templates\r\n      </a>\r\n    </li>\r\n    <li class=\"nav-item\">\r\n      <a\r\n        class=\"nav-link\"\r\n        [routerLink]=\"[]\"\r\n        [queryParams]=\"{ tab: 'find-replace' }\"\r\n        [queryParamsHandling]=\"'merge'\"\r\n        [class.active]=\"activeTab === 'find-replace'\"\r\n        (click)=\"onTabChange('find-replace')\"\r\n      >\r\n        Find and Replace\r\n      </a>\r\n    </li>\r\n  </ul>\r\n</div>\r\n\r\n<!-- All Templates Content -->\r\n<section id=\"fixtureTemplate\" class=\"template-wrapper\" [ngStyle]=\"{'height': fixtureTemplateInfo ? '75vh' : ''}\" *ngIf=\"activeTab === 'all-templates'\">\r\n  <!-- Template view header -->\r\n   <div class=\"row h-100 mx-0 my-5 gap-2\">\r\n      <div class=\"col-height card p-5\" [ngClass]=\"fixtureTemplateInfo ? 'col-md-8' : 'col-md-12'\" [ngStyle]=\"{'overflow-y':fixtureTemplateInfo ? 'auto' : ''}\">\r\n        <div\r\n          *ngIf=\"fixtureTemplatesList.length !== 0 || searchTerm || isFilterApplied\"\r\n          class=\"d-flex justify-content-between align-items-center mb-5\"\r\n        >\r\n          <div>\r\n            <h4>All Fixture Templates</h4>\r\n            <span>{{ totalItems }} - Total Templates</span>\r\n          </div>\r\n          <div class=\"d-flex align-items-center gap-2\">\r\n            <div style=\"position: relative\" [ngClass]=\"{ 'd-none': viewMode === 'tree' }\">\r\n              <input\r\n                type=\"text\"\r\n                [(ngModel)]=\"searchTerm\"\r\n                (change)=\"onSearch()\"\r\n                style=\"padding-left: 3rem; padding-right: 3rem\"\r\n                class=\"form-control\"\r\n                name=\"search\"\r\n                autocomplete=\"off\"\r\n                placeholder=\"Search\"\r\n              />\r\n      \r\n              <span class=\"search-icon\">\r\n                <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                  <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n                  <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n                </svg>\r\n              </span>\r\n      \r\n              <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n                <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                  <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n                  <g id=\"SVGRepo_iconCarrier\">\r\n                    <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                    <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                    <circle\r\n                      cx=\"12\"\r\n                      cy=\"12\"\r\n                      r=\"9\"\r\n                      stroke=\"#667085\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    ></circle>\r\n                  </g>\r\n                </svg>\r\n              </button>\r\n            </div>\r\n      \r\n            <!-- <button\r\n              type=\"button\"\r\n              [disabled]=\"fixtureTemplatesList.length <= 0\"\r\n              (click)=\"redirectToreplace()\"\r\n              class=\"btn btn-outline text-nowrap\"\r\n            >\r\n              <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M17.6094 17.5L13.9844 13.875M15.9427 9.16667C15.9427 12.8486 12.9579 15.8333 9.27604 15.8333C5.59414 15.8333 2.60938 12.8486 2.60938 9.16667C2.60938 5.48477 5.59414 2.5 9.27604 2.5C12.9579 2.5 15.9427 5.48477 15.9427 9.16667Z\"\r\n                  stroke=\"#344054\"\r\n                  stroke-width=\"2\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n              Find & Replace\r\n            </button> -->\r\n      \r\n            <lib-filters\r\n              [ngClass]=\"{ 'd-none': viewMode === 'tree' }\"\r\n              [dataObject]=\"filterObject\"\r\n              (appliedFilters)=\"applyFilters($event)\"\r\n            ></lib-filters>\r\n      \r\n            <div class=\"d-flex align-items-center gap-2\">\r\n              <div class=\"toggle-button me-1\" [ngClass]=\"{ selected: viewMode === 'list' }\" (click)=\"toggleViewMode('list')\">\r\n                <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <path\r\n                    d=\"M6.24078 4.54639H15.8906M6.24078 9.00017H15.8906M6.24078 13.4539H15.8906M2.5293 4.54639H2.53672M2.5293 9.00017H2.53672M2.5293 13.4539H2.53672\"\r\n                    [attr.stroke]=\"viewMode === 'list' ? '#009BF3' : '#344054'\"\r\n                    stroke-width=\"1.48756\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n      \r\n              <!-- <div class=\"toggle-button me-1\" [ngClass]=\"{ selected: viewMode === 'grid' }\" (click)=\"toggleViewMode('grid')\">\r\n                <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <path\r\n                    d=\"M7.91886 2.31934H2.72278V7.51541H7.91886V2.31934Z\"\r\n                    [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n                    stroke-width=\"1.48756\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                  <path\r\n                    d=\"M16.0841 2.31934H10.888V7.51541H16.0841V2.31934Z\"\r\n                    [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n                    stroke-width=\"1.48756\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                  <path\r\n                    d=\"M16.0841 10.4846H10.888V15.6807H16.0841V10.4846Z\"\r\n                    [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n                    stroke-width=\"1.48756\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                  <path\r\n                    d=\"M7.91886 10.4846H2.72278V15.6807H7.91886V10.4846Z\"\r\n                    [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n                    stroke-width=\"1.48756\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div> -->\r\n      \r\n              <div class=\"toggle-button\" [ngClass]=\"{ selected: viewMode === 'tree' }\" (click)=\"toggleViewMode('tree')\">\r\n                <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <path\r\n                    d=\"M9.92678 10.4845C7.43266 10.4845 6.61613 11.4866 6.3489 12.1472C7.14316 12.4887 7.69988 13.2755 7.69988 14.196C7.69988 14.7866 7.46527 15.353 7.04764 15.7706C6.63002 16.1882 6.0636 16.4228 5.47299 16.4228C4.88239 16.4228 4.31597 16.1882 3.89834 15.7706C3.48072 15.353 3.2461 14.7866 3.2461 14.196C3.2461 13.2235 3.86221 12.3996 4.7307 12.0953V5.9045C4.29573 5.75187 3.91908 5.4676 3.65304 5.09115C3.387 4.7147 3.24477 4.26476 3.2461 3.8038C3.2461 3.21319 3.48072 2.64677 3.89834 2.22915C4.31597 1.81152 4.88239 1.5769 5.47299 1.5769C6.0636 1.5769 6.63002 1.81152 7.04764 2.22915C7.46527 2.64677 7.69988 3.21319 7.69988 3.8038C7.69988 4.7762 7.08378 5.60015 6.21529 5.9045V9.83125C6.86851 9.34875 7.81865 8.99987 9.18448 8.99987C11.1664 8.99987 11.8271 8.0052 12.0423 7.34455C11.6362 7.17537 11.2892 6.88992 11.0449 6.52407C10.8005 6.15823 10.6698 5.72832 10.6691 5.28839C10.6691 4.69778 10.9037 4.13136 11.3213 3.71374C11.7389 3.29612 12.3054 3.0615 12.896 3.0615C13.4866 3.0615 14.053 3.29612 14.4706 3.71374C14.8882 4.13136 15.1229 4.69778 15.1229 5.28839C15.1229 6.28307 14.4696 7.14413 13.5715 7.41136C13.3785 8.47284 12.6584 10.4845 9.92678 10.4845ZM5.47299 13.4537C5.27612 13.4537 5.08732 13.5319 4.94811 13.6711C4.8089 13.8103 4.7307 13.9991 4.7307 14.196C4.7307 14.3928 4.8089 14.5816 4.94811 14.7208C5.08732 14.86 5.27612 14.9383 5.47299 14.9383C5.66986 14.9383 5.85867 14.86 5.99788 14.7208C6.13708 14.5816 6.21529 14.3928 6.21529 14.196C6.21529 13.9991 6.13708 13.8103 5.99788 13.6711C5.85867 13.5319 5.66986 13.4537 5.47299 13.4537ZM5.47299 3.0615C5.27612 3.0615 5.08732 3.1397 4.94811 3.27891C4.8089 3.41812 4.7307 3.60693 4.7307 3.8038C4.7307 4.00066 4.8089 4.18947 4.94811 4.32868C5.08732 4.46789 5.27612 4.54609 5.47299 4.54609C5.66986 4.54609 5.85867 4.46789 5.99788 4.32868C6.13708 4.18947 6.21529 4.00066 6.21529 3.8038C6.21529 3.60693 6.13708 3.41812 5.99788 3.27891C5.85867 3.1397 5.66986 3.0615 5.47299 3.0615ZM12.896 4.54609C12.6991 4.54609 12.5103 4.6243 12.3711 4.76351C12.2319 4.90271 12.1537 5.09152 12.1537 5.28839C12.1537 5.48526 12.2319 5.67406 12.3711 5.81327C12.5103 5.95248 12.6991 6.03069 12.896 6.03069C13.0928 6.03069 13.2816 5.95248 13.4208 5.81327C13.5601 5.67406 13.6383 5.48526 13.6383 5.28839C13.6383 5.09152 13.5601 4.90271 13.4208 4.76351C13.2816 4.6243 13.0928 4.54609 12.896 4.54609Z\"\r\n                    fill=\"#344054\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      \r\n        <div *ngIf=\"isPageLoading; else contentPart\">\r\n          <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      \r\n        <ng-template #contentPart>\r\n          <div *ngIf=\"!fixtureTemplatesList.length\">\r\n            <div class=\"row\">\r\n              <div class=\"col-lg-12 my-6\">\r\n                <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                  <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                  <div class=\"nodatamaintext mt-3\">No data found</div>\r\n                  <div class=\"nodatasubtext\">There is no result for template</div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n      \r\n          <div *ngIf=\"fixtureTemplatesList.length !== 0\">\r\n            <!-- Fixture Template list view -->\r\n            <section id=\"list-view\" *ngIf=\"viewMode === 'list'\">\r\n              <div class=\"table-responsive\">\r\n                <table class=\"w-100 table bottom-border text-nowrap\">\r\n                  <thead>\r\n                    <tr>\r\n                      <th>\r\n                        <span (click)=\"onSortTable('fixtureName')\" class=\"cursor-pointer\">\r\n                          Master Template\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'fixtureName' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th>\r\n                        <span (click)=\"onSortTable('fixtureCategory')\" class=\"cursor-pointer\">\r\n                          Fixture type\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'fixtureCategory' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCategory' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th>\r\n                        <span (click)=\"onSortTable('fixtureWidth')\" class=\"cursor-pointer\">\r\n                          Size width (ft)\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'fixtureWidth' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureWidth' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th *ngIf=\"!hideBrand\">\r\n                        <span (click)=\"onSortTable('productBrandName')\" class=\"cursor-pointer\">\r\n                          Brand\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'productBrandName' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'productBrandName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th *ngIf=\"!hideBrand\">\r\n                        <span (click)=\"onSortTable('productCategory')\" class=\"cursor-pointer\">\r\n                          Product category\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'productCategory' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'productCategory' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th *ngIf=\"!hideBrand\">\r\n                        <span (click)=\"onSortTable('childCount')\" class=\"cursor-pointer\">\r\n                          Variant\r\n                          <i\r\n                            class=\"fa ms-1 mt-1\"\r\n                            [ngStyle]=\"{ color: sortedColumn === 'childCount' ? '#009BF3' : '' }\"\r\n                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'childCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                            aria-hidden=\"true\"\r\n                          ></i>\r\n                        </span>\r\n                      </th>\r\n                      <th>Action</th>\r\n                    </tr>\r\n                  </thead>\r\n                  <tbody *ngFor=\"let template of fixtureTemplatesList; let i = index\">\r\n                    <tr [ngStyle]=\"{'background-color': template.templateDetails ? '#f6fcff' :  ''}\" (click)=\"enableRow(i)\" class=\"cursor-pointer\">\r\n                      <td style=\"max-width: 300px\">\r\n                        <div class=\"d-flex align-items-center w-100\">\r\n                          <!-- <div class=\"thumbnail\"></div> -->\r\n                          <div\r\n                            class=\"cursor-pointer\"\r\n                            (click)=\"\r\n                              template['open'] = !template['open']; template['loading'] = false; reset();$event.stopPropagation(); getVariantList(template, i);\r\n                            \"\r\n                          >\r\n                            <span class=\"round-badge me-3\">\r\n                              @if(!template.open) {\r\n                              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path\r\n                                  d=\"M6 12L10 8L6 4\"\r\n                                  stroke=\"#344054\"\r\n                                  stroke-width=\"1.33333\"\r\n                                  stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\"\r\n                                />\r\n                              </svg>\r\n                              }@else {\r\n                              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                <path\r\n                                  d=\"M4 6L8 10L12 6\"\r\n                                  stroke=\"#344054\"\r\n                                  stroke-width=\"1.33333\"\r\n                                  stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\"\r\n                                />\r\n                              </svg>\r\n                              }\r\n                            </span>\r\n                          </div>\r\n                          <!-- <a\r\n                            [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n                            [queryParams]=\"{ templateId: template.id, isEdit: false }\"\r\n                            class=\"text-decoration-underline ellipsis\"\r\n                            [ngbTooltip]=\"template.name\"\r\n                          > -->\r\n                            <span class=\"template-name-ellipsis\" [ngbTooltip]=\"template.name\">\r\n                              {{ template.name }}\r\n                            </span>\r\n                          <!-- </a> -->\r\n                        </div>\r\n                      </td>\r\n                      <td>{{ template.type }}</td>\r\n                      <td>{{ template.size }}</td>\r\n                      <td *ngIf=\"!hideBrand\">\r\n                        <span *ngIf=\"template.brands.length <= 0\"> - </span>\r\n      \r\n                        <div [ngbTooltip]=\"brandTooltip\" class=\"cursor-pointer\">\r\n                          <div *ngFor=\"let b of template.brands; let i = index\" class=\"badge inactive me-2\">\r\n                            <span *ngIf=\"i <= 2\"> {{ b }} </span>\r\n                            <span *ngIf=\"i === 3\"> +{{ template.brands.length - 3 }} </span>\r\n                          </div>\r\n                        </div>\r\n      \r\n                        <ng-template #brandTooltip>\r\n                          <ng-container *ngFor=\"let c of template.brands; let last = last\">\r\n                            {{ c }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                          </ng-container>\r\n                        </ng-template>\r\n                      </td>\r\n                      <td *ngIf=\"!hideBrand\">\r\n                        <span *ngIf=\"template.categories.length <= 0\"> - </span>\r\n      \r\n                        <div [ngbTooltip]=\"categoryTooltip\" class=\"cursor-pointer\">\r\n                          <div *ngFor=\"let item of template.categories; let i = index\" class=\"badge inactive me-2\">\r\n                            <span *ngIf=\"i <= 2\"> {{ item }} </span>\r\n                            <span *ngIf=\"i === 3\"> +{{ template.categories.length - 3 }} </span>\r\n                          </div>\r\n                        </div>\r\n      \r\n                        <ng-template #categoryTooltip>\r\n                          <ng-container *ngFor=\"let c of template.categories; let last = last\">\r\n                            {{ c }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                          </ng-container>\r\n                        </ng-template>\r\n                      </td>\r\n                      <td class=\"text-center\" *ngIf=\"!hideBrand\">\r\n                        <span class=\"cursor-pointer\">\r\n                          {{ template.childCount }}\r\n                        </span>\r\n                      </td>\r\n                      <td (click)=\"$event.stopPropagation();\">\r\n                        <div class=\"d-flex\">\r\n                          <div class=\"cursor-pointer\">\r\n                              <a\r\n                              [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n                              [queryParams]=\"{ templateId: template.id, isEdit: false }\"\r\n                              class=\"text-decoration-underline ellipsis\"\r\n                              [ngbTooltip]=\"template.name\"\r\n                            >\r\n                              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <g clip-path=\"url(#clip0_69_46439)\">\r\n                                <path d=\"M19.166 10.0003C19.166 10.0003 15.8327 16.667 9.99935 16.667C4.16602 16.667 0.832683 10.0003 0.832683 10.0003C0.832683 10.0003 4.16602 3.33366 9.99935 3.33366C15.8327 3.33366 19.166 10.0003 19.166 10.0003Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                <path d=\"M9.99935 7.50033C8.61864 7.50033 7.49935 8.61961 7.49935 10.0003C7.49935 11.381 8.61864 12.5003 9.99935 12.5003C11.3801 12.5003 12.4994 11.381 12.4994 10.0003C12.4994 8.61961 11.3801 7.50033 9.99935 7.50033Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </g>\r\n                                <defs>\r\n                                <clipPath id=\"clip0_69_46439\">\r\n                                <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(20 20) rotate(-180)\"/>\r\n                                </clipPath>\r\n                                </defs>\r\n                              </svg>\r\n                            </a>\r\n                          </div>\r\n                          <div class=\"cursor-pointer ps-3\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" (click)=\"onDuplicate(template.id!, i, 'master')\">\r\n                              <path d=\"M15.834 10.0003L4.16732 10.0003M10.0007 4.16699V15.8337\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                          </div>\r\n      \r\n                        </div>\r\n                        <!-- <div class=\"dropdown\">\r\n                          <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                            <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                          </button>\r\n                          <ul class=\"dropdown-menu\">\r\n                            <li>\r\n                              <a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(template.id!, i, 'master')\">\r\n                                Create Variant\r\n                              </a>\r\n                            </li>\r\n                          </ul>\r\n                        </div> -->\r\n                      </td>\r\n                    </tr>\r\n                    <tr *ngIf=\"template.open\">\r\n                      <td colspan=\"7\">\r\n                        <div *ngIf=\"template.loading; else childcontentPart\">\r\n                          <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n                            <div class=\"shimmer\">\r\n                              <div class=\"wrapper\">\r\n                                <div class=\"stroke animate title\"></div>\r\n                                <div class=\"stroke animate link\"></div>\r\n                                <div class=\"stroke animate description\"></div>\r\n                              </div>\r\n                            </div>\r\n                          </div>\r\n                        </div>\r\n                        <ng-template #childcontentPart>\r\n                          <div class=\"card\">\r\n                            <div *ngIf=\"!fixtureTemplateChildList.length\">\r\n                              <div class=\"row\">\r\n                                <div class=\"col-lg-12\">\r\n                                  <table class=\"w-100 table bottom-border text-nowrap\">\r\n                                    <tr>\r\n                                      <th>Variant</th>\r\n                                      <th>Assigned stores</th>\r\n                                      <th *ngIf=\"!hideBrand\">Brand</th>\r\n                                      <th *ngIf=\"!hideBrand\">Product category</th>\r\n                                      <th>Status</th>\r\n                                      <th>Action</th>\r\n                                    </tr>\r\n                                    <tr>\r\n                                      <td>-</td>\r\n                                      <td>-</td>\r\n                                      <td>-</td>\r\n                                      <td>-</td>\r\n                                      <td>-</td>\r\n                                      <td>-</td>\r\n                                    </tr>\r\n                                  </table>\r\n                                  <!-- <div class=\"card-body d-flex justify-content-center align-items-center flex-column\"> \r\n                                    <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                                    <div class=\"nodatamaintext mt-3\">No data found</div>\r\n                                    <div class=\"nodatasubtext\">There is no result for variants</div>\r\n                                  </div> -->\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <table class=\"w-100 table bottom-border text-nowrap\" *ngIf=\"fixtureTemplateChildList.length\">\r\n                              <thead>\r\n                                <tr>\r\n                                  <th>\r\n                                    <span (click)=\"onChildSortTable('fixtureName', template.id, i)\" class=\"cursor-pointer\">\r\n                                      Variant\r\n                                      <i\r\n                                        class=\"fa ms-1 mt-1\"\r\n                                        [ngStyle]=\"{ color: childSortedColumn === 'fixtureName' ? '#009BF3' : '' }\"\r\n                                        [ngClass]=\"\r\n                                          childSortOrder === 1 && childSortedColumn === 'fixtureName' ? 'fa-arrow-up' : 'fa-arrow-down'\r\n                                        \"\r\n                                        aria-hidden=\"true\"\r\n                                      ></i>\r\n                                    </span>\r\n                                  </th>\r\n                                  <th>\r\n                                    <span (click)=\"onChildSortTable('storeCount', template.id, i)\" class=\"cursor-pointer\">\r\n                                      Assigned Stores\r\n                                      <i\r\n                                        class=\"fa ms-1 mt-1\"\r\n                                        [ngStyle]=\"{ color: childSortedColumn === 'storeCount' ? '#009BF3' : '' }\"\r\n                                        [ngClass]=\"\r\n                                          childSortOrder === 1 && childSortedColumn === 'storeCount' ? 'fa-arrow-up' : 'fa-arrow-down'\r\n                                        \"\r\n                                        aria-hidden=\"true\"\r\n                                      ></i>\r\n                                    </span>\r\n                                  </th>\r\n                                  <th *ngIf=\"!hideBrand\">\r\n                                    <span (click)=\"onChildSortTable('productBrandName', template.id, i)\" class=\"cursor-pointer\">\r\n                                      Brand\r\n                                      <i\r\n                                        class=\"fa ms-1 mt-1\"\r\n                                        [ngStyle]=\"{ color: childSortedColumn === 'productBrandName' ? '#009BF3' : '' }\"\r\n                                        [ngClass]=\"\r\n                                          childSortOrder === 1 && childSortedColumn === 'productBrandName'\r\n                                            ? 'fa-arrow-up'\r\n                                            : 'fa-arrow-down'\r\n                                        \"\r\n                                        aria-hidden=\"true\"\r\n                                      ></i>\r\n                                    </span>\r\n                                  </th>\r\n                                  <th *ngIf=\"!hideBrand\">\r\n                                    <span (click)=\"onChildSortTable('productCategory', template.id, i)\" class=\"cursor-pointer\">\r\n                                      Product category\r\n                                      <i\r\n                                        class=\"fa ms-1 mt-1\"\r\n                                        [ngStyle]=\"{ color: childSortedColumn === 'productCategory' ? '#009BF3' : '' }\"\r\n                                        [ngClass]=\"\r\n                                          childSortOrder === 1 && childSortedColumn === 'productCategory'\r\n                                            ? 'fa-arrow-up'\r\n                                            : 'fa-arrow-down'\r\n                                        \"\r\n                                        aria-hidden=\"true\"\r\n                                      ></i>\r\n                                    </span>\r\n                                  </th>\r\n                                  <th>\r\n                                    <span (click)=\"onChildSortTable('status', template.id, i)\" class=\"cursor-pointer\">\r\n                                      Status\r\n                                      <i\r\n                                        class=\"fa ms-1 mt-1\"\r\n                                        [ngStyle]=\"{ color: childSortedColumn === 'status' ? '#009BF3' : '' }\"\r\n                                        [ngClass]=\"\r\n                                          childSortOrder === 1 && childSortedColumn === 'status' ? 'fa-arrow-up' : 'fa-arrow-down'\r\n                                        \"\r\n                                        aria-hidden=\"true\"\r\n                                      ></i>\r\n                                    </span>\r\n                                  </th>\r\n                                  <th>Action</th>\r\n                                </tr>\r\n                              </thead>\r\n                              <tbody>\r\n                                <tr *ngFor=\"let childTemplate of fixtureTemplateChildList;let j=index\" (click)=\"enableRow(i,j,'child')\" [ngStyle]=\"{'background-color': childTemplate.templateDetails ? '#f6fcff' :  ''}\" class=\"cursor-pointer\">\r\n                                  <td style=\"max-width: 300px\">\r\n                                    <div class=\"d-flex align-items-center w-100\">\r\n                                      <!-- <div class=\"thumbnail\"></div> -->\r\n                                      <!-- <a\r\n                                        [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n                                        [queryParams]=\"{ templateId: childTemplate._id, isEdit: false }\"\r\n                                        class=\"text-decoration-underline ellipsis\"\r\n                                        [ngbTooltip]=\"childTemplate.fixtureName\"\r\n                                      > -->\r\n                                        <span class=\"template-name-ellipsis\" [ngbTooltip]=\"childTemplate.fixtureName\">\r\n                                          {{ childTemplate.fixtureName }}\r\n                                        </span>\r\n                                      <!-- </a> -->\r\n                                    </div>\r\n                                  </td>\r\n                                  <td>\r\n                                    <div>\r\n                                      <a\r\n                                        [routerLink]=\"['/manage/planogram/fixture-template/assign-stores']\"\r\n                                        [queryParams]=\"{ templateId: childTemplate._id, isEdit: false }\"\r\n                                        class=\"text-decoration-underline\"\r\n                                        [ngbTooltip]=\"storeTooltip\"\r\n                                      >\r\n                                        {{ childTemplate.storeCount }}\r\n                                      </a>\r\n                                    </div>\r\n                                    <ng-template #storeTooltip>\r\n                                      <ng-container *ngFor=\"let c of childTemplate.storeList; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                      </ng-container>\r\n                                    </ng-template>\r\n                                  </td>\r\n                                  <td *ngIf=\"!hideBrand\">\r\n                                    <span *ngIf=\"childTemplate.productBrandName.length <= 0\"> - </span>\r\n      \r\n                                    <div [ngbTooltip]=\"brandTooltip\" class=\"cursor-pointer\">\r\n                                      <div *ngFor=\"let b of childTemplate.productBrandName; let i = index\" class=\"badge inactive me-2\">\r\n                                        <span *ngIf=\"i <= 2\"> {{ b }} </span>\r\n                                        <span *ngIf=\"i === 3\"> +{{ childTemplate.productBrandName.length - 3 }} </span>\r\n                                      </div>\r\n                                    </div>\r\n      \r\n                                    <ng-template #brandTooltip>\r\n                                      <ng-container *ngFor=\"let c of childTemplate.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                      </ng-container>\r\n                                    </ng-template>\r\n                                  </td>\r\n                                  <td *ngIf=\"!hideBrand\">\r\n                                    <span *ngIf=\"childTemplate.productCategory.length <= 0\"> - </span>\r\n      \r\n                                    <div [ngbTooltip]=\"categoryTooltip\" class=\"cursor-pointer\">\r\n                                      <div\r\n                                        *ngFor=\"let item of childTemplate.productCategory; let i = index\"\r\n                                        class=\"badge inactive me-2\"\r\n                                      >\r\n                                        <span *ngIf=\"i <= 2\"> {{ item }} </span>\r\n                                        <span *ngIf=\"i === 3\"> +{{ childTemplate.productCategory.length - 3 }} </span>\r\n                                      </div>\r\n                                    </div>\r\n      \r\n                                    <ng-template #categoryTooltip>\r\n                                      <ng-container *ngFor=\"let c of childTemplate.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                      </ng-container>\r\n                                    </ng-template>\r\n                                  </td>\r\n                                  <td>\r\n                                    <div class=\"badge\" [ngClass]=\"childTemplate.status\">{{ childTemplate.status | titlecase }}</div>\r\n                                  </td>\r\n                                  <td (click)=\"$event.stopPropagation();\">\r\n                                    <div class=\"dropdown\">\r\n                                      <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                                        <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                                      </button>\r\n                                      <ul class=\"dropdown-menu\">\r\n                                        <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(childTemplate)\">Edit</a></li>\r\n                                        <li>\r\n                                          <a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(childTemplate._id!)\">\r\n                                            Duplicate\r\n                                          </a>\r\n                                        </li>\r\n                                        <li>\r\n                                          <a\r\n                                            class=\"dropdown-item cursor-pointer\"\r\n                                            [routerLink]=\"['/manage/planogram/findAndReplace']\"\r\n                                            [queryParams]=\"{ selectedFixture: childTemplate._id }\"\r\n                                          >\r\n                                            Find and replace\r\n                                          </a>\r\n                                        </li>\r\n                                        <li>\r\n                                          <a\r\n                                            class=\"dropdown-item cursor-pointer text-danger\"\r\n                                            (click)=\"onDelete(childTemplate._id!, childTemplate.storeCount, template.id, i)\"\r\n                                          >\r\n                                            Delete\r\n                                          </a>\r\n                                        </li>\r\n                                      </ul>\r\n                                    </div>\r\n                                  </td>\r\n                                </tr>\r\n                              </tbody>\r\n                            </table>\r\n                            <lib-pagination\r\n                              *ngIf=\"fixtureTemplateChildList.length\"\r\n                              [itemsPerPage]=\"childLimit\"\r\n                              [currentPage]=\"childOffset\"\r\n                              [totalItems]=\"childTotalItems\"\r\n                              [paginationSizes]=\"childPaginationSizes\"\r\n                              [pageSize]=\"childPaginationSize()\"\r\n                              (pageChange)=\"onChildPageChange($event, template.id, i)\"\r\n                              (pageSizeChange)=\"onChildPageSizeChange($event, template.id, i)\"\r\n                            >\r\n                            </lib-pagination>\r\n                          </div>\r\n                        </ng-template>\r\n                      </td>\r\n                    </tr>\r\n                  </tbody>\r\n                </table>\r\n              </div>\r\n            </section>\r\n      \r\n      \r\n            <!-- Fixture Template grid view -->\r\n            <section id=\"grid-view\" *ngIf=\"viewMode === 'grid'\" class=\"table-responsive\">\r\n              <div class=\"row gx-6 gy-4 m-0\">\r\n                <div class=\"col-md-4\" *ngFor=\"let template of fixtureTemplatesList\">\r\n                  <div class=\"card\" (click)=\"onClickCard($event, template)\">\r\n                    <div class=\"card-img\">\r\n                      <div class=\"card-action dropdown\" (click)=\"$event.stopPropagation()\">\r\n                        <button class=\"btn btn-light px-4 py-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                          <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                        </button>\r\n                        <ul class=\"dropdown-menu\">\r\n                          <!-- <li>\r\n                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(template.id!); $event.stopPropagation()\">\r\n                              Create Variant\r\n                            </a>\r\n                          </li> -->\r\n                          <!-- <li>\r\n                              <a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(template.id!); $event.stopPropagation()\">\r\n                                Duplicate\r\n                              </a>\r\n                            </li> -->\r\n                          <!-- <li>\r\n                              <a\r\n                                class=\"dropdown-item cursor-pointer text-danger\"\r\n                                (click)=\"onDelete(template.id!, template.storeCount); $event.stopPropagation()\"\r\n                              >\r\n                                Delete\r\n                              </a>\r\n                            </li> -->\r\n                        </ul>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"d-flex justify-content-between align-items-center\">\r\n                      <h3>\r\n                        {{ template.name }}\r\n                      </h3>\r\n                      <div class=\"badge\" [ngClass]=\"template.status\">{{ template.status | titlecase }}</div>\r\n                    </div>\r\n                    <div class=\"d-flex flex-wrap mt-1\">\r\n                      <div [ngbTooltip]=\"brandTooltip\" class=\"cursor-pointer\">\r\n                        @for (b of template.brands; track $index;let last = $last) {\r\n                        <div class=\"badge inactive me-2 mb-2\">\r\n                          <span *ngIf=\"$index <= 2\"> {{ b }} </span>\r\n                          <span *ngIf=\"$index === 3\"> + {{ template.brands.length - 3 }} </span>\r\n                        </div>\r\n                        <span *ngIf=\"$index < 2 && !last\" class=\"me-2 card-tagline\">&#8226;</span>\r\n                        }\r\n                      </div>\r\n      \r\n                      <ng-template #brandTooltip>\r\n                        <p>\r\n                          <b>Brands: </b>\r\n                          <ng-container *ngFor=\"let b of template.brands; let last = last\">\r\n                            {{ b }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                          </ng-container>\r\n                        </p>\r\n                      </ng-template>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </section>\r\n      \r\n            <!-- Fixture Template tree view -->\r\n            <section id=\"tree-view\" *ngIf=\"viewMode === 'tree'\">\r\n              <fixture-template-tree [clientId]=\"clientId\" [viewMode]=\"'group'\"></fixture-template-tree>\r\n            </section>\r\n      \r\n            <!-- Pagination -->\r\n            <lib-pagination\r\n              *ngIf=\"viewMode !== 'tree'\"\r\n              [itemsPerPage]=\"limit\"\r\n              [currentPage]=\"offset\"\r\n              [totalItems]=\"totalItems\"\r\n              [paginationSizes]=\"paginationSizes\"\r\n              [pageSize]=\"paginationSize()\"\r\n              (pageChange)=\"onPageChange($event)\"\r\n              (pageSizeChange)=\"onPageSizeChange($event)\"\r\n            >\r\n            </lib-pagination>\r\n          </div>\r\n        </ng-template>\r\n      </div>\r\n      <div [ngClass]=\"{'d-none':!fixtureTemplateInfo}\" class=\"col bg-white rounded p-3 fixture-overview card col-height\" style=\"overflow-y:auto\">\r\n          <lib-template-details [fixtureTemplateDetails]=\"fixtureTemplateInfo\" [vmList]=\"vmList\" (onClose)=\"onClickClose()\" [vmList]=\"vmList\"></lib-template-details>\r\n      </div>\r\n   </div>\r\n</section>\r\n\r\n<!-- Find and Replace Content (email-gated; tab hidden unless frAllowed, panel on deep-link) -->\r\n<div *ngIf=\"activeTab === 'find-replace'\">\r\n  <lib-find-replace-table *ngIf=\"frAllowed\"></lib-find-replace-table>\r\n  <lib-access-denied\r\n    *ngIf=\"frAccessChecked && !frAllowed\"\r\n    [feature]=\"'Find and Replace'\"\r\n  ></lib-access-denied>\r\n</div>\r\n\r\n<ng-template #verticalDots>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n    <path\r\n      d=\"M1 8.99998C1 9.52925 1.44771 9.95831 2 9.95831C2.55228 9.95831 3 9.52925 3 8.99998C3 8.47071 2.55228 8.04165 2 8.04165C1.44771 8.04165 1 8.47071 1 8.99998Z\"\r\n      stroke=\"currentColor\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M0.999999 15.7083C0.999999 16.2376 1.44771 16.6666 2 16.6666C2.55228 16.6666 3 16.2376 3 15.7083C3 15.179 2.55228 14.75 2 14.75C1.44771 14.75 0.999999 15.179 0.999999 15.7083Z\"\r\n      stroke=\"currentColor\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M1 2.29165C1 2.82092 1.44772 3.24998 2 3.24998C2.55228 3.24998 3 2.82092 3 2.29165C3 1.76237 2.55228 1.33331 2 1.33331C1.44772 1.33331 1 1.76237 1 2.29165Z\"\r\n      stroke=\"currentColor\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n</ng-template>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-complete-confirmation',\r\n  templateUrl: './complete-confirmation.component.html',\r\n  styleUrl: './complete-confirmation.component.scss'\r\n})\r\nexport class CompleteConfirmationComponent {\r\n  @Input() title: string = 'Complete action';\r\n  @Input() description: string = 'It is now ready and available to use.';\r\n  @Input() note?: string;\r\n  @Input() type?: string;\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n  ) { }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onComplete() {\r\n    this.activeModal.close('ok');\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"mb-5\" *ngIf=\"type == 'publish'\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n        <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n        <g clip-path=\"url(#clip0_371_22579)\">\r\n        <path d=\"M22.6673 9.33398L15.334 16.6673M22.6673 9.33398L18.0007 22.6673L15.334 16.6673M22.6673 9.33398L9.33398 14.0007L15.334 16.6673\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n        </g>\r\n        <defs>\r\n        <clipPath id=\"clip0_371_22579\">\r\n        <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(8 8)\"/>\r\n        </clipPath>\r\n        </defs>\r\n      </svg>\r\n  </div>\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n  <p *ngIf=\"note\"><b>Note: </b> {{ note }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\" *ngIf=\"type != 'publish'\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onComplete()\">Complete</button>\r\n  </div>\r\n  <div class=\"modal-actions mt-8\" *ngIf=\"type == 'publish'\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onComplete()\">Publish</button>\r\n  </div>\r\n</div>\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { debounceTime, filter, Subject, takeUntil } from \"rxjs\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { NgbAccordionModule, NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { FixtureTemplateDetails } from \"../../../interfaces/fixture-template.interface\";\r\nimport { CompleteConfirmationComponent } from \"../../popups/complete-confirmation/complete-confirmation.component\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport { PageInfoService } from \"tango-app-ui-global\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { CounterInputComponent } from \"../../counter-input/counter-input.component\";\r\nimport { generalValidator } from \"../../../functions/plano.function\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { ReactiveSelectComponent } from \"../../reactive-select/reactive-select.component\";\r\n\r\n@Component({\r\n  selector: \"lib-template-basic-details\",\r\n  templateUrl: \"./template-basic-details.component.html\",\r\n  styleUrl: \"./template-basic-details.component.scss\",\r\n  standalone: true,\r\n  imports: [\r\n    CounterInputComponent,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    NgbAccordionModule,\r\n    ReactiveSelectComponent,\r\n  ],\r\n})\r\nexport class TemplateBasicDetailsComponent implements OnInit, OnDestroy {\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  fixtureTemplateBasicDetailsForm: FormGroup;\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n  readonly shelfTypes: DropdownIF[] = [\r\n    { label: \"Shelf\", value: \"shelf\" },\r\n    { label: \"Tray\", value: \"tray\" },\r\n    { label: \"VM Only\", value: \"vmonly\" },\r\n  ];\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private route: ActivatedRoute,\r\n    private ps: PlanoDataService,\r\n    private toast: ToastService,\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private pageInfo: PageInfoService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.ps.fixtureTemplateDetails\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        filter((data) => !data?.ignoreUpdate),\r\n      )\r\n      .subscribe((data) => {\r\n        this.fixtureTemplateDetails = data;\r\n        this.initializeForm();\r\n      });\r\n\r\n    this.route.queryParamMap\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        this.isEditMode = params.get(\"isEdit\") === \"true\";\r\n\r\n        if (this.isEditMode) {\r\n          this.fixtureTemplateBasicDetailsForm?.enable({ emitEvent: false });\r\n        } else {\r\n          this.fixtureTemplateBasicDetailsForm?.disable({ emitEvent: false });\r\n        }\r\n      });\r\n\r\n    this.ps.fixtureTemplateForm$\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => this.submitForm(data));\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Basic details\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  initializeForm() {\r\n    this.fixtureTemplateBasicDetailsForm = this.fb.group({\r\n      description: [\r\n        this.fixtureTemplateDetails?.description ?? \"\",\r\n        generalValidator(),\r\n      ],\r\n      fixtureCategory: [this.getFixtureLibrary(), Validators.required],\r\n      headerLabel: [\r\n        this.fixtureTemplateDetails?.header?.label,\r\n        generalValidator(),\r\n      ],\r\n      shelf: this.fb.array([]),\r\n      footerLabel: [\r\n        this.fixtureTemplateDetails?.footer?.label,\r\n        generalValidator(),\r\n      ],\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.shelfConfig?.forEach((i) => this.addShelf(i));\r\n\r\n    this.fixtureTemplateBasicDetailsForm.valueChanges\r\n      .pipe(debounceTime(300), takeUntil(this.destroy$))\r\n      .subscribe((v) => this.updateChangesToLocal(v));\r\n\r\n    if (!this.isEditMode)\r\n      this.fixtureTemplateBasicDetailsForm?.disable({ emitEvent: false });\r\n    this.isPageLoading = false;\r\n\r\n    if (this.ps.fixtureTemplateErrorTabs.basicDetails) {\r\n      this.fixtureTemplateBasicDetailsForm.markAllAsTouched();\r\n    }\r\n  }\r\n\r\n  addShelf(shelf?: any) {\r\n    const shelfGroup = this.fb.group({\r\n      shelfType: [shelf?.shelfType ?? \"shelf\"],\r\n      productPerShelf: [shelf?.productPerShelf ?? 1],\r\n      trayRows: [shelf?.trayRows ?? 1],\r\n    });\r\n    this.updateProductPerShelfMinValidator(\r\n      shelfGroup,\r\n      shelfGroup.get(\"shelfType\")?.value,\r\n    );\r\n    this.setupShelfTypeListener(shelfGroup);\r\n    this.shelfArray.push(shelfGroup);\r\n  }\r\n\r\n  setupShelfTypeListener(shelfGroup: FormGroup) {\r\n    let previousType = shelfGroup.get(\"shelfType\")?.value;\r\n    shelfGroup.get(\"shelfType\")?.valueChanges.subscribe((type) => {\r\n      const productPerShelfControl = shelfGroup.get(\"productPerShelf\");\r\n      if (type === \"vmonly\") {\r\n        productPerShelfControl?.setValue(0);\r\n      } else if (previousType === \"vmonly\") {\r\n        productPerShelfControl?.setValue(1);\r\n      }\r\n      previousType = type;\r\n\r\n      this.updateProductPerShelfMinValidator(shelfGroup, type);\r\n      const noOfRowsControl = shelfGroup.get(\"trayRows\");\r\n      if (type === \"tray\") {\r\n        noOfRowsControl?.setValidators([\r\n          Validators.required,\r\n          Validators.min(1),\r\n        ]);\r\n        noOfRowsControl?.setValue(1);\r\n      } else {\r\n        noOfRowsControl?.clearValidators();\r\n        noOfRowsControl?.setValue(null);\r\n      }\r\n      noOfRowsControl?.updateValueAndValidity();\r\n    });\r\n  }\r\n\r\n  updateProductPerShelfMinValidator(shelfGroup: FormGroup, shelfType: string) {\r\n    const productPerShelfControl = shelfGroup.get(\"productPerShelf\");\r\n    const minValue = shelfType === \"vmonly\" ? 0 : 1;\r\n\r\n    productPerShelfControl?.setValidators([Validators.min(minValue)]);\r\n    productPerShelfControl?.updateValueAndValidity({ emitEvent: false });\r\n  }\r\n\r\n  // If index is not given, last shelf should be removed\r\n  removeShelf(index: number = this.shelfArray.controls.length - 1) {\r\n    this.shelfArray.removeAt(index);\r\n  }\r\n\r\n  get shelfArray(): FormArray {\r\n    return this.fixtureTemplateBasicDetailsForm.get(\"shelf\") as FormArray;\r\n  }\r\n\r\n  get totalProductCapacity(): number {\r\n    return this.shelfArray.controls.reduce((total, item) => {\r\n      const count = item.get(\"productPerShelf\")?.value || 0;\r\n      const isTray = item.get(\"shelfType\")?.value === \"tray\";\r\n      const rows = item.get(\"trayRows\")?.value || 1;\r\n\r\n      // If the fixture is a floor panel or tray, we need to multiply the product capacity by the number of rows\r\n      return (\r\n        total +\r\n        (isTray || this.fixtureTemplateDetails?.fixtureType === \"floor\"\r\n          ? count * rows\r\n          : count)\r\n      );\r\n    }, 0);\r\n  }\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Complete template\";\r\n    modelRef.componentInstance.description =\r\n      \"Template is now ready to assign it to the store but still you can come again any time and edit this template.\";\r\n    // modelRef.componentInstance.note = 'You can\\'t edit it once assigned to the template.';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async submitForm(data: { status: string; goBack: boolean }) {\r\n    const et = this.ps.fixtureTemplateErrorTabs;\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    if (this.fixtureTemplateBasicDetailsForm.invalid) {\r\n      this.fixtureTemplateBasicDetailsForm.markAllAsTouched();\r\n      this.toast.getErrorToast(\"Form is invalid\");\r\n      return;\r\n    }\r\n\r\n    if (et.basicDetails || et.products || et.vms) return;\r\n\r\n    if (data.status === \"complete\")\r\n      if (!(await this.confirmCompletion())) return;\r\n\r\n    const payload: FixtureTemplateDetails = {\r\n      ...this.fixtureTemplateDetails,\r\n      isEdited: true,\r\n      // status: data.status,\r\n      fixtureName: this.fixtureTemplateDetails.fixtureName?.trim(),\r\n\r\n      description: this.fixtureTemplateBasicDetailsForm.value.description,\r\n      header: {\r\n        ...this.fixtureTemplateDetails.header,\r\n        label: this.fixtureTemplateBasicDetailsForm.value.headerLabel,\r\n      },\r\n      footer: {\r\n        ...this.fixtureTemplateDetails.footer,\r\n        label: this.fixtureTemplateBasicDetailsForm.value.footerLabel,\r\n      },\r\n      fixtureCapacity: this.totalProductCapacity,\r\n      shelfConfig: this.fixtureTemplateDetails.shelfConfig?.map((e, i) => {\r\n        return {\r\n          ...e,\r\n          ...this.fixtureTemplateBasicDetailsForm.value.shelf[i],\r\n        };\r\n      }),\r\n      updatedAt: new Date(Date.now()).toISOString(),\r\n    };\r\n\r\n    const result = await this.ps.submitFixtureTemplateDetails(\r\n      payload,\r\n\r\n      this.fixtureTemplateDetails._id!,\r\n    );\r\n\r\n    if (result) {\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        replaceUrl: true,\r\n        queryParams: { isEdit: false },\r\n        queryParamsHandling: \"merge\",\r\n      });\r\n      this.toast.getSuccessToast(\"Fixture template details updated.\");\r\n      if (data.goBack) {\r\n        this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n      } else if (data.status === \"complete\") {\r\n        // this.router.navigate(\r\n        //   [\"/manage/planogram/fixture-template/assign-stores\"],\r\n        //   {\r\n        //     queryParamsHandling: \"preserve\",\r\n        //   }\r\n        // );\r\n      }\r\n    }\r\n  }\r\n\r\n  updateChangesToLocal(val: any) {\r\n    const payload: FixtureTemplateDetails = {\r\n      ...this.fixtureTemplateDetails,\r\n      description: val.description,\r\n      header: {\r\n        ...this.fixtureTemplateDetails?.header,\r\n        label: val.headerLabel,\r\n      },\r\n      footer: {\r\n        ...this.fixtureTemplateDetails?.footer,\r\n        label: val.footerLabel,\r\n      },\r\n      fixtureCapacity: this.totalProductCapacity,\r\n      shelfConfig: val?.shelf?.map((e: any, i: any) => {\r\n        return {\r\n          ...(this?.fixtureTemplateDetails?.shelfConfig?.[i] ??\r\n            this?.fixtureTemplateDetails?.shelfConfig?.[\r\n              this?.fixtureTemplateDetails?.shelfConfig?.length - 1\r\n            ]),\r\n          ...e,\r\n          shelfNumber: i + 1,\r\n        };\r\n      }),\r\n      ignoreUpdate: true, // Used to skip the unnecessary form init and other functionalities across the fixture template components.\r\n    };\r\n    this.fixtureTemplateDetails = payload;\r\n    this.ps.fixtureTemplateDetails.next(payload);\r\n    this.ps.fixtureTemplateErrorTabs.basicDetails =\r\n      this.fixtureTemplateBasicDetailsForm.invalid;\r\n  }\r\n\r\n  getFixtureLibrary(): string {\r\n    const d = this.fixtureTemplateDetails;\r\n    return `${d?.fixtureCategory} ${d?.fixtureWidth?.value} ${d?.fixtureWidth?.unit}`;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.ps.fixtureTemplateDetails.next({\r\n      ...this.ps.fixtureTemplateDetails.value,\r\n      ignoreUpdate: false,\r\n    });\r\n  }\r\n}\r\n","<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <div class=\"cols col\">\r\n      <h2>Fixture Details</h2>\r\n      <p>Configure your fixture details here</p>\r\n\r\n      <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n      <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n        <div class=\"form-group mb-4\">\r\n          <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n          <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n              Description cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n        <div class=\"form-group mb-4\">\r\n          <label for=\"fixtureCategory\" class=\"form-label mb-1\">Select fixture type</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"fixtureCategory\" readonly />\r\n        </div>\r\n\r\n        <div class=\"form-group mb-4\"\r\n          *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n          <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n              Header label cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div formArrayName=\"shelf\">\r\n          <div class=\"mb-3\">\r\n            <div class=\"d-flex justify-content-between align-items-center mt-3\" [class.disabled-click]=\"!isEditMode\">\r\n              <label>No of shelves</label>\r\n              <div class=\"counter-container\">\r\n                <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf();\">\r\n                  <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n                <span>{{ shelfArray.length }}</span>\r\n                <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf();\">\r\n                  <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n                    stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\r\n          <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n            <div class=\"shelf-container\">\r\n              <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                <p>\r\n                  {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n                  {{ i + 1 }}\r\n                </p>\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                  (click)=\"removeShelf(i); \" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\r\n                  <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n                formControlName=\"shelfType\">\r\n              </lib-reactive-select>\r\n\r\n              <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n                class=\"d-flex justify-content-between align-items-center mt-2\">\r\n                <p class=\"m-0\">No of Rows</p>\r\n                <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n\r\n                <ng-container *ngIf=\"shelf.get('trayRows')?.touched && shelf.get('trayRows')?.errors\">\r\n                  <small *ngIf=\"shelf.get('trayRows')?.hasError('min')\" class=\"text-danger\">\r\n                    Must be at least 1 row.\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n\r\n              <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n                *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n                <label>Product capacity</label>\r\n                <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n                  placeholder=\"0\"></counter-input>\r\n              </div>\r\n\r\n              <ng-container *ngIf=\"\r\n                  shelf.get('shelfType')?.value !== 'vmonly' &&\r\n                  shelf.get('productPerShelf')?.touched &&\r\n                  shelf.get('productPerShelf')?.errors\r\n                \">\r\n                <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n                  Product capacity must be at least 1\r\n                </small>\r\n              </ng-container>\r\n\r\n              <!-- <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n                class=\"d-flex justify-content-between align-items-center mb-2 mt-2\">\r\n                <p class=\"m-0\">No of Rows</p>\r\n                <div class=\"counter-container\" style=\"width: 40%; min-height: 35px\">\r\n                  {{ shelf.get(\"trayRows\")?.value }}\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between align-items-center mt-2\">\r\n                <label>Product capacity</label>\r\n                <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n                  placeholder=\"0\"></counter-input>\r\n              </div>\r\n              <ng-container *ngIf=\"shelf.get('productPerShelf')?.touched && shelf.get('productPerShelf')?.errors\">\r\n                <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n                  Product capacity cannot be negative.\r\n                </small>\r\n              </ng-container> -->\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <div class=\"form-group mb-4\"\r\n          *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n          <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n          <ng-container *ngIf=\"\r\n              fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n              fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n            \">\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n              Footer label cannot be only whitespace.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n              No leading or trailing whitespace allowed.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n      </form>\r\n    </div>\r\n    <div class=\"cols col-8\">\r\n      <div class=\"d-flex justify-content-center\">\r\n        <!-- Vertical arrows -->\r\n        <div class=\"vertical-dimension\">\r\n          <div class=\"arrow up\"></div>\r\n          <div class=\"line\">\r\n            <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n          </div>\r\n          <div class=\"arrow down\"></div>\r\n        </div>\r\n\r\n        <div>\r\n          <!-- Horizontal arrows -->\r\n          <ng-container *ngTemplateOutlet=\"\r\n              dimensionArrows;\r\n              context: {\r\n                value: fixtureTemplateDetails?.fixtureWidth?.value\r\n              }\r\n            \"></ng-container>\r\n\r\n          <div class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <p>\r\n                {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n              </p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n              <div class=\"shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n                @if(item.get('shelfType')?.value ==='tray'){\r\n                  <div class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                }@else {\r\n                  <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n                    </div>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <div class=\"sub-footer left-box\"></div>\r\n              <div class=\"sub-footer right-box\"></div>\r\n              <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport {\r\n  debounceTime,\r\n  filter,\r\n  firstValueFrom,\r\n  lastValueFrom,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport {\r\n  FixtureTemplateDetails,\r\n  SectionConfig,\r\n  ShelfConfig,\r\n  VMConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport {\r\n  VmLibraryList,\r\n  VMTypeDetails,\r\n} from \"../../../interfaces/vm-library.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { CompleteConfirmationComponent } from \"../../popups/complete-confirmation/complete-confirmation.component\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-template-vms\",\r\n  templateUrl: \"./template-vms.component.html\",\r\n  styleUrl: \"./template-vms.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class TemplateVmsComponent\r\n  implements OnInit, OnDestroy, AfterViewChecked\r\n{\r\n  /**\r\n   * When embedded in the Looks (Look Plano Collection) form's Visual\r\n   * Merchandising tab, the Type and VM-selection inputs are locked (their\r\n   * values are driven by the Look's placements); only the placement\r\n   * positions remain editable. The standalone Fixture Template editor leaves\r\n   * this false so every field stays editable.\r\n   */\r\n  @Input() looksMode = false;\r\n\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  clientId: string;\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n\r\n  fixtureVmForm: FormGroup;\r\n\r\n  vmTypeList: DropdownIF[] = [];\r\n\r\n  vmList: VmLibraryList[] = [];\r\n  vmListMap: Map<string, DropdownIF[]> = new Map();\r\n\r\n  startYPositionList: DropdownIF[][] = [];\r\n  endYPositionsList: DropdownIF[][] = [];\r\n\r\n  xZonesList = [\r\n    { label: \"Left\", value: \"left\" },\r\n    { label: \"Right\", value: \"right\" },\r\n    { label: \"Middle\", value: \"middle\" },\r\n    { label: \"Stretch\", value: \"stretch\" },\r\n  ];\r\n  yZonesList = [\r\n    { label: \"Top\", value: \"top\" },\r\n    { label: \"Bottom\", value: \"bottom\" },\r\n    { label: \"Middle\", value: \"middle\" },\r\n    { label: \"Stretch\", value: \"stretch\" },\r\n  ];\r\n  positionsList = [\r\n    { label: \"Front\", value: \"front\" },\r\n    { label: \"Back\", value: \"back\" },\r\n  ];\r\n\r\n  imgCDN: string;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private route: ActivatedRoute,\r\n    private ps: PlanoDataService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private gs: GlobalStateService,\r\n    private router: Router,\r\n    private ngbModal: NgbModal,\r\n    private titleCasePipe: TitleCasePipe,\r\n    private pageInfo: PageInfoService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        await Promise.all([this.getVmTypes(), this.getVmsList()]);\r\n\r\n        this.ps.fixtureTemplateDetails\r\n          .pipe(\r\n            takeUntil(this.destroy$),\r\n            filter((data) => !data?.ignoreUpdate),\r\n          )\r\n          .subscribe((data) => {\r\n            this.fixtureTemplateDetails = data;\r\n            this.initVmForm();\r\n          });\r\n\r\n        this.route.queryParamMap\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((params) => {\r\n            this.isEditMode = params.get(\"isEdit\") === \"true\";\r\n\r\n            if (this.isEditMode) {\r\n              this.fixtureVmForm?.enable({ emitEvent: false });\r\n            } else {\r\n              this.fixtureVmForm?.disable({ emitEvent: false });\r\n            }\r\n          });\r\n\r\n        this.ps.fixtureTemplateForm$\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((data) => this.submitForm(data));\r\n      });\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    // Wait until BOTH the viewport is in the DOM AND vmArray has been\r\n    // populated by initVmForm. getVmsList()'s `finally` flips\r\n    // isPageLoading to false the moment the HTTP call resolves, which makes\r\n    // the `#body-block` div visible BEFORE the BehaviorSubject subscription\r\n    // runs initVmForm. Without the controls.length guard, this hook would\r\n    // mark isVMInitialized=true on that intermediate frame, the\r\n    // valueChanges subscription would be skipped (vmArray is still\r\n    // undefined), and VM blocks would stay at translate(0,0) on every\r\n    // subsequent (cached) library load — only the first chip click would\r\n    // happen to win the race because its uncached HTTP delays initVmForm\r\n    // until after the viewport renders.\r\n    if (\r\n      !this.isVMInitialized &&\r\n      this.fixtureVmForm &&\r\n      (this.vmArray?.controls?.length ?? 0) > 0\r\n    ) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n      this.vmArray.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe(() => this.handleVmPositionAndSize());\r\n    }\r\n\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n  }\r\n\r\n  setPageData() {\r\n    // When embedded inside the Looks form (looksMode), don't override the parent page's breadcrumb/title.\r\n    if (this.looksMode) return;\r\n    this.pageInfo.setTitle(\"Visual Merchandise\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  initVmForm() {\r\n    if (this.fixtureVmForm) return;\r\n    this.fixtureVmForm = this.fb.group({\r\n      vmConfig: this.fb.array([]),\r\n    });\r\n\r\n    if (this.fixtureTemplateDetails?.vmConfig?.length) {\r\n      this.fixtureTemplateDetails?.vmConfig?.forEach((e, i) =>\r\n        this.addVM(e, i),\r\n      );\r\n    }\r\n    // else {\r\n    //   this.addVM();\r\n    // }\r\n\r\n    if (!this.isEditMode) this.fixtureVmForm?.disable({ emitEvent: false });\r\n    this.isPageLoading = false;\r\n    this.fixtureVmForm?.valueChanges\r\n      .pipe(debounceTime(300), takeUntil(this.destroy$))\r\n      .subscribe(() => this.updateChangesToLocal());\r\n    if (this.ps.fixtureTemplateErrorTabs.vms) {\r\n      this.fixtureVmForm.markAllAsTouched();\r\n    }\r\n\r\n    this.applyShelfColors();\r\n  }\r\n\r\n  get vmArray(): FormArray {\r\n    return this.fixtureVmForm?.get(\"vmConfig\") as FormArray;\r\n  }\r\n\r\n  async getVmsList() {\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getVMNameList(this.clientId),\r\n      );\r\n      if (res?.status === \"success\") {\r\n        this.vmList = res?.data?.map((item: any) => {\r\n          return {\r\n            id: item._id,\r\n            name: item.vmName,\r\n            displayName: item.vmName,\r\n            width: item.vmWidth.value,\r\n            height: item.vmHeight.value,\r\n            type: item.vmType,\r\n            ...(item.vmImageUrl\r\n              ? { imgUrl: `${this.imgCDN}${item.vmImageUrl}` }\r\n              : {}),\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n    } finally {\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  async getVmTypes() {\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService.getVmTypesList(this.clientId),\r\n      );\r\n      if (res?.data) {\r\n        this.vmTypeList = res.data.map((b: VMTypeDetails) => {\r\n          return { label: b.vmType ?? \"\", value: b.vmType ?? \"\" };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmTypes [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  getSelectedVM(vm: any) {\r\n    const selectedVM = this.vmList.find((v) => v.id === vm?.value?.vmId);\r\n    return selectedVM;\r\n  }\r\n\r\n  onImgError(event: Event) {\r\n    const target = event.target as HTMLImageElement;\r\n    target.src = \"assets/tango/Images/vm-placeholder.png\";\r\n  }\r\n\r\n  addVM(vm?: VMConfig, i: number = this.vmArray.controls.length) {\r\n    const vmGroup = this.fb.group({\r\n      vmType: [vm?.vmType],\r\n      vmId: [vm?.vmId, Validators.required],\r\n      startYPosition: [vm?.startYPosition, Validators.required],\r\n      endYPosition: [vm?.endYPosition, Validators.required],\r\n      xZone: [vm?.xZone ?? \"\"],\r\n      yZone: [vm?.yZone ?? \"\"],\r\n      position: [vm?.position ?? \"\"],\r\n    });\r\n\r\n    this.vmArray.push(vmGroup);\r\n\r\n    const mapId = `vm${i}`;\r\n\r\n    if (vm?.vmType) {\r\n      this.vmListMap.set(\r\n        mapId,\r\n        this.vmList\r\n          .filter((v) => v.type === vm?.vmType)\r\n          .map((v) => {\r\n            return { value: v.id, label: v.displayName };\r\n          }),\r\n      );\r\n    } else {\r\n      this.vmListMap.set(\r\n        mapId,\r\n        this.vmList.map((v) => {\r\n          return { value: v.id, label: v.displayName };\r\n        }),\r\n      );\r\n    }\r\n\r\n    this.setupVMListener(vmGroup, mapId);\r\n\r\n    const yPositions: DropdownIF[] =\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((e, i) => ({\r\n        label: `${e?.shelfType === \"vmonly\" ? \"VM Only\" : this.titleCasePipe.transform(e?.shelfType)} ${e?.shelfNumber}`,\r\n        value: e?.shelfNumber ?? i + 1,\r\n      })) ?? [];\r\n\r\n    this.startYPositionList.push(yPositions);\r\n    this.endYPositionsList.push(yPositions);\r\n\r\n    this.onChangeStartY(this.vmArray.length - 1, vm?.startYPosition ?? 1);\r\n  }\r\n\r\n  setupVMListener(vmGroup: FormGroup, i: string) {\r\n    vmGroup\r\n      .get(\"vmType\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((vmType) => {\r\n        this.vmListMap.set(i, []);\r\n\r\n        if (vmType) {\r\n          this.vmListMap.set(\r\n            i,\r\n            this.vmList\r\n              .filter((v) => v.type === vmType)\r\n              .map((v) => {\r\n                return { value: v.id, label: v.displayName };\r\n              }),\r\n          );\r\n        } else {\r\n          this.vmListMap.set(\r\n            i,\r\n            this.vmList.map((v) => {\r\n              return { value: v.id, label: v.displayName };\r\n            }),\r\n          );\r\n        }\r\n\r\n        vmGroup.get(\"vmId\")?.reset();\r\n      });\r\n  }\r\n\r\n  onChangeStartY(i: number, event: any) {\r\n    const endY = this.endYPositionsList[i];\r\n\r\n    const newEndY: DropdownIF[] =\r\n      endY?.map((k) => {\r\n        return {\r\n          label: k.label,\r\n          value: k.value,\r\n          disabled: k.value < event,\r\n        };\r\n      }) ?? [];\r\n\r\n    this.endYPositionsList[i] = newEndY;\r\n\r\n    if (event > this.vmArray.controls[i].get(\"endYPosition\")?.value) {\r\n      this.vmArray.controls[i].get(\"endYPosition\")?.reset();\r\n    }\r\n  }\r\n\r\n  removeVM(index: number) {\r\n    this.vmArray.removeAt(index);\r\n    this.startYPositionList.splice(index, 1);\r\n    this.endYPositionsList.splice(index, 1);\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.vmArray?.controls.forEach((e, i) => {\r\n      let startShelf =\r\n        e?.value?.startYPosition ||\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ||\r\n        1;\r\n      let endShelf = e?.value?.endYPosition || startShelf;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.value?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.value?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = `${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"shelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 300;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) d.style.backgroundColor = this.shelfColors[0].bg;\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) d.style.backgroundColor = this.shelfColors[i].bg;\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            // div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              // d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            // d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Complete template\";\r\n    modelRef.componentInstance.description =\r\n      \"Template is now ready to assign it to the store but still you can come again any time and edit this template.\";\r\n    // modelRef.componentInstance.note = 'You can\\'t edit it once assigned to the template.';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async submitForm(data: { status: string; goBack: boolean }) {\r\n    const et = this.ps.fixtureTemplateErrorTabs;\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    if (this.fixtureVmForm.invalid || this.ps.fixtureTemplateErrorTabs.vms) {\r\n      this.fixtureVmForm.markAllAsTouched();\r\n      this.toast.getErrorToast(\"Form is invalid\");\r\n      return;\r\n    }\r\n\r\n    if (et.basicDetails || et.products || et.vms) return;\r\n\r\n    if (data.status === \"complete\")\r\n      if (!(await this.confirmCompletion())) return;\r\n\r\n    const payload: FixtureTemplateDetails = {\r\n      ...this.fixtureTemplateDetails,\r\n      fixtureName: this.fixtureTemplateDetails.fixtureName?.trim(),\r\n      // status: data.status,\r\n      vmConfig: this.vmArray.controls.map((e) => {\r\n        return e.value;\r\n      }),\r\n      isEdited: true,\r\n      updatedAt: new Date(Date.now()).toISOString(),\r\n    };\r\n\r\n    const result = await this.ps.submitFixtureTemplateDetails(\r\n      payload,\r\n      this.fixtureTemplateDetails._id!,\r\n    );\r\n\r\n    if (result) {\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        replaceUrl: true,\r\n        queryParams: { isEdit: false },\r\n        queryParamsHandling: \"merge\",\r\n      });\r\n      this.toast.getSuccessToast(\"Fixture template details updated.\");\r\n      // this.isViewportInitialized = false;\r\n      if (data.goBack) {\r\n        this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n      } else if (data.status === \"complete\") {\r\n        // this.router.navigate(\r\n        //   [\"/manage/planogram/fixture-template/assign-stores\"],\r\n        //   {\r\n        //     queryParamsHandling: \"preserve\",\r\n        //   }\r\n        // );\r\n      }\r\n    }\r\n  }\r\n\r\n  updateChangesToLocal() {\r\n    const payload: FixtureTemplateDetails = {\r\n      ...this.fixtureTemplateDetails,\r\n      vmConfig: this.vmArray.controls.map((e) => {\r\n        return e.value;\r\n      }),\r\n      ignoreUpdate: true,\r\n    };\r\n\r\n    this.ps.fixtureTemplateDetails.next(payload);\r\n    this.ps.fixtureTemplateErrorTabs.vms = this.fixtureVmForm.invalid;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.ps.fixtureTemplateDetails.next({\r\n      ...this.ps.fixtureTemplateDetails.value,\r\n      ignoreUpdate: false,\r\n    });\r\n  }\r\n}\r\n","<section id=\"fixture-template-vms\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <!--============================Left Column============================ -->\r\n    <div class=\"cols col\">\r\n      <h2>All visual merchandise from library</h2>\r\n      <p>Configure your VMs position and placements</p>\r\n      <form [formGroup]=\"fixtureVmForm\">\r\n        <div formArrayName=\"vmConfig\" class=\"array-wrapper\">\r\n          <div *ngFor=\"let vm of vmArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n            <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n              <h6 class=\"shelf-title\">VISUAL MERCHANDISE {{ i + 1 }}</h6>\r\n              <!-- *ngIf=\"i != 0\" -->\r\n              <svg (click)=\"removeVM(i)\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n                xmlns=\"http://www.w3.org/2000/svg\" class=\"cursor-pointer\" [class.disabled-click]=\"!isEditMode\">\r\n                <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\" />\r\n              </svg>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"vmTypeList\"\r\n                formControlName=\"vmType\" [search]=\"true\" [disabled]=\"looksMode\">\r\n              </lib-reactive-select>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"vmListMap.get('vm' + i) ?? []\"\r\n                formControlName=\"vmId\" [search]=\"true\" [prefix]=\"true\" [disabled]=\"looksMode\">\r\n              </lib-reactive-select>\r\n\r\n              <ng-container *ngIf=\"vm.get('vmId')?.touched && vm.get('vmId')?.errors\">\r\n                <small *ngIf=\"vm.get('vmId')?.hasError('required')\" class=\"text-danger\"> Select a VM </small>\r\n              </ng-container>\r\n            </div>\r\n\r\n            <div *ngIf=\"getSelectedVM(vm) as selectedVM\" class=\"vm-preview\">\r\n              <div class=\"d-flex gap-3\">\r\n                <div class=\"preview\">\r\n                  <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM.imgUrl\" alt=\"Vm Image\" />\r\n\r\n                  <ng-template #placeholder>\r\n                    <div class=\"vm-placeholder\">\r\n                      <h3>{{ selectedVM?.name }}</h3>\r\n                      <div class=\"badge inactive\">{{ selectedVM?.height }}*{{ selectedVM?.height }}</div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n                <div style=\"overflow: hidden\">\r\n                  <h3 class=\"ellipsis cursor-pointer\" [ngbTooltip]=\"selectedVM?.name\">{{ selectedVM?.name }}</h3>\r\n                  <p>Can be found in the fixture with the size of {{ selectedVM?.height }}*{{ selectedVM?.height }}mm\r\n                  </p>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"d-flex gap-4 mb-4\">\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"startYPosition\" class=\"form-label mb-1\">Placement start</label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"startYPositionList[i]\"\r\n                  formControlName=\"startYPosition\" (ngModelChange)=\"onChangeStartY(i, $event)\">\r\n                </lib-reactive-select>\r\n                <ng-container *ngIf=\"vm.get('startYPosition')?.touched && vm.get('startYPosition')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"vm.get('startYPosition')?.hasError('required')\"> Please select start\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"endYPosition\" class=\"form-label mb-1\">Placement end</label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"endYPositionsList[i]\"\r\n                  formControlName=\"endYPosition\">\r\n                </lib-reactive-select>\r\n                <ng-container *ngIf=\"vm.get('endYPosition')?.touched && vm.get('endYPosition')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"vm.get('endYPosition')?.hasError('required')\"> Please select end\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"d-flex gap-4 mb-4\">\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"yZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n                  Vertical zone\r\n                  <svg width=\"18px\" height=\"18px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    transform=\"rotate(90)\">\r\n                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                      stroke-width=\"1.9200000000000004\"></g>\r\n                    <g id=\"SVGRepo_iconCarrier\">\r\n                      <path d=\"M5 12L19 12\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M16 16L20 12L16 8\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\"\r\n                        stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M8 8L4 12L8 16\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                    </g>\r\n                  </svg>\r\n                </label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"yZonesList\"\r\n                  formControlName=\"yZone\">\r\n                </lib-reactive-select>\r\n              </div>\r\n              <div class=\"form-group w-100\">\r\n                <label for=\"xZone\" class=\"form-label mb-1 d-flex text-nowrap align-items-center\">\r\n                  Horizontal zone\r\n                  <svg width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    transform=\"rotate(0)\">\r\n                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                      stroke-width=\"1.9200000000000004\"></g>\r\n                    <g id=\"SVGRepo_iconCarrier\">\r\n                      <path d=\"M5 12L19 12\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M16 16L20 12L16 8\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\"\r\n                        stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                      <path d=\"M8 8L4 12L8 16\" stroke=\"#344054\" stroke-width=\"1.6799999999999997\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"></path>\r\n                    </g>\r\n                  </svg>\r\n                </label>\r\n                <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"xZonesList\"\r\n                  formControlName=\"xZone\">\r\n                </lib-reactive-select>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"form-group mb-4\">\r\n              <label for=\"position\" class=\"form-label mb-1\">Position</label>\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"positionsList\"\r\n                formControlName=\"position\">\r\n              </lib-reactive-select>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n          <button [disabled]=\"!isEditMode\" class=\"btn btn-outline text-end\" (click)=\"addVM()\">Add visual\r\n            Merchandise</button>\r\n        </div>\r\n      </form>\r\n    </div>\r\n\r\n    <!--============================Right Column=========================== -->\r\n    <div class=\"cols col-8\">\r\n      <div class=\"d-flex justify-content-center\">\r\n        <!-- Vertical arrows -->\r\n        <div class=\"vertical-dimension\">\r\n          <div class=\"arrow up\"></div>\r\n          <div class=\"line\">\r\n            <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n          </div>\r\n          <div class=\"arrow down\"></div>\r\n        </div>\r\n\r\n        <div>\r\n          <!-- Horizontal arrows -->\r\n          <ng-container *ngTemplateOutlet=\"\r\n              dimensionArrows;\r\n              context: {\r\n                value: fixtureTemplateDetails?.fixtureWidth?.value\r\n              }\r\n            \"></ng-container>\r\n\r\n          <div id=\"vm-products\" class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div id=\"header-block\" class=\"header-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block\" class=\"body-block\">\r\n              <!----------------------------------[VM BLOCK]--------------------------------------->\r\n              <ng-container *ngFor=\"let vm of vmArray?.controls; let i = index\">\r\n                <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                  <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n                    <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n                    <ng-template #placeholder>\r\n                      <div class=\"vm-placeholder\">\r\n                        <h3>{{ selectedVM?.name }}</h3>\r\n                      </div>\r\n                    </ng-template>\r\n                  </ng-container>\r\n                </div>\r\n              </ng-container>\r\n\r\n              <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n              <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n                  [ngbTooltip]=\"brandCategoryTooltip\">\r\n                  <span class=\"brand\">\r\n                    <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                      <span class=\"badge draft me-1\">\r\n                        {{ b }}\r\n                      </span>\r\n                    </ng-container>\r\n                  </span>\r\n                  <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                    <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                      {{ c }}\r\n                      <ng-container *ngIf=\"!last\">, </ng-container>\r\n                    </ng-container>\r\n                  </span>\r\n                </div>\r\n                <ng-template #brandCategoryTooltip>\r\n                  <div>\r\n                    <p>\r\n                      <b>Brands: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                    <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                      <b>Categories: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                  </div>\r\n                </ng-template>\r\n              </div>\r\n              <!------------------------------------------------------------------------->\r\n\r\n              <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n              <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                @for (item of sectionByZones; track $index) {\r\n                  <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"badge draft me-1\">\r\n                      {{ item.zone }}\r\n                    </span>\r\n                    <div class=\"w-100 d-flex justify-content-center\">\r\n                      <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                      <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                      <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                    </div>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                      <p *ngIf=\"item?.section?.categories?.length\">\r\n                        <b>Categories: </b>\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                }\r\n              </div>\r\n              <!------------------------------------------------------------------------->\r\n\r\n              <div [id]=\"'shelfContainer' + i\" class=\"shelfContainer\"\r\n                *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                  <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                      <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                    <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                    <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                      <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                  </div>\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                      <p *ngIf=\"item.productCategory?.length\">\r\n                        <b>Categories: </b>\r\n                        <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                @if(item.shelfType ==='tray'){\r\n                  <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                  </div>\r\n                }@else {\r\n                  <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                    [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n              *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n              <div class=\"sub-footer left-box\"></div>\r\n              <div class=\"sub-footer right-box\"></div>\r\n              <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div style=\"width: 200px\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-vms-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  OnDestroy,\r\n  OnInit,\r\n} from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { lastValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport { rgbToHex } from \"../../../functions/plano.function\";\r\nimport { VmLibraryList } from \"../../../interfaces/vm-library.interface\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { CompleteConfirmationComponent } from \"../../popups/complete-confirmation/complete-confirmation.component\";\r\nimport {\r\n  FixtureTemplateDetails,\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { DeleteConfirmationComponent } from \"../../popups/delete-confirmation/delete-confirmation.component\";\r\nimport { CannotPerformComponent } from \"../../popups/cannot-perform/cannot-perform.component\";\r\n\r\n@Component({\r\n  selector: \"lib-template-summary\",\r\n  templateUrl: \"./template-summary.component.html\",\r\n  styleUrl: \"./template-summary.component.scss\",\r\n})\r\nexport class TemplateSummaryComponent\r\n  implements OnInit, AfterViewChecked, OnDestroy\r\n{\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  clientId: string;\r\n\r\n  selectedSummaryTab: string = \"fixtureDetails\";\r\n\r\n  vmList: VmLibraryList[] = [];\r\n  isPageLoading: boolean = true;\r\n\r\n  // showVMs: boolean = true;\r\n  // showProductSpots: boolean = false;\r\n  // showBrandCategory: boolean = false;\r\n\r\n  imgCDN: string;\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n  fixtureTemplatesList: any = [];\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n  loading: boolean = true;\r\n  viewMode: \"list\" | \"tree\" = \"list\";\r\n  searchTerm: string = \"\";\r\n\r\n  templateVersions: any[] = [];\r\n  selectedVersionId: string;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private ps: PlanoDataService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private toast: ToastService,\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private pageInfo: PageInfoService,\r\n    private cd: ChangeDetectorRef,\r\n    private route: ActivatedRoute,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        await this.getVmsList();\r\n\r\n        this.ps.fixtureTemplateDetails\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((data) => {\r\n            this.fixtureTemplateDetails = data;\r\n\r\n            if (this.fixtureTemplateDetails?._id) {\r\n              this.getVariantList();\r\n              this.getVersionsList(this.fixtureTemplateDetails?._id);\r\n            }\r\n          });\r\n\r\n        this.isPageLoading = false;\r\n\r\n        this.ps.fixtureTemplateForm$\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((data) => this.submitForm(data));\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Summary\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  async getVmsList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: \"\",\r\n      sortBy: 1,\r\n      searchValue: \"\",\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: [],\r\n      },\r\n      export: false,\r\n      emptyDownload: false,\r\n    };\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getVmLibraryList(payload),\r\n      );\r\n      if (res?.status === \"success\") {\r\n        this.vmList = res?.data?.data.map((item: any) => {\r\n          return {\r\n            id: item._id,\r\n            name: item.vmName,\r\n            displayName:\r\n              item.vmName + (item?.vmType ? ` ( ${item.vmType} ) ` : \"\"),\r\n            brand: item.vmBrand,\r\n            type: item.vmType,\r\n            width: item.vmWidth.value,\r\n            height: item.vmHeight.value,\r\n            placement: item.isDoubleSided,\r\n            noOfAssigned: item.templateCount,\r\n            status: item.status,\r\n            ...(item.vmImageUrl\r\n              ? { imgUrl: `${this.imgCDN}${item.vmImageUrl}` }\r\n              : {}),\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n    } finally {\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  // onChangeVmVisibility() {\r\n  //   if (this.showVMs) {\r\n  //     setTimeout(() => this.handleVmPositionAndSize(), 0);\r\n  //   } else {\r\n  //     setTimeout(() => this.applyShelfColors(), 0);\r\n  //   }\r\n  // }\r\n\r\n  onChangeBrandAndCategoryVisibility() {}\r\n\r\n  getSelectedVM(vm: any) {\r\n    return this.vmList.find((v) => v.id === vm?.vmId);\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    // if (!this.showVMs) return true;\r\n\r\n    const viewPort = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e, i) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 300;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) d.style.backgroundColor = this.shelfColors[0].bg;\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) d.style.backgroundColor = this.shelfColors[i].bg;\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            // if (this.showVMs) return false;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) d.style.backgroundColor = this.shelfColors[0].bg;\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) d.style.backgroundColor = this.shelfColors[0].bg;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Complete template\";\r\n    modelRef.componentInstance.description =\r\n      \"Template is now ready to assign it to the store but still you can come again any time and edit this template.\";\r\n    // modelRef.componentInstance.note = 'You can\\'t edit it once assigned to the template.';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async submitForm(data: { status: string; goBack: boolean }) {\r\n    const et = this.ps.fixtureTemplateErrorTabs;\r\n    const template = this.ps.fixtureTemplateDetails.value;\r\n    if (!template) return;\r\n\r\n    if (et.basicDetails || et.products || et.vms) return;\r\n\r\n    if (data.status === \"complete\")\r\n      if (!(await this.confirmCompletion())) return;\r\n\r\n    const payload: FixtureTemplateDetails = {\r\n      ...template,\r\n      fixtureName: template.fixtureName?.trim(),\r\n      // status: data.status,\r\n      isEdited: true,\r\n      updatedAt: new Date(Date.now()).toISOString(),\r\n    };\r\n\r\n    const result = await this.ps.submitFixtureTemplateDetails(\r\n      payload,\r\n      template._id!,\r\n    );\r\n\r\n    if (result) {\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        replaceUrl: true,\r\n        queryParams: { isEdit: false },\r\n        queryParamsHandling: \"merge\",\r\n      });\r\n      this.toast.getSuccessToast(\"Fixture template details updated.\");\r\n      if (data.goBack) {\r\n        this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n      } else if (data.status === \"complete\") {\r\n        // this.router.navigate(\r\n        //   [\"/manage/planogram/fixture-template/assign-stores\"],\r\n        //   {\r\n        //     queryParamsHandling: \"preserve\",\r\n        //   }\r\n        // );\r\n      }\r\n    }\r\n  }\r\n\r\n  getVariantList() {\r\n    this.fixtureTemplatesList = [];\r\n    this.loading = true;\r\n\r\n    let payload = {\r\n      masterTemplateId: this.fixtureTemplateDetails?._id,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      clientId: this.clientId,\r\n      searchValue: this.searchTerm,\r\n    };\r\n\r\n    this.storeBuilderService.getTemplateChildList(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.loading = false;\r\n        if (res?.status === \"success\") {\r\n          this.totalItems = res?.data?.count;\r\n          this.fixtureTemplatesList = res?.data?.data;\r\n          this.paginationSizes =\r\n            this.totalItems < 10 ? [this.totalItems] : [10, 20, 30];\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.loading = false;\r\n        console.log(\"@@ getFixtureTemplatesList [ERR]: \", err);\r\n      },\r\n    });\r\n\r\n    this.totalItems = this.fixtureTemplatesList.length;\r\n  }\r\n\r\n  getVersionsList(templateId: string) {\r\n    this.storeBuilderService.getTemplateVersionList(templateId).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.data) {\r\n          this.templateVersions = res.data;\r\n          if (this.templateVersions.length >= 1) {\r\n            this.selectedVersionId = this.templateVersions[0]._id;\r\n          }\r\n        }\r\n      },\r\n      error: (err: any) => {\r\n        console.log(\"@@ getVersionsList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n\r\n  onSelectVersion(version: any) {\r\n    this.selectedVersionId = version._id;\r\n    this.fixtureTemplateDetails = version.data;\r\n\r\n    setTimeout(() => this.applyShelfColors(), 0);\r\n    setTimeout(() => this.handleVmPositionAndSize(), 0);\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.getVariantList();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.getVariantList();\r\n  }\r\n\r\n  onDuplicate(fixtureId: string) {\r\n    this.storeBuilderService\r\n      .duplicateFixtureTemplate({ templateId: fixtureId })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.getVariantList();\r\n            this.toast.getSuccessToast(res.data.message);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to duplicate Template\",\r\n          );\r\n          console.log(\"@@ ~ duplicateFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Delete fixture template\";\r\n    modelRef.componentInstance.description =\r\n      \"Are you sure you want to delete this Template?\";\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async onDelete(fixtureId: string, usageCount: number = 0) {\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Can’t delete Fixture template!`;\r\n      modelRef.componentInstance.description = `Since this template is live in \"${usageCount} planograms,\" deleting is not allowed.`;\r\n      return;\r\n    }\r\n\r\n    if (!(await this.confirmDeletion())) return;\r\n    this.storeBuilderService\r\n      .deleteFixtureTemplate({ templateId: fixtureId })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.getVariantList();\r\n            this.toast.getSuccessToast(res.message);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to delete Template\",\r\n          );\r\n          console.log(\"@@ ~ deleteFixtureTemplate [err]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  sortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getVariantList();\r\n  }\r\n\r\n  toggleViewMode(mode: \"list\" | \"tree\") {\r\n    this.viewMode = mode;\r\n    if (mode == \"list\") {\r\n      this.getVariantList();\r\n    }\r\n\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { view: mode },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.getVariantList();\r\n  }\r\n\r\n  onEdit(fixtureId: string) {\r\n    this.router.navigate([\"/manage/planogram/fixture-template/basic-details\"], {\r\n      queryParams: { templateId: fixtureId, isEdit: true },\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"content-wrapper\" id=\"template-summary\" *ngIf=\"!isPageLoading\">\r\n  <!-- ===============Header Info Cards=================== -->\r\n  <div id=\"header\" class=\"row mx-0 my-5 gap-3 mb-7\">\r\n    <div class=\"col filter-tab\">\r\n      <h3>{{ fixtureTemplateDetails?.fixtureType | titlecase }} fixture</h3>\r\n      <p>Type</p>\r\n    </div>\r\n    <div class=\"col filter-tab\">\r\n      <h3>{{ fixtureTemplateDetails?.shelfConfig?.length }}</h3>\r\n      <p>No of Shelves</p>\r\n    </div>\r\n    <div class=\"col filter-tab\">\r\n      <h3>{{ fixtureTemplateDetails?.fixtureCapacity }}</h3>\r\n      <p>Product Capacity</p>\r\n    </div>\r\n    <div class=\"col filter-tab\">\r\n      <h3>{{ fixtureTemplateDetails?.variantCount ?? 0 }}</h3>\r\n      <p>Variants</p>\r\n    </div>\r\n  </div>\r\n\r\n  @if(fixtureTemplateDetails?.templateType !== 'master'){\r\n    <div class=\"ms-3 mb-7\">\r\n      <h4>All versions</h4>\r\n      <span>Showing all the updated versions over the time.</span>\r\n    </div>\r\n  }\r\n\r\n  <div class=\"d-flex gap-5\">\r\n    <!-- <div class=\"d-flex flex-column gap-2 position-absolute\">\r\n      <div class=\"form-check form-switch\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [checked]=\"showProductSpots\"\r\n          [(ngModel)]=\"showProductSpots\"\r\n          [ngModelOptions]=\"{ standalone: true }\"\r\n          type=\"checkbox\"\r\n          id=\"showProductSpots\"\r\n        />\r\n        <label class=\"form-check-label sub ms-2\" for=\"showProductSpots\">Show Product Spots</label>\r\n      </div>\r\n      <div class=\"form-check form-switch\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [checked]=\"showVMs\"\r\n          [(ngModel)]=\"showVMs\"\r\n          (ngModelChange)=\"onChangeVmVisibility()\"\r\n          [ngModelOptions]=\"{ standalone: true }\"\r\n          type=\"checkbox\"\r\n          id=\"showVMs\"\r\n        />\r\n        <label class=\"form-check-label sub ms-2\" for=\"showVMs\">Show VMs</label>\r\n      </div>\r\n      <div class=\"form-check form-switch\">\r\n        <input\r\n          class=\"form-check-input\"\r\n          [checked]=\"showBrandCategory\"\r\n          [(ngModel)]=\"showBrandCategory\"\r\n          (ngModelChange)=\"onChangeBrandAndCategoryVisibility()\"\r\n          [ngModelOptions]=\"{ standalone: true }\"\r\n          type=\"checkbox\"\r\n          id=\"showBrandCategory\"\r\n        />\r\n        <label class=\"form-check-label sub ms-2\" for=\"showBrandCategory\">Show Brands & Categories</label>\r\n      </div>\r\n    </div> -->\r\n\r\n    @if(fixtureTemplateDetails?.templateType !== 'master'){\r\n      <div class=\"version-block\">\r\n        @if(templateVersions.length){ @for (version of templateVersions; track $index; let first = $first) {\r\n            <div class=\"version-tile\" [class.active]=\"this.selectedVersionId === version._id\"\r\n              (click)=\"onSelectVersion(version)\">\r\n              <p>Last updated: {{ version.updatedAt | date : \"medium\" }}</p>\r\n              @if(first){\r\n                <div class=\"badge active\">Active</div>\r\n              }\r\n            </div>\r\n          } }@else {\r\n          <div class=\"no-version-block\">\r\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <path\r\n                d=\"M8.94922 21.1997C8.64792 21.2315 8.34121 21.2505 8.03027 21.2505C7.86075 21.2505 7.69345 21.2436 7.52832 21.2339V31.6069C7.52832 33.0349 8.7113 34.226 10.1992 34.2261H29.8037C31.2917 34.2261 32.4746 33.035 32.4746 31.6069V21.2349C32.3127 21.2441 32.1488 21.2505 31.9844 21.2505C31.6704 21.2505 31.3598 21.2325 31.0537 21.1997V28.9878H8.94922V21.1997ZM30.9307 5.77393H9.07227C8.8949 5.77393 8.73964 5.86671 8.66211 5.98779L8.66016 5.98975L5.15039 11.4731L5.05566 11.6206C3.83012 13.7404 5.09473 16.4674 7.44629 16.7769C7.64721 16.8013 7.83696 16.8159 8.02441 16.8159C9.25449 16.8159 10.3424 16.2872 11.0996 15.4653L12.0215 14.4644L12.9404 15.4683C13.6894 16.2863 14.7761 16.8159 16.0137 16.8159C17.2457 16.8158 18.3376 16.2856 19.0859 15.4683L20.0078 14.4614L20.9297 15.4683C21.6781 16.2857 22.7697 16.8159 24.002 16.8159C25.2342 16.8159 26.3258 16.2857 27.0742 15.4683L27.9961 14.4614L28.918 15.4683C29.6664 16.2857 30.759 16.8159 31.9912 16.8159C32.1726 16.8159 32.3677 16.8021 32.5674 16.7778H32.5664C34.9602 16.4573 36.2283 13.6078 34.8604 11.4731L34.8594 11.4741L31.3428 5.99072L31.3418 5.98779C31.2644 5.86652 31.1082 5.77393 30.9307 5.77393Z\"\r\n                stroke=\"#00A3FF\" stroke-width=\"2.5\" />\r\n            </svg>\r\n\r\n            <span>No versions history available </span>\r\n          </div>\r\n        }\r\n      </div>\r\n    }\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n      <!-- Header block -->\r\n      <div class=\"header-block\"\r\n        *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n        <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n      </div>\r\n\r\n      <!-- Body block -->\r\n      <div id=\"body-block-sum\" class=\"body-block\">\r\n        <!----------------------------------[VM BLOCK]--------------------------------------->\r\n        <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n          <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n            <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n              <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n                <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\" alt=\"Vm Image\" />\r\n                <ng-template #placeholder>\r\n                  <div class=\"vm-placeholder\">\r\n                    <h3>{{ selectedVM?.name }}</h3>\r\n                  </div>\r\n                </ng-template>\r\n              </ng-container>\r\n            </div>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n        <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n          <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n            [ngbTooltip]=\"brandCategoryTooltip\">\r\n            <span class=\"brand\">\r\n              <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                <span class=\"badge draft me-1\">\r\n                  {{ b }}\r\n                </span>\r\n              </ng-container>\r\n            </span>\r\n            <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n              <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                {{ c }}\r\n                <ng-container *ngIf=\"!last\">, </ng-container>\r\n              </ng-container>\r\n            </span>\r\n          </div>\r\n          <ng-template #brandCategoryTooltip>\r\n            <div>\r\n              <p>\r\n                <b>Brands: </b>\r\n                <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                  {{ c }}\r\n                  <ng-container *ngIf=\"!last\">, </ng-container>\r\n                </ng-container>\r\n              </p>\r\n              <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                <b>Categories: </b>\r\n                <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                  {{ c }}\r\n                  <ng-container *ngIf=\"!last\">, </ng-container>\r\n                </ng-container>\r\n              </p>\r\n            </div>\r\n          </ng-template>\r\n        </div>\r\n        <!------------------------------------------------------------------------->\r\n\r\n        <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n        <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n          <!-- <div id=\"body-loader\">\r\n            <div class=\"loader\"></div>\r\n          </div> -->\r\n          @for (item of sectionByZones; track $index) {\r\n            <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n              <span class=\"badge draft me-1\">\r\n                {{ item.zone }}\r\n              </span>\r\n              <div class=\"w-100 d-flex justify-content-center\">\r\n                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                  @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                    {{ b }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  }\r\n                </span>\r\n                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                  @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                    {{ c }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  }\r\n                </span>\r\n              </div>\r\n            </div>\r\n\r\n            <ng-template #brandCategoryTooltip>\r\n              <div>\r\n                <p>\r\n                  <b>Brands: </b>\r\n                  @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                    {{ b }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  }\r\n                </p>\r\n                <p *ngIf=\"item?.section?.categories?.length\">\r\n                  <b>Categories: </b>\r\n                  @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                    {{ c }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  }\r\n                </p>\r\n              </div>\r\n            </ng-template>\r\n          }\r\n        </div>\r\n        <!------------------------------------------------------------------------->\r\n\r\n        <div [id]=\"'sumShelfContainer' + i\" class=\"shelfContainer\"\r\n          *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n          <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n          <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n            <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n              [ngbTooltip]=\"brandCategoryTooltip\">\r\n              <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                  {{ b }}\r\n                  <ng-container *ngIf=\"!last\">, </ng-container>\r\n                </ng-container>\r\n              </span>\r\n              <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n              <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                  {{ b }}\r\n                  <ng-container *ngIf=\"!last\">, </ng-container>\r\n                </ng-container>\r\n              </span>\r\n            </div>\r\n            <ng-template #brandCategoryTooltip>\r\n              <div>\r\n                <p>\r\n                  <b>Brands: </b>\r\n                  <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                    {{ c }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  </ng-container>\r\n                </p>\r\n                <p *ngIf=\"item.productCategory?.length\">\r\n                  <b>Categories: </b>\r\n                  <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                    {{ c }}\r\n                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                  </ng-container>\r\n                </p>\r\n              </div>\r\n            </ng-template>\r\n          </div>\r\n          <!------------------------------------------------------------------------->\r\n\r\n          @if(item.shelfType ==='tray'){\r\n            <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n              <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n              </div>\r\n            </div>\r\n          }@else {\r\n            <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n              [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n              <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n            </div>\r\n          }\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Footer block -->\r\n      <div class=\"footer-block\"\r\n        *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n        <div class=\"sub-footer left-box\"></div>\r\n        <div class=\"sub-footer right-box\"></div>\r\n        <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n      </div>\r\n    </div>\r\n    <div style=\"width: 200px\"></div>\r\n  </div>\r\n\r\n  <!-- ===============Footer Info Cards=================== -->\r\n  @if(fixtureTemplateDetails?.templateType === 'master'){\r\n    <div id=\"footer\" class=\"row mx-0 my-5 gap-2\">\r\n      <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n        <div>\r\n          <h4>All variants</h4>\r\n          <span>Showing all variants derived from this reference/master template.</span>\r\n        </div>\r\n\r\n        <div class=\"d-flex align-items-center gap-2\" *ngIf=\"fixtureTemplatesList.length || searchTerm\">\r\n          <div style=\"position: relative\" [ngClass]=\"{ 'd-none': viewMode === 'tree' }\">\r\n            <input type=\"text\" [(ngModel)]=\"searchTerm\" (change)=\"onSearch()\"\r\n              style=\"padding-left: 3rem; padding-right: 3rem\" class=\"form-control\" name=\"search\" autocomplete=\"off\"\r\n              placeholder=\"Search\" />\r\n\r\n            <span class=\"search-icon\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n                <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n              </svg>\r\n            </span>\r\n\r\n            <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\"\r\n              class=\"clear-search\">\r\n              <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n                <g id=\"SVGRepo_iconCarrier\">\r\n                  <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  </path>\r\n                  <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                  </path>\r\n                  <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"></circle>\r\n                </g>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          <div class=\"d-flex align-items-center gap-2\">\r\n            <div class=\"toggle-button me-1\" [ngClass]=\"{ selected: viewMode === 'list' }\"\r\n              (click)=\"toggleViewMode('list')\">\r\n              <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M6.24078 4.54639H15.8906M6.24078 9.00017H15.8906M6.24078 13.4539H15.8906M2.5293 4.54639H2.53672M2.5293 9.00017H2.53672M2.5293 13.4539H2.53672\"\r\n                  [attr.stroke]=\"viewMode === 'list' ? '#009BF3' : '#344054'\" stroke-width=\"1.48756\"\r\n                  stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </svg>\r\n            </div>\r\n\r\n            <div class=\"toggle-button\" [ngClass]=\"{ selected: viewMode === 'tree' }\" (click)=\"toggleViewMode('tree')\">\r\n              <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M9.92678 10.4845C7.43266 10.4845 6.61613 11.4866 6.3489 12.1472C7.14316 12.4887 7.69988 13.2755 7.69988 14.196C7.69988 14.7866 7.46527 15.353 7.04764 15.7706C6.63002 16.1882 6.0636 16.4228 5.47299 16.4228C4.88239 16.4228 4.31597 16.1882 3.89834 15.7706C3.48072 15.353 3.2461 14.7866 3.2461 14.196C3.2461 13.2235 3.86221 12.3996 4.7307 12.0953V5.9045C4.29573 5.75187 3.91908 5.4676 3.65304 5.09115C3.387 4.7147 3.24477 4.26476 3.2461 3.8038C3.2461 3.21319 3.48072 2.64677 3.89834 2.22915C4.31597 1.81152 4.88239 1.5769 5.47299 1.5769C6.0636 1.5769 6.63002 1.81152 7.04764 2.22915C7.46527 2.64677 7.69988 3.21319 7.69988 3.8038C7.69988 4.7762 7.08378 5.60015 6.21529 5.9045V9.83125C6.86851 9.34875 7.81865 8.99987 9.18448 8.99987C11.1664 8.99987 11.8271 8.0052 12.0423 7.34455C11.6362 7.17537 11.2892 6.88992 11.0449 6.52407C10.8005 6.15823 10.6698 5.72832 10.6691 5.28839C10.6691 4.69778 10.9037 4.13136 11.3213 3.71374C11.7389 3.29612 12.3054 3.0615 12.896 3.0615C13.4866 3.0615 14.053 3.29612 14.4706 3.71374C14.8882 4.13136 15.1229 4.69778 15.1229 5.28839C15.1229 6.28307 14.4696 7.14413 13.5715 7.41136C13.3785 8.47284 12.6584 10.4845 9.92678 10.4845ZM5.47299 13.4537C5.27612 13.4537 5.08732 13.5319 4.94811 13.6711C4.8089 13.8103 4.7307 13.9991 4.7307 14.196C4.7307 14.3928 4.8089 14.5816 4.94811 14.7208C5.08732 14.86 5.27612 14.9383 5.47299 14.9383C5.66986 14.9383 5.85867 14.86 5.99788 14.7208C6.13708 14.5816 6.21529 14.3928 6.21529 14.196C6.21529 13.9991 6.13708 13.8103 5.99788 13.6711C5.85867 13.5319 5.66986 13.4537 5.47299 13.4537ZM5.47299 3.0615C5.27612 3.0615 5.08732 3.1397 4.94811 3.27891C4.8089 3.41812 4.7307 3.60693 4.7307 3.8038C4.7307 4.00066 4.8089 4.18947 4.94811 4.32868C5.08732 4.46789 5.27612 4.54609 5.47299 4.54609C5.66986 4.54609 5.85867 4.46789 5.99788 4.32868C6.13708 4.18947 6.21529 4.00066 6.21529 3.8038C6.21529 3.60693 6.13708 3.41812 5.99788 3.27891C5.85867 3.1397 5.66986 3.0615 5.47299 3.0615ZM12.896 4.54609C12.6991 4.54609 12.5103 4.6243 12.3711 4.76351C12.2319 4.90271 12.1537 5.09152 12.1537 5.28839C12.1537 5.48526 12.2319 5.67406 12.3711 5.81327C12.5103 5.95248 12.6991 6.03069 12.896 6.03069C13.0928 6.03069 13.2816 5.95248 13.4208 5.81327C13.5601 5.67406 13.6383 5.48526 13.6383 5.28839C13.6383 5.09152 13.5601 4.90271 13.4208 4.76351C13.2816 4.6243 13.0928 4.54609 12.896 4.54609Z\"\r\n                  fill=\"#344054\" />\r\n              </svg>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div *ngIf=\"loading; else contentPart\">\r\n        <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <ng-template #contentPart>\r\n        <div *ngIf=\"!fixtureTemplatesList.length\">\r\n          <div class=\"row\">\r\n            <div class=\"col-lg-12 my-6\">\r\n              <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                  <rect x=\"7\" y=\"7.10938\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                  <rect x=\"7\" y=\"7.10938\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                  <path\r\n                    d=\"M48.6668 50.4427C43.0668 50.4427 41.2334 52.6927 40.6334 54.176C42.4168 54.9427 43.6668 56.7094 43.6668 58.776C43.6668 60.1021 43.14 61.3739 42.2023 62.3116C41.2646 63.2492 39.9929 63.776 38.6668 63.776C37.3407 63.776 36.0689 63.2492 35.1312 62.3116C34.1936 61.3739 33.6668 60.1021 33.6668 58.776C33.6668 56.5927 35.0501 54.7427 37.0001 54.0594V40.1594C36.0235 39.8167 35.1778 39.1784 34.5805 38.3332C33.9831 37.4879 33.6638 36.4777 33.6668 35.4427C33.6668 34.1166 34.1936 32.8448 35.1312 31.9072C36.0689 30.9695 37.3407 30.4427 38.6668 30.4427C39.9929 30.4427 41.2646 30.9695 42.2023 31.9072C43.14 32.8448 43.6668 34.1166 43.6668 35.4427C43.6668 37.626 42.2834 39.476 40.3334 40.1594V48.976C41.8001 47.8927 43.9334 47.1094 47.0001 47.1094C51.4501 47.1094 52.9334 44.876 53.4168 43.3927C52.505 43.0128 51.7258 42.3719 51.1772 41.5505C50.6286 40.7291 50.335 39.7638 50.3334 38.776C50.3334 37.4499 50.8602 36.1782 51.7979 35.2405C52.7356 34.3028 54.0074 33.776 55.3334 33.776C56.6595 33.776 57.9313 34.3028 58.869 35.2405C59.8067 36.1782 60.3334 37.4499 60.3334 38.776C60.3334 41.0094 58.8668 42.9427 56.8501 43.5427C56.4168 45.926 54.8001 50.4427 48.6668 50.4427ZM38.6668 57.1094C38.2247 57.1094 37.8008 57.2849 37.4883 57.5975C37.1757 57.9101 37.0001 58.334 37.0001 58.776C37.0001 59.218 37.1757 59.642 37.4883 59.9545C37.8008 60.2671 38.2247 60.4427 38.6668 60.4427C39.1088 60.4427 39.5327 60.2671 39.8453 59.9545C40.1578 59.642 40.3334 59.218 40.3334 58.776C40.3334 58.334 40.1578 57.9101 39.8453 57.5975C39.5327 57.2849 39.1088 57.1094 38.6668 57.1094ZM38.6668 33.776C38.2247 33.776 37.8008 33.9516 37.4883 34.2642C37.1757 34.5767 37.0001 35.0007 37.0001 35.4427C37.0001 35.8847 37.1757 36.3086 37.4883 36.6212C37.8008 36.9338 38.2247 37.1094 38.6668 37.1094C39.1088 37.1094 39.5327 36.9338 39.8453 36.6212C40.1578 36.3086 40.3334 35.8847 40.3334 35.4427C40.3334 35.0007 40.1578 34.5767 39.8453 34.2642C39.5327 33.9516 39.1088 33.776 38.6668 33.776ZM55.3334 37.1094C54.8914 37.1094 54.4675 37.2849 54.1549 37.5975C53.8424 37.9101 53.6668 38.334 53.6668 38.776C53.6668 39.218 53.8424 39.642 54.1549 39.9545C54.4675 40.2671 54.8914 40.4427 55.3334 40.4427C55.7755 40.4427 56.1994 40.2671 56.5119 39.9545C56.8245 39.642 57.0001 39.218 57.0001 38.776C57.0001 38.334 56.8245 37.9101 56.5119 37.5975C56.1994 37.2849 55.7755 37.1094 55.3334 37.1094Z\"\r\n                    fill=\"#009BF3\" />\r\n                </svg>\r\n                <div class=\"nodatamaintext mt-3\">No variants found</div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <div *ngIf=\"fixtureTemplatesList.length\">\r\n          <!-- Fixture Template list view -->\r\n          <section id=\"list-view\" *ngIf=\"viewMode === 'list'\">\r\n            <div class=\"table-responsive\">\r\n              <table class=\"w-100 table bottom-border text-nowrap\" *ngIf=\"fixtureTemplatesList.length\">\r\n                <thead>\r\n                  <tr>\r\n                    <th>\r\n                      <span (click)=\"sortTable('fixtureName')\" class=\"cursor-pointer\">\r\n                        Variant\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'fixtureName' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>\r\n                      <span (click)=\"sortTable('storeCount')\" class=\"cursor-pointer\">\r\n                        Assigned Stores\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'storeCount' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>\r\n                      <span (click)=\"sortTable('productBrandName')\" class=\"cursor-pointer\">\r\n                        Brand\r\n                        <i class=\"fa ms-1 mt-1\"\r\n                          [ngStyle]=\"{ color: sortedColumn === 'productBrandName' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'productBrandName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>\r\n                      <span (click)=\"sortTable('productCategory')\" class=\"cursor-pointer\">\r\n                        Product category\r\n                        <i class=\"fa ms-1 mt-1\"\r\n                          [ngStyle]=\"{ color: sortedColumn === 'productCategory' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'productCategory' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>\r\n                      <span (click)=\"sortTable('status')\" class=\"cursor-pointer\">\r\n                        Status\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'status' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'status' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>\r\n                      <span (click)=\"sortTable('updatedAt')\" class=\"cursor-pointer\">\r\n                        Last Update\r\n                        <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'status' ? '#009BF3' : '' }\"\r\n                          [ngClass]=\"sortOrder === 1 && sortedColumn === 'status' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                          aria-hidden=\"true\"></i>\r\n                      </span>\r\n                    </th>\r\n                    <th>Action</th>\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  <tr *ngFor=\"let childTemplate of fixtureTemplatesList\">\r\n                    <td>\r\n                      <div class=\"d-flex align-items-center\">\r\n                        <!-- <div class=\"thumbnail\"></div> -->\r\n                        <div>\r\n                          <a [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n                            [queryParams]=\"{ templateId: childTemplate._id, isEdit: false }\"\r\n                            class=\"text-decoration-underline\">\r\n                            {{ childTemplate.fixtureName }}\r\n                          </a>\r\n                        </div>\r\n                      </div>\r\n                    </td>\r\n                    <td>\r\n                      <div>\r\n                        <a [routerLink]=\"['/manage/planogram/fixture-template/basic-details']\"\r\n                          [queryParams]=\"{ templateId: childTemplate._id, isEdit: false }\"\r\n                          class=\"text-decoration-underline\">\r\n                          {{ childTemplate.storeCount }}\r\n                        </a>\r\n                      </div>\r\n                    </td>\r\n                    <td>\r\n                      <span *ngIf=\"childTemplate.productBrandName.length <= 0\"> - </span>\r\n\r\n                      <div [ngbTooltip]=\"brandTooltip\" class=\"cursor-pointer\">\r\n                        <div *ngFor=\"let b of childTemplate.productBrandName; let i = index\"\r\n                          class=\"badge inactive me-2\">\r\n                          <span *ngIf=\"i <= 2\"> {{ b }} </span>\r\n                          <span *ngIf=\"i === 3\"> +{{ childTemplate.productBrandName.length - 3 }} </span>\r\n                        </div>\r\n                      </div>\r\n\r\n                      <ng-template #brandTooltip>\r\n                        <ng-container *ngFor=\"let c of childTemplate.productBrandName; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </ng-template>\r\n                    </td>\r\n                    <td>\r\n                      <span *ngIf=\"childTemplate.productCategory.length <= 0\"> - </span>\r\n\r\n                      <div [ngbTooltip]=\"categoryTooltip\" class=\"cursor-pointer\">\r\n                        <div *ngFor=\"let item of childTemplate.productCategory; let i = index\"\r\n                          class=\"badge inactive me-2\">\r\n                          <span *ngIf=\"i <= 2\"> {{ item }} </span>\r\n                          <span *ngIf=\"i === 3\"> +{{ childTemplate.productCategory.length - 3 }} </span>\r\n                        </div>\r\n                      </div>\r\n\r\n                      <ng-template #categoryTooltip>\r\n                        <ng-container *ngFor=\"let c of childTemplate.productCategory; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </ng-template>\r\n                    </td>\r\n                    <td>\r\n                      <div class=\"badge\" [ngClass]=\"childTemplate.status\">{{ childTemplate.status | titlecase }}</div>\r\n                    </td>\r\n                    <td>\r\n                      <span [ngbTooltip]=\"childTemplate?.updatedAt | date : 'medium'\">\r\n                        {{ childTemplate?.updatedAt | date }}\r\n                      </span>\r\n                    </td>\r\n                    <td>\r\n                      <div class=\"dropdown\">\r\n                        <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                          <i class=\"bi bi-three-dots-vertical\"></i>\r\n                        </button>\r\n                        <ul class=\"dropdown-menu\">\r\n                          <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(childTemplate._id!)\">Edit</a></li>\r\n                          <li>\r\n                            <a class=\"dropdown-item cursor-pointer\"\r\n                              (click)=\"onDuplicate(childTemplate._id!)\">Duplicate</a>\r\n                          </li>\r\n                          <li>\r\n                            <a class=\"dropdown-item cursor-pointer\" [routerLink]=\"['/manage/planogram/findAndReplace']\"\r\n                              [queryParams]=\"{ selectedFixture: childTemplate._id }\">Find and replace</a>\r\n                          </li>\r\n                          <li>\r\n                            <a class=\"dropdown-item cursor-pointer text-danger\"\r\n                              (click)=\"onDelete(childTemplate._id!, childTemplate.storeCount)\">\r\n                              Delete\r\n                            </a>\r\n                          </li>\r\n                        </ul>\r\n                      </div>\r\n                    </td>\r\n                  </tr>\r\n                </tbody>\r\n              </table>\r\n              <lib-pagination *ngIf=\"fixtureTemplatesList.length\" [itemsPerPage]=\"limit\" [currentPage]=\"offset\"\r\n                [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\r\n                (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\">\r\n              </lib-pagination>\r\n            </div>\r\n          </section>\r\n\r\n          <!-- Fixture Template tree view -->\r\n          <section id=\"tree-view\" *ngIf=\"viewMode === 'tree'\">\r\n            <fixture-template-tree [masterFixtureData]=\"fixtureTemplateDetails\"\r\n              [viewMode]=\"'master'\"></fixture-template-tree>\r\n          </section>\r\n        </div>\r\n      </ng-template>\r\n    </div>\r\n  }\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>","import { CommonModule } from \"@angular/common\";\r\nimport {\r\n  AfterViewChecked,\r\n  Component,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  ChangeDetectorRef,\r\n} from \"@angular/core\";\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { debounceTime, filter, Subject, takeUntil } from \"rxjs\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport {\r\n  NgbAccordionModule,\r\n  NgbModal,\r\n  NgbTooltip,\r\n} from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport {\r\n  FixtureTemplateDetails,\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../interfaces/fixture-template.interface\";\r\nimport { DropdownIF } from \"../../../interfaces/plano-general.interface\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport { BrandDetails } from \"../../../interfaces/vm-library.interface\";\r\nimport { SHELF_COLORS } from \"../../../data/fixture-template.data\";\r\nimport {\r\n  generalValidator,\r\n  rgbToHex,\r\n  uniqueFieldInFormArrayValidator,\r\n} from \"../../../functions/plano.function\";\r\nimport { CompleteConfirmationComponent } from \"../../popups/complete-confirmation/complete-confirmation.component\";\r\nimport { MultiselectChipDropdownComponent } from \"../../multiselect-chip-dropdown/multiselect-chip-dropdown.component\";\r\n\r\n@Component({\r\n  selector: \"lib-template-products\",\r\n  templateUrl: \"./template-products.component.html\",\r\n  styleUrl: \"./template-products.component.scss\",\r\n  standalone: true,\r\n  imports: [\r\n    NgbTooltip,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    NgbAccordionModule,\r\n    MultiselectChipDropdownComponent,\r\n  ],\r\n})\r\nexport class TemplateProductsComponent\r\n  implements OnInit, OnDestroy, AfterViewChecked\r\n{\r\n  /**\r\n   * When embedded inside the Looks (Look Plano Collection) form, the labels\r\n   * use Looks-specific nomenclature: \"Product Merchandising\" instead of\r\n   * \"Add products by brand level\", \"Zone Label\" instead of \"Section label\",\r\n   * and \"Looks\" instead of \"Brand\". The standalone Fixture Template editor\r\n   * leaves this false and keeps the original wording.\r\n   */\r\n  @Input() looksMode = false;\r\n\r\n  clientId: string;\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  selectedLevel: \"fixture\" | \"section\" | \"shelf\" | \"spot\" | string = \"fixture\";\r\n\r\n  selectedLibrary: \"product\" | \"brand\" | string = \"brand\";\r\n\r\n  isPageLoading: boolean = true;\r\n  isEditMode: boolean = false;\r\n\r\n  brandsList: BrandDetails[] = [];\r\n  categoriesList: DropdownIF[] = [];\r\n  categoriesListMap: Map<string, DropdownIF[]> = new Map();\r\n\r\n  shelvesList: DropdownIF[];\r\n\r\n  fixtureLevelForm: FormGroup;\r\n  sectionLevelForm: FormGroup;\r\n  shelfLevelForm: FormGroup;\r\n  spotLevelForm: FormGroup;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  private isViewportInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private ps: PlanoDataService,\r\n    private toast: ToastService,\r\n    private gs: GlobalStateService,\r\n    private ngbModal: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        this.ps.brandsList\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((e) => (this.brandsList = e));\r\n\r\n        await this.ps.fetchBrandsList(this.clientId);\r\n\r\n        this.ps.fixtureTemplateDetails\r\n          .pipe(\r\n            takeUntil(this.destroy$),\r\n            filter((data) => !data?.ignoreUpdate),\r\n          )\r\n          .subscribe((data) => {\r\n            this.fixtureTemplateDetails = data;\r\n            setTimeout(() => this.addColorToShelves());\r\n            if (!this.isPageLoading) return;\r\n\r\n            this.shelvesList =\r\n              this.fixtureTemplateDetails?.shelfConfig?.map((e) => {\r\n                return {\r\n                  label: `${e?.shelfType?.toUpperCase()} ${e?.shelfNumber}`,\r\n                  value: `${e?.shelfType} ${e?.shelfNumber}`,\r\n                };\r\n              }) ?? [];\r\n\r\n            this.setTabByLevel();\r\n            this.initFixtureLevelForm();\r\n            this.initSectionLevelForm();\r\n            this.initShelfLevelForm();\r\n            this.initSpotLevelForm();\r\n            this.isPageLoading = false;\r\n            this.listenToAllFormChanges();\r\n          });\r\n\r\n        this.route.queryParamMap\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((params) => {\r\n            this.isEditMode = params.get(\"isEdit\") === \"true\";\r\n\r\n            if (this.isEditMode) {\r\n              this.fixtureLevelForm?.enable({ emitEvent: false });\r\n              this.sectionLevelForm?.enable({ emitEvent: false });\r\n              this.shelfLevelForm?.enable({ emitEvent: false });\r\n              this.spotLevelForm?.enable({ emitEvent: false });\r\n            } else {\r\n              this.fixtureLevelForm?.disable({ emitEvent: false });\r\n              this.sectionLevelForm?.disable({ emitEvent: false });\r\n              this.shelfLevelForm?.disable({ emitEvent: false });\r\n              this.spotLevelForm?.disable({ emitEvent: false });\r\n            }\r\n          });\r\n\r\n        this.ps.fixtureTemplateForm$\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((data) => this.submitForm(data));\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    // When embedded inside the Looks form (looksMode), don't override the parent page's breadcrumb/title.\r\n    if (this.looksMode) return;\r\n    this.pageInfo.setTitle(\"Products\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isViewportInitialized) {\r\n      this.isViewportInitialized = this.addColorToShelves();\r\n    }\r\n  }\r\n\r\n  private setTabByLevel() {\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\":\r\n        this.selectedLevel = \"fixture\";\r\n        break;\r\n      case \"L2\":\r\n        this.selectedLevel = \"shelf\";\r\n        break;\r\n      case \"L3\":\r\n        this.selectedLevel = \"section\";\r\n        break;\r\n      case \"L4\":\r\n        this.selectedLevel = \"spot\";\r\n        break;\r\n    }\r\n\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { level: this.selectedLevel },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  private getLevelByTab() {\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\":\r\n        return \"L1\";\r\n      case \"section\":\r\n        return \"L3\";\r\n      case \"shelf\":\r\n        return \"L2\";\r\n      case \"spot\":\r\n        return \"L4\";\r\n    }\r\n  }\r\n\r\n  initFixtureLevelForm() {\r\n    this.fixtureLevelForm = this.fb.group({\r\n      productBrandName: [this.fixtureTemplateDetails?.productBrandName],\r\n      productCategory: [this.fixtureTemplateDetails?.productCategory],\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.productBrandName?.forEach((e) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesList = [...this.categoriesList, ...categories];\r\n    });\r\n\r\n    this.fixtureLevelForm\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((v: string[]) => {\r\n        this.categoriesList = [];\r\n        v.forEach((e) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesList = [...this.categoriesList, ...categories];\r\n        });\r\n\r\n        const validCategoryIds = this.categoriesList?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          this.fixtureLevelForm?.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        this.fixtureLevelForm\r\n          ?.get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n      });\r\n\r\n    this.fixtureLevelForm?.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => setTimeout(() => this.addColorToShelves()));\r\n\r\n    if (!this.isEditMode) this.fixtureLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  initSectionLevelForm() {\r\n    this.sectionLevelForm = this.fb.group({\r\n      section: this.fb.array([], uniqueFieldInFormArrayValidator(\"zone\")),\r\n    });\r\n\r\n    const sectionGroupArray = this.groupShelvesByZone(\r\n      this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n    );\r\n\r\n    sectionGroupArray.forEach((s, i) => this.addSection(s, i));\r\n\r\n    if (sectionGroupArray.length === 0) {\r\n      this.addSection();\r\n    }\r\n\r\n    const allSectionShelves = sectionGroupArray\r\n      .map((se) => se?.shelves?.map((s) => s))\r\n      .flat();\r\n\r\n    this.shelvesList = this.shelvesList.map((item) => {\r\n      return {\r\n        ...item,\r\n        disabled: allSectionShelves?.includes(`${item?.value}`),\r\n      };\r\n    });\r\n\r\n    this.sectionArray.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((s: SectionConfig[]) => {\r\n        const allSectionShelves = s\r\n          .map((se) => se?.shelves?.map((s) => s))\r\n          .flat();\r\n        this.shelvesList = this.shelvesList.map((item) => {\r\n          return {\r\n            ...item,\r\n            disabled: allSectionShelves?.includes(`${item?.value}`),\r\n          };\r\n        });\r\n      });\r\n\r\n    if (!this.isEditMode) this.sectionLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  get isAllShelvesUsedInSections() {\r\n    return this.shelvesList.filter((s) => !s.disabled).length <= 0;\r\n  }\r\n\r\n  initShelfLevelForm() {\r\n    this.shelfLevelForm = this.fb.group({\r\n      shelf: this.fb.array([]),\r\n    });\r\n\r\n    this.fixtureTemplateDetails?.shelfConfig?.forEach((e, i) =>\r\n      this.addShelf(e, i),\r\n    );\r\n\r\n    if (!this.isEditMode) this.shelfLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  initSpotLevelForm() {\r\n    this.spotLevelForm = this.fb.group({\r\n      brand: [\"\", Validators.required],\r\n      productCategory: [\"\", Validators.required],\r\n    });\r\n\r\n    if (!this.isEditMode) this.spotLevelForm?.disable({ emitEvent: false });\r\n  }\r\n\r\n  setTab(tab: string) {\r\n    this.selectedLevel = tab;\r\n\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { level: this.selectedLevel },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n\r\n    setTimeout(() => this.addColorToShelves());\r\n    this.updateChangesToLocal();\r\n  }\r\n\r\n  get shelfArray(): FormArray {\r\n    return this.shelfLevelForm.get(\"shelf\") as FormArray;\r\n  }\r\n\r\n  get sectionArray(): FormArray {\r\n    return this.sectionLevelForm.get(\"section\") as FormArray;\r\n  }\r\n\r\n  addSection(\r\n    section?: SectionConfig,\r\n    i: number = this.sectionArray.controls.length,\r\n  ) {\r\n    const sectionGroup = this.fb.group({\r\n      zone: [section?.zone, [Validators.required, generalValidator()]],\r\n      shelves: [section?.shelves ?? [], Validators.required],\r\n      productBrandName: [section?.productBrandName],\r\n      productCategory: [section?.productCategory ?? \"\"],\r\n    });\r\n\r\n    this.sectionArray.push(sectionGroup);\r\n\r\n    const mapId = `section${i}`;\r\n    section?.productBrandName?.forEach((e: any) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesListMap.set(mapId, [\r\n        ...(this.categoriesListMap.get(mapId) ?? []),\r\n        ...categories,\r\n      ]);\r\n    });\r\n\r\n    this.setupSectionListener(sectionGroup, mapId);\r\n  }\r\n\r\n  addShelf(shelf: ShelfConfig, i: number) {\r\n    const shelfGroup = this.fb.group({\r\n      productBrandName: [shelf?.productBrandName],\r\n      productCategory: [shelf?.productCategory ?? \"\"],\r\n    });\r\n\r\n    this.shelfArray.push(shelfGroup);\r\n\r\n    const mapId = `shelf${i}`;\r\n    shelf?.productBrandName?.forEach((e: any) => {\r\n      const categories =\r\n        this.brandsList\r\n          .find((b) => b.brandName === e)\r\n          ?.category?.map((c) => {\r\n            return { label: c, value: c };\r\n          }) ?? [];\r\n      this.categoriesListMap.set(mapId, [\r\n        ...(this.categoriesListMap.get(mapId) ?? []),\r\n        ...categories,\r\n      ]);\r\n    });\r\n\r\n    this.setupShelfListener(shelfGroup, mapId);\r\n\r\n    setTimeout(() => this.addColorToShelves());\r\n  }\r\n\r\n  setupShelfListener(shelfGroup: FormGroup, i: string) {\r\n    shelfGroup\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((brands) => {\r\n        this.categoriesListMap.set(i, []);\r\n        brands.forEach((e: any) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesListMap.set(i, [\r\n            ...(this.categoriesListMap.get(i) ?? []),\r\n            ...categories,\r\n          ]);\r\n        });\r\n\r\n        // Reset category selection if previously selected categories are no longer valid\r\n        const validCategoryIds =\r\n          this.categoriesListMap?.get(i)?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          shelfGroup.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        shelfGroup\r\n          .get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    shelfGroup\r\n      .get(\"productCategory\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n  }\r\n\r\n  setupSectionListener(sectionGroup: FormGroup, i: string) {\r\n    sectionGroup\r\n      .get(\"productBrandName\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((brands) => {\r\n        this.categoriesListMap.set(i, []);\r\n        brands.forEach((e: any) => {\r\n          const categories =\r\n            this.brandsList\r\n              .find((b) => b.brandName === e)\r\n              ?.category?.map((c) => {\r\n                return { label: c, value: c };\r\n              }) ?? [];\r\n          this.categoriesListMap.set(i, [\r\n            ...(this.categoriesListMap.get(i) ?? []),\r\n            ...categories,\r\n          ]);\r\n        });\r\n\r\n        // Reset category selection if previously selected categories are no longer valid\r\n        const validCategoryIds =\r\n          this.categoriesListMap?.get(i)?.map((c) => c.value) ?? [];\r\n        const currentCatSelection =\r\n          sectionGroup.get(\"productCategory\")?.value || [];\r\n        const newCatSelection = currentCatSelection.filter((id: any) =>\r\n          validCategoryIds.includes(id),\r\n        );\r\n        sectionGroup\r\n          .get(\"productCategory\")\r\n          ?.setValue(newCatSelection, { emitEvent: false });\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"productCategory\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((c) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"shelves\")\r\n      ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n      .subscribe((s) => {\r\n        setTimeout(() => this.addColorToShelves());\r\n      });\r\n\r\n    sectionGroup\r\n      .get(\"zone\")\r\n      ?.valueChanges.pipe(debounceTime(300), takeUntil(this.destroy$))\r\n      .subscribe(() => this.addColorToShelves());\r\n  }\r\n\r\n  removeSection(index: number) {\r\n    if (!this.isEditMode) return;\r\n    this.sectionArray.removeAt(index);\r\n    setTimeout(() => this.addColorToShelves());\r\n  }\r\n\r\n  private getFormByLevel() {\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\":\r\n        return this.fixtureLevelForm;\r\n      case \"section\":\r\n        return this.sectionLevelForm;\r\n      case \"shelf\":\r\n        return this.shelfLevelForm;\r\n      case \"spot\":\r\n        return this.spotLevelForm;\r\n      default:\r\n        return this.fixtureLevelForm;\r\n    }\r\n  }\r\n\r\n  addColorToShelves(): boolean {\r\n    const level = document.getElementById(`${this.selectedLevel}-level`);\r\n    if (!level) return false;\r\n    const bodies = level.querySelector<HTMLElement>(\".body-block\");\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies.children) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => {\r\n        const last = div.lastElementChild;\r\n        return last && last.tagName.toLowerCase() === \"div\"\r\n          ? (last as HTMLElement)\r\n          : null;\r\n      })\r\n      .filter((d): d is HTMLElement => !!d);\r\n\r\n    if (!shelfDivs.length) {\r\n      setTimeout(() => this.addColorToShelves(), 100);\r\n      return false;\r\n    }\r\n\r\n    switch (this.selectedLevel) {\r\n      case \"section\": {\r\n        this.constructSequentialSection(shelfDivs);\r\n\r\n        const sectionArray =\r\n          (this.sectionLevelForm?.value?.section as SectionConfig[]) ?? [];\r\n        const allSectionShelves: string[] = [];\r\n\r\n        sectionArray.forEach((se, i) => {\r\n          const shelfIds =\r\n            se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ?? [];\r\n          allSectionShelves.push(...shelfIds);\r\n\r\n          const secDivs = shelfDivs.filter((item) =>\r\n            shelfIds.includes(item.id),\r\n          );\r\n          secDivs.forEach(\r\n            (d) => (d.style.backgroundColor = this.shelfColors[i].bg),\r\n          );\r\n        });\r\n\r\n        const unassignedShelves = shelfDivs.filter(\r\n          (item) => !allSectionShelves.includes(item.id),\r\n        );\r\n        unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n        const sectionBody = document.getElementById(\"section-body-block\");\r\n        if (sectionBody) {\r\n          let sectionGroupHeight = 0;\r\n\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = sectionBody.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n\r\n      case \"shelf\":\r\n        bodyChildren.forEach((div, i) => {\r\n          div.style.backgroundColor = this.shelfColors[i].bg;\r\n\r\n          const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n          if (bc) {\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX}px, ${bcY}px)`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"fixture\":\r\n      case \"spot\":\r\n      default:\r\n        shelfDivs.forEach(\r\n          (d) => (d.style.backgroundColor = this.shelfColors[0].bg),\r\n        );\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const shelfConfigs: ShelfConfig[] = this.applySectionConfigToShelves(\r\n      this.sectionLevelForm?.value?.section as SectionConfig[],\r\n    );\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of shelfConfigs) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  get isAllShelfAddToSection() {\r\n    return this.shelvesList.every((s) => s.disabled);\r\n\r\n  }\r\n\r\n  getPayloadByLevel(status: string): FixtureTemplateDetails | null {\r\n    const form = this.getFormByLevel();\r\n    const level = this.getLevelByTab();\r\n\r\n    if (\r\n      form.invalid ||\r\n      (this.selectedLevel === \"section\" && !this.isAllShelfAddToSection)\r\n    ) {\r\n      form.markAllAsTouched();\r\n\r\n      const errorMsg = form.invalid\r\n        ? \"Form is invalid\"\r\n        : \"Assign all shelves to a section\";\r\n\r\n      this.toast.getErrorToast(errorMsg);\r\n      return null;\r\n    }\r\n\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: [],\r\n              productCategory: [],\r\n            };\r\n          }) ?? [];\r\n\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          fixtureName: this.fixtureTemplateDetails?.fixtureName?.trim(),\r\n          // status: status,\r\n          isEdited: true,\r\n          shelfConfig: config,\r\n          productResolutionLevel: level,\r\n          productBrandName: [...form?.value.productBrandName],\r\n          productCategory: [...form?.value.productCategory],\r\n        };\r\n      }\r\n      case \"section\": {\r\n        const config: ShelfConfig[] = this.applySectionConfigToShelves(\r\n          this.sectionLevelForm?.value?.section as SectionConfig[],\r\n        );\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          fixtureName: this.fixtureTemplateDetails?.fixtureName?.trim(),\r\n          // status: status,\r\n          isEdited: true,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n      }\r\n      case \"shelf\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: form?.value?.shelf[i]?.productBrandName ?? [],\r\n              productCategory: form?.value?.shelf[i]?.productCategory ?? [],\r\n            };\r\n          }) ?? [];\r\n\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          fixtureName: this.fixtureTemplateDetails?.fixtureName?.trim(),\r\n          // status: status,\r\n          isEdited: true,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n      }\r\n      case \"spot\":\r\n      default:\r\n        return {\r\n          ...this.fixtureTemplateDetails!,\r\n          fixtureName: this.fixtureTemplateDetails?.fixtureName?.trim(),\r\n          // status: status,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          isEdited: true,\r\n        };\r\n    }\r\n  }\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Complete template\";\r\n    modelRef.componentInstance.description =\r\n      \"Template is now ready to assign it to the store but still you can come again any time and edit this template.\";\r\n    // modelRef.componentInstance.note = 'You can\\'t edit it once assigned to the template.';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async submitForm(data: { status: string; goBack: boolean }) {\r\n    const et = this.ps.fixtureTemplateErrorTabs;\r\n    if (!this.fixtureTemplateDetails) return;\r\n\r\n    const payload: FixtureTemplateDetails | null = this.getPayloadByLevel(\r\n      data.status,\r\n    );\r\n    if (!payload) return;\r\n\r\n    if (et.basicDetails || et.products || et.vms) return;\r\n\r\n    if (data.status === \"complete\")\r\n      if (!(await this.confirmCompletion())) return;\r\n\r\n    const result = await this.ps.submitFixtureTemplateDetails(\r\n      { ...payload, updatedAt: new Date(Date.now()).toISOString() },\r\n      this.fixtureTemplateDetails._id!,\r\n    );\r\n\r\n    if (result) {\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        replaceUrl: true,\r\n        queryParams: { isEdit: false },\r\n        queryParamsHandling: \"merge\",\r\n      });\r\n      this.toast.getSuccessToast(\"Fixture template details updated.\");\r\n      if (data.goBack) {\r\n        this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n      } else if (data.status === \"complete\") {\r\n        // this.router.navigate([\"/manage/planogram/fixture-template/assign-stores\"], {\r\n        //   queryParamsHandling: \"preserve\",\r\n        // });\r\n      }\r\n    }\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L3\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L3\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  private listenToAllFormChanges() {\r\n    this.updateChangesToLocal();\r\n\r\n    const formsToWatch = [\r\n      this.fixtureLevelForm,\r\n      this.sectionLevelForm,\r\n      this.shelfLevelForm,\r\n      this.spotLevelForm,\r\n    ];\r\n\r\n    formsToWatch.forEach((form) => {\r\n      if (!form) return;\r\n      if (this.ps.fixtureTemplateErrorTabs.products) form.markAllAsTouched();\r\n      form.valueChanges\r\n        .pipe(debounceTime(300), takeUntil(this.destroy$))\r\n        .subscribe(() => {\r\n          this.updateChangesToLocal();\r\n        });\r\n    });\r\n  }\r\n\r\n  updateChangesToLocal() {\r\n    const form = this.getFormByLevel();\r\n    const val = form.value;\r\n\r\n    let payload: FixtureTemplateDetails | null;\r\n\r\n    const level = this.getLevelByTab();\r\n\r\n    switch (this.selectedLevel) {\r\n      case \"fixture\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: [],\r\n              productCategory: [],\r\n            };\r\n          }) ?? [];\r\n\r\n        payload = {\r\n          ...this.fixtureTemplateDetails!,\r\n          shelfConfig: config,\r\n          productResolutionLevel: level,\r\n          productBrandName: [...val.productBrandName],\r\n          productCategory: [...val.productCategory],\r\n        };\r\n        break;\r\n      }\r\n      case \"section\": {\r\n        const config: ShelfConfig[] = this.applySectionConfigToShelves(\r\n          val.section as SectionConfig[],\r\n        );\r\n        payload = {\r\n          ...this.fixtureTemplateDetails!,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n        break;\r\n      }\r\n      case \"shelf\": {\r\n        const config: ShelfConfig[] =\r\n          this.fixtureTemplateDetails?.shelfConfig?.map((s, i) => {\r\n            return {\r\n              ...s,\r\n              zone: \"\",\r\n              productBrandName: val.shelf[i]?.productBrandName ?? [],\r\n              productCategory: val.shelf[i]?.productCategory ?? [],\r\n            };\r\n          }) ?? [];\r\n\r\n        payload = {\r\n          ...this.fixtureTemplateDetails!,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n          shelfConfig: config,\r\n        };\r\n        break;\r\n      }\r\n      case \"spot\":\r\n      default:\r\n        payload = {\r\n          ...this.fixtureTemplateDetails!,\r\n          productResolutionLevel: level,\r\n          productBrandName: [],\r\n          productCategory: [],\r\n        };\r\n        break;\r\n    }\r\n\r\n    this.ps.fixtureTemplateDetails.next({ ...payload, ignoreUpdate: true });\r\n\r\n    setTimeout(() => {\r\n      this.ps.fixtureTemplateErrorTabs.products =\r\n        form.invalid ||\r\n        (this.selectedLevel === \"section\" && !this.isAllShelfAddToSection);\r\n    });\r\n  }\r\n\r\n  cleanUpEmptySections() {\r\n    const shelfConfigs: ShelfConfig[] = this.applySectionConfigToShelves(\r\n      this.sectionLevelForm?.value?.section as SectionConfig[],\r\n    );\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of shelfConfigs) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs = [];\r\n        \r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.cleanUpEmptySections();\r\n    this.ps.fixtureTemplateDetails.next({\r\n      ...this.ps.fixtureTemplateDetails.value,\r\n      ignoreUpdate: false,\r\n    });\r\n  }\r\n}\r\n","<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n  <div class=\"row gap-4 builder\">\r\n    <!-- ====================================Left Column==================================== -->\r\n    <div class=\"cols col\">\r\n      <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode\">\r\n        <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n          <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n            (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n            {{ library | titlecase }} Library\r\n          </button>\r\n        </li>\r\n      </ul>\r\n\r\n      <div *ngIf=\"selectedLibrary === 'brand'\">\r\n        <div *ngIf=\"selectedLevel !== 'spot'\">\r\n          <h2>{{ looksMode ? 'Product Merchandising' : 'Add products by brand level' }}</h2>\r\n          <p>Place the product brand in the designated placement area.</p>\r\n        </div>\r\n        <!-- Fixture level within Brand Library  -->\r\n        <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n          <div class=\"form-group mb-4\">\r\n            <label for=\"productBrandName\" class=\"form-label mb-1\">{{ looksMode ? 'Looks' : 'Brand' }}</label>\r\n            <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n              [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n              [search]=\"true\" [disabled]=\"looksMode\"></multiselect-chip-dropdown>\r\n            <!-- <ng-container\r\n              *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n            >\r\n              <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n                Please select product brand\r\n              </small>\r\n            </ng-container> -->\r\n          </div>\r\n          <div class=\"form-group mb-4\" *ngIf=\"!looksMode\">\r\n            <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n            <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n              [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n              [search]=\"true\"></multiselect-chip-dropdown>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Section level within Brand Library -->\r\n        <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n          <div formArrayName=\"section\" class=\"array-wrapper\">\r\n            <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n              class=\"array-container\">\r\n              <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n              <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n                <svg [class.disabled-click]=\"!isEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n                  fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n                  <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"zone\" class=\"form-label mb-1\">{{ looksMode ? 'Zone Label' : 'Section label' }}</label>\r\n                <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" [readonly]=\"looksMode\" />\r\n\r\n                <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n                    required. </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n                    Section name cannot be only whitespace.\r\n                  </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n                    No leading or trailing whitespace allowed.\r\n                  </small>\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n                <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  formControlName=\"shelves\" [search]=\"true\" [disabled]=\"looksMode\"></multiselect-chip-dropdown>\r\n                <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n                  </small>\r\n                </ng-container>\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"productBrandName\" class=\"form-label mb-1\">{{ looksMode ? 'Looks' : 'Brand' }}</label>\r\n                <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n                  formControlName=\"productBrandName\" [search]=\"true\" [disabled]=\"looksMode\"></multiselect-chip-dropdown>\r\n                <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n                    Please select product brand\r\n                  </small>\r\n                </ng-container> -->\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\" *ngIf=\"!looksMode\">\r\n                <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n                <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n                  [search]=\"true\"></multiselect-chip-dropdown>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"w-100 d-flex justify-content-end mt-4\" *ngIf=\"!looksMode\">\r\n            <span [ngbTooltip]=\"\r\n                isAllShelvesUsedInSections\r\n                  ? 'All shelves are assigned. No shelves available for new sections.'\r\n                  : 'You cannot create more sections than the total shelves available.'\r\n              \" [disableTooltip]=\"\r\n                sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n              \">\r\n              <button [disabled]=\"\r\n                  sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n                \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n                Add section\r\n              </button>\r\n            </span>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Shelf level within Brand Library -->\r\n        <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n          <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n            <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n              <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n              <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n              <div class=\"form-group mb-4\">\r\n                <label for=\"productBrandName\" class=\"form-label mb-1\">{{ looksMode ? 'Looks' : 'Brand' }}</label>\r\n                <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n                  formControlName=\"productBrandName\" [search]=\"true\" [disabled]=\"looksMode\"></multiselect-chip-dropdown>\r\n                <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n                  <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n                    Please select product brand\r\n                  </small>\r\n                </ng-container> -->\r\n              </div>\r\n\r\n              <div class=\"form-group mb-4\" *ngIf=\"!looksMode\">\r\n                <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n                <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                  [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n                  [search]=\"true\"></multiselect-chip-dropdown>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </form>\r\n\r\n        <!-- Spot level within Brand Library -->\r\n        <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n        <div *ngIf=\"selectedLevel === 'spot'\"\r\n          class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n          <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n            <path\r\n              d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n          <p>This feature is not available yet.</p>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Coming soon for all levels -->\r\n      <div *ngIf=\"selectedLibrary === 'product'\"\r\n        class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n        <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n          <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n          <path\r\n            d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n        <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n        <p>This feature is not available yet. Start adding product from brand library</p>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- =======================================Right Column =======================================-->\r\n    <div class=\"cols col-8\">\r\n      <h6>Product brand placements</h6>\r\n\r\n      <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode\">\r\n        <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n          <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n            [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n            {{ level | titlecase }} level\r\n          </button>\r\n        </li>\r\n      </ul>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n        <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container *ngTemplateOutlet=\"\r\n                dimensionArrows;\r\n                context: {\r\n                  value: fixtureTemplateDetails?.fixtureWidth?.value\r\n                }\r\n              \"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div id=\"brand-category\" class=\"brand-category\"\r\n                  *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                  <span class=\"brand\">\r\n                    <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n                      <span class=\"badge draft me-1\">\r\n                        {{ b }}\r\n                      </span>\r\n                    </ng-container>\r\n                  </span>\r\n                  <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n                    <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n                      {{ c }}\r\n                      <ng-container *ngIf=\"!last\">, </ng-container>\r\n                    </ng-container>\r\n                  </span>\r\n                </div>\r\n\r\n                <ng-template #brandCategoryTooltip>\r\n                  <div>\r\n                    <p>\r\n                      <b>Brands: </b>\r\n                      <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                    <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n                      <b>Categories: </b>\r\n                      <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n                        {{ c }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </p>\r\n                  </div>\r\n                </ng-template>\r\n\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n        <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" id=\"section-body-block\">\r\n                <!---------------------------------------------------------------------->\r\n                <!-- <div id=\"body-loader\">\r\n                  <div class=\"loader\"></div>\r\n                </div> -->\r\n                <!---------------------------------------------------------------------->\r\n                @for (item of sectionByZones; track $index) {\r\n                  <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"badge draft me-1\">\r\n                      {{ item.zone }}\r\n                    </span>\r\n                    <div class=\"w-100 d-flex justify-content-center\">\r\n                      <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                      <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                      <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </span>\r\n                    </div>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                          {{ b }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                      <p *ngIf=\"item?.section?.categories?.length\">\r\n                        <b>Categories: </b>\r\n                        @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        }\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                }\r\n                <!---------------------------------------------------------------------->\r\n\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n                  So keep this block always at the bottom of this ngFor loop -->\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n        <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n          <!-- Vertical arrows -->\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <!-- Horizontal arrows -->\r\n            <ng-container\r\n              *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <!-- Header block -->\r\n              <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <!-- Body block -->\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\" class=\"shelfContainer\">\r\n                  <!---------------------------------------------------------------------->\r\n                  <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n                    *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n                      <ng-container\r\n                        *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                    <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n                    </span>\r\n                    <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n                      <ng-container\r\n                        *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n                        {{ b }}\r\n                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                      </ng-container>\r\n                    </span>\r\n                  </div>\r\n\r\n                  <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                      <p>\r\n                        <b>Brands: </b>\r\n                        <ng-container\r\n                          *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                      <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n                        <b>Categories: </b>\r\n                        <ng-container\r\n                          *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n                          {{ c }}\r\n                          <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                      </p>\r\n                    </div>\r\n                  </ng-template>\r\n                  <!---------------------------------------------------------------------->\r\n\r\n                  <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n                  So keep this block always at the bottom of this ngFor loop -->\r\n                  @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                      <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                      </div>\r\n                    </div>\r\n                  }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                      [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Footer block -->\r\n              <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n\r\n      <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n        <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n          style=\"height: 50vh\">\r\n          <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n            <path\r\n              d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n          <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n        </div>\r\n\r\n        <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div>\r\n            <ng-container\r\n              *ngTemplateOutlet=\"\r\n                dimensionArrows;\r\n                context: {\r\n                  value: fixtureTemplateDetails?.fixtureLength?.value\r\n                }\r\n              \"\r\n            ></ng-container>\r\n\r\n            <div class=\"wall-viewport\">\r\n              <div\r\n                class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n              >\r\n                <p>\r\n                  {{ fixtureTemplateDetails?.header?.label }}\r\n                </p>\r\n              </div>\r\n\r\n              <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n                <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                  @if(item.shelfType ==='shelf'){\r\n                  <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf  \">\r\n                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product  \"></div>\r\n                  </div>\r\n                  }@else {\r\n                  <div [id]=\"item.shelfType! + (i + 1)\" class=\"block  \">\r\n                    <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product  \"></div>\r\n                    </div>\r\n                  </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n\r\n              <div\r\n                class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n              >\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div> -->\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-plano-library',\r\n  templateUrl: './plano-library.component.html',\r\n  styleUrl: './plano-library.component.scss'\r\n})\r\nexport class PlanoLibraryComponent {\r\n}\r\n","<ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n  <li class=\"nav-item\" role=\"presentation\">\r\n    <a routerLink=\"/manage/planogram/library/fixtures\" routerLinkActive=\"active\" class=\"nav-link\" role=\"tab\"> Fixture Library </a>\r\n  </li>\r\n  <li class=\"nav-item\" role=\"presentation\">\r\n    <a routerLink=\"/manage/planogram/library/vms\" routerLinkActive=\"active\" class=\"nav-link\" role=\"tab\">\r\n      Visual Merchandise Library\r\n    </a>\r\n  </li>\r\n  <!-- <li class=\"nav-item\" role=\"presentation\">\r\n    <a routerLink=\"/manage/planogram/library/products\" routerLinkActive=\"active\" class=\"nav-link\" role=\"tab\"> Product Library </a>\r\n  </li> -->\r\n</ul>\r\n\r\n<router-outlet></router-outlet>\r\n","import { Component, Input, } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport * as XLSX from 'xlsx';\r\n\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../../../../services/store-builder.service';\r\n\r\n\r\n@Component({\r\n  selector: 'app-fixture-bulk-upload',\r\n  templateUrl: './fixture-bulk-upload.component.html',\r\n  styleUrl: './fixture-bulk-upload.component.scss'\r\n})\r\nexport class FixtureBulkUploadComponent {\r\n  @Input() clientId: string;\r\n  @Input() totalItemCount: number;\r\n\r\n  viewStatus = 'start'; // 'error' , 'action' , 'start'\r\n\r\n  bulkActionForm: FormGroup;\r\n\r\n  processedFileInfo: {\r\n    totalRows: number,\r\n    errorRows: number,\r\n    missingFields: string[],\r\n    invalidFields: string[],\r\n    deletedFixtureIds?: string[],\r\n    deletedRows?: number,\r\n    updateRows?: number,\r\n    newRows?: number,\r\n    allFixtures?: any[]\r\n  };\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private fb: FormBuilder,\r\n  ) {\r\n    this.bulkActionForm = this.fb.group({\r\n      newFixtureStatus: ['draft'],    // or 'complete'\r\n      updateFixtureStatus: ['draft']  // or 'complete'\r\n    });\r\n\r\n  }\r\n\r\n  downloadEmptyFixtureTemplate(): void {\r\n    this.exportFixtureList(false);\r\n  }\r\n\r\n  downloadFixtureTemplateWithData(): void {\r\n    this.exportFixtureList(true);\r\n  }\r\n\r\n  exportFixtureList(withRecords: boolean) {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: []\r\n      },\r\n      export: true,\r\n      emptyDownload: !withRecords\r\n    }\r\n\r\n    this.storeBuilderService.getFixtureLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'Fixture Libraries')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ exportFixtureList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  getAllFixtureList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: []\r\n      },\r\n      export: false,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.storeBuilderService.getFixtureLibraryList(payload).subscribe({\r\n      next: (res: any) => {\r\n        let result = res?.data?.data ?? []\r\n\r\n        let transformedData = this.transformOriginalData(result);\r\n\r\n        const differenceCounts = this.countFixtureDifferences(transformedData, this.processedFileInfo.allFixtures ?? []);\r\n\r\n\r\n        this.processedFileInfo.deletedRows = differenceCounts.deletedFixtureCount;\r\n        this.processedFileInfo.updateRows = differenceCounts.updatedFixtureCount;\r\n        this.processedFileInfo.newRows = differenceCounts.newFixtureCount;\r\n        this.processedFileInfo.deletedFixtureIds = differenceCounts.deletedFixtureIds;\r\n\r\n        if (this.processedFileInfo.newRows || this.processedFileInfo.updateRows || this.processedFileInfo.deletedRows) {\r\n          this.viewStatus = 'action';\r\n        } else {\r\n          this.toast.getPrimaryToast(\"The file either empty or you made no changes in it.\")\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getAllFixtureList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  transformOriginalData(apiResponse: any): any[] {\r\n    let result: any[] = [];\r\n    for (let i = 0; i < apiResponse.length; i++) {\r\n      let item = apiResponse[i];\r\n\r\n      if (item.shelfConfig.length == 0) {\r\n        result.push({\r\n          \"Fixture Code\": item.fixtureLibCode,\r\n          \"Fixture Name\": item.fixtureCategory,\r\n          \"Fixture Type\": item.fixtureType,\r\n          \"Fixture Height(ft)\": item.fixtureLength?.value ?? 0,\r\n          \"Fixture Width(ft)\": item.fixtureWidth?.value ?? 0,\r\n          \"Fixture Header height(ft)\": item.header?.height?.value ?? 0,\r\n          \"Fixture Footer Height(ft)\": item.footer?.height?.value ?? 0,\r\n          \"Shelf Number\": 0,\r\n          \"Shelf Type\": \"\",\r\n          \"Tray Rows\": 0,\r\n          \"Product Per Shelf/Tray\": 0,\r\n          \"Panel Name\": \"\",\r\n          \"id\": item._id\r\n        })\r\n      } else {\r\n        for (let j = 0; j < item.shelfConfig.length; j++) {\r\n          let shelf = item.shelfConfig[j];\r\n\r\n          result.push({\r\n            \"Fixture Code\": item.fixtureLibCode,\r\n            \"Fixture Name\": item.fixtureCategory,\r\n            \"Fixture Type\": item.fixtureType,\r\n            \"Fixture Height(ft)\": item.fixtureLength?.value ?? 0,\r\n            \"Fixture Width(ft)\": item.fixtureWidth?.value ?? 0,\r\n            \"Fixture Header height(ft)\": item.header?.height?.value ?? 0,\r\n            \"Fixture Footer Height(ft)\": item.footer?.height?.value ?? 0,\r\n            \"Shelf Number\": shelf.shelfNumber,\r\n            \"Shelf Type\": shelf.shelfType,\r\n            \"Tray Rows\": shelf.trayRows,\r\n            \"Product Per Shelf/Tray\": shelf.productPerShelf,\r\n            \"Panel Name\": shelf.label,\r\n            \"id\": item._id\r\n          })\r\n        }\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  countFixtureDifferences(originalData: any[], modifiedData: any[]): {\r\n    newFixtureCount: number;\r\n    deletedFixtureCount: number;\r\n    updatedFixtureCount: number;\r\n    deletedFixtureIds: string[]\r\n  } {\r\n    const newFixtures: any[] = [];\r\n    const deletedFixtures: any[] = [];\r\n    const updatedFixtures: { original: any; modified: any; changes: Record<string, [any, any]> }[] = [];\r\n\r\n    const identifyFixture = (fixture: any) => `${fixture['Fixture Code']}-${fixture['Shelf Number']}`;\r\n\r\n    const originalFixtureMap = new Map(originalData.map(fixture => [identifyFixture(fixture), fixture]));\r\n    const modifiedFixtureMap = new Map(modifiedData.map(fixture => [identifyFixture(fixture), fixture]));\r\n\r\n    // Identify new fixtures\r\n    modifiedData.forEach(modifiedFixture => {\r\n      if (!originalFixtureMap.has(identifyFixture(modifiedFixture))) {\r\n        newFixtures.push(modifiedFixture);\r\n      }\r\n    });\r\n\r\n    // Identify deleted fixtures\r\n    originalData.forEach(originalFixture => {\r\n      if (!modifiedFixtureMap.has(identifyFixture(originalFixture))) {\r\n        deletedFixtures.push(originalFixture);\r\n      }\r\n    });\r\n\r\n    // Identify updated fixtures\r\n    modifiedData.forEach(modifiedFixture => {\r\n      const id = identifyFixture(modifiedFixture);\r\n      const originalFixture = originalFixtureMap.get(id);\r\n\r\n      if (originalFixture) {\r\n        const changes: Record<string, [any, any]> = {};\r\n        for (const key in modifiedFixture) {\r\n          if (modifiedFixture.hasOwnProperty(key) && originalFixture.hasOwnProperty(key) && String(modifiedFixture[key]) !== String(originalFixture[key])) {\r\n            changes[key] = [originalFixture[key], modifiedFixture[key]];\r\n          }\r\n        }\r\n        if (Object.keys(changes).length > 0) {\r\n          updatedFixtures.push({ original: originalFixture, modified: modifiedFixture, changes });\r\n        }\r\n      }\r\n    });\r\n\r\n    return {\r\n      newFixtureCount: newFixtures.length,\r\n      deletedFixtureCount: deletedFixtures.length,\r\n      updatedFixtureCount: updatedFixtures.length,\r\n      deletedFixtureIds: deletedFixtures.map(i => i.id)\r\n    };\r\n  }\r\n\r\n\r\n  onFileUpload(event: any) {\r\n    const target: DataTransfer = <DataTransfer>event.target;\r\n    let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);\r\n\r\n    if (isExcelFile) {\r\n      const reader: FileReader = new FileReader();\r\n      reader.readAsBinaryString(target.files[0]);\r\n\r\n      reader.onload = (e: any) => {\r\n        const bstr: string = e.target.result;\r\n        const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });\r\n        const wsname: string = wb.SheetNames[0];\r\n        const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n        const rawData: any[][] = XLSX.utils.sheet_to_json(ws, { header: 1 });\r\n\r\n        // Filter out empty rows (e.g. entire row is null/empty strings)\r\n        const data = rawData.filter(row =>\r\n          row.some(cell => cell !== null && cell !== undefined && cell !== '')\r\n        );\r\n\r\n        this.processedFileInfo = this.validateExcelData(data);\r\n\r\n        if (this.processedFileInfo.invalidFields.length || this.processedFileInfo.missingFields.length) {\r\n          this.viewStatus = 'error';\r\n        } else {\r\n          this.getAllFixtureList();\r\n        }\r\n      };\r\n    }\r\n  }\r\n\r\n  validateExcelData(rawData: any[][]) {\r\n    const headers = rawData[0];\r\n    const data = rawData.slice(1).filter(row =>\r\n      row.some(cell => cell !== null && cell !== undefined && cell !== '')\r\n    );\r\n\r\n    const missingFields: string[] = [];\r\n    const invalidFormats: string[] = [];\r\n    const newFixtures: string[] = [];\r\n    const errorRows = new Set<number>();\r\n    const allFixtures: Record<string, any>[] = []; // ADDED: To store all extracted fixture data\r\n\r\n    const fixtureAttributeMap: Record<string, { indices: number[]; attributes: Record<string, any> }[]> = {};\r\n    const fixtureShelfMap: Record<string, Set<number>> = {};\r\n\r\n    const allowedFixtureTypes = ['wall', 'floor'];\r\n    const allowedShelfTypes = ['shelf', 'tray'];\r\n\r\n    const isValidationEnabled = {\r\n      checkNewFixtureByEmptyCode: true,\r\n      checkUniqueAndConsistentFixtureByName: true,\r\n      checkFixtureTypeDropdown: true,\r\n      checkShelfNameMandatoryByType: true,\r\n      checkNonZeroNonNegative: true,\r\n      checkUniqueShelfNumberPerSameFixture: true,\r\n      checkShelfTypeDropdownValues: true,\r\n    };\r\n\r\n    data.forEach((row, rowIndex) => {\r\n      const excelRow = rowIndex + 2;\r\n      let hasError = false;\r\n      const rowData: Record<string, any> = {};\r\n      headers.forEach((header, colIndex) => {\r\n        rowData[header] = row[colIndex] ?? \"\";\r\n      });\r\n\r\n      allFixtures.push(rowData);\r\n\r\n      headers.forEach((header, colIndex) => {\r\n        const cellValue = row[colIndex];\r\n        const cellRef = `${this.getExcelColName(colIndex)}${excelRow}`;\r\n\r\n        // 1. Check for missing (Existing) - Handle optional fields based on Fixture Type\r\n        if (cellValue === null || cellValue === undefined || cellValue === '') {\r\n          if (header !== 'Fixture Code') {\r\n            const fixtureType = String(rowData['Fixture Type']).toLowerCase();\r\n            const isOptionalForFloor = (fixtureType === 'floor' && (header === 'Fixture Header height(ft)' || header === 'Fixture Footer Height(ft)' || header === 'Shelf Type'));\r\n            const isOptionalForWall = (fixtureType === 'wall' && header === 'Panel Name');\r\n\r\n            if (!isOptionalForFloor && !isOptionalForWall) {\r\n              missingFields.push(cellRef);\r\n              hasError = true;\r\n            }\r\n          }\r\n          if (header === 'Fixture Code' && isValidationEnabled.checkNewFixtureByEmptyCode && Object.values(rowData).some(val => val !== null && val !== undefined && val !== '' && val !== rowData['Fixture Code'])) {\r\n            newFixtures.push(cellRef);\r\n            // We don't add it to missingFields here, as it's handled as a newFixture\r\n          } else if (header === 'Fixture Code' && !isValidationEnabled.checkNewFixtureByEmptyCode) {\r\n            missingFields.push(cellRef);\r\n            hasError = true;\r\n          }\r\n          return; // Skip further validation for this cell if it's empty\r\n        }\r\n\r\n        // 6. Cell values cannot be negative (can be 0 now for header/footer of floor type)\r\n        if (isValidationEnabled.checkNonZeroNonNegative &&\r\n          ['Fixture Height(ft)', 'Fixture Width(ft)', 'Tray Rows', 'Product Per Shelf/Tray', 'Shelf Number'].includes(header)) {\r\n          const numValue = Number(cellValue);\r\n          if (!isNaN(numValue) && numValue < 0) { // Changed from <= 0 to < 0\r\n            invalidFormats.push(cellRef);\r\n            hasError = true;\r\n          }\r\n        }\r\n        // Allow 0 for 'Fixture Header height(ft)' and 'Fixture Footer Height(ft)' if Fixture Type is 'floor'\r\n        if (isValidationEnabled.checkNonZeroNonNegative &&\r\n          (header === 'Fixture Header height(ft)' || header === 'Fixture Footer Height(ft)')) {\r\n          const numValue = Number(cellValue);\r\n          if (!isNaN(numValue) && numValue < 0) {\r\n            invalidFormats.push(cellRef);\r\n            hasError = true;\r\n          }\r\n        }\r\n\r\n        // 3. Fixture Type: dropdown 'wall' and 'floor'\r\n        if (isValidationEnabled.checkFixtureTypeDropdown && header === 'Fixture Type' && !allowedFixtureTypes.includes(String(cellValue).toLowerCase())) {\r\n          invalidFormats.push(cellRef);\r\n          hasError = true;\r\n        }\r\n\r\n        // 8. 'Shelf type' is a dropdown with 'shelf' and 'tray' options.\r\n        if (isValidationEnabled.checkShelfTypeDropdownValues && header === 'Shelf Type' && cellValue) {\r\n          if (!allowedShelfTypes.includes(String(cellValue).toLowerCase())) {\r\n            invalidFormats.push(cellRef);\r\n            hasError = true;\r\n          }\r\n        }\r\n      });\r\n\r\n      // 1. Panel Name is optional for wall type fixture, but mandatory for floor type.\r\n      if (isValidationEnabled.checkShelfNameMandatoryByType && rowData['Fixture Type']) {\r\n        const fixtureType = String(rowData['Fixture Type']).toLowerCase();\r\n        const shelfNameMissing = rowData['Panel Name'] === null || rowData['Panel Name'] === undefined || rowData['Panel Name'] === '';\r\n\r\n        if (fixtureType === 'floor' && shelfNameMissing) {\r\n          missingFields.push(`${this.getExcelColName(headers.indexOf('Panel Name'))}${excelRow}`);\r\n          hasError = true;\r\n        }\r\n        // For 'wall', Panel Name being missing is already handled in the missing fields check above.\r\n      }\r\n\r\n      // Group rows by Fixture Name to check for consistency\r\n      if (isValidationEnabled.checkUniqueAndConsistentFixtureByName && rowData['Fixture Name']) {\r\n        const fixtureName = rowData['Fixture Name'];\r\n        const keyAttributes: any = {\r\n          'Fixture Width(ft)': rowData['Fixture Width(ft)'],\r\n          'Fixture Height(ft)': rowData['Fixture Height(ft)'],\r\n          'Fixture Header height(ft)': rowData['Fixture Header height(ft)'],\r\n          'Fixture Footer Height(ft)': rowData['Fixture Footer Height(ft)'],\r\n          'Fixture Type': String(rowData['Fixture Type']).toLowerCase()\r\n        };\r\n\r\n        const existingEntry = fixtureAttributeMap[fixtureName]?.find(entry =>\r\n          Object.keys(keyAttributes).every(key => key in entry.attributes && String(entry.attributes[key]) === String(keyAttributes[key]))\r\n        );\r\n\r\n        if (existingEntry) {\r\n          existingEntry.indices.push(rowIndex);\r\n        } else {\r\n          if (!fixtureAttributeMap[fixtureName]) {\r\n            fixtureAttributeMap[fixtureName] = [];\r\n          }\r\n          fixtureAttributeMap[fixtureName].push({ indices: [rowIndex], attributes: keyAttributes });\r\n        }\r\n      }\r\n\r\n      if (hasError) {\r\n        errorRows.add(excelRow);\r\n      }\r\n    });\r\n\r\n    // 3. If more than one row have same fixture name, but other fields are not exactly matching then it is considered as invalid.\r\n    if (isValidationEnabled.checkUniqueAndConsistentFixtureByName) {\r\n      for (const fixtureName in fixtureAttributeMap) {\r\n        if (fixtureAttributeMap[fixtureName].length > 1) {\r\n          const rowIndices = fixtureAttributeMap[fixtureName].reduce((acc: number[], curr) => acc.concat(curr.indices), []);\r\n          rowIndices.forEach(index => errorRows.add(index + 2));\r\n          invalidFormats.push(...rowIndices.map(index => `${this.getExcelColName(headers.indexOf('Fixture Name'))}${index + 2}`));\r\n        }\r\n      }\r\n    }\r\n\r\n    // 2. Shelf number should be unique among the rows which are considered as same fixtures\r\n    if (isValidationEnabled.checkUniqueShelfNumberPerSameFixture) {\r\n      for (const fixtureName in fixtureAttributeMap) {\r\n        fixtureAttributeMap[fixtureName].forEach(fixtureGroup => {\r\n          const shelfNumbers = new Set<number>();\r\n          fixtureGroup.indices.forEach(index => {\r\n            const excelRow = index + 2;\r\n            const shelfNumber = this.rowDataByIndex(data, index, headers, 'Shelf Number');\r\n            if (shelfNumber !== null && shelfNumber !== undefined && shelfNumber !== '') {\r\n              const numShelfNumber = Number(shelfNumber);\r\n              if (!isNaN(numShelfNumber)) {\r\n                const fixtureIdentifier = `${fixtureName}-${JSON.stringify(fixtureGroup.attributes)}`;\r\n                if (!fixtureShelfMap[fixtureIdentifier]) {\r\n                  fixtureShelfMap[fixtureIdentifier] = new Set();\r\n                }\r\n                if (fixtureShelfMap[fixtureIdentifier].has(numShelfNumber)) {\r\n                  invalidFormats.push(`${this.getExcelColName(headers.indexOf('Shelf Number'))}${excelRow}`);\r\n                  errorRows.add(excelRow);\r\n                } else {\r\n                  fixtureShelfMap[fixtureIdentifier].add(numShelfNumber);\r\n                }\r\n              }\r\n            }\r\n          });\r\n        });\r\n      }\r\n    }\r\n\r\n    return {\r\n      totalRows: data.length,\r\n      missingFields: [...new Set(missingFields)],\r\n      invalidFields: [...new Set(invalidFormats)],\r\n      errorRows: errorRows.size,\r\n      allFixtures,\r\n    };\r\n  }\r\n\r\n  getCellValue(data: any[][], rowIndex: number, headers: string[], headerName: string): any {\r\n    const colIndex = headers.indexOf(headerName);\r\n    return colIndex > -1 && data[rowIndex] ? data[rowIndex][colIndex] : undefined;\r\n  }\r\n\r\n  rowDataByIndex(data: any[][], rowIndex: number, headers: string[], header: string): any {\r\n    const colIndex = headers.indexOf(header);\r\n    return colIndex !== -1 ? data[rowIndex][colIndex] : undefined;\r\n  }\r\n\r\n  getExcelColName(n: number): string {\r\n    let result = '';\r\n    while (n >= 0) {\r\n      result = String.fromCharCode((n % 26) + 65) + result;\r\n      n = Math.floor(n / 26) - 1;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  closeModal(): void {\r\n    this.activeModal.close();\r\n  }\r\n\r\n  onClickProceed() {\r\n    let fixtureData = this.processedFileInfo.allFixtures?.map((item) => {\r\n\r\n      return {\r\n        \"fixLibCode\": item['Fixture Code'],\r\n        \"fixtureName\": item['Fixture Name'],\r\n        \"fixtureType\": item['Fixture Type'],\r\n        \"height\": item['Fixture Height(ft)'],\r\n        \"width\": item['Fixture Width(ft)'],\r\n        \"headerHeight\": item['Fixture Header Height(ft)'],\r\n        \"footerHeight\": item['Fixture Footer Height(ft)'],\r\n        \"shelfNumber\": item['Shelf Number'],\r\n        \"shelfType\": item['Shelf Type'],\r\n        \"trayRows\": item['Tray Rows'],\r\n        \"productPerShelf\": item['Product Per Shelf/Tray'],\r\n        \"shelfName\": item['Panel Name']\r\n      }\r\n    })\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      fixtureData,\r\n      ...this.bulkActionForm.value,\r\n      deleteFixtureList: this.processedFileInfo.deletedFixtureIds\r\n    }\r\n\r\n    this.storeBuilderService.bulkActionFixtureLibrary(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.status === 'success') {\r\n          this.toast.getSuccessToast(\"Bulk action completed successfully\");\r\n          this.activeModal.close(\"refresh\");\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ onClickProceed Bulk Action [ERR]: ', err)\r\n        this.toast.getErrorToast(err);\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\n","<div class=\"modal-container\">\r\n  <h3>Fixture library (Bulk action)</h3>\r\n\r\n  <div *ngIf=\"viewStatus === 'start'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"startContainer\"></ng-container>\r\n  </div>\r\n  <div *ngIf=\"viewStatus === 'error'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"errorContainer\"></ng-container>\r\n  </div>\r\n  <div *ngIf=\"viewStatus === 'action'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"actionContainer\"></ng-container>\r\n  </div>\r\n\r\n  <div class=\"modal-actions\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeModal()\">Close</button>\r\n    <button *ngIf=\"viewStatus === 'action'\" type=\"button\" class=\"btn btn-primary\" (click)=\"onClickProceed()\">Proceed</button>\r\n    <button *ngIf=\"viewStatus === 'error'\" type=\"button\" class=\"btn btn-danger\" (click)=\"fileUpload.click()\">ReUpload</button>\r\n  </div>\r\n</div>\r\n\r\n<input style=\"display: none\" type=\"file\" #fileUpload id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n<ng-template #startContainer>\r\n  <svg\r\n    style=\"width: 80px; height: 80px\"\r\n    width=\"56\"\r\n    height=\"56\"\r\n    viewBox=\"0 0 95 94\"\r\n    fill=\"none\"\r\n    xmlns=\"http://www.w3.org/2000/svg\"\r\n    class=\"mb-4\"\r\n  >\r\n    <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n    <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n    <path\r\n      d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n      stroke=\"#00A3FF\"\r\n      stroke-width=\"3.33333\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n\r\n  <h3>Bulk Upload Fixtures</h3>\r\n\r\n  <div class=\"upload-description\">\r\n    <div class=\"upload-steps\">\r\n      <p class=\"card-description mb-0\">Step1 - Download template</p>\r\n      <a class=\"download-link fw-medium d-block\" (click)=\"downloadEmptyFixtureTemplate()\">Download empty template</a>\r\n      <!-- @if(this.totalItemCount){\r\n      <a class=\"download-link fw-medium d-block\" (click)=\"downloadFixtureTemplateWithData()\"\r\n        >Download template with {{ this.totalItemCount }} record</a\r\n      >\r\n      } -->\r\n      <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n      <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n    </div>\r\n\r\n    <button class=\"btn btn-primary d-inline-flex align-items-center w-fit\" (click)=\"fileUpload.click()\">\r\n      <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n          stroke=\"currentColor\"\r\n          stroke-width=\"1.67\"\r\n          stroke-linecap=\"round\"\r\n          stroke-linejoin=\"round\"\r\n        />\r\n      </svg>\r\n      Upload\r\n    </button>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #actionContainer>\r\n  <div class=\"d-flex w-100 gap-2 mb-5\">\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.totalRows }}</h3>\r\n      <p>Total fixture</p>\r\n    </div>\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.errorRows }}</h3>\r\n      <p>Errors</p>\r\n    </div>\r\n  </div>\r\n\r\n  <form [formGroup]=\"bulkActionForm\" class=\"w-100\">\r\n    <!-- FOR Empty Template (Creation mode) -->\r\n    @if(!processedFileInfo.updateRows && !processedFileInfo.deletedRows){\r\n    <div class=\"d-flex flex-column justify-content-start align-items-start w-100\">\r\n      <p class=\"fs-4\">You're about to create {{ processedFileInfo.newRows }} fixture. Are you sure want to proceed?</p>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newFixtureStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"complete\" value=\"complete\" />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newFixtureStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save as draft </label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    }@else {\r\n    <!-- FOR Template with fields (Create and Update mode) -->\r\n    <div class=\"d-flex flex-column justify-content-start align-items-start w-100\">\r\n      <h4>You're about to make the following bulk actions.</h4>\r\n      @if(processedFileInfo.newRows){\r\n      <p class=\"fs-4 mt-5\">You have created {{ processedFileInfo.newRows }} new fixtures.</p>\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newFixtureStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"complete\" value=\"complete\" />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newFixtureStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save as draft </label>\r\n        </div>\r\n      </div>\r\n      } @if(processedFileInfo.updateRows){\r\n      <p class=\"fs-4 mt-5\">You have made {{ processedFileInfo.updateRows }} updates in the fixtures.</p>\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input\r\n            formControlName=\"updateFixtureStatus\"\r\n            class=\"form-check-input me-1\"\r\n            type=\"radio\"\r\n            id=\"complete\"\r\n            value=\"complete\"\r\n          />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"updateFixtureStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save as draft </label>\r\n        </div>\r\n      </div>\r\n      } @if(processedFileInfo.deletedRows){\r\n      <p class=\"fs-4 mt-5\">You have deleted {{ processedFileInfo.deletedRows }} fixture.</p>\r\n      }\r\n    </div>\r\n    }\r\n  </form>\r\n</ng-template>\r\n\r\n<ng-template #errorContainer>\r\n  <div class=\"d-flex w-100 gap-2 mb-5\">\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.totalRows }}</h3>\r\n      <p>Total fixture</p>\r\n    </div>\r\n\r\n    <div class=\"col info-card error\">\r\n      <h3>{{ processedFileInfo.errorRows }}</h3>\r\n      <p>Errors</p>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"w-100\">\r\n    <p class=\"fs-4 my-5\">Unable to proceed due to the following errors</p>\r\n\r\n    <div class=\"w-100 info-card error\">\r\n      @if(processedFileInfo.missingFields.length){\r\n      <p\r\n        [ngClass]=\"{\r\n          'mb-4': processedFileInfo.invalidFields.length\r\n        }\"\r\n      >\r\n        Missing mandatory fields -\r\n\r\n        <span *ngFor=\"let item of processedFileInfo.missingFields; let i = index\">\r\n          {{ item }} <span *ngIf=\"i != processedFileInfo.missingFields.length - 1\">, </span>\r\n        </span>\r\n      </p>\r\n      } @if(processedFileInfo.invalidFields.length){\r\n      <p>\r\n        Invalid formats -\r\n        <span *ngFor=\"let item of processedFileInfo.invalidFields; let i = index\">\r\n          {{ item }} <span *ngIf=\"i != processedFileInfo.invalidFields.length - 1\">, </span>\r\n        </span>\r\n      </p>\r\n      }\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n","import { Component, Input, OnDestroy } from '@angular/core';\r\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../../../../services/store-builder.service';\r\nimport { generalValidator } from '../../../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: 'app-create-fixture-modal',\r\n  templateUrl: './create-fixture-modal.component.html',\r\n  styleUrl: './create-fixture-modal.component.scss'\r\n})\r\nexport class CreateFixtureModalComponent implements OnDestroy {\r\n  @Input() clientId: string;\r\n\r\n  countryOptions = [\r\n    { id: 'IN', label: 'IN' },\r\n    { id: 'SG', label: 'SG' },\r\n    { id: 'SA', label: 'SA' },\r\n    { id: 'TH', label: 'TH' },\r\n    { id: 'AE', label: 'AE' },\r\n  ];\r\n\r\n  fixtureForm = new FormGroup({\r\n    fixtureCategory: new FormControl('', [Validators.required, generalValidator()]),\r\n    fixtureType: new FormControl('wall', [Validators.required]),\r\n    country: new FormControl<string[]>([], [Validators.required])\r\n  });\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n  ) { }\r\n\r\n  onProceed() {\r\n\r\n    if (this.fixtureForm.invalid) {\r\n      this.fixtureForm.markAllAsTouched();\r\n      return false;\r\n    }\r\n\r\n    if (this.fixtureForm.valid) {\r\n      const newFixtureData = {\r\n        ...this.fixtureForm.value,\r\n        clientId: this.clientId\r\n      }\r\n\r\n      this.storeBuilderService.createFixtureLibrary(newFixtureData)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            this.activeModal.close(res?.data?._id);\r\n          },\r\n          error: (err) => {\r\n            this.toast.getErrorToast(err?.error?.error ?? \"Failed to create fixture\");\r\n            console.log(\"@@ ~ createFixtureLibrary [ERR]:\", err);\r\n          }\r\n        })\r\n    }\r\n  }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div class=\"mb-4\">\r\n    <h3 class=\"mb-1\">Create fixture</h3>\r\n    <p>You can create your fixture from the pre-configured settings.</p>\r\n  </div>\r\n\r\n  <form [formGroup]=\"fixtureForm\">\r\n    <div class=\"mb-5\">\r\n      <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control\"\r\n        id=\"fixtureCategory\"\r\n        formControlName=\"fixtureCategory\"\r\n        placeholder=\"Type your fixture name\"\r\n      />\r\n      <ng-container *ngIf=\"fixtureForm.get('fixtureCategory')?.touched && fixtureForm.get('fixtureCategory')?.invalid\">\r\n        <small class=\"text-danger\" *ngIf=\"fixtureForm.get('fixtureCategory')?.hasError('required')\">\r\n          Fixture name is required.\r\n        </small>\r\n        <small class=\"text-danger\" *ngIf=\"fixtureForm.get('fixtureCategory')?.hasError('whitespace')\">\r\n          Fixture name cannot be only whitespace.\r\n        </small>\r\n        <small class=\"text-danger\" *ngIf=\"fixtureForm.get('fixtureCategory')?.hasError('trimSpaces')\">\r\n          No leading or trailing whitespace allowed.\r\n        </small>\r\n      </ng-container>\r\n    </div>\r\n\r\n    <div class=\"mb-5\">\r\n      <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n      <multiselect-chip-dropdown\r\n        [items]=\"countryOptions\"\r\n        [idField]=\"'id'\"\r\n        [nameField]=\"'label'\"\r\n        [placeholder]=\"'Select countries'\"\r\n        formControlName=\"country\"\r\n      ></multiselect-chip-dropdown>\r\n      <ng-container *ngIf=\"fixtureForm.get('country')?.touched && fixtureForm.get('country')?.invalid\">\r\n        <small class=\"text-danger\" *ngIf=\"fixtureForm.get('country')?.hasError('required')\">\r\n          Select at least one country.\r\n        </small>\r\n      </ng-container>\r\n    </div>\r\n\r\n    <div class=\"mb-5\">\r\n      <h4 class=\"mb-1\">Fixture type</h4>\r\n      <p>Choose fixture type based on where it requires to fit into your store.</p>\r\n    </div>\r\n\r\n    <div class=\"type-container\">\r\n      <div\r\n        class=\"type-item\"\r\n        (click)=\"fixtureForm.get('fixtureType')?.setValue('wall')\"\r\n        [class.active]=\"fixtureForm.get('fixtureType')?.value === 'wall'\"\r\n      >\r\n        <svg\r\n          class=\"mb-3\"\r\n          width=\"66\"\r\n          height=\"67\"\r\n          viewBox=\"0 0 66 67\"\r\n          fill=\"none\"\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n          xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n        >\r\n          <rect y=\"0.5\" width=\"66\" height=\"66\" fill=\"url(#pattern0_11_41655)\" />\r\n          <defs>\r\n            <pattern id=\"pattern0_11_41655\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\r\n              <use xlink:href=\"#image0_11_41655\" transform=\"scale(0.00195312)\" />\r\n            </pattern>\r\n            <image\r\n              id=\"image0_11_41655\"\r\n              width=\"512\"\r\n              height=\"512\"\r\n              preserveAspectRatio=\"none\"\r\n              xlink:href=\"data:image/png;base64,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\"\r\n            />\r\n          </defs>\r\n        </svg>\r\n        <h5>Wall Fixture</h5>\r\n      </div>\r\n\r\n      <div\r\n        class=\"type-item\"\r\n        (click)=\"fixtureForm.get('fixtureType')?.setValue('floor')\"\r\n        [class.active]=\"fixtureForm.get('fixtureType')?.value === 'floor'\"\r\n      >\r\n        <svg\r\n          class=\"mb-3\"\r\n          width=\"72\"\r\n          height=\"73\"\r\n          viewBox=\"0 0 72 73\"\r\n          fill=\"none\"\r\n          xmlns=\"http://www.w3.org/2000/svg\"\r\n          xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n        >\r\n          <rect y=\"0.5\" width=\"72\" height=\"72\" fill=\"url(#pattern0_11_41659)\" />\r\n          <defs>\r\n            <pattern id=\"pattern0_11_41659\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\r\n              <use xlink:href=\"#image0_11_41659\" transform=\"scale(0.00195312)\" />\r\n            </pattern>\r\n            <image\r\n              id=\"image0_11_41659\"\r\n              width=\"512\"\r\n              height=\"512\"\r\n              preserveAspectRatio=\"none\"\r\n              xlink:href=\"data:image/png;base64,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\"\r\n            />\r\n          </defs>\r\n        </svg>\r\n        <h5>Floor Fixture</h5>\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"modal-actions\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onProceed()\" [disabled]=\"!fixtureForm.valid\">Proceed</button>\r\n    </div>\r\n  </form>\r\n</div>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { debounceTime, distinctUntilChanged, lastValueFrom, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { FixtureBulkUploadComponent } from './popups/fixture-bulk-upload/fixture-bulk-upload.component';\r\nimport { CreateFixtureModalComponent } from './popups/create-fixture-modal/create-fixture-modal.component';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { FixtureLibraryList } from '../../../interfaces/fixture-library.interface';\r\nimport { DeleteConfirmationComponent } from '../../popups/delete-confirmation/delete-confirmation.component';\r\nimport { CannotPerformComponent } from '../../popups/cannot-perform/cannot-perform.component';\r\nimport { getQueryParamNumber, getQueryParamString } from '../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: 'lib-fixture-library',\r\n  templateUrl: './fixture-library.component.html',\r\n  styleUrl: './fixture-library.component.scss'\r\n})\r\nexport class FixtureLibraryComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  fixturesList: FixtureLibraryList[] = []\r\n  viewMode: 'list' | 'grid' | string = 'list';\r\n\r\n  sortedColumn: string = '';\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = '';\r\n\r\n  limit: number = 10;\r\n  offset: number = 0;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  filterObject = [\r\n    {\r\n      Description: 'Status',\r\n      Issues: [\r\n        { text: \"Active\", id: 'active' },\r\n        { text: \"Inactive\", id: 'inactive' },\r\n        { text: \"Draft\", id: 'draft' },\r\n      ],\r\n    },\r\n    {\r\n      Description: 'Fixture Type',\r\n      Issues:\r\n        [\r\n          { text: \"Wall\", id: 'wall' },\r\n          { text: \"Floor\", id: 'floor' },\r\n        ]\r\n    },\r\n    {\r\n      Description: 'Country',\r\n      Issues: [\r\n        { text: \"IN\", id: 'IN' },\r\n        { text: \"SG\", id: 'SG' },\r\n        { text: \"SA\", id: 'SA' },\r\n        { text: \"TH\", id: 'TH' },\r\n        { text: \"AE\", id: 'AE' },\r\n      ]\r\n    }\r\n  ]\r\n\r\n  appliedFilters = {\r\n    type: [],\r\n    status: [],\r\n    size: [],\r\n    country: []\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n\r\n  // Email-gated (planostaticdatas `allowedFixtureLibraryUsers`). accessChecked\r\n  // gates the initial render so the list never flashes before the check resolves.\r\n  accessChecked = false;\r\n  allowed = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private libSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n  ) { }\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n\r\n    // Gate the whole page on the allowlist before wiring any data loads.\r\n    await this.checkAccess();\r\n    if (!this.allowed) return;\r\n\r\n    this.gs.dataRangeValue.pipe(\r\n      takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n      debounceTime(200), // To avoid immediate frequent calls.\r\n      distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n    ).subscribe((data: any) => {\r\n      this.isPageLoading = true;\r\n      if (data?.client) {\r\n        this.clientId = data?.client;\r\n      } else {\r\n        let headerData = JSON.parse(localStorage.getItem('header-filters') as string);\r\n        this.clientId = headerData?.client;\r\n      }\r\n\r\n      this.getFixtureSizesList();\r\n\r\n      this.route.queryParamMap.pipe(takeUntil(this.destroy$)).subscribe(params => {\r\n        this.searchTerm = getQueryParamString({\r\n          params,\r\n          key: 'search',\r\n          fallback: '',\r\n        });\r\n        this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n        this.viewMode = getQueryParamString({\r\n          params,\r\n          key: 'view',\r\n          fallback: 'list',\r\n          allowed: ['grid', 'list'],\r\n        });\r\n\r\n        this.limit = getQueryParamNumber({\r\n          params,\r\n          key: 'limit',\r\n          fallback: 10,\r\n          min: 1,\r\n          max: 30\r\n        });\r\n\r\n        this.offset = getQueryParamNumber({\r\n          params,\r\n          key: 'offset',\r\n          fallback: 0,\r\n          min: 0\r\n        });\r\n\r\n        this.getFixturesList();\r\n      });\r\n    });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Fixture Library\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      { title: \"Planogram\", path: \"/manage/planogram/manage-planograms\", isActive: false, isSeparator: false },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  /** Resolve whether the session user may access the Fixture Library. Never throws. */\r\n  private async checkAccess(): Promise<void> {\r\n    try {\r\n      const res: any = await lastValueFrom(this.storeBuilderService.getFixtureLibraryAccess());\r\n      this.allowed = !!res?.data?.allowed;\r\n    } catch (err) {\r\n      console.log('@@ ~ checkAccess [ERR]:', err);\r\n      this.allowed = false;\r\n    } finally {\r\n      this.accessChecked = true;\r\n    }\r\n  }\r\n\r\n  getFixturesList() {\r\n    this.libSub?.unsubscribe() // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.fixturesList = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: false,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.libSub = this.storeBuilderService.getFixtureLibraryList(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.totalItems = res?.data?.count;\r\n          this.fixturesList = res?.data?.data.map((item: any) => {\r\n            return {\r\n              name: item.fixtureCategory,\r\n              type: item.fixtureType,\r\n              width: item.fixtureWidth.value,\r\n              height: item.fixtureLength.value,\r\n              partitions: item.shelfConfig.length,\r\n              templatesTagged: item.templateId.length,\r\n              status: item.status,\r\n              id: item._id,\r\n              country: item.country || [],\r\n            }\r\n          })\r\n          if (this.totalItems < 10) {\r\n            this.paginationSizes = [this.totalItems]\r\n          } else {\r\n            this.paginationSizes = [10, 20, 30]\r\n          }\r\n        }\r\n        this.isPageLoading = false;\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getFixturesList [ERR]: ', err)\r\n        this.isPageLoading = false;\r\n      }\r\n    })\r\n\r\n    this.totalItems = this.fixturesList.length;\r\n  }\r\n\r\n  getFixtureSizesList() {\r\n    this.storeBuilderService.getFixtureSizeList(this.clientId).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.data) {\r\n          this.filterObject.push({\r\n            Description: 'Size',\r\n            Issues: res?.data.map((s: string) => { return { text: `${s}ft`, id: s } })\r\n          })\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getFixtureSizesList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  downloadEmptyTemplate() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: [],\r\n        country: []\r\n      },\r\n      export: true,\r\n      emptyDownload: true\r\n    }\r\n\r\n    this.storeBuilderService.getFixtureLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'Fixture Libraries')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ exportFixtureLibraryList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  exportFixtureList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: true,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.storeBuilderService.getFixtureLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'Fixtures List')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ exportFixtureLibraryList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(FixtureBulkUploadComponent, { centered: true, });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.componentInstance.totalItemCount = this.totalItems;\r\n    modelRef.result.then((result) => {\r\n      if (result === 'refresh') {\r\n        this.getFixturesList()\r\n      }\r\n    })\r\n  }\r\n\r\n  onClickCreateFixtureLibrary() {\r\n    const modelRef = this.ngbModal.open(CreateFixtureModalComponent, { centered: true, size: 'md' });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.result.then((result) => {\r\n      if (result) {\r\n        this.router.navigate(['/manage/planogram/create-library-fixture'], { queryParams: { fixtureId: result, isEdit: true } });\r\n      }\r\n    })\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = '';\r\n    this.sortOrder = 1\r\n    this.offset = 0;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getFixturesList()\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    const status = event[0]?.Issues?.map((i: any) => i?.id);\r\n    const type = event[1]?.Issues?.map((i: any) => i?.id);\r\n    const country = event[2]?.Issues?.map((i: any) => i?.id);\r\n    const size = event[3]?.Issues?.map((i: any) => i?.id);\r\n\r\n    this.isFilterApplied = (status || type || size || country);\r\n    this.appliedFilters = { type, status, size, country };\r\n    this.offset = 1;\r\n    this.getFixturesList();\r\n  }\r\n\r\n  toggleViewMode(mode: 'list' | 'grid') {\r\n    this.viewMode = mode;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  getTooltipText(status: string): string {\r\n    switch (status) {\r\n      case 'active':\r\n        return 'This fixture is active to templates.';\r\n      case 'inactive':\r\n        return 'This fixture is not active to templates.';\r\n      case 'draft':\r\n        return 'This fixture is in draft';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  onDuplicate(fixtureId: string) {\r\n    this.storeBuilderService.duplicateFixtureLibrary({ fixtureId: fixtureId }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.data.message);\r\n          this.getFixturesList();\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to duplicate Fixture');\r\n        console.log(\"@@ ~ duplicateFixtureLibrary [err]:\", err)\r\n      }\r\n    })\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Delete fixture';\r\n    modelRef.componentInstance.description = 'Are you sure you want to delete this fixture ?';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok')\r\n  }\r\n\r\n  async onDelete(fixtureId: string, usageCount: number = 0) {\r\n\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t delete fixture!`;\r\n      modelRef.componentInstance.description = `Since this fixture is live in \"${usageCount} templates,\" deleting is not allowed.`;\r\n      return\r\n    };\r\n\r\n    if (!await this.confirmDeletion()) return;\r\n\r\n    this.storeBuilderService.deleteFixtureLibrary({ fixtureId: fixtureId }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.message);\r\n          this.getFixturesList();\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to delete Fixture');\r\n        console.log(\"@@ ~ deleteFixtureLibrary [ERR]:\", err)\r\n      }\r\n    })\r\n\r\n  }\r\n\r\n  onEdit(fixtureId: string, usageCount: number = 0) {\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t edit fixture!`;\r\n      modelRef.componentInstance.description = `Since this fixture is live in \"${usageCount} templates,\" editing is not allowed.`;\r\n      return\r\n    };\r\n\r\n    this.router.navigate(['/manage/planogram/create-library-fixture'], { queryParams: { fixtureId: fixtureId, isEdit: true } });\r\n  }\r\n\r\n  onClickCard(event: any, fixture: FixtureLibraryList) {\r\n    this.router.navigate(['/manage/planogram/create-library-fixture'], { queryParams: { fixtureId: fixture.id } });\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { view: this.viewMode, search: this.searchTerm, limit: this.limit, offset: this.offset },\r\n      queryParamsHandling: 'merge',\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.libSub?.unsubscribe();\r\n  }\r\n}\r\n","<!-- Checking access -->\r\n<div *ngIf=\"!accessChecked\" class=\"card p-5 m-5 text-center text-muted py-10\">Checking access…</div>\r\n\r\n<!-- Access denied -->\r\n<lib-access-denied\r\n  *ngIf=\"accessChecked && !allowed\"\r\n  [feature]=\"'Fixture Library'\"\r\n></lib-access-denied>\r\n\r\n<section id=\"fixture-library\" class=\"content-wrapper\" *ngIf=\"accessChecked && allowed\">\r\n  <!-- Fixture view header -->\r\n  <div\r\n    *ngIf=\"fixturesList.length !== 0 || searchTerm || isFilterApplied\"\r\n    class=\"d-flex justify-content-between align-items-center mb-5\"\r\n  >\r\n    <div>\r\n      <h4>Fixtures List</h4>\r\n      <span>{{ totalItems }} - Total Fixtures</span>\r\n    </div>\r\n\r\n    <div class=\"d-flex align-items-center gap-2\">\r\n      <div style=\"position: relative\">\r\n        <input\r\n          type=\"text\"\r\n          [(ngModel)]=\"searchTerm\"\r\n          (change)=\"onSearch()\"\r\n          style=\"padding-left: 3rem; padding-right: 3rem\"\r\n          class=\"form-control\"\r\n          name=\"search\"\r\n          autocomplete=\"off\"\r\n          placeholder=\"Search\"\r\n        />\r\n\r\n        <span class=\"search-icon\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n          </svg>\r\n        </span>\r\n\r\n        <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n          <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n            <g id=\"SVGRepo_iconCarrier\">\r\n              <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <circle\r\n                cx=\"12\"\r\n                cy=\"12\"\r\n                r=\"9\"\r\n                stroke=\"#667085\"\r\n                stroke-width=\"2\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              ></circle>\r\n            </g>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n\r\n      <button type=\"button\" (click)=\"onClickCreateFixtureLibrary()\" class=\"btn btn-primary d-inline-flex align-items-center me-2\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n          <path\r\n            d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\"\r\n            stroke=\"white\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        <span class=\"ms-2 text-white\">Create </span>\r\n      </button>\r\n\r\n      <!-- <button type=\"button\" (click)=\"openBulkUploadModal()\" class=\"btn btn-outline text-nowrap\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Bulk Upload\r\n      </button> -->\r\n\r\n      <button\r\n        type=\"button\"\r\n        [disabled]=\"fixturesList.length <= 0\"\r\n        (click)=\"exportFixtureList()\"\r\n        class=\"btn btn-outline text-nowrap\"\r\n      >\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Export\r\n      </button>\r\n\r\n      <lib-filters [dataObject]=\"filterObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"toggle-button me-2\" [ngClass]=\"{ selected: viewMode === 'list' }\" (click)=\"toggleViewMode('list')\">\r\n          <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M6.24078 4.54639H15.8906M6.24078 9.00017H15.8906M6.24078 13.4539H15.8906M2.5293 4.54639H2.53672M2.5293 9.00017H2.53672M2.5293 13.4539H2.53672\"\r\n              [attr.stroke]=\"viewMode === 'list' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div>\r\n\r\n        <div class=\"toggle-button\" [ngClass]=\"{ selected: viewMode === 'grid' }\" (click)=\"toggleViewMode('grid')\">\r\n          <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M7.91886 2.31934H2.72278V7.51541H7.91886V2.31934Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M16.0841 2.31934H10.888V7.51541H16.0841V2.31934Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M16.0841 10.4846H10.888V15.6807H16.0841V10.4846Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M7.91886 10.4846H2.72278V15.6807H7.91886V10.4846Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div *ngIf=\"isPageLoading; else contentPart\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <ng-template #contentPart>\r\n    <div *ngIf=\"fixturesList.length === 0\">\r\n      @if(searchTerm || isFilterApplied){\r\n      <div class=\"row\">\r\n        <div class=\"col-lg-12 my-6\">\r\n          <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">No data found</div>\r\n            <div class=\"nodatasubtext\">There is no result for matching filter and search</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      }@else{\r\n      <div class=\"row g-0 py-12\">\r\n        <!-- Single Fixture Creation -->\r\n        <div class=\"col-md-12 pe-md-3\">\r\n          <div class=\"d-flex flex-column align-items-center p-10\">\r\n            <div class=\"text-center mb-8\">\r\n              <div class=\"mb-5\">\r\n                <svg\r\n                  style=\"width: 80px; height: 80px\"\r\n                  width=\"56\"\r\n                  height=\"56\"\r\n                  viewBox=\"0 0 56 56\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                >\r\n                  <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n                  <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n                  <path\r\n                    d=\"M28 24V32M24 28H32M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\"\r\n                    stroke=\"#00A3FF\"\r\n                    stroke-width=\"2\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n              <h3 class=\"card-title mb-3\">Create fixture</h3>\r\n              <p class=\"card-tagline mb-0\">Start creating fixture manually through step by step</p>\r\n            </div>\r\n            <button\r\n              (click)=\"onClickCreateFixtureLibrary()\"\r\n              type=\"button\"\r\n              class=\"btn btn-outline d-inline-flex align-items-center\"\r\n            >\r\n              <svg class=\"me-2\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M12 5V19M5 12H19\"\r\n                  stroke=\"currentColor\"\r\n                  stroke-width=\"2\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n              Create\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Bulk Fixture Creation -->\r\n        <!-- <div class=\"col-md-6 ps-md-3 border-start\">\r\n          <div class=\"d-flex flex-column align-items-center p-10\">\r\n            <div class=\"text-center mb-8\">\r\n              <div class=\"mb-5\">\r\n                <svg\r\n                  style=\"width: 80px; height: 80px\"\r\n                  width=\"56\"\r\n                  height=\"56\"\r\n                  viewBox=\"0 0 95 94\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                >\r\n                  <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                  <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                  <path\r\n                    d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n                    stroke=\"#00A3FF\"\r\n                    stroke-width=\"3.33333\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n              <h3 class=\"card-title mb-3\">Create fixture using excel template</h3>\r\n              <p class=\"card-tagline mb-0\">You can create a single or a multiple fixtures using the template below</p>\r\n            </div>\r\n            <div class=\"d-flex flex-column gap-2 mb-6\" style=\"width: fit-content\">\r\n              <p class=\"card-description mb-0\">\r\n                Step1 - <a class=\"download-link fw-medium\" (click)=\"downloadEmptyTemplate()\">Download the template here</a>\r\n              </p>\r\n              <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n              <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n            </div>\r\n            <button class=\"btn btn-primary d-inline-flex align-items-center\" (click)=\"openBulkUploadModal()\">\r\n              <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n                  stroke=\"currentColor\"\r\n                  stroke-width=\"1.67\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n              Upload\r\n            </button>\r\n          </div>\r\n        </div> -->\r\n      </div>\r\n      }\r\n    </div>\r\n\r\n    <div *ngIf=\"fixturesList.length != 0\">\r\n      <!-- Fixture list view -->\r\n      <section id=\"list-view\" *ngIf=\"viewMode === 'list'; else gridView\">\r\n        <div class=\"table-responsive\">\r\n          <table class=\"w-100 table bottom-border text-nowrap\">\r\n            <thead>\r\n              <tr>\r\n                <th>\r\n                  <span (click)=\"onSortTable('fixtureCategory')\" class=\"cursor-pointer\">\r\n                    Fixture name\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'fixtureCategory' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCategory' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th>\r\n                  <span (click)=\"onSortTable('fixtureType')\" class=\"cursor-pointer\">\r\n                    Type\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'fixtureType' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureType' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th>Country</th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('fixtureWidth')\" class=\"cursor-pointer\">\r\n                    Width\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'fixtureWidth' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureWidth' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('fixtureLength')\" class=\"cursor-pointer\">\r\n                    Height\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'fixtureLength' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureLength' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('shelfConfig')\" class=\"cursor-pointer\">\r\n                    Partitions\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'shelfConfig' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'shelfConfig' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n\r\n                  <svg\r\n                    placement=\"start\"\r\n                    ngbTooltip=\"Partitions are shelves/sections/panel\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"18\"\r\n                    height=\"18\"\r\n                    viewBox=\"0 0 18 18\"\r\n                    fill=\"none\"\r\n                    class=\"ms-2\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_1_25644)\">\r\n                      <path\r\n                        d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_1_25644\">\r\n                        <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('templateCount')\" class=\"cursor-pointer\">\r\n                    Templates tagged\r\n                    <i\r\n                      [ngStyle]=\"{ color: sortedColumn === 'templateCount' ? '#009BF3' : '' }\"\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'templateCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">Status</th>\r\n                <th></th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              <tr *ngFor=\"let fixture of fixturesList\">\r\n                <td style=\"max-width: 300px\">\r\n                  <div class=\"d-flex align-items-center\">\r\n                    <!-- <div class=\"thumbnail\"></div> -->\r\n                    <a\r\n                      [routerLink]=\"['/manage/planogram/create-library-fixture']\"\r\n                      [queryParams]=\"{ fixtureId: fixture.id }\"\r\n                      class=\"text-decoration-underline ellipsis\"\r\n                      [ngbTooltip]=\"fixture.name + ' - ' + fixture.width + 'ft'\"\r\n                    >\r\n                      {{ fixture.name }} - {{ fixture.width }}ft\r\n                    </a>\r\n                  </div>\r\n                </td>\r\n                <td>{{ fixture.type | titlecase }}</td>\r\n                <td>\r\n                  <div *ngIf=\"fixture.country?.length; else noCountry\" class=\"country-chip-list\">\r\n                    <span class=\"country-chip\" *ngFor=\"let c of fixture.country\">{{ c }}</span>\r\n                  </div>\r\n                  <ng-template #noCountry>-</ng-template>\r\n                </td>\r\n                <td class=\"text-center\">{{ fixture.width }}ft</td>\r\n                <td class=\"text-center\">{{ fixture.height }}ft</td>\r\n                <td class=\"text-center\">{{ fixture.partitions }}</td>\r\n                <td class=\"text-center\">{{ fixture.templatesTagged }}</td>\r\n                <td class=\"text-center\">\r\n                  <div class=\"badge\" [ngClass]=\"fixture.status\" placement=\"start\" [ngbTooltip]=\"getTooltipText(fixture.status)\">\r\n                    {{ fixture.status | titlecase }}\r\n                  </div>\r\n                </td>\r\n                <td>\r\n                  <div class=\"dropdown\">\r\n                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li>\r\n                        <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(fixture.id, fixture.templatesTagged)\"> Edit </a>\r\n                      </li>\r\n                      <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(fixture.id)\">Duplicate</a></li>\r\n                      <li>\r\n                        <a\r\n                          class=\"dropdown-item cursor-pointer text-danger\"\r\n                          (click)=\"onDelete(fixture.id, fixture.templatesTagged)\"\r\n                        >\r\n                          Delete\r\n                        </a>\r\n                      </li>\r\n                    </ul>\r\n                  </div>\r\n                </td>\r\n              </tr>\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n      </section>\r\n\r\n      <!-- Fixture grid view -->\r\n      <ng-template #gridView>\r\n        <section id=\"grid-view\" class=\"table-responsive\">\r\n          <div class=\"row gx-6 gy-4 m-0\">\r\n            <div class=\"col-md-4\" *ngFor=\"let fixture of fixturesList\">\r\n              <div class=\"card\" (click)=\"onClickCard($event, fixture)\">\r\n                <div class=\"card-img\">\r\n                  <div class=\"card-action dropdown\" (click)=\"$event.stopPropagation()\">\r\n                    <button class=\"btn btn-light\" style=\"padding: 12px 21px !important\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n                        <path\r\n                          d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n                          stroke=\"#101828\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n                          stroke=\"#101828\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n                          stroke=\"#101828\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                      </svg>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li>\r\n                        <a\r\n                          class=\"dropdown-item cursor-pointer\"\r\n                          (click)=\"onEdit(fixture.id, fixture.templatesTagged); $event.stopPropagation()\"\r\n                        >\r\n                          Edit\r\n                        </a>\r\n                      </li>\r\n                      <li>\r\n                        <a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(fixture.id); $event.stopPropagation()\">\r\n                          Duplicate\r\n                        </a>\r\n                      </li>\r\n                      <li>\r\n                        <a\r\n                          class=\"dropdown-item cursor-pointer text-danger\"\r\n                          (click)=\"onDelete(fixture.id, fixture.templatesTagged); $event.stopPropagation()\"\r\n                        >\r\n                          Delete\r\n                        </a>\r\n                      </li>\r\n                    </ul>\r\n                  </div>\r\n                </div>\r\n                <div class=\"d-flex justify-content-between align-items-center\">\r\n                  <h3 class=\"ellipsis\" [ngbTooltip]=\"fixture.name + ' - ' + fixture.width + 'ft'\">\r\n                    {{ fixture.name }}\r\n                  </h3>\r\n                  <div class=\"badge\" [ngClass]=\"fixture.status\" placement=\"start\" [ngbTooltip]=\"getTooltipText(fixture.status)\">\r\n                    {{ fixture.status | titlecase }}\r\n                  </div>\r\n                </div>\r\n                <div class=\"card-tagline\">\r\n                  {{ fixture.width }}ft x {{ fixture.height }}ft <span>&#8226;</span> {{ fixture.partitions }}\r\n                  <span>&#8226;</span>\r\n                  {{ fixture.type }}\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </section>\r\n      </ng-template>\r\n\r\n      <!-- Pagination -->\r\n      <lib-pagination\r\n        class=\"text-start\"\r\n        [itemsPerPage]=\"limit\"\r\n        [currentPage]=\"offset\"\r\n        [totalItems]=\"totalItems\"\r\n        [paginationSizes]=\"paginationSizes\"\r\n        [pageSize]=\"paginationSize()\"\r\n        (pageChange)=\"onPageChange($event)\"\r\n        (pageSizeChange)=\"onPageSizeChange($event)\"\r\n      ></lib-pagination>\r\n    </div>\r\n  </ng-template>\r\n</section>\r\n\r\n<ng-template #verticalDots>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n    <path\r\n      d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n</ng-template>\r\n","import { Component, Input, } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../../../../services/store-builder.service';\r\n\r\nimport * as XLSX from 'xlsx';\r\n@Component({\r\n  selector: 'app-vm-bulk-upload',\r\n  templateUrl: './vm-bulk-upload.component.html',\r\n  styleUrl: './vm-bulk-upload.component.scss'\r\n})\r\nexport class VMBulkUploadComponent {\r\n  @Input() clientId: string;\r\n  @Input() totalItemCount: number;\r\n\r\n  viewStatus = 'start'; // 'error' , 'action' , 'start'\r\n\r\n  bulkActionForm: FormGroup;\r\n\r\n  processedFileInfo: {\r\n    totalRows: number,\r\n    errorRows: number,\r\n    missingFields: string[],\r\n    invalidFields: string[],\r\n    deletedVmIds?: string[],\r\n    deletedRows?: number,\r\n    updateRows?: number,\r\n    newRows?: number,\r\n    allFixtures?: any[]\r\n  };\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private fb: FormBuilder,\r\n  ) {\r\n    this.bulkActionForm = this.fb.group({\r\n      newVmStatus: ['draft'],    // or 'complete'\r\n      updateVmStatus: ['draft']  // or 'complete'\r\n    });\r\n\r\n  }\r\n\r\n  downloadEmptyVmTemplate(): void {\r\n    this.exportVmList(false);\r\n  }\r\n\r\n  downloadVmTemplateWithData(): void {\r\n    this.exportVmList(true);\r\n  }\r\n\r\n  exportVmList(withRecords: boolean) {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        status: [],\r\n        type: [],\r\n        brand: [],\r\n        category: []\r\n      },\r\n      export: true,\r\n      emptyDownload: !withRecords\r\n    }\r\n\r\n    this.storeBuilderService.getVmLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'VM Libraries')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ exportVmList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  getAllVmList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: []\r\n      },\r\n      export: false,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.storeBuilderService.getVmLibraryList(payload).subscribe({\r\n      next: (res: any) => {\r\n        let result = res?.data?.data ?? []\r\n\r\n        let transformedData = this.transformOriginalData(result);\r\n        const differenceCounts = this.countVmDifferences(transformedData, this.processedFileInfo.allFixtures ?? []);\r\n\r\n        this.processedFileInfo.deletedRows = differenceCounts.deletedVmCount;\r\n        this.processedFileInfo.updateRows = differenceCounts.updatedVmCount;\r\n        this.processedFileInfo.newRows = differenceCounts.newVmCount;\r\n        this.processedFileInfo.deletedVmIds = differenceCounts.deletedVmIds;\r\n\r\n        if (this.processedFileInfo.newRows || this.processedFileInfo.updateRows || this.processedFileInfo.deletedRows) {\r\n          this.viewStatus = 'action';\r\n        } else {\r\n          this.toast.getPrimaryToast(\"The file either empty or you made no changes in it.\")\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getAllVmList [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  transformOriginalData(apiResponse: any): any[] {\r\n    let result: any[] = [];\r\n    for (let i = 0; i < apiResponse.length; i++) {\r\n      let item = apiResponse[i]\r\n\r\n      result.push({\r\n        \"VM Lib Code\": item.vmLibCode,\r\n        \"VM Name\": item.vmName,\r\n        \"VM Type\": item.vmType,\r\n        \"VM Brand\": item.vmBrand,\r\n        \"VM SubBrand\": item.vmSubBrand,\r\n        \"VM Category\": item.vmCategory,\r\n        \"VM SubCategory\": item.vmSubCategory,\r\n        \"VM Height\": item.vmHeight?.value,\r\n        \"VM Width\": item.vmWidth?.value,\r\n        \"VM ImageUrl\": item.vmImageUrl,\r\n        \"isDoubleSided\": item.isDoubleSided,\r\n        \"Unit\": item.vmHeight?.unit || item.vmWidth?.unit,\r\n        \"id\": item._id\r\n      })\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  countVmDifferences(originalData: any[], modifiedData: any[]): {\r\n    newVmCount: number;\r\n    deletedVmCount: number;\r\n    updatedVmCount: number;\r\n    deletedVmIds: string[]; // This will now contain VM Lib Codes if available, or a unique identifier\r\n  } {\r\n    const newVMs: any[] = [];\r\n    const deletedVMs: any[] = [];\r\n    const updatedVMs: { original: any; modified: any; changes: Record<string, [any, any]> }[] = [];\r\n\r\n    const identifyVM = (vm: any) => {\r\n      if (vm['VM Lib Code'] && String(vm['VM Lib Code']).trim() !== '') {\r\n        return String(vm['VM Lib Code']).trim();\r\n      }\r\n      return `NEW_VM_${String(vm['VM Name']).trim()}`;\r\n    };\r\n\r\n    const originalVmMap = new Map<string, any>();\r\n    originalData.forEach(vm => {\r\n      const id = identifyVM(vm);\r\n      if (originalVmMap.has(id)) {\r\n        console.warn(`Duplicate VM identifier found in original data: ${id}`);\r\n      }\r\n      originalVmMap.set(id, vm);\r\n    });\r\n\r\n    const modifiedVmMap = new Map<string, any>();\r\n    modifiedData.forEach(vm => {\r\n      const id = identifyVM(vm);\r\n      if (modifiedVmMap.has(id)) {\r\n        console.warn(`Duplicate VM identifier found in modified data: ${id}`);\r\n      }\r\n      modifiedVmMap.set(id, vm);\r\n    });\r\n\r\n    // Identify new VMs\r\n    modifiedData.forEach(modifiedVM => {\r\n      const id = identifyVM(modifiedVM);\r\n      if (!originalVmMap.has(id)) {\r\n        newVMs.push(modifiedVM);\r\n      }\r\n    });\r\n\r\n    // Identify deleted VMs\r\n    originalData.forEach(originalVM => {\r\n      const id = identifyVM(originalVM);\r\n      if (!modifiedVmMap.has(id)) {\r\n        deletedVMs.push(originalVM);\r\n      }\r\n    });\r\n\r\n    // Identify updated VMs\r\n    modifiedData.forEach(modifiedVM => {\r\n      const id = identifyVM(modifiedVM);\r\n      const originalVM = originalVmMap.get(id);\r\n\r\n      if (originalVM) {\r\n        const changes: Record<string, [any, any]> = {};\r\n        // Iterate over all possible headers to find changes\r\n        const allHeaders = new Set([...Object.keys(originalVM), ...Object.keys(modifiedVM)]);\r\n\r\n        allHeaders.forEach(key => {\r\n          // Exclude 'VM Lib Code' from being a \"change\" if it's new/empty, as it's used for identification\r\n          // We compare all other fields\r\n          if (key === 'VM Lib Code' && String(originalVM[key] || '').trim() === '' && String(modifiedVM[key] || '').trim() === '') {\r\n            // If both are empty, no change to report for Lib Code\r\n            return;\r\n          }\r\n\r\n          const originalValue = originalVM[key];\r\n          const modifiedValue = modifiedVM[key];\r\n\r\n          if (String(originalValue || '') !== String(modifiedValue || '')) {\r\n            changes[key] = [originalValue, modifiedValue];\r\n          }\r\n        });\r\n\r\n        if (Object.keys(changes).length > 0) {\r\n          updatedVMs.push({ original: originalVM, modified: modifiedVM, changes });\r\n        }\r\n      }\r\n    });\r\n\r\n    return {\r\n      newVmCount: newVMs.length,\r\n      deletedVmCount: deletedVMs.length,\r\n      updatedVmCount: updatedVMs.length,\r\n      // Return VM Lib Code for deleted items if available, otherwise a unique identifier\r\n      deletedVmIds: deletedVMs.map(vm => vm['VM Lib Code'] && String(vm['VM Lib Code']).trim() !== '' ? String(vm['VM Lib Code']).trim() : `Deleted_VM_${String(vm['VM Name']).trim()}`)\r\n    };\r\n  }\r\n\r\n\r\n  onFileUpload(event: any) {\r\n    const target: DataTransfer = <DataTransfer>event.target;\r\n    let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);\r\n\r\n    if (isExcelFile) {\r\n      const reader: FileReader = new FileReader();\r\n      reader.readAsBinaryString(target.files[0]);\r\n\r\n      reader.onload = (e: any) => {\r\n        const bstr: string = e.target.result;\r\n        const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });\r\n        const wsname: string = wb.SheetNames[0];\r\n        const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n        const rawData: any[][] = XLSX.utils.sheet_to_json(ws, { header: 1 });\r\n\r\n        // Filter out empty rows (e.g. entire row is null/empty strings)\r\n        const data = rawData.filter(row =>\r\n          row.some(cell => cell !== null && cell !== undefined && cell !== '')\r\n        );\r\n\r\n        this.processedFileInfo = this.validateVmExcelData(data);\r\n\r\n        if (this.processedFileInfo.invalidFields.length || this.processedFileInfo.missingFields.length) {\r\n          this.viewStatus = 'error';\r\n        } else {\r\n          this.getAllVmList();\r\n        }\r\n      };\r\n    }\r\n  }\r\n\r\n  validateVmExcelData(rawData: any[][]) {\r\n    const headers = rawData[0];\r\n    const data = rawData.slice(1).filter(row =>\r\n      row.some(cell => cell !== null && cell !== undefined && cell !== '')\r\n    );\r\n\r\n    const missingFields: string[] = [];\r\n    const invalidFormats: string[] = [];\r\n    const newVms: string[] = [];\r\n    const errorRows = new Set<number>();\r\n    const allVms: Record<string, any>[] = [];\r\n\r\n    const vmNameSet = new Set<string>(); // To check for unique VM Name\r\n\r\n    const allowedUnits = ['mm', 'cm', 'inch', 'ft']; // Allowed values for 'Unit'\r\n\r\n    const isValidationEnabled = {\r\n      checkNewVmByEmptyCode: true,\r\n      checkUniqueVmName: true,\r\n      checkNonEmptyNonZero: true,\r\n      checkUnitDropdownValues: true,\r\n      checkIsDoubleSidedBoolean: true,\r\n    };\r\n\r\n    data.forEach((row, rowIndex) => {\r\n      const excelRow = rowIndex + 2;\r\n      let hasError = false;\r\n      const rowData: Record<string, any> = {};\r\n      headers.forEach((header, colIndex) => {\r\n        rowData[header] = row[colIndex];\r\n      });\r\n\r\n      allVms.push(rowData);\r\n\r\n      headers.forEach((header, colIndex) => {\r\n        const cellValue = row[colIndex];\r\n        const cellRef = `${this.getExcelColName(colIndex)}${excelRow}`;\r\n\r\n        // 1. Check for missing (Existing) - 'VM SubBrand', 'VM Category', 'VM SubCategory', 'VM Lib Code', and 'isDoubleSided' can be empty\r\n        if (cellValue === null || cellValue === undefined || cellValue === '') {\r\n          if (header !== 'VM SubBrand' && header !== 'VM Category' && header !== 'VM SubCategory' && header !== 'VM Lib Code' && header !== 'isDoubleSided' && header !== 'VM ImageUrl') {\r\n            missingFields.push(cellRef);\r\n            hasError = true;\r\n          }\r\n          // 3. VM Lib Code can be empty, if it is empty then that is considered as new vm.\r\n          if (header === 'VM Lib Code' && isValidationEnabled.checkNewVmByEmptyCode && Object.values(rowData).some(val => val !== null && val !== undefined && val !== '' && val !== rowData['VM Lib Code'])) {\r\n            newVms.push(cellRef);\r\n          } else if (header === 'VM Lib Code' && !isValidationEnabled.checkNewVmByEmptyCode) {\r\n            missingFields.push(cellRef);\r\n            hasError = true;\r\n          }\r\n          return; // Skip further validation for this cell if it's empty\r\n        }\r\n\r\n        // Check for non-zero for numeric fields that cannot be zero\r\n        if (isValidationEnabled.checkNonEmptyNonZero) {\r\n          // Updated header names: VM Height and VM Width\r\n          if (['VM Height', 'VM Width'].includes(header)) {\r\n            const numValue = Number(cellValue);\r\n            if (isNaN(numValue) || numValue <= 0) {\r\n              invalidFormats.push(cellRef);\r\n              hasError = true;\r\n            }\r\n          }\r\n        }\r\n\r\n        // New: 2. 'Unit' is a dropdown with 'mm', 'cm', 'inch', 'ft' options.\r\n        if (isValidationEnabled.checkUnitDropdownValues && header === 'Unit' && cellValue) {\r\n          if (!allowedUnits.includes(String(cellValue).toLowerCase())) {\r\n            invalidFormats.push(cellRef);\r\n            hasError = true;\r\n          }\r\n        }\r\n\r\n        // New: 3. 'isDoubleSided' should be true or false (if provided)\r\n        if (isValidationEnabled.checkIsDoubleSidedBoolean && header === 'isDoubleSided' && cellValue) {\r\n          const lowerCaseValue = String(cellValue).toLowerCase();\r\n          if (lowerCaseValue !== 'true' && lowerCaseValue !== 'false') {\r\n            invalidFormats.push(cellRef);\r\n            hasError = true;\r\n          }\r\n        }\r\n      });\r\n\r\n      // 2. VM Name should be unique\r\n      if (isValidationEnabled.checkUniqueVmName && rowData['VM Name']) {\r\n        const vmName = String(rowData['VM Name']).trim();\r\n        if (vmNameSet.has(vmName)) {\r\n          invalidFormats.push(`${this.getExcelColName(headers.indexOf('VM Name'))}${excelRow}`);\r\n          hasError = true;\r\n        } else {\r\n          vmNameSet.add(vmName);\r\n        }\r\n      }\r\n\r\n      if (hasError) {\r\n        errorRows.add(excelRow);\r\n      }\r\n    });\r\n\r\n    return {\r\n      totalRows: data.length,\r\n      newVmCount: newVms.length,\r\n      errorRows: errorRows.size,\r\n      missingFields: [...new Set(missingFields)],\r\n      invalidFields: [...new Set(invalidFormats)],\r\n      allVms,\r\n    };\r\n  }\r\n\r\n  // Helper functions remain the same\r\n  getCellValue(data: any[][], rowIndex: number, headers: string[], headerName: string): any {\r\n    const colIndex = headers.indexOf(headerName);\r\n    return colIndex > -1 && data[rowIndex] ? data[rowIndex][colIndex] : undefined;\r\n  }\r\n\r\n  rowDataByIndex(data: any[][], rowIndex: number, headers: string[], header: string): any {\r\n    const colIndex = headers.indexOf(header);\r\n    return colIndex !== -1 ? data[rowIndex][colIndex] : undefined;\r\n  }\r\n\r\n  getExcelColName(n: number): string {\r\n    let result = '';\r\n    while (n >= 0) {\r\n      result = String.fromCharCode((n % 26) + 65) + result;\r\n      n = Math.floor(n / 26) - 1;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  closeModal(): void {\r\n    this.activeModal.close();\r\n  }\r\n\r\n  onClickProceed() {\r\n    let vmData = this.processedFileInfo.allFixtures?.map((item) => {\r\n\r\n      return {\r\n        \"vmName\": item['Fixture Code'],\r\n        \"vmType\": item['Fixture Name'],\r\n        \"vmBrand\": item['Fixture Type'],\r\n        \"vmSubBrand\": item['Fixture Height(ft)'],\r\n        \"vmCategory\": item['Fixture Width(ft)'],\r\n        \"vmSubCategory\": item['Fixture Header Height(ft)'],\r\n        \"vmHeight\": item['Fixture Footer Height(ft)'],\r\n        \"vmWidth\": item['Shelf Number'],\r\n        \"vmImageUrl\": item['Shelf Type'],\r\n        \"vmLibCode\": item['Tray Rows'],\r\n        \"isEdit\": item['Product Per Shelf/Tray'],\r\n      }\r\n    })\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      vmData,\r\n      ...this.bulkActionForm.value,\r\n      deleteVmList: this.processedFileInfo.deletedVmIds\r\n    }\r\n\r\n    this.storeBuilderService.bulkActionFixtureLibrary(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.status === 'success') {\r\n          this.toast.getSuccessToast(\"Bulk action completed successfully\");\r\n          this.activeModal.close(\"refresh\");\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ onClickProceed Bulk Action [ERR]: ', err)\r\n        this.toast.getErrorToast(err);\r\n      }\r\n    })\r\n  }\r\n}\r\n","<div class=\"modal-container\">\r\n  <h3>Visual Merchandise library (Bulk action)</h3>\r\n\r\n  <div *ngIf=\"viewStatus === 'start'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"startContainer\"></ng-container>\r\n  </div>\r\n  <div *ngIf=\"viewStatus === 'error'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"errorContainer\"></ng-container>\r\n  </div>\r\n  <div *ngIf=\"viewStatus === 'action'\" class=\"wrapper\">\r\n    <ng-container *ngTemplateOutlet=\"actionContainer\"></ng-container>\r\n  </div>\r\n\r\n  <div class=\"modal-actions\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeModal()\">Close</button>\r\n    <button *ngIf=\"viewStatus === 'action'\" type=\"button\" class=\"btn btn-primary\" (click)=\"onClickProceed()\">Proceed</button>\r\n    <button *ngIf=\"viewStatus === 'error'\" type=\"button\" class=\"btn btn-danger\" (click)=\"fileUpload.click()\">ReUpload</button>\r\n  </div>\r\n</div>\r\n\r\n<input style=\"display: none\" type=\"file\" #fileUpload id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n<ng-template #startContainer>\r\n  <svg\r\n    style=\"width: 80px; height: 80px\"\r\n    width=\"56\"\r\n    height=\"56\"\r\n    viewBox=\"0 0 95 94\"\r\n    fill=\"none\"\r\n    xmlns=\"http://www.w3.org/2000/svg\"\r\n    class=\"mb-4\"\r\n  >\r\n    <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n    <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n    <path\r\n      d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n      stroke=\"#00A3FF\"\r\n      stroke-width=\"3.33333\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n\r\n  <h3>Bulk Upload VM</h3>\r\n\r\n  <div class=\"upload-description\">\r\n    <div class=\"upload-steps\">\r\n      <p class=\"card-description mb-0\">Step1 - Download template</p>\r\n      <a class=\"download-link fw-medium d-block\" (click)=\"downloadEmptyVmTemplate()\">Download empty template</a>\r\n      <!-- @if(this.totalItemCount){\r\n      <a class=\"download-link fw-medium d-block\" (click)=\"downloadVmTemplateWithData()\"\r\n        >Download template with {{ this.totalItemCount }} record</a\r\n      >\r\n      } -->\r\n      <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n      <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n    </div>\r\n\r\n    <button class=\"btn btn-primary d-inline-flex align-items-center w-fit\" (click)=\"fileUpload.click()\">\r\n      <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n          stroke=\"currentColor\"\r\n          stroke-width=\"1.67\"\r\n          stroke-linecap=\"round\"\r\n          stroke-linejoin=\"round\"\r\n        />\r\n      </svg>\r\n      Upload\r\n    </button>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #actionContainer>\r\n  <div class=\"d-flex w-100 gap-2 mb-5\">\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.totalRows }}</h3>\r\n      <p>Total Vm</p>\r\n    </div>\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.errorRows }}</h3>\r\n      <p>Errors</p>\r\n    </div>\r\n  </div>\r\n\r\n  <form [formGroup]=\"bulkActionForm\" class=\"w-100\">\r\n    <!-- FOR Empty Template (Creation mode) -->\r\n    @if(!processedFileInfo.updateRows && !processedFileInfo.deletedRows){\r\n    <div class=\"d-flex flex-column justify-content-start align-items-start w-100\">\r\n      <p class=\"fs-4\">You're about to create {{ processedFileInfo.newRows }} VM. Are you sure want to proceed?</p>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newVmStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"complete\" value=\"complete\" />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newVmStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save all as draft </label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    }@else {\r\n    <!-- FOR Template with fields (Create and Update mode) -->\r\n    <div class=\"d-flex flex-column justify-content-start align-items-start w-100\">\r\n      <h4>You're about to make the following bulk actions.</h4>\r\n      @if(processedFileInfo.newRows){\r\n      <p class=\"fs-4 mt-5\">You have created {{ processedFileInfo.newRows }} new VMs.</p>\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newVmStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"complete\" value=\"complete\" />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"newVmStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save all as draft </label>\r\n        </div>\r\n      </div>\r\n      } @if(processedFileInfo.updateRows){\r\n      <p class=\"fs-4 mt-5\">You have made {{ processedFileInfo.updateRows }} updates in the VMs.</p>\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input\r\n            formControlName=\"updateVmStatus\"\r\n            class=\"form-check-input me-1\"\r\n            type=\"radio\"\r\n            id=\"complete\"\r\n            value=\"complete\"\r\n          />\r\n          <label class=\"me-2 fw-medium\" for=\"complete\"> Mark all as completed</label>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <input formControlName=\"updateVmStatus\" class=\"form-check-input me-1\" type=\"radio\" id=\"draft\" value=\"draft\" />\r\n          <label class=\"me-2 fw-medium\" for=\"draft\"> Save as draft </label>\r\n        </div>\r\n      </div>\r\n      } @if(processedFileInfo.deletedRows){\r\n      <p class=\"fs-4 mt-5\">You have deleted {{ processedFileInfo.deletedRows }} vm.</p>\r\n      }\r\n    </div>\r\n    }\r\n  </form>\r\n</ng-template>\r\n\r\n<ng-template #errorContainer>\r\n  <div class=\"d-flex w-100 gap-2 mb-5\">\r\n    <div class=\"col info-card\">\r\n      <h3>{{ processedFileInfo.totalRows }}</h3>\r\n      <p>Total VM</p>\r\n    </div>\r\n\r\n    <div class=\"col info-card error\">\r\n      <h3>{{ processedFileInfo.errorRows }}</h3>\r\n      <p>Errors</p>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"w-100\">\r\n    <p class=\"fs-4 my-5\">Unable to proceed due to the following errors</p>\r\n\r\n    <div class=\"w-100 info-card error\">\r\n      @if(processedFileInfo.missingFields.length){\r\n      <p\r\n        [ngClass]=\"{\r\n          'mb-4': processedFileInfo.invalidFields.length\r\n        }\"\r\n      >\r\n        Missing mandatory fields -\r\n\r\n        <span *ngFor=\"let item of processedFileInfo.missingFields; let i = index\">\r\n          {{ item }} <span *ngIf=\"i != processedFileInfo.missingFields.length - 1\">, </span>\r\n        </span>\r\n      </p>\r\n      } @if(processedFileInfo.invalidFields.length){\r\n      <p>\r\n        Invalid formats -\r\n        <span *ngFor=\"let item of processedFileInfo.invalidFields; let i = index\">\r\n          {{ item }} <span *ngIf=\"i != processedFileInfo.invalidFields.length - 1\">, </span>\r\n        </span>\r\n      </p>\r\n      }\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { debounceTime, distinctUntilChanged, firstValueFrom, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { VMBulkUploadComponent } from './popups/vm-bulk-upload/vm-bulk-upload.component';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { VmLibraryList, VMTypeDetails } from '../../../interfaces/vm-library.interface';\r\nimport { DeleteConfirmationComponent } from '../../popups/delete-confirmation/delete-confirmation.component';\r\nimport { PlanoDataService } from '../../../services/plano-data.service';\r\nimport { CannotPerformComponent } from '../../popups/cannot-perform/cannot-perform.component';\r\nimport { getQueryParamNumber, getQueryParamString } from '../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: 'lib-vm-library',\r\n  templateUrl: './vm-library.component.html',\r\n  styleUrl: './vm-library.component.scss'\r\n})\r\n\r\nexport class VmLibraryComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  vmList: VmLibraryList[] = [];\r\n\r\n  viewMode: 'list' | 'grid' | string = 'list';\r\n\r\n  sortedColumn: string = '';\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = '';\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  filterObject = [\r\n    {\r\n      Description: 'Status',\r\n      Issues: [\r\n        { text: \"Active\", id: 'active' },\r\n        { text: \"Inactive\", id: 'inactive' },\r\n        { text: \"Draft\", id: 'draft' },\r\n      ],\r\n    }\r\n  ]\r\n\r\n  appliedFilters = {\r\n    status: [],\r\n    brand: [],\r\n    type: [],\r\n    // category: [],\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n\r\n  imgCDN: string;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private libSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private planoDataService: PlanoDataService,\r\n    private gs: GlobalStateService,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n  ) { }\r\n\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => this.imgCDN = env.planogramCDN)\r\n\r\n    this.gs.dataRangeValue.pipe(\r\n      takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n      debounceTime(200), // To avoid immediate frequent calls.\r\n      distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n    ).subscribe((data: any) => {\r\n      this.isPageLoading = true;\r\n\r\n      if (data?.client) {\r\n        this.clientId = data?.client;\r\n      } else {\r\n        let headerData = JSON.parse(localStorage.getItem('header-filters') as string);\r\n        this.clientId = headerData?.client;\r\n      }\r\n\r\n      this.getBrandsList();\r\n      this.getVmTypes();\r\n\r\n      this.route.queryParamMap.pipe(takeUntil(this.destroy$)).subscribe(params => {\r\n        this.viewMode = getQueryParamString({\r\n          params,\r\n          key: 'view',\r\n          fallback: 'list',\r\n          allowed: ['grid', 'list'],\r\n        });\r\n\r\n        this.searchTerm = getQueryParamString({\r\n          params,\r\n          key: 'search',\r\n          fallback: '',\r\n        });\r\n        this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n\r\n        this.limit = getQueryParamNumber({\r\n          params,\r\n          key: 'limit',\r\n          fallback: 10,\r\n          min: 1,\r\n          max: 30\r\n        });\r\n\r\n        this.offset = getQueryParamNumber({\r\n          params,\r\n          key: 'offset',\r\n          fallback: 0,\r\n          min: 0\r\n        });\r\n\r\n        this.getVmsList();\r\n      });\r\n    })\r\n  }\r\n\r\n  private getBrandsList() {\r\n    this.planoDataService.brandsList.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      const brandFilterObj = this.filterObject.find(f => f.Description === 'Brands');\r\n\r\n      if (brandFilterObj) {\r\n        brandFilterObj.Issues = e.map(b => { return { text: b.brandName ?? '', id: b.brandName ?? '' }; });\r\n      } else {\r\n        this.filterObject.push({\r\n          Description: 'Brands',\r\n          Issues: e.map(b => { return { text: b.brandName ?? '', id: b.brandName ?? '' }; })\r\n        });\r\n      }\r\n    });\r\n    this.planoDataService.fetchBrandsList(this.clientId);\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Visual Merchandise Library\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      { title: \"Planogram\", path: \"/manage/planogram/manage-planograms\", isActive: false, isSeparator: false },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  getVmsList() {\r\n    this.libSub?.unsubscribe() // Cancel previous request.\r\n\r\n    this.isPageLoading = true;\r\n    this.vmList = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: false,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.libSub = this.storeBuilderService.getVmLibraryList(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.totalItems = res?.data?.count;\r\n          this.vmList = res?.data?.data.map((item: any) => {\r\n            return {\r\n              name: item.vmName,\r\n              brand: item.vmBrand,\r\n              type: item.vmType,\r\n              width: item.vmWidth,\r\n              height: item.vmHeight,\r\n              placement: item.isDoubleSided,\r\n              noOfAssigned: item.templateId.length,\r\n              status: item.status,\r\n              imgUrl: `${this.imgCDN}${item.vmImageUrl}`,\r\n              id: item._id\r\n            }\r\n          })\r\n          if (this.totalItems < 10) {\r\n            this.paginationSizes = [this.totalItems]\r\n          } else {\r\n            this.paginationSizes = [10, 20, 30]\r\n          }\r\n        }\r\n        this.isPageLoading = false;\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ getVmsList [ERR]: ', err)\r\n        this.isPageLoading = false;\r\n      }\r\n    })\r\n\r\n    this.totalItems = this.vmList.length;\r\n  }\r\n\r\n  async getVmTypes() {\r\n    try {\r\n      const res: any = await firstValueFrom(this.storeBuilderService.getVmTypesList(this.clientId));\r\n      if (res?.data) {\r\n\r\n        const vmTypeFilterObj = this.filterObject.find(f => f.Description === 'VM Type')\r\n\r\n        if (vmTypeFilterObj) {\r\n          vmTypeFilterObj.Issues = res.data.map((b: VMTypeDetails) => { return { text: b.vmType ?? '', id: b.vmType ?? '' } });\r\n        } else {\r\n          this.filterObject.push({\r\n            Description: 'VM Type',\r\n            Issues: res.data.map((b: VMTypeDetails) => { return { text: b.vmType ?? '', id: b.vmType ?? '' } })\r\n          })\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmTypes [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  downloadVMTemplate() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      searchValue: '',\r\n      filter: {\r\n        type: [],\r\n        status: [],\r\n        size: []\r\n      },\r\n      export: true,\r\n      emptyDownload: true\r\n    }\r\n\r\n    this.storeBuilderService.getVmLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'Vm Libraries')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ vmLibraryListToExport [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  exportVMList() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: 10000,\r\n      offset: 0,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: true,\r\n      emptyDownload: false\r\n    }\r\n\r\n    this.storeBuilderService.getVmLibraryListToExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, 'VMs list')\r\n      },\r\n      error: (err) => {\r\n        console.log('@@ vmLibraryListToExport [ERR]: ', err)\r\n      }\r\n    })\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(VMBulkUploadComponent, { centered: true });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.componentInstance.totalItemCount = this.totalItems;\r\n    modelRef.result.then((result) => {\r\n      if (result === 'refresh') {\r\n        this.getVmsList()\r\n      }\r\n    })\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = '';\r\n    this.sortOrder = 1\r\n    this.offset = 0;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getVmsList()\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    const status = event.find((e: any) => e.Description == 'Status')?.Issues?.map((i: any) => i?.id);\r\n    const type = event.find((e: any) => e.Description == 'VM Type')?.Issues?.map((i: any) => i?.id);\r\n    const brand = event.find((e: any) => e.Description == 'Brands')?.Issues?.map((i: any) => i?.id);\r\n    // const category = event[2]?.Issues?.map((i: any) => i?.id);\r\n\r\n    this.isFilterApplied = (status || type || brand);\r\n    this.appliedFilters = { type, status, brand };\r\n    this.offset = 1;\r\n    this.getVmsList();\r\n  }\r\n\r\n  toggleViewMode(mode: 'list' | 'grid') {\r\n    this.viewMode = mode;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number,) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  getTooltipText(status: string): string {\r\n    switch (status) {\r\n      case 'active':\r\n        return 'This vm is active to templates.';\r\n      case 'inactive':\r\n        return 'This vm is not active to templates.';\r\n      case 'draft':\r\n        return 'This vm is in draft';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  onDuplicate(vmId: string) {\r\n    this.storeBuilderService.duplicateVmLibrary({ vmId: vmId }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.data.message);\r\n          this.getVmsList();\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to duplicate VM');\r\n        console.log(\"@@ ~ duplicateVmLibrary [err]:\", err);\r\n      }\r\n    })\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Delete VM';\r\n    modelRef.componentInstance.description = 'Are you sure you want to delete this vm ?';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok')\r\n  }\r\n\r\n  async onDelete(vmId: string, usageCount: number = 0) {\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t delete VM!`;\r\n      modelRef.componentInstance.description = `Since this VM is live in \"${usageCount} templates,\" deleting is not allowed.`;\r\n      return\r\n    };\r\n\r\n    if (!await this.confirmDeletion()) return;\r\n\r\n    this.storeBuilderService.deleteVmLibrary({ vmId: vmId }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.message);\r\n          this.getVmsList();\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to delete VM');\r\n        console.log(\"@@ ~ deleteVmLibrary [err]:\", err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onImgError(event: Event) {\r\n    const target = event.target as HTMLImageElement;\r\n    target.src = 'assets/tango/Images/vm-placeholder.png';\r\n  }\r\n\r\n  onEdit(vmId: string, usageCount: number = 0) {\r\n    if (usageCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t edit VM!`;\r\n      modelRef.componentInstance.description = `Since this VM is live in \"${usageCount} templates,\" editing is not allowed.`;\r\n      return\r\n    };\r\n    this.router.navigate(['/manage/planogram/create-library-vm'], { queryParams: { vmId: vmId, isEdit: true } });\r\n  }\r\n\r\n  onClickCard(event: any, vm: VmLibraryList) {\r\n    this.router.navigate(['/manage/planogram/create-library-vm'], { queryParams: { vmId: vm.id } });\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { view: this.viewMode, search: this.searchTerm, limit: this.limit, offset: this.offset },\r\n      queryParamsHandling: 'merge',\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.libSub?.unsubscribe()\r\n  }\r\n}\r\n","<section id=\"vm-library\" class=\"content-wrapper\">\r\n  <!-- VM View header -->\r\n  <div\r\n    *ngIf=\"vmList.length !== 0 || searchTerm || isFilterApplied\"\r\n    class=\"d-flex justify-content-between align-items-center mb-5\"\r\n  >\r\n    <div>\r\n      <h4>VM Library Lists</h4>\r\n      <span>{{ totalItems }} - Total VM</span>\r\n    </div>\r\n\r\n    <div class=\"d-flex align-items-center gap-2\">\r\n      <div style=\"position: relative\">\r\n        <input\r\n          type=\"text\"\r\n          [(ngModel)]=\"searchTerm\"\r\n          (change)=\"onSearch()\"\r\n          style=\"padding-left: 3rem; padding-right: 3rem\"\r\n          class=\"form-control\"\r\n          name=\"search\"\r\n          autocomplete=\"off\"\r\n          placeholder=\"Search\"\r\n        />\r\n\r\n        <span class=\"search-icon\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n          </svg>\r\n        </span>\r\n\r\n        <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n          <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n            <g id=\"SVGRepo_iconCarrier\">\r\n              <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <circle\r\n                cx=\"12\"\r\n                cy=\"12\"\r\n                r=\"9\"\r\n                stroke=\"#667085\"\r\n                stroke-width=\"2\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              ></circle>\r\n            </g>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n\r\n      <button\r\n        type=\"button\"\r\n        [routerLink]=\"['/manage/planogram/create-library-vm']\"\r\n        [queryParams]=\"{ isEdit: true }\"\r\n        class=\"btn btn-primary d-inline-flex align-items-center me-2\"\r\n      >\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n          <path\r\n            d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\"\r\n            stroke=\"white\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        <span class=\"ms-2 text-white\">Create </span>\r\n      </button>\r\n\r\n      <!-- <button type=\"button\" (click)=\"openBulkUploadModal()\" class=\"btn btn-outline text-nowrap\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Bulk Upload\r\n      </button> -->\r\n\r\n      <button type=\"button\" [disabled]=\"vmList.length <= 0\" (click)=\"exportVMList()\" class=\"btn btn-outline text-nowrap\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Export\r\n      </button>\r\n\r\n      <lib-filters [dataObject]=\"filterObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div class=\"toggle-button me-2\" [ngClass]=\"{ selected: viewMode === 'list' }\" (click)=\"toggleViewMode('list')\">\r\n          <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M6.24078 4.54639H15.8906M6.24078 9.00017H15.8906M6.24078 13.4539H15.8906M2.5293 4.54639H2.53672M2.5293 9.00017H2.53672M2.5293 13.4539H2.53672\"\r\n              [attr.stroke]=\"viewMode === 'list' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div>\r\n\r\n        <div class=\"toggle-button\" [ngClass]=\"{ selected: viewMode === 'grid' }\" (click)=\"toggleViewMode('grid')\">\r\n          <svg width=\"19\" height=\"18\" viewBox=\"0 0 19 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M7.91886 2.31934H2.72278V7.51541H7.91886V2.31934Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M16.0841 2.31934H10.888V7.51541H16.0841V2.31934Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M16.0841 10.4846H10.888V15.6807H16.0841V10.4846Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M7.91886 10.4846H2.72278V15.6807H7.91886V10.4846Z\"\r\n              [attr.stroke]=\"viewMode === 'grid' ? '#009BF3' : '#344054'\"\r\n              stroke-width=\"1.48756\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div *ngIf=\"isPageLoading; else contentPart\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <ng-template #contentPart>\r\n    <div *ngIf=\"vmList.length === 0\">\r\n      @if(searchTerm || isFilterApplied){\r\n      <div class=\"row\">\r\n        <div class=\"col-lg-12 my-6\">\r\n          <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">No data found</div>\r\n            <div class=\"nodatasubtext\">There is no result for matching filter and search</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      }@else {\r\n      <div class=\"row g-0 py-12\">\r\n        <!-- Single VM Creation -->\r\n        <div class=\"col-md-12 pe-md-3\">\r\n          <div class=\"d-flex flex-column align-items-center p-10\">\r\n            <div class=\"text-center mb-8\">\r\n              <div class=\"mb-5\">\r\n                <svg\r\n                  style=\"width: 80px; height: 80px\"\r\n                  width=\"56\"\r\n                  height=\"56\"\r\n                  viewBox=\"0 0 56 56\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                >\r\n                  <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n                  <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n                  <path\r\n                    d=\"M28 24V32M24 28H32M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\"\r\n                    stroke=\"#00A3FF\"\r\n                    stroke-width=\"2\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n              <h3 class=\"card-title mb-3\">Create a VM manually</h3>\r\n              <p class=\"card-tagline mb-0\">You can create a single VM manually by step by step</p>\r\n            </div>\r\n            <button\r\n              [routerLink]=\"['/manage/planogram/create-library-vm']\"\r\n              [queryParams]=\"{ isEdit: true }\"\r\n              type=\"button\"\r\n              class=\"btn btn-outline d-inline-flex align-items-center\"\r\n            >\r\n              <svg class=\"me-2\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M12 5V19M5 12H19\"\r\n                  stroke=\"currentColor\"\r\n                  stroke-width=\"2\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n              Create Manually\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Bulk VM Creation -->\r\n        <!-- <div class=\"col-md-6 ps-md-3 border-start\">\r\n          <div class=\"d-flex flex-column align-items-center p-10\">\r\n            <div class=\"text-center mb-8\">\r\n              <div class=\"mb-5\">\r\n                <svg\r\n                  style=\"width: 80px; height: 80px\"\r\n                  width=\"56\"\r\n                  height=\"56\"\r\n                  viewBox=\"0 0 95 94\"\r\n                  fill=\"none\"\r\n                  xmlns=\"http://www.w3.org/2000/svg\"\r\n                >\r\n                  <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                  <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                  <path\r\n                    d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n                    stroke=\"#00A3FF\"\r\n                    stroke-width=\"3.33333\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                  />\r\n                </svg>\r\n              </div>\r\n              <h3 class=\"card-title mb-3\">Create VM using excel template</h3>\r\n              <p class=\"card-tagline mb-0\">You can add a single or multiple VM using the template below</p>\r\n            </div>\r\n            <div class=\"d-flex flex-column gap-2 mb-6\" style=\"width: fit-content\">\r\n              <p class=\"card-description mb-0\">\r\n                Step1 - <a class=\"download-link fw-medium\" (click)=\"downloadVMTemplate()\">Download the template here</a>\r\n              </p>\r\n              <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n              <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n            </div>\r\n            <button class=\"btn btn-primary d-inline-flex align-items-center\" (click)=\"openBulkUploadModal()\">\r\n              <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n                  stroke=\"currentColor\"\r\n                  stroke-width=\"1.67\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n              Upload\r\n            </button>\r\n          </div>\r\n        </div> -->\r\n      </div>\r\n      }\r\n    </div>\r\n\r\n    <div *ngIf=\"vmList.length != 0\">\r\n      <!-- VM list view -->\r\n      <section id=\"list-view\" *ngIf=\"viewMode === 'list'; else gridView\">\r\n        <div class=\"table-responsive\">\r\n          <table class=\"w-100 table bottom-border text-nowrap\">\r\n            <thead>\r\n              <tr>\r\n                <th>\r\n                  <span (click)=\"onSortTable('vmName')\" class=\"cursor-pointer\">\r\n                    VM name\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'vmName' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th>\r\n                  <span (click)=\"onSortTable('brand')\" class=\"cursor-pointer\">\r\n                    Brand\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'brand' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'brand' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('vmType')\" class=\"cursor-pointer\">\r\n                    Type\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'vmType' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmType' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('vmWidth')\" class=\"cursor-pointer\">\r\n                    Width\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'vmWidth' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmWidth' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('vmHeight')\" class=\"cursor-pointer\">\r\n                    Height\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'vmHeight' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmHeight' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <!-- <th>\r\n                <span (click)=\"onSortTable('vmPlacement')\" class=\"cursor-pointer\">\r\n                  Placements\r\n                  <i\r\n                  class=\"fa ms-1 mt-1\"\r\n                  [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmPlacement' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                  aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th> -->\r\n                <th class=\"text-center\">\r\n                  <span (click)=\"onSortTable('templateCount')\" class=\"cursor-pointer\">\r\n                    No of assigned\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'templateCount' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'templateCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th class=\"text-center\">Status</th>\r\n                <th></th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              <tr *ngFor=\"let vm of vmList\">\r\n                <td style=\"max-width: 300px\">\r\n                  <div class=\"d-flex align-items-center\">\r\n                    <div class=\"thumbnail\">\r\n                      <img [src]=\"vm.imgUrl\" alt=\"Vm Image\" (error)=\"onImgError($event)\" />\r\n                    </div>\r\n                    <a\r\n                      [routerLink]=\"['/manage/planogram/create-library-vm']\"\r\n                      [queryParams]=\"{ vmId: vm.id }\"\r\n                      class=\"text-decoration-underline ellipsis\"\r\n                      [ngbTooltip]=\"vm.name\"\r\n                    >\r\n                      {{ vm.name }}\r\n                    </a>\r\n                  </div>\r\n                </td>\r\n                <td>{{ vm?.brand ?? \"-\" }}</td>\r\n                <td>{{ vm?.type ?? \"-\" }}</td>\r\n                <td class=\"text-center\">{{ vm.width.value }}{{ vm.width.unit }}</td>\r\n                <td class=\"text-center\">{{ vm.height.value }}{{ vm.height.unit }}</td>\r\n                <!-- <td>{{ vm.placement }}</td> -->\r\n                <td class=\"text-center\">{{ vm.noOfAssigned }}</td>\r\n                <td class=\"text-center\">\r\n                  <div class=\"badge\" [ngClass]=\"vm.status\" placement=\"start\" [ngbTooltip]=\"getTooltipText(vm.status)\">\r\n                    {{ vm.status | titlecase }}\r\n                  </div>\r\n                </td>\r\n                <td>\r\n                  <div class=\"dropdown\">\r\n                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li>\r\n                        <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit(vm.id, vm.noOfAssigned)\"> Edit </a>\r\n                      </li>\r\n                      <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(vm.id)\">Duplicate</a></li>\r\n                      <li>\r\n                        <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete(vm.id, vm.noOfAssigned)\">Delete</a>\r\n                      </li>\r\n                    </ul>\r\n                  </div>\r\n                </td>\r\n              </tr>\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n      </section>\r\n\r\n      <!-- VM grid viw -->\r\n      <ng-template #gridView>\r\n        <section id=\"grid-view\" class=\"table-responsive\">\r\n          <div class=\"row gx-6 gy-4 m-0\">\r\n            <div class=\"col-md-4\" *ngFor=\"let vm of vmList\">\r\n              <div class=\"card\" (click)=\"onClickCard($event, vm)\">\r\n                <div class=\"card-img\">\r\n                  <img [src]=\"vm.imgUrl\" alt=\"Vm Image\" (error)=\"onImgError($event)\" />\r\n                  <div class=\"card-action dropdown\" (click)=\"$event.stopPropagation()\">\r\n                    <button class=\"btn btn-light\" style=\"padding: 12px 21px !important\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li>\r\n                        <a\r\n                          class=\"dropdown-item cursor-pointer\"\r\n                          (click)=\"onEdit(vm.id, vm.noOfAssigned); $event.stopPropagation()\"\r\n                        >\r\n                          Edit\r\n                        </a>\r\n                      </li>\r\n                      <li>\r\n                        <a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate(vm.id); $event.stopPropagation()\">\r\n                          Duplicate\r\n                        </a>\r\n                      </li>\r\n                      <li>\r\n                        <a\r\n                          class=\"dropdown-item cursor-pointer text-danger\"\r\n                          (click)=\"onDelete(vm.id, vm.noOfAssigned); $event.stopPropagation()\"\r\n                        >\r\n                          Delete\r\n                        </a>\r\n                      </li>\r\n                    </ul>\r\n                  </div>\r\n                </div>\r\n                <div class=\"d-flex justify-content-between align-items-center\">\r\n                  <h3 class=\"ellipsis\" [ngbTooltip]=\"vm.name\">\r\n                    {{ vm.name }}\r\n                  </h3>\r\n                  <div class=\"badge\" [ngClass]=\"vm.status\" placement=\"start\" [ngbTooltip]=\"getTooltipText(vm.status)\">\r\n                    {{ vm.status | titlecase }}\r\n                  </div>\r\n                </div>\r\n                <div class=\"card-tagline\">\r\n                  {{ vm.width.value }}{{ vm.width.unit }} x {{ vm.height.value }}{{ vm.height.unit }}\r\n                  <span *ngIf=\"vm?.type\">&#8226;</span>\r\n                  {{ vm.type }}\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </section>\r\n      </ng-template>\r\n\r\n      <!-- Pagination -->\r\n      <lib-pagination\r\n        [itemsPerPage]=\"limit\"\r\n        [currentPage]=\"offset\"\r\n        [totalItems]=\"totalItems\"\r\n        [paginationSizes]=\"paginationSizes\"\r\n        [pageSize]=\"paginationSize()\"\r\n        (pageChange)=\"onPageChange($event)\"\r\n        (pageSizeChange)=\"onPageSizeChange($event)\"\r\n      >\r\n      </lib-pagination>\r\n    </div>\r\n  </ng-template>\r\n</section>\r\n\r\n<ng-template #verticalDots>\r\n  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n    <path\r\n      d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n    <path\r\n      d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n      stroke=\"#101828\"\r\n      stroke-width=\"2\"\r\n      stroke-linecap=\"round\"\r\n      stroke-linejoin=\"round\"\r\n    />\r\n  </svg>\r\n</ng-template>\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-product-library',\r\n  templateUrl: './product-library.component.html',\r\n  styleUrl: './product-library.component.scss'\r\n})\r\nexport class ProductLibraryComponent {\r\n\r\n}\r\n","<section class=\"content-wrapper\">\r\n  <p>product-library works!</p>\r\n\r\n  <button routerLink=\"/planogram/create-library-product\">Create page</button>\r\n</section>\r\n","import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport * as XLSX from 'xlsx';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: \"lib-popups\",\r\n  templateUrl: \"./popups.component.html\",\r\n  styleUrl: \"./popups.component.scss\",\r\n})\r\nexport class PopupsComponent implements OnInit {\r\n  @Input() clientId: string;\r\n  @Input() totalItemCount: number;\r\n  @ViewChild(\"fileUpload\") fileUpload!: ElementRef;\r\n\r\n  viewStatus = \"start\"; // 'error' , 'action' , 'start'\r\n\r\n  brandData: any = [];\r\n\r\n  processedFileInfo: any = {\r\n    totalRows: 0,\r\n    errorRows: 0,\r\n    missingFields: [],\r\n    allBrands: [],\r\n    duplicates:[]\r\n  };\r\n  brandUsedList:any[] = []\r\n\r\n  @Input() brandList: any = [];\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.brandUsedList = this.brandList\r\n      .filter((ele: any) => ele.isUsed)\r\n      .map((ele: any) => {\r\n        return { id: ele._id, name: ele.brandName };\r\n      });\r\n  }\r\n\r\n  downloadEmptyBrandTemplate(): void {\r\n    this.exportBrandList(false);\r\n  }\r\n\r\n  downloadBrandTemplateWithData(): void {\r\n    this.exportBrandList(true);\r\n  }\r\n\r\n  exportBrandList(withRecords: boolean) {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      export: true,\r\n      emptyDownload: !withRecords,\r\n    };\r\n\r\n    this.storeBuilderService.brandExport(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.storeBuilderService.saveAsExcelFile(res, \"Brands \");\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ exportBrandList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n\r\n  reupload() {\r\n    this.fileUpload.nativeElement.value = \"\";\r\n    let ele = document.getElementById(\"xlsxUpload\");\r\n    ele?.click();\r\n  }\r\n\r\n  onFileUpload(event: any) {\r\n    this.processedFileInfo.missingFields = [];\r\n    this.processedFileInfo.errorRows = 0;\r\n    this.processedFileInfo.totalRows = 0;\r\n    this.processedFileInfo.duplicates = [];\r\n    const target: DataTransfer = <DataTransfer>event.target;\r\n    let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);\r\n\r\n    if (isExcelFile) {\r\n      const reader: FileReader = new FileReader();\r\n      reader.readAsBinaryString(target.files[0]);\r\n      reader.onload = (e: any) => {\r\n        const bstr: string = e.target.result;\r\n        const wb: XLSX.WorkBook = XLSX.read(bstr, { type: \"binary\" });\r\n        const wsname: string = wb.SheetNames[0];\r\n        const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n        let rawData: any[] = XLSX.utils.sheet_to_json(ws,{header:1});\r\n        let header = rawData[0];\r\n        let data = rawData.slice(1);\r\n        let category= data.flatMap((category) => category[1].split(',') );\r\n        let originalList = this.brandList.flatMap((ele:any) => ele.category);\r\n        category = [...category, ...originalList];\r\n        let duplicateCat: any = [...new Set(category.filter(\r\n          (item:any, index:any) => category.indexOf(item) !== index\r\n        ))];\r\n        \r\n        data.forEach((ele: any, index: any) => {\r\n          this.processedFileInfo.totalRows++;\r\n          let row: any = {};\r\n          header.forEach((header: any, headerIndex: any) => {\r\n            if (header == \"Brand Name\" && !ele?.[headerIndex].trim()) {\r\n              this.processedFileInfo.missingFields.push(\r\n                \"A\" + parseInt(index + 2)\r\n              );\r\n              this.processedFileInfo.errorRows++;\r\n            }\r\n            row[header] = ele[headerIndex]?.trim() ?? \"\";\r\n          });\r\n          this.brandData.push(row);\r\n        });\r\n        this.processedFileInfo.duplicates = Array.from(duplicateCat);\r\n        if (this.processedFileInfo.duplicates.length) {\r\n          this.processedFileInfo.errorRows += 1;\r\n        }\r\n        if (\r\n          this.processedFileInfo.missingFields.length ||\r\n          this.processedFileInfo.duplicates.length\r\n        ) {\r\n          this.viewStatus = \"error\";\r\n        } else {\r\n          this.viewStatus = \"action\";\r\n        }\r\n      };\r\n    }\r\n  }\r\n\r\n  closeModal(): void {\r\n    this.activeModal.close();\r\n  }\r\n\r\n  onClickProceed() {\r\n    let usedBrandList = this.brandUsedList.map((ele: any) => ele.name);\r\n    let data = {\r\n      clientId: this.clientId,\r\n      brandData: this.brandData.filter(\r\n        (ele: any) => !usedBrandList.includes(ele.brandName)\r\n      ),\r\n      brandUsedList: this.brandUsedList.map((ele: any) => ele.id),\r\n    };\r\n\r\n    this.storeBuilderService.uploadBrand(data).subscribe({\r\n      next: (res: any) => {\r\n        if (res && res.code == 200)\r\n          this.toast.getSuccessToast(\"Brand uploaded successfully\");\r\n        this.activeModal.close(\"reload\");\r\n      },\r\n      error: (err) => {\r\n        console.log(\"@@ exportBrandList [ERR]: \", err);\r\n      },\r\n    });\r\n  }\r\n}\r\n","<div class=\"modal-container\">\r\n    <h3>Upload brands (Bulk action)</h3>\r\n  \r\n    <div *ngIf=\"viewStatus === 'start'\" class=\"wrapper\">\r\n      <ng-container *ngTemplateOutlet=\"startContainer\"></ng-container>\r\n    </div>\r\n    <div *ngIf=\"viewStatus === 'error'\" class=\"wrapper\">\r\n      <ng-container *ngTemplateOutlet=\"errorContainer\"></ng-container>\r\n    </div>\r\n    <div *ngIf=\"viewStatus === 'action'\" class=\"wrapper\">\r\n      <ng-container *ngTemplateOutlet=\"actionContainer\"></ng-container>\r\n    </div>\r\n  \r\n    <div class=\"modal-actions\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeModal()\">Close</button>\r\n      <button *ngIf=\"viewStatus === 'action'\" type=\"button\" class=\"btn btn-primary\" (click)=\"onClickProceed()\">Proceed</button>\r\n      <button *ngIf=\"viewStatus === 'error'\" type=\"button\" class=\"btn btn-danger\" (click)=\"reupload()\">ReUpload</button>\r\n    </div>\r\n  </div>\r\n  \r\n  <input style=\"display: none\" type=\"file\" #fileUpload id=\"xlsxUpload\" (change)=\"onFileUpload($event)\" />\r\n  <ng-template #startContainer>\r\n    <svg\r\n      style=\"width: 80px; height: 80px\"\r\n      width=\"56\"\r\n      height=\"56\"\r\n      viewBox=\"0 0 95 94\"\r\n      fill=\"none\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      class=\"mb-4\"\r\n    >\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n      <path\r\n        d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n        stroke=\"#00A3FF\"\r\n        stroke-width=\"3.33333\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n  \r\n    <h3>Upload brands & its attributes</h3>\r\n  \r\n    <div class=\"upload-description\">\r\n      <div class=\"upload-steps\">\r\n        <p class=\"card-description mb-0\">Step1 - Download template</p>\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadEmptyBrandTemplate()\">Download empty template</a>\r\n        <!-- @if(this.totalItemCount){\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadBrandTemplateWithData()\"\r\n          >Download template with {{ this.totalItemCount }} record</a\r\n        >\r\n        } -->\r\n        <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n        <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n      </div>\r\n  \r\n      <button class=\"btn btn-primary d-inline-flex align-items-center w-fit\" (click)=\"fileUpload.click()\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Upload\r\n      </button>\r\n    </div>\r\n  </ng-template>\r\n  \r\n  <ng-template #actionContainer>\r\n    <div class=\"d-flex w-100 gap-2 mb-5\">\r\n      <div class=\"col info-card\">\r\n        <h3>{{ processedFileInfo.totalRows }}</h3>\r\n        <p>Total Brands</p>\r\n      </div>\r\n      <div class=\"col info-card\">\r\n        <h3>{{ processedFileInfo.errorRows }}</h3>\r\n        <p>Errors</p>\r\n      </div>\r\n    </div>\r\n  \r\n      <!-- FOR Empty Template (Creation mode) -->\r\n      \r\n      <!-- FOR Template with fields (Create and Update mode) -->\r\n      <div class=\"d-flex flex-column justify-content-start align-items-start w-100\">\r\n        <h4>You're about to make the following bulk actions.</h4>\r\n      </div>\r\n  </ng-template>\r\n  \r\n  <ng-template #errorContainer>\r\n    <div class=\"d-flex w-100 gap-2 mb-5\">\r\n      <div class=\"col info-card\">\r\n        <h3>{{ processedFileInfo.totalRows }}</h3>\r\n        <p>Total Brands</p>\r\n      </div>\r\n  \r\n      <div class=\"col info-card error\">\r\n        <h3>{{ processedFileInfo.errorRows }}</h3>\r\n        <p>Errors</p>\r\n      </div>\r\n    </div>\r\n  \r\n    <div class=\"w-100\">\r\n      <p class=\"fs-4 my-5\">Unable to proceed due to the following errors</p>\r\n  \r\n      <div class=\"w-100 info-card error\">\r\n        @if(processedFileInfo.missingFields.length){\r\n        <p\r\n          class='mb-4'\r\n        >\r\n          Missing mandatory fields -\r\n  \r\n          <span *ngFor=\"let item of processedFileInfo.missingFields; let i = index\">\r\n            {{ item }} <span *ngIf=\"i !== processedFileInfo.missingFields.length - 1\">, </span>\r\n          </span>\r\n        </p>\r\n        }\r\n        @if(processedFileInfo.duplicates.length){\r\n        <p\r\n          class='mb-4'\r\n        >\r\n          Brand category is duplicates -\r\n  \r\n          <span *ngFor=\"let item of processedFileInfo.duplicates; let i = index\">\r\n            {{ item }} <span *ngIf=\"i !== processedFileInfo.duplicates.length - 1\">, </span>\r\n          </span>\r\n        </p>\r\n        }\r\n      </div>\r\n    </div>\r\n  </ng-template>\r\n  ","import { ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from \"@angular/core\";\r\nimport {\r\n  AbstractControl,\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { Router } from \"@angular/router\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { PlanoDataService } from \"../../services/plano-data.service\";\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { PopupsComponent } from \"./popups/popups.component\";\r\nimport { BrandDetails } from \"../../interfaces/vm-library.interface\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-configurations\",\r\n  templateUrl: \"./plano-configurations.component.html\",\r\n  styleUrl: \"./plano-configurations.component.scss\",\r\n})\r\nexport class PlanoConfigurationsComponent implements OnInit {\r\n   @ViewChild('formRef') formRef: ElementRef;\r\n   @ViewChild('brandMetaRef') brandMetaRef: ElementRef;\r\n  selectedTab: string = \"brand\";\r\n  form!: FormGroup;\r\n  clientId: string;\r\n  brandsList: BrandDetails[] = [];\r\n  loading: boolean = true;\r\n  isEdit: boolean = false;\r\n  taskForm: FormGroup;\r\n  brandMetaForm!: FormGroup;\r\n  brandMetaList: any[] = [];\r\n  isBrandMetaEdit: boolean = true;\r\n  brandMetaSearch: string = \"\";\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private dataService: PlanoDataService,\r\n    private gs: GlobalStateService,\r\n    private builderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private modelService: NgbModal,\r\n    private cd: ChangeDetectorRef,\r\n    private pageInfo: PageInfoService,\r\n    private router: Router\r\n  ) {}\r\n\r\n  /**\r\n   * Hidden entry point to the internal plano-tools page.\r\n   * Triggered from an invisible 1×1 hit-area below the config side card —\r\n   * for ops/devs who know it's there. Not discoverable in the UI.\r\n   */\r\n  goToPlanoTools() {\r\n    this.router.navigateByUrl(\"/manage/planogram/plano-tools\");\r\n  }\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n    this.initForm();\r\n    this.gs.dataRangeValue.subscribe(async (data) => {\r\n      if (data) {\r\n        this.clientId = data?.client;\r\n        this.loadBrandData();\r\n        this.loadTaskData();\r\n        this.loadBrandMetaData();\r\n      } else {\r\n        let data = JSON.parse(localStorage.getItem(\"header-filters\") as string);\r\n        this.clientId = data?.client;\r\n        this.loadBrandData();\r\n        this.loadTaskData();\r\n        this.loadBrandMetaData();\r\n      }\r\n    });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Configuration\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  async loadBrandData() {\r\n    await this.dataService.fetchBrandsList(this.clientId);\r\n    this.dataService.brandsList.subscribe((e) => {\r\n      this.brandsList = e;\r\n      this.loading = false;\r\n      if (this.brandsList.length) {\r\n        this.loadData();\r\n      } else {\r\n        this.addBrand();\r\n      }\r\n    });\r\n  }\r\n\r\n  loadTaskData() {\r\n    this.builderService.getTaskConfig(this.clientId).subscribe((res: any) => {\r\n      if (res && res.code == 200) {\r\n        this.isEdit = true;\r\n        this.taskForm = this.fb.group({\r\n          dueDay: [res.data.dueDay, Validators.required],\r\n          dueTime: [res.data.dueTime, Validators.required],\r\n          allowedStoreLocation: [\r\n            res.data.allowedStoreLocation,\r\n            Validators.required,\r\n          ],\r\n        });\r\n        this.taskForm.disable({ emitEvent: false });\r\n      }\r\n    });\r\n  }\r\n\r\n  loadData() {\r\n    this.isEdit = true;\r\n    this.form = this.fb.group({\r\n      brandConfig: this.fb.array([]),\r\n    });\r\n\r\n    this.brandsList.forEach((e: any, i: number) => {\r\n      const brandGroup = this.fb.group({\r\n        brand: [\r\n          { value: e.brandName, disabled: e.isUsed },\r\n          Validators.required,\r\n        ],\r\n        category: this.fb.array(e?.category),\r\n        subCategory: this.fb.array(e?.subCategory),\r\n        isUsed: [e?.isUsed],\r\n      });\r\n\r\n      this.brandConfig.push(brandGroup);\r\n    });\r\n    this.form.disable({ emitEvent: false });\r\n  }\r\n\r\n  initForm() {\r\n    this.form = this.fb.group({\r\n      brandConfig: this.fb.array([]),\r\n    });\r\n\r\n    this.taskForm = this.fb.group({\r\n      dueDay: [1, Validators.required],\r\n      dueTime: [\"23:59\", Validators.required],\r\n      allowedStoreLocation: [false, Validators.required],\r\n    });\r\n\r\n    this.brandMetaForm = this.fb.group({\r\n      brandMetaData: this.fb.array([]),\r\n    });\r\n  }\r\n\r\n  get brandConfig(): FormArray {\r\n    return this.form.get(\"brandConfig\") as FormArray;\r\n  }\r\n\r\n  addBrand() {\r\n    this.brandConfig.push(\r\n      this.fb.group({\r\n        brand: [\"\", Validators.required],\r\n        category: this.fb.array([]),\r\n        subCategory: this.fb.array([]),\r\n      })\r\n    );\r\n    setTimeout(() => {\r\n      const brandElement = this.formRef.nativeElement.querySelector(\r\n        `#text${this.brandConfig.length - 1}`\r\n      );\r\n\r\n      if (brandElement) {\r\n        brandElement.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\r\n      }\r\n    }, 100);\r\n  }\r\n\r\n  removeBrand(index: number) {\r\n    this.brandConfig.removeAt(index);\r\n  }\r\n\r\n  getCategory(catIndex: number) {\r\n    return (this.brandConfig.at(catIndex) as FormGroup).get(\r\n      \"category\"\r\n    ) as FormArray;\r\n  }\r\n\r\n  removeCategory(index: number, catIndex: number) {\r\n    const categoryArray = (this.brandConfig.at(index) as FormGroup).get(\r\n      \"category\"\r\n    ) as FormArray;\r\n    categoryArray.removeAt(catIndex);\r\n  }\r\n\r\n  addCategory(event: any, index: number) {\r\n    const value = event.target.value?.trim();\r\n    if (value) {\r\n      const categoryArray = (this.brandConfig.at(index) as FormGroup).get(\r\n        \"category\"\r\n      ) as FormArray;\r\n      categoryArray.push(new FormControl(value));\r\n\r\n      const inputValue = document.getElementById(\r\n        `categoryInput${index}`\r\n      ) as HTMLInputElement | null;\r\n      if (inputValue) {\r\n        inputValue.value = \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  getSubCategory(catIndex: number) {\r\n    return (this.brandConfig.at(catIndex) as FormGroup).get(\r\n      \"subCategory\"\r\n    ) as FormArray;\r\n  }\r\n\r\n  removeSubCategory(index: number, catIndex: number) {\r\n    const categoryArray = (this.brandConfig.at(index) as FormGroup).get(\r\n      \"subCategory\"\r\n    ) as FormArray;\r\n    categoryArray.removeAt(catIndex);\r\n  }\r\n\r\n  addSubCategory(event: any, index: number) {\r\n    const value = event.target.value?.trim();\r\n    if (value) {\r\n      const categoryArray = (this.brandConfig.at(index) as FormGroup).get(\r\n        \"subCategory\"\r\n      ) as FormArray;\r\n      categoryArray.push(new FormControl(value));\r\n\r\n      const inputValue = document.getElementById(\r\n        `subCategoryInput${index}`\r\n      ) as HTMLInputElement | null;\r\n      if (inputValue) {\r\n        inputValue.value = \"\";\r\n      }\r\n    }\r\n  }\r\n\r\n  checkUsed(index: number): boolean {\r\n    return this.brandConfig.at(index).get(\"isUsed\")?.value;\r\n  }\r\n\r\n  async updateBrand() {\r\n    let brandData = this.brandConfig.value;\r\n    if (this.form.invalid) {\r\n      this.toast.getErrorToast(\"Required field is missing\");\r\n      return;\r\n    }\r\n    let duplicates: any = [];\r\n    let error: any = [];\r\n    let brand: any = brandData.flatMap((ele: any) => ele.brand);\r\n    duplicates = [\r\n      ...new Set(\r\n        brand.filter((item: any, index: any) => brand.indexOf(item) !== index)\r\n      ),\r\n    ];\r\n    if (duplicates.length) {\r\n      error.push(`${duplicates.toString()} - brand is duplicated`);\r\n    }\r\n    let category: any = brandData.flatMap((ele: any) => ele.category);\r\n    let duplicateCat = [\r\n      ...new Set(\r\n        category.filter(\r\n          (item: any, index: any) => category.indexOf(item) !== index\r\n        )\r\n      ),\r\n    ];\r\n    if (duplicateCat.length) {\r\n      error.push(\r\n        `${Array.from(duplicateCat).toString()} - brand category is duplicated`\r\n      );\r\n    }\r\n    if (error.length) {\r\n      return this.toast.getErrorToast(`${error.toString()} `);\r\n    }\r\n    let data = {\r\n      clientId: this.clientId,\r\n      brandData: brandData,\r\n      brandUsedList: this.brandsList\r\n        .filter((ele: any) => ele.isUsed)\r\n        .map((ele: any) => ele._id),\r\n    };\r\n    this.builderService.addUpdateBrand(data).subscribe(\r\n      async (res: any) => {\r\n        if (res && res.code == 200) {\r\n          this.toast.getSuccessToast(\"Brand details updated successfully\");\r\n          this.isEdit = true;\r\n          this.form.disable({ emitEvent: false });\r\n          await this.dataService.fetchBrandsList(this.clientId, true);\r\n        }\r\n      },\r\n      (error: any) => {\r\n        this.toast.getErrorToast(\"Something went wrong..\");\r\n      }\r\n    );\r\n  }\r\n\r\n  updateTask() {\r\n    let data = {\r\n      clientId: this.clientId,\r\n      ...this.taskForm.value,\r\n    };\r\n\r\n    this.builderService.updateTask(data).subscribe(\r\n      (res: any) => {\r\n        if (res && res.code == 200) {\r\n          this.isEdit = true;\r\n          this.taskForm.disable({ emitEvent: false });\r\n          this.toast.getSuccessToast(\"Task details updated successfully\");\r\n        }\r\n      },\r\n      (error: any) => {\r\n        this.toast.getErrorToast(\"Something went wrong..\");\r\n      }\r\n    );\r\n  }\r\n\r\n  bulkUpload() {\r\n    const modelRef = this.modelService.open(PopupsComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.componentInstance.totalItemCount = this.brandsList.length;\r\n    modelRef.componentInstance.totalItemCount = this.brandsList.length;\r\n    modelRef.componentInstance.brandList = this.brandsList;\r\n\r\n    modelRef.result.then(async (res) => {\r\n      if (res) {\r\n        await this.dataService.fetchBrandsList(this.clientId, true);\r\n      }\r\n    });\r\n  }\r\n\r\n  formEnable() {\r\n    let brandInfo = this.form.get(\"brandConfig\") as FormArray;\r\n\r\n    brandInfo.controls.forEach((control: AbstractControl) => {\r\n      if (!control.get(\"isUsed\")?.value) {\r\n        control.get(\"brand\")?.enable();\r\n        control.get(\"category\")?.enable();\r\n        control.get(\"subCategory\")?.enable();\r\n      }\r\n    });\r\n  }\r\n\r\n  get brandMetaData(): FormArray {\r\n    return this.brandMetaForm.get(\"brandMetaData\") as FormArray;\r\n  }\r\n\r\n  loadBrandMetaData() {\r\n    this.builderService.getBrandMetaData(this.clientId).subscribe(\r\n      (res: any) => {\r\n        const rows = Array.isArray(res?.data) ? res.data : [];\r\n        this.brandMetaList = rows;\r\n        this.buildBrandMetaForm(rows);\r\n      },\r\n      () => {\r\n        this.brandMetaList = [];\r\n        this.buildBrandMetaForm([]);\r\n      }\r\n    );\r\n  }\r\n\r\n  buildBrandMetaForm(rows: any[]) {\r\n    this.brandMetaForm = this.fb.group({\r\n      brandMetaData: this.fb.array(\r\n        rows.map((row) =>\r\n          this.fb.group({\r\n            pidCat: [row?.pidCat ?? \"\", Validators.required],\r\n            tempGroup: [row?.tempGroup ?? \"\", Validators.required],\r\n            category: [row?.category ?? \"\", Validators.required],\r\n            brand: [row?.brand ?? \"\", Validators.required],\r\n            band: [row?.band ?? \"\"],\r\n          })\r\n        )\r\n      ),\r\n    });\r\n    this.isBrandMetaEdit = true;\r\n    this.brandMetaForm.disable({ emitEvent: false });\r\n  }\r\n\r\n  addBrandMetaRow() {\r\n    this.brandMetaData.push(\r\n      this.fb.group({\r\n        pidCat: [\"\", Validators.required],\r\n        tempGroup: [\"\", Validators.required],\r\n        category: [\"\", Validators.required],\r\n        brand: [\"\", Validators.required],\r\n        band: [\"\"],\r\n      })\r\n    );\r\n    setTimeout(() => {\r\n      const lastRow = this.brandMetaRef?.nativeElement?.querySelector(\r\n        `#metaRow${this.brandMetaData.length - 1}`\r\n      );\r\n      if (lastRow) {\r\n        lastRow.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\r\n      }\r\n    }, 100);\r\n  }\r\n\r\n  removeBrandMetaRow(index: number) {\r\n    this.brandMetaData.removeAt(index);\r\n  }\r\n\r\n  enableBrandMetaForm() {\r\n    this.isBrandMetaEdit = false;\r\n    this.brandMetaForm.enable({ emitEvent: false });\r\n  }\r\n\r\n  cancelBrandMetaEdit() {\r\n    this.buildBrandMetaForm(this.brandMetaList);\r\n  }\r\n\r\n  updateBrandMetaData() {\r\n    if (this.brandMetaForm.invalid) {\r\n      this.brandMetaForm.markAllAsTouched();\r\n      this.focusFirstInvalidBrandMetaField();\r\n      return;\r\n    }\r\n    const rows = this.brandMetaData.value;\r\n    const seen = new Set<string>();\r\n    const dupes: { row: number; combo: string }[] = [];\r\n    const norm = (v: any) => (v || \"\").trim().toLowerCase();\r\n    rows.forEach((r: any, i: number) => {\r\n      // A row counts as a duplicate only when every field matches another row.\r\n      // The same Pid Cat + Temp Group with a different Category/Brand/Band is allowed.\r\n      const key = [r.pidCat, r.tempGroup, r.category, r.brand, r.band]\r\n        .map(norm)\r\n        .join(\"|\");\r\n      if (seen.has(key)) {\r\n        dupes.push({ row: i, combo: `${r.pidCat} / ${r.tempGroup}` });\r\n      } else {\r\n        seen.add(key);\r\n      }\r\n    });\r\n    if (dupes.length) {\r\n      const first = dupes[0];\r\n      this.toast.getErrorToast(\r\n        `Row ${first.row + 1}: duplicate entry — all fields identical to another row (\"${first.combo}\")`\r\n      );\r\n      this.scrollAndFlashBrandMetaField(first.row, \"pidCat\");\r\n      return;\r\n    }\r\n    const payload = {\r\n      clientId: this.clientId,\r\n      brandMetaData: rows,\r\n    };\r\n    this.builderService.updateBrandMetaData(payload).subscribe(\r\n      (res: any) => {\r\n        if (res && res.code == 200) {\r\n          this.toast.getSuccessToast(\"Brand Meta Data updated successfully\");\r\n          this.brandMetaList = rows;\r\n          this.isBrandMetaEdit = true;\r\n          this.brandMetaForm.disable({ emitEvent: false });\r\n        }\r\n      },\r\n      () => {\r\n        this.toast.getErrorToast(\"Something went wrong..\");\r\n      }\r\n    );\r\n  }\r\n\r\n  private readonly BRAND_META_FIELD_LABELS: Record<string, string> = {\r\n    pidCat: \"Pid Cat\",\r\n    tempGroup: \"Temp Group\",\r\n    category: \"Category\",\r\n    brand: \"Brand\",\r\n    band: \"Band\",\r\n  };\r\n\r\n  private focusFirstInvalidBrandMetaField() {\r\n    const controls = this.brandMetaData.controls;\r\n    for (let i = 0; i < controls.length; i++) {\r\n      const group = controls[i] as FormGroup;\r\n      for (const fieldKey of Object.keys(this.BRAND_META_FIELD_LABELS)) {\r\n        const ctrl = group.get(fieldKey);\r\n        if (ctrl && ctrl.invalid) {\r\n          this.toast.getErrorToast(\r\n            `Row ${i + 1}: ${this.BRAND_META_FIELD_LABELS[fieldKey]} is required`\r\n          );\r\n          this.scrollAndFlashBrandMetaField(i, fieldKey);\r\n          return;\r\n        }\r\n      }\r\n    }\r\n    this.toast.getErrorToast(\"Required field is missing\");\r\n  }\r\n\r\n  private scrollAndFlashBrandMetaField(rowIndex: number, fieldKey: string) {\r\n    if (this.brandMetaSearch?.trim()) {\r\n      this.brandMetaSearch = \"\";\r\n    }\r\n    setTimeout(() => {\r\n      const el = document.getElementById(\r\n        `metaRow${rowIndex}-${fieldKey}`\r\n      ) as HTMLInputElement | null;\r\n      if (!el) return;\r\n      el.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\r\n      try {\r\n        el.focus({ preventScroll: true });\r\n      } catch {\r\n        el.focus();\r\n      }\r\n      el.classList.remove(\"danger-flash\");\r\n      void el.offsetWidth;\r\n      el.classList.add(\"danger-flash\");\r\n      setTimeout(() => el.classList.remove(\"danger-flash\"), 1500);\r\n    }, 50);\r\n  }\r\n\r\n  matchesBrandMetaSearch(group: AbstractControl): boolean {\r\n    const q = this.brandMetaSearch?.trim().toLowerCase();\r\n    if (!q) return true;\r\n    const fields = [\"pidCat\", \"tempGroup\", \"category\", \"brand\", \"band\"];\r\n    return fields.some((key) => {\r\n      const val = group.get(key)?.value;\r\n      return (val ?? \"\").toString().toLowerCase().includes(q);\r\n    });\r\n  }\r\n\r\n  get filteredBrandMetaCount(): number {\r\n    return this.brandMetaData.controls.filter((c) =>\r\n      this.matchesBrandMetaSearch(c)\r\n    ).length;\r\n  }\r\n}\r\n","<div class=\"row\">\r\n    <div class=\"col-md-3 planoConfig\">\r\n        <!-- Hidden plano-tools entry. Sized 120×40 px, transparent — invisible\r\n             to regular users but reachable by ops/devs who know the spot.\r\n             Placed at the bottom-left, below the config side card. -->\r\n        <button\r\n            type=\"button\"\r\n            aria-label=\"Open plano tools\"\r\n            tabindex=\"-1\"\r\n            class=\"plano-tools-hidden-entry\"\r\n            (click)=\"goToPlanoTools()\"></button>\r\n        <div class=\"s-card\">\r\n            <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brand' ? 'active' : ''\" (click)=\"selectedTab ='brand';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n                <div class=\"me-2\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                        <path d=\"M14.1755 4.22225C14.1766 2.99445 11.6731 2 8.58832 2C5.50357 2 3.00224 2.99557 3 4.22225M3 4.22225C3 5.45004 5.50133 6.44449 8.58832 6.44449C11.6753 6.44449 14.1766 5.45004 14.1766 4.22225L14.1766 12.8445M3 4.22225V17.5556C3.00112 18.7834 5.50245 19.7779 8.58832 19.7779C10.0849 19.7779 11.4361 19.5412 12.4387 19.1601M3.00112 8.66672C3.00112 9.89451 5.50245 10.889 8.58944 10.889C11.6764 10.889 14.1778 9.89451 14.1778 8.66672M12.5057 14.6946C11.4976 15.0891 10.115 15.3335 8.58832 15.3335C5.50245 15.3335 3.00112 14.3391 3.00112 13.1113M20.5272 13.4646C22.4909 15.4169 22.4909 18.5836 20.5272 20.5358C18.5635 22.4881 15.3781 22.4881 13.4144 20.5358C11.4507 18.5836 11.4507 15.4169 13.4144 13.4646C15.3781 11.5124 18.5635 11.5124 20.5272 13.4646Z\" [attr.stroke]=\"selectedTab === 'brand' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                        </svg>\r\n                </div>\r\n                <div class=\"configText\">\r\n                    Brand and Product Mapping\r\n                </div>\r\n            </div>\r\n            <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'task' ? 'active' : ''\" (click)=\"selectedTab ='task';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n                <div class=\"me-2\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                        <g clip-path=\"url(#clip0_1775_37931)\">\r\n                        <path d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                        <path d=\"M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.258 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.0113 9.77251C4.28059 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z\" [attr.stroke]=\"selectedTab === 'task' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                        </g>\r\n                        <defs>\r\n                        <clipPath id=\"clip0_1775_37931\">\r\n                        <rect width=\"24\" height=\"24\" fill=\"white\"/>\r\n                        </clipPath>\r\n                        </defs>\r\n                        </svg>\r\n                </div>\r\n                <div class=\"configText\">\r\n                    Task Configuration\r\n                </div>\r\n            </div>\r\n            <div class=\"d-flex cursor-pointer p-3 mb-3\" [ngClass]=\"selectedTab === 'brandMeta' ? 'active' : ''\" (click)=\"selectedTab='brandMeta';isEdit=true;isBrandMetaEdit=true;form.disable();taskForm.disable();brandMetaForm.disable()\">\r\n                <div class=\"me-2\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                        <path d=\"M3 7.5L12 3L21 7.5M3 7.5L12 12M3 7.5V16.5L12 21M21 7.5L12 12M21 7.5V16.5L12 21M12 12V21\" [attr.stroke]=\"selectedTab === 'brandMeta' ? '#00A3FF' : '#344054'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                </div>\r\n                <div class=\"configText\">\r\n                    Brand Meta Data\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"col-md-9\" id=\"config\">\r\n        <div class=\"row loader d-flex justify-content-center align-items-center\" *ngIf=\"loading\">\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n            <div class=\"shimmer\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n              </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"m-card\" *ngIf=\"!loading\">\r\n            <div *ngIf=\"selectedTab === 'brand'\" >\r\n                <div class=\"d-flex justify-content-between\">\r\n                    <div>\r\n                        <h3>Brand and product information</h3>\r\n                        <p>Define the brand and map products to their respective categories.</p>\r\n                    </div>\r\n                    <div>\r\n                        <!-- <button type=\"button\" class=\"btn btn-outline\" (click)=\"bulkUpload()\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg> Upload Brands\r\n                        </button> -->\r\n                    </div>\r\n                </div>\r\n                <ng-container >\r\n                    <form [formGroup]=\"form\" class=\"mt-10\" #formRef>\r\n                        <div formArrayName=\"brandConfig\">\r\n                            <div class=\"row mx-0\">\r\n                                <div class=\"col-md-4 p-0 ps-2\">\r\n                                    <div class=\"form-label\">Brand</div>\r\n                                </div>\r\n                                <div class=\"col-md-4 p-0 ps-2\">\r\n                                    <div class=\"form-label\">Product Category</div>\r\n                                </div>\r\n                                <div class=\"col-md-4 p-0 ps-2\">\r\n                                    <div class=\"form-label\">Product Sub-Category</div>\r\n                                </div>\r\n                            </div>\r\n                            <div style=\"height:calc(75vh - 250px);overflow-y:Scroll\">\r\n                                <div *ngFor=\"let brandGroup of brandConfig?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\">\r\n                                    <div class=\"col-md-4 p-0 ps-2\">\r\n                                        <div class=\"d-flex\">\r\n                                            <div class=\"w-100\" [id]=\"'text'+i\">\r\n                                                <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('brand')?.hasError('required') ? 'danger' : ''\"/>\r\n                                            </div>\r\n                                            <div class=\"ms-3 mt-4\">\r\n                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n                                                    <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n                                                    </svg>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col-md-4 p-0 ps-2\">\r\n                                        <div class=\"d-flex\">\r\n                                            <div class=\"w-100 chip-box\" formArrayName=\"category\">\r\n                                                <div class=\"input-container form-control\" [ngClass]=\"brandsList.length && !isEdit && !checkUsed(i) && brandGroup.get('category')?.hasError('required') ? 'danger' : ''\">\r\n                                                    <ng-container *ngFor=\"let item of getCategory(i)?.controls;let j=index\">\r\n                                                        <span class=\"chip\">\r\n                                                            <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n                                                            <span (click)=\"isEdit || checkUsed(i) ? '' :removeCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? 'disabledText':'cursor-pointer'\"><svg\r\n                                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                                                    <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                                        stroke-linejoin=\"round\" />\r\n                                                                </svg>\r\n                                                            </span>\r\n                                                        </span>\r\n                                                    </ng-container>\r\n                                                    <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addCategory($event,i)\" [id]=\"'categoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n                                                </div>\r\n                                                <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n                                            </div>\r\n                                            <div class=\"ms-3 mt-4\">\r\n                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"16\" viewBox=\"0 0 15 16\" fill=\"none\">\r\n                                                    <path d=\"M14.7071 8.70711C15.0976 8.31658 15.0976 7.68342 14.7071 7.29289L8.34315 0.928932C7.95262 0.538408 7.31946 0.538408 6.92893 0.928932C6.53841 1.31946 6.53841 1.95262 6.92893 2.34315L12.5858 8L6.92893 13.6569C6.53841 14.0474 6.53841 14.6805 6.92893 15.0711C7.31946 15.4616 7.95262 15.4616 8.34315 15.0711L14.7071 8.70711ZM0 8V9H14V8V7H0V8Z\" fill=\"#D0D5DD\"/>\r\n                                                </svg>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col-md-4 p-0 ps-2\">\r\n                                        <div class=\"d-flex\">\r\n                                            <div class=\"w-100 chip-box\" formArrayName=\"subCategory\">\r\n                                                <div class=\"input-container form-control\">\r\n                                                    <ng-container *ngFor=\"let item of getSubCategory(i)?.controls;let j=index\">\r\n                                                        <span class=\"chip\">\r\n                                                            <span class=\"me-3\" [ngClass]=\"isEdit || checkUsed(i) ? 'disabledText' : ''\">{{item.value}}</span>\r\n                                                            <span (click)=\"isEdit || checkUsed(i) ? '' : removeSubCategory(i,j)\" [class]=\"isEdit || checkUsed(i) ? '':'cursor-pointer'\"><svg\r\n                                                                    xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                                                    <path d=\"M9 3L3 9M3 3L9 9\" [attr.stroke]=\"isEdit || checkUsed(i) ? '#aeb4c5' : '#667085'\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                                                        stroke-linejoin=\"round\" />\r\n                                                                </svg>\r\n                                                            </span>\r\n                                                        </span>\r\n                                                    </ng-container>\r\n                                                    <input style=\"min-height: 44px;\" type=\"text\" class=\"form-control dropdown-input ps-3 me-3\" (change)=\"addSubCategory($event,i)\" [id]=\"'subCategoryInput'+i\" [disabled]=\"isEdit || checkUsed(i)\">\r\n                                                </div>\r\n                                                <!-- <input type=\"text\" class=\"form-control\" formControlName=\"category\" /> -->\r\n                                            </div>\r\n                                            <div class=\"ms-3 mt-4\" (click)=\"checkUsed(i) || isEdit ? '' : removeBrand(i)\" *ngIf=\"brandConfig.value.length > 1\" [ngClass]=\"checkUsed(i) || isEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                                                    <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                                </svg>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </form>\r\n                    <div class=\"d-flex justify-content-between mt-10\">\r\n                        <div>\r\n                            <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrand()\" [disabled]=\"isEdit\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg> Add\r\n                            </button>\r\n                        </div>\r\n                        <div>\r\n                            <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;formEnable()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <g clip-path=\"url(#clip0_1775_37985)\">\r\n                                        <path d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                    </g>\r\n                                    <defs>\r\n                                        <clipPath id=\"clip0_1775_37985\">\r\n                                            <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n                                        </clipPath>\r\n                                    </defs>\r\n                                </svg> Edit\r\n                            </button>\r\n                            <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateBrand()\">\r\n                                Save\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n            <div *ngIf=\"selectedTab === 'brandMeta'\">\r\n                <div class=\"d-flex justify-content-between align-items-center gap-3\">\r\n                    <div class=\"flex-grow-1\">\r\n                        <h3>Brand Meta Data</h3>\r\n                        <p class=\"mb-0\">Maintain the Pid Cat &#8594; Brand / Category / Band mapping used during planogram export.</p>\r\n                    </div>\r\n                    <div style=\"width:360px;flex-shrink:0\">\r\n                        <div class=\"position-relative\">\r\n                            <span class=\"position-absolute\" style=\"left:12px;top:50%;transform:translateY(-50%)\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                    <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg>\r\n                            </span>\r\n                            <input type=\"text\" class=\"form-control\" style=\"padding-left:38px\" placeholder=\"Search Pid Cat, Temp Group, Category, Brand or Band\" [(ngModel)]=\"brandMetaSearch\" [ngModelOptions]=\"{standalone: true}\"/>\r\n                        </div>\r\n                        <div class=\"text-end mt-1\" *ngIf=\"brandMetaData?.controls?.length\">\r\n                            <small class=\"text-muted\">{{ filteredBrandMetaCount }} of {{ brandMetaData.controls.length }} row(s)</small>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <ng-container>\r\n                    <form [formGroup]=\"brandMetaForm\" class=\"mt-3\" #brandMetaRef>\r\n                        <div formArrayName=\"brandMetaData\">\r\n                            <div class=\"row mx-0\">\r\n                                <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Pid Cat</div></div>\r\n                                <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Temp Group</div></div>\r\n                                <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Category</div></div>\r\n                                <div class=\"col-md-3 p-0 ps-2\"><div class=\"form-label\">Brand</div></div>\r\n                                <div class=\"col-md-2 p-0 ps-2\"><div class=\"form-label\">Band</div></div>\r\n                            </div>\r\n                            <div style=\"height:calc(75vh - 280px);overflow-y:scroll\">\r\n                                <div *ngIf=\"!brandMetaData?.controls?.length\" class=\"text-center p-5 text-muted\">\r\n                                    No brand meta data found. Click \"Edit\" then \"Add\" to create a row.\r\n                                </div>\r\n                                <div *ngIf=\"brandMetaData?.controls?.length && !filteredBrandMetaCount\" class=\"text-center p-5 text-muted\">\r\n                                    No rows match \"{{ brandMetaSearch }}\"\r\n                                </div>\r\n                                <div *ngFor=\"let metaGroup of brandMetaData?.controls; let i = index\" [formGroupName]=\"i\" class=\"row mt-3 mx-0\" [id]=\"'metaRow' + i\" [hidden]=\"!matchesBrandMetaSearch(metaGroup)\">\r\n                                    <div class=\"col-md-2 p-0 ps-2\">\r\n                                        <input type=\"text\" class=\"form-control\" formControlName=\"pidCat\" [id]=\"'metaRow' + i + '-pidCat'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('pidCat')?.hasError('required') && metaGroup.get('pidCat')?.touched ? 'danger' : ''\"/>\r\n                                    </div>\r\n                                    <div class=\"col-md-2 p-0 ps-2\">\r\n                                        <input type=\"text\" class=\"form-control\" formControlName=\"tempGroup\" [id]=\"'metaRow' + i + '-tempGroup'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('tempGroup')?.hasError('required') && metaGroup.get('tempGroup')?.touched ? 'danger' : ''\"/>\r\n                                    </div>\r\n                                    <div class=\"col-md-3 p-0 ps-2\">\r\n                                        <input type=\"text\" class=\"form-control\" formControlName=\"category\" [id]=\"'metaRow' + i + '-category'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('category')?.hasError('required') && metaGroup.get('category')?.touched ? 'danger' : ''\"/>\r\n                                    </div>\r\n                                    <div class=\"col-md-3 p-0 ps-2\">\r\n                                        <input type=\"text\" class=\"form-control\" formControlName=\"brand\" [id]=\"'metaRow' + i + '-brand'\" [ngClass]=\"!isBrandMetaEdit && metaGroup.get('brand')?.hasError('required') && metaGroup.get('brand')?.touched ? 'danger' : ''\"/>\r\n                                    </div>\r\n                                    <div class=\"col-md-2 p-0 ps-2 d-flex\">\r\n                                        <input type=\"text\" class=\"form-control\" formControlName=\"band\" [id]=\"'metaRow' + i + '-band'\"/>\r\n                                        <div class=\"ms-3 mt-3\" (click)=\"isBrandMetaEdit ? '' : removeBrandMetaRow(i)\" [ngClass]=\"isBrandMetaEdit ? 'cursor-default' : 'cursor-pointer'\">\r\n                                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                                                <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                            </svg>\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </form>\r\n                    <div class=\"d-flex justify-content-between mt-10\">\r\n                        <div>\r\n                            <button type=\"button\" class=\"btn btn-outline\" (click)=\"addBrandMetaRow()\" [disabled]=\"isBrandMetaEdit\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <path d=\"M10.0001 4.16675V15.8334M4.16675 10.0001H15.8334\" stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg> Add\r\n                            </button>\r\n                        </div>\r\n                        <div>\r\n                            <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"!isBrandMetaEdit\" (click)=\"cancelBrandMetaEdit()\">Cancel</button>\r\n                            <button type=\"button\" class=\"btn btn-outline ms-2\" *ngIf=\"isBrandMetaEdit\" (click)=\"enableBrandMetaForm()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <g clip-path=\"url(#clip0_1775_37990)\">\r\n                                        <path d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                    </g>\r\n                                    <defs>\r\n                                        <clipPath id=\"clip0_1775_37990\">\r\n                                            <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n                                        </clipPath>\r\n                                    </defs>\r\n                                </svg> Edit\r\n                            </button>\r\n                            <button type=\"button\" class=\"btn btn-primary ms-2\" *ngIf=\"!isBrandMetaEdit\" (click)=\"updateBrandMetaData()\">Save</button>\r\n                        </div>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n            <div *ngIf=\"selectedTab === 'task'\" >\r\n                <div class=\"d-flex justify-content-between\">\r\n                    <div>\r\n                        <h3>Global configuration for tasks</h3>\r\n                        <p>The following configuration applies to all published tasks.</p>\r\n                    </div>\r\n                    <!-- <div>\r\n                        <button type=\"button\" class=\"btn btn-outline\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg> Upload Brands\r\n                        </button>\r\n                    </div> -->\r\n                </div>\r\n                <ng-container >\r\n                    <form [formGroup]=\"taskForm\">\r\n                        <div class=\"row\">\r\n                            <div class=\"col-md-4\">\r\n                                <label class=\"form-label\">\r\n                                    Due days (to complete task)\r\n                                </label>\r\n                                <input type=\"text\" class=\"form-control\" formControlName=\"dueDay\"/>\r\n                            </div>\r\n                            <div class=\"col-md-4\">\r\n                                <label class=\"form-label\">\r\n                                    Due time\r\n                                </label>\r\n                                <input type=\"time\" class=\"form-control\" formControlName=\"dueTime\"/>\r\n                            </div>\r\n                            <div\r\n                                class=\"checklistturnoff ms-3 mt-4 fv-plugins-icon-containe col-md-8 divWidth\">\r\n                                <div class=\"form-check form-switch\">\r\n                                    <input class=\"form-check-input mt-3\" type=\"checkbox\"\r\n                                        id=\"geoFencing\" [checked]=\"taskForm.get('allowedStoreLocation')?.value\" formControlName=\"allowedStoreLocation\">\r\n                                    <label class=\"form-check-label sub\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">Geo\r\n                                        fencing\r\n                                    </label><br>\r\n                                    <label class=\"form-check-label subtext\" [ngClass]=\"taskForm.get('allowedStoreLocation')?.value ? 'active' : ''\" for=\"geoFencing\">By\r\n                                        enabling, the checklist can be filled by the user only when\r\n                                        inside the store.</label>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </form>\r\n                    <div class=\"d-flex justify-content-between mt-10\">\r\n                        <button type=\"button\" class=\"btn btn-outline\" *ngIf=\"isEdit\" (click)=\"isEdit = false;taskForm.enable()\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                <g clip-path=\"url(#clip0_1775_37985)\">\r\n                                    <path d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </g>\r\n                                <defs>\r\n                                    <clipPath id=\"clip0_1775_37985\">\r\n                                        <rect width=\"20\" height=\"20\" fill=\"white\"/>\r\n                                    </clipPath>\r\n                                </defs>\r\n                            </svg> Edit\r\n                        </button>\r\n                        <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!isEdit\" (click)=\"updateTask()\">\r\n                            Save\r\n                        </button>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n","import { Component, OnInit, OnDestroy } from \"@angular/core\";\r\nimport {\r\n  FormBuilder,\r\n  FormGroup,\r\n  FormArray,\r\n  Validators,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n} from \"@angular/forms\";\r\nimport { ActivatedRoute, Router, RouterLink } from \"@angular/router\";\r\nimport {\r\n  NgbAccordionModule,\r\n  NgbModal,\r\n  NgbTooltip,\r\n} from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  firstValueFrom,\r\n  map,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport {\r\n  FixtureLibraryDetails,\r\n  FixtureLibraryShelfConfig,\r\n} from \"../../interfaces/fixture-library.interface\";\r\nimport { DropdownIF } from \"../../interfaces/plano-general.interface\";\r\nimport { CompleteConfirmationComponent } from \"../popups/complete-confirmation/complete-confirmation.component\";\r\nimport { DeleteConfirmationComponent } from \"../popups/delete-confirmation/delete-confirmation.component\";\r\nimport { ExitConfirmationComponent } from \"../popups/exit-confirmation/exit-confirmation.component\";\r\nimport { CanExitGuard } from \"../../functions/exit.guard\";\r\nimport { CannotPerformComponent } from \"../popups/cannot-perform/cannot-perform.component\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { TimeAgoPipe } from \"../../pipes/time-ago.pipe\";\r\nimport { CounterInputComponent } from \"../counter-input/counter-input.component\";\r\nimport { ReactiveSelectComponent } from \"../reactive-select/reactive-select.component\";\r\nimport { generalValidator } from \"../../functions/plano.function\";\r\nimport { WALL_ZONES, FLOOR_ZONES } from \"../../data/fixture-template.data\";\r\n\r\n@Component({\r\n  selector: \"lib-create-fixture\",\r\n  templateUrl: \"./create-fixture.component.html\",\r\n  styleUrl: \"./create-fixture.component.scss\",\r\n  standalone: true,\r\n  imports: [\r\n    CounterInputComponent,\r\n    NgbTooltip,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    CommonModule,\r\n    TimeAgoPipe,\r\n    NgbAccordionModule,\r\n    ReactiveSelectComponent,\r\n    RouterLink,\r\n  ],\r\n})\r\nexport class CreateFixtureComponent implements OnInit, OnDestroy, CanExitGuard {\r\n  clientId: string;\r\n\r\n  wallFixtureForm: FormGroup;\r\n  floorFixtureForm: FormGroup;\r\n\r\n  isPageLoading: boolean = true;\r\n\r\n  fixtureDetails: FixtureLibraryDetails = {};\r\n  isEditMode: boolean = false;\r\n\r\n  isHeaderEnabled: boolean = true;\r\n  isFooterEnabled: boolean = true;\r\n  isBodyEnabled: boolean = true;\r\n\r\n  canGoBack: boolean = false;\r\n\r\n  readonly shelfTypes: DropdownIF[] = [\r\n    { label: \"Shelf\", value: \"shelf\" },\r\n    { label: \"Tray\", value: \"tray\" },\r\n    { label: \"VM Only\", value: \"vmonly\" },\r\n  ];\r\n\r\n  readonly wallZones: DropdownIF[] = WALL_ZONES;\r\n  readonly floorZones: DropdownIF[] = FLOOR_ZONES;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private fb: FormBuilder,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private router: Router,\r\n    private ngbModal: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.setPageData();\r\n    this.isPageLoading = true;\r\n    const params = this.route.snapshot.queryParams;\r\n    this.fixtureDetails._id = params[\"fixtureId\"] ?? \"\";\r\n\r\n    this.isEditMode = params[\"isEdit\"] == \"true\";\r\n\r\n    if (!this.fixtureDetails._id) {\r\n      this.canGoBack = true;\r\n      this.router.navigate([\"/manage/planogram/library/fixtures\"]);\r\n      return;\r\n    }\r\n\r\n    this.getClientId();\r\n\r\n    this.route.queryParams\r\n      .pipe(\r\n        map((params) => params[\"fixtureId\"]),\r\n        filter((id) => !!id),\r\n        distinctUntilChanged(),\r\n        takeUntil(this.destroy$),\r\n      )\r\n      .subscribe(async (id) => {\r\n        this.storeBuilderService.getFixtureLibraryDetails(id).subscribe({\r\n          next: (res: any) => {\r\n            let details = res.data;\r\n            if (details) {\r\n              this.fixtureDetails = {\r\n                ...details,\r\n              };\r\n              this.initializeForm();\r\n              this.isPageLoading = false;\r\n              this.canGoBack = false;\r\n            }\r\n          },\r\n          error: (err) => {\r\n            this.toast.getErrorToast(\r\n              err?.error?.error ?? \"Failed to fetch fixture details\",\r\n            );\r\n            this.isPageLoading = false;\r\n            // this.isError = true;\r\n          },\r\n        });\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Create Fixture\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Library\",\r\n        path: \"/manage/planogram/library/fixtures\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  getClientId() {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        filter((data) => !!data), // Filtering null/undefined.\r\n        distinctUntilChanged(), // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe(async (data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  initializeForm() {\r\n    // Default floor fixtures created before sub-type existed to 'panel'.\r\n    if (this.fixtureDetails.fixtureType === \"floor\" && !this.fixtureDetails.fixtureSubType) {\r\n      this.fixtureDetails.fixtureSubType = \"panel\";\r\n    }\r\n\r\n    if (this.isShelfStructure()) {\r\n      this.initWallFixtureForm();\r\n    } else {\r\n      this.initFloorPanelFixtureForm();\r\n    }\r\n\r\n    if (this.isEditMode) {\r\n      if (this.isShelfStructure()) {\r\n        if (!this.fixtureDetails.header?.isEnabled) this.toggleSection(\"header\");\r\n        if (!this.fixtureDetails.footer?.isEnabled) this.toggleSection(\"footer\");\r\n        if (!this.fixtureDetails.isBodyEnabled) this.toggleSection(\"body\");\r\n      }\r\n    } else {\r\n      this.wallFixtureForm?.disable({ emitEvent: false });\r\n      this.floorFixtureForm?.disable({ emitEvent: false });\r\n\r\n      this.isHeaderEnabled = this.fixtureDetails.header?.isEnabled ?? false;\r\n      this.isBodyEnabled = this.fixtureDetails.isBodyEnabled ?? false;\r\n      this.isFooterEnabled = this.fixtureDetails.footer?.isEnabled ?? false;\r\n    }\r\n  }\r\n\r\n  isShelfStructure(): boolean {\r\n    return (\r\n      this.fixtureDetails.fixtureType === \"wall\" ||\r\n      (this.fixtureDetails.fixtureType === \"floor\" &&\r\n        this.fixtureDetails.fixtureSubType === \"shelf\")\r\n    );\r\n  }\r\n\r\n  isPanelStructure(): boolean {\r\n    return (\r\n      this.fixtureDetails.fixtureType === \"floor\" &&\r\n      this.fixtureDetails.fixtureSubType !== \"shelf\"\r\n    );\r\n  }\r\n\r\n  onFloorSubTypeChange(subType: \"panel\" | \"shelf\") {\r\n    if (!this.isEditMode) return;\r\n    if (this.fixtureDetails.fixtureSubType === subType) return;\r\n\r\n    const basicDetails = this.getForm()?.get(\"basicDetails\")?.value;\r\n    this.fixtureDetails.fixtureSubType = subType;\r\n    this.fixtureDetails.shelfConfig = [];\r\n\r\n    if (subType === \"shelf\") {\r\n      this.initWallFixtureForm();\r\n      this.shelfArray.clear();\r\n      this.addShelf();\r\n      this.isHeaderEnabled = true;\r\n      this.isBodyEnabled = true;\r\n      this.isFooterEnabled = true;\r\n    } else {\r\n      this.initFloorPanelFixtureForm();\r\n      this.panelArray.clear();\r\n      this.addPanel();\r\n    }\r\n\r\n    if (basicDetails) {\r\n      this.getForm()?.get(\"basicDetails\")?.patchValue(basicDetails);\r\n    }\r\n    this.getForm()?.markAsDirty();\r\n  }\r\n\r\n  getForm() {\r\n    return this.isShelfStructure()\r\n      ? this.wallFixtureForm\r\n      : this.floorFixtureForm;\r\n  }\r\n\r\n  get shelfArray(): FormArray {\r\n    return this.wallFixtureForm.get(\"body.shelf\") as FormArray;\r\n  }\r\n\r\n  get panelArray(): FormArray {\r\n    return this.floorFixtureForm.get(\"panel\") as FormArray;\r\n  }\r\n\r\n  get totalProductCapacity(): number {\r\n    const formArray = this.isShelfStructure()\r\n      ? this.shelfArray\r\n      : this.panelArray;\r\n\r\n    return formArray.controls.reduce((total, item) => {\r\n      const count = item.get(\"productCapacity\")?.value || 0;\r\n      const isTray = item.get(\"type\")?.value === \"tray\";\r\n      const rows = item.get(\"noOfRows\")?.value || 1;\r\n\r\n      // Panel structure (and tray rows) multiply capacity by the number of rows.\r\n      return (\r\n        total + (isTray || this.isPanelStructure() ? count * rows : count)\r\n      );\r\n    }, 0);\r\n  }\r\n\r\n  initWallFixtureForm() {\r\n    this.wallFixtureForm = this.fb.group({\r\n      basicDetails: this.getBasicDetailsFormGroup(),\r\n      header: this.fb.group({\r\n        height: [this.fixtureDetails?.header?.height?.value ?? 300],\r\n      }),\r\n      body: this.fb.group({\r\n        shelf: this.fb.array([]),\r\n      }),\r\n      footer: this.fb.group({\r\n        height: [this.fixtureDetails?.footer?.height?.value ?? 300],\r\n      }),\r\n    });\r\n\r\n    this.fixtureDetails.shelfConfig?.forEach((s) => this.addShelf(s));\r\n\r\n    if (\r\n      this.fixtureDetails.shelfConfig?.length === 0 &&\r\n      !this.fixtureDetails.fixtureCategory\r\n    ) {\r\n      this.addShelf();\r\n    }\r\n\r\n    this.wallFixtureForm\r\n      .get(\"basicDetails.fixtureCategory\")\r\n      ?.valueChanges.subscribe((value) => {\r\n        this.fixtureDetails.fixtureCategory = value;\r\n      });\r\n\r\n    this.wallFixtureForm\r\n      .get(\"basicDetails.width\")\r\n      ?.valueChanges.subscribe((value) => {\r\n        if (this.fixtureDetails.fixtureWidth) {\r\n          this.fixtureDetails.fixtureWidth.value = value;\r\n        }\r\n      });\r\n  }\r\n\r\n  initFloorPanelFixtureForm() {\r\n    this.floorFixtureForm = this.fb.group({\r\n      basicDetails: this.getBasicDetailsFormGroup(),\r\n      panel: this.fb.array([]),\r\n    });\r\n\r\n    this.fixtureDetails.shelfConfig?.forEach((s) => this.addPanel(s));\r\n\r\n    this.floorFixtureForm\r\n      .get(\"basicDetails.fixtureCategory\")\r\n      ?.valueChanges.subscribe((value) => {\r\n        this.fixtureDetails.fixtureCategory = value;\r\n      });\r\n\r\n    this.floorFixtureForm\r\n      .get(\"basicDetails.width\")\r\n      ?.valueChanges.subscribe((value) => {\r\n        if (this.fixtureDetails.fixtureWidth) {\r\n          this.fixtureDetails.fixtureWidth.value = value;\r\n        }\r\n      });\r\n  }\r\n\r\n  getBasicDetailsFormGroup() {\r\n    return this.fb.group({\r\n      fixtureCategory: [\r\n        this.fixtureDetails?.fixtureCategory || \"Untitled\",\r\n        [Validators.required, generalValidator()],\r\n      ],\r\n      width: [\r\n        this.fixtureDetails?.fixtureWidth?.value ?? 6,\r\n        [Validators.required, Validators.min(0.5)],\r\n      ],\r\n      length: [\r\n        this.fixtureDetails?.fixtureLength?.value ?? 12,\r\n        [Validators.required, Validators.min(0.5)],\r\n      ],\r\n    });\r\n  }\r\n\r\n  addShelf(shelf?: any) {\r\n    const shelfGroup = this.fb.group({\r\n      type: [shelf?.shelfType ?? \"shelf\"],\r\n      productCapacity: [shelf?.productPerShelf ?? 6],\r\n      noOfRows: [shelf?.trayRows ?? 1],\r\n      zone: [shelf?.zone ?? null],\r\n    });\r\n    this.updateProductPerShelfMinValidator(\r\n      shelfGroup,\r\n      shelfGroup.get(\"type\")?.value,\r\n    );\r\n    this.setupShelfTypeListener(shelfGroup);\r\n    this.shelfArray.push(shelfGroup);\r\n  }\r\n\r\n  updateProductPerShelfMinValidator(shelfGroup: FormGroup, shelfType: string) {\r\n    const productPerShelfControl = shelfGroup.get(\"productCapacity\");\r\n    const minValue = shelfType === \"vmonly\" ? 0 : 1;\r\n\r\n    productPerShelfControl?.setValidators([Validators.min(minValue)]);\r\n    productPerShelfControl?.updateValueAndValidity({ emitEvent: false });\r\n  }\r\n\r\n  //  we need to setup a listener to the type of the shelf to enable or disable the noOfRows field\r\n  setupShelfTypeListener(shelfGroup: FormGroup) {\r\n    let previousType = shelfGroup.get(\"type\")?.value;\r\n    shelfGroup.get(\"type\")?.valueChanges.subscribe((type) => {\r\n      const productPerShelfControl = shelfGroup.get(\"productCapacity\");\r\n      if (type === \"vmonly\") {\r\n        productPerShelfControl?.setValue(0);\r\n      } else if (previousType === \"vmonly\") {\r\n        productPerShelfControl?.setValue(1);\r\n      }\r\n      previousType = type;\r\n\r\n      this.updateProductPerShelfMinValidator(shelfGroup, type);\r\n      const noOfRowsControl = shelfGroup.get(\"noOfRows\");\r\n      if (type === \"tray\") {\r\n        noOfRowsControl?.setValidators([\r\n          Validators.required,\r\n          Validators.min(1),\r\n        ]);\r\n        noOfRowsControl?.setValue(1);\r\n      } else {\r\n        noOfRowsControl?.clearValidators();\r\n        noOfRowsControl?.setValue(null);\r\n      }\r\n      noOfRowsControl?.updateValueAndValidity();\r\n    });\r\n  }\r\n\r\n  // If index is not given, last shelf should be removed\r\n  removeShelf(index: number = this.shelfArray.controls.length - 1) {\r\n    if (this.shelfArray.controls.length == 1) return;\r\n    this.shelfArray.removeAt(index);\r\n  }\r\n\r\n  addPanel(panel?: FixtureLibraryShelfConfig) {\r\n    const panelGroup = this.fb.group({\r\n      panelName: [panel?.label, [Validators.required, generalValidator()]],\r\n      productCapacity: [\r\n        panel?.productPerShelf ?? 6,\r\n        [Validators.required, Validators.min(0)],\r\n      ],\r\n      noOfRows: [\r\n        panel?.trayRows ?? 5,\r\n        [Validators.required, Validators.min(1)],\r\n      ],\r\n      zone: [(panel as any)?.zone ?? \"All\"],\r\n    });\r\n\r\n    this.panelArray.push(panelGroup);\r\n  }\r\n\r\n  autoAssignWallZones() {\r\n    if (!this.isEditMode) return;\r\n    const shelfCount = this.shelfArray.controls.length;\r\n    if (shelfCount === 0) return;\r\n\r\n    const shelvesPerZone = Math.floor(shelfCount / 3);\r\n    const remainder = shelfCount % 3;\r\n    const topCount = shelvesPerZone + (remainder >= 1 ? 1 : 0);\r\n    const midCount = shelvesPerZone + (remainder >= 2 ? 1 : 0);\r\n\r\n    this.shelfArray.controls.forEach((shelf, index) => {\r\n      let zone: string;\r\n      if (index < topCount) zone = \"Top\";\r\n      else if (index < topCount + midCount) zone = \"Mid\";\r\n      else zone = \"Bottom\";\r\n      shelf.get(\"zone\")?.setValue(zone);\r\n    });\r\n    this.wallFixtureForm.markAsDirty();\r\n  }\r\n\r\n  // If index is not given, last panel should be removed\r\n  removePanel(index: number = this.panelArray.controls.length - 1) {\r\n    if (this.panelArray.controls.length == 1) return;\r\n    this.panelArray.removeAt(index);\r\n  }\r\n\r\n  toggleSection(section: \"header\" | \"body\" | \"footer\") {\r\n    this.toggleSectionForm(section);\r\n    this.toggleSectionCheckBox(section);\r\n  }\r\n\r\n  toggleSectionForm(section: \"header\" | \"body\" | \"footer\") {\r\n    const form = this.getForm();\r\n    const group = form.get(section);\r\n    if (group) {\r\n      group.enabled\r\n        ? group.disable({ emitEvent: false })\r\n        : group.enable({ emitEvent: false });\r\n    }\r\n  }\r\n\r\n  toggleSectionCheckBox(section: \"header\" | \"body\" | \"footer\") {\r\n    switch (section) {\r\n      case \"header\":\r\n        this.isHeaderEnabled = !this.isHeaderEnabled;\r\n        break;\r\n      case \"body\":\r\n        this.isBodyEnabled = !this.isBodyEnabled;\r\n        break;\r\n      case \"footer\":\r\n        this.isFooterEnabled = !this.isFooterEnabled;\r\n        break;\r\n    }\r\n  }\r\n\r\n  mapFormToApi(form: FormGroup, status: string): any {\r\n    const formValue = form.value;\r\n    const formArray = this.isShelfStructure()\r\n      ? this.shelfArray\r\n      : this.panelArray;\r\n\r\n    return {\r\n      status: status,\r\n      clientId: this.clientId,\r\n      fixtureCategory: this.fixtureDetails.fixtureCategory,\r\n      fixtureSubType: this.fixtureDetails.fixtureSubType,\r\n      fixtureCapacity: this.totalProductCapacity,\r\n      fixtureLength: {\r\n        value: formValue.basicDetails.length,\r\n        unit: \"ft\",\r\n      },\r\n      fixtureWidth: {\r\n        value: formValue.basicDetails.width,\r\n        unit: \"ft\",\r\n      },\r\n      header: {\r\n        height: {\r\n          value: form.get(\"header.height\")?.value,\r\n          unit: \"mm\",\r\n        },\r\n        label: \"\",\r\n        isEnabled: !form.get(\"header\")?.disabled,\r\n      },\r\n      footer: {\r\n        height: {\r\n          value: form.get(\"footer.height\")?.value,\r\n          unit: \"mm\",\r\n        },\r\n        label: \"\",\r\n        isEnabled: !form.get(\"footer\")?.disabled,\r\n      },\r\n      isBodyEnabled: !form.get(\"body\")?.disabled,\r\n      shelfConfig: formArray.controls.map((e, i) => {\r\n        return {\r\n          shelfNumber: i + 1,\r\n          shelfType: e?.value?.type ?? \"tray\",\r\n          productPerShelf: e.value.productCapacity,\r\n          trayRows: e?.value?.noOfRows ?? 1,\r\n          label: e?.value?.panelName ?? \"\",\r\n          zone: e?.value?.zone ?? null,\r\n        };\r\n      }),\r\n    };\r\n  }\r\n\r\n  async onSubmit(status: string): Promise<boolean> {\r\n    try {\r\n      const form = this.getForm();\r\n\r\n      if (form.invalid) {\r\n        form.markAllAsTouched();\r\n        this.toast.getErrorToast(\"Form is invalid\");\r\n        return false;\r\n      }\r\n\r\n      if (status === \"complete\") {\r\n        const formArray = this.isShelfStructure()\r\n          ? this.shelfArray\r\n          : this.panelArray;\r\n        const missingZone = formArray.controls.some((c) => !c.value.zone);\r\n        if (missingZone) {\r\n          this.toast.getErrorToast(\r\n            \"Each shelf must have a zone before completing.\",\r\n          );\r\n          return false;\r\n        }\r\n\r\n        if (!(await this.confirmCompletion())) return false;\r\n      }\r\n\r\n      const transformedData = this.mapFormToApi(form, status);\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService.updateFixtureLibrary(\r\n          transformedData,\r\n          this.fixtureDetails?._id!,\r\n        ),\r\n      );\r\n\r\n      if (res && res?.status === \"success\") {\r\n        this.fixtureDetails.status = status;\r\n        this.toast.getSuccessToast(res.message);\r\n        this.canGoBack = true;\r\n        this.router.navigate([\"manage/planogram/library/fixtures\"]);\r\n        return true;\r\n      }\r\n\r\n      return false;\r\n    } catch (err: any) {\r\n      this.toast.getErrorToast(\r\n        err?.error?.error ?? \"Failed to save Fixture details\",\r\n      );\r\n      console.log(\"@@ ~ updateFixtureLibrary err:\", err);\r\n      return false;\r\n    }\r\n\r\n    // this.storeBuilderService.updateFixtureLibrary(transformedData, this.fixtureDetails?._id!).subscribe({\r\n    //   next: (res: any) => {\r\n    //     if (res?.status === 'success') {\r\n    //       this.fixtureDetails.status = status;\r\n    //       this.toast.getSuccessToast(res.message);\r\n    //       this.router.navigate(['manage/planogram/library/fixtures']);\r\n    //       return true;\r\n    //     }\r\n    //   },\r\n    //   error: (err) => {\r\n    //     this.toast.getErrorToast(err?.error?.error ?? \"Failed to save Fixture details\");\r\n    //     console.log(\"@@ ~ updateFixtureLibrary err:\", err);\r\n    //     return false;\r\n    //   }\r\n    // })\r\n  }\r\n\r\n  async canDeactivate(): Promise<boolean> {\r\n    if (this.canGoBack) return true;\r\n\r\n    const form = this.getForm();\r\n\r\n    if (form.dirty) {\r\n      const result = await this.confirmExit();\r\n\r\n      if (result === null) {\r\n        return false;\r\n      }\r\n\r\n      if (result) {\r\n        return await this.onSubmit(\"draft\");\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  async confirmExit(): Promise<boolean | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ExitConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Complete fixture\";\r\n    modelRef.componentInstance.description =\r\n      \"Fixture is now ready and available to create as template.\";\r\n    modelRef.componentInstance.note =\r\n      \"You can't edit it once assigned to the template.\";\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  onDuplicate() {\r\n    this.storeBuilderService\r\n      .duplicateFixtureLibrary({\r\n        fixtureId: this.fixtureDetails._id,\r\n      })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.toast.getSuccessToast(res.data.message);\r\n            this.canGoBack = true;\r\n            this.router.navigate([\"/manage/planogram/create-library-fixture\"], {\r\n              queryParams: { fixtureId: res?.data?.id },\r\n            });\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to duplicate Fixture\",\r\n          );\r\n          console.log(\"@@ ~ duplicateFixtureLibrary err:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    modelRef.componentInstance.title = \"Delete fixture\";\r\n    modelRef.componentInstance.description =\r\n      \"Are you sure you want to delete this fixture ?\";\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n  }\r\n\r\n  async onDelete() {\r\n    if (this.fixtureDetails.templateId) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Can’t delete fixture!`;\r\n      modelRef.componentInstance.description = `Since this fixture is live in \"${this.fixtureDetails.templateId} templates,\" deleting is not allowed.`;\r\n      return;\r\n    }\r\n\r\n    if (!(await this.confirmDeletion())) return;\r\n    this.storeBuilderService\r\n      .deleteFixtureLibrary({ fixtureId: this.fixtureDetails._id })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.toast.getSuccessToast(res.message);\r\n            this.canGoBack = true;\r\n            this.router.navigate([\"manage/planogram/library/fixtures\"]);\r\n          }\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.error || \"Failed to delete Fixture\",\r\n          );\r\n          console.log(\"@@ ~ deleteFixtureLibrary err:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  onClickEdit() {\r\n    if (this.fixtureDetails.templateId) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = `Can’t edit fixture!`;\r\n      modelRef.componentInstance.description = `Since this fixture is live in \"${this.fixtureDetails.templateId} templates,\" editing is not allowed.`;\r\n      return;\r\n    }\r\n\r\n    this.isEditMode = true;\r\n    this.floorFixtureForm?.enable({ emitEvent: false });\r\n    this.wallFixtureForm?.enable({ emitEvent: false });\r\n\r\n    if (this.isShelfStructure()) {\r\n      if (!this.fixtureDetails.header?.isEnabled)\r\n        this.toggleSectionForm(\"header\");\r\n      if (!this.fixtureDetails.footer?.isEnabled)\r\n        this.toggleSectionForm(\"footer\");\r\n      if (!this.fixtureDetails.isBodyEnabled) this.toggleSectionForm(\"body\");\r\n    }\r\n\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      replaceUrl: true,\r\n      queryParams: { isEdit: true },\r\n      queryParamsHandling: \"merge\",\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n  <!-- Header section -->\r\n  <div class=\"header\">\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </button>\r\n      <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n        [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n        {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n        {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n      </h2>\r\n      <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n    </div>\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n        [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n        Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n      </p>\r\n      <div *ngIf=\"!isEditMode\">\r\n        <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <g clip-path=\"url(#clip0_1322_5325)\">\r\n              <path\r\n                d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_1322_5325\">\r\n                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n          Edit\r\n        </button>\r\n      </div>\r\n\r\n      <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n        <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n        <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n      </div>\r\n\r\n      <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n        <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n              stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            <path\r\n              d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n              stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            <path\r\n              d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n              stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </button>\r\n\r\n        <ul class=\"dropdown-menu\">\r\n          <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n          <li>\r\n            <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Shelf-structured fixture (Wall, or Floor with shelf sub-type) -->\r\n  <div class=\"row gap-4 builder\" *ngIf=\"isShelfStructure()\">\r\n    <!-- Wall Fixture Form -->\r\n    <div class=\"cols col\">\r\n      <div>\r\n        <h2>Fixture Details</h2>\r\n        <p>Configure your fixture details here</p>\r\n        <form [formGroup]=\"wallFixtureForm\">\r\n          <div ngbAccordion #accordion=\"ngbAccordion\">\r\n            <!-- Basic Details -->\r\n            <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n              <h2 ngbAccordionHeader>\r\n                <button ngbAccordionButton>BASIC DETAILS</button>\r\n              </h2>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n                      <div class=\"form-group\">\r\n                        <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n                        <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n                          formControlName=\"fixtureCategory\" />\r\n                        <ng-container *ngIf=\"\r\n                            wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n                            wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n                            Fixture name is required.\r\n                          </small>\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n                            Fixture name cannot be only whitespace.\r\n                          </small>\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n                            No leading or trailing whitespace allowed.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n\r\n                      <div class=\"mt-4\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n                        <label class=\"form-label mb-2\">Sub-type</label>\r\n                        <div class=\"d-flex gap-4\">\r\n                          <div class=\"form-check\">\r\n                            <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelShelf\" name=\"floorSubType\"\r\n                              [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n                              [disabled]=\"!isEditMode\"\r\n                              (change)=\"onFloorSubTypeChange('panel')\" />\r\n                            <label class=\"form-check-label\" for=\"subTypePanelShelf\">Panel</label>\r\n                          </div>\r\n                          <div class=\"form-check\">\r\n                            <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfShelf\" name=\"floorSubType\"\r\n                              [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n                              [disabled]=\"!isEditMode\"\r\n                              (change)=\"onFloorSubTypeChange('shelf')\" />\r\n                            <label class=\"form-check-label\" for=\"subTypeShelfShelf\">Shelf</label>\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n\r\n                      <div class=\"mb-4\">\r\n                        <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                          <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n                          <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n                            placeholder=\"0\"></counter-input>\r\n                        </div>\r\n                        <ng-container *ngIf=\"\r\n                            wallFixtureForm.get('basicDetails.width')?.touched &&\r\n                            wallFixtureForm.get('basicDetails.width')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n                            Overall width cannot be zero.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n\r\n                      <div class=\"mb-4\">\r\n                        <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                          <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n                          <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n                            placeholder=\"0\"></counter-input>\r\n                        </div>\r\n                        <ng-container *ngIf=\"\r\n                            wallFixtureForm.get('basicDetails.length')?.touched &&\r\n                            wallFixtureForm.get('basicDetails.length')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n                            Overall height cannot be zero.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Header Section -->\r\n            <div ngbAccordionItem=\"header\">\r\n              <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n                <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n                  (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n                  [disabled]=\"!isEditMode\" />\r\n                <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n                  <button ngbAccordionButton>HEADER</button>\r\n                </h2>\r\n              </div>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n                      <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                        <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n                        <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n                          placeholder=\"0\"></counter-input>\r\n                      </div>\r\n                      <ng-container\r\n                        *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n                        <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n                          Header height cannot be zero.\r\n                        </small>\r\n                      </ng-container>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Body Section -->\r\n            <div ngbAccordionItem=\"body\">\r\n              <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n                <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n                  (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n                <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n                  <button ngbAccordionButton>BODY</button>\r\n                </h2>\r\n              </div>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n                      <div class=\"mb-3\">\r\n                        <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                          <label>No of shelves</label>\r\n                          <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n                            <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                              xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n                              <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <span>{{ shelfArray.length }}</span>\r\n                            <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                              xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n                              <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n                                stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                          </div>\r\n                        </div>\r\n                        <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n                          At least one shelf is required.\r\n                        </small>\r\n                      </div>\r\n\r\n                      <datalist id=\"wallZoneOptions\">\r\n                        <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n                      </datalist>\r\n\r\n                      <div *ngIf=\"shelfArray?.length\"\r\n                        class=\"d-flex justify-content-end mb-3\">\r\n                        <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n                          [disabled]=\"!isEditMode\"\r\n                          (click)=\"autoAssignWallZones()\">\r\n                          Auto-zone shelves\r\n                        </button>\r\n                      </div>\r\n\r\n                      <div *ngIf=\"shelfArray?.length\">\r\n                        <div formArrayName=\"shelf\">\r\n                          <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n                            class=\"array-group\">\r\n                            <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                              <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n                              <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n                                xmlns=\"http://www.w3.org/2000/svg\"\r\n                                (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n                                [class.disabled-click]=\"!isEditMode\">\r\n                                <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                            </div>\r\n\r\n                            <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n                              formControlName=\"type\">\r\n                            </lib-reactive-select>\r\n\r\n                            <div class=\"mt-3\">\r\n                              <label class=\"mb-1\">Zone</label>\r\n                              <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n                                list=\"wallZoneOptions\"\r\n                                placeholder=\"e.g. Top, Mid, Bottom\" />\r\n                            </div>\r\n\r\n                            <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n                              <div class=\"mb-4\">\r\n                                <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                                  <label>No of rows</label>\r\n                                  <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n                                    placeholder=\"0\"></counter-input>\r\n                                </div>\r\n\r\n                                <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n                                  <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n                                    Must be at least 1 row.\r\n                                  </small>\r\n                                </ng-container>\r\n                              </div>\r\n                            </ng-container>\r\n\r\n                            <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n                              *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n                              <label>Product capacity for each row</label>\r\n                              <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n                                placeholder=\"0\"></counter-input>\r\n                            </div>\r\n\r\n                            <ng-container\r\n                              *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n                              <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n                                Product capacity cannot be zero.\r\n                              </small>\r\n                            </ng-container>\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer Section -->\r\n            <div ngbAccordionItem=\"footer\">\r\n              <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n                <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n                  (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n                <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n                  <button ngbAccordionButton>FOOTER</button>\r\n                </h2>\r\n              </div>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n                      <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                        <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n                        <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n                          placeholder=\"0\"></counter-input>\r\n                      </div>\r\n                      <ng-container\r\n                        *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n                        <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n                          Footer height cannot be zero.\r\n                        </small>\r\n                      </ng-container>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </form>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Wall Fixture Preview -->\r\n    <div class=\"cols col-8\">\r\n      <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n        <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n          class=\"d-flex justify-content-center w-100\">\r\n          <div class=\"vertical-dimension\">\r\n            <div class=\"arrow up\"></div>\r\n            <div class=\"line\">\r\n              <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n                {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n              </span>\r\n            </div>\r\n            <div class=\"arrow down\"></div>\r\n          </div>\r\n\r\n          <div class=\"wall-viewport\">\r\n            <!-- Header Preview -->\r\n            <div class=\"wrapper\">\r\n              <ng-container *ngTemplateOutlet=\"\r\n                  dimensionArrows;\r\n                  context: {\r\n                    value: wallFixtureForm.get('basicDetails.width')?.value\r\n                  }\r\n                \"></ng-container>\r\n            </div>\r\n            <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n              <div class=\"wrapper\">\r\n                <div class=\"header-block\"></div>\r\n              </div>\r\n              <div class=\"header-info\">\r\n                <p>HEADER</p>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Body Preview -->\r\n            <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n              <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n                @if(item.get('type')?.value ==='tray'){\r\n                  <div class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"body-info\">\r\n                    TRAY {{ i + 1 }}\r\n                    <b class=\"ms-3\">Products:\r\n                      {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n                  </div>\r\n                }@else {\r\n                  <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"body-info\">\r\n                    <p>\r\n                      {{item.get('type')?.value ==='vmonly' ?  'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n                        class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n                    </p>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Footer Preview -->\r\n            <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n              <div class=\"wrapper footer-block\">\r\n                <div class=\"row m-0 h-100 gap-3 w-100\">\r\n                  <div class=\"col sub-footer\"></div>\r\n                  <div class=\"col sub-footer\"></div>\r\n                </div>\r\n              </div>\r\n              <div class=\"footer-info\">\r\n                <p>FOOTER</p>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <ng-template #emptyFixture>\r\n          <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n            <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n          </div>\r\n        </ng-template>\r\n      </div>\r\n\r\n      <!-- Info Cards -->\r\n      <div class=\"d-flex w-100 gap-2\">\r\n        <div class=\"col info-card\">\r\n          <h3>{{ shelfArray.length }}</h3>\r\n          <p>No of Shelves</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>{{ totalProductCapacity }}</h3>\r\n          <p>Product Capacity</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n          <p>Type</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>\r\n            {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n            {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n          </h3>\r\n          <p>Overall Dimension</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Floor panel-structured fixture -->\r\n  <div class=\"row gap-4 builder\" *ngIf=\"isPanelStructure()\">\r\n    <!-- Floor Panel Form -->\r\n    <div class=\"cols col\">\r\n      <div>\r\n        <h2>Fixture Details</h2>\r\n        <p>The settings are pre-configured and cannot be edited</p>\r\n        <form [formGroup]=\"floorFixtureForm\">\r\n          <div ngbAccordion #accordion=\"ngbAccordion\">\r\n            <!-- Basic Details -->\r\n            <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n              <h2 ngbAccordionHeader>\r\n                <button ngbAccordionButton>BASIC DETAILS</button>\r\n              </h2>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n                      <div class=\"form-group\">\r\n                        <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n                        <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n                          formControlName=\"fixtureCategory\" />\r\n                        <ng-container *ngIf=\"\r\n                            floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n                            floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n                            Fixture name is required.\r\n                          </small>\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n                            Fixture name cannot be only whitespace.\r\n                          </small>\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n                            No leading or trailing whitespace allowed.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n\r\n                      <div class=\"mt-4\">\r\n                        <label class=\"form-label mb-2\">Sub-type</label>\r\n                        <div class=\"d-flex gap-4\">\r\n                          <div class=\"form-check\">\r\n                            <input type=\"radio\" class=\"form-check-input\" id=\"subTypePanelPanel\" name=\"floorSubType\"\r\n                              [checked]=\"fixtureDetails.fixtureSubType === 'panel'\"\r\n                              [disabled]=\"!isEditMode\"\r\n                              (change)=\"onFloorSubTypeChange('panel')\" />\r\n                            <label class=\"form-check-label\" for=\"subTypePanelPanel\">Panel</label>\r\n                          </div>\r\n                          <div class=\"form-check\">\r\n                            <input type=\"radio\" class=\"form-check-input\" id=\"subTypeShelfPanel\" name=\"floorSubType\"\r\n                              [checked]=\"fixtureDetails.fixtureSubType === 'shelf'\"\r\n                              [disabled]=\"!isEditMode\"\r\n                              (change)=\"onFloorSubTypeChange('shelf')\" />\r\n                            <label class=\"form-check-label\" for=\"subTypeShelfPanel\">Shelf</label>\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n\r\n                      <div class=\"mb-4\">\r\n                        <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                          <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n                          <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n                            placeholder=\"0\"></counter-input>\r\n                        </div>\r\n                        <ng-container *ngIf=\"\r\n                            floorFixtureForm.get('basicDetails.width')?.touched &&\r\n                            floorFixtureForm.get('basicDetails.width')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n                            Overall width cannot be zero.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n                      <div class=\"mb-4\">\r\n                        <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                          <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n                          <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n                            placeholder=\"0\"></counter-input>\r\n                        </div>\r\n                        <ng-container *ngIf=\"\r\n                            floorFixtureForm.get('basicDetails.length')?.touched &&\r\n                            floorFixtureForm.get('basicDetails.length')?.invalid\r\n                          \">\r\n                          <small class=\"text-danger\"\r\n                            *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n                            Overall height cannot be zero.\r\n                          </small>\r\n                        </ng-container>\r\n                      </div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n\r\n            <!-- Panel Section -->\r\n            <div ngbAccordionItem=\"panel\">\r\n              <h2 ngbAccordionHeader>\r\n                <button ngbAccordionButton>PANEL</button>\r\n              </h2>\r\n              <div ngbAccordionCollapse>\r\n                <div ngbAccordionBody>\r\n                  <ng-template>\r\n                    <div class=\"mb-3\">\r\n                      <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                        <label>No of panels</label>\r\n                        <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n                          <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n                            <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                              stroke-linejoin=\"round\" />\r\n                          </svg>\r\n\r\n                          <span>{{ panelArray.length }}</span>\r\n\r\n                          <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n                            <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n                              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </div>\r\n                      </div>\r\n                      <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n                        At least one panel is required.\r\n                      </small>\r\n                    </div>\r\n\r\n                    <datalist id=\"floorZoneOptions\">\r\n                      <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n                    </datalist>\r\n\r\n                    <div *ngIf=\"panelArray?.length\">\r\n                      <div formArrayName=\"panel\">\r\n                        <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n                          class=\"array-group\">\r\n                          <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n                            <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n                            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n                              xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n                              [class.disabled-click]=\"!isEditMode\">\r\n                              <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                          </div>\r\n\r\n                          <div class=\"\">\r\n                            <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n                            <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n                              <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n                                Panel name is required.\r\n                              </small>\r\n                              <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n                                Panel name cannot be only whitespace.\r\n                              </small>\r\n                              <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n                                No leading or trailing whitespace allowed.\r\n                              </small>\r\n                            </ng-container>\r\n                          </div>\r\n\r\n                          <div class=\"mt-3\">\r\n                            <label class=\"mb-1\">Zone</label>\r\n                            <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n                              list=\"floorZoneOptions\"\r\n                              placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n                          </div>\r\n\r\n                          <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                            <label>No of rows</label>\r\n                            <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n                              placeholder=\"0\"></counter-input>\r\n                          </div>\r\n\r\n                          <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n                            <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n                              Must be at least 1 row.\r\n                            </small>\r\n                          </ng-container>\r\n\r\n                          <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n                            <label>Product capacity for each row</label>\r\n                            <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n                              placeholder=\"0\"></counter-input>\r\n                          </div>\r\n                          <ng-container\r\n                            *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n                            <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n                              Product capacity cannot be zero.\r\n                            </small>\r\n                          </ng-container>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </ng-template>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </form>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Floor Panel Preview -->\r\n    <div class=\"cols col-8\">\r\n      <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n        <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n          <div class=\"d-flex flex-column align-items-start\">\r\n            <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n              <div class=\"vertical-dimension\">\r\n                <div class=\"arrow up\"></div>\r\n                <div class=\"line\">\r\n                  <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n                    {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n                  </span>\r\n                </div>\r\n                <div class=\"arrow down\"></div>\r\n              </div>\r\n              <div class=\"wrapper\">\r\n                <ng-container *ngTemplateOutlet=\"\r\n                    dimensionArrows;\r\n                    context: {\r\n                      value: floorFixtureForm.get('basicDetails.width')?.value\r\n                    }\r\n                  \"></ng-container>\r\n\r\n                <div class=\"shelfContainer\">\r\n                  <div class=\"block\">\r\n                    <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n                      <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              <div class=\"panel-info\">\r\n                PANEL {{ i + 1 }}\r\n                <b class=\"ms-3\">Products:\r\n                  {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n              </div>\r\n            </div>\r\n\r\n            <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n              <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n                  fill=\"#475467\" />\r\n                <path\r\n                  d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n                  fill=\"#475467\" />\r\n                <path\r\n                  d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n                  fill=\"#475467\" />\r\n                <path\r\n                  d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n                  fill=\"#475467\" />\r\n                <path\r\n                  d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n                  fill=\"#475467\" />\r\n              </svg>\r\n\r\n              <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                  d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n                  fill=\"#1D2939\" />\r\n                <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n              </svg>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <ng-template #noPanel>\r\n          <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n            <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n          </div>\r\n        </ng-template>\r\n      </div>\r\n\r\n      <!-- Info Cards -->\r\n      <div class=\"d-flex w-100 gap-2\">\r\n        <div class=\"col info-card\">\r\n          <h3>{{ panelArray.length }}</h3>\r\n          <p>No of Panels</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>{{ totalProductCapacity }}</h3>\r\n          <p>Product Capacity</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n          <p>Type</p>\r\n        </div>\r\n        <div class=\"col info-card\">\r\n          <h3>\r\n            {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n            {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n            {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n          </h3>\r\n          <p>Overall Dimension</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>","import { Component, Input, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { VMTypeDetails } from '../../../../interfaces/vm-library.interface';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: 'app-add-vm-type',\r\n  templateUrl: './add-vm-type.component.html',\r\n  styleUrl: './add-vm-type.component.scss'\r\n})\r\nexport class AddVmTypeComponent implements OnInit {\r\n  @Input() clientId: string\r\n  @Input() vmTypesList: VMTypeDetails[] = []\r\n\r\n  vmTypesForm: FormGroup\r\n\r\n  isLoading: boolean = true\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n  ) {\r\n    this.vmTypesForm = this.fb.group({\r\n      types: this.fb.array([])\r\n    })\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    if (this.vmTypesList.length) {\r\n      this.vmTypesList.forEach(e => {\r\n        this.onAddType(e);\r\n      });\r\n    } else {\r\n      this.onAddType();\r\n    }\r\n    this.isLoading = false\r\n  }\r\n\r\n  get vmTypesArray(): FormArray {\r\n    return this.vmTypesForm.get('types') as FormArray;\r\n  }\r\n\r\n  onDeleteType(index: number) {\r\n    if (!this.vmTypesList[index]?.isUsed) {\r\n      this.vmTypesArray.removeAt(index);\r\n    }\r\n  }\r\n\r\n  onAddType(item?: VMTypeDetails) {\r\n    const vmTypeGroup = this.fb.group({\r\n      vmType: [{ value: item?.vmType || '', disabled: item?.isUsed }, Validators.required],\r\n      imageUrls: [item?.imageUrls || []]\r\n    })\r\n\r\n    this.vmTypesArray.push(vmTypeGroup)\r\n  }\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onSave() {\r\n    if (this.vmTypesArray.controls.length <= 0) {\r\n      this.toast.getErrorToast(\"Add at least one VM Type\");\r\n      return;\r\n    }\r\n\r\n    if (this.vmTypesForm.invalid) {\r\n      this.vmTypesForm.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    if (this.vmTypesForm.valid) {\r\n      const payload = {\r\n        \"clientId\": this.clientId,\r\n        \"vmData\": this.vmTypesForm.getRawValue().types\r\n      }\r\n\r\n      this.storeBuilderService.manageVmType(payload).subscribe({\r\n        next: (res: any) => {\r\n          this.activeModal.close(res?.status);\r\n        },\r\n        error: (err) => {\r\n          this.toast.getErrorToast(err?.error?.error || \"Failed to Add VM Type\");\r\n          console.log(err)\r\n        }\r\n      })\r\n    } else {\r\n      this.toast.getErrorToast(\"Fill VM type name\");\r\n    }\r\n\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <h3 class=\"mb-4\">Add VM Type</h3>\r\n\r\n  <form [formGroup]=\"vmTypesForm\" *ngIf=\"!isLoading\">\r\n    <div formArrayName=\"types\" class=\"form-wrapper\">\r\n      <div *ngFor=\"let type of vmTypesArray.controls; let i = index\">\r\n        <div class=\"mb-3\">\r\n          <div class=\"d-flex justify-content-between align-items-center gap-3\" [formGroupName]=\"i\">\r\n            <input\r\n              type=\"text\"\r\n              formControlName=\"vmType\"\r\n              class=\"w-100 form-control\"\r\n              placeholder=\"eg., A4 Posters, Banner tc.,\"\r\n              ngbTooltip=\"Type is in use, cannot modify\"\r\n              [disableTooltip]=\"type?.get('vmType')?.enabled ?? false\"\r\n            />\r\n            <svg\r\n              [class.disabled-click]=\"type?.get('vmType')?.disabled\"\r\n              class=\"cursor-pointer\"\r\n              (click)=\"onDeleteType(i)\"\r\n              xmlns=\"http://www.w3.org/2000/svg\"\r\n              width=\"24\"\r\n              height=\"24\"\r\n              viewBox=\"0 0 24 24\"\r\n              fill=\"none\"\r\n            >\r\n              <path\r\n                d=\"M3 6H5M5 6H21M5 6V20C5 20.5304 5.21071 21.0391 5.58579 21.4142C5.96086 21.7893 6.46957 22 7 22H17C17.5304 22 18.0391 21.7893 18.4142 21.4142C18.7893 21.0391 19 20.5304 19 20V6H5ZM8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6M10 11V17M14 11V17\"\r\n                stroke=\"#101828\"\r\n                stroke-width=\"2\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </svg>\r\n          </div>\r\n          <ng-container *ngIf=\"type.get('vmType')?.touched && type.get('vmType')?.invalid\">\r\n            <small class=\"text-danger ms-2 mt-1\" *ngIf=\"type.get('vmType')?.hasError('required')\">Field is required</small>\r\n          </ng-container>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <button type=\"button\" class=\"btn btn-secondary px-4 mb-5\" (click)=\"onAddType()\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n        <path\r\n          d=\"M9.99935 4.16666V15.8333M4.16602 10H15.8327\"\r\n          stroke=\"#667085\"\r\n          stroke-width=\"1.67\"\r\n          stroke-linecap=\"round\"\r\n          stroke-linejoin=\"round\"\r\n        />\r\n      </svg>\r\n      Add\r\n    </button>\r\n\r\n    <div class=\"modal-actions\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onSave()\">Save</button>\r\n    </div>\r\n  </form>\r\n\r\n  <div *ngIf=\"isLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { NgbAccordionModule, NgbModal, NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\r\nimport { debounceTime, distinctUntilChanged, filter, firstValueFrom, map, Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { DropdownIF } from '../../interfaces/plano-general.interface';\r\nimport { AddVmTypeComponent } from './popups/add-vm-type/add-vm-type.component';\r\nimport { generalValidator, removeEmptyFields } from '../../functions/plano.function';\r\nimport { PlanoDataService } from '../../services/plano-data.service';\r\nimport { BrandDetails, VMLibraryDetails, VMTypeDetails } from '../../interfaces/vm-library.interface';\r\nimport { CompleteConfirmationComponent } from '../popups/complete-confirmation/complete-confirmation.component';\r\nimport { DeleteConfirmationComponent } from '../popups/delete-confirmation/delete-confirmation.component';\r\nimport { CannotPerformComponent } from '../popups/cannot-perform/cannot-perform.component';\r\nimport { CanExitGuard } from '../../functions/exit.guard';\r\nimport { ExitConfirmationComponent } from '../popups/exit-confirmation/exit-confirmation.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TimeAgoPipe } from '../../pipes/time-ago.pipe';\r\nimport { CounterInputComponent } from '../counter-input/counter-input.component';\r\nimport { ReactiveSelectComponent } from '../reactive-select/reactive-select.component';\r\n\r\n@Component({\r\n  selector: 'lib-create-vm',\r\n  templateUrl: './create-vm.component.html',\r\n  styleUrl: './create-vm.component.scss',\r\n  standalone: true,\r\n  imports: [CounterInputComponent, FormsModule, ReactiveFormsModule, CommonModule, TimeAgoPipe, NgbAccordionModule, ReactiveSelectComponent, RouterLink, NgbTooltip]\r\n})\r\nexport class CreateVmComponent implements OnInit, OnDestroy, CanExitGuard {\r\n  clientId: string;\r\n  isPageLoading: boolean = true;\r\n\r\n  vmDetails: VMLibraryDetails = {}\r\n  addUpdateVmForm: FormGroup;\r\n\r\n  vmTypesList: VMTypeDetails[] = []\r\n  selectedVmType: VMTypeDetails | undefined;\r\n\r\n  unitsList = [\r\n    { label: 'mm', value: 'mm' },\r\n    { label: 'cm', value: 'cm' },\r\n    { label: 'Inches', value: 'inch' },\r\n    { label: 'Feet', value: 'ft' },\r\n  ]\r\n\r\n  brandsList: BrandDetails[] = []\r\n  categoriesList: DropdownIF[] = []\r\n  subCategoriesList: DropdownIF[] = []\r\n\r\n\r\n  vmImagesList: string[] = [];\r\n  selectedVmImageIndex = 0;\r\n  uploadImage: File;\r\n  imgCDN: string;\r\n\r\n  isEditMode: boolean = false;\r\n\r\n  canGoBack: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private fb: FormBuilder,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private planoDataService: PlanoDataService,\r\n    private toast: ToastService,\r\n    private router: Router,\r\n    private gs: GlobalStateService,\r\n    private ngbModal: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => this.imgCDN = env.planogramCDN);\r\n    this.planoDataService.brandsList.pipe(takeUntil(this.destroy$)).subscribe((e) => this.brandsList = e);\r\n    const params = this.route.snapshot.queryParams;\r\n\r\n    this.vmDetails._id = params['vmId'] ?? '';\r\n    this.isEditMode = params['isEdit'] == 'true';\r\n\r\n    this.getClientId();\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Create Visual Merchandise\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      { title: \"Planogram\", path: \"/manage/planogram/manage-planograms\", isActive: false, isSeparator: false },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      { title: \"Library\", path: \"/manage/planogram/library/fixtures\", isActive: false, isSeparator: false },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n\r\n  getClientId() {\r\n    this.gs.dataRangeValue.pipe(\r\n      takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n      debounceTime(200), // To avoid immediate frequent calls. \r\n      filter(data => !!data), // Filtering null/undefined.\r\n      distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n    ).subscribe(async (data: any) => {\r\n      if (data?.client) {\r\n        this.clientId = data?.client;\r\n      } else {\r\n        let headerData = JSON.parse(localStorage.getItem('header-filters') as string);\r\n        this.clientId = headerData?.client;\r\n      }\r\n\r\n      await Promise.all([\r\n        this.getVmTypes(),\r\n        this.planoDataService.fetchBrandsList(this.clientId)\r\n      ]);\r\n\r\n      this.route.queryParams\r\n        .pipe(\r\n          map(params => params['vmId']), distinctUntilChanged(), takeUntil(this.destroy$)\r\n        )\r\n        .subscribe(async id => {\r\n          this.getVmLibDetails(id);\r\n        })\r\n    })\r\n  }\r\n\r\n  // Fetching vmDetails and stops the loading.\r\n  getVmLibDetails(vmId?: string) {\r\n    if (!vmId) {\r\n      this.vmDetails.vmName = 'Untitled VM';\r\n      this.initAddUpdateVmForm();\r\n      this.isPageLoading = false;\r\n      this.addUpdateVmForm.markAsDirty()\r\n      return;\r\n    };\r\n\r\n    this.storeBuilderService.getVmLibraryDetails(vmId).subscribe({\r\n      next: (res: any) => {\r\n        let details = res.data;\r\n        if (details) {\r\n\r\n          this.vmDetails = {\r\n            ...details\r\n          }\r\n\r\n          this.initAddUpdateVmForm();\r\n          this.isPageLoading = false;\r\n          this.canGoBack = false;\r\n        }\r\n      },\r\n      error: (err) => {\r\n        console.log(err)\r\n        this.isPageLoading = false;\r\n        // this.isError = true;\r\n      }\r\n    })\r\n  }\r\n\r\n  async getVmTypes() {\r\n    try {\r\n      const res: any = await firstValueFrom(this.storeBuilderService.getVmTypesList(this.clientId));\r\n      if (res?.data) {\r\n        this.vmTypesList = res.data;\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getVmTypes [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  initAddUpdateVmForm() {\r\n    this.addUpdateVmForm = this.fb.group({\r\n      vmName: [this.vmDetails?.vmName || 'Untitled VM', [Validators.required, generalValidator()]],\r\n      vmType: [this.vmDetails?.vmType, Validators.required],\r\n      unit: [this.vmDetails?.vmWidth?.unit || 'mm', Validators.required],\r\n      vmWidth: [this.vmDetails?.vmWidth?.value ?? 0, [Validators.required, Validators.min(1)]],\r\n      vmHeight: [this.vmDetails?.vmHeight?.value ?? 0, [Validators.required, Validators.min(1)]],\r\n      vmBrand: [this.vmDetails?.vmBrand, Validators.required],\r\n      vmCategory: [this.vmDetails?.vmCategory || ''],\r\n      vmSubCategory: [this.vmDetails?.vmSubCategory || ''],\r\n      isDoubleSided: [this.vmDetails?.isDoubleSided || false],\r\n    })\r\n\r\n\r\n    this.addUpdateVmForm.get(\"category\")?.disable({ emitEvent: false });\r\n    this.addUpdateVmForm.get(\"subCategory\")?.disable({ emitEvent: false });\r\n\r\n    this.onChangeVmType(this.vmDetails?.vmType);\r\n\r\n    this.addUpdateVmForm.get(\"vmName\")?.valueChanges.subscribe((v) => this.vmDetails.vmName = v)\r\n    this.addUpdateVmForm.get(\"vmType\")?.valueChanges.subscribe((v) => this.onChangeVmType(v))\r\n\r\n    this.toggleCategoryFields(this.vmDetails?.vmBrand);\r\n\r\n    this.addUpdateVmForm.get('vmBrand')?.valueChanges.subscribe((value) => {\r\n      this.onChangeBrand(value);\r\n    })\r\n\r\n    if (!this.isEditMode) this.addUpdateVmForm.disable({ emitEvent: false })\r\n  }\r\n\r\n  onChangeVmType(type?: string) {\r\n    this.selectedVmType = this.vmTypesList.find(e => e.vmType === type);\r\n    this.vmImagesList = this.selectedVmType?.imageUrls?.map(url => this.imgCDN + url) || [];\r\n    this.selectedVmImageIndex = this.vmImagesList.findIndex(img => img.includes(this.vmDetails?.vmImageUrl || ''));\r\n    if (this.selectedVmImageIndex < 0) this.selectedVmImageIndex = 0;\r\n  }\r\n\r\n  onChangeBrand(brand?: string) {\r\n    this.addUpdateVmForm.get(\"vmCategory\")?.reset();\r\n    this.addUpdateVmForm.get(\"vmSubCategory\")?.reset();\r\n\r\n    this.categoriesList = [];\r\n    this.subCategoriesList = [];\r\n\r\n    this.toggleCategoryFields(brand);\r\n  }\r\n\r\n  toggleCategoryFields(brand?: string) {\r\n    if (brand) {\r\n      const selectedBrand = this.brandsList?.find(e => e.brandName === brand);\r\n\r\n      this.categoriesList = selectedBrand?.category?.map((e) => { return { label: e, value: e } }) ?? []\r\n      this.subCategoriesList = selectedBrand?.subCategory?.map((e) => { return { label: e, value: e } }) ?? []\r\n\r\n      this.addUpdateVmForm.get(\"vmCategory\")?.enable({ emitEvent: false });\r\n      this.addUpdateVmForm.get(\"vmSubCategory\")?.enable({ emitEvent: false });\r\n    }\r\n  }\r\n\r\n  onDuplicate() {\r\n    this.storeBuilderService.duplicateVmLibrary({\r\n      vmId: this.vmDetails._id\r\n    }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.data.message);\r\n          this.canGoBack = true;\r\n          this.router.navigate(['/manage/planogram/create-library-vm'], { queryParams: { vmId: res?.data?.id } });\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to duplicate VM');\r\n        console.log(\"@@ ~ duplicateFixtureLibrary err:\", err)\r\n      }\r\n    })\r\n  }\r\n\r\n  async confirmDeletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(DeleteConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Delete VM';\r\n    modelRef.componentInstance.description = 'Are you sure you want to delete this vm ?';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok')\r\n  }\r\n\r\n  async onDelete() {\r\n    if (this.vmDetails.templateCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t delete VM!`;\r\n      modelRef.componentInstance.description = `Since this VM is live in \"${this.vmDetails.templateCount} templates,\" deleting is not allowed.`;\r\n      return\r\n    };\r\n\r\n    if (!await this.confirmDeletion()) return;\r\n\r\n    this.storeBuilderService.deleteVmLibrary({ vmId: this.vmDetails._id }).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(res.message);\r\n          this.canGoBack = true;\r\n          this.router.navigate(['/manage/planogram/library/vms'])\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err?.error?.error || 'Failed to delete VM');\r\n        console.log(\"@@ ~ deleteVmLibrary [err]:\", err)\r\n      }\r\n    })\r\n  }\r\n\r\n  onClickCreateVmType() {\r\n    const modelRef = this.ngbModal.open(AddVmTypeComponent, { centered: true });\r\n\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.componentInstance.vmTypesList = this.vmTypesList;\r\n    modelRef.result.then(async (result) => {\r\n      if (result) {\r\n        await this.getVmTypes();\r\n\r\n        // TODO: Patching the newly added type to the form by default, can be removed if not required.\r\n        const newlyAddedType = this.vmTypesList[this.vmTypesList.length - 1].vmType\r\n        this.addUpdateVmForm.patchValue({\r\n          vmType: newlyAddedType\r\n        });\r\n        this.onChangeVmType(newlyAddedType)\r\n      }\r\n    })\r\n  }\r\n\r\n  previousImage() {\r\n    if (!this.isEditMode) return;\r\n    this.selectedVmImageIndex = (this.selectedVmImageIndex - 1 + this.vmImagesList.length) % this.vmImagesList.length;\r\n  }\r\n\r\n  nextImage() {\r\n    if (!this.isEditMode) return;\r\n    this.selectedVmImageIndex = (this.selectedVmImageIndex + 1) % this.vmImagesList.length;\r\n  }\r\n\r\n  addImage(event: any) {\r\n\r\n    const input = event.target as HTMLInputElement;\r\n    if (!input.files || input.files.length === 0) return;\r\n\r\n    const file = input.files[0];\r\n    if (!file.type.startsWith('image/')) {\r\n      this.toast.getErrorToast(\"Only image files are allowed\");\r\n      return;\r\n    }\r\n\r\n    const uploadFile = event?.target?.files[0];\r\n    const formData = new FormData();\r\n    formData.append('file', uploadFile);\r\n\r\n    this.storeBuilderService.uploadVmTypeImage(formData, this.selectedVmType?._id!).subscribe({\r\n\r\n      next: (res: any) => {\r\n        if (res?.status === 'success') {\r\n          this.toast.getSuccessToast(\"Image Uploaded\");\r\n          this.vmImagesList.push(this.imgCDN + res?.data?.url)\r\n        }\r\n      },\r\n      error: (err) => {\r\n        this.toast.getErrorToast(err);\r\n        console.log(\"@@ ~ uploadVmTypeImage [err]:\", err)\r\n      }\r\n    })\r\n  }\r\n\r\n  async canDeactivate(): Promise<boolean> {\r\n    if (this.canGoBack) return true;\r\n\r\n    if (this.addUpdateVmForm.dirty) {\r\n      const result = await this.confirmExit();\r\n\r\n      if (result === null) {\r\n        return false;\r\n      }\r\n\r\n      if (result) {\r\n        return await this.onSubmit('draft');\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  async confirmExit(): Promise<boolean | null> {\r\n    try {\r\n      const modelRef = this.ngbModal.open(ExitConfirmationComponent, { centered: true });\r\n      return await modelRef.result.then<boolean>((result) => result === 'ok');\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n\r\n  async confirmCompletion(): Promise<boolean> {\r\n    const modelRef = this.ngbModal.open(CompleteConfirmationComponent, { centered: true });\r\n    modelRef.componentInstance.title = 'Complete VM';\r\n    modelRef.componentInstance.description = 'This action will mark as completed and ready to assign it to the store';\r\n    modelRef.componentInstance.note = 'You can\\'t edit it once assigned to the store.';\r\n\r\n    return await modelRef.result.then<boolean>((result) => result === 'ok');\r\n  }\r\n\r\n  async onSubmit(status: string): Promise<boolean> {\r\n    try {\r\n      if (this.addUpdateVmForm.invalid) {\r\n        this.addUpdateVmForm.markAllAsTouched();\r\n        this.toast.getErrorToast(\"Form is invalid\")\r\n        return false;\r\n      }\r\n\r\n      if (status === 'complete') if (!await this.confirmCompletion()) return false;\r\n\r\n      const imagePath = this.vmImagesList[this.selectedVmImageIndex]?.split('cloudfront.net/')[1];\r\n\r\n      const transformedData = {\r\n        ...this.addUpdateVmForm.value,\r\n        \"_id\": this.vmDetails?._id,\r\n        \"clientId\": this.clientId,\r\n        \"vmHeight\": {\r\n          \"value\": this.addUpdateVmForm?.value?.vmWidth,\r\n          \"unit\": this.addUpdateVmForm?.value?.unit\r\n        },\r\n        \"vmWidth\": {\r\n          \"value\": this.addUpdateVmForm?.value?.vmHeight,\r\n          \"unit\": this.addUpdateVmForm?.value?.unit\r\n        },\r\n        \"vmImageUrl\": imagePath,\r\n        \"status\": status\r\n      }\r\n\r\n      delete transformedData.unit;\r\n\r\n      const payload = removeEmptyFields(transformedData);\r\n      const res: any = await firstValueFrom(this.storeBuilderService.addUpdateVmLibrary(payload));\r\n\r\n      if (res?.status === 'success') {\r\n        this.vmDetails.status = status\r\n        this.toast.getSuccessToast(res.data.message);\r\n        this.canGoBack = true;\r\n        this.router.navigate(['/manage/planogram/library/vms'])\r\n        return true;\r\n      }\r\n\r\n      return false;\r\n    } catch (err: any) {\r\n      this.toast.getErrorToast(err?.error?.error ?? \"Failed to save VM details\");\r\n      console.log(\"@@ ~ addUpdateVmLibrary [err]:\", err)\r\n      return false;\r\n    }\r\n  }\r\n\r\n  updateActiveImage(index: number) {\r\n    if (!this.isEditMode) return;\r\n    this.selectedVmImageIndex = index\r\n  }\r\n\r\n  onClickEdit() {\r\n    if (this.vmDetails.templateCount) {\r\n      const modelRef = this.ngbModal.open(CannotPerformComponent, { centered: true });\r\n      modelRef.componentInstance.title = `Can’t edit VM!`;\r\n      modelRef.componentInstance.description = `Since this VM is live in \"${this.vmDetails.templateCount} templates,\" editing is not allowed.`;\r\n      return\r\n    };\r\n    this.isEditMode = true;\r\n    this.addUpdateVmForm.enable({ emitEvent: false })\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { isEdit: true },\r\n      queryParamsHandling: 'merge',\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}","<input\r\n  style=\"display: none\"\r\n  type=\"file\"\r\n  #fileUpload\r\n  id=\"vmUpload\"\r\n  accept=\"image/*\"\r\n  (change)=\"addImage($event); addUpdateVmForm.markAsDirty()\"\r\n/>\r\n\r\n<section id=\"build-vm\" *ngIf=\"!isPageLoading\">\r\n  <!-- Header section -->\r\n  <div class=\"header\">\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/vms\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n            stroke=\"#344054\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n      </button>\r\n      <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\" [ngbTooltip]=\"vmDetails.vmName\">\r\n        {{ vmDetails.vmName }}\r\n      </h2>\r\n      <div class=\"badge draft\">{{ vmDetails.status | titlecase }}</div>\r\n    </div>\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <p class=\"m-0 text-nowrap\" *ngIf=\"vmDetails._id\">Last update: {{ vmDetails.updatedAt | timeAgo }}</p>\r\n\r\n      <div *ngIf=\"!isEditMode\">\r\n        <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <g clip-path=\"url(#clip0_1322_5325)\">\r\n              <path\r\n                d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                stroke=\"#344054\"\r\n                stroke-width=\"1.67\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_1322_5325\">\r\n                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n          Edit\r\n        </button>\r\n      </div>\r\n\r\n      <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n        <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n        <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n      </div>\r\n\r\n      <div class=\"dropdown\" *ngIf=\"this.vmDetails?._id\">\r\n        <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n          <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n            <path\r\n              d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n              stroke=\"#667085\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </button>\r\n\r\n        <ul class=\"dropdown-menu\">\r\n          <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n          <li>\r\n            <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- VM Creation Section -->\r\n  <div class=\"row gap-4 builder\">\r\n    <div class=\"cols col\">\r\n      <div>\r\n        <h2>Visual Merchandise Details</h2>\r\n        <p>Create and define your VM here</p>\r\n\r\n        <form [formGroup]=\"addUpdateVmForm\">\r\n          <div class=\"form-group mb-4\">\r\n            <label for=\"vmName\" class=\"form-label mb-1\">Name</label>\r\n            <input type=\"text\" formControlName=\"vmName\" class=\"form-control\" />\r\n\r\n            <div *ngIf=\"addUpdateVmForm.get('vmName')?.touched && addUpdateVmForm.get('vmName')?.invalid\">\r\n              <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('vmName')?.hasError('required')\">VM Name is required.</small>\r\n              <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('vmName')?.hasError('whitespace')\">\r\n                VM name cannot be only whitespace.\r\n              </small>\r\n              <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('vmName')?.hasError('trimSpaces')\">\r\n                No leading or trailing whitespace allowed.\r\n              </small>\r\n            </div>\r\n          </div>\r\n          <div class=\"form-group mb-4\">\r\n            <label for=\"vmType\" class=\"form-label mb-1\">Type</label>\r\n            <lib-reactive-select\r\n              [idField]=\"'vmType'\"\r\n              [nameField]=\"'vmType'\"\r\n              [data]=\"vmTypesList\"\r\n              formControlName=\"vmType\"\r\n              [action]=\"true\"\r\n              actionLabel=\"Create Type\"\r\n              (actionClick)=\"onClickCreateVmType(); addUpdateVmForm.markAsDirty()\"\r\n              [search]=\"true\"\r\n            >\r\n            </lib-reactive-select>\r\n            <div *ngIf=\"addUpdateVmForm.get('vmType')?.touched && addUpdateVmForm.get('vmType')?.invalid\">\r\n              <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('vmType')?.errors?.['required']\">VM Type is required.</small>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"row mb-4\">\r\n            <div class=\"col form-group\">\r\n              <label for=\"unit\" class=\"form-label mb-1\">Unit</label>\r\n              <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"unitsList\" formControlName=\"unit\">\r\n              </lib-reactive-select>\r\n            </div>\r\n            <div class=\"col form-group\">\r\n              <label for=\"vmWidth\" class=\"form-label mb-1\">Width</label>\r\n              <counter-input formControlName=\"vmWidth\" [step]=\"1\" placeholder=\"0\" [max]=\"4\"></counter-input>\r\n            </div>\r\n            <div class=\"col form-group\">\r\n              <label for=\"vmHeight\" class=\"form-label mb-1\">Height</label>\r\n              <counter-input formControlName=\"vmHeight\" [step]=\"1\" placeholder=\"0\" [max]=\"4\"></counter-input>\r\n            </div>\r\n            <div class=\"col-12\">\r\n              <div *ngIf=\"addUpdateVmForm.get('unit')?.touched && addUpdateVmForm.get('unit')?.invalid\">\r\n                <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('unit')?.errors?.['required']\">Unit is required.</small>\r\n              </div>\r\n              <div\r\n                *ngIf=\"\r\n                  (addUpdateVmForm.get('vmWidth')?.touched && addUpdateVmForm.get('vmWidth')?.invalid) ||\r\n                  (addUpdateVmForm.get('vmHeight')?.touched && addUpdateVmForm.get('vmHeight')?.invalid)\r\n                \"\r\n              >\r\n                <small\r\n                  class=\"text-danger\"\r\n                  *ngIf=\"addUpdateVmForm.get('vmWidth')?.errors?.['min'] || addUpdateVmForm.get('vmHeight')?.errors?.['min']\"\r\n                >\r\n                  Height & Width cannot be zero.\r\n                </small>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"row mb-4\">\r\n            <div class=\"col form-group\">\r\n              <label for=\"vmBrand\" class=\"form-label mb-1\">Brand</label>\r\n              <lib-reactive-select\r\n                [idField]=\"'brandName'\"\r\n                [nameField]=\"'brandName'\"\r\n                [data]=\"brandsList\"\r\n                formControlName=\"vmBrand\"\r\n                [search]=\"true\"\r\n              >\r\n              </lib-reactive-select>\r\n              <div *ngIf=\"addUpdateVmForm.get('vmBrand')?.touched && addUpdateVmForm.get('vmBrand')?.invalid\">\r\n                <small class=\"text-danger\" *ngIf=\"addUpdateVmForm.get('vmBrand')?.errors?.['required']\">\r\n                  Brand is required.\r\n                </small>\r\n              </div>\r\n            </div>\r\n            <!-- <div class=\"col form-group\">\r\n              <label for=\"vmSubBrand\" class=\"form-label mb-1\">Sub-Brand</label>\r\n              <lib-reactive-select\r\n                [idField]=\"'subBrandName'\"\r\n                [nameField]=\"'subBrandName'\"\r\n                [data]=\"subBrandsList\"\r\n                formControlName=\"vmSubBrand\"\r\n              >\r\n              </lib-reactive-select>\r\n            </div> -->\r\n          </div>\r\n\r\n          <div class=\"row gap-3 mb-4\">\r\n            <div class=\"col form-group\">\r\n              <label for=\"vmCategory\" class=\"form-label mb-1\">Category</label>\r\n              <lib-reactive-select\r\n                [idField]=\"'value'\"\r\n                [nameField]=\"'label'\"\r\n                [data]=\"categoriesList\"\r\n                formControlName=\"vmCategory\"\r\n                [search]=\"true\"\r\n              >\r\n              </lib-reactive-select>\r\n            </div>\r\n            <div class=\"col form-group\">\r\n              <label for=\"vmSubCategory\" class=\"form-label mb-1\">Sub-Category</label>\r\n              <lib-reactive-select\r\n                [idField]=\"'value'\"\r\n                [nameField]=\"'label'\"\r\n                [data]=\"subCategoriesList\"\r\n                formControlName=\"vmSubCategory\"\r\n                [search]=\"true\"\r\n              >\r\n              </lib-reactive-select>\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"d-flex gap-2 align-items-center\">\r\n            <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isDoubleSided\" />\r\n            <label for=\"isDoubleSided\">Enable to have a double sided VM</label>\r\n          </div>\r\n        </form>\r\n\r\n        <div *ngIf=\"selectedVmType\" class=\"d-flex align-items-center justify-content-between mt-4 w-100\">\r\n          <div class=\"d-flex flex-column\">\r\n            <h3>Images Upload</h3>\r\n            <p>Drag and drop the images to the right to visualize your VM</p>\r\n          </div>\r\n\r\n          <button\r\n            (click)=\"fileUpload.click()\"\r\n            type=\"button\"\r\n            class=\"btn btn-outline d-inline-flex align-items-center text-nowrap\"\r\n            [disabled]=\"!isEditMode\"\r\n          >\r\n            <svg class=\"me-2\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <path d=\"M12 5V19M5 12H19\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n            Add Image\r\n          </button>\r\n        </div>\r\n\r\n        <div *ngIf=\"selectedVmType\" class=\"row gx-2 gy-2\">\r\n          <div class=\"col-md-6\" *ngFor=\"let vmImage of vmImagesList; let i = index\">\r\n            <div class=\"card\">\r\n              <img\r\n                [src]=\"vmImage\"\r\n                alt=\"Carousel Image\"\r\n                class=\"carousel-img\"\r\n                (click)=\"updateActiveImage(i); addUpdateVmForm.markAsDirty()\"\r\n              />\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div class=\"cols col-8\">\r\n      <div class=\"d-flex justify-content-center align-items-center flex-column gap-5\">\r\n        @if(vmImagesList.length){\r\n        <div class=\"d-flex justify-content-around w-100 align-items-center px-5 mt-5\">\r\n          <svg\r\n            class=\"cursor-pointer\"\r\n            (click)=\"previousImage(); addUpdateVmForm.markAsDirty()\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"24\"\r\n            height=\"24\"\r\n            viewBox=\"0 0 24 24\"\r\n            fill=\"none\"\r\n          >\r\n            <path d=\"M15 6L9 12L15 18\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <div class=\"carousel-wrapper\">\r\n            <div class=\"d-flex w-100 gap-2\">\r\n              <div class=\"carousel-container\" *ngIf=\"vmImagesList.length\">\r\n                <img [src]=\"vmImagesList[selectedVmImageIndex]\" alt=\"Carousel Image\" class=\"carousel-img\" />\r\n              </div>\r\n              <ng-container *ngTemplateOutlet=\"yDimensionArrows\"></ng-container>\r\n            </div>\r\n            <ng-container *ngTemplateOutlet=\"xDimensionArrows\"></ng-container>\r\n          </div>\r\n          <svg\r\n            class=\"cursor-pointer\"\r\n            (click)=\"nextImage(); addUpdateVmForm.markAsDirty()\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"24\"\r\n            height=\"24\"\r\n            viewBox=\"0 0 24 24\"\r\n            fill=\"none\"\r\n          >\r\n            <path d=\"M9 18L15 12L9 6\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n\r\n        @if(addUpdateVmForm.get('isDoubleSided')?.value){\r\n        <div class=\"d-flex justify-content-around w-100 align-items-center px-5 mt-5\">\r\n          <svg\r\n            class=\"cursor-pointer\"\r\n            (click)=\"previousImage(); addUpdateVmForm.markAsDirty()\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"24\"\r\n            height=\"24\"\r\n            viewBox=\"0 0 24 24\"\r\n            fill=\"none\"\r\n          >\r\n            <path d=\"M15 6L9 12L15 18\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <div class=\"carousel-wrapper\">\r\n            <div class=\"d-flex w-100 gap-2\">\r\n              <div class=\"carousel-container\" *ngIf=\"vmImagesList.length\">\r\n                <img [src]=\"vmImagesList[selectedVmImageIndex]\" alt=\"Carousel Image\" class=\"carousel-img\" />\r\n              </div>\r\n              <ng-container *ngTemplateOutlet=\"yDimensionArrows\"></ng-container>\r\n            </div>\r\n            <ng-container *ngTemplateOutlet=\"xDimensionArrows\"></ng-container>\r\n          </div>\r\n          <svg\r\n            class=\"cursor-pointer\"\r\n            (click)=\"nextImage(); addUpdateVmForm.markAsDirty()\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"24\"\r\n            height=\"24\"\r\n            viewBox=\"0 0 24 24\"\r\n            fill=\"none\"\r\n          >\r\n            <path d=\"M9 18L15 12L9 6\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n        } }@else {\r\n        <ng-container *ngTemplateOutlet=\"vmPlaceholder\"></ng-container>\r\n        @if(addUpdateVmForm.get('isDoubleSided')?.value){\r\n        <ng-container *ngTemplateOutlet=\"vmPlaceholder\"></ng-container>\r\n        } }\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section id=\"build-vm-skeleton\" *ngIf=\"isPageLoading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<ng-template #xDimensionArrows>\r\n  <div class=\"horizontal-dimension\">\r\n    <div class=\"arrow left\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ addUpdateVmForm.get(\"vmWidth\")?.value }} {{ addUpdateVmForm.get(\"unit\")?.value ?? \"mm\" }}</span>\r\n    </div>\r\n    <div class=\"arrow right\"></div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #yDimensionArrows>\r\n  <div class=\"vertical-dimension\">\r\n    <div class=\"arrow up\"></div>\r\n    <div class=\"line\">\r\n      <span>{{ addUpdateVmForm.get(\"vmHeight\")?.value }} {{ addUpdateVmForm.get(\"unit\")?.value ?? \"mm\" }}</span>\r\n    </div>\r\n    <div class=\"arrow down\"></div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #vmPlaceholder>\r\n  <div>\r\n    <div class=\"d-flex\">\r\n      <svg width=\"302\" height=\"302\" viewBox=\"0 0 302 302\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M2.03879 5.2019L300 295.75M299.934 5.20007L1 300.289M5.07798 301H297.001C299.21 301 301 295.627 301 289V13C301 6.37258 299.21 1 297.001 1H5.07799C2.86943 1 1.07904 6.37259 1.07904 13V289C1.07904 295.627 2.86943 301 5.07798 301Z\"\r\n          stroke=\"black\"\r\n        />\r\n      </svg>\r\n      <ng-container *ngTemplateOutlet=\"yDimensionArrows\"></ng-container>\r\n    </div>\r\n    <ng-container *ngTemplateOutlet=\"xDimensionArrows\"></ng-container>\r\n  </div>\r\n</ng-template>\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'lib-create-product',\r\n  templateUrl: './create-product.component.html',\r\n  styleUrl: './create-product.component.scss'\r\n})\r\nexport class CreateProductComponent {\r\n\r\n}\r\n","<p>create-product works!</p>\r\n","import { CanDeactivateFn } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface CanExitGuard {\r\n    canDeactivate: () => boolean | Observable<boolean> | Promise<boolean>;\r\n}\r\n\r\nexport const canDeactivateGuard: CanDeactivateFn<CanExitGuard> = (\r\n    component\r\n) => {\r\n    return component.canDeactivate ? component.canDeactivate() : true;\r\n};\r\n","import { Component } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-bulk-upload-planogram',\r\n  templateUrl: './bulk-upload-planogram.component.html',\r\n  styleUrl: './bulk-upload-planogram.component.scss'\r\n})\r\nexport class BulkUploadPlanogramComponent {\r\n  selectedFile: File | null = null;\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal\r\n  ) { }\r\n\r\n\r\n  onFileSelected(event: any): void {\r\n    const file = event.target.files[0];\r\n    if (file) {\r\n      const fileExtension = file.name.split('.').pop()?.toLowerCase();\r\n      if (fileExtension === 'xlsx' || fileExtension === 'xls') {\r\n        this.selectedFile = file;\r\n      } else {\r\n        // Handle invalid file type\r\n        alert('Please select a valid Excel file (.xlsx or .xls)');\r\n        event.target.value = '';\r\n      }\r\n    }\r\n  }\r\n\r\n  downloadEmptyFixtureTemplate(): void {\r\n  }\r\n  downloadFixtureTemplateWithExample(): void {\r\n  }\r\n\r\n  uploadFile(): void {\r\n    if (this.selectedFile) {\r\n      // TODO: Implement file upload functionality\r\n      console.log('Uploading file:', this.selectedFile);\r\n    } else {\r\n      alert('Please select a file to upload');\r\n    }\r\n  }\r\n\r\n  closeModal(): void {\r\n    this.activeModal.close();\r\n  }\r\n}\r\n","<div class=\"modal-container\">\r\n  <h3>Store layout (Bulk action)</h3>\r\n\r\n  <div class=\"wrapper\">\r\n    <svg\r\n      style=\"width: 80px; height: 80px\"\r\n      width=\"56\"\r\n      height=\"56\"\r\n      viewBox=\"0 0 95 94\"\r\n      fill=\"none\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      class=\"mb-4\"\r\n    >\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n      <rect x=\"7.5\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n      <path\r\n        d=\"M62.5 52V58.6667C62.5 59.5507 62.1488 60.3986 61.5237 61.0237C60.8986 61.6488 60.0507 62 59.1667 62H35.8333C34.9493 62 34.1014 61.6488 33.4763 61.0237C32.8512 60.3986 32.5 59.5507 32.5 58.6667V52M55.8333 40.3333L47.5 32M47.5 32L39.1667 40.3333M47.5 32V52\"\r\n        stroke=\"#00A3FF\"\r\n        stroke-width=\"3.33333\"\r\n        stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\"\r\n      />\r\n    </svg>\r\n\r\n    <h3>Store layout</h3>\r\n\r\n    <div class=\"upload-description\">\r\n      <div class=\"upload-steps\">\r\n        <p class=\"card-description mb-0\">Step1 - Download template</p>\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadEmptyFixtureTemplate()\">Download empty template</a>\r\n        <a class=\"download-link fw-medium d-block\" (click)=\"downloadFixtureTemplateWithExample()\">\r\n          Download template with 8 record\r\n        </a>\r\n        <p class=\"card-description mb-0\">Step2 - Add your data to the Template File</p>\r\n        <p class=\"card-description mb-0\">Step3 - Upload it below for processing</p>\r\n      </div>\r\n      <button class=\"btn btn-primary d-inline-flex align-items-center w-fit\">\r\n        <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"currentColor\"\r\n            stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n          />\r\n        </svg>\r\n        Upload\r\n      </button>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"modal-actions\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeModal()\">Close</button>\r\n  </div>\r\n</div>\r\n","import {\r\n  Component,\r\n  EventEmitter,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\n\r\n@Component({\r\n  selector: \"plano-filter\",\r\n  standalone: true,\r\n  imports: [FormsModule, CommonModule],\r\n  templateUrl: \"./plano-filter.component.html\",\r\n  styleUrl: \"./plano-filter.component.scss\",\r\n})\r\nexport class PlanoFilterComponent implements OnInit, OnChanges, OnDestroy {\r\n  @Input() clientId: string;\r\n  @Input() data:any=[];\r\n  @Input() config: Record<string, boolean> = {};\r\n\r\n  isFilterOpen = false;\r\n  displayedOptions: any[][] = [];\r\n  isFilterProper: boolean = true;\r\n  isFilterApplied: boolean = false;\r\n\r\n  filters = [\r\n    { title: \"Country\", type: \"multi\", isOpened: false, options: [] as any[] },\r\n    { title: \"City\", type: \"multi\", isOpened: false, options: [] as any[] },\r\n    {\r\n      title: \"Merchandise compliance\",\r\n      type: \"custom\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"> Greater than\", value: \"greaterThan\", checked: false },\r\n        { name: \"< Lesser than\", value: \"lesserThan\", checked: false },\r\n        {\r\n          name: \">= Greater than or equal to\",\r\n          value: \"greaterThanAndEqual\",\r\n          checked: false,\r\n        },\r\n        {\r\n          name: \"<= Lesser than or equal to\",\r\n          value: \"lesserThanAndEqual\",\r\n          checked: false,\r\n        },\r\n        { name: \"( ) Between\", value: \"between\", checked: false },\r\n      ],\r\n    },\r\n    {\r\n      title: \"Store category\",\r\n      type: \"single\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"All\", value: \"\", checked: false },\r\n        { name: \"IVM\", value: \"ivm\", checked: false },\r\n        { name: \"Non IVM\", value: \"nonivm\", checked: false },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  @Output() applyFilters = new EventEmitter<any>();\r\n  @Output() resetFilters = new EventEmitter<any>();\r\n  @Output() filterChanged = new EventEmitter<any>();\r\n\r\n  customData: {\r\n    type: string | null;\r\n    min: number | null;\r\n    max: number | null;\r\n  }[] = [];\r\n  private readonly destroy$ = new Subject<void>();\r\n  constructor(private storeBuilderService: StoreBuilderService) {}\r\n\r\n  ngOnInit(): void {\r\n    this.displayedOptions = this.filters.map((f) =>\r\n      f.options ? [...f.options] : []\r\n    );\r\n\r\n    this.filters.forEach((_, i) => {\r\n      this.customData[i] = { type: null, min: null, max: null };\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"clientId\"]?.currentValue) {\r\n      this.loadCountries();\r\n      this.loadCities([]);\r\n    }\r\n    if(changes['data']?.currentValue) {\r\n      this.filters.push(...this.data);\r\n      this.filters = this.filters.filter((ele) => this.config[ele.title] !== false);\r\n    }\r\n  }\r\n\r\n  loadCountries() {\r\n    this.storeBuilderService\r\n      .getCountries({ clientId: this.clientId })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            const countries =\r\n              res?.data?.countryData.map((c: any) => c.country) ?? [];\r\n\r\n            this.filters[0].options = countries.map((c: any) => ({\r\n              name: c,\r\n              value: c,\r\n              checked: false,\r\n            }));\r\n            this.displayedOptions[0] = [...this.filters[0].options];\r\n          }\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ ~ loadCountries [ERR]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  loadCities(selectedCountries: string[]) {\r\n    const payload = {\r\n      clientId: this.clientId,\r\n      country: selectedCountries,\r\n      city: [],\r\n      group: [],\r\n    };\r\n    this.storeBuilderService\r\n      .getRegions(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            const regions =\r\n              res?.data?.locationData?.map((r: any) => r?.city) ?? [];\r\n\r\n            const oldChecked = this.filters[1].options\r\n              .filter((o) => o.checked)\r\n              .map((o) => o.value);\r\n\r\n            this.filters[1].options = regions.map((city: any) => ({\r\n              name: city,\r\n              value: city,\r\n              checked: oldChecked.includes(city),\r\n            }));\r\n\r\n            this.displayedOptions[1] = [...this.filters[1].options];\r\n          }\r\n        },\r\n        error: (err) => {\r\n          console.log(\"@@ ~ loadCities [ERR]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  @HostListener(\"document:click\", [\"$event\"])\r\n  handleDocumentClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n\r\n    if (target.closest(\".item-button\") || target.closest(\".item-dropdown\"))\r\n      return;\r\n\r\n    this.filters.forEach((f, i) => {\r\n      if (f.isOpened) this.resetSearch(i);\r\n      f.isOpened = false;\r\n    });\r\n\r\n    if (target.closest(\".filter-dropdown\")) return;\r\n\r\n    this.isFilterOpen = false;\r\n  }\r\n\r\n  toggleFilter(event: MouseEvent) {\r\n    event.stopPropagation();\r\n    this.isFilterOpen = !this.isFilterOpen;\r\n  }\r\n\r\n  toggleItem(event: MouseEvent, itemIndex: number) {\r\n    event.stopPropagation();\r\n\r\n    this.filters.forEach((f, i) => {\r\n      if (i === itemIndex) {\r\n        f.isOpened = !f.isOpened;\r\n        if (!f.isOpened) this.resetSearch(i);\r\n      } else {\r\n        if (f.isOpened) this.resetSearch(i);\r\n        f.isOpened = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  resetSearch(filterIndex: number) {\r\n    this.displayedOptions[filterIndex] = [...this.filters[filterIndex].options];\r\n  }\r\n\r\n  onSingleSelect(filter: any, option: any) {\r\n    const index = this.filters.indexOf(filter);\r\n    if (index === -1) return;\r\n\r\n    this.filters[index].options.forEach((o) => (o.checked = false));\r\n    option.checked = true;\r\n\r\n    this.displayedOptions[index] = [...this.filters[index].options];\r\n    this.filters[index].isOpened = false;\r\n\r\n    if (filter.title === \"Country\") {\r\n      this.updateCityListFromAPI();\r\n    }\r\n\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  onCustomSelect(fi: number, filter: any, option: any) {\r\n    this.filters[fi].options.forEach((o) => (o.checked = false));\r\n    option.checked = true;\r\n\r\n    this.displayedOptions[fi] = [...this.filters[fi].options];\r\n    this.filters[fi].isOpened = false;\r\n\r\n    this.customData[fi] = {\r\n      type: option.value,\r\n      min: null,\r\n      max: null,\r\n    };\r\n\r\n    this.validateCustomFilter();\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  onOptionChange(filter: any, option: any) {\r\n    const index = this.filters.indexOf(filter);\r\n    if (index === -1) return;\r\n\r\n    if (filter.title === \"Country\") {\r\n      this.updateCityListFromAPI();\r\n    }\r\n\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  updateCityListFromAPI() {\r\n    const selectedCountries = this.filters[0].options\r\n      .filter((o) => o.checked)\r\n      .map((o) => o.value);\r\n    this.loadCities(selectedCountries);\r\n  }\r\n\r\n  validateNumber(fi: number, field: \"min\" | \"max\") {\r\n    let n = this.customData[fi][field];\r\n\r\n    if (n === null || n === undefined || isNaN(Number(n))) {\r\n      this.customData[fi][field] = null;\r\n    } else {\r\n      this.customData[fi][field] = Math.min(Number(n), 100);\r\n    }\r\n\r\n    this.validateCustomFilter();\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  onInput(event: Event) {\r\n    const input = event.target as HTMLInputElement;\r\n    let v = input.value.replace(/[^0-9]/g, \"\").slice(0, 3);\r\n    input.value = v;\r\n  }\r\n\r\n  validateCustomFilter() {\r\n    const index = this.filters.findIndex((f) => f.type === \"custom\");\r\n\r\n    if (index === -1) {\r\n      this.isFilterProper = true;\r\n      return;\r\n    }\r\n\r\n    const conf = this.customData[index];\r\n\r\n    if (!conf.type) {\r\n      this.isFilterProper = true;\r\n      return;\r\n    }\r\n\r\n    const min = conf.min;\r\n    const max = conf.max;\r\n\r\n    switch (conf.type) {\r\n      case \"greaterThan\":\r\n        this.isFilterProper = min !== null && min >= 0 && min < 100;\r\n        break;\r\n\r\n      case \"lesserThan\":\r\n        this.isFilterProper = min !== null && min > 0 && min <= 100;\r\n        break;\r\n\r\n      case \"greaterThanAndEqual\":\r\n        this.isFilterProper = min !== null && min >= 0 && min <= 100;\r\n        break;\r\n\r\n      case \"lesserThanAndEqual\":\r\n        this.isFilterProper = min !== null && min >= 0 && min <= 100;\r\n        break;\r\n\r\n      case \"between\":\r\n        this.isFilterProper =\r\n          min !== null && max !== null && min >= 0 && max <= 100 && min < max;\r\n        break;\r\n\r\n      default:\r\n        this.isFilterProper = true;\r\n    }\r\n  }\r\n\r\n  isAllVisibleSelected(filterIndex: number): boolean {\r\n    const visible = this.displayedOptions[filterIndex];\r\n    return visible.length > 0 && visible.every((v) => v.checked);\r\n  }\r\n\r\n  isAllVisibleSelectedByFilter(filter: any): boolean {\r\n    const i = this.filters.indexOf(filter);\r\n    if (i === -1) return false;\r\n    return this.isAllVisibleSelected(i);\r\n  }\r\n\r\n  toggleSelectAllVisible(event: any, filterIndex: number) {\r\n    const checked = event.target.checked;\r\n    this.displayedOptions[filterIndex].forEach(\r\n      (opt) => (opt.checked = checked)\r\n    );\r\n\r\n    if (this.filters[filterIndex].title === \"Country\") {\r\n      this.updateCityListFromAPI();\r\n    }\r\n\r\n    this.emitFilterChanges();\r\n  }\r\n\r\n  toggleSelectAllVisibleByFilter(event: any, filter: any) {\r\n    const i = this.filters.indexOf(filter);\r\n    if (i === -1) return;\r\n    this.toggleSelectAllVisible(event, i);\r\n  }\r\n\r\n  onSearch(event: any, filterIndex: number) {\r\n    const term = event.target.value.toLowerCase().trim();\r\n    const fullList = this.filters[filterIndex].options;\r\n\r\n    if (!term) {\r\n      this.displayedOptions[filterIndex] = [...fullList];\r\n      return;\r\n    }\r\n\r\n    this.displayedOptions[filterIndex] = fullList.filter((o) =>\r\n      o.name.toLowerCase().includes(term)\r\n    );\r\n  }\r\n\r\n  getSelectedData() {\r\n    return this.filters.map((f, i) => {\r\n      if (f.type === \"custom\") {\r\n        const cd = this.customData[i];\r\n\r\n        if (!cd.type) {\r\n          return { title: f.title, selected: null };\r\n        }\r\n\r\n        let min = cd.min;\r\n        let max = cd.max;\r\n\r\n        switch (cd.type) {\r\n          case \"lesserThan\":\r\n            if (min != null) {\r\n              return {\r\n                title: f.title,\r\n                selected: { type: cd.type, min: 0, max: min - 0.1 },\r\n              };\r\n            }\r\n            break;\r\n\r\n          case \"greaterThan\":\r\n            if (min != null) {\r\n              return {\r\n                title: f.title,\r\n                selected: { type: cd.type, min: min + 0.1, max: 100 },\r\n              };\r\n            }\r\n            break;\r\n\r\n          case \"lesserThanAndEqual\":\r\n            if (min != null) {\r\n              return {\r\n                title: f.title,\r\n                selected: { type: cd.type, min: 0, max: min },\r\n              };\r\n            }\r\n            break;\r\n\r\n          case \"greaterThanAndEqual\":\r\n            if (min != null) {\r\n              return {\r\n                title: f.title,\r\n                selected: { type: cd.type, min: min, max: 100 },\r\n              };\r\n            }\r\n            break;\r\n\r\n          case \"between\":\r\n            if (min != null && max != null) {\r\n              return { title: f.title, selected: { type: cd.type, min, max } };\r\n            }\r\n            break;\r\n        }\r\n\r\n        // Invalid → return null\r\n        return { title: f.title, selected: null };\r\n      }\r\n\r\n      if (f.type === \"single\") {\r\n        const sel = f.options.find((o) => o.checked);\r\n        return { title: f.title, selected: sel ? sel.value : null };\r\n      }\r\n\r\n      return {\r\n        title: f.title,\r\n        selected: f.options.filter((o) => o.checked).map((o) => o.value),\r\n      };\r\n    });\r\n  }\r\n\r\n  emitFilterChanges() {\r\n    this.filterChanged.emit(this.getSelectedData());\r\n  }\r\n\r\n  onApplyFilter() {\r\n    this.isFilterOpen = false;\r\n    this.filters.forEach((f) => (f.isOpened = false));\r\n    const finalData = this.getSelectedData();\r\n\r\n    this.applyFilters.emit(finalData);\r\n\r\n    const country = finalData[0]?.selected;\r\n    const city = finalData[1]?.selected;\r\n    const compliance = finalData[2]?.selected;\r\n    const planoStrategy = finalData[3]?.selected;\r\n\r\n    if (country.length || city.length || compliance || planoStrategy) {\r\n      this.isFilterApplied = true;\r\n    } else {\r\n      this.isFilterApplied = false;\r\n    }\r\n  }\r\n\r\n  onResetFilter(emitEvent: boolean = true) {\r\n    this.filters.forEach((f) => f.options.forEach((o) => (o.checked = false)));\r\n\r\n    this.filters[1].options = [];\r\n    this.displayedOptions[1] = [];\r\n\r\n    this.filters.forEach((_, i) => {\r\n      this.customData[i] = { type: null, min: null, max: null };\r\n      this.displayedOptions[i] = [...this.filters[i].options];\r\n    });\r\n\r\n    this.isFilterOpen = false;\r\n    this.isFilterProper = true;\r\n    this.filters.forEach((f) => (f.isOpened = false));\r\n    this.loadCities([]);\r\n\r\n    if (emitEvent) {\r\n      this.resetFilters.emit(this.getSelectedData());\r\n    }\r\n    this.isFilterApplied = false;\r\n  }\r\n\r\n  getSelectedCount(index: number) {\r\n    return this.filters[index].options.filter((o) => o.checked).length;\r\n  }\r\n\r\n  getSelectedItem(index: number) {\r\n    return this.filters[index].options.find((o) => o.checked) ?? null;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div class=\"position-relative\">\r\n    <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n        Filter\r\n        @if(isFilterApplied){\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n            <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n        </svg>\r\n        }\r\n\r\n    </button>\r\n\r\n    @if(isFilterOpen){\r\n    <div class=\"filter-dropdown\">\r\n\r\n        <div class=\"filter-header\">\r\n            <h2>Filter Options</h2>\r\n            <div class=\"d-flex gap-2\">\r\n                <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n                <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\"\r\n                    [disabled]=\"!isFilterProper\">Apply</button>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"filter-body\">\r\n\r\n            @for (filter of filters; let fi = $index; track fi) {\r\n\r\n            <div class=\"item-wrapper\">\r\n\r\n                <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n                    <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n                        @if(filter.type === 'multi'){\r\n                        {{filter.title}}\r\n                        @if(getSelectedCount(fi) > 0){\r\n                        <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n                        }\r\n                        }\r\n                        @else {\r\n                        {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n                        }\r\n                    </div>\r\n\r\n                    @if(filter.type === 'custom' && getSelectedItem(fi)?.value){\r\n                    <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\"\r\n                        (maxlength)=\"3\" [(ngModel)]=\"customData[fi].min\" (ngModelChange)=\"validateNumber(fi, 'min')\"\r\n                        (input)=\"onInput($event)\" placeholder=\"0-100%\">\r\n\r\n                    @if(getSelectedItem(fi)?.value === 'between'){\r\n                    <input class=\"form-control custom-input\" type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\"\r\n                        [(ngModel)]=\"customData[fi].max\" (ngModelChange)=\"validateNumber(fi, 'max')\"\r\n                        (input)=\"onInput($event)\" placeholder=\"0-100%\">\r\n                    }\r\n\r\n                    }\r\n\r\n                </div>\r\n\r\n                @if(filter.isOpened){\r\n                <div class=\"item-dropdown\">\r\n\r\n                    @if(filter.type === 'multi'){\r\n                    <div>\r\n                        <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n                            (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n                        <label [for]=\"'selectAll' + fi\">Select all</label>\r\n                    </div>\r\n\r\n                    <hr>\r\n\r\n                    <div class=\"my-2\">\r\n                        <span class=\"search-icon\">\r\n                            <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n                                <path\r\n                                    d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"1.3\" />\r\n                            </svg>\r\n                        </span>\r\n                        <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n                            (input)=\"onSearch($event, fi)\">\r\n                    </div>\r\n                    }\r\n\r\n                    @if(displayedOptions[fi].length == 0){\r\n                    <span class=\"no-data\">No Data</span>\r\n                    }\r\n                    @else {\r\n\r\n                    @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n                    @if(filter.type === 'single'){\r\n                    <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n                        <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n                        <label>{{ option.name }}</label>\r\n                    </div>\r\n                    }\r\n\r\n                    @if(filter.type === 'multi'){\r\n                    <div class=\"mb-4\">\r\n                        <input type=\"checkbox\" [id]=\"option.value\" [(ngModel)]=\"option.checked\"\r\n                            (change)=\"onOptionChange(filter, option)\">\r\n                        <label [for]=\"option.value\">{{ option.name }}</label>\r\n                    </div>\r\n                    }\r\n\r\n                    @if(filter.type === 'custom'){\r\n                    <div class=\"custom-option\" [class.selected]=\"getSelectedItem(fi)?.value === option.value\"\r\n                        (click)=\"onCustomSelect(fi, filter, option)\">\r\n                        <label>{{ option.name }}</label>\r\n                    </div>\r\n                    }\r\n\r\n                    }\r\n                    }\r\n\r\n                </div>\r\n                }\r\n\r\n            </div>\r\n\r\n            }\r\n\r\n        </div>\r\n    </div>\r\n    }\r\n</div>","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { debounceTime, distinctUntilChanged, filter, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { PlanoRolloutList } from '../../../interfaces/planogram.interface';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { BulkUploadPlanogramComponent } from '../popups/bulk-upload-planogram/bulk-upload-planogram.component';\r\nimport { getQueryParamNumber, getQueryParamString } from '../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: \"lib-plano-rollout-table\",\r\n  templateUrl: \"./rollout-table.component.html\",\r\n  styleUrl: \"./rollout-table.component.scss\",\r\n})\r\nexport class PlanoRolloutTableComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  cardData: any;\r\n  planogramsList: PlanoRolloutList[] = [];\r\n\r\n  selectedFilterTab: string = \"all\";\r\n  activeTab: string = \"all-planograms\"; // 'all-planograms' or 'find-replace'\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  // filterObject = [\r\n  //   {\r\n  //     Description: \"Status\",\r\n  //     Issues: [\r\n  //       { text: \"Task Assigned\", id: \"taskAssigned\" },\r\n  //       { text: \"Review Pending\", id: \"reviewPending\" },\r\n  //       // { text: \"Yet To Complete\", id: \"yetToComplete\" },\r\n  //       { text: \"Yet To Assign\", id: \"yetToAssign\" },\r\n  //       // { text: \"Roll out\", id: \"rollout\" },\r\n  //       { text: \"Completed\", id: \"completed\" },\r\n  //     ],\r\n  //   },\r\n  // {\r\n  //   Description: \"Flag\",\r\n  //   Issues: [\r\n  //     { text: \"vm Flag\", id: \"vm\" },\r\n  //     { text: \"Fixture Flag\", id: \"fixture\" },\r\n  //     { text: \"Layout Flag\", id: \"layout\" },\r\n  //   ],\r\n  // },\r\n  // ];\r\n\r\n  filterObject = [\r\n    {\r\n      title: \"Merch\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        // { name: \"Yet To Complete\", value: \"yetToComplete\" },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        // { name: \"Roll out\", value: \"rollout\" },\r\n        { name: \"Completed\", value: \"completed\", checked: false },\r\n        { name: \"Flag\", value: \"flag\", checked: false },\r\n      ],\r\n    },\r\n    {\r\n      title: \"VM\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        { name: \"Completed\", value: \"completed\", checked: false },\r\n        { name: \"Flag\", value: \"flag\", checked: false },\r\n      ],\r\n    },\r\n    {\r\n      title: \"Planogram Status\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        { name: \"Ready to Publish\", value: \"notPublished\", checked: false },\r\n        { name: \"Published\", value: \"publish\", checked: false },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  appliedFilters: any = {\r\n    country: [],\r\n    city: [],\r\n    merch: [],\r\n    vm: [],\r\n    status: [],\r\n    type: \"all\",\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isButtonLoading: boolean = false;\r\n  isError: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private planoSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        filter((data) => !!data), // Filtering null/undefined.\r\n        distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe({\r\n        next: (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n\r\n          this.route.queryParamMap\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe((params) => {\r\n              this.searchTerm = getQueryParamString({\r\n                params,\r\n                key: \"search\",\r\n                fallback: \"\",\r\n              });\r\n              this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n              // Get active tab from query params\r\n              const viewParam = getQueryParamString({\r\n                params,\r\n                key: \"view\",\r\n                fallback: \"all-planograms\",\r\n              });\r\n              this.activeTab = viewParam === \"find-replace\" ? \"find-replace\" : \"all-planograms\";\r\n\r\n              this.selectedFilterTab = getQueryParamString({\r\n                params,\r\n                key: \"tab\",\r\n                fallback: \"all\",\r\n              });\r\n              this.appliedFilters.type = this.selectedFilterTab;\r\n\r\n              this.limit = getQueryParamNumber({\r\n                params,\r\n                key: \"limit\",\r\n                fallback: 10,\r\n                min: 1,\r\n                max: 30,\r\n              });\r\n\r\n              this.offset = getQueryParamNumber({\r\n                params,\r\n                key: \"offset\",\r\n                fallback: 0,\r\n                min: 0,\r\n              });\r\n\r\n              this.getPlanoTableList();\r\n            });\r\n        },\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Manage Planogram\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  getPlanoTableList() {\r\n    this.planoSub?.unsubscribe(); // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.planogramsList = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      // export: false,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.planoSub = this.storeBuilderService\r\n      .getPlanoRolloutList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.totalItems = res?.data?.tableData?.count ?? 0;\r\n            this.planogramsList = res?.data?.tableData?.data;\r\n            this.cardData = res?.data?.cardData;\r\n            if (this.totalItems < 10) {\r\n              this.paginationSizes = [this.totalItems];\r\n            } else {\r\n              this.paginationSizes = [10, 20, 30];\r\n            }\r\n          }\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n\r\n    this.totalItems = this.planogramsList.length;\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(BulkUploadPlanogramComponent);\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  onTabChange(tab: string) {\r\n    if (this.activeTab !== tab) {\r\n      this.activeTab = tab;\r\n      this.router.navigate([], {\r\n        relativeTo: this.route,\r\n        queryParams: {\r\n          view: tab,\r\n        },\r\n        queryParamsHandling: \"merge\",\r\n        replaceUrl: true,\r\n      });\r\n    }\r\n  }\r\n\r\n  filterTable(data: string) {\r\n    if (this.selectedFilterTab !== data) {\r\n      this.selectedFilterTab = data;\r\n      this.appliedFilters.type = this.selectedFilterTab;\r\n      this.offset = 1;\r\n      this.limit = 10;\r\n      this.searchTerm = \"\";\r\n      this.updateQueryParams();\r\n    }\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    event.forEach((ele: any) => {\r\n      if (ele.title == \"Planogram Status\") {\r\n        ele.title = \"status\";\r\n      }\r\n      this.appliedFilters[ele.title.toLowerCase()] = ele.selected;\r\n    });\r\n    let task = this.selectedFilterTab;\r\n    if (this.selectedFilterTab == \"vm\") {\r\n      task = \"fixture\";\r\n    }\r\n    \r\n    // const type = event[1].Issues.map((i: any) => i.id);\r\n    // const size = event[2].Issues.map((i: any) => i.id);\r\n\r\n    // this.isFilterApplied = status;\r\n    this.appliedFilters[\"type\"] = this.selectedFilterTab;\r\n    this.offset = 1;\r\n    this.offset = 1;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  getTaskStatus(data: any, type: string) {\r\n    const statusMap: any = {\r\n      merchRollout: data.taskFeedback?.fixtureStatus || \"\",\r\n      vmRollout: data.taskFeedback?.vmStatus || \"\",\r\n    };\r\n\r\n    const status = statusMap[type];\r\n\r\n    const taskDetails = data?.taskDetails?.find((ele: any) => ele.type == type);\r\n\r\n    if (status === \"pending\" && taskDetails.status == \"submit\") return \"reviewPending\";\r\n\r\n    if (data.layoutCount > 1) {\r\n      let taskInfo = data?.taskDetails.map((ele: any) => ele.status);\r\n      if (taskInfo?.length != data.layoutCount) {\r\n        return \"yetToAssign\";\r\n      }\r\n      if (taskInfo.includes(\"open\") || taskInfo.includes(\"inprogress\")) {\r\n        return \"taskAssigned\";\r\n      }\r\n    }\r\n\r\n    if (\r\n      !taskDetails ||\r\n      (taskDetails.status == \"submit\" && status === \"disagree\")\r\n    )\r\n      return \"yetToAssign\";\r\n\r\n    if (taskDetails.status !== \"submit\") return \"taskAssigned\";\r\n\r\n    if (!status || status === \"\" || status == \"complete\") {\r\n      if (\r\n        (type == \"merchRollout\" && data.merchEditedCount) ||\r\n        (type == \"vmRollout\" && data.vmEditedCount)\r\n      ) {\r\n        return \"yetToAssign\";\r\n      } else {\r\n        return \"completed\";\r\n      }\r\n    }\r\n  }\r\n\r\n  getTaskTooltip(data: any, type: string) {\r\n    const statusMap: any = {\r\n      merchRollout: data.taskFeedback?.fixtureStatus || \"\",\r\n      vmRollout: data.taskFeedback?.vmStatus || \"\",\r\n    };\r\n\r\n    const taskDetails = data?.taskDetails?.find((ele: any) => ele.type == type);\r\n\r\n    const status = statusMap[type];\r\n\r\n    if (status === \"pending\" && taskDetails.status == \"submit\") return \"Review Pending\";\r\n\r\n    if (data.layoutCount > 1) {\r\n      let taskInfo = data?.taskDetails.map((ele: any) => ele.status);\r\n      if (taskInfo?.length != data.layoutCount) {\r\n        return \"Yet to Assign\";\r\n      }\r\n      if (taskInfo.includes(\"open\") || taskInfo.includes(\"inprogress\")) {\r\n        return \"Task Assigned\";\r\n      }\r\n    }\r\n\r\n    if (\r\n      !taskDetails ||\r\n      (taskDetails.status == \"submit\" && status === \"disagree\")\r\n    )\r\n      return \"Yet to Assign\";\r\n\r\n    if (taskDetails.status !== \"submit\") return \"Task Assigned\";\r\n\r\n    if (!status || status == \"complete\" || status === \"\") {\r\n      if (\r\n        (type == \"merchRollout\" && data.merchEditedCount) ||\r\n        (type == \"vmRollout\" && data.vmEditedCount)\r\n      ) {\r\n        return \"Yet to Assign\";\r\n      } else {\r\n        return \"Completed\";\r\n      }\r\n    }\r\n  }\r\n\r\n  showBreach(data: any, type: string) {\r\n    let taskDetails = data?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (taskDetails && taskDetails?.status != \"submit\" && taskDetails?.breach) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        tab: this.selectedFilterTab,\r\n        search: this.searchTerm,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.planoSub?.unsubscribe();\r\n  }\r\n\r\n  getStatus(data: any) {\r\n    let merchStatus:any = this.getTaskTooltip(data,'merchRollout');\r\n    let vmStatus:any = this.getTaskTooltip(data,'vmRollout');\r\n    let merchBreach: any = this.showBreach(data, \"merchRollout\");\r\n    let vmBreach: any = this.showBreach(data, \"vmRollout\");\r\n\r\n    \r\n    let taskStatus = [merchStatus,vmStatus];\r\n    \r\n    if (taskStatus.includes(\"Review Pending\") && !merchBreach && !vmBreach) {\r\n      return \"Review Pending\";\r\n    }\r\n\r\n    if (taskStatus.includes(\"Yet to Assign\") || merchBreach || vmBreach) {\r\n      return \"Yet to Assign\";\r\n    }\r\n\r\n    if (taskStatus.includes(\"Task Assigned\")) {\r\n      return \"Task Assigned\";\r\n    }\r\n\r\n    if(taskStatus.every((ele:any) => ele == 'Completed') && (data.merchStatus.includes(false) || data.vmStatus.includes(false))) {\r\n      return  'Ready to Publish'\r\n    }\r\n\r\n    if(taskStatus.every((ele:any) => ele == 'Completed') && !data.merchStatus.includes(false) && !data.vmStatus.includes(false)) {\r\n      return  'Published'\r\n    }\r\n\r\n  }\r\n\r\n  getStatusBadge(data:any) {\r\n   let merchStatus: any = this.getTaskStatus(data, \"merchRollout\");\r\n   let vmStatus: any = this.getTaskStatus(data, \"vmRollout\");\r\n   let merchBreach: any = this.showBreach(data, \"merchRollout\");\r\n   let vmBreach: any = this.showBreach(data, \"vmRollout\");\r\n\r\n   let taskStatus = [merchStatus, vmStatus];\r\n\r\n   if (taskStatus.includes(\"reviewPending\") && !merchBreach && !vmBreach) {\r\n     return \"reviewPending\";\r\n   }\r\n\r\n   if (taskStatus.includes(\"yetToAssign\") || merchBreach || vmBreach) {\r\n     return \"yetToAssign\";\r\n   }\r\n\r\n   if (taskStatus.includes(\"taskAssigned\")) {\r\n     return \"taskAssigned\";\r\n   }\r\n\r\n   if (taskStatus.every((ele: any) => ele == \"completed\") && (data.merchStatus.includes(false) || data.vmStatus.includes(false))) {\r\n     return \"primaryBadgeStyle\";\r\n   }\r\n\r\n   if (taskStatus.every((ele: any) => ele == \"completed\") && (!data.merchStatus.includes(false) && !data.vmStatus.includes(false))) {\r\n     return \"bg-success\";\r\n   }\r\n  }\r\n\r\n  onExport() {\r\n    this.isButtonLoading = true;\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.totalItems,\r\n      offset: 0,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      export: true,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.storeBuilderService\r\n      .getRolloutListExport(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res) {\r\n            this.storeBuilderService.saveAsExcelFile(res, \"Rollout\");\r\n          }\r\n          this.isButtonLoading = false;\r\n        },\r\n        error: (err) => {\r\n          console.log(err, \"err\");\r\n          this.isButtonLoading = false;\r\n        },\r\n      });\r\n  }\r\n}\r\n","<!-- Filter Tabs (only show for All Planograms) -->\r\n<div class=\"row mx-0 my-5 gap-2\" >\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'all' }\" (click)=\"filterTable('all')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardData?.totalStore || 0 }}</h3>\r\n    <p>All store</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'rollout' }\" (click)=\"filterTable('rollout')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardData?.rolloutStore ?? 0 }}</h3>\r\n    <p>Rollout store</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'merch' }\" (click)=\"filterTable('merch')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardData?.merchPendingStore ?? 0 }}</h3>\r\n    <p>Merch approval pending</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'vm' }\" (click)=\"filterTable('vm')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardData?.vmPendingStore ?? 0 }}</h3>\r\n    <p>Visual Merch approval pending</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'flag' }\" (click)=\"filterTable('flag')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardData?.flagStore ?? 0 }}</h3>\r\n    <p>Flags</p>\r\n  </div>\r\n</div>\r\n\r\n<!-- Tabs Navigation -->\r\n<div class=\"d-flex justify-content-start mb-4\">\r\n  <ul class=\"nav nav-line-tabs nav-line-tabs-2x\">\r\n    <li class=\"nav-item\">\r\n      <a\r\n        class=\"nav-link\"\r\n        [routerLink]=\"[]\"\r\n        [queryParams]=\"{ view: 'all-planograms' }\"\r\n        [queryParamsHandling]=\"'merge'\"\r\n        [class.active]=\"activeTab === 'all-planograms'\"\r\n        (click)=\"onTabChange('all-planograms')\"\r\n      >\r\n        All Planograms\r\n      </a>\r\n    </li>\r\n    <li class=\"nav-item\">\r\n      <a\r\n        class=\"nav-link\"\r\n        [routerLink]=\"[]\"\r\n        [queryParams]=\"{ view: 'find-replace' }\"\r\n        [queryParamsHandling]=\"'merge'\"\r\n        [class.active]=\"activeTab === 'find-replace'\"\r\n        (click)=\"onTabChange('find-replace')\"\r\n      >\r\n        Find and Replace\r\n      </a>\r\n    </li>\r\n  </ul>\r\n</div>\r\n\r\n<div >\r\n  <!-- All Planograms Table -->\r\n  <div *ngIf=\"activeTab === 'all-planograms'\" [class.restrict-interaction]=\"isButtonLoading\">\r\n    <div class=\"content-wrapper\" >\r\n       <!-- Manage Planogram view header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n      <div>\r\n        <h4>All Planograms</h4>\r\n        <span>{{ totalItems }} - Total Stores</span>\r\n      </div>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div style=\"position: relative\">\r\n          <input\r\n            type=\"text\"\r\n            [(ngModel)]=\"searchTerm\"\r\n            (change)=\"onSearch()\"\r\n            style=\"padding-left: 3rem; padding-right: 3rem\"\r\n            class=\"form-control\"\r\n            name=\"search\"\r\n            autocomplete=\"off\"\r\n            placeholder=\"Search\"\r\n          />\r\n\r\n          <span class=\"search-icon\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n              <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n              <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n            </svg>\r\n          </span>\r\n\r\n          <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n            <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <circle\r\n                  cx=\"12\"\r\n                  cy=\"12\"\r\n                  r=\"9\"\r\n                  stroke=\"#667085\"\r\n                  stroke-width=\"2\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                ></circle>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- <button type=\"button\" (click)=\"onClickCreateFixture()\" class=\"btn btn-primary d-inline-flex align-items-center me-2\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path\r\n              d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\"\r\n              stroke=\"white\"\r\n              stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          <span class=\"ms-2 text-white\">Create </span>\r\n        </button> -->\r\n\r\n        <!-- <button type=\"button\" (click)=\"openBulkUploadModal()\" class=\"btn btn-outline text-nowrap\">\r\n          <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"currentColor\"\r\n              stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Bulk Upload\r\n        </button> -->\r\n\r\n        <!-- <button type=\"button\" class=\"btn btn-outline d-line-flex align-items-center text-nowrap\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\"\r\n              stroke=\"#344054\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Filter\r\n        </button> -->\r\n\r\n        <!-- <lib-filters [dataObject]=\"filterObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters> -->\r\n        <plano-filter [clientId]=\"clientId\" [data]=\"filterObject\" (applyFilters)=\"applyFilters($event)\"\r\n          (resetFilters)=\"applyFilters($event)\" [config]=\"{ 'Merchandise compliance': false }\"></plano-filter>\r\n\r\n        <button type=\"button\" (click)=\"onExport()\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n          [disabled]=\"!planogramsList.length\">\r\n        \r\n          <svg *ngIf=\"!isButtonLoading\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n            fill=\"none\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n          </svg>\r\n        \r\n          <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n            <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n          </svg>\r\n          <span class=\"ms-2\"> Export</span>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"isPageLoading\">\r\n      <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"card-body d-flex justify-content-center align-items-center flex-column\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length === 0\"\r\n    >\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">\r\n        {{\r\n          selectedFilterTab === \"all\"\r\n            ? \"No data found\"\r\n            : selectedFilterTab === \"rollout\"\r\n            ? \"Rollout stores\"\r\n            : selectedFilterTab === \"merch\"\r\n            ? \"Merchandise approval\"\r\n            : selectedFilterTab === \"vm\"\r\n            ? \"Visual merchandise approval\"\r\n            : \"Flags\"\r\n        }}\r\n      </div>\r\n      <div class=\"nodatasubtext\" *ngIf=\"selectedFilterTab === 'all'\">There is no result for manage rollout table</div>\r\n      <div class=\"nodatasubtext\" *ngIf=\"selectedFilterTab === 'rollout'\">No rollout initiated for any store</div>\r\n      <div class=\"nodatasubtext\" *ngIf=\"selectedFilterTab === 'merch'\">Looks like there are no merchandise approval pending</div>\r\n      <div class=\"nodatasubtext\" *ngIf=\"selectedFilterTab === 'vm'\">\r\n        Looks like there are no visual merchandise approval pending\r\n      </div>\r\n      <div class=\"nodatasubtext\" *ngIf=\"selectedFilterTab === 'flag'\">Looks like no issue so far with any stores</div>\r\n    </div>\r\n\r\n    <!-- Manage Planogram list view -->\r\n    <section id=\"list-view\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n      <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n          <thead>\r\n            <tr>\r\n              <th>\r\n                <span (click)=\"onSortTable('storeName')\" class=\"cursor-pointer\">\r\n                  Store Name\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'storeName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutName')\" class=\"cursor-pointer\">\r\n                  Plano Name\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'layoutName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th> Country </th>\r\n              <th> City </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutCount')\" class=\"cursor-pointer\">\r\n                  Floor\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'layoutCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('fixtureCount')\" class=\"cursor-pointer\">\r\n                  Merch Fixtures\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'fixtureCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('vmCount')\" class=\"cursor-pointer\">\r\n                  Visual Merch\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'vmCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('lastUpdate')\" class=\"cursor-pointer\">\r\n                  Last update\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'lastUpdate' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'lastUpdate' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span class=\"cursor-pointer\">\r\n                  Rollout Status\r\n                </span>\r\n              </th>\r\n              <!-- <th></th> -->\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let plano of planogramsList\">\r\n              <td>\r\n                <div class=\"d-flex align-items-center\">\r\n                  <a\r\n                    [routerLink]=\"['/manage/stores/plano']\"\r\n                    [queryParams]=\"{ storeId: plano?.storeId }\"\r\n                    class=\"text-decoration-underline\"\r\n                  >\r\n                    {{ plano.storeName }}</a\r\n                  >\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <a\r\n                  [routerLink]=\"['/manage/planogram/manage-rollout']\"\r\n                  [queryParams]=\"{ planoId: plano.planoId, floorId: plano?.floorId }\"\r\n                  class=\"text-decoration-underline\"\r\n                >\r\n                <!-- cardData.doubleFloorStore.includes(plano?.storeId)\r\n                  ? plano.layoutName + \"-\" + plano?.floorName -->\r\n                  {{\r\n                    plano.layoutName\r\n                  }}\r\n                </a>\r\n              </td>\r\n              <td>\r\n                {{plano?.country}}\r\n              </td>\r\n              <td>\r\n                {{plano?.city}}\r\n              </td>\r\n              <td>\r\n                {{plano?.layoutCount}}\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano.fixtureCount }}\r\n                  </span>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"showBreach(plano, 'merchRollout')\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getTaskStatus(plano, 'merchRollout') || 'taskAssigned'\"\r\n                    *ngIf=\"!showBreach(plano, 'merchRollout')\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getTaskTooltip(plano, 'merchRollout') || 'Task Assigned' }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano.vmCount }}\r\n                  </span>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"showBreach(plano, 'vmRollout')\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getTaskStatus(plano, 'vmRollout') || 'taskAssigned'\"\r\n                    *ngIf=\"!showBreach(plano, 'vmRollout')\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getTaskTooltip(plano, 'vmRollout') || 'Task Assigned' }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td class=\"text-center\">\r\n                <span [ngbTooltip]=\"plano?.lastUpdate | date : 'medium'\">\r\n                  {{ plano?.lastUpdate | date }}\r\n                </span>\r\n              </td>\r\n              <td class=\"text-center\">\r\n                <div class=\"badge\" [ngClass]=\"getStatusBadge(plano)\">\r\n                  {{ getStatus(plano) }}\r\n                </div>\r\n              </td>\r\n              <!-- <td class=\"text-center\">\r\n                <div class=\"badge\" [ngClass]=\"getStatus(plano) === 'Completed' ? 'bg-success' : 'badgeStyle'\">\r\n                  {{ getStatus(plano) }}\r\n                </div>\r\n              </td> -->\r\n              <!-- <td>\r\n                <div class=\"d-flex align-items-center gap-2 justify-content-center\">\r\n                  <svg width=\"21\" height=\"22\" viewBox=\"0 0 21 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <g clip-path=\"url(#clip0_17_71425)\">\r\n                      <path\r\n                        d=\"M12.1971 18.7144C12.0464 18.9742 11.8302 19.1898 11.5699 19.3397C11.3097 19.4896 11.0146 19.5685 10.7143 19.5685C10.414 19.5685 10.1189 19.4896 9.85866 19.3397C9.59842 19.1898 9.38212 18.9742 9.23143 18.7144M15.8571 7.57157C15.8571 6.2076 15.3153 4.89949 14.3508 3.93502C13.3864 2.97055 12.0783 2.42871 10.7143 2.42871C9.35032 2.42871 8.04221 2.97055 7.07774 3.93502C6.11326 4.89949 5.57143 6.2076 5.57143 7.57157C5.57143 13.5716 3 15.2859 3 15.2859H18.4286C18.4286 15.2859 15.8571 13.5716 15.8571 7.57157Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                      <path\r\n                        d=\"M2.08574 8.04805C1.55611 8.04805 1.12146 7.61768 1.17082 7.09036C1.286 5.85989 1.627 4.71322 2.19383 3.65034C2.75229 2.60318 3.46062 1.69605 4.31882 0.928939C4.71052 0.578823 5.30965 0.673501 5.62062 1.09695C5.93175 1.52062 5.83525 2.1121 5.45225 2.47212C4.82875 3.05819 4.30987 3.74239 3.89559 4.52471C3.47303 5.32267 3.20776 6.17833 3.0998 7.09169C3.03766 7.61747 2.61518 8.04805 2.08574 8.04805ZM19.3431 8.04805C18.8134 8.04805 18.3908 7.6171 18.3287 7.09105C18.2209 6.17793 17.9556 5.32248 17.5326 4.52471C17.118 3.74258 16.5993 3.05852 15.9765 2.47254C15.5937 2.11226 15.4973 1.5207 15.8085 1.09696C16.1196 0.673433 16.7187 0.578551 17.1107 0.928571C17.9693 1.6954 18.6778 2.60266 19.2363 3.65034C19.8032 4.71381 20.1438 5.86068 20.2581 7.09095C20.3071 7.61809 19.8725 8.04805 19.3431 8.04805Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_17_71425\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.428711 0.714355)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n\r\n                  <svg width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <g clip-path=\"url(#clip0_139_112685)\">\r\n                      <path\r\n                        d=\"M12.4843 21.4302C12.3336 21.69 12.1173 21.9057 11.857 22.0556C11.5968 22.2055 11.3017 22.2844 11.0014 22.2844C10.7011 22.2844 10.406 22.2055 10.1458 22.0556C9.88553 21.9057 9.66923 21.69 9.51854 21.4302M16.1443 10.2874C16.1443 8.92342 15.6024 7.61531 14.6379 6.65084C13.6735 5.68637 12.3654 5.14453 11.0014 5.14453C9.63742 5.14453 8.32932 5.68637 7.36485 6.65084C6.40037 7.61531 5.85854 8.92342 5.85854 10.2874C5.85854 16.2874 3.28711 18.0017 3.28711 18.0017H18.7157C18.7157 18.0017 16.1443 16.2874 16.1443 10.2874Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                      <path\r\n                        d=\"M2.37187 10.7634C1.84224 10.7634 1.40759 10.333 1.45695 9.80569C1.57213 8.57522 1.91313 7.42855 2.47997 6.36567C3.03842 5.31851 3.74675 4.41138 4.60496 3.64427C4.99665 3.29415 5.59578 3.38883 5.90675 3.81228C6.21788 4.23595 6.12138 4.82744 5.73838 5.18745C5.11489 5.77352 4.596 6.45772 4.18172 7.24004C3.75916 8.038 3.4939 8.89366 3.38594 9.80702C3.32379 10.3328 2.90131 10.7634 2.37187 10.7634ZM19.6292 10.7634C19.0995 10.7634 18.6769 10.3324 18.6148 9.80638C18.507 8.89326 18.2417 8.03781 17.8188 7.24004C17.4041 6.45791 16.8854 5.77385 16.2627 5.18787C15.8798 4.8276 15.7835 4.23603 16.0947 3.81229C16.4057 3.38876 17.0049 3.29388 17.3968 3.6439C18.2554 4.41073 18.964 5.31799 19.5224 6.36567C20.0893 7.42914 20.4299 8.57601 20.5442 9.80628C20.5932 10.3334 20.1586 10.7634 19.6292 10.7634Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </g>\r\n                    <path\r\n                      d=\"M17 1C19.7614 1 22 3.23858 22 6C22 8.76142 19.7614 11 17 11C14.2386 11 12 8.76142 12 6C12 3.23858 14.2386 1 17 1Z\"\r\n                      fill=\"#FF0000\"\r\n                      stroke=\"white\"\r\n                      stroke-width=\"2\"\r\n                    />\r\n                    <defs>\r\n                      <clipPath id=\"clip0_139_112685\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.714844 3.42969)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n\r\n                  <div class=\"dropdown\">\r\n                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                          d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                      </svg>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li><a class=\"dropdown-item cursor-pointer\">Edit</a></li>\r\n                      <li><a class=\"dropdown-item cursor-pointer\">Duplicate</a></li>\r\n                      <li><a class=\"dropdown-item cursor-pointer text-danger\">Delete</a></li>\r\n                    </ul>\r\n                  </div>\r\n                </div>\r\n              </td> -->\r\n              <!-- <td>\r\n                <a\r\n                  [routerLink]=\"['/manage/planogram/manage-planogram']\"\r\n                  [queryParams]=\"{ planoId: plano.planoId, floorId: plano?.floorId }\"\r\n                >\r\n                  <svg\r\n                    width=\"23\"\r\n                    height=\"24\"\r\n                    viewBox=\"0 0 23 24\"\r\n                    fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    *ngIf=\"getSubmit(plano)\"\r\n                  >\r\n                    <path\r\n                      d=\"M10.1395 6.85728H4.13946C3.6848 6.85728 3.24876 7.0379 2.92727 7.35939C2.60578 7.68088 2.42517 8.11691 2.42517 8.57157V20.5716C2.42517 21.0262 2.60578 21.4623 2.92727 21.7838C3.24876 22.1052 3.6848 22.2859 4.13946 22.2859H16.1395C16.5941 22.2859 17.0301 22.1052 17.3516 21.7838C17.6731 21.4623 17.8537 21.0262 17.8537 20.5716V14.5716M16.568 5.57157C16.909 5.23058 17.3715 5.03901 17.8537 5.03901C18.336 5.03901 18.7985 5.23058 19.1395 5.57157C19.4805 5.91256 19.672 6.37505 19.672 6.85728C19.672 7.33952 19.4805 7.80201 19.1395 8.143L10.9966 16.2859L7.56803 17.143L8.42517 13.7144L16.568 5.57157Z\"\r\n                      stroke=\"#667085\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                    <path\r\n                      d=\"M17 1C19.7614 1 22 3.23858 22 6C22 8.76142 19.7614 11 17 11C14.2386 11 12 8.76142 12 6C12 3.23858 14.2386 1 17 1Z\"\r\n                      fill=\"#FF0000\"\r\n                      stroke=\"white\"\r\n                      stroke-width=\"2\"\r\n                    />\r\n                  </svg>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"21\"\r\n                    height=\"22\"\r\n                    viewBox=\"0 0 21 22\"\r\n                    fill=\"none\"\r\n                    *ngIf=\"!getSubmit(plano)\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_844_18318)\">\r\n                      <path\r\n                        d=\"M9.85686 4.14249H3.85686C3.40221 4.14249 2.96617 4.32311 2.64468 4.6446C2.32319 4.96609 2.14258 5.40212 2.14258 5.85678V17.8568C2.14258 18.3114 2.32319 18.7475 2.64468 19.069C2.96617 19.3905 3.40221 19.5711 3.85686 19.5711H15.8569C16.3115 19.5711 16.7476 19.3905 17.069 19.069C17.3905 18.7475 17.5712 18.3114 17.5712 17.8568V11.8568M16.2854 2.85678C16.6264 2.51579 17.0889 2.32422 17.5712 2.32422C18.0534 2.32422 18.5159 2.51579 18.8569 2.85678C19.1979 3.19777 19.3894 3.66026 19.3894 4.14249C19.3894 4.62473 19.1979 5.08722 18.8569 5.42821L10.714 13.5711L7.28544 14.4282L8.14258 10.9996L16.2854 2.85678Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_18318\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.427734 0.713867)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </a>\r\n              </td> -->\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </section>\r\n\r\n    <!-- Manage Planogram grid view -->\r\n    <!-- <ng-template #gridView>\r\n      <section id=\"grid-view\">\r\n        <div class=\"row gx-6 gy-4\">\r\n          <div class=\"col-md-4\" *ngFor=\"let fixture of fixtureTemplatesList\">\r\n            <div class=\"card\">\r\n              <div class=\"card-img\">\r\n                <div class=\"card-action dropdown\">\r\n                  <button class=\"btn btn-light px-4 py-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                    <i class=\"bi bi-three-dots-vertical\"></i>\r\n                  </button>\r\n                  <ul class=\"dropdown-menu\">\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Edit</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Duplicate</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer text-danger\">Delete</a></li>\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between align-items-center\">\r\n                <h3>{{ fixture.name }}</h3>\r\n                <div class=\"badge\" [ngClass]=\"fixture.status\">{{ fixture.status | titlecase }}</div>\r\n              </div>\r\n              <div class=\"d-flex gap-2\">\r\n                <div *ngFor=\"let subBrand of fixture.subBrand; let i = index\">\r\n                  <span *ngIf=\"i != 0\" class=\"me-2 card-tagline\">&#8226;</span>\r\n                  <div class=\"badge\">{{ subBrand }}</div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </section>\r\n    </ng-template> -->\r\n\r\n    <!-- Pagination -->\r\n    <lib-pagination\r\n      [itemsPerPage]=\"limit\"\r\n      [currentPage]=\"offset\"\r\n      [totalItems]=\"totalItems\"\r\n      [paginationSizes]=\"paginationSizes\"\r\n      [pageSize]=\"paginationSize()\"\r\n      (pageChange)=\"onPageChange($event)\"\r\n      (pageSizeChange)=\"onPageSizeChange($event)\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length !== 0\"\r\n    >\r\n    </lib-pagination>\r\n    </div>\r\n\r\n   \r\n  </div>\r\n\r\n  <!-- Find and Replace Table -->\r\n  <div *ngIf=\"activeTab === 'find-replace'\">\r\n    <lib-find-replace-table></lib-find-replace-table>\r\n  </div>\r\n</div>\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { Router, ActivatedRoute } from \"@angular/router\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  Subject,\r\n  Subscription,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { PlanoList } from \"../../../interfaces/planogram.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { BulkUploadPlanogramComponent } from \"../popups/bulk-upload-planogram/bulk-upload-planogram.component\";\r\nimport {\r\n  getQueryParamNumber,\r\n  getQueryParamString,\r\n} from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-verification-table\",\r\n  templateUrl: \"./verification-table.component.html\",\r\n  styleUrl: \"./verification-table.component.scss\",\r\n})\r\nexport class PlanoVerificationTableComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  pendingDetails: any;\r\n  planogramsList: PlanoList[] = [];\r\n\r\n  selectedFilterTab: string = \"all\";\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  // filterObject = [\r\n  //   {\r\n  //     Description: \"Layout\",\r\n  //     Issues: [\r\n  //       { text: \"Task Assigned\", id: \"taskAssigned\" },\r\n  //       { text: \"Review Pending\", id: \"reviewPending\" },\r\n  //       // { text: \"Yet To Complete\", id: \"yetToComplete\" },\r\n  //       { text: \"Yet To Assign\", id: \"yetToAssign\" },\r\n  //       // { text: \"Roll out\", id: \"rollout\" },\r\n  //       { text: \"Completed\", id: \"completed\" },\r\n  //       { text: \"Flag\", id: \"flag\" },\r\n  //     ],\r\n  //   },\r\n  //   {\r\n  //     Description: \"Fixture\",\r\n  //     Issues: [\r\n  //       { text: \"Task Assigned\", id: \"taskAssigned\" },\r\n  //       { text: \"Review Pending\", id: \"reviewPending\" },\r\n  //       // { text: \"Yet To Complete\", id: \"yetToComplete\" },\r\n  //       { text: \"Yet To Assign\", id: \"yetToAssign\" },\r\n  //       // { text: \"Roll out\", id: \"rollout\" },\r\n  //       { text: \"Completed\", id: \"completed\" },\r\n  //       { text: \"Flag\", id: \"flag\" },\r\n  //     ],\r\n  //   },\r\n  //   {\r\n  //     Description: \"Planogram Status\",\r\n  //     Issues: [\r\n  //       { text: \"In-Progress\", id: \"inprogress\" },\r\n  //       { text: \"Ready to Publish\", id: \"notPublished\" },\r\n  //       { text: \"Published\", id: \"publish\" },\r\n  //     ],\r\n  //   },\r\n  // ];\r\n\r\n  filterObject = [\r\n    {\r\n      title: \"Layout\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        // { name: \"Yet To Complete\", value: \"yetToComplete\" },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        // { name: \"Roll out\", value: \"rollout\" },\r\n        { name: \"Completed\", value: \"completed\", checked: false },\r\n        { name: \"Flag\", value: \"flag\", checked: false },\r\n      ],\r\n    },\r\n    {\r\n      title: \"Fixture\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        // { name: \"Yet To Complete\", value: \"yetToComplete\" },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        // { name: \"Roll out\", value: \"rollout\" },\r\n        { name: \"Completed\", value: \"completed\", checked: false },\r\n        { name: \"Flag\", value: \"flag\", checked: false },\r\n      ],\r\n    },\r\n    // [ZONE-VERIFICATION] additive — independent zone filter\r\n    {\r\n      title: \"Zone\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        { name: \"Completed\", value: \"completed\", checked: false },\r\n        { name: \"Flag\", value: \"flag\", checked: false },\r\n      ],\r\n    },\r\n    {\r\n      title: \"Planogram Status\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Task Assigned\", value: \"taskAssigned\", checked: false },\r\n        { name: \"Review Pending\", value: \"reviewPending\", checked: false },\r\n        { name: \"Yet To Assign\", value: \"yetToAssign\", checked: false },\r\n        { name: \"Ready to Publish\", value: \"notPublished\", checked: false },\r\n        { name: \"Published\", value: \"publish\", checked: false },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  appliedFilters: any = {\r\n    country: [],\r\n    city: [],\r\n    layout: [],\r\n    fixture: [],\r\n    zone: [],\r\n    taskPending: \"all\",\r\n    status: [],\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isCardsLoading: boolean = true;\r\n  isButtonLoading: boolean = false;\r\n  isError: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private planoSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService\r\n  ) {}\r\n\r\n  // [PRIORITY-FLOOR] A multi-floor store shows ONE row. The backend selects a\r\n  // \"priority floor\" (least-progressed pending, filter-aware) and ships a\r\n  // single-floor-shaped `priorityFloor` view. Status indicators read THIS view so\r\n  // the row reflects — and opens — that same floor. Counts/capacity/Layout x/y\r\n  // stay store-wide on `plano`. Falls back to the row itself for safety.\r\n  pf(plano: any): any {\r\n    return plano?.priorityFloor || plano;\r\n  }\r\n\r\n  private isFutureTaskDate(dateValue: string): boolean {\r\n    if (!dateValue) return false;\r\n    const taskDate = new Date(dateValue);\r\n    if (isNaN(taskDate.getTime())) return false;\r\n\r\n    const today = new Date();\r\n    today.setHours(0, 0, 0, 0);\r\n    taskDate.setHours(0, 0, 0, 0);\r\n\r\n    return taskDate.getTime() > today.getTime();\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe({\r\n        next: (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n\r\n          // Cards are frozen full-bucket totals (independent of search / filter /\r\n          // tab), so fetch them once per client change — not on every table reload.\r\n          this.getCards();\r\n\r\n          this.route.queryParamMap\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe((params) => {\r\n              this.searchTerm = getQueryParamString({\r\n                params,\r\n                key: \"search\",\r\n                fallback: \"\",\r\n              });\r\n              this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n              this.selectedFilterTab = getQueryParamString({\r\n                params,\r\n                key: \"tab\",\r\n                fallback: \"all\",\r\n              });\r\n              // VM card/tab removed — taskPending maps straight through.\r\n              this.appliedFilters.taskPending = this.selectedFilterTab;\r\n\r\n              this.limit = getQueryParamNumber({\r\n                params,\r\n                key: \"limit\",\r\n                fallback: 10,\r\n                min: 1,\r\n                max: 30,\r\n              });\r\n\r\n              this.offset = getQueryParamNumber({\r\n                params,\r\n                key: \"offset\",\r\n                fallback: 1,\r\n                min: 1,\r\n              });\r\n\r\n              this.getPlanoTableList();\r\n            });\r\n        },\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Manage Planogram\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  getPlanoTableList() {\r\n    this.planoSub?.unsubscribe(); // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.planogramsList = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      // export: false,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.planoSub = this.storeBuilderService\r\n      .getPlanoList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.totalItems = res?.data?.count;\r\n            this.planogramsList = res?.data?.data ?? [];\r\n            if (this.totalItems < 10) {\r\n              this.paginationSizes = [this.totalItems];\r\n            } else {\r\n              this.paginationSizes = [10, 20, 30];\r\n            }\r\n          }\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n\r\n    this.totalItems = this.planogramsList.length;\r\n  }\r\n\r\n  // Frozen verification cards (allStores / layoutComplete / fixturePending /\r\n  // zonePending), computed over the full active-store bucket independent of any UI\r\n  // filter. Fetched once per client change so search / filter / pagination never\r\n  // recompute them (also keeps the heavy card aggregation off the table requests).\r\n  getCards() {\r\n    this.isCardsLoading = true;\r\n    this.storeBuilderService\r\n      .getPlanoCards({ clientId: this.clientId })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.pendingDetails = res?.data || {};\r\n          }\r\n          this.isCardsLoading = false;\r\n        },\r\n        error: () => {\r\n          this.isCardsLoading = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(BulkUploadPlanogramComponent);\r\n  }\r\n\r\n  // onClickCreatePlanogram() {\r\n  //   const modelRef = this.ngbModal.open(CreatePlanogramComponent, {\r\n  //     size: \"md\",\r\n  //     windowClass: \"create-planogram-modal\",\r\n  //     centered: true,\r\n  //   });\r\n\r\n  //   modelRef.componentInstance.clientId = this.clientId;\r\n  //   modelRef.result.then((result) => {\r\n  //     if (result) {\r\n  //       this.router.navigate([\"/manage/planogram/manage-planogram\"], {\r\n  //         queryParams: { planoId: result?.planoId, floorId: result?.floorId },\r\n  //       });\r\n  //     }\r\n  //   });\r\n  // }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  filterTable(data: string) {\r\n    if (this.selectedFilterTab !== data) {\r\n      this.selectedFilterTab = data;\r\n      this.appliedFilters.taskPending = this.selectedFilterTab;\r\n      this.offset = 1;\r\n      this.limit = 10;\r\n      this.searchTerm = \"\";\r\n      this.updateQueryParams();\r\n    }\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    event.forEach((ele: any) => {\r\n      // if (ele.title == \"Planogram Status\") {\r\n      //   ele.title = \"status\";\r\n      // }\r\n      let key = ele.title.toLowerCase();\r\n      if(key === 'store category'){\r\n        this.appliedFilters['planoStrategy'] = ele.selected;\r\n      }else{\r\n        this.appliedFilters[ele.title.toLowerCase()] = ele.selected;\r\n      }\r\n    });\r\n    \r\n    // VM card/tab removed.\r\n    let task = this.selectedFilterTab;\r\n    if (this.appliedFilters[\"planogram status\"]?.length) {\r\n      this.appliedFilters[\"fixture\"].push(...this.appliedFilters[\"planogram status\"])\r\n      this.appliedFilters[\"fixture\"] = [...new Set(this.appliedFilters[\"fixture\"].map((ele:any) => ele))];\r\n\r\n    }\r\n    // this.appliedFilters[\"Status\"] = this.appliedFilters[\"Planogram Status\"];\r\n    delete this.appliedFilters[\"planogram status\"];\r\n    // const type = event[1].Issues.map((i: any) => i.id);\r\n    // const size = event[2].Issues.map((i: any) => i.id);\r\n\r\n    // this.isFilterApplied = status;\r\n    this.appliedFilters[\"taskPending\"] = task;\r\n    this.offset = 1;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  planoFloorDetails(data: any) {\r\n    if (data.layoutDetails.length > 1) {\r\n      let completeCount = data?.taskDetails?.completeLayout || 0;\r\n      return completeCount + \"/\" + data.layoutDetails.length;\r\n    } else {\r\n      return 1;\r\n    }\r\n  }\r\n\r\n  getTaskStatus(data: any, type: string) {\r\n    const statusMap: any = {\r\n      layout: data.taskDetails?.layoutStatus,\r\n      fixture: data.taskDetails?.fixtureStatus,\r\n      vm: data.taskDetails?.fixtureStatus,\r\n    };\r\n    if (type == \"vm\") {\r\n      type = \"fixture\";\r\n    }\r\n    const status = statusMap[type];\r\n   \r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type == type\r\n    );\r\n \r\n    if (type == \"fixture\") {\r\n      let taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n        (ele: any) => ele.status && ele.type == \"fixture\"\r\n      );\r\n      if (status === \"pending\" && taskInfo?.some((task:any) => task.status == 'submit')) return \"reviewPending\";\r\n      if (taskInfo?.length != data.layoutCount) {\r\n        return \"yetToAssign\";\r\n      }\r\n      if (taskInfo?.some((task: any) => this.isFutureTaskDate(task?.date))) {\r\n        return \"taskAssigned\";\r\n      }\r\n      if (taskInfo?.some((task: any) => [\"open\", \"inprogress\"].includes(task?.status))) {\r\n        return \"taskAssigned\";\r\n      }\r\n    }\r\n \r\n    if (\r\n      !taskDetails ||\r\n      (taskDetails.status == \"submit\" && status === \"disagree\")\r\n    )\r\n      return \"yetToAssign\";\r\n \r\n    if (taskDetails.status !== \"submit\") return \"taskAssigned\";\r\n \r\n    if (status === \"complete\") return \"completed\";\r\n  }\r\n \r\n  getTaskTooltip(data: any, type: string) {\r\n    const statusMap: any = {\r\n      layout: data.taskDetails?.layoutStatus,\r\n      fixture: data.taskDetails?.fixtureStatus,\r\n      vm: data.taskDetails?.fixtureStatus,\r\n    };\r\n    if (type == \"vm\") {\r\n      type = \"fixture\";\r\n    }\r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type == type\r\n    );\r\n \r\n    const status = statusMap[type];\r\n \r\n    if (type == \"fixture\") {\r\n      let taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n        (ele: any) => ele.status && ele.type == \"fixture\"\r\n      );\r\n      if (status === \"pending\" && taskInfo?.some((task:any) => task.status == 'submit')) return \"Review Pending\";\r\n      if (taskInfo?.length != data.layoutCount) {\r\n        return \"Yet to Assign\";\r\n      }\r\n      if (taskInfo?.some((task: any) => this.isFutureTaskDate(task?.date))) {\r\n        return \"Task Scheduled\";\r\n      }\r\n      if (taskInfo?.some((task: any) => [\"open\", \"inprogress\"].includes(task?.status))) {\r\n        return \"Task Assigned\";\r\n      }\r\n    }\r\n \r\n    if (\r\n      !taskDetails ||\r\n      (taskDetails.status == \"submit\" && status === \"disagree\")\r\n    )\r\n      return \"Yet to Assign\";\r\n \r\n    if (taskDetails.status !== \"submit\") return \"Task Assigned\";\r\n\r\n    if (status === \"complete\") return \"Completed\";\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] additive sibling helpers — do not touch getTaskStatus/getTaskTooltip\r\n  getZoneStatus(data: any) {\r\n    const zoneTaskList: any[] = data?.zoneTask?.[0]?.taskStatus ?? [];\r\n    const zoneTaskStatus = zoneTaskList.find(\r\n      (ele: any) => ele.type === \"zoneVerification\",\r\n    );\r\n    const zoneStatus = data?.zoneDetails?.zoneStatus;\r\n\r\n    if (!zoneTaskStatus) return \"yetToAssign\";\r\n\r\n    if (zoneTaskStatus.status !== \"submit\") {\r\n      return zoneTaskStatus.breach ? \"flag\" : \"taskAssigned\";\r\n    }\r\n\r\n    // Trust the rollup: if every floor's zone task has approvalStatus === true\r\n    // (set by updateZoneVerificationStatus when all non-CL siblings are actioned),\r\n    // the plano is fully approved — even if orphan compliance docs exist.\r\n    const allApproved =\r\n      zoneTaskList.length > 0 &&\r\n      zoneTaskList.every((t: any) => t.approvalStatus === true);\r\n    if (allApproved) return \"completed\";\r\n\r\n    if (zoneStatus === \"complete\") return \"completed\";\r\n    return \"reviewPending\";\r\n  }\r\n\r\n  getZoneTooltip(data: any) {\r\n    const status = this.getZoneStatus(data);\r\n    const map: any = {\r\n      yetToAssign: \"Yet to Assign\",\r\n      taskAssigned: \"Task Assigned\",\r\n      reviewPending: \"Review Pending\",\r\n      completed: \"Completed\",\r\n      flag: \"Flagged\",\r\n    };\r\n    return map[status] ?? \"\";\r\n  }\r\n\r\n  getProgressValue(data: any) {\r\n    const statusMap: any = {\r\n      layout: data.taskDetails?.layoutStatus,\r\n      fixture: data.taskDetails?.fixtureStatus,\r\n      vm: data.taskDetails?.fixtureStatus,\r\n    };\r\n    let taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type == \"fixture\"\r\n    );\r\n\r\n    if (taskDetails) {\r\n      if (\r\n        taskDetails.status == \"submit\" &&\r\n        statusMap[\"fixture\"] == \"complete\"\r\n      ) {\r\n        // taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n        //   (ele: any) => ele.type == \"fixture\"\r\n        // );\r\n        // if (\r\n        //   taskDetails &&\r\n        //   taskDetails?.status == \"submit\" &&\r\n        //   statusMap[\"fixture\"] == \"\"\r\n        // ) {\r\n        //   taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n        //     (ele: any) => ele.type == \"vm\"\r\n        //   );\r\n        //   if (\r\n        //     taskDetails &&\r\n        //     taskDetails?.status == \"submit\" &&\r\n        //     statusMap[\"vm\"] == \"\"\r\n        //   ) {\r\n        return 100;\r\n        //   } else {\r\n        //     return 75;\r\n        //   }\r\n        // } else {\r\n        //   return 50;\r\n        // }\r\n      }\r\n    }\r\n    if (data.taskDetails?.layoutStatus == \"complete\") return 50;\r\n\r\n    return 25;\r\n  }\r\n\r\n  showBreach(data: any, type: string) {\r\n    let taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type == type\r\n    );\r\n    if (taskDetails && taskDetails?.status != \"submit\" && taskDetails?.breach) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  getStatus(data: any) {\r\n    let taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele?.status != \"submit\"\r\n    );\r\n    if (\r\n      !taskDetails &&\r\n      data.taskDetails.fixtureStatus == \"complete\" &&\r\n      data.taskDetails.layoutStatus == \"complete\" &&\r\n      data.layoutStatus.includes(false)\r\n    ) {\r\n      return \"Ready to Publish\";\r\n    } else if (\r\n      !taskDetails &&\r\n      data.taskDetails.fixtureStatus == \"complete\" &&\r\n      data.taskDetails.layoutStatus == \"complete\" &&\r\n      !data.layoutStatus.includes(false)\r\n    ) {\r\n      return \"Published\";\r\n    } else {\r\n      let breach = this.showBreach(data, \"fixture\");\r\n\r\n      if(breach) {\r\n        return 'Yet to Assign';\r\n      }\r\n      return this.getTaskTooltip(data,'fixture');\r\n    }\r\n  }\r\n\r\n  getStatusBadge(data: any) {\r\n    let taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele?.status != \"submit\"\r\n    );\r\n    if (\r\n      !taskDetails &&\r\n      data.taskDetails.fixtureStatus == \"complete\" &&\r\n      data.taskDetails.layoutStatus == \"complete\" &&\r\n      data.layoutStatus.includes(false)\r\n    ) {\r\n      return \"primaryBadgeStyle\";\r\n    } else if (\r\n      !taskDetails &&\r\n      data.taskDetails.fixtureStatus == \"complete\" &&\r\n      data.taskDetails.layoutStatus == \"complete\" &&\r\n      !data.layoutStatus.includes(false)\r\n    ) {\r\n      return \"bg-success\";\r\n    } else {\r\n      let breach = this.showBreach(data, \"fixture\");\r\n      if (breach) {\r\n        return \"yetToAssign\";\r\n      }\r\n      return this.getTaskStatus(data, \"fixture\");\r\n    }\r\n  }\r\n\r\n  getSubmit(data: any) {\r\n    const statusMap: any = {\r\n      layout: data.taskDetails?.layoutStatus,\r\n      fixture: data.taskDetails?.fixtureStatus,\r\n      vm: data.taskDetails?.vmStatus,\r\n    };\r\n    let submitTask = data?.planoTask?.[0]?.taskStatus.find(\r\n      (ele: any) => ele.status == \"submit\" && statusMap[ele.type] == \"pending\"\r\n    );\r\n    if (submitTask) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        tab: this.selectedFilterTab,\r\n        search: this.searchTerm,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.planoSub?.unsubscribe();\r\n  }\r\n\r\n  redirectStore(storeId: any) {\r\n    let data: any = JSON.parse(localStorage.getItem(\"header-filters\") || \"\");\r\n    data.store = storeId;\r\n    localStorage.setItem(\"header-filters\", JSON.stringify(data));\r\n    this.router.navigateByUrl(`manage/stores/plano?storeId=${storeId}`);\r\n  }\r\n\r\n  updateFloor(data: any) {\r\n    let taskDetails = data?.planoTask?.[0]?.taskStatus?.filter(\r\n      (ele: any) => ele?.status == \"submit\" && ele.type == \"layout\"\r\n    );\r\n    return `${taskDetails?.length ?? 0}/${data?.layoutCount}`;\r\n  }\r\n\r\n  onExport() {\r\n    this.isButtonLoading = true;\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.totalItems,\r\n      offset: 1,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      export: true,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.storeBuilderService\r\n      .getPlanoListExport(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res) {\r\n            this.storeBuilderService.saveAsExcelFile(res, \"Verification List\");\r\n          }\r\n          this.isButtonLoading = false;\r\n        },\r\n        error: (err) => {\r\n          console.log(err, \"err\");\r\n          this.isButtonLoading = false;\r\n        },\r\n      });\r\n  }\r\n}\r\n","<div class=\"row mx-0 my-5 gap-2\">\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'all' }\" (click)=\"filterTable('all')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isCardsLoading\"></div>\r\n    <h3 *ngIf=\"!isCardsLoading\">{{ pendingDetails?.allStores || 0 }}</h3>\r\n    <p>Total stores</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'layout' }\" (click)=\"filterTable('layout')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isCardsLoading\"></div>\r\n    <h3 *ngIf=\"!isCardsLoading\">{{ pendingDetails?.layoutComplete ?? 0 }}</h3>\r\n    <p>Layout verification completed</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'fixture' }\" (click)=\"filterTable('fixture')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isCardsLoading\"></div>\r\n    <h3 *ngIf=\"!isCardsLoading\">{{ pendingDetails?.fixturePending ?? 0 }}</h3>\r\n    <p>Fixture verification pending</p>\r\n  </div>\r\n  <!-- [VM CARD REMOVED] VM verification card hidden — not needed for now.\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'vm' }\" (click)=\"filterTable('vm')\">\r\n    <h3>{{ pendingDetails?.fixturePending ?? 0 }}</h3>\r\n    <p>VM verification pending</p>\r\n  </div>\r\n  -->\r\n  <!-- [ZONE-VERIFICATION] additive — 5th stat card -->\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'zone' }\" (click)=\"filterTable('zone')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isCardsLoading\"></div>\r\n    <h3 *ngIf=\"!isCardsLoading\">{{ pendingDetails?.zonePending ?? 0 }}</h3>\r\n    <p>Zone verification pending</p>\r\n  </div>\r\n</div>\r\n\r\n<div class=\"content-wrapper\">\r\n  <div [class.restrict-interaction]=\"isButtonLoading\">\r\n    <!-- Manage Planogram view header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n      <div>\r\n        <h4>All Planograms</h4>\r\n        <span>{{ totalItems }} - Total Records</span>\r\n      </div>\r\n\r\n      <div class=\"d-flex align-items-center gap-3\">\r\n        <div style=\"position: relative\">\r\n          <input\r\n            type=\"text\"\r\n            [(ngModel)]=\"searchTerm\"\r\n            (change)=\"onSearch()\"\r\n            style=\"padding-left: 3rem; padding-right: 3rem\"\r\n            class=\"form-control\"\r\n            name=\"search\"\r\n            autocomplete=\"off\"\r\n            placeholder=\"Search\"\r\n          />\r\n\r\n          <span class=\"search-icon\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n              <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n              <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n            </svg>\r\n          </span>\r\n\r\n          <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n            <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <circle\r\n                  cx=\"12\"\r\n                  cy=\"12\"\r\n                  r=\"9\"\r\n                  stroke=\"#667085\"\r\n                  stroke-width=\"2\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                ></circle>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- <button type=\"button\" (click)=\"openBulkUploadModal()\" class=\"btn btn-outline text-nowrap\">\r\n          <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"currentColor\"\r\n              stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Bulk Upload\r\n        </button> -->\r\n\r\n        <!-- <button type=\"button\" class=\"btn btn-outline d-line-flex align-items-center text-nowrap\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\"\r\n              stroke=\"#344054\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Filter\r\n        </button> -->\r\n\r\n        <plano-filter [clientId]=\"clientId\" [data]=\"filterObject\" (applyFilters)=\"applyFilters($event)\"\r\n          (resetFilters)=\"applyFilters($event)\" [config]=\"{ 'Merchandise compliance': false }\"></plano-filter>\r\n\r\n        <button type=\"button\" (click)=\"onExport()\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n          [disabled]=\"!planogramsList.length\">\r\n        \r\n          <svg *ngIf=\"!isButtonLoading\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n            fill=\"none\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n          </svg>\r\n        \r\n          <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n            <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n          </svg>\r\n          <span class=\"ms-2\"> Export</span>\r\n        </button>\r\n\r\n        <!-- <button type=\"button\" (click)=\"onClickCreatePlanogram()\" class=\"btn btn-primary d-inline-flex align-items-center\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path\r\n              d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\"\r\n              stroke=\"white\"\r\n              stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          <span class=\"ms-2 text-white\">Create </span>\r\n        </button> -->\r\n\r\n        <!-- <lib-filters [dataObject]=\"filterObject\" (appliedFilters)=\"applyFilters($event)\"></lib-filters> -->\r\n      </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"isPageLoading\">\r\n      <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div\r\n      class=\"card-body d-flex justify-content-center align-items-center flex-column\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length === 0\"\r\n    >\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">No data found</div>\r\n      <div class=\"nodatasubtext\">There is no result for manage planogram table</div>\r\n    </div>\r\n\r\n    <!-- Manage Planogram list view -->\r\n    <section id=\"list-view\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n      <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n          <thead>\r\n            <tr>\r\n              <th>\r\n                <span (click)=\"onSortTable('storeName')\" class=\"cursor-pointer\">\r\n                  Store Name\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'storeName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutName')\" class=\"cursor-pointer\">\r\n                  Layout Name\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'layoutName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                Country\r\n              </th>\r\n              <th>\r\n                City\r\n              </th>\r\n              <th>\r\n                <span class=\"cursor-pointer d-flex align-items-center\">\r\n                  Plano Completion %\r\n                  <!-- <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'planoProgress' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'planoProgress' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i> -->\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"16\"\r\n                    height=\"16\"\r\n                    viewBox=\"0 0 16 16\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"% of overall planogram completion\"\r\n                    class=\"ms-2\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_844_17538)\">\r\n                      <path\r\n                        d=\"M8.00065 10.6663V7.99967M8.00065 5.33301H8.00732M14.6673 7.99967C14.6673 11.6816 11.6826 14.6663 8.00065 14.6663C4.31875 14.6663 1.33398 11.6816 1.33398 7.99967C1.33398 4.31778 4.31875 1.33301 8.00065 1.33301C11.6826 1.33301 14.6673 4.31778 14.6673 7.99967Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"1.5\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_17538\">\r\n                        <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutCount')\" class=\"cursor-pointer\">\r\n                  Layout\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'layoutCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('fixtureCount')\" class=\"cursor-pointer\">\r\n                  No of Fixtures\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'fixtureCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <!-- [VM COLUMN HIDDEN] \"No of VMs\" column commented out for now.\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('vmCount')\" class=\"cursor-pointer\">\r\n                  No of VMs\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'vmCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'vmCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              -->\r\n              <!-- [ZONE-VERIFICATION] additive — Zone status header -->\r\n              <th class=\"text-center\">\r\n                <span>Zone</span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <ng-template #tooltip>\r\n                  <div class=\"w-100\">\r\n                    <h6>Total store capacity</h6>\r\n                    <span> Combining product capacity of all fixtures </span>\r\n                  </div>\r\n                </ng-template>\r\n                <span (click)=\"onSortTable('fixtureCapacity')\" class=\"cursor-pointer d-flex align-items-center\">\r\n                  Store Capacity\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'fixtureCapacity' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCapacity' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"16\"\r\n                    height=\"16\"\r\n                    viewBox=\"0 0 16 16\"\r\n                    fill=\"none\"\r\n                    [ngbTooltip]=\"tooltip\"\r\n                    class=\"ms-2\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_844_17538)\">\r\n                      <path\r\n                        d=\"M8.00065 10.6663V7.99967M8.00065 5.33301H8.00732M14.6673 7.99967C14.6673 11.6816 11.6826 14.6663 8.00065 14.6663C4.31875 14.6663 1.33398 11.6816 1.33398 7.99967C1.33398 4.31778 4.31875 1.33301 8.00065 1.33301C11.6826 1.33301 14.6673 4.31778 14.6673 7.99967Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"1.5\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_17538\">\r\n                        <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('lastUpdate')\" class=\"cursor-pointer\">\r\n                  Last update\r\n                  <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'lastUpdate' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'lastUpdate' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span class=\"cursor-pointer\">\r\n                  Planogram Status\r\n                  <!-- <i\r\n                    class=\"fa ms-1 mt-1\"\r\n                    [ngStyle]=\"{ color: sortedColumn === 'planogramStatus' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'planogramStatus' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"\r\n                  ></i> -->\r\n                </span>\r\n              </th>\r\n              <th></th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let plano of planogramsList\">\r\n              <td>\r\n                <div class=\"d-flex align-items-center\">\r\n                  <a (click)=\"redirectStore(plano.storeId)\" class=\"cursor-pointer text-decoration-underline\">\r\n                    {{ plano.storeName }}</a\r\n                  >\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <a\r\n                  [routerLink]=\"['/manage/planogram/manage-planogram']\"\r\n                  [queryParams]=\"{ planoId: plano._id, floorId: plano?.priorityFloorId }\"\r\n                  class=\"text-decoration-underline\"\r\n                >\r\n                  {{\r\n                    plano.layoutName\r\n                  }}\r\n                </a>\r\n              </td>\r\n              <td>\r\n                {{plano?.country}}\r\n              </td>\r\n              <td>\r\n                {{plano?.city}}\r\n              </td>\r\n              <td>\r\n                <div class=\"row align-items-center\">\r\n                  <div class=\"col-9\">\r\n                    <div class=\"progress\" style=\"height: 4px\">\r\n                      <div\r\n                        class=\"progress-bar\"\r\n                        [ngClass]=\"\r\n                          [25, 50].includes(getProgressValue(pf(plano)))\r\n                            ? 'bg-warning'\r\n                            : 'bg-success'\r\n                        \"\r\n                        role=\"progressbar\"\r\n                        [style]=\"getProgressValue(pf(plano)) ? 'width: ' + getProgressValue(pf(plano)) + '%' : 'width:25%'\"\r\n                        [attr.aria-valuenow]=\"getProgressValue(pf(plano))\"\r\n                        aria-valuemin=\"0\"\r\n                        aria-valuemax=\"100\"\r\n                      ></div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"col-3\">{{ getProgressValue(pf(plano)) }}%</div>\r\n                </div>\r\n                <!-- <div class=\"row align-items-center\">\r\n                  <div class=\"col-8 progress\" style=\"height: 4px; border-radius: 4px;\">\r\n                    <div\r\n                      class=\"progress-bar\"\r\n                      role=\"progressbar\"\r\n                      style=\"width: 25%\"\r\n                      aria-valuenow=\"25\"\r\n                      aria-valuemin=\"0\"\r\n                      aria-valuemax=\"100\"\r\n                    ></div>\r\n                  </div>\r\n                  <div class=\"col-4\">\r\n                    {{ plano.planoCompletion }}\r\n                  </div>\r\n                </div> -->\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano?.layoutCount === 1 ? 1 : updateFloor(plano) }}\r\n                  </span>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"showBreach(pf(plano), 'layout')\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getTaskStatus(pf(plano), 'layout') || 'taskAssigned'\"\r\n                    *ngIf=\"!showBreach(pf(plano), 'layout')\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getTaskTooltip(pf(plano), 'layout') || 'Task Assigned' }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano.fixtureCount }}\r\n                  </span>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"showBreach(pf(plano), 'fixture')\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getTaskStatus(pf(plano), 'fixture') || 'taskAssigned'\"\r\n                    *ngIf=\"!showBreach(pf(plano), 'fixture')\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getTaskTooltip(pf(plano), 'fixture') || 'Task Assigned' }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <!-- [VM COLUMN HIDDEN] \"No of VMs\" cell commented out for now.\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano.vmCount }}\r\n                  </span>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"showBreach(pf(plano), 'fixture')\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getTaskStatus(pf(plano), 'vm') || 'taskAssigned'\"\r\n                    *ngIf=\"!showBreach(pf(plano), 'fixture')\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getTaskTooltip(pf(plano), 'vm') || 'Task Assigned' }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <!-- [ZONE-VERIFICATION] additive — Zone status cell -->\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"14\"\r\n                    height=\"14\"\r\n                    viewBox=\"0 0 14 14\"\r\n                    fill=\"none\"\r\n                    ngbTooltip=\"Didn’t respond within the due date\"\r\n                    *ngIf=\"getZoneStatus(pf(plano)) === 'flag'\"\r\n                  >\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33463 9.33398 9.33463C11.084 9.33463 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513Z\"\r\n                      fill=\"#FECDCA\"\r\n                    />\r\n                    <path\r\n                      d=\"M2.33398 8.7513C2.33398 8.7513 2.91732 8.16797 4.66732 8.16797C6.41732 8.16797 7.58398 9.33464 9.33398 9.33464C11.084 9.33464 11.6673 8.7513 11.6673 8.7513V1.7513C11.6673 1.7513 11.084 2.33464 9.33398 2.33464C7.58398 2.33464 6.41732 1.16797 4.66732 1.16797C2.91732 1.16797 2.33398 1.7513 2.33398 1.7513V8.7513ZM2.33398 8.7513V12.8346\"\r\n                      stroke=\"#D92D20\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                  <div\r\n                    class=\"indicator short\"\r\n                    [ngClass]=\"getZoneStatus(pf(plano))\"\r\n                    *ngIf=\"getZoneStatus(pf(plano)) !== 'flag'\"\r\n                  >\r\n                    <svg\r\n                      width=\"8\"\r\n                      height=\"7\"\r\n                      viewBox=\"0 0 8 7\"\r\n                      fill=\"none\"\r\n                      xmlns=\"http://www.w3.org/2000/svg\"\r\n                      ngbTooltip=\"{{ getZoneTooltip(pf(plano)) }}\"\r\n                    >\r\n                      <path\r\n                        fill-rule=\"evenodd\"\r\n                        clip-rule=\"evenodd\"\r\n                        d=\"M6.97284 0.310967L2.79617 4.3418L1.68784 3.15763C1.48367 2.96513 1.16284 2.95347 0.929505 3.1168C0.702005 3.28597 0.637838 3.58347 0.777838 3.82263L2.09034 5.95763C2.21867 6.15597 2.44034 6.27847 2.69117 6.27847C2.93034 6.27847 3.15784 6.15597 3.28617 5.95763C3.49617 5.68347 7.50367 0.905967 7.50367 0.905967C8.02867 0.3693 7.39284 -0.1032 6.97284 0.305134V0.310967Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </svg>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano?.fixtureCapacity ?? 0 }}\r\n                  </span>\r\n                </div>\r\n              </td>\r\n              <td class=\"text-center\">\r\n                <span [ngbTooltip]=\"plano?.lastUpdate | date : 'medium'\">\r\n                  {{ plano?.lastUpdate | date }}\r\n                </span>\r\n              </td>\r\n              <td class=\"text-center\">\r\n                <div class=\"badge\" [ngClass]=\"getStatusBadge(pf(plano))\">\r\n                  {{ getStatus(pf(plano)) }}\r\n                </div>\r\n              </td>\r\n              <!-- <td>\r\n                <div class=\"d-flex align-items-center gap-2 justify-content-center\">\r\n                  <svg width=\"21\" height=\"22\" viewBox=\"0 0 21 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <g clip-path=\"url(#clip0_17_71425)\">\r\n                      <path\r\n                        d=\"M12.1971 18.7144C12.0464 18.9742 11.8302 19.1898 11.5699 19.3397C11.3097 19.4896 11.0146 19.5685 10.7143 19.5685C10.414 19.5685 10.1189 19.4896 9.85866 19.3397C9.59842 19.1898 9.38212 18.9742 9.23143 18.7144M15.8571 7.57157C15.8571 6.2076 15.3153 4.89949 14.3508 3.93502C13.3864 2.97055 12.0783 2.42871 10.7143 2.42871C9.35032 2.42871 8.04221 2.97055 7.07774 3.93502C6.11326 4.89949 5.57143 6.2076 5.57143 7.57157C5.57143 13.5716 3 15.2859 3 15.2859H18.4286C18.4286 15.2859 15.8571 13.5716 15.8571 7.57157Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                      <path\r\n                        d=\"M2.08574 8.04805C1.55611 8.04805 1.12146 7.61768 1.17082 7.09036C1.286 5.85989 1.627 4.71322 2.19383 3.65034C2.75229 2.60318 3.46062 1.69605 4.31882 0.928939C4.71052 0.578823 5.30965 0.673501 5.62062 1.09695C5.93175 1.52062 5.83525 2.1121 5.45225 2.47212C4.82875 3.05819 4.30987 3.74239 3.89559 4.52471C3.47303 5.32267 3.20776 6.17833 3.0998 7.09169C3.03766 7.61747 2.61518 8.04805 2.08574 8.04805ZM19.3431 8.04805C18.8134 8.04805 18.3908 7.6171 18.3287 7.09105C18.2209 6.17793 17.9556 5.32248 17.5326 4.52471C17.118 3.74258 16.5993 3.05852 15.9765 2.47254C15.5937 2.11226 15.4973 1.5207 15.8085 1.09696C16.1196 0.673433 16.7187 0.578551 17.1107 0.928571C17.9693 1.6954 18.6778 2.60266 19.2363 3.65034C19.8032 4.71381 20.1438 5.86068 20.2581 7.09095C20.3071 7.61809 19.8725 8.04805 19.3431 8.04805Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_17_71425\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.428711 0.714355)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n\r\n                  <svg width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <g clip-path=\"url(#clip0_139_112685)\">\r\n                      <path\r\n                        d=\"M12.4843 21.4302C12.3336 21.69 12.1173 21.9057 11.857 22.0556C11.5968 22.2055 11.3017 22.2844 11.0014 22.2844C10.7011 22.2844 10.406 22.2055 10.1458 22.0556C9.88553 21.9057 9.66923 21.69 9.51854 21.4302M16.1443 10.2874C16.1443 8.92342 15.6024 7.61531 14.6379 6.65084C13.6735 5.68637 12.3654 5.14453 11.0014 5.14453C9.63742 5.14453 8.32932 5.68637 7.36485 6.65084C6.40037 7.61531 5.85854 8.92342 5.85854 10.2874C5.85854 16.2874 3.28711 18.0017 3.28711 18.0017H18.7157C18.7157 18.0017 16.1443 16.2874 16.1443 10.2874Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                      <path\r\n                        d=\"M2.37187 10.7634C1.84224 10.7634 1.40759 10.333 1.45695 9.80569C1.57213 8.57522 1.91313 7.42855 2.47997 6.36567C3.03842 5.31851 3.74675 4.41138 4.60496 3.64427C4.99665 3.29415 5.59578 3.38883 5.90675 3.81228C6.21788 4.23595 6.12138 4.82744 5.73838 5.18745C5.11489 5.77352 4.596 6.45772 4.18172 7.24004C3.75916 8.038 3.4939 8.89366 3.38594 9.80702C3.32379 10.3328 2.90131 10.7634 2.37187 10.7634ZM19.6292 10.7634C19.0995 10.7634 18.6769 10.3324 18.6148 9.80638C18.507 8.89326 18.2417 8.03781 17.8188 7.24004C17.4041 6.45791 16.8854 5.77385 16.2627 5.18787C15.8798 4.8276 15.7835 4.23603 16.0947 3.81229C16.4057 3.38876 17.0049 3.29388 17.3968 3.6439C18.2554 4.41073 18.964 5.31799 19.5224 6.36567C20.0893 7.42914 20.4299 8.57601 20.5442 9.80628C20.5932 10.3334 20.1586 10.7634 19.6292 10.7634Z\"\r\n                        fill=\"#667085\"\r\n                      />\r\n                    </g>\r\n                    <path\r\n                      d=\"M17 1C19.7614 1 22 3.23858 22 6C22 8.76142 19.7614 11 17 11C14.2386 11 12 8.76142 12 6C12 3.23858 14.2386 1 17 1Z\"\r\n                      fill=\"#FF0000\"\r\n                      stroke=\"white\"\r\n                      stroke-width=\"2\"\r\n                    />\r\n                    <defs>\r\n                      <clipPath id=\"clip0_139_112685\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.714844 3.42969)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n\r\n                  <div class=\"dropdown\">\r\n                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                          d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                        <path\r\n                          d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n                          stroke=\"#667085\"\r\n                          stroke-width=\"2\"\r\n                          stroke-linecap=\"round\"\r\n                          stroke-linejoin=\"round\"\r\n                        />\r\n                      </svg>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu\">\r\n                      <li><a class=\"dropdown-item cursor-pointer\">Edit</a></li>\r\n                      <li><a class=\"dropdown-item cursor-pointer\">Duplicate</a></li>\r\n                      <li><a class=\"dropdown-item cursor-pointer text-danger\">Delete</a></li>\r\n                    </ul>\r\n                  </div>\r\n                </div>\r\n              </td> -->\r\n              <td>\r\n                <a\r\n                  [routerLink]=\"['/manage/planogram/manage-planogram']\"\r\n                  [queryParams]=\"{ planoId: plano._id, floorId: plano?.priorityFloorId }\"\r\n                >\r\n                  <svg\r\n                    width=\"23\"\r\n                    height=\"24\"\r\n                    viewBox=\"0 0 23 24\"\r\n                    fill=\"none\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    *ngIf=\"getSubmit(pf(plano))\"\r\n                  >\r\n                    <path\r\n                      d=\"M10.1395 6.85728H4.13946C3.6848 6.85728 3.24876 7.0379 2.92727 7.35939C2.60578 7.68088 2.42517 8.11691 2.42517 8.57157V20.5716C2.42517 21.0262 2.60578 21.4623 2.92727 21.7838C3.24876 22.1052 3.6848 22.2859 4.13946 22.2859H16.1395C16.5941 22.2859 17.0301 22.1052 17.3516 21.7838C17.6731 21.4623 17.8537 21.0262 17.8537 20.5716V14.5716M16.568 5.57157C16.909 5.23058 17.3715 5.03901 17.8537 5.03901C18.336 5.03901 18.7985 5.23058 19.1395 5.57157C19.4805 5.91256 19.672 6.37505 19.672 6.85728C19.672 7.33952 19.4805 7.80201 19.1395 8.143L10.9966 16.2859L7.56803 17.143L8.42517 13.7144L16.568 5.57157Z\"\r\n                      stroke=\"#667085\"\r\n                      stroke-width=\"2\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                    <path\r\n                      d=\"M17 1C19.7614 1 22 3.23858 22 6C22 8.76142 19.7614 11 17 11C14.2386 11 12 8.76142 12 6C12 3.23858 14.2386 1 17 1Z\"\r\n                      fill=\"#FF0000\"\r\n                      stroke=\"white\"\r\n                      stroke-width=\"2\"\r\n                    />\r\n                  </svg>\r\n                  <svg\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"21\"\r\n                    height=\"22\"\r\n                    viewBox=\"0 0 21 22\"\r\n                    fill=\"none\"\r\n                    *ngIf=\"!getSubmit(pf(plano))\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_844_18318)\">\r\n                      <path\r\n                        d=\"M9.85686 4.14249H3.85686C3.40221 4.14249 2.96617 4.32311 2.64468 4.6446C2.32319 4.96609 2.14258 5.40212 2.14258 5.85678V17.8568C2.14258 18.3114 2.32319 18.7475 2.64468 19.069C2.96617 19.3905 3.40221 19.5711 3.85686 19.5711H15.8569C16.3115 19.5711 16.7476 19.3905 17.069 19.069C17.3905 18.7475 17.5712 18.3114 17.5712 17.8568V11.8568M16.2854 2.85678C16.6264 2.51579 17.0889 2.32422 17.5712 2.32422C18.0534 2.32422 18.5159 2.51579 18.8569 2.85678C19.1979 3.19777 19.3894 3.66026 19.3894 4.14249C19.3894 4.62473 19.1979 5.08722 18.8569 5.42821L10.714 13.5711L7.28544 14.4282L8.14258 10.9996L16.2854 2.85678Z\"\r\n                        stroke=\"#667085\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_18318\">\r\n                        <rect width=\"20.5714\" height=\"20.5714\" fill=\"white\" transform=\"translate(0.427734 0.713867)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </a>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </section>\r\n\r\n    <!-- Manage Planogram grid view -->\r\n    <!-- <ng-template #gridView>\r\n      <section id=\"grid-view\">\r\n        <div class=\"row gx-6 gy-4\">\r\n          <div class=\"col-md-4\" *ngFor=\"let fixture of fixtureTemplatesList\">\r\n            <div class=\"card\">\r\n              <div class=\"card-img\">\r\n                <div class=\"card-action dropdown\">\r\n                  <button class=\"btn btn-light px-4 py-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                    <i class=\"bi bi-three-dots-vertical\"></i>\r\n                  </button>\r\n                  <ul class=\"dropdown-menu\">\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Edit</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Duplicate</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer text-danger\">Delete</a></li>\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between align-items-center\">\r\n                <h3>{{ fixture.name }}</h3>\r\n                <div class=\"badge\" [ngClass]=\"fixture.status\">{{ fixture.status | titlecase }}</div>\r\n              </div>\r\n              <div class=\"d-flex gap-2\">\r\n                <div *ngFor=\"let subBrand of fixture.subBrand; let i = index\">\r\n                  <span *ngIf=\"i != 0\" class=\"me-2 card-tagline\">&#8226;</span>\r\n                  <div class=\"badge\">{{ subBrand }}</div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </section>\r\n    </ng-template> -->\r\n\r\n    <!-- Pagination -->\r\n    <lib-pagination\r\n      [itemsPerPage]=\"limit\"\r\n      [currentPage]=\"offset\"\r\n      [totalItems]=\"totalItems\"\r\n      [paginationSizes]=\"paginationSizes\"\r\n      [pageSize]=\"paginationSize()\"\r\n      (pageChange)=\"onPageChange($event)\"\r\n      (pageSizeChange)=\"onPageSizeChange($event)\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length !== 0\"\r\n    >\r\n    </lib-pagination>\r\n  </div>\r\n</div>\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n  selector: \"lib-manage-plano\",\r\n  templateUrl: \"./manage-plano.component.html\",\r\n  styleUrl: \"./manage-plano.component.scss\",\r\n})\r\nexport class ManagePlanoComponent {\r\n  constructor() {\r\n  }\r\n}\r\n","<div class=\"d-flex justify-content-end gap-4\">\r\n  <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 300px; margin: 0\">\r\n    <li class=\"nav-item flex-fill\">\r\n      <button class=\"nav-link w-100 h-100\" routerLink=\"/manage/planogram/manage-planograms/onboard\"\r\n        routerLinkActive=\"active\" #onboardLink=\"routerLinkActive\"\r\n        [attr.aria-current]=\"onboardLink.isActive ? 'page' : null\">\r\n        Onboard\r\n      </button>\r\n    </li>\r\n    <li class=\"nav-item flex-fill\" style=\"border-right: 1px solid #d0d5dd; border-left: 1px solid #d0d5dd\">\r\n      <button class=\"nav-link w-100 h-100\" routerLink=\"/manage/planogram/manage-planograms/verification\"\r\n        routerLinkActive=\"active\" #verificationLink=\"routerLinkActive\"\r\n        [attr.aria-current]=\"verificationLink.isActive ? 'page' : null\">\r\n        Verification\r\n      </button>\r\n    </li>\r\n    <li class=\"nav-item flex-fill\">\r\n      <button class=\"nav-link w-100 h-100\" routerLink=\"/manage/planogram/manage-planograms/rollout\"\r\n        routerLinkActive=\"active\" #rolloutLink=\"routerLinkActive\"\r\n        [attr.aria-current]=\"rolloutLink.isActive ? 'page' : null\">\r\n        Rollout\r\n      </button>\r\n    </li>\r\n  </ul>\r\n</div>\r\n\r\n<router-outlet></router-outlet>","import { Component, Input, OnInit} from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-publish-rollout-popup',\r\n  templateUrl: './publish-rollout-popup.component.html',\r\n  styleUrl: './publish-rollout-popup.component.scss'\r\n})\r\nexport class PublishRolloutPopupComponent implements OnInit {\r\n  @Input() type: any;\r\n  @Input() inputData: any;\r\n  @Input() taskStyle = {\r\n    fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n  };\r\n  hideTask:boolean = true;\r\n\r\n  taskType: any\r\n  comments: any = '';\r\n\r\n  constructor(private activeModal: NgbActiveModal) { }\r\n\r\n  ngOnInit(): void {\r\n    this.taskType = this.type;\r\n    if (this.type === 'vm-redo') {\r\n      this.taskType = \"vm\";\r\n      this.hideTask = false;\r\n    }\r\n    if (this.type === 'merch-redo') {\r\n      this.taskType = \"merch\";\r\n      this.hideTask = false;\r\n    }\r\n    if (this.type === 'layout-redo') {\r\n      this.taskType = \"layout\"\r\n    }\r\n    if (this.inputData.redo) {\r\n      if (this.taskType === \"merch\") {\r\n        this.taskStyle.fixture.name = \"Redo\";\r\n        this.taskStyle.fixture.class = \"taskAssigned\";\r\n      } else {\r\n        this.taskStyle.vm.name = \"Redo\";\r\n        this.taskStyle.vm.class = \"taskAssigned\";\r\n      }\r\n    }\r\n  }\r\n\r\n  cancel() {\r\n    this.activeModal.close('close');\r\n  }\r\n\r\n  onSubmit() {\r\n    let payload = { type: this.type, comments: this.comments, status: 'submit',hideTask:this.hideTask }\r\n    this.activeModal.close(payload);\r\n  }\r\n}\r\n","<div class=\"modal show d-block\" tabindex=\"-1\">\r\n  <div class=\"modal-dialog modal-dialog-centered\">\r\n    <div class=\"modal-content rounded-3 shadow\">\r\n      <div>\r\n        <div class=\"modal-header border-0 pb-0\" *ngIf=\"!inputData?.revoke\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n            <path d=\"M38 18L27 29M38 18L31 38L27 29M38 18L18 25L27 29\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>\r\n        </div>\r\n        <ng-container *ngIf=\"!inputData?.revoke\">\r\n          <div class=\"modal-header border-0\" *ngIf=\"!inputData.redo\">\r\n            <h5 class=\"modal-title fw-semibold\">Publish {{ taskType }} task</h5>\r\n          </div>\r\n          <div class=\"modal-header border-0\" *ngIf=\"inputData.redo\">\r\n            <h5 class=\"modal-title fw-semibold\">Re-Publish {{ taskType }} task</h5>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <div class=\"modal-header border-0\" *ngIf=\"inputData?.revoke\">\r\n          <h5 class=\"modal-title fw-semibold\">Revoke task</h5>\r\n        </div>\r\n\r\n        <div class=\"modal-body pt-0\">\r\n          <div *ngIf=\"inputData?.revoke\" class=\"warning-msg mb-5\">\r\n            <svg\r\n              style=\"height: 32px; width: 32px\"\r\n              class=\"me-4\"\r\n              xmlns=\"http://www.w3.org/2000/svg\"\r\n              width=\"16\"\r\n              height=\"16\"\r\n              viewBox=\"0 0 16 16\"\r\n              fill=\"none\"\r\n            >\r\n              <g clip-path=\"url(#clip0_847_10915)\">\r\n                <path\r\n                  d=\"M8.00004 5.33203V7.9987M8.00004 10.6654H8.00671M14.6667 7.9987C14.6667 11.6806 11.6819 14.6654 8.00004 14.6654C4.31814 14.6654 1.33337 11.6806 1.33337 7.9987C1.33337 4.3168 4.31814 1.33203 8.00004 1.33203C11.6819 1.33203 14.6667 4.3168 14.6667 7.9987Z\"\r\n                  stroke=\"#D92D20\"\r\n                  stroke-width=\"1.33333\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_847_10915\">\r\n                  <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n            <span>You are revoking the assigned task. This will put the task on hold, and the store team will receive a notification.</span>\r\n          </div>\r\n          <p *ngIf=\"!inputData?.revoke\" class=\"mb-3\">\r\n            You are about to <span *ngIf=\"inputData.redo\">re-</span>assign a {{ taskType }} rollout task to the store. Please\r\n            ensure all necessary updates are completed before publishing.\r\n          </p>\r\n          <div class=\"rollout-card mb-5\">\r\n            <div class=\"top\">\r\n              <ng-container *ngIf=\"taskType === 'merch'\">\r\n                <h3>{{ inputData.rolloutCount }}</h3>\r\n                <span>Fixture merchandise rollout</span>\r\n              </ng-container>\r\n              <ng-container *ngIf=\"taskType === 'vm'\">\r\n                <h3>{{ inputData.rolloutCount }}</h3>\r\n                <span>Visual merchandise rollout</span>\r\n              </ng-container>\r\n            </div>\r\n            <div *ngIf=\"taskType === 'merch'\" class=\"bottom\">\r\n              <div class=\"indicator mt-2 mx-2 taskAssigned\" *ngIf=\"inputData?.revoke && inputData.redo\">\r\n                Task Assigned\r\n              </div>\r\n              <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n                <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <g clip-path=\"url(#clip0_4984_27569)\">\r\n                      <path\r\n                        d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                        stroke=\"#7A5AF8\"\r\n                        stroke-width=\"1.5\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_4984_27569\">\r\n                        <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n                <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path\r\n                      d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                      stroke=\"#B42318\"\r\n                      stroke-width=\"1.5\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                </span>\r\n                {{ taskStyle.fixture.name }}\r\n              </div>\r\n            </div>\r\n\r\n            <div *ngIf=\"taskType === 'vm'\" class=\"bottom\">\r\n              <div class=\"indicator mt-2 mx-2 taskAssigned\" *ngIf=\"inputData?.revoke && inputData.redo\">\r\n                Task Assigned\r\n              </div>\r\n              <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.vm.class\">\r\n                <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <g clip-path=\"url(#clip0_4984_27569)\">\r\n                      <path\r\n                        d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                        stroke=\"#7A5AF8\"\r\n                        stroke-width=\"1.5\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_4984_27569\">\r\n                        <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n                <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path\r\n                      d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                      stroke=\"#B42318\"\r\n                      stroke-width=\"1.5\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                </span>\r\n                {{ taskStyle.vm.name }}\r\n              </div>\r\n            </div>\r\n          </div>\r\n          <ng-container *ngIf=\"!inputData?.revoke\">\r\n            <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n            <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n          </ng-container>\r\n          <div class=\"d-flex mt-5\" *ngIf=\"!inputData?.revoke && !inputData.redo\">\r\n              <div>\r\n                <input class=\"form-check-input w-15px h-15px mt-1 rounded-5\" type=\"checkbox\" id=\"publish\" [(ngModel)]=\"hideTask\">\r\n              </div>\r\n              <div class=\"ms-3\">\r\n                <div class=\"checkLabeltext\">\r\n                  Do not assign task\r\n                </div>\r\n                <div class=\"checkLabelSubText\">\r\n                  Publishes changes to the store without creating a task.\r\n                </div>\r\n              </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"modal-footer border-0\">\r\n        <button type=\"button\" class=\"btn btn-outline\" (click)=\"cancel()\">Cancel</button>\r\n        <ng-container *ngIf=\"!inputData?.revoke\">\r\n          <button *ngIf=\"!inputData.redo\" type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\">Publish</button>\r\n          <button *ngIf=\"inputData.redo\" type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\">Re-Publish</button>\r\n        </ng-container>\r\n\r\n        <button *ngIf=\"inputData?.revoke\" (click)=\"onSubmit()\" class=\"btn btn-red d-flex\">\r\n          <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <g clip-path=\"url(#clip0_640_5594)\">\r\n              <path\r\n                d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                stroke=\"#B42318\"\r\n                stroke-width=\"1.67\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_640_5594\">\r\n                <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n          Revoke\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\n\r\n@Component({\r\n  selector: 'app-confirmation-popup',\r\n  templateUrl: './confirmation-popup.component.html',\r\n  styleUrl: './confirmation-popup.component.scss'\r\n})\r\nexport class ConfirmationPopupComponent {\r\n\r\n  constructor(private apiService: StoreBuilderService, private activeModal: NgbActiveModal,) {\r\n\r\n  }\r\n\r\n  @Input() type: any;\r\n  @Input() inputData: any;\r\n\r\n\r\n  comments: any = ''\r\n\r\n  cancel() {\r\n    this.activeModal.close('close');\r\n  }\r\n  onApprove() {\r\n    let payload = {\r\n      ...this.inputData, ...{ type: this.type, comments: this.comments, status: 'submit' }\r\n    }\r\n\r\n  }\r\n  onSubmit() {\r\n    this.type = this.type == \"redo\" ? \"disagree\" : this.type == \"closeIssue\" ? 'agree' : this.type;\r\n    let payload = {\r\n      ...this.inputData, ...{ type: this.type, comments: this.comments, status: 'submit' }\r\n    }\r\n    if (payload.taskType === 'layout' && payload.issueType === 'others') {\r\n      this.apiService.updateFixtureStatus(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code === 200) {\r\n            this.activeModal.close(payload);\r\n          }\r\n        }\r\n      })\r\n    } \r\n    // else if (payload.issueId===''&&payload.answerId==='') {\r\n    //   this.apiService.updateApprovalStatus(payload).subscribe({\r\n    //     next: (res: any) => {\r\n    //       if (res && res.code === 200) {\r\n    //         this.activeModal.close({status:'submit', reload: true,});\r\n    //       }\r\n    //     }\r\n    //   })\r\n    // } \r\n    else {\r\n      this.activeModal.close(payload);\r\n    }\r\n  }\r\n\r\n  edit() {\r\n    this.activeModal.close(\"edit\");\r\n  }\r\n}\r\n","<div class=\"modal show d-block\" tabindex=\"-1\" >\r\n  <div class=\"modal-dialog modal-dialog-centered\">\r\n    <div class=\"modal-content rounded-3 shadow\" >\r\n        <div *ngIf=\"type==='agree'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Agree store response</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n                You are about to accept the store's feedback. This will update the selected component based on their response.\r\n                Do you want to continue?\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\"  [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"type==='disagree'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Disagree store response</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n               You're about to disagree with the store's feedback. The current component will stay unchanged.\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"type==='redo'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Marking as redo</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n               You are about to redo the task to the store. Please compose a message addressing the respective issue.\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"type==='closeIssue'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Close issue</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">You're about to close the issue. Please ensure it has been properly addressed.              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"type==='approve'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Approve store response</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n                You're approving the store's response. Please make sure the store is fully updated and follows the planogram.\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\"  [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"type==='disapprove'\">\r\n            <div class=\"modal-header border-0\">\r\n              <h5 class=\"modal-title fw-semibold\">Disapprove store response</h5>\r\n            </div>\r\n            <div class=\"modal-body pt-0\">\r\n              <p class=\"mb-3\">\r\n              You're about to disapprove the store's response. This will reset all rollouts, and you may need to reassign them. Are you sure you want to proceed?\r\n              </p>\r\n              <label class=\"form-label fw-medium\">Leave a comment for the store</label>\r\n              <textarea class=\"form-control\" [(ngModel)]=\"comments\" rows=\"3\" placeholder=\"Enter your comment...\"></textarea>\r\n            </div>\r\n        </div>\r\n      <div class=\"modal-footer border-0\">\r\n        <button type=\"button\" class=\"btn btn-secondary margin-right-auto\" (click)=\"edit()\" *ngIf=\"type==='agree'\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 22 23\" fill=\"none\" class=\"me-3\">\r\n            <path d=\"M16 2.5003C16.2626 2.23766 16.5744 2.02932 16.9176 1.88718C17.2608 1.74503 17.6286 1.67188 18 1.67188C18.3714 1.67187 18.7392 1.74503 19.0824 1.88718C19.4256 2.02932 19.7374 2.23766 20 2.5003C20.2626 2.76295 20.471 3.07475 20.6131 3.41791C20.7553 3.76107 20.8284 4.12887 20.8284 4.5003C20.8284 4.87174 20.7553 5.23953 20.6131 5.58269C20.471 5.92585 20.2626 6.23766 20 6.5003L6.5 20.0003L1 21.5003L2.5 16.0003L16 2.5003Z\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>\r\n          Edit\r\n        </button>\r\n        <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"cancel()\" >Cancel</button>\r\n        <button type=\"button\" *ngIf=\"['agree', 'disagree', 'redo', 'closeIssue'].includes(type)\" class=\"btn btn-primary\" (click)=\"onSubmit()\">{{type==='agree' ? 'Yes, agree' : type === 'disagree' ? 'retain existing' : type ==='redo' ? 'Mark as redo' : 'Close issue'}}</button>\r\n        <button *ngIf=\"type==='approve'\" type=\"button\" class=\"btn btn-primary\" (click)=\"onApprove()\">Approve</button>\r\n        <button *ngIf=\"type==='disapprove'\" type=\"button\" class=\"btn btn-danger\" (click)=\"onApprove()\">Disapprove, Edit</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>","import { Component, Input, Output, ChangeDetectorRef, EventEmitter, SimpleChanges, ViewChild, OnChanges, OnDestroy, OnInit, ElementRef } from '@angular/core';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { SHELF_COLORS } from '../../../data/fixture-template.data';\r\nimport { timer } from 'rxjs';\r\nimport { ConfirmationPopupComponent } from '../popups/confirmation-popup/confirmation-popup.component';\r\n@Component({\r\n  selector: \"lib-rollout-feedback\",\r\n  templateUrl: \"./rollout-feedback.component.html\",\r\n  styleUrl: \"./rollout-feedback.component.scss\",\r\n})\r\nexport class RolloutFeedbackComponent implements OnChanges, OnDestroy, OnInit {\r\n  @ViewChild(\"bodyBlock\") bodyBlockRef!: ElementRef;\r\n  @ViewChild(\"accordion\", { static: false }) accordion: any;\r\n  loading: boolean = true;\r\n  @Input() currentPlano: any;\r\n  @Input() storeFeedback: any;\r\n  @Input() selectedIssue: any;\r\n  @Input() taskInfo: any;\r\n  @Output() isApproved = new EventEmitter<any>();\r\n  @Input() rolloutSection: string = 'merch';\r\n  selectedFixture: any;\r\n  dataObject: any = [\r\n    // {\r\n    //   Description: \"Rollout\",\r\n    //   Issues: [\r\n    //     { text: \"Merchandise Rollout\", id: \"merchRollout\" },\r\n    //     { text: \"Visual Merch Rollout\", id: \"vmRollout\" },\r\n    //   ],\r\n    // },\r\n    {\r\n      Description: \"Status\",\r\n      Issues: [\r\n        { text: \"Match\", id: \"complete\" },\r\n        { text: \"Mismatch\", id: \"incomplete\" },\r\n      ],\r\n    },\r\n    {\r\n      Description: \"Approval Status\",\r\n      type: \"single\",\r\n      Issues: [\r\n        { text: \"Action Pending\", id: \"pending\" },\r\n        { text: \"Action Done\", id: \"agree\" },\r\n      ],\r\n    },\r\n  ];\r\n  vmFeedback: any = [];\r\n  merchtaskData: any = {};\r\n  vmtaskData: any = [];\r\n  openfixture: boolean = true;\r\n  openvm: boolean = true;\r\n  fixturetaskIndex: number = 0;\r\n  vmtaskIndex: number = 0;\r\n  fixtureIndex: number = 0;\r\n  storeFixtureList: any = [];\r\n  mergeRolloutList: any = [];\r\n  pendingFixtureissues: number = 0;\r\n  approvedFixtureissues: number = 0;\r\n  totalFixtureissues: number = 0;\r\n  completedFixture: number = 0;\r\n  pendingVmissues: number = 0;\r\n  approvedVmissues: number = 0;\r\n  totalVmissues: number = 0;\r\n  completedVm: number = 0;\r\n  originalData: any;\r\n  currentPlanoDetails: any;\r\n  shlefColor = SHELF_COLORS;\r\n  private destroy$ = new Subject();\r\n  cdnUrl: any;\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private cd: ChangeDetectorRef,\r\n    private modalService: NgbModal,\r\n    private gs: GlobalStateService\r\n  ) { }\r\n  \r\n  ngOnChanges(changes: SimpleChanges) {\r\n    if (changes['rolloutSection']) {\r\n      this.rolloutSection = changes[\"rolloutSection\"].currentValue;\r\n    }\r\n    if (changes[\"currentPlano\"]) {\r\n      this.currentPlanoDetails = changes[\"currentPlano\"].currentValue;\r\n    }\r\n    if (changes[\"taskInfo\"]) {\r\n      if (changes[\"taskInfo\"].currentValue) {\r\n        this.merchtaskData = changes[\"taskInfo\"].currentValue?.taskDetails?.filter((ele: any) => ele.type == 'merchRollout')[0];\r\n        this.vmtaskData = changes[\"taskInfo\"].currentValue?.taskDetails?.filter((ele: any) => ele.type == 'vmRollout')[0];\r\n\r\n      }\r\n    }\r\n    if (changes[\"storeFeedback\"]) {\r\n      if (changes[\"storeFeedback\"].currentValue) {\r\n        this.resetInitialValues();\r\n        this.originalData = JSON.parse(\r\n          JSON.stringify(changes[\"storeFeedback\"].currentValue)\r\n        );\r\n        let feedbackData = JSON.parse(\r\n          JSON.stringify(changes[\"storeFeedback\"].currentValue)\r\n        );\r\n        this.getStoreFixturesfeedback(feedbackData?.merchRolloutData);\r\n        this.getStoreVmfeedback(feedbackData?.vmRolloutData);\r\n        if (\r\n          feedbackData?.merchRolloutData?.length === 0 &&\r\n          feedbackData?.vmRolloutData?.length === 0\r\n        ) {\r\n          this.loading = false;\r\n        }\r\n      }\r\n    }\r\n    if (changes[\"selectedIssue\"]) {\r\n      this.resetInitialValues();\r\n      this.selectedFixture = changes[\"selectedIssue\"].currentValue;\r\n\r\n      if (this.originalData?.merchRolloutData) {\r\n        let resultData = JSON.parse(\r\n          JSON.stringify(this.originalData?.merchRolloutData))\r\n\r\n        resultData.forEach((element: any) => {\r\n          element.storeFixtureList = element?.storeFixtureList?.filter(\r\n            (data: any) => data.fixtureId === this.selectedFixture?.fixtureId\r\n          );\r\n          if (resultData && resultData?.length > 0) {\r\n            let feedBackData,emptyList = [];\r\n            feedBackData = resultData.filter((ele:any) => ele.storeFixtureList.length);\r\n            let status = this.taskInfo?.taskDetails.find((ele:any) => ele.type == 'merchRollout')?.status;\r\n            if(this.rolloutSection === 'merch' && this.selectedFixture?.isMerchEdited && status && ['open','inprogress'].includes(status)) {\r\n              emptyList = resultData.filter((ele:any) => !ele.storeFixtureList.length )\r\n              if(emptyList.length) {\r\n                emptyList = [emptyList[0]]\r\n              }\r\n            }\r\n            resultData = [...feedBackData, ...emptyList];\r\n\r\n            this.getStoreFixturesfeedback(resultData);\r\n          } else {\r\n            if(this.rolloutSection === 'merch' && this.selectedFixture?.isMerchEdited) {\r\n              resultData = JSON.parse(\r\n                JSON.stringify(this.originalData?.merchRolloutData)\r\n              )\r\n              resultData = resultData.filter((ele:any) => !ele.storeFixtureList.length);\r\n              this.getStoreFixturesfeedback(resultData);\r\n            }\r\n            else {\r\n              this.getStoreFixturesfeedback([]);\r\n            }\r\n          }\r\n        });\r\n      }\r\n      if (this.originalData?.vmRolloutData) {\r\n        let resultData = JSON.parse(\r\n          JSON.stringify(this.originalData?.vmRolloutData))\r\n        resultData.forEach((element: any) => {\r\n          element.storeFixtureList = element?.storeFixtureList.filter(\r\n            (data: any) => data.fixtureId === this.selectedFixture?.fixtureId\r\n          );\r\n        })\r\n        if (resultData && resultData?.length > 0) {\r\n          let feedBackData,emptyList = [];\r\n            feedBackData = resultData.filter((ele:any) => ele.storeFixtureList.length);\r\n            let status = this.taskInfo?.taskDetails.find((ele:any) => ele.type == 'vmRollout')?.status;\r\n            if(this.rolloutSection === 'vm' && this.selectedFixture?.isVmEdited && status && ['open','inprogress'].includes(status)) {\r\n              emptyList = resultData.filter((ele:any) => !ele.storeFixtureList.length )\r\n              if(emptyList.length) {\r\n                emptyList = [emptyList[0]]\r\n              }\r\n            }\r\n            resultData = [...feedBackData, ...emptyList];\r\n          this.getStoreVmfeedback(resultData);\r\n        } else {\r\n          if(this.rolloutSection === 'vm' && this.selectedFixture?.isVmEdited) {\r\n            resultData = JSON.parse(\r\n              JSON.stringify(this.originalData?.vmRolloutData)\r\n            );\r\n            resultData = resultData.filter((ele:any) => !ele.storeFixtureList.length);\r\n            this.getStoreVmfeedback(resultData);\r\n          }\r\n          else {\r\n            this.getStoreVmfeedback([]);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  getStoreFixturesfeedback(fixtureData: any) {\r\n    this.mergeRolloutList = []\r\n\r\n    fixtureData.forEach((element: any, index: any) => {\r\n      if (index === fixtureData.length - 1) {\r\n        element.openfixture = false;\r\n      } else {\r\n        element.openfixture = true;\r\n      }\r\n      this.completedFixture = element?.storeFixtureList?.filter(\r\n        (data: any) => data.status === \"complete\"\r\n      ).length;\r\n      element?.storeFixtureList?.forEach((shelf: any, i: any) => {\r\n        if (\r\n          shelf?.FixtureData?.shelfConfig &&\r\n          shelf?.FixtureData?.shelfConfig?.length > 0\r\n        ) {\r\n          shelf.FixtureData.shelfConfigFormated = this.formatData(\r\n            shelf.FixtureData.shelfConfig\r\n          );\r\n          shelf.FixtureData.sectionConfig = this.storeData(\r\n            shelf.FixtureData.shelfConfig,\r\n            shelf?.FixtureData?.productResolutionLevel\r\n          );\r\n          if (shelf?.FixtureData?.productResolutionLevel == 'L1') {\r\n            shelf.FixtureData.sectionConfig[0].productBrandName = shelf?.FixtureData.productBrandName;\r\n          }\r\n          let zoneColor: any = {};\r\n          shelf.FixtureData.sectionConfig.forEach((ele: any) => {\r\n            zoneColor[ele.zone] = { color: ele.color };\r\n          });\r\n          shelf.FixtureData.zoneColor = zoneColor;\r\n          shelf.FixtureData.sectionKeys = Object.keys(\r\n            shelf.FixtureData.sectionConfig\r\n          );\r\n          shelf.FixtureData.shelfDetails = shelf.FixtureData.shelfConfig;\r\n          shelf?.answers?.forEach((ele: any) => {\r\n            ele.issues = ele?.issues.filter(\r\n              (issue: any) => issue.Details && issue.Details.length > 0\r\n            );\r\n            this.totalFixtureissues =\r\n              this.totalFixtureissues + ele?.issues?.length;\r\n\r\n            ele?.issues.forEach((issue: any) => {\r\n              if (\r\n                issue?.Details.filter((data: any) => data.status === \"pending\")\r\n                  .length > 0\r\n              ) {\r\n                issue.collapsed = false;\r\n                this.pendingFixtureissues = this.pendingFixtureissues + 1;\r\n              } else {\r\n                issue.collapsed = true;\r\n\r\n                this.approvedFixtureissues = this.approvedFixtureissues + 1;\r\n              }\r\n              issue?.Details.forEach((newshelf: any) => {\r\n                if (newshelf?.shelfConfig && newshelf?.shelfConfig?.length > 0) {\r\n                  newshelf.shelfConfigFormated = this.formatData(\r\n                    newshelf.shelfConfig\r\n                  );\r\n                  newshelf.sectionConfig = this.storeData(\r\n                    newshelf.shelfConfig,\r\n                    shelf?.FixtureData?.productResolutionLevel\r\n                  );\r\n                  if (shelf?.FixtureData?.productResolutionLevel == \"L1\") {\r\n                    newshelf.sectionConfig[0].productBrandName =\r\n                      shelf?.FixtureData.productBrandName;\r\n                  }\r\n                  newshelf.sectionKeys = Object.keys(newshelf.sectionConfig);\r\n                  if (\r\n                    [\"productcategoryWrong\", \"brandWrong\"].includes(\r\n                      issue.issueType\r\n                    )\r\n                  ) {\r\n                    shelf.FixtureData.shelfDetails.forEach((shelf: any) => {\r\n                      let shelfDetails = newshelf.shelfConfig.find(\r\n                        (newShelf: any) =>\r\n                          newShelf.shelfNumber == shelf.shelfNumber\r\n                      );\r\n                      if (!shelfDetails) {\r\n                        shelf.oldShelf = true;\r\n                        newshelf.shelfConfig.push(shelf);\r\n                      }\r\n                    });\r\n                    newshelf.shelfConfig.sort(\r\n                      (a: any, b: any) => a.shelfNumber - b.shelfNumber\r\n                    );\r\n                  }\r\n                  newshelf.shelfDetails = newshelf.shelfConfig;\r\n                }\r\n              });\r\n            });\r\n          });\r\n        }\r\n      });\r\n    });\r\n    this.mergeRolloutList = fixtureData.slice().reverse();\r\n    this.cd.detectChanges()\r\n  }\r\n  getStoreVmfeedback(VmData: any) {\r\n\r\n    this.vmFeedback = [];\r\n    VmData.forEach((element: any, index: any) => {\r\n      if (index === VmData.length - 1) {\r\n        element.openfixture = false;\r\n      } else {\r\n        element.openfixture = true;\r\n      }\r\n      this.completedVm = element?.storeFixtureList?.filter(\r\n        (data: any) => data.status === \"complete\"\r\n      ).length;\r\n      element?.storeFixtureList?.forEach((shelf: any) => {\r\n        if (\r\n          shelf?.FixtureData?.shelfConfig &&\r\n          shelf?.FixtureData?.shelfConfig?.length > 0\r\n        ) {\r\n          shelf.FixtureData.shelfConfigFormated = this.formatData(\r\n            shelf.FixtureData.shelfConfig\r\n          );\r\n          shelf.FixtureData.sectionConfig = this.storeData(\r\n            shelf.FixtureData.shelfConfig,\r\n          );\r\n          shelf.FixtureData.sectionKeys = Object.keys(\r\n            shelf.FixtureData.sectionConfig\r\n          );\r\n          shelf.FixtureData.shelfDetails = shelf.FixtureData.shelfConfig;\r\n          let vmConfig = shelf.FixtureData.vmConfig;\r\n          shelf?.answers.forEach((ele: any) => {\r\n            ele.issues = ele?.issues.filter(\r\n              (issue: any) => issue.Details && issue.Details.length > 0\r\n            );\r\n            this.totalVmissues = this.totalVmissues + ele?.issues?.length;\r\n\r\n            ele?.issues.forEach((issue: any) => {\r\n              if (\r\n                issue?.Details.filter((data: any) => data.status === \"pending\")\r\n                  .length > 0\r\n              ) {\r\n                issue.collapsed = false;\r\n                this.pendingVmissues = this.pendingVmissues + 1;\r\n              } else {\r\n                issue.collapsed = true;\r\n                this.approvedVmissues = this.approvedVmissues + 1;\r\n              }\r\n              issue?.Details.forEach((newshelf: any) => {\r\n                // newshelf.vmConfignew = JSON.parse(\r\n                //   JSON.stringify(newshelf.vmConfig)\r\n                // );\r\n                newshelf.vmData.forEach((ele: any) => {\r\n                  if (ele?.vmId) {\r\n                    let vmType = vmConfig.find((vm: any) => vm.vmId.toString() == ele.vmId.toString())?.vmType;\r\n                    ele.vmType = vmType;\r\n                  }\r\n                })\r\n                if (newshelf?.shelfConfig && newshelf?.shelfConfig?.length > 0) {\r\n                  newshelf.shelfConfigFormated = this.formatData(\r\n                    newshelf.shelfConfig\r\n                  );\r\n                  newshelf.sectionConfig = this.storeData(newshelf.shelfConfig);\r\n                  newshelf.sectionKeys = Object.keys(newshelf.sectionConfig);\r\n                  newshelf.shelfDetails = newshelf.shelfConfig;\r\n\r\n                  // newshelf.vmConfignew.forEach((vm: any) => {\r\n                  //   if (issue.issueType == \"VmMismatch\") {\r\n                  //     vm.startYPosition = vm.newstartYPosition;\r\n                  //     vm.endYPosition = vm.newendYPosition;\r\n                  //     vm.xZone = vm.newxZone.toLowerCase();\r\n                  //     vm.yZone = vm.newyZone.toLowerCase();\r\n                  //   }\r\n                  //   vm.newVm = true;\r\n                  // });\r\n                  newshelf.vmConfignew = vmConfig;\r\n                  newshelf?.vmConfignew?.forEach((ele: any) => {\r\n                    if (ele.vmId) {\r\n                      let findVm = newshelf?.vmData?.find((ele: any) => ele?.vmId);\r\n                      if (findVm) ele.newVm = true;\r\n                    }\r\n                  })\r\n                }\r\n              });\r\n            });\r\n          });\r\n        }\r\n      });\r\n    })\r\n    this.vmFeedback = VmData.slice().reverse();\r\n      this.cd.detectChanges();\r\n\r\n    timer(3000).subscribe(() => {\r\n      this.loading = false;\r\n      this.cd.detectChanges();\r\n    });\r\n  }\r\n  formatData(data: any) {\r\n    const groupedArray = Object.values(\r\n      data.reduce((acc: any, item: any) => {\r\n        const zone = item.zone || \"undefined\";\r\n        if (!acc[zone]) {\r\n          acc[zone] = { zone, items: [] };\r\n        }\r\n        acc[zone].items.push(item);\r\n        return acc;\r\n      }, {})\r\n    );\r\n    return groupedArray;\r\n  }\r\n  storeData(shelfData: any, level?: string) {\r\n    shelfData.sort((a: any, b: any) => a.shelfNumber - b.shelfNumber);\r\n    let count = 0;\r\n    let sectionConfig: any[] = [];\r\n    shelfData.forEach((shelf: any) => {\r\n      let getSection = sectionConfig.filter((ele) => ele.zone == shelf.zone);\r\n      if (!getSection.length || (!shelf.zone && level == \"L2\")) {\r\n        sectionConfig.push({\r\n          ...shelf,\r\n          startYPosition: shelf.shelfNumber,\r\n          endYPosition: shelf.shelfNumber,\r\n          color: this.shlefColor[count],\r\n        });\r\n        count++;\r\n      } else {\r\n        if (\r\n          getSection[getSection.length - 1].endYPosition + 1 ==\r\n          shelf.shelfNumber\r\n        ) {\r\n          getSection[getSection.length - 1].endYPosition = shelf.shelfNumber;\r\n          getSection[getSection.length - 1].productBrandName = [\r\n            ...getSection[getSection.length - 1].productBrandName,\r\n            ...shelf.productBrandName,\r\n          ];\r\n          getSection[getSection.length - 1].productBrandName = [\r\n            ...new Set(\r\n              getSection[getSection.length - 1].productBrandName.map(\r\n                (ele: any) => ele\r\n              )\r\n            ),\r\n          ];\r\n          getSection[getSection.length - 1].productCategory = [\r\n            ...getSection[getSection.length - 1].productCategory,\r\n            ...shelf.productCategory,\r\n          ];\r\n          getSection[getSection.length - 1].productCategory = [\r\n            ...new Set(\r\n              getSection[getSection.length - 1].productCategory.map(\r\n                (ele: any) => ele\r\n              )\r\n            ),\r\n          ];\r\n        } else {\r\n          sectionConfig.push({\r\n            ...shelf,\r\n            startYPosition: shelf.shelfNumber,\r\n            endYPosition: shelf.shelfNumber,\r\n            color: getSection[getSection.length - 1].color,\r\n          });\r\n        }\r\n      }\r\n    });\r\n\r\n    // this.handlevmPosition(sectionConfig);\r\n    // this.handleSection(sectionConfig);\r\n    this.cd.detectChanges();\r\n    return sectionConfig;\r\n  }\r\n\r\n  resetInitialValues() {\r\n    this.pendingFixtureissues = 0;\r\n    this.approvedFixtureissues = 0;\r\n    this.totalFixtureissues = 0;\r\n    this.completedFixture = 0;\r\n    this.pendingVmissues = 0;\r\n    this.approvedVmissues = 0;\r\n    this.totalVmissues = 0;\r\n    this.completedVm = 0;\r\n  }\r\n  ngOnInit(): void {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => {\r\n      if (env) {\r\n        this.cdnUrl = env.planogramCDN;\r\n      }\r\n    });\r\n  }\r\n  confirmation(\r\n    type: any,\r\n    _id: any,\r\n    answerId: any,\r\n    issueId: any,\r\n    DetailsId: any,\r\n    taskType: any,\r\n    issueType: any\r\n  ) {\r\n    let payload = {\r\n      _id: _id,\r\n      answerId: answerId,\r\n      issueId: issueId,\r\n      DetailsId: DetailsId,\r\n      taskType: taskType,\r\n      issueType: issueType,\r\n      planoId: this.currentPlanoDetails?.planoId,\r\n      floorId: this.currentPlanoDetails?._id,\r\n      // fixtureId: this.selectedFixture.fixtureId,\r\n    };\r\n    const modalRef = this.modalService.open(ConfirmationPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\", // <-- Add a custom class here\r\n    });\r\n    modalRef.componentInstance.type = type;\r\n    modalRef.componentInstance.inputData = payload;\r\n    modalRef.result.then((result: any) => {\r\n      if (result.status === \"submit\") {\r\n        this.isApproved.emit(result);\r\n      }\r\n    });\r\n  }\r\n\r\n  reload() {\r\n    let result = {\r\n      reload: true,\r\n    };\r\n    this.isApproved.emit(result);\r\n  }\r\n  applyFilters(event: any) {\r\n    let result: any = {};\r\n    if (event?.length) {\r\n      event.forEach((element: any) => {\r\n        // if (element.Description === \"Task\") {\r\n        //   result.filterByTask = element.Issues.map((val: any) => val?.id);\r\n        // }\r\n        if (element.Description === \"Status\") {\r\n          result.filterByStatus = element.Issues.map((val: any) => val?.id);\r\n        }\r\n        if (element.Description === \"Approval Status\") {\r\n          result.filterByApprovalStatus = element.Issues.id\r\n            ? element.Issues.id\r\n            : \"\";\r\n        }\r\n      });\r\n\r\n      if (\r\n        result.filterByApprovalStatus?.length === 0 &&\r\n        result.filterByStatus?.length === 0\r\n        // && result.filterByTask?.length === 0\r\n      ) {\r\n        result.reload = true;\r\n        this.isApproved.emit(result);\r\n        return;\r\n      }\r\n      this.isApproved.emit(result);\r\n    }\r\n  }\r\n  updateStyle(data: any, i: any) {\r\n    return this.handleSection(data, i);\r\n  }\r\n\r\n  nexttaskFixture(fixturetaskIndex: number, totalData: any) {\r\n\r\n    if (totalData.length > fixturetaskIndex + 1) {\r\n      this.fixturetaskIndex = fixturetaskIndex + 1;\r\n    }\r\n  }\r\n  previoustaskVm(vmtaskIndex: number, totalData: any) {\r\n    if (vmtaskIndex > 0) {\r\n      this.vmtaskIndex = vmtaskIndex - 1;\r\n    }\r\n  }\r\n  nexttaskVm(vmtaskIndex: number, totalData: any) {\r\n\r\n    if (totalData.length > vmtaskIndex + 1) {\r\n      this.vmtaskIndex = vmtaskIndex + 1;\r\n    }\r\n  }\r\n  previoustaskFixture(fixturetaskIndex: number, totalData: any) {\r\n    if (fixturetaskIndex > 0) {\r\n      this.fixturetaskIndex = fixturetaskIndex - 1;\r\n    }\r\n  }\r\n  handlevmPosition(vmData: any, i: any) {\r\n    const viewPort = this.bodyBlockRef?.nativeElement as HTMLElement;\r\n    const bodyHeight = viewPort?.offsetHeight;\r\n    const bodyWidth = viewPort?.offsetWidth;\r\n    let style;\r\n    // this.vmConfig.forEach((e: any, i: any) => {\r\n    let startShelf = vmData?.startYPosition ?? 1;\r\n    let endShelf = vmData?.endYPosition ?? 1;\r\n    const vm = document.getElementById(\"vm\" + i);\r\n    if (!vm) return;\r\n\r\n    let width = 100;\r\n    let height = 100;\r\n    let x = 0;\r\n    let y = 0;\r\n\r\n    let yStart = 0;\r\n    for (let k = 0; k < startShelf - 1; k++) {\r\n      const shelf = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!shelf) return;\r\n\r\n      yStart += shelf.offsetHeight;\r\n    }\r\n\r\n    let placementHeight = 0;\r\n    for (let k = startShelf - 1; k < endShelf; k++) {\r\n      const s = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!s) return;\r\n      placementHeight += s.offsetHeight;\r\n    }\r\n\r\n    switch (vmData?.xZone) {\r\n      case \"left\":\r\n        x = 0;\r\n        width = 100;\r\n        break;\r\n      case \"right\":\r\n        width = 100;\r\n        x = bodyWidth - width;\r\n        break;\r\n      case \"middle\":\r\n        width = 100;\r\n        x = (bodyWidth - width) / 2;\r\n        break;\r\n      case \"stretch\":\r\n        width = bodyWidth;\r\n        x = 0;\r\n        break;\r\n    }\r\n\r\n    switch (vmData?.yZone) {\r\n      case \"top\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = yStart;\r\n        break;\r\n      case \"middle\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = (placementHeight - height) / 2 + yStart;\r\n        break;\r\n      case \"bottom\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = placementHeight - height + yStart;\r\n        break;\r\n      case \"stretch\":\r\n        height = placementHeight;\r\n        y = yStart;\r\n        break;\r\n    }\r\n\r\n    if (vmData.newVm) {\r\n      style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px);z-index:2;`;\r\n    } else {\r\n      style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px);`;\r\n    }\r\n\r\n    return style;\r\n    // });\r\n  }\r\n  handleSection(sectionConfig: any, i: any) {\r\n    const viewPort = this.bodyBlockRef?.nativeElement as HTMLElement;\r\n    const bodyHeight = viewPort?.offsetHeight;\r\n    const bodyWidth = viewPort?.offsetWidth;\r\n\r\n    let style: any;\r\n    // Object.keys(sectionConfig).forEach((e: any, i: any) => {\r\n    let startShelf = sectionConfig?.startYPosition ?? 1;\r\n    let endShelf = sectionConfig?.endYPosition ?? sectionConfig.length;\r\n    const section = document.getElementById(\"section\" + i);\r\n    if (!section) return;\r\n\r\n    let width = 100;\r\n    let height = 50;\r\n    let x = 0;\r\n    let y = 0;\r\n\r\n    let yStart = 0;\r\n    for (let k = 0; k < startShelf - 1; k++) {\r\n      const shelf = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!shelf) return;\r\n\r\n      yStart += shelf.offsetHeight;\r\n    }\r\n\r\n    let placementHeight = 0;\r\n    for (let k = startShelf - 1; k < endShelf; k++) {\r\n      const s = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n\r\n      if (!s) return;\r\n      placementHeight += s.offsetHeight;\r\n    }\r\n    x = 10;\r\n    height = placementHeight < 100 ? 48 : 50;\r\n    // height = 50;\r\n    y = (placementHeight - height) / 2 + yStart;\r\n\r\n    style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px)`;\r\n    // let vmDetails = document.getElementById(`vm-placeholder${i}`);\r\n    // if (vmDetails) {\r\n    //   vmDetails.style.border = `1px solid ${this.shlefColor[i].border}`;\r\n    // }\r\n    // style.push({zone:e,style:styleList})\r\n    // });\r\n    return style;\r\n  }\r\n\r\n  getStartPosition(\r\n    shelfNumber: number,\r\n    zone: any,\r\n    shelfDetails: any,\r\n    data: any = []\r\n  ) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.startYPosition == shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      if (data.length) {\r\n        let matchedCount = 0;\r\n        data.forEach((ele: any) => {\r\n          if (shelfDetails.productBrandName.includes(ele.productBrandName)) {\r\n            if (!ele.productCategory.length) {\r\n              matchedCount++;\r\n            } else {\r\n              ele.productCategory.forEach((cat: any) => {\r\n                if (shelfDetails.productCategory.includes(cat)) {\r\n                  matchedCount++;\r\n                }\r\n              });\r\n            }\r\n          }\r\n        });\r\n        if (!matchedCount) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  getEndPosition(\r\n    shelfNumber: number,\r\n    zone: any,\r\n    shelfDetails: any,\r\n    data: any = []\r\n  ) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.endYPosition == shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      if (data.length) {\r\n        let matchedCount = 0;\r\n        data.forEach((ele: any) => {\r\n          if (shelfDetails.productBrandName.includes(ele.productBrandName)) {\r\n            if (!ele.productCategory.length) {\r\n              matchedCount++;\r\n            } else {\r\n              ele.productCategory.forEach((cat: any) => {\r\n                if (shelfDetails.productCategory.includes(cat)) {\r\n                  matchedCount++;\r\n                }\r\n              });\r\n            }\r\n          }\r\n        });\r\n        if (!matchedCount) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  getMidPosition(\r\n    shelfNumber: number,\r\n    zone: any,\r\n    shelfDetails: any,\r\n    data: any = []\r\n  ) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.endYPosition >= shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      if (data.length) {\r\n        let matchedCount = 0;\r\n        data.forEach((ele: any) => {\r\n          if (shelfDetails.productBrandName.includes(ele.productBrandName)) {\r\n            if (!ele.productCategory.length) {\r\n              matchedCount++;\r\n            } else {\r\n              ele.productCategory.forEach((cat: any) => {\r\n                if (shelfDetails.productCategory.includes(cat)) {\r\n                  matchedCount++;\r\n                }\r\n              });\r\n            }\r\n          }\r\n        });\r\n        if (!matchedCount) {\r\n          return false;\r\n        }\r\n      }\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  showMatch(data:any) {\r\n    let findMatch = data?.filter((ele: any) => ele.status == \"complete\");\r\n    return findMatch?.length == data.length;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n\r\n}\r\n","<section *ngIf=\"loading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section *ngIf=\"!loading\">\r\n  <div class=\"d-flex justify-content-between border-bottom\">\r\n    <div>\r\n      <div class=\"storeResponse\">Store response</div>\r\n      <div class=\"normalText mb-5\">Click a fixture or view all</div>\r\n    </div>\r\n    <div class=\"mt-4\">\r\n      <button *ngIf=\"selectedFixture?.fixtureId\" (click)=\"reload()\"\r\n        class=\"btn btn-light text-primary border-0 px-3 py-2\" style=\"background-color: #eaf6ff; border-radius: 1rem;\">\r\n        Clear Filter\r\n      </button>\r\n      <lib-filters *ngIf=\"!selectedFixture?.fixtureId\" [dataObject]=\"dataObject\"\r\n        (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n    </div>\r\n  </div>\r\n  <div *ngIf=\"rolloutSection === 'vm'\">\r\n    <div ngbAccordion [closeOthers]=\"true\" class=\"mt-5\">\r\n      @for(vmData of vmFeedback;track i;let i = $index;let first=$first) {\r\n        <ng-container>\r\n          <div ngbAccordionItem [collapsed]=\"!first\" class=\"mb-5\">\r\n            <div class=\"d-flex\" ngbAccordionHeader (click)=\"vmtaskIndex=0\">\r\n              <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                <span class=\"me-2 layout-Lbel\">\r\n                  <div *ngIf=\"!vmData?.redoStatus\">Visual merch rollout assigned</div>\r\n                  <div *ngIf=\"vmData?.redoStatus\">Visual merch rollout Reassigned</div>\r\n                  <div class=\"grayText\">{{vmData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}</div>\r\n                </span>\r\n                <div class=\"divider\"></div>\r\n              </button>\r\n            </div>\r\n            <div ngbAccordionCollapse>\r\n              <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                <ng-template>\r\n                  <div *ngIf=\"!selectedFixture || selectedFixture?.isVmEdited || selectedFixture?.issueData?.length\">\r\n                    <div class=\"d-flex\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                        <div class=\"h-divider mt-3 ms-5\"></div>\r\n                      </div>\r\n                      <div class=\"ms-3\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{vmData?.createdByName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{vmData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                        <div class=\"assignText\">\r\n                          Assigner\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"d-flex\" *ngIf=\"vmData?.userName!==''\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                        <div class=\"h-divider mt-3 ms-5\"></div>\r\n                      </div>\r\n                      <div class=\"ms-3\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{vmData?.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{vmData?.submitTime_string}}\r\n                        </div>\r\n                        <div class=\"assignText\">\r\n                          Assignee\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div *ngIf=\"vmData.storeFixtureList?.length>0\">\r\n  \r\n  \r\n                    <div class=\"d-flex ms-3\" *ngIf=\"!selectedFixture?.fixtureId\">\r\n                      <div class=\"badge badge-light-success p-3 me-4\"\r\n                        *ngIf=\"showMatch(vmData?.storeFixtureList)\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg><span class=\"ms-2\">Vm matched</span>\r\n                      </div>\r\n                      <div class=\"badge badge-light-danger p-3 me-4\"\r\n                        *ngIf=\"!showMatch(vmData?.storeFixtureList)\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M6 4V6M6 8H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z\"\r\n                            stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg><span class=\"ms-2\">Vm mismatch</span>\r\n                      </div>\r\n                      <div class=\"badge badge-light-warning p-3\" *ngIf=\"pendingVmissues>0\">\r\n                        {{pendingVmissues}}/{{totalVmissues}} action pending\r\n                      </div>\r\n                      <div class=\"badge badge-light-success p-3\" *ngIf=\"approvedVmissues>0&&pendingVmissues===0\">\r\n                        {{approvedVmissues}}/{{totalVmissues}} action done\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"d-flex justify-content-between mt-5\">\r\n                      <div class=\"cursor-pointer\" (click)=\"previoustaskVm(vmtaskIndex,vmData?.storeFixtureList)\">\r\n                        <svg *ngIf=\"vmtaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                          viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M15 6L9 12L15 18\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                        <svg *ngIf=\"!vmtaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                          viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M15 6L9 12L15 18\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </div>\r\n                      <div class=\"layoutLabel\">\r\n                        {{ vmData?.storeFixtureList[vmtaskIndex]?.FixtureData.fixtureName}} -\r\n                        {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData.fixtureWidth.value}}\r\n                        {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData.fixtureWidth.unit}}\r\n                      </div>\r\n                      <div class=\"layoutLabel\">\r\n                        {{vmtaskIndex+1}}/{{vmData?.storeFixtureList.length}}\r\n                      </div>\r\n                      <div class=\"cursor-pointer\" (click)=\"nexttaskVm(vmtaskIndex,vmData?.storeFixtureList)\">\r\n                        <svg *ngIf=\"vmData?.storeFixtureList.length>vmtaskIndex+1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                          width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M9 18L15 12L9 6\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n  \r\n                        <svg *ngIf=\"(vmData?.storeFixtureList.length)===(vmtaskIndex+1)\"\r\n                          xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M9 18L15 12L9 6\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                      <div class=\"row mb-4 mt-2\" *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureName\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Fixture name:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureName}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureCategory\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Fixture Type:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureCategory}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureWidth?.value!==''\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Size (Width):</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n  \r\n                      <div class=\"row mb-4 mt-2\" *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.shelfConfig\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Total shelves:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.shelfConfig?.length}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureCapacity\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Total product capacity:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.fixtureCapacity}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"mt-4\">\r\n                      <div class=\"layoutLabel\">\r\n                        Planogram design\r\n                      </div>\r\n                      <div class=\"grayText\">\r\n                        Fixture designed by the planogram team\r\n                      </div>\r\n                      <div class=\"wall-viewport w-100 mt-5\">\r\n  \r\n                        <div id=\"header-block\" class=\"header-block\">\r\n                          <p>\r\n                            {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                          </p>\r\n                        </div>\r\n                        <div #bodyBlock id=\"bodyBlock\" class=\"body-block w-100\">\r\n                          <ng-container\r\n                            *ngFor=\"let vm of vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.vmConfig;let i=index\">\r\n                            <div [id]=\"'vm' + i\" class=\"vm-block\" [style]=\"handlevmPosition(vm,i)\">\r\n                              <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\">\r\n                                <img [src]=\"vm?.imgSrc\" *ngIf=\"vm?.imgSrc\" />\r\n                                <span class=\"secStyle wordWrap\">{{vm?.vmName}}</span>\r\n                              </div>\r\n                            </div>\r\n                          </ng-container>\r\n                          <div\r\n                            *ngFor=\"let shelfData of vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.shelfDetails; let i = index\" class=\"shelfContainer\">\r\n                            <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\">\r\n                              <div class=\"badge\" [ngStyle]=\"{\r\n                              'background-color':'white',\r\n                              color:'white'}\">\r\n                                Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                              </div>\r\n  \r\n                            </div>\r\n  \r\n                          </div>\r\n                        </div>\r\n                        <!-- Footer block -->\r\n                        <div class=\"footer-block\">\r\n                          <p> {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\"\r\n                      *ngFor=\"let issues of vmData?.storeFixtureList[vmtaskIndex]?.answers;let j = index\">\r\n                      <ng-container>\r\n                        <div ngbAccordionItem=\"{{ 'newdetails-' + k }}\" [collapsed]=\"item.collapsed\" class=\"mb-5\"\r\n                          *ngFor=\"let item of issues.issues;let k = index\">\r\n                          <div class=\"d-flex \" ngbAccordionHeader>\r\n                            <button type=\"button\" ngbAccordionButton class=\"mainheading p-3 backgroundImg\">\r\n                              <span class=\"me-2 layout-Lbel\">\r\n  \r\n                                <div><span *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'\"\r\n                                    class=\"d-inline-block bg-warning rounded-circle mx-2\"\r\n                                    style=\"width: 10px; height: 10px;\"></span>{{item?.question}}</div>\r\n                              </span>\r\n                              <div class=\"divider\"></div>\r\n                            </button>\r\n                          </div>\r\n                          <div ngbAccordionCollapse>\r\n                            <div ngbAccordionBody class=\"p-0\">\r\n                              <ng-template>\r\n  \r\n                                <!-- <div class=\"d-flex justify-content-start mt-5\">\r\n  \r\n                              <div *ngIf=\"item.issueType==='VmMissing'\">\r\n                                Total additional VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                              </div>\r\n                              <div *ngIf=\"item.issueType==='extraVm'\">\r\n                                Total additional VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                              </div>\r\n                              <div *ngIf=\"item.issueType==='VmMismatch'\">\r\n                                Total misplaced VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                              </div>\r\n                            </div> -->\r\n                                <div class=\"backgroundImg mt-4 ps-3 py-2\"\r\n                                  *ngFor=\"let vmData of item?.Details[fixtureIndex]?.vmData\">\r\n                                  <div class=\"pt-5 pb-5\" *ngIf=\"item.issueType==='vmPartiallyRecevied'\">\r\n                                    <div class=\"subText\">Total partially recieved VMs:\r\n                                      {{item?.Details[fixtureIndex]?.vmData.length}}</div>\r\n                                  </div>\r\n                                  <div class=\"pt-5 pb-5\" *ngIf=\"item.issueType==='vmDamaged'\">\r\n                                    <div class=\"subText\">Total issues/damages VMs:\r\n                                      {{item?.Details[fixtureIndex]?.vmData.length}}</div>\r\n                                  </div>\r\n                                  <div class=\"pt-5 pb-5\" *ngIf=\"item.issueType==='vmnotRecevied'\">\r\n                                    <div class=\"subText\">Total not received VMs:\r\n                                      {{item?.Details[fixtureIndex]?.vmData.length}}</div>\r\n                                  </div>\r\n                                  <div class=\"pt-5 pb-5\" *ngIf=\"item.issueType==='vmMismatch'\">\r\n                                    <div class=\"subText\">Total mismatched size VMs:\r\n                                      {{item?.Details[fixtureIndex]?.vmData.length}}</div>\r\n                                  </div>\r\n                                  <div class=\"row mb-4\" *ngIf=\"vmData?.vmName\">\r\n                                    <div class=\"col-md-6\">\r\n                                      <div class=\"layoutLabel\">VM Name :</div>\r\n                                    </div>\r\n                                    <div class=\"col-md-6\">\r\n                                      <div class=\"shelfText breakWord\">{{vmData?.vmName}}\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n  \r\n                                  <div class=\"row mb-4\">\r\n                                    <div class=\"col-md-6\">\r\n                                      <div class=\"layoutLabel\">Category :</div>\r\n                                    </div>\r\n                                    <div class=\"col-md-6\">\r\n                                      <div class=\"shelfText breakWord\">{{vmData?.vmType}}\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n  \r\n                                  <img src=\"{{cdnUrl}}{{vmData?.image}}\" *ngIf=\"vmData?.image\" />\r\n                                </div>\r\n                                <div class=\"mt-4\" *ngIf=\"item?.Details[fixtureIndex]?.vmData?.length>0\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    Store Response\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    Fixture feedback by the store team\r\n                                  </div>\r\n                                  <div class=\"wall-viewport w-100 mt-5\">\r\n  \r\n                                    <div id=\"header-block\" class=\"header-block\">\r\n                                      <p>\r\n                                        {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                                      </p>\r\n                                    </div>\r\n  \r\n                                    <div #bodyBlock id=\"bodyBlock\" class=\"body-block w-100\">\r\n                                      <ng-container\r\n                                        *ngFor=\"let vm of item?.Details[fixtureIndex]?.vmConfignew;let m=index\">\r\n                                        <div [id]=\"'vm' + m\" class=\"vm-block\" [style]=\"handlevmPosition(vm,m)\">\r\n                                          <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + m\"\r\n                                            [class]=\"vm.newVm ? 'redBorder' : ''\">\r\n                                            <img src=\"{{cdnUrl}}{{vm?.imgSrc}}\" *ngIf=\"vm?.imgSrc\" />\r\n                                            <span class=\"secStyle\">{{vm?.vmName}}</span>\r\n                                            <!-- <h3>{{ item?.Details[fixtureIndex]?.sectionConfig[section]?.zone}}</h3> -->\r\n                                          </div>\r\n                                        </div>\r\n                                      </ng-container>\r\n  \r\n  \r\n                                      <div\r\n                                        *ngFor=\"let shelfData of item?.Details[fixtureIndex]?.shelfDetails; let i = index\" class=\"shelfContainer\">\r\n  \r\n  \r\n                                        <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\">\r\n                                          <div class=\"badge\" [ngStyle]=\"{\r\n                                                'background-color':'white',\r\n                                                color:'white'}\">\r\n                                            Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                                          </div>\r\n  \r\n                                        </div>\r\n  \r\n                                      </div>\r\n                                    </div>\r\n  \r\n  \r\n                                    <div class=\"footer-block\">\r\n                                      <p> {{vmData?.storeFixtureList[vmtaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n  \r\n  \r\n  \r\n                                <div class=\"my-4\" *ngIf=\"item?.comments.length>0\">\r\n                                  <div class=\"assignText\">Comments</div>\r\n                                  <div class=\"d-flex mt-4\" *ngFor=\"let comment of item?.comments?.slice()?.reverse()\">\r\n                                    <div class=\"symbol symbol-35px symbol-circle\">\r\n                                      <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                          fill=\"none\">\r\n                                          <path\r\n                                            d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                      </span>\r\n                                    </div>\r\n  \r\n                                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                                      <div class=\"\">\r\n                                        <div class=\"layoutLabel\">\r\n                                          {{comment.userName}}\r\n                                        </div>\r\n                                        <div class=\"grayText\">\r\n                                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                        </div>\r\n                                      </div>\r\n                                      <div class=\"assignText breakWord mt-2\">\r\n                                        {{comment?.comment}}\r\n                                      </div>\r\n                                    </div>\r\n                                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                                      <div class=\"\">\r\n                                        <div class=\"layoutLabel\">\r\n                                          {{comment.userName}}\r\n                                        </div>\r\n                                        <div class=\"grayText\">\r\n                                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                        </div>\r\n                                      </div>\r\n                                      <div class=\" breakWord mt-2\">\r\n                                        Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Closed\r\n                                          issue\"</span>\r\n                                        <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">Redo</span>\r\n                                        <span *ngIf=\"comment?.responsetype==='revoke'\" class=\"assignText\">Revoked</span>\r\n                                      </div>\r\n                                      <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                                        Note: {{comment?.comment}}\r\n                                      </div>\r\n                                    </div>\r\n  \r\n                                  </div>\r\n                                </div>\r\n\r\n                                <div class=\"mt-5 row\"\r\n                                  *ngIf=\"item?.Details[vmtaskIndex]?.status==='pending'&&selectedFixture?.fixtureId\">\r\n                                  <div class=\"d-flex justify-content-end\">\r\n                                    <div class=\"two-tone-btn me-3\"\r\n                                      (click)=\"confirmation('redo',vmData?.storeFixtureList[vmtaskIndex]?._id,issues._id,item._id,item?.Details[vmtaskIndex]?._id,'vmRollout',item.issueType)\">\r\n                                      Mark Redo\r\n                                    </div>\r\n                                    <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                                      (click)=\"confirmation('closeIssue',vmData?.storeFixtureList[vmtaskIndex]?._id,issues._id,item._id,item?.Details[vmtaskIndex]._id,'vmRollout',item.issueType)\">Close\r\n                                      Issue</button>\r\n                                  </div>\r\n                                </div>\r\n  \r\n                                <!-- <div class=\"my-4 w-100\"\r\n                                  *ngIf=\"vmData?.storeFixtureList[vmtaskIndex].answers[0]?.image&&vmData?.storeFixtureList[vmtaskIndex].answers[0]?.image!==''\">\r\n                                  <div class=\"assignText\">Store fixture</div>\r\n                                  <img src=\"{{cdnUrl}}{{vmData?.storeFixtureList[vmtaskIndex].answers[0]?.image}}\"\r\n                                    alt=\"image\" class=\"mt-4 w-100\" />\r\n                                </div> -->\r\n                                \r\n  \r\n                               \r\n                              </ng-template>\r\n                            </div>\r\n                          </div>\r\n                        </div>\r\n                      </ng-container>\r\n                    </div>\r\n                    \r\n                    <div *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.issues?.length===0\">\r\n                      <div class=\"my-4\" *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.comments.length>0\">\r\n                        <div class=\"assignText\">Comments</div>\r\n                        <div class=\"d-flex mt-4\"\r\n                          *ngFor=\"let comment of vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.comments?.slice()?.reverse()\">\r\n                          <div class=\"symbol symbol-35px symbol-circle\">\r\n                            <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path\r\n                                  d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                  stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                            </span>\r\n                          </div>\r\n  \r\n                          <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                            <div class=\"\">\r\n                              <div class=\"layoutLabel\">\r\n                                {{comment.userName}}\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"assignText breakWord mt-2\">\r\n                              {{comment?.comment}}\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                            <div class=\"\">\r\n                              <div class=\"layoutLabel\">\r\n                                {{comment.userName}}\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                              </div>\r\n                            </div>\r\n                            <div class=\" breakWord mt-2\">\r\n                              Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Closed\r\n                                issue\"</span>\r\n                              <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Redo\"</span>\r\n                              <span *ngIf=\"comment?.responsetype==='revoke'\" class=\"assignText\">Revoked</span>\r\n                            </div>\r\n                            <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                              Note: {{comment?.comment}}\r\n                            </div>\r\n                          </div>\r\n  \r\n                        </div>\r\n                      </div>\r\n                      <div class=\"mt-5 row\"\r\n                        *ngIf=\"vmData?.storeFixtureList[fixturetaskIndex]?.approvalStatus==='pending'&&selectedFixture?.fixtureId && !vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.status\">\r\n                        <div class=\"d-flex justify-content-end\">\r\n                          <div class=\"two-tone-btn me-3\"\r\n                            (click)=\"confirmation('redo',vmData?.storeFixtureList[fixturetaskIndex]?._id,vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?._id,'','','vmRollout','')\">\r\n                            Mark Redo\r\n                          </div>\r\n                          <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                            (click)=\"confirmation('closeIssue',vmData?.storeFixtureList[fixturetaskIndex]?._id,vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?._id,'','','vmRollout','')\">\r\n                            Close Issue</button>\r\n                        </div>\r\n                      </div>\r\n\r\n\r\n\r\n                      <div class=\"my-4 w-100\"\r\n                        *ngIf=\"vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.image&&vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.image!==''\">\r\n                        <div class=\"assignText\">Store fixture</div>\r\n                        <img src=\"{{cdnUrl}}{{vmData?.storeFixtureList[vmtaskIndex]?.answers[0]?.image}}\" alt=\"image\"\r\n                          class=\"mt-4 w-100\" />\r\n                      </div>\r\n                      \r\n                    </div>\r\n                  </div>\r\n                  \r\n                  <div class=\"my-4\" *ngIf=\"vmData?.comments.length&& !selectedFixture?.fixtureId\">\r\n                    <div class=\"assignText\">Comments</div>\r\n                    <div class=\"d-flex mt-4\" *ngFor=\"let comment of vmData?.comments\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                      </div>\r\n  \r\n                      <div class=\"ms-3\">\r\n                        <div class=\"\">\r\n                          <div class=\"layoutLabel\">\r\n                            {{comment.userName}}\r\n                          </div>\r\n                          <div class=\"grayText\">\r\n                            {{comment?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                          </div>\r\n                        </div>\r\n                        <div class=\"breakWord mt-2\">\r\n                          {{comment?.comment}}\r\n                        </div>\r\n                      </div>\r\n  \r\n  \r\n                    </div>\r\n                  </div>\r\n                   <div class=\"mt-5\">\r\n                    @if (!vmData?.storeFixtureList.length) {\r\n                      <div class=\"text-center\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                          <path\r\n                            d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n                            stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n                        </svg>\r\n                      </div>\r\n                      <div class=\"mt-3 text-center\">\r\n                          <div class=\"fw-bold h3 mt-2\">No response</div>\r\n                          <div class=\"mt-4\">Yet to receive store response.</div>\r\n                      </div>\r\n                    }\r\n                  </div>\r\n                </ng-template>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </ng-container>\r\n      }\r\n    </div>\r\n  </div>\r\n  <div *ngIf=\"rolloutSection === 'merch'\">\r\n    <div ngbAccordion [closeOthers]=\"true\" class=\"mt-5\">\r\n      @for(mergeData of mergeRolloutList;track i;let i = $index;let first=$first) {\r\n        <ng-container>\r\n          <div ngbAccordionItem [collapsed]=\"!first\" class=\"mb-5\" [id]=\"'merch'+i\">\r\n            <div class=\"d-flex\" ngbAccordionHeader>\r\n              <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                <span class=\"me-2 fs-4\">\r\n                  <div *ngIf=\"!mergeData?.redoStatus\">Merchandise rollout assigned</div>\r\n                  <div *ngIf=\"mergeData?.redoStatus\">Merchandise rollout Reassigned</div>\r\n                  <div class=\"grayText\">{{mergeData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}</div>\r\n                </span>\r\n                <div class=\"divider\"></div>\r\n              </button>\r\n            </div>\r\n            <div ngbAccordionCollapse>\r\n              <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                <ng-template>\r\n                  <div *ngIf=\"!selectedFixture || selectedFixture?.isMerchEdited || selectedFixture?.issueData?.length\">\r\n                    <div class=\"d-flex\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                        <div class=\"h-divider mt-3 ms-5\"></div>\r\n                      </div>\r\n                      <div class=\"ms-3\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{mergeData?.createdByName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{mergeData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                        <div class=\"assignText\">\r\n                          Assigner\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"d-flex\" *ngIf=\"mergeData?.userName!==''\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                        <div class=\"h-divider mt-3 ms-5\"></div>\r\n                      </div>\r\n                      <div class=\"ms-3\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{mergeData?.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\" *ngIf=\"mergeData?.submitTime_string!==''\">\r\n                          {{mergeData?.submitTime_string}}\r\n                        </div>\r\n                        <div class=\"assignText\">\r\n                          Assignee\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div *ngIf=\"mergeData?.storeFixtureList?.length>0\">\r\n                    <div class=\"d-flex ms-3\" *ngIf=\"!selectedFixture?.fixtureId\">\r\n                      <div class=\"badge badge-light-success p-3 me-4\"\r\n                        *ngIf=\"showMatch(mergeData?.storeFixtureList)\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg><span class=\"ms-2\">Fixture matched</span>\r\n                      </div>\r\n                      <div class=\"badge badge-light-danger p-3 me-4\"\r\n                        *ngIf=\"!showMatch(mergeData?.storeFixtureList)\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M6 4V6M6 8H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z\"\r\n                            stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg><span class=\"ms-2\">Fixture mismatch</span>\r\n                      </div>\r\n                      <div class=\"badge badge-light-warning p-3\" *ngIf=\"pendingFixtureissues>0\">\r\n                        {{pendingFixtureissues}}/{{totalFixtureissues}} action pending\r\n                      </div>\r\n                      <div class=\"badge badge-light-success p-3\"\r\n                        *ngIf=\"approvedFixtureissues>0&&pendingFixtureissues===0\">\r\n                        {{approvedFixtureissues}}/{{totalFixtureissues}} action done\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"d-flex justify-content-between mt-5\">\r\n                      <div class=\"cursor-pointer\"\r\n                        (click)=\"previoustaskFixture(fixturetaskIndex,mergeData?.storeFixtureList)\">\r\n                        <svg *ngIf=\"fixturetaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                          viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M15 6L9 12L15 18\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                        <svg *ngIf=\"!fixturetaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                          viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M15 6L9 12L15 18\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </div>\r\n                      <div class=\"layoutLabel\">\r\n                        {{ mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName}} -\r\n                        {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                        {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                      </div>\r\n                      <div class=\"layoutLabel\">\r\n                        {{fixturetaskIndex+1}}/{{mergeData?.storeFixtureList.length}}\r\n                      </div>\r\n                      <div class=\"cursor-pointer\" (click)=\"nexttaskFixture(fixturetaskIndex,mergeData?.storeFixtureList)\">\r\n                        <svg *ngIf=\"mergeData?.storeFixtureList.length>fixturetaskIndex+1\"\r\n                          xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M9 18L15 12L9 6\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n  \r\n                        <svg *ngIf=\"(mergeData?.storeFixtureList.length)===(fixturetaskIndex+1)\"\r\n                          xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                          <path d=\"M9 18L15 12L9 6\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Fixture name:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCategory\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Fixture Type:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCategory}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value!==''\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Size (Width):</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n  \r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfConfig\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Total shelves:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfConfig?.length}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"row mb-4 mt-2\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCapacity\">\r\n                        <div class=\"col-md-5\">\r\n                          <div class=\"layoutLabel\">Total product capacity:</div>\r\n                        </div>\r\n                        <div class=\"col-md-7\">\r\n                          <div class=\"shelfText breakWord\">\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCapacity}}\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"mt-4\">\r\n                      <div class=\"layoutLabel\">\r\n                        Planogram design\r\n                      </div>\r\n                      <div class=\"grayText\">\r\n                        Fixture designed by the planogram team\r\n                      </div>\r\n                      <div class=\"wall-viewport w-100 mt-5\">\r\n  \r\n                        <div id=\"header-block\" class=\"header-block\">\r\n                          <p>\r\n                            {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                          </p>\r\n                        </div>\r\n                        <div #bodyBlock id=\"bodyBlock\" class=\"body-block\">\r\n                          <ng-container\r\n                            *ngFor=\"let section of mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionKeys;let i=index\">\r\n                            <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                              [style]=\"updateStyle(mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section],i)\">\r\n                              <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                [style]=\"'border:1px solid '+mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.border\">\r\n                                <div class=\"badge\"\r\n                                  *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone\"\r\n                                  [ngStyle]=\"{\r\n                                'background-color':mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.textBg,\r\n                                color:mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.text}\">\r\n                                  {{\r\n                                  mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone}}\r\n                                </div>\r\n                                <ng-template #tooltip>\r\n                                  <div>\r\n                                    <span>{{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                                    </span>\r\n                                  </div>\r\n                                </ng-template>\r\n                                <span class=\"secStyle wordWrap\" [ngbTooltip]=\"tooltip\">{{\r\n                                  mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n                              </div>\r\n                            </div>\r\n                          </ng-container>\r\n                          <div\r\n                            *ngFor=\"let shelfData of mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfDetails; let i = index\" class=\"shelfContainer\">\r\n                            <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\"\r\n                              [ngStyle]=\"{'background-color':(shelfData?.zone || mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData.productResolutionLevel === 'L1') ? mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.bg : shlefColor[i].bg}\">\r\n                              <div class=\"badge\"\r\n                                [ngStyle]=\"{\r\n                                'background-color':(shelfData?.zone || mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData.productResolutionLevel === 'L1') ? mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.textBg : shlefColor[i].textBg,\r\n                                color:(shelfData?.zone || mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData.productResolutionLevel === 'L1') ? mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.text : shlefColor[i].text}\">\r\n                                Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                              </div>\r\n  \r\n                            </div>\r\n  \r\n                          </div>\r\n                        </div>\r\n  \r\n                        <!-- Footer block -->\r\n                        <div class=\"footer-block\">\r\n                          <p> {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\"\r\n                      *ngFor=\"let issues of mergeData?.storeFixtureList[fixturetaskIndex]?.answers;let j = index\">\r\n                      <ng-container>\r\n                        <div ngbAccordionItem=\"{{ 'newdetails-' + k }}\" [collapsed]=\"item.collapsed\" class=\"mb-5\"\r\n                          *ngFor=\"let item of issues.issues;let k = index\">\r\n                          <div class=\"d-flex \" ngbAccordionHeader>\r\n                            <button type=\"button\" ngbAccordionButton class=\"mainheading p-3 backgroundImg\">\r\n                              <span class=\"me-2 layout-Lbel\">\r\n                                <div> <span *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'\"\r\n                                    class=\"d-inline-block bg-warning rounded-circle mx-2\"\r\n                                    style=\"width: 10px; height: 10px;\"></span>{{item?.question}}</div>\r\n                              </span>\r\n                              <div class=\"divider\"></div>\r\n                            </button>\r\n                          </div>\r\n                          <div ngbAccordionCollapse>\r\n                            <div ngbAccordionBody class=\"p-0\">\r\n                              <ng-template>\r\n  \r\n                                <!-- <div class=\"d-flex justify-content-center mt-5\">\r\n    \r\n                                <div class=\"layoutLabel\">\r\n                                  {{ item?.Details[fixtureIndex]?.fixtureName}}\r\n                                </div>\r\n                              </div> -->\r\n                                <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                                  <div class=\"mb-4 mt-2\"\r\n                                    *ngFor=\"let merchDetails of item?.Details[fixtureIndex].merchData;let i = index\">\r\n                                    <div class=\"row mb-4 mt-2\">\r\n                                      <div class=\"col-md-5\">\r\n                                        <div class=\"layoutLabel\">Brand:</div>\r\n                                      </div>\r\n                                      <div class=\"col-md-7\">\r\n                                        <div class=\"shelfText breakWord\">{{merchDetails?.productBrandName || '--'}}\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                    <div class=\"row mb-4 mt-2\">\r\n                                      <div class=\"col-md-5\">\r\n                                        <div class=\"layoutLabel\">Category:</div>\r\n                                      </div>\r\n                                      <div class=\"col-md-7\">\r\n                                        <div class=\"shelfText breakWord\">{{merchDetails?.productCategory?.toString() ||\r\n                                          '--'}}\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n                                  <!-- <div class=\"row mb-4\" *ngIf=\"item?.Details[fixtureIndex]?.fixturetemplateName\">\r\n                                  <div class=\"col-md-5\">\r\n                                    <div class=\"layoutLabel\">Template:</div>\r\n                                  </div>\r\n                                  <div class=\"col-md-7\">\r\n                                    <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixturetemplateName}}\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\"row mb-4\" *ngIf=\"item?.issueType==='sizeWrong'\">\r\n                                  <div class=\"col-md-5\">\r\n                                    <div class=\"layoutLabel\">Size:</div>\r\n                                  </div>\r\n                                  <div class=\"col-md-7\">\r\n                                    <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixtureWidth?.value}}\r\n                                      {{item?.Details[fixtureIndex]?.fixtureWidth?.unit}}\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                                <div *ngIf=\"item?.issueType==='productcategoryWrong'\">\r\n                                  <div *ngFor=\"let missing of item?.Details[fixtureIndex]?.missingData\">\r\n                                    <div class=\"row mb-4\" *ngIf=\"missing?.zone\">\r\n                                      <div class=\"col-md-5\">\r\n                                        <div class=\"layoutLabel\">{{missing?.zone}}:</div>\r\n                                      </div>\r\n    \r\n                                      <div class=\"col-md-7\" *ngFor=\"let category of missing?.productCategory\">\r\n                                        <div class=\"shelfText breakWord badge \">{{category}}\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                                <div *ngIf=\"item?.issueType==='brandWrong'\">\r\n                                  <div *ngFor=\"let missing of item?.Details[fixtureIndex]?.missingData\">\r\n                                    <div class=\"row mb-4\" *ngIf=\"missing?.zone\">\r\n                                      <div class=\"col-md-5\">\r\n                                        <div class=\"layoutLabel\">{{missing?.zone}}:</div>\r\n                                      </div>\r\n                                      <div class=\"col-md-7\">\r\n                                        <div *ngFor=\"let brand of missing?.brand\" class=\"shelfText breakWord badge m-1\"\r\n                                          [ngStyle]=\"{\r\n                                                  'border-radius': '13.843px',\r\n                                                  'background': 'var(--Gray-100, #ebeef3)'}\">\r\n                                          {{brand}}\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n    \r\n                                  </div>\r\n                                </div>\r\n                                <div *ngIf=\"item?.issueType!=='brandWrong'&&item?.issueType!=='productcategoryWrong'\">\r\n    \r\n                                  <div *ngFor=\"let fixtureList of item?.Details[fixtureIndex]?.shelfConfigFormated\">\r\n    \r\n    \r\n                                    <div class=\"row mb-4\">\r\n                                      <div class=\"col-md-3\">\r\n                                        <div class=\"layoutLabel text-capitalize\">{{fixtureList?.zone}}</div>\r\n                                      </div>\r\n                                      <div class=\"col-md-9 mt-5\">\r\n                                        <div class=\"divider\"></div>\r\n                                      </div>\r\n                                    </div>\r\n                                    <div class=\"row\" *ngFor=\"let shlefdata of fixtureList?.items\">\r\n                                      <div class=\"col-md-5\">\r\n                                        <div class=\"layoutLabel text-capitalize\">{{shlefdata?.shelfType}} {{shlefdata?.shelfNumber}}:</div>\r\n                                      </div>\r\n                                      <div class=\"col-md-7\">\r\n                                        <div class=\"shelfText\">\r\n                                          <div class=\"text-capitalize\" >Capacity: <span class=\"layoutLabel\">{{shlefdata?.productPerShelf}}</span></div>\r\n                                          <div class=\"mt-2\" *ngFor=\"let brands of shlefdata?.productBrandName\">\r\n                                            <span class=\"badge badge-secondary me-3 mb-2\">{{brands}}</span>\r\n                                          </div>\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n    \r\n                                  </div>\r\n                                </div> -->\r\n                                </div>\r\n                                <div class=\"mt-4\" *ngIf=\"item?.Details[fixtureIndex].merchData.length\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    Store Response\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    Planogram response by the store team\r\n                                  </div>\r\n                                  <div class=\"wall-viewport w-100 mt-5\"\r\n                                    [style]=\"['Fixture type is wrong','Fixture size is wrong'].includes(item?.question) ? 'border:1px solid red' : ''\">\r\n  \r\n                                    <div id=\"header-block\" class=\"header-block\"\r\n                                      style=\"border: 0.771px solid var(--Gray-400, #98A2B3);background: #F2F3F7;\">\r\n                                      <p>\r\n                                        {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.header?.label ??\r\n                                        ''}}\r\n                                      </p>\r\n                                    </div>\r\n  \r\n  \r\n                                    <div #bodyBlock id=\"bodyBlock\" class=\"body-block\">\r\n  \r\n  \r\n                                      <!-- <ng-container *ngIf=\"['productcategoryWrong', 'brandWrong'].includes(item?.issueType)\">\r\n                                      <div\r\n                                        *ngFor=\"let section of mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionKeys;let i=index\">\r\n                                        <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                                          [style]=\"updateStyle(mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section],i)\">\r\n                                          <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                            style=\"border: 0.969px solid var(--Gray-300, #D0D5DD);\">\r\n                                            <span class=\"badge\" [ngStyle]=\"{\r\n                                              'border-radius': '13.843px',\r\n                                              'background': 'var(--Gray-100, #ebeef3)'}\">{{\r\n                                              mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone}}</span>\r\n                                              <ng-template #tooltip>\r\n                                                <div [ngClass]=\"item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.length ?'danger' : ''\">\r\n                                                  <span>{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.toString() ?? mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.toString()}} </span>\r\n                                                </div>\r\n                                              </ng-template>\r\n                                            <span\r\n                                              class=\"secStyle wordWrap\" [ngbTooltip]=\"tooltip\" [ngClass]=\"item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.length ? 'danger' : ''\">{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.[0] ||\r\n                                              mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n    \r\n                                          </div>\r\n                                        </div>\r\n                                      </div>\r\n                                    </ng-container> -->\r\n                                      <ng-container>\r\n                                        <div *ngFor=\"let section of item?.Details[fixtureIndex]?.sectionKeys;let i=index\">\r\n                                          <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                                            [style]=\"updateStyle(item?.Details[fixtureIndex]?.sectionConfig[section],i)\">\r\n                                            <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                              style=\"border: 0.969px solid var(--Gray-300, #D0D5DD);\">\r\n                                              <span class=\"badge\" [ngStyle]=\"{\r\n                                              'border-radius': '13.843px',\r\n                                              'background': 'var(--Gray-100, #ebeef3)'}\">{{\r\n                                                item?.Details[fixtureIndex]?.sectionConfig[section]?.zone}}</span>\r\n                                              <ng-template #tooltip>\r\n                                                <div>\r\n                                                  <span>{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                                                  </span>\r\n                                                </div>\r\n                                              </ng-template>\r\n                                              <span class=\"secStyle wordWrap\"\r\n                                                [ngbTooltip]=\"tooltip\">{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n  \r\n                                            </div>\r\n                                          </div>\r\n                                        </div>\r\n                                      </ng-container>\r\n  \r\n  \r\n                                      <div\r\n                                        *ngFor=\"let shelfData of item?.Details[fixtureIndex]?.shelfDetails; let i = index\" class=\"shelfContainer\">\r\n  \r\n                                        <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\"\r\n                                          [ngStyle]=\"{\r\n                                        'border-top':(getStartPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig,item?.Details[fixtureIndex].merchData) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question))  ? '2px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                        'border-bottom':(getEndPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig,item?.Details[fixtureIndex].merchData) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? '2px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                        'border-left':(getMidPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig,item?.Details[fixtureIndex].merchData) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? '2px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                        'border-right':(getMidPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig,item?.Details[fixtureIndex].merchData) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? '2px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                        background: 'var(--Gray-100, #f8f9fb)',}\">\r\n                                          <div class=\"badge\" [ngStyle]=\"{\r\n                                                  'border-radius': '13.843px',\r\n                                                  'background': 'var(--Gray-100, #ebeef3)'}\">\r\n                                            Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                                          </div>\r\n  \r\n                                        </div>\r\n  \r\n                                      </div>\r\n                                    </div>\r\n  \r\n  \r\n                                    <div class=\"footer-block\">\r\n                                      <p> {{mergeData?.storeFixtureList[fixturetaskIndex]?.FixtureData?.footer?.label ??\r\n                                        ''}}</p>\r\n                                    </div>\r\n                                  </div>\r\n  \r\n                                </div>\r\n  \r\n                                <div class=\"my-4\" *ngIf=\"item?.comments.length>0\">\r\n                                  <div class=\"assignText\">Comments</div>\r\n                                  <div class=\"d-flex mt-4\" *ngFor=\"let comment of item?.comments?.slice().reverse()\">\r\n                                    <div class=\"symbol symbol-35px symbol-circle\">\r\n                                      <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                          fill=\"none\">\r\n                                          <path\r\n                                            d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                      </span>\r\n                                    </div>\r\n  \r\n                                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                                      <div class=\"\">\r\n                                        <div class=\"layoutLabel\">\r\n                                          {{comment.userName}}\r\n                                        </div>\r\n                                        <div class=\"grayText\">\r\n                                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                        </div>\r\n                                      </div>\r\n                                      <div class=\"assignText breakWord mt-2\">\r\n                                        {{comment?.comment}}\r\n                                      </div>\r\n                                    </div>\r\n                                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                                      <div class=\"\">\r\n                                        <div class=\"layoutLabel\">\r\n                                          {{comment.userName}}\r\n                                        </div>\r\n                                        <div class=\"grayText\">\r\n                                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                        </div>\r\n                                      </div>\r\n                                      <div class=\" breakWord mt-2\">\r\n                                        Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Closed\r\n                                          issue\"</span>\r\n                                        <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Redo\"</span>\r\n                                        <span *ngIf=\"comment?.responsetype==='revoke'\" class=\"assignText\">Revoked</span>\r\n                                      </div>\r\n                                      <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                                        Note: {{comment?.comment}}\r\n                                      </div>\r\n                                    </div>\r\n  \r\n                                  </div>\r\n                                </div>\r\n  \r\n                                <div class=\"mt-5 row\"\r\n                                  *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'&&selectedFixture?.fixtureId\">\r\n                                  <div class=\"d-flex justify-content-end\">\r\n                                    <div class=\"two-tone-btn me-3\"\r\n                                      (click)=\"confirmation('redo',mergeData?.storeFixtureList[fixturetaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]._id,'merchRollout',item.issueType)\">\r\n                                      Mark Redo\r\n                                    </div>\r\n                                    <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                                      (click)=\"confirmation('closeIssue',mergeData?.storeFixtureList[fixturetaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]?._id,'merchRollout',item.issueType)\">Close\r\n                                      Issue</button>\r\n                                  </div>\r\n                                </div>\r\n  \r\n                                <!-- <div class=\"my-4 w-100\"\r\n                                  *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image&&mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image!==''\">\r\n                                  <div class=\"assignText\">Store fixture</div>\r\n                                  <img\r\n                                    src=\"{{cdnUrl}}{{mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image}}\"\r\n                                    alt=\"image\" class=\"mt-4 w-100\" />\r\n                                </div> -->\r\n  \r\n                              </ng-template>\r\n                            </div>\r\n                          </div>\r\n                        </div>\r\n                      </ng-container>\r\n  \r\n                    </div>\r\n                    <div class=\"my-4 w-100\"\r\n                      *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image&&mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image!==''\">\r\n                      <div class=\"assignText\">Store fixture</div>\r\n                      <img src=\"{{cdnUrl}}{{mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.image}}\"\r\n                        alt=\"image\" class=\"mt-4 w-100\" />\r\n                    </div>\r\n                    <div *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.answers?.[0]?.issues?.length===0\">\r\n  \r\n  \r\n                      <div class=\"my-4\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.comments.length>0\">\r\n                        <div class=\"assignText\">Comments</div>\r\n                        <div class=\"d-flex mt-4\"\r\n                          *ngFor=\"let comment of mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.comments?.slice()?.reverse()\">\r\n                          <div class=\"symbol symbol-35px symbol-circle\">\r\n                            <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                fill=\"none\">\r\n                                <path\r\n                                  d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                  stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                            </span>\r\n                          </div>\r\n  \r\n                          <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                            <div class=\"\">\r\n                              <div class=\"layoutLabel\">\r\n                                {{comment.userName}}\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"assignText breakWord mt-2\">\r\n                              {{comment?.comment}}\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                            <div class=\"\">\r\n                              <div class=\"layoutLabel\">\r\n                                {{comment.userName}}\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                              </div>\r\n                            </div>\r\n                            <div class=\" breakWord mt-2\">\r\n                              Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Closed\r\n                                issue\"</span>\r\n                              <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">Redo</span>\r\n                              <span *ngIf=\"comment?.responsetype==='revoke'\" class=\"assignText\">Revoked</span>\r\n                            </div>\r\n                            <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                              Note: {{comment?.comment}}\r\n                            </div>\r\n                          </div>\r\n  \r\n                        </div>\r\n                      </div>\r\n                      <div class=\"mt-5 row\"\r\n                        *ngIf=\"mergeData?.storeFixtureList[fixturetaskIndex]?.approvalStatus==='pending'&&selectedFixture?.fixtureId && !mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?.status\">\r\n                        <div class=\"d-flex justify-content-end\">\r\n                          <div class=\"two-tone-btn me-3\"\r\n                            (click)=\"confirmation('redo',mergeData?.storeFixtureList[fixturetaskIndex]?._id,mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?._id,'','','merchRollout','')\">\r\n                            Mark Redo\r\n                          </div>\r\n                          <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                            (click)=\"confirmation('closeIssue',mergeData?.storeFixtureList[fixturetaskIndex]?._id,mergeData?.storeFixtureList[fixturetaskIndex]?.answers[0]?._id,'','','merchRollout','')\">\r\n                            Close Issue</button>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    \r\n                  </div>\r\n                  <div class=\"my-4\" *ngIf=\"mergeData.comments.length && !selectedFixture?.fixtureId\">\r\n                    <div class=\"assignText\">Comments</div>\r\n                    <div class=\"d-flex mt-4\" *ngFor=\"let comment of mergeData.comments\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                      </div>\r\n  \r\n                      <div class=\"ms-3\">\r\n                        <div class=\"\">\r\n                          <div class=\"layoutLabel\">\r\n                            {{comment?.userName}}\r\n                          </div>\r\n                          <div class=\"grayText\">\r\n                            {{comment?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                          </div>\r\n                        </div>\r\n                        <div class=\"breakWord mt-2\">\r\n                          {{comment?.comment}}\r\n                        </div>\r\n                      </div>\r\n  \r\n  \r\n                    </div>\r\n                  </div>\r\n  \r\n                  <div class=\"mt-5\" *ngIf=\"!loading\">\r\n                     @if (!mergeData?.storeFixtureList.length) {\r\n                      <div class=\"text-center\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n                          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                          <path\r\n                            d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n                            stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n                        </svg>\r\n                      </div>\r\n                      <div class=\"mt-3 text-center\">\r\n                          <div class=\"fw-bold h3 mt-2\">No response</div>\r\n                          <div class=\"mt-4\">Yet to receive store response.</div>\r\n                      </div>\r\n                    }\r\n                  </div>\r\n  \r\n                </ng-template>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </ng-container>\r\n      }\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"mt-5\" *ngIf=\"!loading\">\r\n    @if ((rolloutSection === 'vm' && !vmFeedback.length) || (rolloutSection === 'merch' && !mergeRolloutList.length) ) {\r\n      <div class=\"text-center\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n          <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n          <path\r\n            d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n            stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n        </svg>\r\n      </div>\r\n      <div class=\"mt-3 text-center\">\r\n          <div class=\"fw-bold h3 mt-2\">No task assigned</div>\r\n          <div class=\"mt-4\">Store response viewed here</div>\r\n      </div>\r\n    }\r\n  </div>\r\n</section>","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { TitleCasePipe, Location } from \"@angular/common\";\r\nimport {\r\n  takeUntil,\r\n  Subject,\r\n  firstValueFrom,\r\n  fromEvent,\r\n  debounceTime,\r\n} from \"rxjs\";\r\nimport * as fabric from \"fabric\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { CadSourceService } from \"../../../services/cad-source.service\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { PublishRolloutPopupComponent } from \"../popups/publish-rollout-popup/publish-rollout-popup.component\";\r\nimport { CompleteConfirmationComponent } from \"../../popups/complete-confirmation/complete-confirmation.component\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-rollout\",\r\n  templateUrl: \"./plano-rollout.component.html\",\r\n  styleUrl: \"./plano-rollout.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class PlanoRolloutComponent implements AfterViewInit, OnDestroy, OnInit {\r\n  destroy$ = new Subject();\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n\r\n  clientId: string;\r\n\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  planoData: any;\r\n  floorData: any;\r\n  cdnUrl: string;\r\n  fixtureTemplates: any[] = [];\r\n  storeFeedback: any;\r\n  selectedFixture: any;\r\n  editFixture: boolean = false;\r\n  editFixtureSection: \"basic-details\" | \"products\" | \"vms\" = \"products\";\r\n  selectedFixtureData: any;\r\n  submitFixture = false;\r\n  selectedFloorId = new FormControl(\"\");\r\n  storeMetrics = {\r\n    floorCount: 0,\r\n    fixtureCount: 0,\r\n    vmCount: 0,\r\n  };\r\n\r\n  isPageLoading: boolean = true;\r\n  isRightPanelCollapsed: boolean = false;\r\n\r\n  publishingState: \"merch\" | \"merch-redo\" | \"vm\" | \"vm-redo\";\r\n  disabledPublish: boolean = false;\r\n  taskInfo: any;\r\n  taskStyle = {\r\n    fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n  };\r\n  disableEdit: boolean = true;\r\n  rolloutSection: \"merch\" | \"vm\" = \"merch\";\r\n  storeList: any = [];\r\n  selectedStoreName: any;\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private route: ActivatedRoute,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private toastService: ToastService,\r\n    private modalService: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private location: Location,\r\n    public cadSource: CadSourceService,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  openSourceCad() {\r\n    const storeName = this.floorData?.storeName ?? this.planoData?.storeName;\r\n    this.cadSource.open(storeName, this.floorData?.cadFiles);\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Manage Store Plano\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms/rollout\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  onFixtureSave() {\r\n    this.submitFixture = true;\r\n\r\n    setTimeout(() => {\r\n      this.submitFixture = false;\r\n    }, 100);\r\n  }\r\n\r\n  isSaveButtonDisabled() {\r\n    if (this.rolloutSection === \"vm\" && this.editFixtureSection === \"vms\") {\r\n      return false;\r\n    }\r\n\r\n    if (\r\n      this.rolloutSection === \"merch\" &&\r\n      this.editFixtureSection === \"products\"\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  onFixturePageCancel() {\r\n    this.submitFixture = false;\r\n    this.selectedFixtureData = null;\r\n    this.editFixture = false;\r\n    this.disabledPublish = false;\r\n    this.renderFloor();\r\n  }\r\n\r\n  onFixtureSubmit(event: any) {\r\n    if (!event && !this.selectedFixtureData) return;\r\n\r\n    if (event?.shelf && this.selectedFixtureData) {\r\n      event.shelf = event.shelf.map((shelf: any, index: any) => {\r\n        let findShelf = this.selectedFixtureData.shelfConfig.find(\r\n          (ele: any) => ele.shelfNumber == index + 1,\r\n        );\r\n        if (findShelf) {\r\n          shelf = { ...findShelf, ...shelf };\r\n        } else {\r\n          let details =\r\n            this.selectedFixtureData.shelfConfig[\r\n              this.selectedFixtureData.shelfConfig.length - 1\r\n            ];\r\n          details.shelfNumber = index + 1;\r\n          shelf = { ...details, ...shelf };\r\n        }\r\n        return shelf;\r\n      });\r\n\r\n      this.selectedFixtureData[\"shelfConfig\"] = event?.shelf;\r\n      this.selectedFixtureData[\"description\"] = event?.description ?? \"\";\r\n      this.selectedFixtureData[\"templateGroupName\"] =\r\n        event?.templateGroupName ?? \"\";\r\n      this.selectedFixtureData.header.label = event?.headerLabel ?? \"\";\r\n      this.selectedFixtureData.footer.label = event?.footerLabel ?? \"\";\r\n    } else if (event?.section && this.selectedFixtureData) {\r\n      event.section.forEach((sec: any) => {\r\n        let number = sec?.shelves?.map((ele: any) =>\r\n          parseInt(ele.split(\" \")[1]),\r\n        );\r\n        this.selectedFixtureData?.shelfConfig.forEach((shelf: any) => {\r\n          if (number.includes(shelf.shelfNumber)) {\r\n            shelf.zone = sec.zone;\r\n            shelf.productBrandName = sec.productBrandName;\r\n            shelf.productCategory = sec.productCategory;\r\n          }\r\n        });\r\n      });\r\n    } else if (event?.vmConfig && this.selectedFixtureData) {\r\n      this.selectedFixtureData[\"vmConfig\"] = event?.vmConfig;\r\n    } else {\r\n      if (event) {\r\n        // this.floorData = null;\r\n        this.selectedFixtureData = null;\r\n        // this.editFixtureSection = \"basic-details\";\r\n        this.editFixture = false;\r\n        this.getStoreFixtures(this.planoData?._id);\r\n      }\r\n    }\r\n  }\r\n\r\n  async getStoreFeedback(\r\n    planoId: string,\r\n    floorId: string,\r\n    filter: any,\r\n    ckeckPublishState: boolean = true,\r\n  ) {\r\n    try {\r\n      let data: any = {\r\n        planoId: planoId,\r\n        floorId: floorId,\r\n        // showtask:true\r\n      };\r\n      if (filter) {\r\n        data = { ...data, ...filter, type: this.rolloutSection };\r\n      }\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getRolloutFeedback(data),\r\n      );\r\n\r\n      this.storeFeedback = res.data;\r\n      if (this.rolloutSection === \"merch\") {\r\n        if (res.data?.merchRolloutData?.length) {\r\n          this.processMerchRolloutFeedback(res.data.merchRolloutData, filter);\r\n        } else {\r\n          this.processMerchRolloutFeedback([]);\r\n        }\r\n      }\r\n\r\n      if (this.rolloutSection === \"vm\") {\r\n        if (res.data?.vmRolloutData?.length) {\r\n          this.processVmRolloutFeedback(res.data.vmRolloutData, filter);\r\n        } else {\r\n          this.processVmRolloutFeedback([]);\r\n        }\r\n      }\r\n\r\n      if (ckeckPublishState) {\r\n        this.calculatePublishingState();\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getStoreFeedback [ERR]:\", error);\r\n      this.toastService.getErrorToast(\"Failed to fetch store feedback\");\r\n    }\r\n  }\r\n\r\n  calculatePublishingState() {\r\n    if (this.rolloutSection === \"merch\") {\r\n      this.publishingState = \"merch\";\r\n      if (this.storeFeedback?.merchRolloutData.length) {\r\n        const fixtureFeedback = this.storeFeedback?.merchRolloutData[\r\n          this.storeFeedback?.merchRolloutData.length - 1\r\n        ]?.storeFixtureList?.filter(\r\n          (feedback: any) => feedback.type === \"merchRollout\",\r\n        );\r\n        let hasDisagree = false;\r\n        // const allFixturesCompleted = fixtureFeedback.every((feedback: any) => feedback.status === 'complete')\r\n\r\n        // if (allFixturesCompleted) {\r\n        //   this.publishingState = 'vm'\r\n        //   return\r\n        // }\r\n\r\n        for (let i = 0; i < fixtureFeedback.length; i++) {\r\n          const issues = fixtureFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n          if (issues?.length) {\r\n            for (let j = 0; j < issues.length; j++) {\r\n              const issue = issues[j];\r\n              const details = issue?.Details || [];\r\n\r\n              if (\r\n                details.some((fixture: any) => fixture.status === \"disagree\")\r\n              ) {\r\n                hasDisagree = true;\r\n                break;\r\n              }\r\n            }\r\n          } else {\r\n            if (\r\n              fixtureFeedback?.[i]?.answers.some(\r\n                (fixture: any) => fixture.status === \"disagree\",\r\n              )\r\n            ) {\r\n              hasDisagree = true;\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (hasDisagree) break;\r\n        }\r\n\r\n        if (hasDisagree) {\r\n          this.publishingState = \"merch-redo\";\r\n          return;\r\n        }\r\n      }\r\n    }\r\n    if (this.rolloutSection === \"vm\") {\r\n      this.publishingState = \"vm\";\r\n      if (this.storeFeedback?.vmRolloutData.length) {\r\n        const vmFeedback = this.storeFeedback?.vmRolloutData[\r\n          this.storeFeedback?.vmRolloutData.length - 1\r\n        ].storeFixtureList.filter(\r\n          (feedback: any) => feedback.type === \"vmRollout\",\r\n        );\r\n        // const allFixturesCompleted = vmFeedback.every((feedback: any) => feedback.status === 'complete')\r\n\r\n        // if (allFixturesCompleted) {\r\n        //   this.publishingState = 'complete'\r\n        //   return\r\n        // }\r\n\r\n        let hasDisagree = false;\r\n\r\n        for (let i = 0; i < vmFeedback.length; i++) {\r\n          const issues = vmFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n          if (issues?.length) {\r\n            for (let j = 0; j < issues.length; j++) {\r\n              const issue = issues[j];\r\n              const details = issue?.Details || [];\r\n\r\n              if (\r\n                details.some((fixture: any) => fixture.status === \"disagree\")\r\n              ) {\r\n                hasDisagree = true;\r\n                break;\r\n              }\r\n            }\r\n          } else {\r\n            if (\r\n              vmFeedback?.[i]?.answers.some(\r\n                (fixture: any) => fixture.status === \"disagree\",\r\n              )\r\n            ) {\r\n              hasDisagree = true;\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (hasDisagree) break;\r\n        }\r\n\r\n        if (hasDisagree) {\r\n          this.publishingState = \"vm-redo\";\r\n          return;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  processMerchRolloutFeedback(storeFeedback: any[], filter?: any) {\r\n    const fixtureFeedback = storeFeedback[\r\n      storeFeedback.length - 1\r\n    ]?.storeFixtureList?.filter(\r\n      (feedback: any) => feedback.type === \"merchRollout\",\r\n    );\r\n\r\n    if (fixtureFeedback?.length) {\r\n      for (let i = 0; i < fixtureFeedback.length; i++) {\r\n        const issues = fixtureFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n        if (fixtureFeedback?.[i]?.status === \"complete\") {\r\n          const targetFixtureId = fixtureFeedback?.[i]?.fixtureId;\r\n\r\n          for (const wallElement of this.floorData.layoutPolygon) {\r\n            if (\r\n              wallElement.elementType !== \"wall\" ||\r\n              !Array.isArray(wallElement.fixtures)\r\n            )\r\n              continue;\r\n\r\n            const fixtureIndex = wallElement.fixtures.findIndex(\r\n              (f: any) => f._id === targetFixtureId,\r\n            );\r\n            if (fixtureIndex !== -1) {\r\n              wallElement.fixtures[fixtureIndex] = {\r\n                ...wallElement.fixtures[fixtureIndex],\r\n                complete:\r\n                  fixtureFeedback?.[i]?.answers?.[0]?.status === \"disagree\"\r\n                    ? false\r\n                    : true,\r\n                approvalStatus:\r\n                  fixtureFeedback?.[i]?.approvalStatus === \"approved\"\r\n                    ? true\r\n                    : false,\r\n                issueData: issues,\r\n                taskType: \"merchRollout\",\r\n              };\r\n\r\n              break;\r\n            }\r\n          }\r\n\r\n          const centerFixtures = this.floorData.centerFixture;\r\n\r\n          const fixtureIndex = centerFixtures.findIndex(\r\n            (f: any) => f._id === targetFixtureId,\r\n          );\r\n\r\n          if (fixtureIndex !== -1) {\r\n            centerFixtures[fixtureIndex] = {\r\n              ...centerFixtures[fixtureIndex],\r\n              complete:\r\n                fixtureFeedback?.[i]?.answers?.[0]?.status === \"disagree\"\r\n                  ? false\r\n                  : true,\r\n              approvalStatus:\r\n                fixtureFeedback?.[i]?.approvalStatus === \"approved\"\r\n                  ? true\r\n                  : false,\r\n              issueData: issues,\r\n              taskType: \"merchRollout\",\r\n            };\r\n          }\r\n        }\r\n\r\n        if (issues?.length) {\r\n          for (let j = 0; j < issues.length; j++) {\r\n            const issue = issues[j];\r\n\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"merchRollout\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"merchRollout\",\r\n                };\r\n              }\r\n            }\r\n          }\r\n        }\r\n        // }\r\n      }\r\n    }\r\n    if (!filter || !Object.keys(filter).length) {\r\n      // this.reorderFixtureMeta(this.floorData)\r\n      this.drawInitialContent();\r\n    }\r\n  }\r\n\r\n  processVmRolloutFeedback(storeFeedback: any[], filter?: any) {\r\n    const fixtureFeedback = storeFeedback[\r\n      storeFeedback.length - 1\r\n    ]?.storeFixtureList?.filter(\r\n      (feedback: any) => feedback.type === \"vmRollout\",\r\n    );\r\n    if (fixtureFeedback?.length) {\r\n      for (let i = 0; i < fixtureFeedback?.length; i++) {\r\n        const issues = fixtureFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n        if (fixtureFeedback?.[i]?.status === \"complete\") {\r\n          const targetFixtureId = fixtureFeedback?.[i]?.fixtureId;\r\n\r\n          for (const wallElement of this.floorData.layoutPolygon) {\r\n            if (\r\n              wallElement.elementType !== \"wall\" ||\r\n              !Array.isArray(wallElement.fixtures)\r\n            )\r\n              continue;\r\n\r\n            const fixtureIndex = wallElement.fixtures.findIndex(\r\n              (f: any) => f._id === targetFixtureId,\r\n            );\r\n\r\n            if (fixtureIndex !== -1) {\r\n              wallElement.fixtures[fixtureIndex] = {\r\n                ...wallElement.fixtures[fixtureIndex],\r\n                complete:\r\n                  fixtureFeedback?.[i]?.answers?.[0]?.status === \"disagree\"\r\n                    ? false\r\n                    : true,\r\n                approvalStatus:\r\n                  fixtureFeedback?.[i]?.approvalStatus === \"approved\"\r\n                    ? true\r\n                    : false,\r\n                issueData: issues,\r\n                taskType: \"vmRollout\",\r\n              };\r\n\r\n              break;\r\n            }\r\n          }\r\n\r\n          const centerFixtures = this.floorData.centerFixture;\r\n\r\n          const fixtureIndex = centerFixtures.findIndex(\r\n            (f: any) => f._id === targetFixtureId,\r\n          );\r\n\r\n          if (fixtureIndex !== -1) {\r\n            centerFixtures[fixtureIndex] = {\r\n              ...centerFixtures[fixtureIndex],\r\n              complete:\r\n                fixtureFeedback?.[i]?.answers?.[0]?.status === \"disagree\"\r\n                  ? false\r\n                  : true,\r\n              approvalStatus:\r\n                fixtureFeedback?.[i]?.approvalStatus === \"approved\"\r\n                  ? true\r\n                  : false,\r\n              issueData: issues,\r\n              taskType: \"vmRollout\",\r\n            };\r\n          }\r\n        }\r\n\r\n        if (issues?.length) {\r\n          for (let j = 0; j < issues.length; j++) {\r\n            const issue = issues[j];\r\n\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"vmRollout\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"vmRollout\",\r\n                };\r\n              }\r\n            }\r\n          }\r\n          // }\r\n        }\r\n      }\r\n    }\r\n    if (!filter || !Object.keys(filter).length) {\r\n      // this.reorderFixtureMeta(this.floorData);\r\n      this.drawInitialContent();\r\n    }\r\n  }\r\n\r\n  clearRolloutData() {\r\n    this.floorData?.layoutPolygon?.forEach((element: any) => {\r\n      element?.fixtures?.forEach((fixture: any) => {\r\n        fixture.issue = null;\r\n        fixture.issues = null;\r\n        fixture.taskType = null;\r\n        fixture.complete = null;\r\n      });\r\n    });\r\n\r\n    this.floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.issue = null;\r\n      fixture.issues = null;\r\n      fixture.taskType = null;\r\n      fixture.complete = null;\r\n    });\r\n  }\r\n\r\n  reorderFixtureMeta(floorData: any) {\r\n    const mmToFeet = 305;\r\n    const w1Fixtures = floorData.layoutPolygon.find(\r\n      (wall: any) => wall.elementType === \"wall\" && wall.elementNumber === 1,\r\n    )?.fixtures;\r\n    const w1FixturesX = w1Fixtures.reduce(\r\n      (sum: number, fixture: any) =>\r\n        sum + fixture.fixtureStaticWidth.value / mmToFeet,\r\n      0,\r\n    );\r\n    const w1FixturesY = w1Fixtures.reduce(\r\n      (max: number, fixture: any) =>\r\n        Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n      0,\r\n    );\r\n    const w2Fixtures = floorData.layoutPolygon.find(\r\n      (wall: any) => wall.elementType === \"wall\" && wall.elementNumber === 2,\r\n    )?.fixtures;\r\n    const w2FixturesX = w2Fixtures.reduce(\r\n      (max: number, fixture: any) =>\r\n        Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n      0,\r\n    );\r\n    const w2FixturesY = w2Fixtures.reduce(\r\n      (sum: number, fixture: any) =>\r\n        sum + fixture.fixtureStaticLength.value / mmToFeet,\r\n      0,\r\n    );\r\n    const w3Fixtures = floorData.layoutPolygon.find(\r\n      (wall: any) => wall.elementType === \"wall\" && wall.elementNumber === 3,\r\n    )?.fixtures;\r\n    const w3FixturesX = w3Fixtures.reduce(\r\n      (sum: number, fixture: any) =>\r\n        sum + fixture.fixtureStaticWidth.value / mmToFeet,\r\n      0,\r\n    );\r\n    const w3FixturesY = w3Fixtures.reduce(\r\n      (max: number, fixture: any) =>\r\n        Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n      0,\r\n    );\r\n    const w4Fixtures = floorData.layoutPolygon.find(\r\n      (wall: any) => wall.elementType === \"wall\" && wall.elementNumber === 4,\r\n    )?.fixtures;\r\n    const w4FixturesX = w4Fixtures.reduce(\r\n      (max: number, fixture: any) =>\r\n        Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n      0,\r\n    );\r\n    const w4FixturesY = w4Fixtures.reduce(\r\n      (sum: number, fixture: any) =>\r\n        sum + fixture.fixtureStaticLength.value / mmToFeet,\r\n      0,\r\n    );\r\n    const w5Fixtures = floorData.layoutPolygon.find(\r\n      (wall: any) => wall.elementType === \"wall\" && wall.elementNumber === 5,\r\n    )?.fixtures;\r\n    const w5FixturesX = w5Fixtures.reduce(\r\n      (max: number, fixture: any) =>\r\n        Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n      0,\r\n    );\r\n    const w5FixturesY = w5Fixtures.reduce(\r\n      (sum: number, fixture: any) =>\r\n        sum + fixture.fixtureStaticLength.value / mmToFeet,\r\n      0,\r\n    );\r\n    const cFixtures = floorData.centerFixture;\r\n    const cFixturesX =\r\n      cFixtures.length *\r\n      cFixtures.reduce(\r\n        (max: number, fixture: any) =>\r\n          Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n        0,\r\n      );\r\n    const cFixturesY =\r\n      2 *\r\n      cFixtures.reduce(\r\n        (max: number, fixture: any) =>\r\n          Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n        0,\r\n      );\r\n    const entranceY = 10;\r\n\r\n    let minXDistance = Math.max(w1FixturesX, cFixturesX, w3FixturesX);\r\n    if (w2Fixtures.length) {\r\n      minXDistance += w2Fixtures.reduce(\r\n        (max: number, fixture: any) =>\r\n          Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n        0,\r\n      );\r\n    }\r\n\r\n    if (w4Fixtures.length || w5Fixtures.length) {\r\n      if (w4Fixtures.length && w5Fixtures.length) {\r\n        minXDistance += w5Fixtures.reduce(\r\n          (max: number, fixture: any) =>\r\n            Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n          0,\r\n        );\r\n      } else if (w4Fixtures.length) {\r\n        minXDistance += w4Fixtures.reduce(\r\n          (max: number, fixture: any) =>\r\n            Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n          0,\r\n        );\r\n      } else if (w5Fixtures.length) {\r\n        minXDistance += w5Fixtures.reduce(\r\n          (max: number, fixture: any) =>\r\n            Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet),\r\n          0,\r\n        );\r\n      }\r\n    }\r\n\r\n    // if(cFixtures.length){\r\n    //   minXDistance += 2 * (cFixtures.reduce((max: number, fixture: any) => Math.max(max, fixture.fixtureStaticWidth.value / mmToFeet), 0))\r\n    // }\r\n\r\n    let minYDistance = Math.max(\r\n      w2FixturesY,\r\n      cFixturesY,\r\n      w4FixturesY + w5FixturesY + entranceY,\r\n    );\r\n    if (w1Fixtures.length) {\r\n      minYDistance += w1Fixtures.reduce(\r\n        (max: number, fixture: any) =>\r\n          Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n        0,\r\n      );\r\n    }\r\n\r\n    if (w3Fixtures.length) {\r\n      minYDistance += w3Fixtures.reduce(\r\n        (max: number, fixture: any) =>\r\n          Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n        0,\r\n      );\r\n    }\r\n\r\n    if (cFixtures.length) {\r\n      minYDistance +=\r\n        2 *\r\n        cFixtures.reduce(\r\n          (max: number, fixture: any) =>\r\n            Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n          0,\r\n        );\r\n    }\r\n\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\" && element.elementNumber === 1) {\r\n        element.distance = this.roundToTwo(minXDistance);\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 2\r\n      ) {\r\n        element.distance = this.roundToTwo(minYDistance);\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 3\r\n      ) {\r\n        element.distance = this.roundToTwo(minXDistance);\r\n      } else if (\r\n        (element.elementType === \"wall\" &&\r\n          (element.elementNumber === 4 || element.elementNumber === 5)) ||\r\n        (element.elementType === \"entrance\" && element.elementNumber === 1)\r\n      ) {\r\n        let w4Length = w4Fixtures?.length\r\n          ? (w4Fixtures.length + 1) *\r\n            w4Fixtures.reduce(\r\n              (max: number, fixture: any) =>\r\n                Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n              0,\r\n            )\r\n          : 0;\r\n\r\n        const w5Length = w5Fixtures?.length\r\n          ? (w5Fixtures.length + 1) *\r\n            w5Fixtures.reduce(\r\n              (max: number, fixture: any) =>\r\n                Math.max(max, fixture.fixtureStaticLength.value / mmToFeet),\r\n              0,\r\n            )\r\n          : 0;\r\n\r\n        const usedY = w4Length + w5Length;\r\n        const remainingY = Math.max(minYDistance - usedY, 0);\r\n\r\n        const w4Empty = w4Length === 0;\r\n        const w5Empty = w5Length === 0;\r\n\r\n        let entranceLength = 0;\r\n        let w4Final = w4Length;\r\n        let w5Final = w5Length;\r\n\r\n        if (w4Empty && w5Empty) {\r\n          w4Final = w5Final = entranceLength = minYDistance / 3;\r\n        } else if (w4Empty && !w5Empty) {\r\n          w5Final = w5Length;\r\n          w4Final = remainingY / 2;\r\n          entranceLength = remainingY / 2;\r\n        } else if (!w4Empty && w5Empty) {\r\n          w4Final = w4Length;\r\n          w5Final = remainingY / 2;\r\n          entranceLength = remainingY / 2;\r\n        } else {\r\n          entranceLength = remainingY;\r\n        }\r\n\r\n        if (element.elementType === \"wall\" && element.elementNumber === 4) {\r\n          element.distance = this.roundToTwo(w4Final);\r\n        } else if (\r\n          element.elementType === \"wall\" &&\r\n          element.elementNumber === 5\r\n        ) {\r\n          element.distance = this.roundToTwo(w5Final);\r\n        } else if (\r\n          element.elementType === \"entrance\" &&\r\n          element.elementNumber === 1\r\n        ) {\r\n          element.distance = this.roundToTwo(entranceLength);\r\n        }\r\n      }\r\n    });\r\n\r\n    let fixtureNumber = 1;\r\n\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\" && element.elementNumber === 1) {\r\n        let wallAssociatedIndex = 1;\r\n        let currentX = 0;\r\n        let currentY = 0;\r\n        element.fixtures.forEach((fixture: any, i: number) => {\r\n          currentX = (fixture.fixtureStaticWidth.value / mmToFeet) * i;\r\n          if (w5Fixtures.length) {\r\n            currentX += fixture.fixtureStaticWidth.value / mmToFeet;\r\n          }\r\n          fixture.relativePosition.x = this.roundToTwo(currentX);\r\n          fixture.relativePosition.y = this.roundToTwo(currentY);\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = 1;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 2\r\n      ) {\r\n        let wallAssociatedIndex = 1;\r\n        let currentX = floorData.layoutPolygon.find(\r\n          (wall: any) =>\r\n            wall.elementType === \"wall\" && wall.elementNumber === 1,\r\n        )?.distance;\r\n        let currentY = 0;\r\n        element.fixtures.forEach((fixture: any, i: number) => {\r\n          currentY = (fixture.fixtureStaticLength.value / mmToFeet) * i;\r\n          if (w1Fixtures.length) {\r\n            currentY += fixture.fixtureStaticLength.value / mmToFeet;\r\n          }\r\n          fixture.relativePosition.x = this.roundToTwo(\r\n            currentX - fixture.fixtureStaticWidth.value / mmToFeet,\r\n          );\r\n          fixture.relativePosition.y = this.roundToTwo(currentY);\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = 2;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 3\r\n      ) {\r\n        let wallAssociatedIndex = 1;\r\n        let currentX = 0;\r\n        let currentY = floorData.layoutPolygon.find(\r\n          (wall: any) =>\r\n            wall.elementType === \"wall\" && wall.elementNumber === 2,\r\n        )?.distance;\r\n        element.fixtures.forEach((fixture: any, i: number) => {\r\n          currentX = (fixture.fixtureStaticWidth.value / mmToFeet) * i;\r\n          if (w4Fixtures.length) {\r\n            currentX += fixture.fixtureStaticWidth.value / mmToFeet;\r\n          }\r\n          fixture.relativePosition.x = this.roundToTwo(currentX);\r\n          fixture.relativePosition.y = this.roundToTwo(\r\n            currentY - fixture.fixtureStaticLength.value / mmToFeet,\r\n          );\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = 3;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 4\r\n      ) {\r\n        let wallAssociatedIndex = 1;\r\n        let currentX = 0;\r\n        let currentY =\r\n          floorData.layoutPolygon.find(\r\n            (wall: any) =>\r\n              wall.elementType === \"wall\" && wall.elementNumber === 5,\r\n          )?.distance +\r\n          floorData.layoutPolygon.find(\r\n            (wall: any) =>\r\n              wall.elementType === \"entrance\" && wall.elementNumber === 1,\r\n          )?.distance;\r\n\r\n        element.fixtures.forEach((fixture: any, i: number) => {\r\n          fixture.relativePosition.x = this.roundToTwo(currentX);\r\n          fixture.relativePosition.y = this.roundToTwo(\r\n            currentY + (fixture.fixtureStaticLength.value / mmToFeet) * i,\r\n          );\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = 4;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      } else if (\r\n        element.elementType === \"wall\" &&\r\n        element.elementNumber === 5\r\n      ) {\r\n        let wallAssociatedIndex = 1;\r\n        let currentX = 0;\r\n        let currentY = 0;\r\n        element.fixtures.forEach((fixture: any, i: number) => {\r\n          currentY =\r\n            (fixture.fixtureStaticLength.value / mmToFeet) * i +\r\n            fixture.fixtureStaticLength.value / mmToFeet;\r\n          fixture.relativePosition.x = this.roundToTwo(currentX);\r\n          fixture.relativePosition.y = this.roundToTwo(currentY);\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = 5;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    const maxFixturesPerRow = floorData.centerFixture.length / 2;\r\n    const totalRows = 2;\r\n    const centerRow = Math.floor(totalRows / 2);\r\n\r\n    let floorAssociatedIndex = 1;\r\n\r\n    floorData.centerFixture.forEach((fixture: any, index: number) => {\r\n      const startX =\r\n        minXDistance / 2 -\r\n        (maxFixturesPerRow / 2) * (fixture.fixtureStaticWidth.value / mmToFeet);\r\n      const srartY =\r\n        minYDistance / 2 -\r\n        centerRow * (fixture.fixtureStaticLength.value / mmToFeet);\r\n\r\n      const colIndex = Math.floor(index / 2);\r\n      const rowIndex = index % 2 === 0 ? 1 : 0;\r\n\r\n      const currentX =\r\n        startX + colIndex * (fixture.fixtureStaticWidth.value / mmToFeet);\r\n      const currentY =\r\n        srartY + rowIndex * (fixture.fixtureStaticLength.value / mmToFeet);\r\n\r\n      fixture.relativePosition.x = this.roundToTwo(currentX);\r\n      fixture.relativePosition.y = this.roundToTwo(currentY);\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  roundToTwo(num: number) {\r\n    return Math.round(num * 100) / 100;\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string, resetSelection: boolean = true) {\r\n    try {\r\n      this.isPageLoading = true;\r\n      if (!this.fixtureTemplates.length) {\r\n        await this.getFixtureTemplates();\r\n      }\r\n\r\n      if (resetSelection) {\r\n        this.selectedFixture = null;\r\n      }\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getStoreFixtures({ id: [storeId] }),\r\n      );\r\n\r\n      if (!res?.data?.[0]?.floors?.length) {\r\n        return;\r\n      }\r\n\r\n      this.planoData = structuredClone(res.data[0]);\r\n      this.planoData.floors = this.planoData.floors.filter(\r\n        (floor: any) => floor.planoProgress === 100,\r\n      );\r\n      res.data[0].floors = this.planoData.floors;\r\n      if (this.floorData?._id) {\r\n        this.floorData = structuredClone(\r\n          res.data[0].floors.find(\r\n            (floor: any) => floor?._id === this.floorData?._id,\r\n          ),\r\n        );\r\n      } else {\r\n        this.floorData = structuredClone(res.data[0].floors[0]);\r\n      }\r\n      this.selectedFloorId.setValue(this.floorData._id, {\r\n        emitEvent: false,\r\n      });\r\n\r\n      this.storeMetrics.floorCount = this.planoData?.floors?.length;\r\n\r\n      this.renderFloor();\r\n\r\n      await Promise.all([\r\n        this.getStoreFeedback(this.floorData.planoId, this.floorData._id, {}),\r\n        this.taskDetails(this.floorData.planoId, this.floorData._id)\r\n      ])\r\n\r\n      this.isPageLoading = false;\r\n    } catch (error) {\r\n      this.isPageLoading = false;\r\n      this.toastService.getErrorToast(\"Failed to fetch plano\");\r\n      console.log(\"@@ ~ getSToreFixtures [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  renderFloor() {\r\n    this.storeMetrics.fixtureCount = this.floorData.fixtureCount;\r\n    this.storeMetrics.vmCount = this.floorData.vmCount;\r\n    this.drawInitialContent();\r\n    this.resizeCanvasToParentSize();\r\n  }\r\n\r\n  async getFixtureTemplates(): Promise<void> {\r\n    const payload = {\r\n      clientId: this.clientId,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getAllTemplates(payload),\r\n      );\r\n      const data = res?.data;\r\n\r\n      if (data) {\r\n        this.fixtureTemplates = data.map((t: any) => {\r\n          return {\r\n            _id: t._id,\r\n            name: `${t.fixtureName} - ${t.fixtureWidth.value} ${t.fixtureWidth.unit}`,\r\n            subtext: `${t.productBrandName?.join(\", \")}`,\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Error fetching fixture templates:\", error);\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 1000,\r\n      width: 1000,\r\n    });\r\n\r\n    this.setupZoomHandlers();\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.planoId) {\r\n          this.getStoreFixtures(params?.planoId);\r\n          this.getStoreList(params?.planoId);\r\n          if (params?.floorId) {\r\n            this.floorData = { _id: params?.floorId };\r\n          }\r\n        }\r\n      });\r\n\r\n    this.selectedFloorId.valueChanges.subscribe((id) => {\r\n      this.floorData = null;\r\n      this.floorData = this.planoData?.floors?.find(\r\n        (floor: any) => floor._id === id,\r\n      );\r\n      this.renderFloor();\r\n      this.getStoreFeedback(this.floorData.planoId, this.floorData._id, {});\r\n      this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n    });\r\n\r\n    fromEvent(window, \"resize\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(() => this.resizeCanvasToParentSize());\r\n  }\r\n\r\n  resizeCanvasToParentSize() {\r\n    setTimeout(() => {\r\n      const canvasCol = document.getElementById(\"canvas-card\") as HTMLElement;\r\n      if (canvasCol) {\r\n        const width = canvasCol.offsetWidth - 32;\r\n        const height = canvasCol.offsetHeight - 32;\r\n        this.changeCanvasSize(width, height);\r\n      }\r\n    }, 300);\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  async handleApproverResponse(response: any) {\r\n    const targetFixture = structuredClone(this.selectedFixture);\r\n    if (\r\n      response?.filterByTask?.length > 0 ||\r\n      response?.filterByStatus?.length > 0 ||\r\n      response?.filterByApprovalStatus?.length > 0\r\n    ) {\r\n      this.floorData = structuredClone(\r\n        this.planoData.floors.find(\r\n          (floor: any) => floor._id === this.floorData._id,\r\n        ),\r\n      );\r\n      this.getStoreFeedback(\r\n        this.floorData.planoId,\r\n        this.floorData._id,\r\n        response,\r\n        false,\r\n      );\r\n      return;\r\n    }\r\n\r\n    if (response?.reload) {\r\n      this.floorData = null;\r\n      await this.getStoreFixtures(this.planoData._id, false);\r\n      this.selectedFixture = targetFixture;\r\n      return;\r\n    }\r\n\r\n    let feedback;\r\n\r\n    if (this.selectedFixture?.taskType === \"merchRollout\") {\r\n      feedback = this.storeFeedback?.merchRolloutData[\r\n        this.storeFeedback?.merchRolloutData.length - 1\r\n      ].storeFixtureList?.find((task: any) => task._id === response._id);\r\n    }\r\n\r\n    if (this.selectedFixture?.taskType === \"vmRollout\") {\r\n      feedback = this.storeFeedback?.vmRolloutData[\r\n        this.storeFeedback?.vmRolloutData.length - 1\r\n      ].storeFixtureList?.find((task: any) => task._id === response._id);\r\n    }\r\n\r\n    if (!feedback) return;\r\n\r\n    const answer = feedback?.answers?.find(\r\n      (answer: any) => answer._id === response.answerId,\r\n    );\r\n\r\n    if (!answer) return;\r\n    const issue = answer.issues.find(\r\n      (issue: any) => issue._id === response.issueId,\r\n    );\r\n    let detail;\r\n    if (issue) {\r\n      detail = issue?.Details.find(\r\n        (detail: any) => detail._id === response.DetailsId,\r\n      );\r\n    }\r\n\r\n    const meta = {\r\n      _id: feedback._id,\r\n      answerId: answer?._id ?? \"\",\r\n      issueId: issue?._id ?? \"\",\r\n      DetailsId: detail?._id ?? \"\",\r\n      type: response.type,\r\n      comments: response.comments,\r\n      taskType: this.selectedFixture.taskType,\r\n      planoId: response?.planoId,\r\n      floorId: response?.floorId,\r\n      fixtureId: response?.fixtureId,\r\n    };\r\n\r\n    try {\r\n      const result: any = await firstValueFrom(\r\n        this.apiService.updateRolloutStatus(meta),\r\n      );\r\n      if (result) {\r\n        this.floorData = null;\r\n        await this.getStoreFixtures(this.planoData._id, false);\r\n        this.selectedFixture = targetFixture;\r\n      }\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\"Failed to update task\");\r\n    }\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    this.canvas.clear();\r\n    await this.drawLayoutElements();\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9; // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom; // center Y\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (\r\n      let index = 0;\r\n      index < this.floorData?.layoutPolygon?.length;\r\n      index++\r\n    ) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        // const elementsGroup: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = this.drawLabeledRectangle(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            w,\r\n            h,\r\n            otherElement,\r\n          );\r\n\r\n          // elementsGroup.push(fixtureObj as fabric.Group);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureObj = this.drawLabeledRectangle(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        w,\r\n        h,\r\n        otherElement,\r\n      );\r\n\r\n      // elementsGroup.push(fixtureObj as fabric.Group);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  reorderFixture(floorData: any) {\r\n    let fixtureNumber = 1;\r\n\r\n    // Walls\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\") {\r\n        let wallAssociatedIndex = 1;\r\n\r\n        element.fixtures.forEach((fixture: any) => {\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = element.elementNumber;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    // Center floor fixtures\r\n    let floorAssociatedIndex = 1;\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let primaryStroke = \"#a5a6a8\";\r\n    let primaryFill = \"#f3f4f8\";\r\n    let headerColor = \"#101828\";\r\n    let vmFill = \"#a5a6a8\";\r\n    let footerFill = \"#f3f4f8\";\r\n\r\n    if (\r\n      (this.rolloutSection === \"merch\" && fixtureData.isMerchEdited) ||\r\n      (this.rolloutSection === \"vm\" && fixtureData.isVmEdited)\r\n    ) {\r\n      primaryStroke = \"#6BCAFF\";\r\n      primaryFill = \"#EAF8FF\";\r\n      headerColor = \"#101828\";\r\n      vmFill = \"#6938EF\";\r\n      footerFill = \"#f3f4f8\";\r\n    }\r\n    if (fixtureData.complete === true) {\r\n      // if !fixtureData.approvalStatus) {\r\n      //   primaryStroke = \"#6BCAFF\";\r\n      //   primaryFill = \"#EAF8FF\";\r\n      //   headerColor = \"#101828\";\r\n      //   vmFill = \"#6938EF\";\r\n      //   footerFill = \"#f3f4f8\";\r\n      if (!fixtureData.approvalStatus) {\r\n        primaryStroke = \"#6CE9A6\";\r\n        primaryFill = \"#6CE9A6\";\r\n        footerFill = \"#6CE9A6\";\r\n        vmFill = \"#6938EF\";\r\n        headerColor = \"#101828\";\r\n      }\r\n    }\r\n    if (fixtureData.issue === true) {\r\n      primaryStroke = \"#D92D20\";\r\n      primaryFill = \"#D92D20\";\r\n      headerColor = \"#FFF\";\r\n      footerFill = \"#FEE4E2\";\r\n      vmFill = \"#6938EF\";\r\n    }\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n\r\n      // Selection styling\r\n      borderColor: \"green\", // selection outline color\r\n      cornerColor: \"red\", // resize handle color\r\n      cornerStrokeColor: \"black\", // border around corner squares\r\n      cornerSize: 10, // resize handle size\r\n      transparentCorners: false, // solid instead of hollow\r\n      borderScaleFactor: 3,\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: primaryFill,\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: headerColor,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: primaryStroke,\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: primaryStroke,\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: primaryStroke,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            // fill:isEdited ? '#6938EF' : '#a5a6a8',\r\n            fill: vmFill,\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: footerFill,\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        heigth: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        selectable: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        hasControls: false,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      if (target) {\r\n        this.selectedFixture = {\r\n          fixtureType: target.fixtureType,\r\n          wallIndex: target.wallIndex,\r\n          fixtureIndex: target.fixtureIndex,\r\n          fixtureId: target.fixtureId,\r\n          issue: target.issue,\r\n          issueData: target.issueData,\r\n          taskType: target.taskType,\r\n          isMerchEdited: fixtureData?.isMerchEdited,\r\n          isVmEdited: fixtureData?.isVmEdited,\r\n        };\r\n      }\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    const svgString = `\r\n<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<rect width=\"24\" height=\"24\" rx=\"12\" fill=\"white\"/>\r\n<path d=\"M14.9998 6.60001C15.1574 6.44243 15.3445 6.31742 15.5504 6.23214C15.7563 6.14685 15.977 6.10296 16.1998 6.10296C16.4227 6.10296 16.6434 6.14685 16.8492 6.23214C17.0551 6.31742 17.2422 6.44243 17.3998 6.60001C17.5574 6.7576 17.6824 6.94468 17.7677 7.15058C17.853 7.35648 17.8969 7.57715 17.8969 7.80001C17.8969 8.02288 17.853 8.24355 17.7677 8.44945C17.6824 8.65535 17.5574 8.84243 17.3998 9.00001L9.29982 17.1L5.99982 18L6.89982 14.7L14.9998 6.60001Z\" stroke=\"#1D2939\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(svgString);\r\n\r\n    let editSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    const updateEditSvgPosition = () => {\r\n      const iconCenterOffsetX = width / 2 - 18;\r\n      const iconCenterOffsetY = -(height / 2) + 26;\r\n      const angleInRadians =\r\n        ((fixtureData.relativePosition?.angle ?? 0) * Math.PI) / 180;\r\n      const fixtureCenter = fixtureGroup.getCenterPoint();\r\n\r\n      const rotatedOffsetX =\r\n        iconCenterOffsetX * Math.cos(angleInRadians) -\r\n        iconCenterOffsetY * Math.sin(angleInRadians);\r\n      const rotatedOffsetY =\r\n        iconCenterOffsetX * Math.sin(angleInRadians) +\r\n        iconCenterOffsetY * Math.cos(angleInRadians);\r\n\r\n      editSvg.set({\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        left: fixtureCenter.x + rotatedOffsetX,\r\n        top: fixtureCenter.y + rotatedOffsetY,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      });\r\n\r\n      editSvg.setCoords();\r\n    };\r\n\r\n    editSvg.set({\r\n      scaleX: 1,\r\n      scaleY: 1,\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true, // allow events\r\n      hoverCursor: \"pointer\",\r\n    });\r\n    updateEditSvgPosition();\r\n\r\n    editSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n\r\n      this.selectedFixture = {\r\n        fixtureType: fixtureData.fixtureType,\r\n        wallIndex: fixtureData.associatedElementNumber,\r\n        fixtureIndex: fixtureData.associatedElementFixtureNumber,\r\n        fixtureId: fixtureData._id,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      }\r\n\r\n      this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      this.editFixture = true;\r\n    });\r\n\r\n    if (!fixtureData?.issue && !fixtureData?.unsavedChanges) {\r\n      canvas.on(\"mouse:move\", (opt) => {\r\n        if (\r\n          (this.rolloutSection === \"merch\" &&\r\n            this.taskStyle?.fixture?.class === \"taskAssigned\") ||\r\n          (this.rolloutSection === \"vm\" &&\r\n            this.taskStyle?.vm?.class === \"taskAssigned\") ||\r\n          this.publishingState === \"merch-redo\" ||\r\n          this.publishingState === \"vm-redo\"\r\n        )\r\n          return;\r\n\r\n        const pointer = canvas.getPointer(opt.e);\r\n        if (fixtureGroup.containsPoint(pointer)) {\r\n          editSvg.set(\"visible\", true);\r\n        } else {\r\n          editSvg.set(\"visible\", false);\r\n        }\r\n        canvas.renderAll();\r\n      });\r\n    }\r\n\r\n    canvas.add(editSvg);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  assignTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n    };\r\n    if (this.publishingState === \"merch\") {\r\n      payload.checkListName = \"Merchandise Rollout\";\r\n      payload.redo = false;\r\n      payload.rolloutCount = this.taskInfo?.merchCount;\r\n    } else if (this.publishingState === \"merch-redo\") {\r\n      payload.checkListName = \"Merchandise Rollout\";\r\n      payload.redo = true;\r\n      payload.taskId = this.taskInfo.taskDetails.find(\r\n        (task: any) => task.type === \"merchRollout\",\r\n      )?.taskId;\r\n      payload.rolloutCount = this.taskInfo?.merchCount;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"Visual Merch Rollout\";\r\n      payload.redo = false;\r\n      payload.rolloutCount = this.taskInfo?.vmCount;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"Visual Merch Rollout\";\r\n      payload.redo = true;\r\n      payload.taskId = this.taskInfo.taskDetails.find(\r\n        (task: any) => task.type === \"vmRollout\",\r\n      )?.taskId;\r\n      payload.rolloutCount = this.taskInfo?.vmCount;\r\n    }\r\n    const modalRef = this.modalService.open(PublishRolloutPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\", // <-- Add a custom class here\r\n    });\r\n    modalRef.componentInstance.type = this.publishingState;\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    modalRef.result.then((result) => {\r\n      if (result.status === \"submit\"  && !result.hideTask) {\r\n        let taskType: any;\r\n        if (\r\n          this.publishingState === \"merch\" ||\r\n          this.publishingState === \"merch-redo\"\r\n        ) {\r\n          taskType = \"merchRollout\";\r\n        }\r\n        if (\r\n          this.publishingState === \"vm\" ||\r\n          this.publishingState === \"vm-redo\"\r\n        ) {\r\n          taskType = \"vmRollout\";\r\n        }\r\n        this.apiService.createTask(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\") {\r\n              if (result.comments && result.comments != \"\") {\r\n                let commentPayload = {\r\n                  floorId: this.floorData._id,\r\n                  planoId: this.floorData.planoId,\r\n                  taskType: taskType,\r\n                  comment: result.comments,\r\n                  taskId: res?.data?.taskId,\r\n                };\r\n                this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n                  next: (res: any) => {},\r\n                });\r\n              }\r\n\r\n              this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n              this.getStoreFeedback(\r\n                this.floorData.planoId,\r\n                this.floorData._id,\r\n                {},\r\n              );\r\n\r\n              this.toastService.getSuccessToast(res.data.message);\r\n            }\r\n          },\r\n          error: () => {\r\n            this.toastService.getErrorToast(\"Failed to publish task\");\r\n          },\r\n        });\r\n      }\r\n      else {\r\n        if(result.hideTask) {\r\n          this.publish(true);\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  revokeTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      revoke: true,\r\n    };\r\n    if (this.publishingState === \"merch\") {\r\n      payload.checkListName = \"Merchandise Rollout\";\r\n      payload.redo = false;\r\n      payload.rolloutCount = this.taskInfo?.merchCount;\r\n    } else if (this.publishingState === \"merch-redo\") {\r\n      payload.checkListName = \"Merchandise Rollout\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.merchRolloutData[\r\n          this.storeFeedback.merchRolloutData.length - 1\r\n        ].taskId;\r\n      payload.rolloutCount = this.taskInfo?.merchCount;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"Visual Merch Rollout\";\r\n      payload.redo = false;\r\n      payload.rolloutCount = this.taskInfo?.vmCount;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"Visual Merch Rollout\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.vmRolloutData[\r\n          this.storeFeedback.vmRolloutData.length - 1\r\n        ].taskId;\r\n      payload.rolloutCount = this.taskInfo?.vmCount;\r\n    }\r\n    const modalRef = this.modalService.open(PublishRolloutPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = this.publishingState;\r\n    modalRef.componentInstance.inputData = payload;\r\n    modalRef.componentInstance.taskStyle = this.taskStyle;\r\n\r\n    modalRef.result.then((result) => {\r\n      if (result.status === \"submit\") {\r\n        let taskType;\r\n        let taskId;\r\n        if (\r\n          this.publishingState === \"merch\" ||\r\n          this.publishingState === \"merch-redo\"\r\n        ) {\r\n          taskId = this.taskInfo.taskDetails.find(\r\n            (task: any) => task.type === \"merchRollout\",\r\n          )?.taskId;\r\n          taskType = \"merchRollout\";\r\n        }\r\n        if (\r\n          this.publishingState === \"vm\" ||\r\n          this.publishingState === \"vm-redo\"\r\n        ) {\r\n          taskId = this.taskInfo.taskDetails.find(\r\n            (task: any) => task.type === \"vmRollout\",\r\n          )?.taskId;\r\n          taskType = \"vmRollout\";\r\n        }\r\n        if (result.comments && result.comments != \"\") {\r\n          let commentPayload = {\r\n            floorId: this.floorData._id,\r\n            planoId: this.floorData.planoId,\r\n            taskType: taskType,\r\n            comment: result.comments,\r\n            responsetype: \"revoke\",\r\n            clientId: this.planoData.clientId,\r\n            taskId: taskId,\r\n          };\r\n          this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n            next: (res: any) => {},\r\n          });\r\n        }\r\n        const data = {\r\n          taskId: taskId,\r\n          floorId: this.floorData._id,\r\n          planoId: this.floorData.planoId,\r\n          type: [\"merch\", \"merch-redo\"].includes(this.publishingState)\r\n            ? \"merchRollout\"\r\n            : \"vmRollout\",\r\n        };\r\n        this.apiService.revokeTask(data).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\") {\r\n              // this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n              this.getStoreFixtures(this.planoData._id);\r\n              this.toastService.getSuccessToast(res.message);\r\n            }\r\n          },\r\n          error: (err: any) => {\r\n            this.toastService.getErrorToast(\"Failed to publish task\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  onClickEdit() {\r\n    this.disabledPublish = true;\r\n    this.renderFloor();\r\n  }\r\n\r\n  async taskDetails(planoId: any, floorId: any) {\r\n    try {\r\n      this.taskInfo = {};\r\n      this.taskStyle = {\r\n        fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n        vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n      };\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getRolloutTaskInfo({ planoId, floorId }),\r\n      );\r\n      if (res && res.code == 200) {\r\n        this.taskInfo = res?.data;\r\n        this.taskInfo?.taskDetails?.forEach((ele: any) => {\r\n          if (ele.type == \"merchRollout\") {\r\n            this.taskStyle.fixture = this.getStatus(\"merchRollout\");\r\n          }\r\n          if (ele.type == \"vmRollout\") {\r\n            this.taskStyle.vm = this.getStatus(\"vmRollout\");\r\n          }\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ taskDetails [ERR]:\", error);\r\n      this.toastService.getErrorToast(\"Failed to get task details\");\r\n    }\r\n  }\r\n\r\n  getStatus(type: any) {\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (data) {\r\n      if (\r\n        data.status == \"submit\" &&\r\n        (data.feedbackStatus == \"complete\" || !data?.feedbackStatus)\r\n      ) {\r\n        if (\r\n          (type == \"merchRollout\" && this.taskInfo.merchCount) ||\r\n          (type == \"vmRollout\" && this.taskInfo.vmCount)\r\n        ) {\r\n          return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n        } else {\r\n          return { name: \"Approved\", class: \"completed\" };\r\n        }\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"pending\") {\r\n        return { name: \"Review Pending\", class: \"reviewPending\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"disagree\") {\r\n        return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n      } else {\r\n        if (data.redoStatus && !data.breach) {\r\n          return { name: \"Redo\", class: \"taskAssigned\" };\r\n        } else if (data.breach) {\r\n          return { name: \"Flagged\", class: \"flagged\" };\r\n        }\r\n        return { name: \"Task Assigned\", class: \"taskAssigned\" };\r\n      }\r\n    }\r\n    return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n  }\r\n\r\n  onTabChange(tab: \"merch\" | \"vm\") {\r\n    this.clearRolloutData();\r\n    if (tab === \"merch\") {\r\n      this.rolloutSection = \"merch\";\r\n      this.editFixtureSection = \"products\";\r\n      this.processMerchRolloutFeedback(\r\n        this.storeFeedback?.merchRolloutData || [],\r\n      );\r\n    }\r\n    if (tab === \"vm\") {\r\n      this.rolloutSection = \"vm\";\r\n      this.editFixtureSection = \"vms\";\r\n      this.processVmRolloutFeedback(this.storeFeedback?.vmRolloutData || []);\r\n    }\r\n\r\n    this.renderFloor();\r\n    this.calculatePublishingState();\r\n  }\r\n\r\n  getBtnStatus(type: string) {\r\n    if (type == \"merchRollout\" && !this.taskInfo?.merchCount) {\r\n      return true;\r\n    }\r\n    if (type == \"vmRollout\" && !this.taskInfo?.vmCount) {\r\n      return true;\r\n    }\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (\r\n      data &&\r\n      data?.status == \"submit\" &&\r\n      (!data?.feedbackStatus || data.feedbackStatus == \"complete\") &&\r\n      ((this.rolloutSection == \"merch\" && this.taskInfo.merchCount) ||\r\n        (this.rolloutSection == \"vm\" && this.taskInfo.vmCount))\r\n    ) {\r\n      return false;\r\n    }\r\n    if (\r\n      data &&\r\n      (![\"submit\"].includes(data?.status) ||\r\n        (data.status == \"submit\" && data.feedbackStatus != \"disagree\")) &&\r\n      !data.breach\r\n    ) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  getRevokeButtonStatus(type: string) {\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (data && data?.status != \"submit\" && !data.breach) {\r\n      return false;\r\n    }\r\n    return true;\r\n  }\r\n\r\n  publish(task: boolean = false) {\r\n    const modalRef = this.modalService.open(CompleteConfirmationComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.title = \"Publish Planogram\";\r\n    modalRef.componentInstance.description =\r\n      \"You are about to publish the planogram to the store. This will be the latest and most up-to-date planogram for the store.\";\r\n    modalRef.componentInstance.type = \"publish\";\r\n\r\n    modalRef.result.then((res) => {\r\n      if (res == \"ok\") {\r\n        let type =\r\n          this.taskStyle.fixture.class === \"completed\" &&\r\n          !this.taskInfo?.merchCount &&\r\n          this.taskStyle.vm.class === \"completed\" &&\r\n          !this.taskInfo?.vmCount\r\n            ? [\"merchRollout\", \"vmRollout\"]\r\n            : this.rolloutSection === \"merch\"\r\n              ? [\"merchRollout\"]\r\n              : [\"vmRollout\"];\r\n        let data = structuredClone(this.planoData);\r\n        data.floorId = this.floorData._id;\r\n        data.floorData = this.floorData;\r\n        delete data.floors;\r\n        delete data.floorData.masterTemplates;\r\n        let payload = { ...data, type: type };\r\n        this.apiService.publish(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res && res.code == 200) {\r\n              if (task) {\r\n                this.getStoreFixtures(this.planoData?._id);\r\n              }\r\n              if (type.includes(\"merchRollout\")) {\r\n                this.floorData.merchRolloutStatus = true;\r\n              }\r\n              if (type.includes(\"vmRollout\")) {\r\n                this.floorData.vmRolloutStatus = true;\r\n              }\r\n              this.toastService.getSuccessToast(res?.message);\r\n            }\r\n          },\r\n          error: (err: any) => {\r\n            console.log(err);\r\n            this.toastService.getErrorToast(\"Failed to publish plano\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  getStoreList(planoId?: string) {\r\n    this.apiService\r\n      .getPlanoStoreList(this.clientId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.storeList = res.data;\r\n            this.storeList = this.storeList.map((ele: any) => {\r\n              return { ...ele, storeName: ele.storeName.toUpperCase() };\r\n            });\r\n            if (planoId) {\r\n              this.selectedStoreName = this.storeList.find(\r\n                (ele: any) => ele.planoId.toString() == planoId.toString(),\r\n              );\r\n            }\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async onSelected(event: any) {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    const newParams = new URLSearchParams(window.location.search);\r\n    newParams.set(\"planoId\", event.planoId);\r\n    newParams.set(\"floorId\", event.floorId);\r\n\r\n    this.location.replaceState(window.location.pathname, newParams.toString());\r\n    await this.getStoreFixtures(event._id);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"manage-plano\">\r\n  <div *ngIf=\"isPageLoading\" class=\"row\">\r\n    <div class=\"col-12 m-0\"><ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container></div>\r\n    <div class=\"col-9\"><ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container></div>\r\n    <div class=\"col-3\"><ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container></div>\r\n  </div>\r\n\r\n  <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n    <!-----------Header Accordion---------->\r\n    <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n      <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n        <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n          <div class=\"d-flex gap-4 align-items-center\">\r\n            <div class=\"d-flex\">\r\n              <div style=\"margin-top:10px;margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n                <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n              </div>\r\n              <div>\r\n                <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\" [selectedValues]=\"[selectedStoreName]\"\r\n                 [items]=\"storeList\" [multi]=false searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n                </lib-select-plano>\r\n              </div>\r\n            </div>\r\n            <lib-reactive-select \r\n              *ngIf=\"planoData?.floors?.length && !selectedFixtureData\"\r\n              [formControl]=\"selectedFloorId\" \r\n              [idField]=\"'_id'\" \r\n              [nameField]=\"'floorNum'\"\r\n              [data]=\"planoData?.floors\"\r\n            ></lib-reactive-select>\r\n          </div>\r\n          <div class=\"d-flex gap-4 align-items-center\">\r\n<!-- Source CAD button temporarily disabled\r\n            <button *ngIf=\"cadSource.hasSource(floorData?.cadFiles)\" type=\"button\"\r\n              class=\"btn btn-outline text-nowrap d-flex align-items-center gap-2\"\r\n              ngbTooltip=\"View the source CAD drawing\" (click)=\"openSourceCad()\">\r\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path d=\"M9.5 1.5H4a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5l-3.5-3.5Z\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>\r\n                <path d=\"M9.5 1.5V5H13M6 8.5l2 2 2-2M8 10.5V7\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n              </svg>\r\n              Source CAD\r\n            </button>\r\n-->\r\n\r\n            <ng-container *ngIf=\"editFixture\">\r\n              <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onFixturePageCancel()\">Cancel</button>\r\n              <button type=\"button\" class=\"btn btn-primary text-nowrap\" [disabled]=\"isSaveButtonDisabled()\" (click)=\"onFixtureSave()\">Save & Close</button>\r\n            </ng-container>\r\n            <ng-container *ngIf=\"!editFixture\">\r\n              <button *ngIf=\"publishingState === 'merch'\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n                (click)=\"assignTask()\" [disabled]=\"getBtnStatus('merchRollout')\">\r\n                Publish Merch Rollout\r\n              </button>\r\n              <button *ngIf=\"publishingState === 'merch-redo'\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n                (click)=\"assignTask()\" [disabled]=\"getBtnStatus('merchRollout')\">\r\n                Publish Merch Redo\r\n              </button>\r\n              <button *ngIf=\"publishingState === 'vm'\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n                (click)=\"assignTask()\" [disabled]=\"getBtnStatus('vmRollout')\">\r\n                Publish VM Rollout\r\n              </button>\r\n              <button *ngIf=\"publishingState === 'vm-redo'\" type=\"button\" class=\"btn btn-primary text-nowrap\"\r\n                (click)=\"assignTask()\" [disabled]=\"getBtnStatus('vmRollout')\">\r\n                Publish VM Redo\r\n              </button>\r\n              <button (click)=\"revokeTask()\" *ngIf=\"(publishingState === 'merch' || publishingState === 'merch-redo') && !getRevokeButtonStatus('merchRollout')\" class=\"btn btn-red d-flex align-items-center\">\r\n              <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                <g clip-path=\"url(#clip0_640_5594)\">\r\n                  <path\r\n                    d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                    stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </g>\r\n                <defs>\r\n                  <clipPath id=\"clip0_640_5594\">\r\n                    <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                  </clipPath>\r\n                </defs>\r\n              </svg>\r\n              Revoke</button>\r\n              <button (click)=\"revokeTask()\" *ngIf=\"(publishingState === 'vm' || publishingState === 'vm-redo') && !getRevokeButtonStatus('vmRollout')\"\r\n              class=\"btn btn-red d-flex align-items-center\">\r\n              <svg class=\"me-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                <g clip-path=\"url(#clip0_640_5594)\">\r\n                  <path\r\n                    d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                    stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </g>\r\n                <defs>\r\n                  <clipPath id=\"clip0_640_5594\">\r\n                    <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                  </clipPath>\r\n                </defs>\r\n              </svg>\r\n              Revoke</button>\r\n              <button type=\"button\" class=\"btn btn-primary text-nowrap\" *ngIf=\"((taskStyle.fixture.class === 'completed' && rolloutSection == 'merch' && !floorData?.merchRolloutStatus && !this.taskInfo?.vmCount) || (taskStyle.vm.class === 'completed' && rolloutSection == 'vm' && !floorData?.vmRolloutStatus && !this.taskInfo?.merchCount))\"\r\n                (click)=\"publish()\">\r\n                Publish\r\n              </button>\r\n            </ng-container>\r\n            <button ngbAccordionButton></button>\r\n          </div>\r\n        </div>\r\n        <div ngbAccordionCollapse>\r\n          <div ngbAccordionBody>\r\n            <ng-template>\r\n              <div id=\"header\">\r\n                <div *ngIf=\"!selectedFixtureData\" class=\"row mx-0 gap-3\">\r\n                  <div class=\"col\">\r\n                    <div (click)=\"onTabChange('merch')\" [ngClass]=\"{'selected': rolloutSection === 'merch'}\"\r\n                      class=\"rollout-card\">\r\n                      <div class=\"top\">\r\n                        <h3>{{storeMetrics.fixtureCount}}</h3>\r\n                        <span>Total Merchandise Fixture</span>\r\n                        <span *ngIf=\"taskStyle.fixture.class === 'completed'\">\r\n                          <div class=\"indicator ms-3\" [ngClass]=\"taskStyle.fixture.class\">\r\n                          {{ taskStyle.fixture.name }}\r\n                          </div>\r\n                        </span>\r\n                      </div>\r\n                      <div class=\"bottom\">\r\n                        <h4>{{taskInfo?.merchCount || 0}}</h4>\r\n                        <span>Rollout</span>\r\n                        <div class=\"indicator\" [ngClass]=\"taskStyle.fixture.class\" *ngIf=\"taskStyle.fixture.class !== 'completed'\">\r\n                          <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                              fill=\"none\">\r\n                              <g clip-path=\"url(#clip0_4984_27569)\">\r\n                                <path\r\n                                  d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                                  stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                              </g>\r\n                              <defs>\r\n                                <clipPath id=\"clip0_4984_27569\">\r\n                                  <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                                </clipPath>\r\n                              </defs>\r\n                            </svg>\r\n                          </span>\r\n                          <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                              fill=\"none\">\r\n                              <path\r\n                                d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                                stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                          </span>\r\n                          {{ taskStyle.fixture.name }}\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"col\">\r\n                    <div (click)=\"onTabChange('vm')\" [ngClass]=\"{'selected': rolloutSection === 'vm'}\"\r\n                      class=\"rollout-card\">\r\n                      <div class=\"top\">\r\n                        <h3>{{storeMetrics.vmCount}}</h3>\r\n                        <span>Total Visual Merchandise</span>\r\n                        <span *ngIf=\"taskStyle.vm.class === 'completed'\">\r\n                          <div class=\"indicator ms-3\" [ngClass]=\"taskStyle.vm.class\">\r\n                          {{ taskStyle.vm.name }}\r\n                          </div>\r\n                        </span>\r\n                      </div>\r\n                      <div class=\"bottom\">\r\n                        <h4>{{taskInfo?.vmCount || 0}}</h4>\r\n                        <span>Rollout</span>\r\n                        <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\" *ngIf=\"taskStyle.vm.class !== 'completed'\">\r\n                          <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                              fill=\"none\">\r\n                              <g clip-path=\"url(#clip0_4984_27569)\">\r\n                                <path\r\n                                  d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                                  stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                              </g>\r\n                              <defs>\r\n                                <clipPath id=\"clip0_4984_27569\">\r\n                                  <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                                </clipPath>\r\n                              </defs>\r\n                            </svg>\r\n                          </span>\r\n                          <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n                              fill=\"none\">\r\n                              <path\r\n                                d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                                stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                          </span>\r\n                          {{ taskStyle.vm.name }}\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n\r\n                <div *ngIf=\"selectedFixtureData\" class=\"row mx-0 g-0\">\r\n                  <div class=\"col\">\r\n                    <div class=\"selected-fixture-header\">\r\n                      <div class=\"t1\">{{selectedFixtureData?.header?.label}}</div>\r\n                      <div class=\"dot\"></div>\r\n                      <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n                        {{ selectedFixtureData?.fixtureCategory }}\r\n                      </div>\r\n                      <div class=\"dot\"></div>\r\n                      <div class=\"t2\">{{selectedFixtureData?.fixtureLength?.value}} X\r\n                        {{selectedFixtureData?.fixtureWidth?.value}} {{selectedFixtureData?.fixtureWidth?.unit}}</div>\r\n                      <div class=\"dot\"></div>\r\n                      <div class=\"t2\">{{selectedFixtureData?.associatedElementNumber ? 'Wall' : 'Centre'}}\r\n                        {{selectedFixtureData?.associatedElementFixtureNumber}}</div>\r\n                      <div class=\"dot\"></div>\r\n                      <div class=\"t3\">Product Capacity: {{selectedFixtureData?.fixtureCapacity}}</div>\r\n                      <div class=\"dot\"></div>\r\n                      <div class=\"t3\">VM Capacity: {{selectedFixtureData?.vmConfig?.length}}</div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n              </div>\r\n            </ng-template>\r\n\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!----------------Body------------------->\r\n    <div id=\"body\" class=\"row\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n      <!-- Left Col -->\r\n\r\n\r\n      <!-- Center Col -->\r\n      <div class=\"col overflow-hidden position-relative\">\r\n        <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n          <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n          <!-- <button [disabled]=\"disableEdit\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"onClickEdit()\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_1322_5325)\">\r\n                <path\r\n                  d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                  stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_1322_5325\">\r\n                  <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n            Edit\r\n          </button> -->\r\n\r\n        </div>\r\n\r\n        <!-- <div class=\"collapse-handler left\" (click)=\"isLeftPanelCollapsed = !isLeftPanelCollapsed; resizeCanvasToParentSize()\">\r\n          <svg\r\n            *ngIf=\"!isLeftPanelCollapsed\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"18\"\r\n            height=\"18\"\r\n            viewBox=\"0 0 18 18\"\r\n            fill=\"none\"\r\n          >\r\n            <path\r\n              d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n              stroke=\"#101828\"\r\n              stroke-width=\"1.45455\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          <svg\r\n            *ngIf=\"isLeftPanelCollapsed\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"18\"\r\n            height=\"18\"\r\n            viewBox=\"0 0 18 18\"\r\n            fill=\"none\"\r\n          >\r\n            <path\r\n              d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n              stroke=\"#101828\"\r\n              stroke-width=\"1.45455\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div> -->\r\n        <div class=\"collapse-handler right\"\r\n          (click)=\"isRightPanelCollapsed = !isRightPanelCollapsed; resizeCanvasToParentSize()\">\r\n          <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Right Col -->\r\n      <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\">\r\n        <ng-container *ngTemplateOutlet=\"feedbackCol\"> </ng-container>\r\n      </div>\r\n    </div>\r\n\r\n    <!-----------Edit fixture body----------->\r\n    <div id=\"edit-body\" class=\"row\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n      <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n          <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n            [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n            Basic details\r\n          </a>\r\n        </li>\r\n        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n          <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n            [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n            Products\r\n          </a>\r\n        </li>\r\n        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n          <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n            [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n            Visual Merchandise\r\n          </a>\r\n        </li>\r\n      </ul>\r\n\r\n      <div class=\"col-9\">\r\n        <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n          <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"false\"\r\n            [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"></lib-instance-basic-details>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n          <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"rolloutSection === 'merch'\"\r\n            [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n            [isRollout]=\"true\"></lib-instance-products>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n          <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"rolloutSection === 'vm'\"\r\n            [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\" [isRollout]=\"true\"></lib-instance-vms>\r\n        </ng-container>\r\n      </div>\r\n      <div class=\"col-3\">\r\n        <ng-container *ngTemplateOutlet=\"feedbackCol\"> </ng-container>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<ng-template #feedbackCol>\r\n  <div class=\"s-card\">\r\n    <!-- <app-manage-store-plano-feedback [ngClass]=\"{ 'd-none': isRightPanelCollapsed }\" [currentPlano]=\"floorData\"\r\n      [storeFeedback]=\"storeFeedback\" [selectedIssue]=\"selectedFixture\"\r\n      (isApproved)=\"handleApproverResponse($event)\"></app-manage-store-plano-feedback> -->\r\n    <lib-rollout-feedback [ngClass]=\"{ 'd-none': isRightPanelCollapsed }\" [currentPlano]=\"floorData\"\r\n      [storeFeedback]=\"storeFeedback\" [selectedIssue]=\"selectedFixture\" [taskInfo]=\"taskInfo\"\r\n      (isApproved)=\"handleApproverResponse($event)\" [rolloutSection]=\"rolloutSection\"></lib-rollout-feedback>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n  <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer w-100 p-4 rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke mt-0 animate title\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n  <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>","import { TitleCasePipe } from \"@angular/common\";\r\nimport {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { PlanoDataService } from \"../../../../services/plano-data.service\";\r\nimport { FixtureTemplateDetails } from \"../../../../interfaces/fixture-template.interface\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { firstValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport * as fabric from \"fabric\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { Router } from \"@angular/router\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-preview-modal\",\r\n  templateUrl: \"./preview-modal.component.html\",\r\n  styleUrl: \"./preview-modal.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class PreviewModalComponent implements OnInit, OnDestroy, AfterViewInit {\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  @Input() fixtureStoreList: any;\r\n  @Input() doubleFloor: any;\r\n  viewMode: \"list\" | \"preview\" = \"list\";\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  filterObject = [\r\n    {\r\n      Description: \"Status\",\r\n      Issues: [\r\n        { text: \"Active\", id: \"active\" },\r\n        { text: \"Inactive\", id: \"inactive\" },\r\n        { text: \"Draft\", id: \"draft\" },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  appliedFilters = {\r\n    status: [],\r\n    brand: [],\r\n    category: [],\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n  imgCDN: string;\r\n\r\n  previewMode: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  @Input() selectedStore: any;\r\n  isCanvasLoading: boolean = true;\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private ps: PlanoDataService,\r\n    private apiService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private titleCase: TitleCasePipe,\r\n    private cd: ChangeDetectorRef,\r\n    private activeModal: NgbActiveModal,\r\n    private router: Router,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.ps.fixtureTemplateDetails\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        this.fixtureTemplateDetails = data;\r\n        this.getStoreFixtures(this.selectedStore.storeId);\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  onTogglePreview() {\r\n    if (this.previewMode) {\r\n      this.viewMode = \"preview\";\r\n      this.getStoreFixtures(this.selectedStore.storeId);\r\n    } else {\r\n      this.viewMode = \"list\";\r\n    }\r\n  }\r\n\r\n  onStoreSelect(store: any) {\r\n    this.selectedStore = store;\r\n    this.getStoreFixtures(store.storeId);\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string) {\r\n    let params;\r\n    if (this.selectedStore?.planoId && this.selectedStore?.floorId) {\r\n      params = {\r\n        planoId: this.selectedStore?.planoId,\r\n        floorId: this.selectedStore?.floorId,\r\n        id: [storeId],\r\n      };\r\n    } else {\r\n      params = { id: [storeId] };\r\n    }\r\n    this.isCanvasLoading = true;\r\n    this.apiService\r\n      .getStoreFixtures(params)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          // if (this.floorData?._id) {\r\n          //   this.floorData = structuredClone(res.data[0].floors.find((floor: any) => floor?._id === this.floorData?._id))\r\n          // } else {\r\n          this.floorData = structuredClone(res.data[0].floors[0]);\r\n\r\n          // }\r\n\r\n          await this.resizeCanvasToParentSize();\r\n\r\n          await this.drawInitialContent();\r\n\r\n          this.isCanvasLoading = false;\r\n\r\n          this.cd.detectChanges();\r\n        },\r\n        error: (err: any) => {\r\n          this.toast.getErrorToast(\"Failed to fetch plano\");\r\n          this.cd.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n  previousNext(step: \"previous\" | \"next\") {\r\n    const curIdx = this.fixtureStoreList.findIndex(\r\n      (store: any) => store.storeId === this.selectedStore.storeId,\r\n    );\r\n    if (step === \"previous\") {\r\n      if (curIdx === 0) return;\r\n      this.selectedStore = this.fixtureStoreList[curIdx - 1];\r\n    } else {\r\n      if (curIdx === this.fixtureStoreList.length - 1) return;\r\n      this.selectedStore = this.fixtureStoreList[curIdx + 1];\r\n    }\r\n\r\n    this.getStoreFixtures(this.selectedStore.storeId);\r\n  }\r\n\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  planoData: any;\r\n  floorData: any;\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      // selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 1000,\r\n      width: 1000,\r\n    });\r\n\r\n    this.setupZoomHandlers();\r\n  }\r\n\r\n  async resizeCanvasToParentSize() {\r\n    // setTimeout(() => {\r\n    const canvasCol = document.getElementById(\"canvas-card-1\") as HTMLElement;\r\n    if (canvasCol) {\r\n      const width = canvasCol.offsetWidth - 6;\r\n      const height = canvasCol.offsetHeight - 6;\r\n      this.changeCanvasSize(width, height);\r\n    }\r\n    // }, 300);\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async drawInitialContent() {\r\n    this.canvas.clear();\r\n    await this.drawLayoutElements();\r\n    // this.drawBg();\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        // const elementsGroup: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = this.drawLabeledRectangle(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            w,\r\n            h,\r\n            otherElement,\r\n          );\r\n\r\n          // elementsGroup.push(fixtureObj as fabric.Group);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureObj = this.drawLabeledRectangle(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        w,\r\n        h,\r\n        otherElement,\r\n      );\r\n\r\n      // elementsGroup.push(fixtureObj as fabric.Group);\r\n    }\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    fixtureData.fixtureConfigId === this.fixtureTemplateDetails?._id\r\n      ? (fixtureData.issue = true)\r\n      : null;\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureData.issue ? \"#009BF3\" : \"#98A2B3\",\r\n      strokeWidth: fixtureData.issue ? 0.5 : 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber\r\n          : \"new\"\r\n      } - ${fixtureData.fixtureCategory} - ${fixtureData.fixtureWidth.value} ${\r\n        fixtureData.fixtureWidth.unit\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n            Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n              topX + topWidth - radius\r\n            } ${secondBoxY + innerBoxHeight} \r\n            L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n            Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n              secondBoxY + innerBoxHeight - radius\r\n            } \r\n            L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#009BF3\" : \"#344054\",\r\n        stroke: fixtureData.issue ? \"#51C1FF\" : \"#667085\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(`${fixtureData.header.label}`, {\r\n      left: midX + midWidth / 2,\r\n      top: firstBoxY + boxHeight / 2,\r\n      fontSize: 7,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: midWidth,\r\n      height: boxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.imgCDN}${vm.vmImageUrl}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureData.issue ? \"#6938EF\" : \"#1D2939\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        heigth: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        selectable: false,\r\n        evented: false,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n        // hoverCursor: 'pointer'\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n    };\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData?.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData?.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  onDismiss() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  goToManagePlano() {\r\n    this.onDismiss();\r\n    this.router.navigate([\"/manage/planogram/manage-planogram\"], {\r\n      queryParams: {\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n      },\r\n    });\r\n  }\r\n}\r\n","<section>\r\n  <div style=\"height: 100%\" class=\"row\">\r\n    <div class=\"col-12\" id=\"canvas-card-1\" style=\"height: 100%; overflow: hidden\">\r\n      <div [ngClass]=\"isCanvasLoading ? '' : 'd-none'\">\r\n        <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n              <div class=\"stroke animate title\"></div>\r\n              <div class=\"stroke animate link\"></div>\r\n              <div class=\"stroke animate description\"></div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div [ngClass]=\"isCanvasLoading ? 'd-none' : ''\">\r\n        <div class=\"d-flex justify-content-between align-items-center\">\r\n          <div class=\"preview\">Preview</div>\r\n          <svg\r\n            style=\"cursor: pointer\"\r\n            (click)=\"onDismiss()\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            width=\"24\"\r\n            height=\"25\"\r\n            viewBox=\"0 0 24 25\"\r\n            fill=\"none\"\r\n          >\r\n            <path\r\n              d=\"M17.9297 6.88281L5.97656 18.8359M5.97656 6.88281L17.9297 18.8359\"\r\n              stroke=\"#101828\"\r\n              stroke-width=\"1.99219\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </div>\r\n\r\n        <div>\r\n          <div class=\"store-slider\">\r\n            <div (click)=\"previousNext('previous')\" class=\"arrow\">\r\n              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                <path\r\n                  d=\"M14.3942 6.33329L8.72756 12L14.3942 17.6666\"\r\n                  stroke=\"#344054\"\r\n                  stroke-width=\"1.88889\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n            </div>\r\n            <div class=\"storename\" (click)=\"goToManagePlano()\">\r\n              <span class=\"txt me-3\">{{ doubleFloor.includes(selectedStore.storeId) ? selectedStore.storeName +' - '+ selectedStore.floorName :  selectedStore.storeName}} - Plano</span>\r\n              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                <path\r\n                  d=\"M15.5323 10.8751V16.6881C15.5323 17.202 15.3282 17.6949 14.9648 18.0583C14.6014 18.4216 14.1085 18.6258 13.5946 18.6258H2.93738C2.42347 18.6258 1.93061 18.4216 1.56723 18.0583C1.20384 17.6949 0.999695 17.202 0.999695 16.6881V6.03085C0.999695 5.51695 1.20384 5.02409 1.56723 4.6607C1.93061 4.29732 2.42347 4.09317 2.93738 4.09317H8.75042M12.6258 1.18665H18.4388M18.4388 1.18665V6.99969M18.4388 1.18665L7.78158 11.8439\"\r\n                  stroke=\"#008EDF\"\r\n                  stroke-width=\"1.93768\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n            </div>\r\n            <div (click)=\"previousNext('next')\" class=\"arrow\">\r\n              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                <path\r\n                  d=\"M8.6059 17.6667L14.2726 12L8.6059 6.33337\"\r\n                  stroke=\"#344054\"\r\n                  stroke-width=\"1.88889\"\r\n                  stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"\r\n                />\r\n              </svg>\r\n            </div>\r\n          </div>\r\n          <canvas id=\"base-canvas\" #baseCanvas class=\"mt-4\"></canvas>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n","import { Component, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'lib-publish-confirmation',\r\n  templateUrl: './publish-confirmation.component.html',\r\n  styleUrl: './publish-confirmation.component.scss'\r\n})\r\nexport class PublishConfirmationComponent {\r\n   @Input() title: string = 'Publish updates';\r\n    @Input() description: string = 'You’re about to publish the updates for all 100 stores. Are you sure want to continue?';\r\n    @Input() note?: string;\r\n  \r\n    constructor(\r\n      private activeModal: NgbActiveModal,\r\n    ) { }\r\n  \r\n    onCancel() {\r\n      this.activeModal.dismiss();\r\n    }\r\n  \r\n    onComplete() {\r\n      this.activeModal.close('ok');\r\n    }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n<svg class=\"mb-5\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M22 2L11 13M22 2L15 22L11 13M22 2L2 9L11 13\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n  <h3 class=\"mb-4\">{{ title }}</h3>\r\n\r\n  <p>{{ description }}</p>\r\n  <p *ngIf=\"note\"><b>Note: </b> {{ note }}</p>\r\n\r\n  <div class=\"modal-actions mt-5\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onComplete()\">Publish</button>\r\n  </div>\r\n</div>\r\n","import {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { firstValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { PlanoDataService } from \"../../../services/plano-data.service\";\r\nimport { FixtureTemplateDetails } from \"../../../interfaces/fixture-template.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport * as fabric from \"fabric\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { PreviewModalComponent } from \"./preview-modal/preview-modal.component\";\r\nimport { PublishConfirmationComponent } from \"../../popups/publish-confirmation/publish-confirmation.component\";\r\nimport { Router } from \"@angular/router\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-template-assign-stores\",\r\n  templateUrl: \"./template-assign-stores.component.html\",\r\n  styleUrl: \"./template-assign-stores.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class TemplateAssignStoresComponent\r\n  implements OnDestroy, OnInit, AfterViewInit\r\n{\r\n  fixtureTemplateDetails: FixtureTemplateDetails | null;\r\n  fixtureStoreList: any;\r\n  viewMode: \"list\" | \"preview\" = \"list\";\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n  doubleStore: any = [];\r\n\r\n  filterObject = [\r\n    {\r\n      Description: \"Status\",\r\n      Issues: [\r\n        { text: \"Active\", id: \"active\" },\r\n        { text: \"Inactive\", id: \"inactive\" },\r\n        { text: \"Draft\", id: \"draft\" },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  appliedFilters = {\r\n    status: [],\r\n    brand: [],\r\n    category: [],\r\n    // category: []\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n  imgCDN: string;\r\n\r\n  previewMode: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  selectedStore: any;\r\n  isCanvasLoading: boolean = true;\r\n\r\n  constructor(\r\n    private pageInfo: PageInfoService,\r\n    private gs: GlobalStateService,\r\n    private ps: PlanoDataService,\r\n    private apiService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private titleCase: TitleCasePipe,\r\n    private cd: ChangeDetectorRef,\r\n    private modalDef: NgbModal,\r\n    private router: Router,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.ps.fixtureTemplateDetails\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        this.fixtureTemplateDetails = data;\r\n        this.getTemplateAssignList();\r\n      });\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  async onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    await this.getTemplateAssignList();\r\n    if (this.viewMode === \"preview\") {\r\n      this.getStoreFixtures(this.selectedStore.storeId);\r\n    }\r\n  }\r\n\r\n  async onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    await this.getTemplateAssignList();\r\n    if (this.viewMode === \"preview\") {\r\n      this.getStoreFixtures(this.selectedStore.storeId);\r\n    }\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getTemplateAssignList();\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    const status = event\r\n      .find((e: any) => e.Description == \"Status\")\r\n      ?.Issues.map((i: any) => i?.id);\r\n    const brand = event\r\n      .find((e: any) => e.Description == \"Brands\")\r\n      ?.Issues.map((i: any) => i?.id);\r\n    const category = event\r\n      .find((e: any) => e.Description == \"Fixture Category\")\r\n      ?.Issues.map((i: any) => i?.id);\r\n    // const category = event[3].Issues.map((i: any) => i.id);\r\n\r\n    this.isFilterApplied = status || category || brand;\r\n    this.appliedFilters = { status, category, brand };\r\n    this.offset = 1;\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Assign Stores\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: \"\", path: \"\", isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  async onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    await this.getTemplateAssignList();\r\n    if (this.viewMode === \"preview\") {\r\n      this.getStoreFixtures(this.selectedStore.storeId);\r\n    }\r\n  }\r\n\r\n  getTemplateAssignList() {\r\n    this.doubleStore = [];\r\n    return new Promise((resolve, reject) => {\r\n      this.isPageLoading = true;\r\n      const body = {\r\n        templateId: this.fixtureTemplateDetails?._id,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n        sortColumnName: this.sortedColumn,\r\n        searchValue: this.searchTerm,\r\n        sortBy: this.sortOrder,\r\n      };\r\n      this.apiService.getTemplateAssignList(body).subscribe({\r\n        next: (response: any) => {\r\n          if (response?.data) {\r\n            this.totalItems = response?.data?.count;\r\n            this.fixtureStoreList = response?.data.data;\r\n            this.doubleStore = response?.data?.doubleFloorStores || [];\r\n            this.selectedStore = this.fixtureStoreList[0];\r\n          } else {\r\n            this.fixtureStoreList = [];\r\n          }\r\n          if (this.totalItems < 10) {\r\n            this.paginationSizes = [this.totalItems];\r\n          } else {\r\n            this.paginationSizes = [10, 20, 30];\r\n          }\r\n          this.isPageLoading = false;\r\n          resolve(true);\r\n        },\r\n        error: (error) => {\r\n          this.toast.getErrorToast(\r\n            error?.error?.error || \"Failed to duplicate Template\",\r\n          );\r\n          this.isPageLoading = false;\r\n          reject();\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  onTogglePreview() {\r\n    if (this.previewMode) {\r\n      this.viewMode = \"preview\";\r\n      this.getStoreFixtures(this.selectedStore.storeId);\r\n    } else {\r\n      this.viewMode = \"list\";\r\n    }\r\n  }\r\n\r\n  onStoreSelect(store: any) {\r\n    this.selectedStore = store;\r\n    this.getStoreFixtures(store.storeId);\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string, floorId?: string) {\r\n    this.isCanvasLoading = true;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId] })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          if (floorId) {\r\n            this.floorData = structuredClone(\r\n              res.data[0].floors.find((floor: any) => floor?._id === floorId),\r\n            );\r\n          } else {\r\n            this.floorData = structuredClone(res.data[0].floors[0]);\r\n          }\r\n\r\n          await this.resizeCanvasToParentSize();\r\n\r\n          await this.drawInitialContent();\r\n\r\n          this.isCanvasLoading = false;\r\n\r\n          this.cd.detectChanges();\r\n        },\r\n        error: (err: any) => {\r\n          this.toast.getErrorToast(\"Failed to fetch plano\");\r\n          this.cd.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n  previousNext(step: \"previous\" | \"next\") {\r\n    const curIdx = this.fixtureStoreList.findIndex(\r\n      (store: any) => store.floorId === this.selectedStore.floorId,\r\n    );\r\n    if (step === \"previous\") {\r\n      if (curIdx === 0) return;\r\n      this.selectedStore = this.fixtureStoreList[curIdx - 1];\r\n    } else {\r\n      if (curIdx === this.fixtureStoreList.length - 1) return;\r\n      this.selectedStore = this.fixtureStoreList[curIdx + 1];\r\n    }\r\n\r\n    this.getStoreFixtures(this.selectedStore.storeId);\r\n  }\r\n\r\n  viewPlano(store: any) {\r\n    let modelRef = this.modalDef.open(PreviewModalComponent, {\r\n      centered: true,\r\n      size: \"xl\",\r\n    });\r\n    modelRef.componentInstance.selectedStore = store;\r\n    modelRef.componentInstance.fixtureStoreList = this.fixtureStoreList;\r\n    modelRef.componentInstance.doubleFloor = this.doubleStore;\r\n  }\r\n\r\n  async onPublish() {\r\n    if (!(await this.confirmPublish())) return;\r\n\r\n    const req = {\r\n      replaceFixture: this.fixtureTemplateDetails?._id,\r\n      findFixture: this.fixtureTemplateDetails?._id,\r\n      storeList: [],\r\n      publishAll: true,\r\n    };\r\n\r\n    this.apiService.replaceFixtureDetails(req).subscribe({\r\n      next: (res) => {\r\n        this.toast.getSuccessToast(\"Template published successfully\");\r\n        this.router.navigateByUrl(\r\n          \"/manage/planogram/fixture-templates?view=list\",\r\n        );\r\n      },\r\n      error: () => {\r\n        this.toast.getErrorToast(\"Failed to publish template\");\r\n      },\r\n    });\r\n  }\r\n\r\n  async confirmPublish(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalDef.open(PublishConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      const storeCount =\r\n        this.totalItems === 1 ? `one store` : `all ${this.totalItems} stores`;\r\n      modelRef.componentInstance.description = `You’re about to publish the updates for ${storeCount}. Are you sure want to continue?`;\r\n      return await modelRef.result.then<boolean>(\r\n        (result: any) => result === \"ok\",\r\n      );\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  planoData: any;\r\n  floorData: any;\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      // selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 1000,\r\n      width: 1000,\r\n    });\r\n\r\n    this.setupZoomHandlers();\r\n  }\r\n\r\n  async resizeCanvasToParentSize() {\r\n    // setTimeout(() => {\r\n    const canvasCol = document.getElementById(\"canvas-card\") as HTMLElement;\r\n    if (canvasCol) {\r\n      const width = canvasCol.offsetWidth - 6;\r\n      const height = canvasCol.offsetHeight - 6;\r\n      this.changeCanvasSize(width, height);\r\n    }\r\n    // }, 300);\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async drawInitialContent() {\r\n    this.canvas.clear();\r\n    await this.drawLayoutElements();\r\n    // this.drawBg();\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        // const elementsGroup: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = this.drawLabeledRectangle(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            w,\r\n            h,\r\n            otherElement,\r\n          );\r\n\r\n          // elementsGroup.push(fixtureObj as fabric.Group);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureObj = this.drawLabeledRectangle(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        w,\r\n        h,\r\n        otherElement,\r\n      );\r\n\r\n      // elementsGroup.push(fixtureObj as fabric.Group);\r\n    }\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    fixtureData.fixtureConfigId === this.fixtureTemplateDetails?._id\r\n      ? (fixtureData.issue = true)\r\n      : null;\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureData.issue ? \"#009BF3\" : \"#98A2B3\",\r\n      strokeWidth: fixtureData.issue ? 0.5 : 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber\r\n          : \"new\"\r\n      } - ${fixtureData.fixtureCategory} - ${fixtureData.fixtureWidth.value} ${\r\n        fixtureData.fixtureWidth.unit\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n            Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n              topX + topWidth - radius\r\n            } ${secondBoxY + innerBoxHeight} \r\n            L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n            Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n              secondBoxY + innerBoxHeight - radius\r\n            } \r\n            L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#009BF3\" : \"#344054\",\r\n        stroke: fixtureData.issue ? \"#51C1FF\" : \"#667085\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const bottomText = new fabric.Textbox(getFixtureCanvasLabel(fixtureData), {\r\n      left: topX + topWidth / 2,\r\n      top: secondBoxY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#FFFFFF\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n    });\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(`${fixtureData.header.label}`, {\r\n      left: midX + midWidth / 2,\r\n      top: firstBoxY + boxHeight / 2,\r\n      fontSize: 7,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: midWidth,\r\n      height: boxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text = fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.imgCDN}${vm.vmImageUrl}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureData.issue ? \"#6938EF\" : \"#1D2939\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        heigth: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        selectable: false,\r\n        evented: false,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n        // hoverCursor: 'pointer'\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n    };\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData?.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData?.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixtureTemplate\" class=\"content-wrapper\">\r\n  <!-- Template view header -->\r\n  <div [ngClass]=\"!totalItems ? 'd-none' : ''\" class=\"d-flex justify-content-between align-items-center mb-5\">\r\n    <div>\r\n      <h4>Assign stores</h4>\r\n      <span>{{ totalItems }} - Total Records ({{ fixtureTemplateDetails?.storeCount ?? 0 }} stores)</span>\r\n    </div>\r\n\r\n    <div class=\"d-flex align-items-center gap-2\">\r\n      <div style=\"position: relative\">\r\n        <input\r\n          type=\"text\"\r\n          [(ngModel)]=\"searchTerm\"\r\n          (change)=\"onSearch()\"\r\n          style=\"padding-left: 3rem; padding-right: 3rem\"\r\n          class=\"form-control\"\r\n          name=\"search\"\r\n          autocomplete=\"off\"\r\n          placeholder=\"Search\"\r\n        />\r\n\r\n        <span class=\"search-icon\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n          </svg>\r\n        </span>\r\n\r\n        <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n          <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n            <g id=\"SVGRepo_iconCarrier\">\r\n              <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n              <circle\r\n                cx=\"12\"\r\n                cy=\"12\"\r\n                r=\"9\"\r\n                stroke=\"#667085\"\r\n                stroke-width=\"2\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              ></circle>\r\n            </g>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n\r\n      <button\r\n        [disabled]=\"!fixtureTemplateDetails?.isEdited\"\r\n        (click)=\"onPublish()\"\r\n        type=\"button\"\r\n        class=\"btn btn-primary d-inline-flex align-items-center me-2\"\r\n      >\r\n        <span class=\"ms-2 text-white\">Publish </span>\r\n      </button>\r\n\r\n      <div class=\"form-check form-switch\">\r\n        <input\r\n          [checked]=\"previewMode\"\r\n          [(ngModel)]=\"previewMode\"\r\n          (ngModelChange)=\"onTogglePreview()\"\r\n          [ngModelOptions]=\"{ standalone: true }\"\r\n          style=\"cursor: pointer\"\r\n          class=\"form-check-input\"\r\n          type=\"checkbox\"\r\n          id=\"showVMs\"\r\n        />\r\n        <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">Preview Mode</label>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div [ngClass]=\"isPageLoading ? '' : 'd-none'\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"shimmer\">\r\n        <div class=\"wrapper\">\r\n          <div class=\"stroke animate title\"></div>\r\n          <div class=\"stroke animate link\"></div>\r\n          <div class=\"stroke animate description\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div [ngClass]=\"isPageLoading || !totalItems ? 'd-none' : ''\">\r\n    <div [ngClass]=\"!fixtureStoreList?.length ? '' : 'd-none'\">\r\n      <div class=\"row\">\r\n        <div class=\"col-lg-12 my-6\">\r\n          <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n            <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n            <div class=\"nodatamaintext mt-3\">No data found</div>\r\n            <div class=\"nodatasubtext\">There is no result for matching filter and search</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div [ngClass]=\"fixtureStoreList?.length !== 0 ? '' : 'd-none'\">\r\n      <!-- Fixture Template list view -->\r\n      <section id=\"list-view\" [ngClass]=\"viewMode === 'list' ? '' : 'd-none'\">\r\n        <div class=\"table-responsive\">\r\n          <table class=\"w-100 table bottom-border text-nowrap\">\r\n            <thead>\r\n              <tr>\r\n                <th>\r\n                  <span (click)=\"onSortTable('storeName')\" class=\"cursor-pointer\">\r\n                    Select all stores\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'storeName' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th>\r\n                  <span (click)=\"onSortTable('city')\" class=\"cursor-pointer\">\r\n                    Location\r\n                    <i\r\n                      class=\"fa ms-1 mt-1\"\r\n                      [ngStyle]=\"{ color: sortedColumn === 'city' ? '#009BF3' : '' }\"\r\n                      [ngClass]=\"sortOrder === 1 && sortedColumn === 'city' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                      aria-hidden=\"true\"\r\n                    ></i>\r\n                  </span>\r\n                </th>\r\n                <th>Cluster</th>\r\n                <th>Last updated</th>\r\n                <th>Status</th>\r\n                <th>Action</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              <tr *ngFor=\"let template of fixtureStoreList\">\r\n                <td>\r\n                  <div class=\"d-flex align-items-center\">\r\n                    <a\r\n                      class=\"text-decoration-underline\"\r\n                      [routerLink]=\"['/manage/stores/plano']\"\r\n                      [queryParams]=\"{ storeId: template?.storeId }\"\r\n                    >\r\n                      {{\r\n                        doubleStore.includes(template.storeId)\r\n                          ? template?.storeName + \" \" + template?.floorName\r\n                          : template?.storeName\r\n                      }}\r\n                      - Plano\r\n                    </a>\r\n                  </div>\r\n                </td>\r\n                <td>\r\n                  {{ template?.storeDetails?.city }}, {{ template?.storeDetails?.state }}, {{ template?.storeDetails?.country }}\r\n                </td>\r\n                <td>\r\n                  <div *ngFor=\"let cluster of template?.clusterDetails\" class=\"badge cluster\">{{ cluster | titlecase }}</div>\r\n                </td>\r\n                <td>\r\n                  {{ template.updatedAt | date }}\r\n                </td>\r\n                <td>\r\n                  <div class=\"badge\" [ngClass]=\"template.status === 'Yet to publish' ? 'yet-to-publish' : 'published'\">\r\n                    {{ template.status | titlecase }}\r\n                  </div>\r\n                </td>\r\n                <td>\r\n                  <svg\r\n                    (click)=\"viewPlano(template)\"\r\n                    style=\"cursor: pointer\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"18\"\r\n                    height=\"18\"\r\n                    viewBox=\"0 0 18 18\"\r\n                    fill=\"none\"\r\n                  >\r\n                    <g clip-path=\"url(#clip0_965_27919)\">\r\n                      <path\r\n                        d=\"M17.25 9C17.25 9 14.25 15 9 15C3.75 15 0.750001 9 0.750001 9C0.750001 9 3.75 3 9 3C14.25 3 17.25 9 17.25 9Z\"\r\n                        stroke=\"#475467\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                      <path\r\n                        d=\"M9 6.75C7.75736 6.75 6.75 7.75736 6.75 9C6.75 10.2426 7.75736 11.25 9 11.25C10.2426 11.25 11.25 10.2426 11.25 9C11.25 7.75736 10.2426 6.75 9 6.75Z\"\r\n                        stroke=\"#475467\"\r\n                        stroke-width=\"2\"\r\n                        stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\"\r\n                      />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_965_27919\">\r\n                        <rect width=\"18\" height=\"18\" fill=\"white\" transform=\"translate(18 18) rotate(-180)\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </td>\r\n              </tr>\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n      </section>\r\n\r\n      <section [ngClass]=\"viewMode === 'preview' ? '' : 'd-none'\">\r\n        <div style=\"height: 70dvh\" class=\"row\">\r\n          <div style=\"border-right: 1px solid #d0d5dd; height: 100%; overflow-y: scroll\" class=\"col-2\">\r\n            <div\r\n              *ngFor=\"let store of fixtureStoreList\"\r\n              (click)=\"onStoreSelect(store)\"\r\n              class=\"store-select\"\r\n              [ngClass]=\"selectedStore === store ? 'selected' : ''\"\r\n            >\r\n              {{ doubleStore.includes(store.storeId) ? store?.storeName + \" - \" + store?.floorName : store?.storeName }}\r\n            </div>\r\n          </div>\r\n\r\n          <div class=\"col-10\" id=\"canvas-card\" style=\"height: 100%; overflow: hidden\">\r\n            <div [ngClass]=\"isCanvasLoading ? '' : 'd-none'\">\r\n              <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n                <div class=\"shimmer\">\r\n                  <div class=\"wrapper\">\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                  <div class=\"wrapper\">\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                  <div class=\"wrapper\">\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"shimmer\">\r\n                  <div class=\"wrapper\">\r\n                    <div class=\"stroke animate title\"></div>\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <div [ngClass]=\"isCanvasLoading ? 'd-none' : ''\">\r\n              <div class=\"store-slider\">\r\n                <div (click)=\"previousNext('previous')\" class=\"arrow\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                    <path\r\n                      d=\"M14.3942 6.33329L8.72756 12L14.3942 17.6666\"\r\n                      stroke=\"#344054\"\r\n                      stroke-width=\"1.88889\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                </div>\r\n                <div\r\n                  class=\"storename\"\r\n                  [routerLink]=\"['/manage/stores/plano']\"\r\n                  [queryParams]=\"{ storeId: selectedStore?.storeId }\"\r\n                >\r\n                  <span class=\"txt me-3\">{{ selectedStore?.storeName }} - Plano</span>\r\n                  <svg\r\n                    style=\"cursor: pointer\"\r\n                    xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"24\"\r\n                    height=\"24\"\r\n                    viewBox=\"0 0 24 24\"\r\n                    fill=\"none\"\r\n                  >\r\n                    <path\r\n                      d=\"M17.6261 12.9688V18.7819C17.6261 19.2958 17.422 19.7886 17.0586 20.152C16.6952 20.5154 16.2023 20.7195 15.6884 20.7195H5.03119C4.51728 20.7195 4.02443 20.5154 3.66104 20.152C3.29765 19.7886 3.09351 19.2958 3.09351 18.7819V8.1246C3.09351 7.6107 3.29765 7.11784 3.66104 6.75445C4.02443 6.39107 4.51728 6.18692 5.03119 6.18692H10.8442M14.7196 3.2804H20.5326M20.5326 3.2804V9.09344M20.5326 3.2804L9.87539 13.9376\"\r\n                      stroke=\"#008EDF\"\r\n                      stroke-width=\"1.93768\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                </div>\r\n                <div (click)=\"previousNext('next')\" class=\"arrow\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                    <path\r\n                      d=\"M8.6059 17.6667L14.2726 12L8.6059 6.33337\"\r\n                      stroke=\"#344054\"\r\n                      stroke-width=\"1.88889\"\r\n                      stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\"\r\n                    />\r\n                  </svg>\r\n                </div>\r\n              </div>\r\n              <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </section>\r\n\r\n      <!-- Pagination -->\r\n      <lib-pagination\r\n        [itemsPerPage]=\"limit\"\r\n        [currentPage]=\"offset\"\r\n        [totalItems]=\"totalItems\"\r\n        [paginationSizes]=\"paginationSizes\"\r\n        [pageSize]=\"paginationSize()\"\r\n        (pageChange)=\"onPageChange($event)\"\r\n        (pageSizeChange)=\"onPageSizeChange($event)\"\r\n      >\r\n      </lib-pagination>\r\n    </div>\r\n  </div>\r\n\r\n  <div style=\"height: 70dvh\" class=\"d-flex align-items-center justify-content-center\" [ngClass]=\"totalItems ? 'd-none' : ''\">\r\n    <div class=\"no-stores-assigned\">\r\n      <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M8.94922 21.1997C8.64792 21.2315 8.34121 21.2505 8.03027 21.2505C7.86075 21.2505 7.69345 21.2436 7.52832 21.2339V31.6069C7.52832 33.0349 8.7113 34.226 10.1992 34.2261H29.8037C31.2917 34.2261 32.4746 33.035 32.4746 31.6069V21.2349C32.3127 21.2441 32.1488 21.2505 31.9844 21.2505C31.6704 21.2505 31.3598 21.2325 31.0537 21.1997V28.9878H8.94922V21.1997ZM30.9307 5.77393H9.07227C8.8949 5.77393 8.73964 5.86671 8.66211 5.98779L8.66016 5.98975L5.15039 11.4731L5.05566 11.6206C3.83012 13.7404 5.09473 16.4674 7.44629 16.7769C7.64721 16.8013 7.83696 16.8159 8.02441 16.8159C9.25449 16.8159 10.3424 16.2872 11.0996 15.4653L12.0215 14.4644L12.9404 15.4683C13.6894 16.2863 14.7761 16.8159 16.0137 16.8159C17.2457 16.8158 18.3376 16.2856 19.0859 15.4683L20.0078 14.4614L20.9297 15.4683C21.6781 16.2857 22.7697 16.8159 24.002 16.8159C25.2342 16.8159 26.3258 16.2857 27.0742 15.4683L27.9961 14.4614L28.918 15.4683C29.6664 16.2857 30.759 16.8159 31.9912 16.8159C32.1726 16.8159 32.3677 16.8021 32.5674 16.7778H32.5664C34.9602 16.4573 36.2283 13.6078 34.8604 11.4731L34.8594 11.4741L31.3428 5.99072L31.3418 5.98779C31.2644 5.86652 31.1082 5.77393 30.9307 5.77393Z\"\r\n          stroke=\"#00A3FF\"\r\n          stroke-width=\"2.5\"\r\n        />\r\n      </svg>\r\n\r\n      <div class=\"txt\">No stores assigned yet</div>\r\n    </div>\r\n  </div>\r\n</section>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\n \r\n@Component({\r\n  selector: 'lib-single-select',\r\n  templateUrl: './custom-select.component.html',\r\n  styleUrl: './custom-select.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CustomsingleSelectComponent implements OnChanges, OnInit {\r\n \r\n  @HostListener('document:click', ['$event'])\r\n  onClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n    if (!target.closest('.dropdown')) {\r\n      this.showDropdown = false;\r\n    }\r\n  }\r\n \r\n  @Input() items: any\r\n  @Input() searchField: string\r\n  @Input() multi: boolean\r\n  @Input() idField: string\r\n  @Input() selectedValues: any = []\r\n  @Input() disabled: boolean | undefined\r\n  @Input() label: string\r\n \r\n  @Output() selected = new EventEmitter<any>()\r\n  filteredValues: any = []\r\n  showDropdown: boolean\r\n  searchValue: string\r\n  instanceId: any;\r\n \r\n \r\n  constructor(private cd: ChangeDetectorRef, private storeBuilderService:StoreBuilderService) { }\r\n  ngOnInit(): void {\r\n    this.instanceId = crypto.randomUUID();\r\n    this.storeBuilderService.dropDownTrigger.subscribe((e:any)=>{           \r\n      if(e !== this.instanceId){        \r\n        this.showDropdown = false\r\n        this.cd.detectChanges()\r\n      }\r\n    })\r\n  }\r\n \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n \r\n    if (changes['items'] && this.items?.length) {\r\n      this.initializeItems();\r\n    }else if(this.items?.length  ===0){\r\n      this.filteredValues = []\r\n    }\r\n    if (changes['selectedValues'] && Array.isArray(changes['selectedValues']?.currentValue) && changes['selectedValues']?.currentValue?.length > 0 && changes['selectedValues']?.currentValue[0]) {            \r\n      this.updateSelectedValues();\r\n    }\r\n  }\r\n \r\n  initializeItems() {\r\n    this.filteredValues = this.items.map((item: any) => ({ ...item }));\r\n    this.updateSelectedValues()\r\n  }\r\n \r\n  updateSelectedValues() {    \r\n    this.selectedValues?.forEach((selectedItem: any) => {\r\n      const item = this.filteredValues?.find((filteredItem: any) => filteredItem?.[this.idField] === selectedItem?.[this.idField]);\r\n      if (item) {\r\n        item.isSelected = true;\r\n      }\r\n    });\r\n   \r\n  }\r\n \r\n  openDropdown(event: any) {\r\n    this.storeBuilderService.dropDownTrigger.next(this.instanceId)\r\n    event.stopPropagation();\r\n    this.showDropdown = !this.showDropdown;\r\n  }\r\n \r\n  onInput(event: any) {\r\n    if (!event.target.value) {\r\n      this.filteredValues = [...this.items];\r\n    } else {\r\n      const searchTerm = event.target.value.toLowerCase();\r\n      this.filteredValues = this.items.filter((item: any) =>\r\n        item[this.searchField].toLowerCase().includes(searchTerm)\r\n      );\r\n    }\r\n    this.updateSelectedValues();\r\n    this.cd.detectChanges();\r\n  }\r\n \r\n  onSelect(event: any, item: any) {    \r\n    if (this.multi) {\r\n      if (event.currentTarget.checked) {\r\n        this.selectedValues.push(item );        \r\n      } else {\r\n        this.selectedValues = this.selectedValues.filter((elem: any) => elem[this.idField] !== item[this.idField]);\r\n      }\r\n    } else {\r\n      this.selectedValues = [{ ...item }];\r\n      this.filteredValues.forEach((element:any) => {\r\n        if(element[this.idField] !== item[this.idField]){\r\n          element.isSelected = false\r\n        }\r\n      });\r\n      this.showDropdown = false;\r\n    }\r\n \r\n    const valuesToEmit = this.selectedValues.map((value: any) => {\r\n      const selectedItem = { ...value };\r\n      delete selectedItem.isSelected;\r\n      return selectedItem;\r\n    });\r\n \r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n \r\n  }\r\n \r\n  onSelectAll(event: any) {\r\n    const selectAll = event.currentTarget.checked;\r\n    this.filteredValues.forEach((item: any) => item.isSelected = selectAll);\r\n \r\n    if (selectAll) {\r\n      this.selectedValues = [...this.filteredValues];\r\n    } else {\r\n      this.selectedValues = [];\r\n    }\r\n \r\n    const valuesToEmit = this.selectedValues.map((value: any) => {\r\n      const { isSelected, ...selectedItem } = value;\r\n      return selectedItem;\r\n    });\r\n \r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n  }\r\n \r\n \r\n  emitSelectedValues(values: any[]) {\r\n    if (this.multi) {\r\n      this.selected.emit(values);\r\n    } else {\r\n      this.selected.emit(values[0]);\r\n    }\r\n  }\r\n \r\n  checkIfAllSelected() {\r\n    return this.filteredValues.every((item: any) => item.isSelected);\r\n  }\r\n}","<div class=\"outer-container\">\r\n    <div [ngClass]=\"disabled ? 'disable-input':''\"  (click)=\"openDropdown($event)\"  class=\"form-select\">\r\n    <ng-container *ngIf=\"multi\" >\r\n    {{selectedValues?.length}} {{label}} Selected    \r\n    </ng-container>\r\n    <ng-container *ngIf=\"!multi\" >\r\n     <span *ngIf=\"!selectedValues?.[0]?.[searchField]\" class=\"text-muted\">Select template</span> <span *ngIf=\"selectedValues?.[0]?.[searchField]\">{{selectedValues?.[0]?.[searchField]?.slice(0,50)}}</span> <span *ngIf=\"selectedValues?.[0]?.[searchField]?.length>49\">....</span>\r\n    </ng-container>\r\n    </div>\r\n    <div [ngClass]=\"showDropdown ? '' : 'd-none'\" class=\"input-container dropdown\" >\r\n        <div class=\"w-100 input-wrapper\">\r\n        <input [(ngModel)]=\"searchValue\" placeholder=\"Search\"  (input)=\"onInput($event)\" type=\"text\">  \r\n        <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n            <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>  \r\n        </div>\r\n        <ul>\r\n            <li *ngIf=\"multi && filteredValues?.length\">\r\n                <label class=\"form-check\" for=\"selectAll\">\r\n                    <input (change)=\"onSelectAll($event)\" [checked]=\"checkIfAllSelected()\" class=\"form-check-input me-3\" type=\"checkbox\"\r\n                        id=\"selectAll\">\r\n                    <span class=\"form-check-label\" >\r\n                        Select All\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngFor=\"let item of filteredValues\" [ngClass]=\"item.isSelected && !multi ? 'selected' : ''\" >\r\n                <label [for]=\"item[idField] + instanceId\" [ngClass]=\"multi  ? '': 'ps-0'\" class=\"form-check\">\r\n                    <input [ngClass]=\"multi  ? '': 'd-none'\" (change)=\"onSelect($event, item)\" [(ngModel)]=\"item.isSelected\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\"\r\n                        [id]=\"item[idField] + instanceId\">\r\n                    <span class=\"form-check-label\" >\r\n                        {{item[searchField]}}\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngIf=\"!filteredValues?.length\" >\r\n                <span class=\"d-flex align-items-center justify-content-center\" >No data found</span>\r\n            </li>\r\n        </ul>  \r\n    </div>  \r\n   \r\n</div>","import {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  OnInit,\r\n  ElementRef,\r\n  ViewChild,\r\n  AfterViewInit,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport * as fabric from \"fabric\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { Location } from \"@angular/common\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n@Component({\r\n  selector: \"lib-find-and-replace\",\r\n  templateUrl: \"./find-and-replace.component.html\",\r\n  styleUrl: \"./find-and-replace.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class FindAndReplaceComponent implements OnInit, AfterViewInit {\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  canvas!: fabric.Canvas;\r\n  modalRef: any;\r\n  planoData: any;\r\n  floorData: any;\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  selectedFloorId = new FormControl(\"\");\r\n  editFixture: boolean = false;\r\n  imgCDN: string;\r\n  storeMetrics = {\r\n    floorCount: 0,\r\n    fixtureCount: 0,\r\n    vmCount: 0,\r\n  };\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  currentStep: any = 1;\r\n  findFixtureList: any = [];\r\n  replaceFixtureList: any[] = [];\r\n  originalReplaceFixtureList: any[] = [];\r\n  replaceFixture: any = {};\r\n  findFixture: any = {};\r\n  clientId: any;\r\n  loading: boolean = false;\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n  searchTerm: string = \"\";\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n  storeList: any = [];\r\n  selectAll: boolean = false;\r\n  selectedStores: any = [];\r\n  appliedValue: any;\r\n  applied: boolean = false;\r\n  step: number = 1;\r\n  replaceStores: any = [];\r\n  viewStore: any = {};\r\n  replaceselectAll: boolean = false;\r\n  ReplaceFixtureData: any = {};\r\n  loadingfixture: boolean = false;\r\n  doubleStore: any = [];\r\n  private readonly destroy$ = new Subject<void>();\r\n  @ViewChild(\"confirmation\") confirmation: any;\r\n  @ViewChild(\"replaceSuccess\") replaceSuccess: any;\r\n  queryParams: any;\r\n  noData: boolean;\r\n  allStores: any[];\r\n  taskAssignedStores: any;\r\n  reviewPendingStores: any;\r\n  taskType: any = \"skip\";\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private location: Location,\r\n    private modalService: NgbModal,\r\n    private titleCase: TitleCasePipe,\r\n    private pageInfo: PageInfoService,\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n    private toast: ToastService,\r\n  ) {\r\n    this.route?.queryParams\r\n      ?.pipe(takeUntil(this.destroy$))\r\n      .subscribe((params: any) => {\r\n        this.queryParams = params;\r\n      });\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.imgCDN = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n    this.getTemplateList();\r\n  }\r\n  ngAfterViewInit(): void {}\r\n\r\n  apply() {\r\n    if (!this.appliedValue) return;\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      fixtureConfigId: this.findFixture._id,\r\n      limit: 100000,\r\n      offset: 0,\r\n      searchValue: this.searchTerm,\r\n      export: false,\r\n      showlookup: false,\r\n    };\r\n    this.storeBuilderService.TemplateStoresList(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.applied = true;\r\n          let filterValue = this.appliedValue.split(\",\");\r\n          this.storeList.forEach((obj: any) => {\r\n            if (filterValue.includes(obj.storeName)) {\r\n              obj.checked = true;\r\n              this.selectedStores.push(obj);\r\n              this.allStores = [...this.selectedStores];\r\n            }\r\n          });\r\n          this.cd.detectChanges();\r\n        }\r\n      },\r\n    });\r\n  }\r\n  getTemplateList() {\r\n    let payload = { clientId: this.clientId };\r\n    this.storeBuilderService.assigedTemplate(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.findFixtureList = res?.data;\r\n          this.originalReplaceFixtureList = res?.data;\r\n          if (this.queryParams.selectedFixture) {\r\n            this.findFixture = this.originalReplaceFixtureList.filter(\r\n              (ele: any) => ele._id === this.queryParams.selectedFixture,\r\n            )[0];\r\n            this.replaceFixtureList = this.originalReplaceFixtureList.filter(\r\n              (ele: any) =>\r\n                ele._id != this.queryParams.selectedFixture &&\r\n                ele.fixtureWidth.value ===\r\n                  this.findFixture?.fixtureWidth?.value,\r\n            );\r\n            this.TemplateStoresList();\r\n          }\r\n        }\r\n      },\r\n    });\r\n  }\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 0;\r\n    this.limit = 10;\r\n    this.TemplateStoresList();\r\n  }\r\n  TemplateStoresList() {\r\n    this.doubleStore = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      fixtureConfigId: this.findFixture._id,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      export: false,\r\n      showlookup: true,\r\n    };\r\n    this.storeBuilderService.TemplateStoresList(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.loading = false;\r\n          this.doubleStore = res.data.doubleStore;\r\n          this.storeList = res.data.data;\r\n          this.totalItems = res.data.count;\r\n          if (this.totalItems < 10) {\r\n            this.paginationSizes = [this.totalItems];\r\n          } else {\r\n            this.paginationSizes = [10, 20, 30];\r\n          }\r\n          const storeExist = new Set(\r\n            this.selectedStores.map((ele: any) => ele.storeId),\r\n          );\r\n\r\n          this.storeList.forEach((details: any) => {\r\n            if (storeExist.has(details.storeId)) {\r\n              details.checked = true;\r\n            }\r\n          });\r\n          this.selectAll = this.storeList.every((obj: any) => obj.checked);\r\n          this.cd.detectChanges();\r\n        } else {\r\n          this.totalItems = 0;\r\n          this.loading = false;\r\n          this.storeList = [];\r\n        }\r\n      },\r\n    });\r\n  }\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n  selectAllStore(event: any) {\r\n    this.selectAll = event.target.checked;\r\n    if (event.target.checked) {\r\n      let payload = {\r\n        clientId: this.clientId,\r\n        fixtureConfigId: this.findFixture._id,\r\n        limit: 100000,\r\n        offset: 0,\r\n        searchValue: this.searchTerm,\r\n        export: false,\r\n        showlookup: false,\r\n      };\r\n      this.storeBuilderService.TemplateStoresList(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.selectedStores = res?.data?.data;\r\n            this.allStores = [...this.selectedStores];\r\n            this.storeList.forEach(\r\n              (obj: any) => (obj.checked = this.selectAll),\r\n            );\r\n            this.cd.detectChanges();\r\n          }\r\n        },\r\n      });\r\n    } else {\r\n      this.selectedStores = [];\r\n      this.allStores = [...this.selectedStores];\r\n      this.storeList.forEach((obj: any) => (obj.checked = this.selectAll));\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n  updateCheck(event: any, storedata: any) {\r\n    this.storeList.forEach((ele: any) => {\r\n      if (ele.floorDetails._id === storedata.floorDetails._id) {\r\n        ele.checked = event.target.checked;\r\n      }\r\n    });\r\n    if (event.target.checked) {\r\n      this.selectedStores.push(storedata);\r\n    } else\r\n      this.selectedStores = this.selectedStores.filter(\r\n        (ele: any) => ele.floorDetails._id != storedata.floorDetails._id,\r\n      );\r\n\r\n    this.selectAll = this.storeList.every((obj: any) => obj.checked);\r\n    this.cd.detectChanges();\r\n    this.allStores = [...this.selectedStores];\r\n  }\r\n  setPageData() {\r\n    this.pageInfo.updateTitle(\"Find And Replace\");\r\n    this.pageInfo.setDescription(\"\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms/verification\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"Fixture Template\",\r\n        path: \"/manage/planogram/fixture-templates\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.TemplateStoresList();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.TemplateStoresList();\r\n  }\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.TemplateStoresList();\r\n  }\r\n  findChange(event: any) {\r\n    this.loading = true;\r\n\r\n    this.findFixture = event;\r\n    this.replaceFixtureList = this.originalReplaceFixtureList.filter(\r\n      (ele: any) =>\r\n        ele._id != event._id &&\r\n        ele.fixtureWidth.value === event.fixtureWidth.value,\r\n    );\r\n\r\n    this.TemplateStoresList();\r\n    this.queryParams = {};\r\n    this.replaceFixture = {};\r\n    const urlWithoutParams = this.location.path().split(\"?\")[0];\r\n    this.location.replaceState(urlWithoutParams);\r\n  }\r\n\r\n  previous() {\r\n    const index = this.selectedStores.findIndex(\r\n      (data: any) =>\r\n        data.floorDetails?._id === this.viewStore.floorDetails?._id,\r\n    );\r\n\r\n    if (index > 0) {\r\n      this.viewStore = this.selectedStores[index - 1];\r\n      this.getStoreFixtures(this.viewStore.storeId);\r\n    }\r\n  }\r\n  next() {\r\n    const index = this.selectedStores.findIndex(\r\n      (data: any) =>\r\n        data.floorDetails?._id === this.viewStore.floorDetails?._id,\r\n    );\r\n\r\n    if (index < this.selectedStores.length - 1) {\r\n      this.viewStore = this.selectedStores[index + 1];\r\n      this.getStoreFixtures(this.viewStore.storeId);\r\n    }\r\n  }\r\n  replaceChange(event: any) {\r\n    this.replaceFixture = event;\r\n    this.findFixtureList = this.originalReplaceFixtureList.filter(\r\n      (ele: any) => ele._id != event._id,\r\n    );\r\n\r\n    this.storeBuilderService.getFixtureTemplateDetails(event._id).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.ReplaceFixtureData = res?.data;\r\n        }\r\n      },\r\n    });\r\n  }\r\n  nextStep() {\r\n    this.step = 2;\r\n    this.viewStore = this.selectedStores[0];\r\n    this.getStoreFixtures(this.viewStore.storeId);\r\n\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      height: 750,\r\n      width: 1000,\r\n    });\r\n\r\n    this.setupZoomHandlers();\r\n  }\r\n  replaceChanges() {\r\n    this.taskAssignedStores = this.replaceStores.filter((ele: any) => {\r\n      let merchTask = ele?.taskDetails?.find(\r\n        (task: any) =>\r\n          task?.status != \"submit\" &&\r\n          !task.breach &&\r\n          task.type == \"merchRollout\",\r\n      );\r\n      let vmTask = ele?.taskDetails?.find(\r\n        (task: any) =>\r\n          task?.status != \"submit\" && !task.breach && task.type == \"vmRollout\",\r\n      );\r\n      return (\r\n        (ele.isMerchEdited.includes(true) && merchTask) ||\r\n        (ele.isVmEdited.includes(true) && vmTask)\r\n      );\r\n    });\r\n    this.reviewPendingStores = this.replaceStores.filter((ele: any) => {\r\n      return (\r\n        (ele.isMerchEdited.includes(true) &&\r\n          ele?.taskFeedback?.fixtureStatus == \"pending\") ||\r\n        (ele.isVmEdited.includes(true) &&\r\n          ele?.taskFeedback?.vmStatus == \"pending\")\r\n      );\r\n    });\r\n    this.modalRef = this.modalService.open(this.confirmation, {\r\n      centered: true,\r\n      size: \"md\",\r\n      backdrop: \"static\",\r\n    });\r\n  }\r\n  ReplaceFixture() {\r\n    let assignedList = this.taskAssignedStores?.map(\r\n      (ele: any) => ele.storeName,\r\n    );\r\n    if (this.taskType == \"skip\") {\r\n      this.replaceStores = this.replaceStores.filter(\r\n        (ele: any) => !assignedList.includes(ele.storeName),\r\n      );\r\n    }\r\n    if (this.reviewPendingStores.length) {\r\n      let reviewStore = this.reviewPendingStores?.map(\r\n        (ele: any) => ele.storeName,\r\n      );\r\n      this.replaceStores = this.replaceStores.filter(\r\n        (ele: any) => !reviewStore.includes(ele.storeName),\r\n      );\r\n    }\r\n    if (!this.replaceStores?.length) {\r\n      this.modalRef.close();\r\n      this.selectedStores.forEach((ele: any) => {\r\n        ele.selected = false;\r\n      });\r\n      return this.toast.getErrorToast(\r\n        \"Please select some other stores to replace\",\r\n      );\r\n    }\r\n    let payload = {\r\n      replaceFixture: this.replaceFixture._id,\r\n      findFixture: this.findFixture._id,\r\n      storeList: this.replaceStores,\r\n      publishAll: false,\r\n      ...(this.taskType != \"skip\" && {\r\n        revoke: true,\r\n        assignedStores: assignedList,\r\n      }),\r\n    };\r\n    this.storeBuilderService.replaceFixtureDetails(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.modalRef.close();\r\n          this.taskAssignedStores = [];\r\n          this.reviewPendingStores = [];\r\n          this.replaceStores.forEach((s: any) => {\r\n            s.disabled = true;\r\n          });\r\n\r\n          this.toast.getSuccessToast(\r\n            `Templates replaced for ${this.replaceStores.length} stores`,\r\n          );\r\n\r\n          const isAllStoreReplaced = this.selectedStores.every(\r\n            (s: any) => s?.disabled ?? false,\r\n          );\r\n\r\n          if (isAllStoreReplaced) {\r\n            this.showSuccessPopup();\r\n          } else {\r\n            this.getStoreFixtures(this.viewStore.storeId);\r\n          }\r\n        }\r\n      },\r\n    });\r\n  }\r\n\r\n  backtohome() {\r\n    if (this.step === 1) {\r\n      this.router.navigate([\"/manage/planogram/fixture-templates\"]);\r\n    } else if (this.step === 2) {\r\n      this.replaceStores = [];\r\n      this.step = 1;\r\n    }\r\n  }\r\n  search(event: any) {\r\n    this.selectedStores = this.allStores.filter((data: any) =>\r\n      data.storeName.toLowerCase().includes(event.target.value.toLowerCase()),\r\n    );\r\n  }\r\n  get isSelectAllDisabled(): boolean {\r\n    return this.selectedStores.some((ss: any) => !ss?.disabled);\r\n  }\r\n  get isReplaceButtonDisabled(): boolean {\r\n    if (this.replaceStores.length === 0) {\r\n      return true;\r\n    } else {\r\n      return this.replaceStores.every((ss: any) => ss?.disabled);\r\n    }\r\n  }\r\n  selectAllReplaceStore(event: any) {\r\n    this.replaceselectAll = event.target.checked;\r\n    if (event.target.checked) {\r\n      this.selectedStores.forEach((obj: any) => {\r\n        if (!obj?.disabled) {\r\n          obj.selected = this.replaceselectAll;\r\n        }\r\n      });\r\n\r\n      this.replaceStores = this.selectedStores;\r\n    } else {\r\n      this.selectedStores.forEach((obj: any) => {\r\n        if (!obj?.disabled) {\r\n          obj.selected = this.replaceselectAll;\r\n        }\r\n      });\r\n      this.replaceStores = [];\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n  viewStorePlano(storedata: any) {\r\n    this.viewStore = storedata;\r\n    this.getStoreFixtures(this.viewStore.storeId);\r\n  }\r\n\r\n  replaceCheck(event: any, storedata: any) {\r\n    if (event.target.checked) {\r\n      this.replaceStores.push(storedata);\r\n    } else {\r\n      this.replaceStores = this.replaceStores.filter(\r\n        (ele: any) => ele.floorDetails._id != storedata.floorDetails._id,\r\n      );\r\n    }\r\n    this.selectedStores.forEach((ele: any) => {\r\n      if (ele.floorDetails._id === storedata.floorDetails._id) {\r\n        ele.selected = event.target.checked;\r\n      }\r\n    });\r\n\r\n    this.replaceselectAll = this.selectedStores.every(\r\n      (obj: any) => obj.selected,\r\n    );\r\n\r\n    console.log(this.replaceStores);\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n  getStoreFixtures(storeId: string) {\r\n    let params;\r\n    if (this.viewStore?.planoId && this.viewStore?.floorId) {\r\n      params = {\r\n        planoId: this.viewStore?.planoId,\r\n        floorId: this.viewStore.floorId,\r\n        id: [storeId],\r\n      };\r\n    } else {\r\n      params = { id: [storeId] };\r\n    }\r\n    this.loadingfixture = true;\r\n    this.storeBuilderService\r\n      .getStoreFixtures(params)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            this.loadingfixture = false;\r\n\r\n            return;\r\n          }\r\n\r\n          this.planoData = res.data[0];\r\n          this.floorData = res.data[0].floors[0];\r\n          const targetFixtureId = this.findFixture._id;\r\n\r\n          // Update fixtures inside layoutPolygon walls\r\n          this.floorData.layoutPolygon\r\n            .filter(\r\n              (ele: any) => ele.elementType === \"wall\" && ele?.fixtures?.length,\r\n            )\r\n            .forEach((ele: any) =>\r\n              ele.fixtures.forEach((fix: any) => {\r\n                if (fix.fixtureConfigId === targetFixtureId) {\r\n                  Object.assign(fix, {\r\n                    ...this.ReplaceFixtureData,\r\n                    issue: true,\r\n                    issueData: [],\r\n                    taskType: \"fixture\",\r\n                  });\r\n                }\r\n              }),\r\n            );\r\n\r\n          // Update center fixtures\r\n          this.floorData.centerFixture.forEach((fix: any) => {\r\n            if (fix.fixtureConfigId === targetFixtureId) {\r\n              Object.assign(fix, {\r\n                ...this.ReplaceFixtureData,\r\n                issue: true,\r\n                issueData: [],\r\n                taskType: \"fixture\",\r\n              });\r\n            }\r\n          });\r\n\r\n          // for (const wallElement of this.floorData.layoutPolygon) {\r\n          //   if (wallElement.elementType !== 'wall' || !Array.isArray(wallElement.fixtures)) continue;\r\n\r\n          //   const fixtureIndex = wallElement.fixtures.findIndex(\r\n          //     (f: any) => f.fixtureConfigId === targetFixtureId\r\n          //   );\r\n\r\n          //   if (fixtureIndex !== -1) {\r\n\r\n          //     wallElement.fixtures[fixtureIndex] = {\r\n          //       ...wallElement.fixtures[fixtureIndex],\r\n          //       ...this.ReplaceFixtureData,\r\n          //       issue: true,\r\n          //       issueData: [],\r\n          //       taskType: 'fixture'\r\n          //     };\r\n\r\n          //     break;\r\n          //   }\r\n          // }\r\n          // const centerFixtures = this.floorData.centerFixture;\r\n\r\n          // const fixtureIndex = centerFixtures.findIndex(\r\n          //   (f: any) => f.fixtureConfigId === targetFixtureId\r\n          // );\r\n\r\n          // if (fixtureIndex !== -1) {\r\n          //   centerFixtures[fixtureIndex] = {\r\n          //     ...centerFixtures[fixtureIndex],\r\n          //     issue: true,\r\n          //     issueData: [],\r\n          //     taskType: \"fixture\"\r\n          //   };\r\n          // }\r\n\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n          this.storeMetrics.floorCount = this.planoData?.floors?.length;\r\n          this.renderFloor();\r\n          this.loadingfixture = false;\r\n        },\r\n        error: (err: any) => {\r\n          this.loadingfixture = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  renderFloor() {\r\n    this.storeMetrics.fixtureCount = this.floorData.fixtureCount;\r\n    this.storeMetrics.vmCount = this.floorData.vmCount;\r\n    this.drawInitialContent();\r\n\r\n    // this.floorData.layoutPolygon.forEach((wall: any) => {\r\n    //   if (wall.elementType === 'wall') {\r\n    //     const wallItem = this.patchWallElements({ elementType: wall.elementType, elementNumber: wall.elementNumber })\r\n\r\n    //     wall.fixtures.forEach((fixture: any) => {\r\n    //       const fixtureGroup = this.patchFixture({ fixtureName: fixture.fixtureName, fixtureConfigId: fixture.fixtureConfigId, _id: fixture._id });\r\n    //       (wallItem.get('fixtures') as FormArray).push(fixtureGroup)\r\n    //     });\r\n    //     this.getFormWalls.push(wallItem)\r\n    //   }\r\n    // });\r\n\r\n    // if (this.floorData?.centerFixture?.length) {\r\n    //   this.floorData?.centerFixture.forEach((fixture: any) => {\r\n    //     const fixtureGroup = this.patchFixture({ fixtureName: fixture.fixtureName, fixtureConfigId: fixture.fixtureConfigId, _id: fixture._id });\r\n    //     (this.layoutForm.get('floorFixtures') as FormArray).push(fixtureGroup)\r\n    //   });\r\n    // }\r\n\r\n    // this.getStoreFeedback(this.floorData.planoId, this.floorData._id)\r\n\r\n    // this.subscribeToFixtureConfigIdChanges();\r\n    this.resizeCanvasToParentSize();\r\n  }\r\n\r\n  resizeCanvasToParentSize() {\r\n    setTimeout(() => {\r\n      const canvasCol = document.getElementById(\"canvas-card\") as HTMLElement;\r\n      if (canvasCol) {\r\n        const width = canvasCol.offsetWidth - 6;\r\n        const height = canvasCol.offsetHeight - 6;\r\n        this.changeCanvasSize(width, height);\r\n      }\r\n    }, 300);\r\n  }\r\n\r\n  changeCanvasSize(newWidth: number, newHeight: number): void {\r\n    const canvasElement = this.canvasEl.nativeElement;\r\n\r\n    canvasElement.width = newWidth;\r\n    canvasElement.height = newHeight;\r\n\r\n    this.canvas.setWidth(newWidth);\r\n    this.canvas.setHeight(newHeight);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  drawInitialContent(): void {\r\n    this.canvas.clear();\r\n    this.drawLayoutElements();\r\n    // this.drawFixtures();\r\n    // this.drawBg();\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        // const elementsGroup: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = this.drawLabeledRectangle(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            w,\r\n            h,\r\n            otherElement,\r\n          );\r\n\r\n          // elementsGroup.push(fixtureObj as fabric.Group);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureObj = this.drawLabeledRectangle(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        w,\r\n        h,\r\n        otherElement,\r\n      );\r\n\r\n      // elementsGroup.push(fixtureObj as fabric.Group);\r\n    }\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureData.issue ? \"#009BF3\" : \"#98A2B3\",\r\n      strokeWidth: fixtureData.issue ? 0.5 : 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n        L ${topX + topWidth} ${secondBoxY} \r\n        L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n        Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n          topX + topWidth - radius\r\n        } ${secondBoxY + innerBoxHeight} \r\n        L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n        Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n          secondBoxY + innerBoxHeight - radius\r\n        } \r\n        L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#009BF3\" : \"#344054\",\r\n        stroke: fixtureData.issue ? \"#51C1FF\" : \"#667085\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit shelf area\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text = fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.imgCDN}${vm.vmImageUrl}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureData.issue ? \"#6938EF\" : \"#1D2939\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        heigth: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        selectable: false,\r\n        evented: false,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n        // hoverCursor: 'pointer'\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n    };\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  preventEnter(event: any) {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n  }\r\n\r\n  showSuccessPopup() {\r\n    try {\r\n      this.modalService.open(this.replaceSuccess, {\r\n        centered: true,\r\n        size: \"md\",\r\n        backdrop: \"static\",\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ showSuccessPopup [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  onClickSuccessOk(modal: any) {\r\n    modal?.dismiss();\r\n\r\n    const currentPath = this.router.url.split(\"?\")[0].split(\"#\")[0];\r\n\r\n    this.router.navigateByUrl(\"/\", { skipLocationChange: true }).then(() => {\r\n      this.router.navigate([currentPath]);\r\n    });\r\n  }\r\n}\r\n","<section id=\"fixture-template\">\r\n    <div class=\"header\">\r\n        <div class=\"d-flex align-items-center gap-5 position-relative w-100\">\r\n            <!-- Left button -->\r\n            <!-- <button type=\"button\" class=\"btn btn-outline p-3\" (click)=\"backtohome()\" >\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n                        stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </button> -->\r\n            <!-- Title -->\r\n            <h2 class=\"m-0\">Find & Replace</h2>\r\n            <!-- Centered block -->\r\n            <div class=\"position-absolute start-50 translate-middle-x d-flex align-items-center\">\r\n                <span *ngIf=\"step===1\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"#1D2939\" />\r\n                        <path\r\n                            d=\"M10.3253 5.27273V14H8.74432V6.81108H8.69318L6.65199 8.11506V6.66619L8.82102 5.27273H10.3253Z\"\r\n                            fill=\"white\" />\r\n                    </svg>\r\n                </span>\r\n                <span *ngIf=\"step===2\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"#039855\" />\r\n                        <path d=\"M14 7L8.5 12.5L6 10\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </span>\r\n                &nbsp; Select templates\r\n                <span class=\"mx-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"103\" height=\"2\" viewBox=\"0 0 103 2\"\r\n                        fill=\"none\">\r\n                        <path d=\"M0 1H103\" stroke=\"#98A2B3\" stroke-width=\"1.5\" />\r\n                    </svg></span>\r\n\r\n                <span *ngIf=\"step===1\" class=\"fw-bold\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n                        viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"#D0D5DD\" />\r\n                        <path\r\n                            d=\"M6.77557 14V12.858L9.8054 9.88778C10.0952 9.59517 10.3366 9.33523 10.5298 9.10795C10.723 8.88068 10.8679 8.66051 10.9645 8.44744C11.0611 8.23437 11.1094 8.0071 11.1094 7.76562C11.1094 7.49006 11.0469 7.25426 10.9219 7.05824C10.7969 6.85938 10.625 6.70597 10.4062 6.59801C10.1875 6.49006 9.93892 6.43608 9.66051 6.43608C9.37358 6.43608 9.12216 6.49574 8.90625 6.61506C8.69034 6.73153 8.52273 6.89773 8.40341 7.11364C8.28693 7.32955 8.22869 7.58665 8.22869 7.88494H6.72443C6.72443 7.33097 6.85085 6.84943 7.10369 6.44034C7.35653 6.03125 7.70455 5.71449 8.14773 5.49006C8.59375 5.26562 9.10511 5.15341 9.68182 5.15341C10.267 5.15341 10.7813 5.26278 11.2244 5.48153C11.6676 5.70028 12.0114 6 12.2557 6.38068C12.5028 6.76136 12.6264 7.19602 12.6264 7.68466C12.6264 8.01136 12.5639 8.33239 12.4389 8.64773C12.3139 8.96307 12.0938 9.3125 11.7784 9.69602C11.4659 10.0795 11.027 10.544 10.4616 11.0895L8.95739 12.6193V12.679H12.7585V14H6.77557Z\"\r\n                            fill=\"white\" />\r\n                    </svg></span>\r\n                <span *ngIf=\"step===2\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"#1D2939\" />\r\n                        <path\r\n                            d=\"M6.77557 14V12.858L9.8054 9.88778C10.0952 9.59517 10.3366 9.33523 10.5298 9.10795C10.723 8.88068 10.8679 8.66051 10.9645 8.44744C11.0611 8.23437 11.1094 8.0071 11.1094 7.76562C11.1094 7.49006 11.0469 7.25426 10.9219 7.05824C10.7969 6.85938 10.625 6.70597 10.4062 6.59801C10.1875 6.49006 9.93892 6.43608 9.66051 6.43608C9.37358 6.43608 9.12216 6.49574 8.90625 6.61506C8.69034 6.73153 8.52273 6.89773 8.40341 7.11364C8.28693 7.32955 8.22869 7.58665 8.22869 7.88494H6.72443C6.72443 7.33097 6.85085 6.84943 7.10369 6.44034C7.35653 6.03125 7.70455 5.71449 8.14773 5.49006C8.59375 5.26562 9.10511 5.15341 9.68182 5.15341C10.267 5.15341 10.7813 5.26278 11.2244 5.48153C11.6676 5.70028 12.0114 6 12.2557 6.38068C12.5028 6.76136 12.6264 7.19602 12.6264 7.68466C12.6264 8.01136 12.5639 8.33239 12.4389 8.64773C12.3139 8.96307 12.0938 9.3125 11.7784 9.69602C11.4659 10.0795 11.027 10.544 10.4616 11.0895L8.95739 12.6193V12.679H12.7585V14H6.77557Z\"\r\n                            fill=\"white\" />\r\n                    </svg>\r\n                </span>\r\n                <span [ngClass]=\"step === 1 ? 'text-muted mx-3' : 'mx-3'\"> Review stores & Replace</span>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n<section class=\"bg-white mt-3 min-vh-100\" *ngIf=\"step===1\">\r\n    <div class=\"py-5\">\r\n        <div class=\"row justify-content-between align-items-start vh-30\">\r\n            <div class=\"col-md-5 m-4\">\r\n                <h6 class=\"mb-2\">Find</h6>\r\n                <div class=\"mt-1\">\r\n                    <lib-single-select [items]=\"findFixtureList\" [multi]=\"false\" [searchField]=\"'fixtureName'\"\r\n                        [idField]=\"'_id'\" (selected)=\"findChange($event)\"\r\n                        [selectedValues]=\"[findFixture]\"></lib-single-select>\r\n                    <div class=\"bg-light p-3  m-3 gap-3 \" *ngIf=\"findFixture?.fixtureCategory\">\r\n                        <div class=\"row mt-3\">\r\n                            <div class=\"col-6\"><strong>Fixture type:</strong> {{findFixture?.fixtureCategory}}</div>\r\n                            <div class=\"col-6\"><strong>Brand:</strong> <span\r\n                                    *ngIf=\"findFixture?.productBrandName.length>0\"><span\r\n                                        *ngFor=\"let item of findFixture.productBrandName\">{{item}}</span></span></div>\r\n                        </div>\r\n                        <div class=\"row mt-4\">\r\n                            <div class=\"col-6\"><strong>Total stores:</strong> {{findFixture?.storeCount}}</div>\r\n                            <div class=\"col-6\"><strong>Category:</strong> <span\r\n                                    *ngIf=\"findFixture?.productCategory.length>0\"><span\r\n                                        *ngFor=\"let item of findFixture.productCategory\">{{item}}</span></span></div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Arrow -->\r\n            <div class=\"col-md-1 d-flex justify-content-center align-items-center pt-20\">\r\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"66\" height=\"17\" viewBox=\"0 0 66 17\" fill=\"none\">\r\n                    <path\r\n                        d=\"M1.18848 8.34948L64.8125 8.34948M64.8125 8.34948L57.6837 1.2207M64.8125 8.34948L57.6837 15.4783\"\r\n                        stroke=\"#667085\" stroke-width=\"2.03679\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n            </div>\r\n\r\n            <!-- Replace With -->\r\n            <div class=\"col-md-5 m-4\">\r\n                <h6 class=\"mb-2\">Replace with</h6>\r\n                <div class=\"mt-1\">\r\n                    <lib-single-select [items]=\"replaceFixtureList\" [multi]=\"false\" [searchField]=\"'fixtureName'\"\r\n                        [idField]=\"'_id'\" (selected)=\"replaceChange($event)\"\r\n                        [selectedValues]=\"[replaceFixture]\"></lib-single-select>\r\n                    <div class=\"bg-light p-3  m-3 gap-3 \" *ngIf=\"replaceFixture?.fixtureCategory\">\r\n                        <div class=\"row mt-3\">\r\n                            <div class=\"col-6\"><strong>Fixture type:</strong> {{replaceFixture?.fixtureCategory}}</div>\r\n                            <div class=\"col-6\"><strong>Brand:</strong><span\r\n                                    *ngIf=\"replaceFixture?.productBrandName.length>0\"><span\r\n                                        *ngFor=\"let item of replaceFixture.productBrandName\">{{item}}</span></span>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"row mt-4\">\r\n                            <div class=\"col-6\"><strong>Total stores:</strong> {{replaceFixture?.storeCount}}</div>\r\n                            <div class=\"col-6\"><strong>Category:</strong> <span\r\n                                    *ngIf=\"replaceFixture?.productCategory.length>0\"><span\r\n                                        *ngFor=\"let item of replaceFixture.productCategory\">{{item}}</span></span></div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"text-center mt-10\" *ngIf=\"loading\">\r\n            <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"62\" height=\"62\" viewBox=\"0 0 62 62\" fill=\"none\">\r\n                    <path\r\n                        d=\"M53.9138 54.153L42.8387 43.078M48.8218 28.6931C48.8218 39.942 39.7028 49.0611 28.4539 49.0611C17.205 49.0611 8.08594 39.942 8.08594 28.6931C8.08594 17.4442 17.205 8.3252 28.4539 8.3252C39.7028 8.3252 48.8218 17.4442 48.8218 28.6931Z\"\r\n                        stroke=\"#101828\" stroke-width=\"4.07359\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg></span>\r\n            <p class=\"text-muted\">Fetching all the stores tagged with <strong>\"{{findFixture?.fixtureName}}\"</strong>.\r\n            </p>\r\n        </div>\r\n         <div *ngIf=\"findFixture?.storeCount==0&&!loading\">\r\n                <div class=\"row\">\r\n                    <div class=\"col-lg-12 my-6 mt-5\">\r\n                        <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                            <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\"\r\n                                    fill=\"none\">\r\n                                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n                                        stroke-width=\"13.3333\" />\r\n                                    <path\r\n                                        d=\"M35.9492 48.1997C35.6479 48.2315 35.3412 48.2505 35.0303 48.2505C34.8608 48.2505 34.6935 48.2436 34.5283 48.2339V58.6069C34.5283 60.0349 35.7113 61.226 37.1992 61.2261H56.8037C58.2917 61.2261 59.4746 60.035 59.4746 58.6069V48.2349C59.3127 48.2441 59.1488 48.2505 58.9844 48.2505C58.6704 48.2505 58.3598 48.2325 58.0537 48.1997V55.9878H35.9492V48.1997ZM57.9307 32.7739H36.0723C35.8949 32.7739 35.7396 32.8667 35.6621 32.9878L35.6602 32.9897L32.1504 38.4731L32.0557 38.6206C30.8301 40.7404 32.0947 43.4674 34.4463 43.7769C34.6472 43.8013 34.837 43.8159 35.0244 43.8159C36.2545 43.8159 37.3424 43.2872 38.0996 42.4653L39.0215 41.4644L39.9404 42.4683C40.6894 43.2863 41.7761 43.8159 43.0137 43.8159C44.2457 43.8158 45.3376 43.2856 46.0859 42.4683L47.0078 41.4614L47.9297 42.4683C48.6781 43.2857 49.7697 43.8159 51.002 43.8159C52.2342 43.8159 53.3258 43.2857 54.0742 42.4683L54.9961 41.4614L55.918 42.4683C56.6664 43.2857 57.759 43.8159 58.9912 43.8159C59.1726 43.8159 59.3677 43.8021 59.5674 43.7778H59.5664C61.9602 43.4573 63.2283 40.6078 61.8604 38.4731L61.8594 38.4741L58.3428 32.9907L58.3418 32.9878C58.2644 32.8665 58.1082 32.7739 57.9307 32.7739Z\"\r\n                                        stroke=\"#00A3FF\" stroke-width=\"2.5\" />\r\n                                </svg></span>\r\n                            <h3 class=\"mt-3\">No stores assigned to this template</h3>\r\n                            <h6>This template cannot be replaced because it isn't assigned to any stores.</h6>\r\n\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        <div class=\"p-4 pt-0 mt-4 mb-2\" *ngIf=\"findFixture?.fixtureName&&!loading&&findFixture?.storeCount>0\">\r\n            <hr style=\"border-top: 1px solid #46484a;\">\r\n            <div class=\"mt-5\">\r\n                <div>\r\n                    <h3>Replace template</h3>\r\n                </div>\r\n                \r\n                <div>The stores listed below use the <span class=\"fw-bold\">“{{findFixture?.fixtureName}}”</span> template. Select one or more stores to replace it with <span class=\"fw-bold\">“{{replaceFixture?.fixtureName}}”</span>.</div>\r\n            </div>\r\n            <div class=\"mt-3 mb-4 d-flex align-items-center gap-2 w-100\">\r\n                <input type=\"text\" [(ngModel)]=\"appliedValue\" class=\"form-control\" placeholder=\"Enter value\">\r\n                <button class=\"btn btn-primary\" [disabled]=\"!appliedValue\" (click)=\"apply()\">Apply</button>\r\n            </div>\r\n            <section id=\"list-view\" *ngIf=\"!loading\">\r\n                <div \r\n                    class=\"d-flex justify-content-between align-items-center mb-5\">\r\n                    <div class=\"text-muted ms-3\">\r\n                        <span *ngIf=\"selectedStores.length===0\">{{ totalItems }} - Stores</span>\r\n                        <span *ngIf=\"selectedStores.length>0\">{{selectedStores.length}} stores selected out of\r\n                            {{totalItems}}</span>\r\n                    </div>\r\n\r\n                    <div class=\"d-flex align-items-center gap-2\">\r\n                        <svg class=\"svg-icon svg-icon-1 position-absolute ms-3\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                            width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                            <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n                                transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n                            <path\r\n                                d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n                                fill=\"currentColor\"></path>\r\n                        </svg>\r\n                        <input type=\"text\" (change)=\"onSearch()\" [(ngModel)]=\"searchTerm\"\r\n                            class=\"form-control ps-13 me-2\" name=\"search\" autocomplete=\"off\" placeholder=\"Search\"\r\n                            autocomplete=\"off\" />\r\n                    </div>\r\n                </div>\r\n                <div class=\"table-responsive border border-light\" *ngIf=\"storeList.length>0\">\r\n                    <table class=\"w-100 table bottom-border text-nowrap\">\r\n                        <thead>\r\n                            <tr>\r\n                                <th>\r\n                                    <span class=\"cursor-pointer d-flex align-items-center\">\r\n                                        <input id=\"label\" (click)=\"selectAllStore($event)\"\r\n                                            class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\"\r\n                                            [(ngModel)]=\"selectAll\">\r\n                                        <span (click)=\"onSortTable('storeName')\">\r\n                                            Store Name\r\n                                            <i class=\"fa ms-1 mt-1\"\r\n                                                [ngStyle]=\"{ color: sortedColumn === 'storeName' ? '#009BF3' : '' }\"\r\n                                                [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                                                aria-hidden=\"true\"></i>\r\n                                        </span>\r\n                                    </span>\r\n                                </th>\r\n                                <th>\r\n                                    <span (click)=\"onSortTable('spocName')\" class=\"cursor-pointer\">\r\n                                        SPOC Name\r\n                                        <i class=\"fa ms-1 mt-1\"\r\n                                            [ngStyle]=\"{ color: sortedColumn === 'spocName' ? '#009BF3' : '' }\"\r\n                                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'spocName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                                            aria-hidden=\"true\"></i>\r\n                                    </span>\r\n                                </th>\r\n                                <th>\r\n                                    <span (click)=\"onSortTable('spocEmail')\" class=\"cursor-pointer\">\r\n                                        SPOC Email\r\n                                        <i class=\"fa ms-1 mt-1\"\r\n                                            [ngStyle]=\"{ color: sortedColumn === 'spocEmail' ? '#009BF3' : '' }\"\r\n                                            [ngClass]=\"sortOrder === 1 && sortedColumn === 'spocEmail' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                                            aria-hidden=\"true\"></i>\r\n                                    </span>\r\n                                </th>\r\n\r\n                                <th>\r\n                                    Cluster Name\r\n                                </th>\r\n\r\n                            </tr>\r\n                        </thead>\r\n                        <tbody class=\"fw-light\">\r\n                            <tr *ngFor=\"let store of storeList\">\r\n                                <td>\r\n                                    <div class=\"d-flex align-items-center\">\r\n                                        <input id=\"label\" (click)=\"updateCheck($event,store)\"\r\n                                            class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\"\r\n                                            [(ngModel)]=\"store.checked\">\r\n                                        {{ doubleStore.includes(store.storeId) ? store.storeName +' - '+ store?.floorDetails?.floorName : store.storeName }}\r\n                                    </div>\r\n                                </td>\r\n                                <td>{{ store.spocName }}</td>\r\n                                <td>{{ store.spocEmail }}</td>\r\n                                <td>\r\n                                    <span *ngIf=\"store.clusterData.length <= 0\"> - </span>\r\n\r\n                                    <div [ngbTooltip]=\"brandTooltip\" class=\"cursor-pointer\">\r\n                                        <div *ngFor=\"let b of store.clusterData; let i = index\"\r\n                                            class=\"badge inactive me-2\">\r\n                                            <span *ngIf=\"i <= 2\"> {{ b }} </span>\r\n                                            <span *ngIf=\"i == 3\"> +{{ store.clusterData.length - 3 }} </span>\r\n                                        </div>\r\n                                    </div>\r\n\r\n                                    <ng-template #brandTooltip>\r\n                                        <ng-container *ngFor=\"let c of store.clusterData; let last = last\">\r\n                                            {{ c }}\r\n                                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                        </ng-container>\r\n                                    </ng-template>\r\n                                </td>\r\n\r\n                            </tr>\r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n            </section>\r\n\r\n\r\n            <!-- Pagination -->\r\n            <lib-pagination *ngIf=\"storeList.length>0\" [itemsPerPage]=\"limit\" [currentPage]=\"offset\"\r\n                [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\r\n                (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\">\r\n            </lib-pagination>\r\n            <div *ngIf=\"!storeList.length&&!loading\">\r\n                <div class=\"row\">\r\n                    <div class=\"col-lg-12 my-6 mt-5\">\r\n                        <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                            <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\"\r\n                                    fill=\"none\">\r\n                                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                                    <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n                                        stroke-width=\"13.3333\" />\r\n                                    <path\r\n                                        d=\"M35.9492 48.1997C35.6479 48.2315 35.3412 48.2505 35.0303 48.2505C34.8608 48.2505 34.6935 48.2436 34.5283 48.2339V58.6069C34.5283 60.0349 35.7113 61.226 37.1992 61.2261H56.8037C58.2917 61.2261 59.4746 60.035 59.4746 58.6069V48.2349C59.3127 48.2441 59.1488 48.2505 58.9844 48.2505C58.6704 48.2505 58.3598 48.2325 58.0537 48.1997V55.9878H35.9492V48.1997ZM57.9307 32.7739H36.0723C35.8949 32.7739 35.7396 32.8667 35.6621 32.9878L35.6602 32.9897L32.1504 38.4731L32.0557 38.6206C30.8301 40.7404 32.0947 43.4674 34.4463 43.7769C34.6472 43.8013 34.837 43.8159 35.0244 43.8159C36.2545 43.8159 37.3424 43.2872 38.0996 42.4653L39.0215 41.4644L39.9404 42.4683C40.6894 43.2863 41.7761 43.8159 43.0137 43.8159C44.2457 43.8158 45.3376 43.2856 46.0859 42.4683L47.0078 41.4614L47.9297 42.4683C48.6781 43.2857 49.7697 43.8159 51.002 43.8159C52.2342 43.8159 53.3258 43.2857 54.0742 42.4683L54.9961 41.4614L55.918 42.4683C56.6664 43.2857 57.759 43.8159 58.9912 43.8159C59.1726 43.8159 59.3677 43.8021 59.5674 43.7778H59.5664C61.9602 43.4573 63.2283 40.6078 61.8604 38.4731L61.8594 38.4741L58.3428 32.9907L58.3418 32.9878C58.2644 32.8665 58.1082 32.7739 57.9307 32.7739Z\"\r\n                                        stroke=\"#00A3FF\" stroke-width=\"2.5\" />\r\n                                </svg></span>\r\n                            <h3 class=\"mt-3\">Store not found</h3>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end m-5\" *ngIf=\"selectedStores.length>0&&replaceFixture._id\">\r\n        <button class=\"btn btn-primary mb-3\" (click)=\"nextStep()\">Next: Review</button>\r\n    </div>\r\n</section>\r\n\r\n<section class=\"bg-white mt-3 min-vh-100\" [ngStyle]=\"{ 'display': step === 2 ? 'block' : 'none' }\">\r\n    <div class=\"d-flex justify-content-between align-items-center mt-5\">\r\n        <div class=\"fw-bold ms-4\">{{replaceStores.length}}/{{selectedStores.length}} Stores Selected</div>\r\n        <div calss=\"justify-content-end me-5\">\r\n            <button class=\"btn btn-primary m-4\" [disabled]=\"isReplaceButtonDisabled\" (click)=\"replaceChanges()\">\r\n                Replace for selected stores\r\n            </button>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"mt-7 row\">\r\n        <div class=\"col-3\">\r\n            <div class=\"dropdownselect h-900px scroll-y border-end border-1 \" style=\"border-color: #D0D5DD;\">\r\n                <div class=\"d-flex justify-content-left \"\r\n                    [ngClass]=\"replaceselectAll ? 'backgroundBorder':'withoutbackground'\" *ngIf=\"selectedStores.length\">\r\n                    <input class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\" [(ngModel)]=\"replaceselectAll\"\r\n                        (click)=\"selectAllReplaceStore($event)\" [disabled]=\"!isSelectAllDisabled\"> \r\n                    <span [ngClass]=\"replaceselectAll ? 'usage-detection':'usage-text'\">\r\n                        Select All({{selectedStores.length}} stores)\r\n                    </span>\r\n                </div>\r\n                <hr style=\"border-top: 1px solid #46484a;\">\r\n                <!-- dropdownbg -->\r\n                <div class=\"position-relative \">\r\n                    <input type=\"text\" (input)=\"search($event)\" class=\"form-control ps-9\" placeholder=\"Search...\">\r\n                    <i class=\"bi bi-search position-absolute top-50 start-0 translate-middle-y ms-3 text-muted\"></i>\r\n                </div>\r\n                @if(selectedStores.length){\r\n                    <div  class=\"my-4\" *ngFor=\"let list of selectedStores;let i=index\">\r\n                        <div [ngClass]=\"viewStore?.floorDetails?._id === list?.floorDetails?._id ? 'backgroundBorder':'withoutbackground'\">\r\n                            <input id=\"label{{i}}\" (click)=\"replaceCheck($event,list)\"\r\n                                class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\" [(ngModel)]=\"list.selected\" [disabled]=\"list.disabled\">\r\n                            <span class=\"cursor-pointer\" (click)=\"viewStorePlano(list)\"\r\n                                [ngClass]=\"viewStore?.floorDetails?._id === list?.floorDetails?._id ? 'usage-detection':'usage-text'\">{{doubleStore.includes(list.storeId) ? list.storeName +' - '+ list?.floorDetails?.floorName : list.storeName}}</span>\r\n                        </div>\r\n                    </div>\r\n                }@else {\r\n                <div class=\"no-stores-block\">\r\n                    <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                        d=\"M8.94922 21.1997C8.64792 21.2315 8.34121 21.2505 8.03027 21.2505C7.86075 21.2505 7.69345 21.2436 7.52832 21.2339V31.6069C7.52832 33.0349 8.7113 34.226 10.1992 34.2261H29.8037C31.2917 34.2261 32.4746 33.035 32.4746 31.6069V21.2349C32.3127 21.2441 32.1488 21.2505 31.9844 21.2505C31.6704 21.2505 31.3598 21.2325 31.0537 21.1997V28.9878H8.94922V21.1997ZM30.9307 5.77393H9.07227C8.8949 5.77393 8.73964 5.86671 8.66211 5.98779L8.66016 5.98975L5.15039 11.4731L5.05566 11.6206C3.83012 13.7404 5.09473 16.4674 7.44629 16.7769C7.64721 16.8013 7.83696 16.8159 8.02441 16.8159C9.25449 16.8159 10.3424 16.2872 11.0996 15.4653L12.0215 14.4644L12.9404 15.4683C13.6894 16.2863 14.7761 16.8159 16.0137 16.8159C17.2457 16.8158 18.3376 16.2856 19.0859 15.4683L20.0078 14.4614L20.9297 15.4683C21.6781 16.2857 22.7697 16.8159 24.002 16.8159C25.2342 16.8159 26.3258 16.2857 27.0742 15.4683L27.9961 14.4614L28.918 15.4683C29.6664 16.2857 30.759 16.8159 31.9912 16.8159C32.1726 16.8159 32.3677 16.8021 32.5674 16.7778H32.5664C34.9602 16.4573 36.2283 13.6078 34.8604 11.4731L34.8594 11.4741L31.3428 5.99072L31.3418 5.98779C31.2644 5.86652 31.1082 5.77393 30.9307 5.77393Z\"\r\n                        stroke=\"#00A3FF\"\r\n                        stroke-width=\"2.5\"\r\n                        />\r\n                    </svg>\r\n\r\n                    <span>No stores found </span>\r\n                </div>\r\n                }\r\n            </div>\r\n        </div>\r\n        <div class=\"col-9\">\r\n            <div class=\"p-5\">\r\n                <div class=\"text-center cursor-pointer d-flex justify-content-center align-items-center\">\r\n                    <!-- <span class=\"me-4\" (click)=\"previous()\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"35\" height=\"35\" viewBox=\"0 0 35 35\" fill=\"none\">\r\n                            <rect x=\"34.561\" y=\"34.5469\" width=\"34\" height=\"34\" rx=\"17\"\r\n                                transform=\"rotate(180 34.561 34.5469)\" fill=\"#F2F4F7\" />\r\n                            <path d=\"M20.3945 11.88L14.7279 17.5467L20.3945 23.2134\" stroke=\"#344054\"\r\n                                stroke-width=\"1.88889\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                    </span>\r\n                    <a [routerLink]=\"['/manage/planogram/manage-planogram']\"\r\n                        [queryParams]=\"{ planoId: viewStore?.planoId, floorId: viewStore?.floorId }\"\r\n                        class=\"fw-bold text-primary d-flex justify-content-center align-items-center gap-1\">{{viewStore?.storeName}}<span class=\"ms-1\"><svg\r\n                                xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"25\" viewBox=\"0 0 24 25\"\r\n                                fill=\"none\">\r\n                                <path\r\n                                    d=\"M17.6264 13.5158V19.3289C17.6264 19.8428 17.4222 20.3356 17.0588 20.699C16.6954 21.0624 16.2026 21.2665 15.6887 21.2665H5.03143C4.51753 21.2665 4.02467 21.0624 3.66128 20.699C3.2979 20.3356 3.09375 19.8428 3.09375 19.3289V8.6716C3.09375 8.15769 3.2979 7.66484 3.66128 7.30145C4.02467 6.93806 4.51753 6.73392 5.03143 6.73392H10.8445M14.7198 3.82739H20.5329M20.5329 3.82739V9.64044M20.5329 3.82739L9.87564 14.4846\"\r\n                                    stroke=\"#008EDF\" stroke-width=\"1.93768\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg></span></a>\r\n                    <span (click)=\"next()\" class=\"ms-4\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"35\" height=\"35\"\r\n                            viewBox=\"0 0 35 35\" fill=\"none\">\r\n                            <rect x=\"0.439453\" y=\"0.546875\" width=\"34\" height=\"34\" rx=\"17\" fill=\"#F2F4F7\" />\r\n                            <path d=\"M14.606 23.2137L20.2726 17.547L14.606 11.8804\" stroke=\"#344054\"\r\n                                stroke-width=\"1.88889\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg></span> -->\r\n\r\n                         <div class=\"store-slider\">\r\n                    <div (click)=\"previous()\" class=\"arrow\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                            <path\r\n                            d=\"M14.3942 6.33329L8.72756 12L14.3942 17.6666\"\r\n                            stroke=\"#344054\"\r\n                            stroke-width=\"1.88889\"\r\n                            stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                    <div class=\"storename\" [routerLink]=\"['/manage/planogram/manage-planogram']\" [queryParams]=\"{ planoId: viewStore?.planoId, floorId: viewStore?.floorId }\">\r\n                        <span class=\"txt me-3\">{{doubleStore.includes(viewStore.storeId) ? viewStore.storeName +' - '+ viewStore?.floorDetails?.floorName : viewStore.storeName}} - Plano</span>\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path\r\n                            d=\"M15.5323 10.8751V16.6881C15.5323 17.202 15.3282 17.6949 14.9648 18.0583C14.6014 18.4216 14.1085 18.6258 13.5946 18.6258H2.93738C2.42347 18.6258 1.93061 18.4216 1.56723 18.0583C1.20384 17.6949 0.999695 17.202 0.999695 16.6881V6.03085C0.999695 5.51695 1.20384 5.02409 1.56723 4.6607C1.93061 4.29732 2.42347 4.09317 2.93738 4.09317H8.75042M12.6258 1.18665H18.4388M18.4388 1.18665V6.99969M18.4388 1.18665L7.78158 11.8439\"\r\n                            stroke=\"#008EDF\"\r\n                            stroke-width=\"1.93768\"\r\n                            stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                    <div (click)=\"next()\" class=\"arrow\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                            <path\r\n                            d=\"M8.6059 17.6667L14.2726 12L8.6059 6.33337\"\r\n                            stroke=\"#344054\"\r\n                            stroke-width=\"1.88889\"\r\n                            stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                </div>\r\n\r\n                </div>\r\n                <div id=\"canvas-card\" class=\"w-100 p-5\" [ngStyle]=\"{ 'display': !loadingfixture ? 'block' : 'none' }\">\r\n                    <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n                </div>\r\n                <div *ngIf=\"loadingfixture\">\r\n                    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n                        <div class=\"shimmer\">\r\n                            <div class=\"wrapper\">\r\n                                <div class=\"stroke animate title\"></div>\r\n                                <div class=\"stroke animate link\"></div>\r\n                                <div class=\"stroke animate description\"></div>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"shimmer\">\r\n                            <div class=\"wrapper\">\r\n                                <div class=\"stroke animate title\"></div>\r\n                                <div class=\"stroke animate link\"></div>\r\n                                <div class=\"stroke animate description\"></div>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"shimmer\">\r\n                            <div class=\"wrapper\">\r\n                                <div class=\"stroke animate title\"></div>\r\n                                <div class=\"stroke animate link\"></div>\r\n                                <div class=\"stroke animate description\"></div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n\r\n<ng-template #confirmation let-model>\r\n    <div class=\"modal-wrapper\" (keydown.enter)=\"preventEnter($event)\">  \r\n        <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"mb-5\">\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/>\r\n            <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/>\r\n            <path d=\"M27.9998 24V28M27.9998 32H28.0098M26.2898 18.86L17.8198 33C17.6451 33.3024 17.5527 33.6453 17.5518 33.9945C17.5508 34.3437 17.6413 34.6871 17.8142 34.9905C17.9871 35.2939 18.2365 35.5467 18.5375 35.7238C18.8385 35.9009 19.1806 35.9961 19.5298 36H36.4698C36.819 35.9961 37.1611 35.9009 37.4621 35.7238C37.7631 35.5467 38.0124 35.2939 38.1854 34.9905C38.3583 34.6871 38.4488 34.3437 38.4478 33.9945C38.4468 33.6453 38.3544 33.3024 38.1798 33L29.7098 18.86C29.5315 18.5661 29.2805 18.3231 28.981 18.1544C28.6814 17.9858 28.3435 17.8972 27.9998 17.8972C27.656 17.8972 27.3181 17.9858 27.0186 18.1544C26.7191 18.3231 26.468 18.5661 26.2898 18.86Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n        </svg>\r\n\r\n        <h3 class=\"mb-4\">Bulk replace</h3>\r\n        <p>You are about to replace the template '{{findFixture?.fixtureName}}' with '{{replaceFixture?.fixtureName}}' for {{replaceStores.length}} stores.@if(replaceStores.length == 1 && taskAssignedStores.length ) {\r\n            This template already has a rollout assigned. Clicking “Proceed” will revoke the existing rollout and update the latest.\r\n            } \r\n            @else if(replaceStores.length == 1 && reviewPendingStores.length ) {\r\n                since the store already has a rollout review pending for the selected template.\r\n            }\r\n            @else if(replaceStores.length > 1) {\r\n                This will overwrite the existing those stores.\r\n                <div class=\"mt-5\">\r\n                    <div class=\"planoText mb-3\">Note:</div>\r\n                    @if( taskAssignedStores.length) {\r\n                        {{taskAssignedStores.length}} stores have a rollout assigned for the selected template. You can either:\r\n                        <div class=\"my-3\">\r\n                            <input type=\"radio\" id=\"taskType\" class=\"form-check-input selected-radio me-3 cursor-pointer\" name=\"task\" [(ngModel)]=\"taskType\" value=\"skip\"> Skip, to leave the rollout assigned stores\r\n                        </div>\r\n                        <div class=\"mb-3\">\r\n                            <input type=\"radio\" id=\"taskType\" class=\"form-check-input selected-radio me-3 cursor-pointer\" name=\"task\"  [(ngModel)]=\"taskType\" value=\"revoke\"> Revoke and update \r\n                        </div>\r\n                    }\r\n                    @if(reviewPendingStores.length) {\r\n                        {{reviewPendingStores.length}} stores have a rollout review pending so you cannot replace.\r\n                        <div class=\"planoText my-5\">\r\n                            Plano - Review Pending <hr />\r\n                        </div>\r\n                        <div *ngFor=\"let reviewStore of reviewPendingStores\">\r\n                            {{reviewStore.storeName}} - Plano\r\n                            <hr />\r\n                        </div>\r\n                    }\r\n\r\n                </div>\r\n            }\r\n            @else {\r\n                This will overwrite the existing those stores.\r\n            }\r\n            </p>\r\n        <div class=\"modal-actions mt-5\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"modalRef.close()\">Cancel</button>\r\n            <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"ReplaceFixture()\" [hidden]=\"replaceStores.length == 1 && reviewPendingStores.length\">Proceed</button>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #replaceSuccess let-model>\r\n   <div class=\"modal-wrapper\">  \r\n        <div class=\"d-flex flex-start mb-5\">\r\n            <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"28\" cy=\"28\" r=\"24\" fill=\"#16A34A\"/>\r\n                <path\r\n                    d=\"M20 28L26 34L36 22\"\r\n                    stroke=\"white\"\r\n                    stroke-width=\"3\"\r\n                    stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"\r\n                />\r\n            </svg>\r\n        </div>\r\n\r\n        <h3 class=\"mb-4\">Success!</h3>\r\n        <p>Your fixture has been replaced across all selected stores. Click OK to proceed.</p>\r\n        <div class=\"modal-actions mt-5\">\r\n            <button type=\"button\" class=\"btn btn-primary x-4\"(click)=\"onClickSuccessOk(model)\">Ok</button>\r\n        </div>\r\n    </div>\r\n</ng-template>","import { TitleCasePipe } from \"@angular/common\";\r\nimport { AfterViewInit, Component, ElementRef, ViewChild } from \"@angular/core\";\r\nimport * as fabric from \"fabric\";\r\nimport { debounceTime, fromEvent } from \"rxjs\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-builder\",\r\n  templateUrl: \"./plano-builder.component.html\",\r\n  styleUrl: \"./plano-builder.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class PlanoBuilderComponent implements AfterViewInit {\r\n  @ViewChild(\"builderCanvas\", { static: false })\r\n  canvasEle!: ElementRef<HTMLCanvasElement>;\r\n\r\n  canvas!: fabric.Canvas;\r\n\r\n  private gridSize = 15;\r\n  private wallThickness = 30;\r\n\r\n  walls: any = [\r\n    {\r\n      x: 0,\r\n      y: 0,\r\n      height: 30,\r\n      width: 600,\r\n      elementData: {\r\n        type: \"wall\",\r\n        number: 1,\r\n      },\r\n    },\r\n    {\r\n      x: 600,\r\n      y: 0,\r\n      height: 600,\r\n      width: 30,\r\n      elementData: {\r\n        type: \"wall\",\r\n        number: 2,\r\n      },\r\n    },\r\n    {\r\n      x: 0,\r\n      y: 600,\r\n      height: 30,\r\n      width: 600,\r\n      elementData: {\r\n        type: \"wall\",\r\n        number: 3,\r\n      },\r\n    },\r\n    {\r\n      x: 0,\r\n      y: 0,\r\n      height: 600,\r\n      width: 30,\r\n      elementData: {\r\n        type: \"wall\",\r\n        number: 4,\r\n      },\r\n    },\r\n  ];\r\n\r\n  constructor(private titleCase: TitleCasePipe) {}\r\n\r\n  ngAfterViewInit(): void {\r\n    if (!this.canvasEle) return;\r\n\r\n    this.canvas = new fabric.Canvas(this.canvasEle?.nativeElement, {\r\n      height: 700,\r\n      width: 1000,\r\n    });\r\n\r\n    this.resizeCanvasToParentSize();\r\n    this.setupZoomHandlers();\r\n    this.retainTextWhileScaling();\r\n    this.listenToDeleteKey();\r\n\r\n    fromEvent(window, \"resize\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(() => this.resizeCanvasToParentSize());\r\n\r\n    this.build();\r\n  }\r\n\r\n  resizeCanvasToParentSize() {\r\n    setTimeout(() => {\r\n      const canvasCol = document.getElementById(\r\n        \"builder-canvas-card\"\r\n      ) as HTMLElement;\r\n\r\n      if (canvasCol) {\r\n        const width = canvasCol.offsetWidth - 32;\r\n        const height = canvasCol.offsetHeight;\r\n        this.canvas.setDimensions({ width: width, height: height });\r\n        this.canvas.requestRenderAll();\r\n      }\r\n    }, 300);\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  retainTextWhileScaling() {}\r\n\r\n  listenToDeleteKey() {\r\n    document.addEventListener(\"keydown\", (e) => {\r\n      if (e.key === \"Delete\") {\r\n        this.deleteSelected();\r\n      }\r\n    });\r\n  }\r\n\r\n  build() {\r\n    for (let i = 0; i < this.walls.length; i++) {\r\n      const wall = this.walls[i];\r\n      const wallGroup = this.drawWall(wall);\r\n      this.canvas.add(wallGroup);\r\n    }\r\n  }\r\n\r\n  drawWall(config: any) {\r\n    const x = config.x;\r\n    const y = config.y;\r\n    const height = config.height;\r\n    const width = config.width;\r\n    const elementData = config.elementData;\r\n\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData?.type)} ${\r\n      elementData?.number\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    // Vertical wall arrows\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      // Horizontal wall arrows\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: true,\r\n      lockScalingX: height > width,\r\n      lockScalingY: width > height,\r\n      lockRotation: false,\r\n      selectable: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      objId: string;\r\n    };\r\n\r\n    group.objType = \"wall\";\r\n\r\n    return group;\r\n  }\r\n\r\n  saveWalls() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"wall\")\r\n      .map((obj) => {\r\n        return {\r\n          left: obj.left,\r\n          top: obj.top,\r\n          width: obj.getScaledWidth(),\r\n          height: obj.getScaledHeight(),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data, // keep your metadata\r\n        };\r\n      });\r\n    // localStorage.setItem(\"walls\", JSON.stringify(data));\r\n  }\r\n\r\n  deleteSelected() {\r\n    const active = this.canvas.getActiveObject();\r\n    if (active) {\r\n      this.canvas.remove(active);\r\n      this.canvas.discardActiveObject();\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  loadData() {}\r\n\r\n  addWall() {\r\n    const centerPoint = new fabric.Point(\r\n      this.canvas.getWidth() / 2,\r\n      this.canvas.getHeight() / 2\r\n    );\r\n\r\n    this.walls.push({\r\n      x: centerPoint.x,\r\n      y: centerPoint.y,\r\n      height: 100,\r\n      width: 100,\r\n    });\r\n  }\r\n}\r\n","<div class=\"d-flex gap-3 mb-3\">\r\n  <button class=\"btn btn-outline\" (click)=\"addWall()\">Add wall</button>\r\n  <button class=\"btn btn-outline\" (click)=\"saveWalls()\">Save all</button>\r\n  <button class=\"btn btn-outline\" (click)=\"loadData()\">Fetch all</button>\r\n</div>\r\n<div class=\"builder-wrapper\">\r\n  <!-- <div class=\"form-wrapper\"></div> -->\r\n\r\n  <div id=\"builder-canvas-card\">\r\n    <canvas id=\"builder-canvas\" #builderCanvas></canvas>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from \"@angular/core\";\n\n@Component({\n  selector: \"lib-tool-page-header\",\n  templateUrl: \"./tool-page-header.component.html\",\n  styleUrl: \"./tool-page-header.component.scss\",\n})\nexport class ToolPageHeaderComponent {\n  @Input() title = \"\";\n  @Input() description = \"\";\n  @Input() backLink: string = \"/manage/planogram/plano-tools\";\n}\n","<div class=\"tool-page-header d-flex align-items-start gap-3 mb-3\">\n  <a\n    class=\"back-btn\"\n    [routerLink]=\"backLink\"\n    aria-label=\"Back to Plano Tools\"\n    title=\"Back to Plano Tools\"\n  >\n    <i class=\"bi bi-arrow-left\"></i>\n  </a>\n  <div class=\"flex-grow-1\">\n    <h4 class=\"title mb-1\">{{ title }}</h4>\n    <p *ngIf=\"description\" class=\"text-muted small mb-0\">{{ description }}</p>\n  </div>\n</div>\n","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  QueryList,\r\n  ViewChild,\r\n  ViewChildren,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  firstValueFrom,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\n\r\nimport * as fabric from \"fabric\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\ntype BoundFixtureGroup = {\r\n  fixtureGroup: fabric.Group;\r\n  offsetX: number;\r\n  offsetY: number;\r\n  _tempOldTop?: number;\r\n  _tempOldLeft?: number;\r\n};\r\n\r\n@Component({\r\n  selector: \"lib-plano-migrate\",\r\n  templateUrl: \"./plano-migrate.component.html\",\r\n  styleUrl: \"./plano-migrate.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class PlanoMigrateComponent implements OnInit, AfterViewInit, OnDestroy {\r\n  @ViewChild(\"canvas\") canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  @ViewChildren(\"storeItem\") storeItems!: QueryList<ElementRef>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    this.resizeCanvas();\r\n  }\r\n\r\n  clientId: string;\r\n\r\n  allPlanoIds: { storeId: string; planoId: string; storeName: string }[] = [];\r\n  storeList: { storeId: string; planoId: string; storeName: string }[] = [];\r\n  isLoading: boolean = true;\r\n\r\n  currentIndex: number = 0;\r\n\r\n  planoData: any;\r\n  floorData: any;\r\n\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  wallBindings = new Map<fabric.Group, BoundFixtureGroup[]>();\r\n\r\n  cdnUrl: string;\r\n\r\n  isStarted: boolean = false;\r\n  isForceStop: boolean = false;\r\n  isLayoutMode: boolean = false;\r\n  includeBg: boolean = false;\r\n\r\n  stores: string = \"\";\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged(),\r\n      )\r\n      .subscribe({\r\n        next: (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string,\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n\r\n          this.getPlanoList();\r\n        },\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.initCanvas();\r\n  }\r\n\r\n  private initCanvas(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasRef.nativeElement);\r\n\r\n    this.setupZoomAndPanHandlers();\r\n    this.resizeCanvas();\r\n  }\r\n\r\n  private setupZoomAndPanHandlers(): void {\r\n    // Zoom\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n      if (!e.ctrlKey && !e.metaKey) return;\r\n\r\n      let zoom = this.canvas.getZoom();\r\n      zoom *= 0.995 ** e.deltaY;\r\n      zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n      this.canvas.zoomToPoint(new fabric.Point(e.offsetX, e.offsetY), zoom);\r\n\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    });\r\n\r\n    // Pan\r\n    let dragging = false;\r\n    let lastX = 0;\r\n    let lastY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        dragging = true;\r\n        this.canvas.skipTargetFind = true;\r\n        const e = opt.e;\r\n        lastX = e.clientX;\r\n        lastY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (dragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastX;\r\n        vpt[5] += e.clientY - lastY;\r\n        lastX = e.clientX;\r\n        lastY = e.clientY;\r\n        this.canvas.requestRenderAll();\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      dragging = false;\r\n      this.canvas.skipTargetFind = false;\r\n    });\r\n  }\r\n\r\n  private resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 8,\r\n      height: container.clientHeight - 75,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  getPlanoList() {\r\n    this.isLoading = true;\r\n    this.allPlanoIds = [];\r\n\r\n    this.apiService\r\n      .getAllPlanoIds(this.clientId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.allPlanoIds = res?.data.map((pl: any) => {\r\n              return {\r\n                storeId: pl.storeId,\r\n                planoId: pl.planoId,\r\n                storeName: pl.storeName,\r\n              };\r\n            });\r\n\r\n            this.storeList = structuredClone(this.allPlanoIds);\r\n          }\r\n          this.isLoading = false;\r\n        },\r\n        error: (err) => {\r\n          this.isLoading = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  async onProceed() {\r\n    this.currentIndex = 0;\r\n    if (this.isStarted) return;\r\n    this.isStarted = true;\r\n    for (let i = 0; i < this.storeList.length; i++) {\r\n      this.currentIndex = i;\r\n      if (this.isForceStop) break;\r\n      const layout = this.storeList[i];\r\n      await this.getPlanoLayoutDetails(layout.planoId);\r\n      this.currentIndex++;\r\n      setTimeout(() => this.scrollToActive());\r\n    }\r\n\r\n    this.isStarted = false;\r\n    this.isForceStop = false;\r\n  }\r\n\r\n  scrollToActive() {\r\n    const el = this.storeItems.toArray()[this.currentIndex]?.nativeElement;\r\n    if (el) {\r\n      el.scrollIntoView({\r\n        behavior: \"smooth\",\r\n        block: \"center\", // keeps it nicely centered\r\n      });\r\n    }\r\n  }\r\n\r\n  onForceStop() {\r\n    this.isForceStop = true;\r\n    this.isStarted = false;\r\n  }\r\n\r\n  toggleMode() {\r\n    this.isLayoutMode = !this.isLayoutMode;\r\n  }\r\n\r\n  onFilter() {\r\n    if (this.isStarted) return;\r\n\r\n    if (!this.stores) {\r\n      this.storeList = structuredClone(this.allPlanoIds);\r\n      return;\r\n    }\r\n\r\n    const storeList = this.stores\r\n      .replace(/[\"']/g, \"\")\r\n\r\n      .replace(/\\r/g, \"\")\r\n      .split(/[\\n,]+/)\r\n      .map((v) => v.trim())\r\n      .filter((v) => v.length > 0);\r\n\r\n    this.storeList = this.allPlanoIds.filter((s) =>\r\n      storeList.includes(s.storeName),\r\n    );\r\n\r\n    this.currentIndex = 0;\r\n  }\r\n\r\n  async getPlanoLayoutDetails(storeId: string): Promise<void> {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    this.isLoading = true;\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService\r\n          .getStoreFixtures({ id: [storeId] })\r\n          .pipe(takeUntil(this.destroy$)),\r\n      );\r\n\r\n      if (!res?.data?.[0]?.floors?.length) return;\r\n\r\n      this.planoData = structuredClone(res.data[0]);\r\n      for (const floor of this.planoData.floors) {\r\n        this.floorData = floor;\r\n        const entrance = this.floorData.layoutPolygon.find(\r\n          (ele: any) => ele.elementType === \"entrance\",\r\n        );\r\n\r\n        if (this.isLayoutMode) {\r\n          if (entrance?.relativePosition) {\r\n            continue;\r\n          } else {\r\n            await this.renderPlanogram(floor);\r\n          }\r\n        } else {\r\n          await this.renderPlanogram(floor);\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error(\"@@ ~ getPlanoLayoutDetails [ERR]:\", error);\r\n    } finally {\r\n      this.isLoading = false;\r\n    }\r\n  }\r\n\r\n  async renderPlanogram(floorData: any) {\r\n    this.canvas.clear();\r\n    const result = await this.drawLayoutElements(floorData);\r\n\r\n    if (result) {\r\n      this.fitCanvasToLayout();\r\n      // this.fitCanvasToLayoutAnimated(); // Browser is getting stuck after sometime\r\n\r\n      if (this.isLayoutMode) {\r\n        await this.updateRenderedPlanoPosition();\r\n      } else {\r\n        if (this.includeBg) {\r\n          this.drawBg();\r\n        }\r\n        this.downloadCanvas();\r\n      }\r\n    }\r\n  }\r\n\r\n  private fitCanvasToLayout() {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Fit scale (with a little padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const zoom = Math.min(scaleX, scaleY) * 0.9; // 10% padding\r\n\r\n    this.canvas.setViewportTransform([zoom, 0, 0, zoom, 0, 0]);\r\n\r\n    // Center the layout after zoom\r\n    const vpt = this.canvas.viewportTransform!;\r\n    vpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * zoom;\r\n    vpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * zoom;\r\n\r\n    this.canvas.setViewportTransform(vpt);\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9; // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom; // center Y\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements(floorData: any) {\r\n    let currentX = 0;\r\n    let currentY = -this.wallThickness;\r\n\r\n    if (this.isLayoutMode) {\r\n      for (\r\n        let index = 0;\r\n        index < this.floorData.layoutPolygon.length;\r\n        index++\r\n      ) {\r\n        const element = this.floorData.layoutPolygon[index];\r\n\r\n        const length = this.toPixels(element.distance, element.unit);\r\n\r\n        let wall;\r\n        if (element.direction === \"right\") {\r\n          wall = await this.drawWall(\r\n            this.canvas,\r\n            currentX,\r\n            currentY,\r\n            this.wallThickness,\r\n            length,\r\n            0,\r\n            element,\r\n          );\r\n          currentX += length;\r\n        } else if (element.direction === \"down\") {\r\n          wall = await this.drawWall(\r\n            this.canvas,\r\n            currentX + this.wallThickness,\r\n            currentY + this.wallThickness,\r\n            this.wallThickness,\r\n            length,\r\n            90,\r\n            element,\r\n          );\r\n          currentY += length;\r\n        } else if (element.direction === \"left\") {\r\n          currentX -= length;\r\n          wall = await this.drawWall(\r\n            this.canvas,\r\n            currentX,\r\n            currentY + this.wallThickness,\r\n            this.wallThickness,\r\n            length,\r\n            0,\r\n            element,\r\n          );\r\n        } else if (element.direction === \"up\") {\r\n          currentY -= length;\r\n          if (element.elementType === \"wall\") {\r\n            wall = await this.drawWall(\r\n              this.canvas,\r\n              currentX,\r\n              currentY + this.wallThickness,\r\n              this.wallThickness,\r\n              length,\r\n              90,\r\n              element,\r\n            );\r\n          } else if (element.elementType === \"entrance\") {\r\n            const entranceLengthInPixels = this.toPixels(\r\n              element.distance,\r\n              element.unit,\r\n            );\r\n\r\n            const arrowWidth = 80;\r\n            const arrowHeight = 75;\r\n            const arrowBase = 40;\r\n\r\n            const arrowX = currentX - this.wallThickness;\r\n            const arrowY =\r\n              currentY + entranceLengthInPixels / 2 - arrowHeight / 2;\r\n\r\n            this.drawEntranceArrow(\r\n              this.canvas,\r\n              arrowX,\r\n              arrowY,\r\n              arrowWidth,\r\n              arrowHeight,\r\n              arrowBase,\r\n              element,\r\n            );\r\n          }\r\n        }\r\n\r\n        if (element.elementType === \"wall\") {\r\n          const fixtureGroups: fabric.Group[] = [];\r\n\r\n          for (let j = 0; j < element?.fixtures?.length; j++) {\r\n            const fixture = element.fixtures[j];\r\n            const adjust = this.isLayoutMode ? this.wallThickness : 0;\r\n            const x = this.toPixels(\r\n              fixture.relativePosition.x,\r\n              fixture.relativePosition.unit,\r\n            );\r\n\r\n            const y = this.toPixels(\r\n              fixture.relativePosition.y,\r\n              fixture.relativePosition.unit,\r\n            );\r\n\r\n            const fixtureHeight = this.toPixels(\r\n              fixture.fixtureStaticLength.value,\r\n              fixture.fixtureStaticLength.unit,\r\n            );\r\n            const fixtureWidth = this.toPixels(\r\n              fixture.fixtureStaticWidth.value,\r\n              fixture.fixtureStaticWidth.unit,\r\n            );\r\n\r\n            const fixtureObj = await this.drawFixture(\r\n              this.canvas,\r\n              x,\r\n              y,\r\n              fixtureHeight,\r\n              fixtureWidth,\r\n              fixture,\r\n            );\r\n            fixtureGroups.push(fixtureObj as fabric.Group);\r\n          }\r\n\r\n          if (element.isLocked && wall) {\r\n            this.canvas.remove(wall);\r\n            fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n            const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n              hasControls: true,\r\n              selectable: true,\r\n              subTargetCheck: true,\r\n            });\r\n\r\n            combinedGroup.set({ isLocked: true });\r\n            this.canvas.add(combinedGroup);\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      for (let index = 0; index < floorData.layoutPolygon.length; index++) {\r\n        const element = floorData.layoutPolygon[index];\r\n\r\n        let wall;\r\n\r\n        element.relativePosition ??= {\r\n          x: 0,\r\n          y: 0,\r\n          unit: \"ft\",\r\n        };\r\n        const x = this.toPixels(element.relativePosition.x, element.unit);\r\n        const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n        if (element.elementType === \"wall\") {\r\n          const height = this.wallThickness;\r\n          const width = this.toPixels(element.distance, element.unit);\r\n          wall = await this.drawWall(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            height,\r\n            width,\r\n            element.angle,\r\n            element,\r\n          );\r\n        } else if (element.elementType === \"entrance\") {\r\n          const arrowWidth = 80;\r\n          const arrowHeight = 75;\r\n          const arrowBase = 40;\r\n          this.drawEntranceArrow(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            arrowWidth,\r\n            arrowHeight,\r\n            arrowBase,\r\n            element,\r\n          );\r\n        }\r\n\r\n        if (element.elementType === \"wall\") {\r\n          const fixtureGroups: fabric.Group[] = [];\r\n          for (let j = 0; j < element?.fixtures?.length; j++) {\r\n            const fixture = element.fixtures[j];\r\n            const x = this.toPixels(\r\n              fixture.relativePosition.x,\r\n              fixture.relativePosition.unit,\r\n            );\r\n            const y = this.toPixels(\r\n              fixture.relativePosition.y,\r\n              fixture.relativePosition.unit,\r\n            );\r\n            const fixtureHeight = this.toPixels(\r\n              fixture.fixtureStaticLength.value,\r\n              fixture.fixtureStaticLength.unit,\r\n            );\r\n            const fixtureWidth = this.toPixels(\r\n              fixture.fixtureStaticWidth.value,\r\n              fixture.fixtureStaticWidth.unit,\r\n            );\r\n\r\n            const fixtureObj = await this.drawFixture(\r\n              this.canvas,\r\n              x,\r\n              y,\r\n              fixtureHeight,\r\n              fixtureWidth,\r\n              fixture,\r\n            );\r\n            fixtureGroups.push(fixtureObj as fabric.Group);\r\n          }\r\n\r\n          if (element.isLocked && wall) {\r\n            this.canvas.remove(wall);\r\n            fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n            const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n              hasControls: true,\r\n              selectable: true,\r\n              subTargetCheck: true,\r\n            });\r\n\r\n            combinedGroup.set({ isLocked: true });\r\n            this.canvas.add(combinedGroup);\r\n          }\r\n\r\n          for (let j = 0; j < element?.otherElements?.length; j++) {\r\n            const otherElement = element.otherElements[j];\r\n            const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n            const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n            const a = otherElement.relativePosition.angle;\r\n            const h = this.toPixels(\r\n              otherElement.fixtureStaticLength.value,\r\n              otherElement.fixtureStaticLength.unit,\r\n            );\r\n            const w = this.toPixels(\r\n              otherElement.fixtureStaticWidth.value,\r\n              otherElement.fixtureStaticWidth.unit,\r\n            );\r\n\r\n            const fixtureObj = this.drawOtherElementsWithLabel(\r\n              this.canvas,\r\n              x,\r\n              y,\r\n              a,\r\n              w,\r\n              h,\r\n              otherElement,\r\n            );\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < floorData?.centerFixture?.length; i++) {\r\n      const fixture = floorData.centerFixture[i];\r\n\r\n      const adjust = this.isLayoutMode ? this.wallThickness : 0;\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureObj = this.drawOtherElementsWithLabel(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        a,\r\n        w,\r\n        h,\r\n        otherElement,\r\n      );\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    angle: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      selectable: true,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n          L ${topX + topWidth - radius} ${topY} \r\n          Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n          L ${topX + topWidth} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + radius} \r\n          Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topFieldText =\r\n      (fixtureData.fixtureType === \"wall\"\r\n        ? `Wall-${fixtureData.associatedElementNumber} - `\r\n        : \"Floor - \") +\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`;\r\n\r\n    const topText = new fabric.Textbox(topFieldText, {\r\n      left: topX + topWidth / 2,\r\n      top: topY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n      Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n        topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n      L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n      Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n        secondBoxY + innerBoxHeight - radius\r\n      } \r\n      L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n          L ${midX + midWidth - radius} ${firstBoxY} \r\n          Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n            firstBoxY + radius\r\n          } \r\n          L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + radius} \r\n          Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#D92D20\" : \"#EAF8FF\",\r\n        stroke: fixtureData.issue ? \"#D92D20\" : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const padding = 2;\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n          Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n            midX + midWidth - radius\r\n          } ${lastBoxY + boxHeight} \r\n          L ${midX + radius} ${lastBoxY + boxHeight} \r\n          Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n            lastBoxY + boxHeight - radius\r\n          } \r\n          L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#FEE4E2\" : \"#EAF8FF\",\r\n        stroke: fixtureData.issue ? \"#D92D20\" : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${\r\n        getFixtureProductCapacity(fixtureData?.shelfConfig)\r\n      } . VM - ${fixtureData?.vmConfig?.length ?? 0}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        // hasControls: fixtureData.fixtureType === \"floor\",\r\n        // lockRotation: fixtureData.fixtureType !== \"floor\",\r\n        // lockMovementX: currentFixtureInfo?.wallDirection === 'up' || currentFixtureInfo?.wallDirection === 'down',\r\n        // lockMovementY: currentFixtureInfo?.wallDirection === 'right' || currentFixtureInfo?.wallDirection === 'left',\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n    };\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(fixtureGroup);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntranceArrow(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M ${x} ${y}`,\r\n      `L ${x + bodyWidth} ${y}`,\r\n      `L ${x + bodyWidth} ${y - height / 2}`,\r\n      `L ${x + width} ${y + height / 2}`,\r\n      `L ${x + bodyWidth} ${y + height + height / 2}`,\r\n      `L ${x + bodyWidth} ${y + height}`,\r\n      `L ${x} ${y + height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.FabricText(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: x + 15,\r\n      top: y + height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: true,\r\n      // angle: 0,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  fromPixels(pixels: number, unit: string, dpi = 2.8): number {\r\n    let value: number;\r\n\r\n    if (unit === \"mm\") {\r\n      value = (pixels / dpi) * 25.4;\r\n    } else if (unit === \"ft\") {\r\n      value = pixels / (12 * dpi);\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(value.toFixed(2));\r\n  }\r\n\r\n  async updateRenderedPlanoPosition() {\r\n    this.updateWallCoordinates();\r\n    this.updateFixtureCoordinates();\r\n    this.updateOtherElementsCoordinates();\r\n    this.updateEntranceCoordinates();\r\n\r\n    await this.saveNewPlanoPosition();\r\n  }\r\n\r\n  updateFixtureCoordinates() {\r\n    // Gather all objects with fixtureId from the canvas\r\n    const fixturesFromCanvas = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).fixtureId)\r\n      .map((obj) => ({\r\n        id: (obj as any).fixtureId,\r\n        x: obj.left,\r\n        y: obj.top,\r\n        angle: obj?.angle ?? 0,\r\n      }));\r\n    // Create a Map from fixtureId to converted positions for quick lookup\r\n    const posMap = new Map();\r\n\r\n    for (const fixture of fixturesFromCanvas) {\r\n      posMap.set(fixture.id, {\r\n        x: this.fromPixels(fixture.x, \"ft\"),\r\n        y: this.fromPixels(fixture.y, \"ft\"),\r\n        angle: fixture.angle,\r\n      });\r\n    }\r\n\r\n    // Update centerFixture positions\r\n    this.floorData.centerFixture.forEach((cf: any) => {\r\n      const latestFixturePos = posMap.get(cf._id);\r\n      if (latestFixturePos) {\r\n        cf.relativePosition.x = latestFixturePos.x;\r\n        cf.relativePosition.y = latestFixturePos.y;\r\n        cf.relativePosition.angle = latestFixturePos.angle;\r\n      }\r\n    });\r\n\r\n    // Update layoutPolygon fixtures positions\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.fixtures?.forEach((wf: any) => {\r\n        const latestFixturePos = posMap.get(wf._id);\r\n        if (latestFixturePos) {\r\n          wf.relativePosition.x = latestFixturePos.x;\r\n          wf.relativePosition.y = latestFixturePos.y;\r\n          wf.relativePosition.angle = latestFixturePos.angle;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateOtherElementsCoordinates() {\r\n    // Gather all objects with objType 'others' from the canvas\r\n    const othersFromCanvas = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"others\")\r\n      .map((obj) => ({\r\n        id: (obj as any).data?._id,\r\n        label: (obj as any).data?.fixtureName,\r\n        x: obj.left,\r\n        y: obj.top,\r\n        angle: obj?.angle ?? 0,\r\n        width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n        height: this.fromPixels(obj.getScaledHeight(), \"ft\"),\r\n      }));\r\n\r\n    // Create a Map from fixtureName to converted positions for quick lookup\r\n    const posMap = new Map<\r\n      string,\r\n      { x: number; y: number; angle: number; h: number; w: number }\r\n    >();\r\n    for (const other of othersFromCanvas) {\r\n      if (other.id) {\r\n        posMap.set(other.id, {\r\n          x: this.fromPixels(other.x, \"ft\"),\r\n          y: this.fromPixels(other.y, \"ft\"),\r\n          angle: other.angle,\r\n          h: other.height,\r\n          w: other.width,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Update centerFixture positions (if you have otherElements at floor level)\r\n    if (Array.isArray(this.floorData.otherElements)) {\r\n      this.floorData.otherElements.forEach((el: any) => {\r\n        const latestOthersPos = posMap.get(el._id);\r\n        if (latestOthersPos) {\r\n          el.relativePosition.x = latestOthersPos.x;\r\n          el.relativePosition.y = latestOthersPos.y;\r\n          el.relativePosition.angle = latestOthersPos.angle;\r\n          el.fixtureStaticLength.value = latestOthersPos.h;\r\n          el.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    }\r\n\r\n    // Update layoutPolygon otherElements positions\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.otherElements?.forEach((wf: any) => {\r\n        const latestOthersPos = posMap.get(wf._id);\r\n        if (latestOthersPos) {\r\n          wf.relativePosition.x = latestOthersPos.x;\r\n          wf.relativePosition.y = latestOthersPos.y;\r\n          wf.relativePosition.angle = latestOthersPos.angle;\r\n          wf.fixtureStaticLength.value = latestOthersPos.h;\r\n          wf.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateWallCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"wall\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n          height: this.fromPixels(obj.getScaledHeight(), \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const wall of data) {\r\n      posMap.set(\r\n        `${wall.elementData.elementType}${wall.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === wall.elementData.elementType &&\r\n            obj.elementData.elementNumber === wall.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const wallPos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (wallPos) {\r\n        if (!w.relativePosition) {\r\n          w.relativePosition = { x: 0, y: 0, unit: \"ft\" };\r\n        }\r\n        w.relativePosition.x = wallPos.left;\r\n        w.relativePosition.y = wallPos.top;\r\n        w.angle = wallPos.angle ?? w.angle ?? 0;\r\n        w.distance = wallPos.width ?? w.distance ?? 0;\r\n      }\r\n    });\r\n  }\r\n\r\n  updateEntranceCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"entrance\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const entrance of data) {\r\n      posMap.set(\r\n        `${entrance.elementData.elementType}${entrance.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === entrance.elementData.elementType &&\r\n            obj.elementData.elementNumber ===\r\n              entrance.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const entrancePos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (entrancePos) {\r\n        if (!w.relativePosition) {\r\n          w.relativePosition = { x: 0, y: 0, unit: \"ft\" };\r\n        }\r\n        w.relativePosition.x = entrancePos.left;\r\n        w.relativePosition.y = entrancePos.top;\r\n        w.angle = entrancePos.angle;\r\n        // w.distance = entrancePos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  async saveNewPlanoPosition() {\r\n    try {\r\n      const payload = {\r\n        floorId: this.floorData._id,\r\n        data: this.floorData,\r\n        editMode: false,\r\n      };\r\n\r\n      const res = await firstValueFrom(\r\n        this.apiService.updateStorePlano(payload),\r\n      );\r\n    } catch (error) {\r\n      console.log(\"@@ ~ saveNewPlanoPosition [ERR]: \", error);\r\n    }\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  // downloadCanvas() {\r\n  //   if (!this.canvas) return;\r\n\r\n  //   const originalViewport = [\r\n  //     ...this.canvas.viewportTransform!,\r\n  //   ] as fabric.TMat2D;\r\n  //   this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n  //   const bounds = this.getFullLayoutBounds();\r\n\r\n  //   const bg = this.createExportLayoutBackground();\r\n  //   this.canvas.insertAt(0, bg);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const dataURL = this.canvas.toDataURL({\r\n  //     format: \"png\",\r\n  //     left: bounds.left,\r\n  //     top: bounds.top,\r\n  //     width: bounds.width,\r\n  //     height: bounds.height,\r\n  //     multiplier: 2,\r\n  //   });\r\n\r\n  //   this.canvas.remove(bg);\r\n  //   this.canvas.setViewportTransform(originalViewport);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const link = document.createElement(\"a\");\r\n  //   link.href = dataURL;\r\n  //   link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n  //   link.click();\r\n  // }\r\n\r\n  // private createExportLayoutBackground() {\r\n  //   const points = this.buildLayoutPolygonFromWalls();\r\n\r\n  //   return new fabric.Polygon(points, {\r\n  //     fill: \"#eaecf0\",\r\n  //     selectable: false,\r\n  //     evented: false,\r\n  //     objectCaching: false,\r\n  //   });\r\n  // }\r\n  // private buildLayoutPolygonFromWalls() {\r\n  //   return this.floorData.layoutPolygon\r\n  //     .filter((w: any) => w.elementType === \"wall\")\r\n  //     .map((w: any) => ({\r\n  //       x: this.toPixels(w.relativePosition.x, \"ft\"),\r\n  //       y: this.toPixels(w.relativePosition.y, \"ft\"),\r\n  //     }));\r\n  // }\r\n\r\n  ngOnDestroy(): void {}\r\n}\r\n","<section id=\"plano-migrate\">\r\n  <lib-tool-page-header\r\n    title=\"Download Layout Images\"\r\n    description=\"Export layout images store by store.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"app-layout\">\r\n\r\n    <!-- LEFT TOOLBAR -->\r\n    <div class=\"sidebar\">\r\n      <div class=\"p-3\">\r\n        <textarea class=\"form-control\" [(ngModel)]=\"stores\" placeholder=\"Enter store names in commas..\"\r\n          rows=\"6\"></textarea>\r\n        <button class=\"btn btn-secondary w-100 my-4\" type=\"button\" (click)=\"onFilter()\" [disabled]=\"isStarted\">\r\n          Filter\r\n        </button>\r\n\r\n        <div class=\"d-flex align-items-center\">\r\n          <p class=\"m-0 text-nowrap\">Stores ({{currentIndex}}/ {{storeList.length}})</p>\r\n          <hr class=\"w-100\">\r\n        </div>\r\n\r\n        <div class=\"store-list\">\r\n          @for (item of storeList; track $index) {\r\n            <div class=\"id-tile\" [class.active]='$index === currentIndex' #storeItem>\r\n              <p [style]=\"{ color: $index === currentIndex ? 'red' : 'black' }\">\r\n                {{ $index + 1 }}) {{ item.storeName }}\r\n              </p>\r\n            </div>\r\n          }\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- RIGHT CANVAS PANEL -->\r\n    <div class=\"canvas-wrapper\" #canvasContainer>\r\n\r\n      <!-- Toolbar -->\r\n      <div class=\"toolbar\">\r\n\r\n        <!-- <div class=\"form-check form-switch\">\r\n          <input [checked]=\"isLayoutMode\" [(ngModel)]=\"isLayoutMode\" [ngModelOptions]=\"{ standalone: true }\"\r\n            style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" [disabled]=\"isStarted\" />\r\n          <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n            Layout Mode\r\n          </label>\r\n        </div> -->\r\n\r\n\r\n        <button class=\"btn btn-primary\" type=\"button\" (click)=\"onProceed()\" [disabled]=\"isStarted\">\r\n          {{isLayoutMode ? 'Update Layout' : 'Download Images'}}\r\n        </button>\r\n        <button class=\"btn btn-danger\" type=\"button\" (click)=\"onForceStop()\" [disabled]='!isStarted'>\r\n          Force stop\r\n        </button>\r\n\r\n        <div class=\"d-flex gap-2\">\r\n          <input type=\"checkbox\" class=\"form-check\" name=\"includeBG\" id=\"includeBG\" [(ngModel)]=\"includeBg\"\r\n            [ngModelOptions]=\"{ standalone: true }\" [disabled]=\"isStarted\">\r\n          <label for=\"includeBG\">Include Background</label>\r\n        </div>\r\n\r\n      </div>\r\n\r\n      <!-- Canvas -->\r\n      <div class=\"canvas-area\">\r\n        <canvas #canvas></canvas>\r\n      </div>\r\n\r\n    </div>\r\n\r\n\r\n  </div>\r\n</section>","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { PlanogramTableList } from \"../../../interfaces/planogram.interface\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  Subject,\r\n  Subscription,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport {\r\n  getQueryParamNumber,\r\n  getQueryParamString,\r\n} from \"../../../functions/plano.function\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-table\",\r\n  templateUrl: \"./plano-table.component.html\",\r\n  styleUrl: \"./plano-table.component.scss\",\r\n})\r\nexport class PlanoTableComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = -1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  planogramsList: PlanogramTableList[] = [];\r\n\r\n  appliedFilters = {};\r\n  isFilterApplied: boolean = false;\r\n  isPageLoading: boolean = true;\r\n  isError: boolean = false;\r\n  planoList:any;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private planoSub?: Subscription;\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        distinctUntilChanged() // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe({\r\n        next: (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n\r\n          this.route.queryParamMap\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe((params) => {\r\n              this.searchTerm = getQueryParamString({\r\n                params,\r\n                key: \"search\",\r\n                fallback: \"\",\r\n              });\r\n              this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n              this.limit = getQueryParamNumber({\r\n                params,\r\n                key: \"limit\",\r\n                fallback: 10,\r\n                min: 1,\r\n                max: 30,\r\n              });\r\n\r\n              this.offset = getQueryParamNumber({\r\n                params,\r\n                key: \"offset\",\r\n                fallback: 1,\r\n                min: 1,\r\n              });\r\n\r\n              this.getPlanogramTableList();\r\n            });\r\n        },\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Planogram\");\r\n    this.pageInfo.setBreadcrumbs([]);\r\n  }\r\n\r\n  getPlanogramTableList() {\r\n    this.planoSub?.unsubscribe(); // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.planoList = null;\r\n    this.planogramsList = [];\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n    };\r\n\r\n    this.planoSub = this.storeBuilderService\r\n      .getPlanogramList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.planoList = res?.data?.planoData;\r\n            this.totalItems = res?.data?.count;\r\n            this.planogramsList = res?.data?.data ?? [];\r\n            if (this.totalItems < 10) {\r\n              this.paginationSizes = [this.totalItems];\r\n            } else {\r\n              this.paginationSizes = [10, 20, 30];\r\n            }\r\n          }\r\n\r\n          const storeCountMap = this.planogramsList.reduce((acc, item) => {\r\n            acc[item.storeName] = (acc[item.storeName] || 0) + 1;\r\n            return acc;\r\n          }, {} as Record<string, number>);\r\n\r\n          this.planogramsList = this.planogramsList.map((item) => ({\r\n            ...item,\r\n            multipleFloor: storeCountMap[item.storeName] > 1,\r\n          }));\r\n\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n\r\n    this.totalItems = this.planogramsList.length;\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getPlanogramTableList();\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    const country = event[0].selected;\r\n    const city = event[1].selected;\r\n    const compliance = event[2].selected;\r\n    const planoStrategy = event[3].selected;\r\n\r\n    if (country.length || city.length || compliance || planoStrategy) {\r\n      this.isFilterApplied = true;\r\n    } else {\r\n      this.isFilterApplied = false;\r\n    }\r\n\r\n    this.appliedFilters = {\r\n      country,\r\n      city,\r\n      ...(compliance ? { compliance: [compliance.min, compliance.max] } : {}),\r\n      ...(planoStrategy ? { planoStrategy } : {}),\r\n    };\r\n\r\n    this.offset = 1;\r\n    this.getPlanogramTableList();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        search: this.searchTerm,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  onExport() {\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.totalItems,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      searchValue: this.searchTerm,\r\n      filter: this.appliedFilters,\r\n      export: true,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.storeBuilderService\r\n      .getPlanogramListExport(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res) {\r\n            this.storeBuilderService.saveAsExcelFile(res, \"Planogram\");\r\n          }\r\n        },\r\n        error: (err) => {\r\n          console.log(err, \"err\");\r\n        },\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.planoSub?.unsubscribe();\r\n  }\r\n}\r\n","<div class=\"content-wrapper\">\r\n  <div>\r\n    <!-- Manage Planogram view header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n      <div>\r\n        <h4>All Planograms</h4>\r\n        <span>{{ totalItems }} - Total Records</span>\r\n      </div>\r\n\r\n      <div class=\"d-flex align-items-center gap-2\">\r\n        <div style=\"position: relative\">\r\n          <input type=\"text\" [(ngModel)]=\"searchTerm\" (change)=\"onSearch()\"\r\n            style=\"padding-left: 3rem; padding-right: 3rem\" class=\"form-control\" name=\"search\" autocomplete=\"off\"\r\n            placeholder=\"Search\" />\r\n\r\n          <span class=\"search-icon\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n              <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n              <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n            </svg>\r\n          </span>\r\n\r\n          <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\"\r\n            class=\"clear-search\">\r\n            <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                </path>\r\n                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                </path>\r\n                <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"></circle>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n        <!-- Filter -->\r\n        <plano-filter [clientId]=\"clientId\" (applyFilters)=\"applyFilters($event)\"\r\n          (resetFilters)=\"applyFilters($event)\"></plano-filter>\r\n        <button type=\"button\" (click)=\"onExport()\"\r\n            class=\"btn-outline btn align-items-end text-nowrap invheader ms-4\"\r\n            [disabled]=\"!planogramsList.length\">\r\n            <!-- Export Icon -->\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                fill=\"none\">\r\n                <path\r\n                    d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n                    stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\"></path>\r\n            </svg>\r\n            <span class=\"ms-2\"></span> Export\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"isPageLoading\">\r\n      <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div class=\"card-body d-flex justify-content-center align-items-center flex-column\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length === 0 && !planoList\">\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">No data found</div>\r\n      <div class=\"nodatasubtext\">There is no result for planogram table</div>\r\n    </div>\r\n    <div class=\"card-body d-flex justify-content-center align-items-center flex-column\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length === 0 && planoList\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"302\" height=\"160\" viewBox=\"0 0 302 160\" fill=\"none\">\r\n        <path d=\"M97.9023 54.0942C83.6389 54.0942 72.0762 65.657 72.0762 79.9204C72.0762 85.8363 68.0722 92.5806 62.1564 92.5806H39.3506C25.0871 92.5806 13.5234 104.143 13.5234 118.407C13.5234 132.67 25.0871 144.233 39.3506 144.233H177.449C194.339 144.233 210.412 131.067 227.302 131.067H293.337C298.091 131.067 301.945 127.213 301.945 122.458C301.945 117.704 298.091 113.849 293.337 113.849H205.717C204.072 113.849 202.68 112.627 202.212 111.051C201.473 108.561 203.174 105.747 205.771 105.747H236.001C250.264 105.747 261.827 94.1838 261.827 79.9204C261.827 65.657 250.264 54.0943 236.001 54.0942H97.9023Z\" fill=\"#EAECF0\"/>\r\n        <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\" transform=\"matrix(-1 0 0 1 240.694 55.9315)\" fill=\"#EAECF0\"/>\r\n        <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\" transform=\"matrix(-1 0 0 1 50.3906 120.357)\" fill=\"#6BCAFF\"/>\r\n        <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 239.058 75.9004)\" fill=\"#00A3FF\"/>\r\n        <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 209.781 20.6014)\" fill=\"#00A3FF\"/>\r\n        <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\" transform=\"matrix(-1 0 0 1 98.0986 145.295)\" fill=\"#00A3FF\"/>\r\n        <rect x=\"63.0869\" y=\"51.7187\" width=\"166.015\" height=\"96.9528\" rx=\"14.6093\" fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3.98436\"/>\r\n        <mask id=\"path-8-inside-1_769_29740\" fill=\"white\">\r\n        <path d=\"M87.2119 26.0743C88.1571 26.0744 89.083 26.1571 89.9824 26.3165V123.859C89.083 123.699 88.1571 123.616 87.2119 123.616H76.8682C68.1579 123.616 61.0968 130.678 61.0967 139.388V41.8458C61.0967 33.1355 68.1578 26.0743 76.8682 26.0743H87.2119Z\"/>\r\n        </mask>\r\n        <path d=\"M87.2119 26.0743C88.1571 26.0744 89.083 26.1571 89.9824 26.3165V123.859C89.083 123.699 88.1571 123.616 87.2119 123.616H76.8682C68.1579 123.616 61.0968 130.678 61.0967 139.388V41.8458C61.0967 33.1355 68.1578 26.0743 76.8682 26.0743H87.2119Z\" fill=\"#6BCAFF\"/>\r\n        <path d=\"M87.2119 26.0743L87.212 22.09H87.2119V26.0743ZM89.9824 26.3165H93.9668V22.9762L90.6777 22.3933L89.9824 26.3165ZM89.9824 123.859L89.2872 127.782L93.9668 128.611V123.859H89.9824ZM87.2119 123.616L87.212 119.632H87.2119V123.616ZM61.0967 139.388H57.1123L65.081 139.388L61.0967 139.388ZM87.2119 26.0743L87.2119 30.0587C87.9241 30.0587 88.6173 30.121 89.2872 30.2398L89.9824 26.3165L90.6777 22.3933C89.5487 22.1932 88.3902 22.09 87.212 22.09L87.2119 26.0743ZM89.9824 26.3165H85.9981V123.859H89.9824H93.9668V26.3165H89.9824ZM89.9824 123.859L90.6777 119.935C89.5487 119.735 88.3902 119.632 87.212 119.632L87.2119 123.616L87.2119 127.601C87.924 127.601 88.6173 127.663 89.2872 127.782L89.9824 123.859ZM87.2119 123.616V119.632H76.8682V123.616V127.601H87.2119V123.616ZM76.8682 123.616V119.632C65.9574 119.632 57.1125 128.477 57.1123 139.388L61.0967 139.388L65.081 139.388C65.0811 132.878 70.3585 127.601 76.8682 127.601V123.616ZM61.0967 139.388H65.081V41.8458H61.0967H57.1123V139.388H61.0967ZM61.0967 41.8458H65.081C65.081 35.336 70.3583 30.0587 76.8682 30.0587V26.0743V22.09C65.9573 22.09 57.1123 30.935 57.1123 41.8458H61.0967ZM76.8682 26.0743V30.0587H87.2119V26.0743V22.09H76.8682V26.0743Z\" fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_769_29740)\"/>\r\n        <line x1=\"71.0547\" y1=\"49.7267\" x2=\"71.0547\" y2=\"91.5625\" stroke=\"#99DAFF\" stroke-width=\"3.98436\" stroke-linecap=\"round\"/>\r\n        <rect x=\"116.229\" y=\"104.642\" width=\"63.389\" height=\"32.1538\" rx=\"7.34945\" fill=\"#99DAFF\"/>\r\n        <rect x=\"116.229\" y=\"66.9762\" width=\"63.389\" height=\"32.1538\" rx=\"7.34945\" fill=\"#99DAFF\"/>\r\n        <circle cx=\"212.299\" cy=\"77.2505\" r=\"3.29663\" fill=\"white\"/>\r\n        <circle cx=\"105.88\" cy=\"62.2407\" r=\"2.52637\" fill=\"#99DAFF\"/>\r\n        <circle cx=\"93.4783\" cy=\"132.06\" r=\"3.44505\" fill=\"white\"/>\r\n        <rect x=\"116.229\" y=\"37.5784\" width=\"63.389\" height=\"24.8044\" rx=\"7.34945\" fill=\"#99DAFF\"/>\r\n      </svg>              \r\n      <div class=\"nodatamaintext mt-3\">Planogram Yet to Publish</div>\r\n      <div class=\"nodatasubtext\"><a href=\"manage/planogram/manage-planogram?planoId={{planoList?.[0]?.planoId}}&floorId={{planoList?.[0]?._id}}\">{{planoList?.[0]?.storeName}}</a> is still under verification</div>\r\n    </div>\r\n\r\n    <!-- Manage Planogram list view -->\r\n    <section id=\"list-view\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n      <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n          <thead>\r\n            <tr>\r\n              <th>\r\n                <span (click)=\"onSortTable('storeName')\" class=\"cursor-pointer\">\r\n                  Planogram name\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{\r\n                      color: sortedColumn === 'storeName' ? '#009BF3' : ''\r\n                    }\" [ngClass]=\"\r\n                      sortOrder === 1 && sortedColumn === 'storeName'\r\n                        ? 'fa-arrow-up'\r\n                        : 'fa-arrow-down'\r\n                    \" aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                Country\r\n                <!-- <span (click)=\"onSortTable('country')\" class=\"cursor-pointer\">\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{\r\n                      color: sortedColumn === 'country' ? '#009BF3' : ''\r\n                    }\" [ngClass]=\"\r\n                      sortOrder === 1 && sortedColumn === 'country'\r\n                        ? 'fa-arrow-up'\r\n                        : 'fa-arrow-down'\r\n                    \" aria-hidden=\"true\"></i>\r\n                </span> -->\r\n              </th>\r\n              <th>\r\n                Region\r\n                <!-- <span (click)=\"onSortTable('city')\" class=\"cursor-pointer\">\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{\r\n                      color: sortedColumn === 'city' ? '#009BF3' : ''\r\n                    }\" [ngClass]=\"\r\n                      sortOrder === 1 && sortedColumn === 'city'\r\n                        ? 'fa-arrow-up'\r\n                        : 'fa-arrow-down'\r\n                    \" aria-hidden=\"true\"></i>\r\n                </span> -->\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('createdAt')\" class=\"cursor-pointer\">\r\n                  Published at\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{\r\n                      color: sortedColumn === 'createdAt' ? '#009BF3' : ''\r\n                    }\" [ngClass]=\"\r\n                      sortOrder === 1 && sortedColumn === 'createdAt'\r\n                        ? 'fa-arrow-up'\r\n                        : 'fa-arrow-down'\r\n                    \" aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('merchCompliance')\" class=\"cursor-pointer\">\r\n                  Merch Compliance\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{\r\n                      color: sortedColumn === 'merchCompliance' ? '#009BF3' : ''\r\n                    }\" [ngClass]=\"\r\n                      sortOrder === 1 && sortedColumn === 'merchCompliance'\r\n                        ? 'fa-arrow-up'\r\n                        : 'fa-arrow-down'\r\n                    \" aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let plano of planogramsList\">\r\n              <td>\r\n                <a [routerLink]=\"['/manage/planogram/store-planogram']\" [queryParams]=\"{\r\n                    planoId: plano.planoId,\r\n                    floorId: plano._id,\r\n                    storeName:plano.storeName\r\n                  }\" class=\"text-decoration-underline\">\r\n                  {{plano.storeName}} <span *ngIf=\"plano.multipleFloor\">({{plano.floorName | titlecase}})</span> - Plano\r\n                </a>\r\n              </td>\r\n              <td>\r\n                <span>{{plano?.storeInfo?.country}}</span>\r\n              </td>\r\n              <td>\r\n                <span>{{plano?.storeInfo?.city}}</span>\r\n              </td>\r\n              <td>\r\n                <span [ngbTooltip]=\"plano?.createdByName ? 'Published by ' + plano.createdByName : null\">\r\n                  {{ plano.createdAt | date:'dd MMM, yyyy' }}\r\n                </span>\r\n              </td>\r\n              <td>\r\n                <span>{{plano?.merchCompliance ?? 0}}</span>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </section>\r\n\r\n    <!-- Manage Planogram grid view -->\r\n    <!-- <ng-template #gridView>\r\n      <section id=\"grid-view\">\r\n        <div class=\"row gx-6 gy-4\">\r\n          <div class=\"col-md-4\" *ngFor=\"let fixture of fixtureTemplatesList\">\r\n            <div class=\"card\">\r\n              <div class=\"card-img\">\r\n                <div class=\"card-action dropdown\">\r\n                  <button class=\"btn btn-light px-4 py-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n                    <i class=\"bi bi-three-dots-vertical\"></i>\r\n                  </button>\r\n                  <ul class=\"dropdown-menu\">\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Edit</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer\">Duplicate</a></li>\r\n                    <li><a class=\"dropdown-item cursor-pointer text-danger\">Delete</a></li>\r\n                  </ul>\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between align-items-center\">\r\n                <h3>{{ fixture.name }}</h3>\r\n                <div class=\"badge\" [ngClass]=\"fixture.status\">{{ fixture.status | titlecase }}</div>\r\n              </div>\r\n              <div class=\"d-flex gap-2\">\r\n                <div *ngFor=\"let subBrand of fixture.subBrand; let i = index\">\r\n                  <span *ngIf=\"i != 0\" class=\"me-2 card-tagline\">&#8226;</span>\r\n                  <div class=\"badge\">{{ subBrand }}</div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </section>\r\n    </ng-template> -->\r\n\r\n    <!-- Pagination -->\r\n    <lib-pagination [itemsPerPage]=\"limit\" [currentPage]=\"offset\" [totalItems]=\"totalItems\"\r\n      [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\" (pageChange)=\"onPageChange($event)\"\r\n      (pageSizeChange)=\"onPageSizeChange($event)\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n    </lib-pagination>\r\n  </div>\r\n</div>","import { Component, OnInit } from \"@angular/core\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { CreateFixtureTemplateComponent } from \"../../fixture-template-table/popups/create-fixture-template/create-fixture-template.component\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { Router } from \"@angular/router\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\n\r\n@Component({\r\n  selector: \"lib-tools-parent\",\r\n  templateUrl: \"./tools-parent.component.html\",\r\n  styleUrl: \"./tools-parent.component.scss\",\r\n})\r\nexport class ToolsParentComponent implements OnInit {\r\n  clientId: string;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        filter((data) => !!data), // Filtering null/undefined.\r\n        distinctUntilChanged(), // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Plano Tools\");\r\n    // this.pageInfo.setBreadcrumbs([\r\n    //   {\r\n    //     title: \"Planogram\",\r\n    //     path: \"/manage/planogram/manage-planograms\",\r\n    //     isActive: false,\r\n    //     isSeparator: false,\r\n    //   },\r\n    //   {\r\n    //     title: \"\",\r\n    //     path: \"\",\r\n    //     isActive: false,\r\n    //     isSeparator: true,\r\n    //   },\r\n    // ]);\r\n  }\r\n\r\n  onClickCreateFixtureTemplate() {\r\n    const modelRef = this.ngbModal.open(CreateFixtureTemplateComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n    });\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.result.then((result) => {\r\n      if (result) {\r\n        this.router.navigate(\r\n          [\"/manage/planogram/fixture-template/basic-details\"],\r\n          { queryParams: { templateId: result._id, isEdit: true } },\r\n        );\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div class=\"plano-tools-hub\">\n  <div class=\"hub-header mb-4\">\n    <h4 class=\"mb-1\">Plano Tools</h4>\n    <p class=\"text-muted small mb-0\">\n      Utilities for managing planograms, layouts, exports and templates.\n    </p>\n  </div>\n\n  <div class=\"tool-section mb-4\">\n    <h6 class=\"section-title\">Export &amp; Inspect</h6>\n    <div class=\"card-grid\">\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/migrate\">\n        <div class=\"icon\"><i class=\"bi bi-images\"></i></div>\n        <div class=\"title\">Download Layout Images</div>\n        <div class=\"desc\">Export layout images store by store.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/cad-render\">\n        <div class=\"icon\"><i class=\"bi bi-bounding-box\"></i></div>\n        <div class=\"title\">Check CAD Output</div>\n        <div class=\"desc\">Paste CAD data and preview the parsed layout.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/cad-files\">\n        <div class=\"icon\"><i class=\"bi bi-folder2-open\"></i></div>\n        <div class=\"title\">CAD Files</div>\n        <div class=\"desc\">List uploaded CAD &amp; Kissflow files for a store.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/data-export\">\n        <div class=\"icon\"><i class=\"bi bi-database-down\"></i></div>\n        <div class=\"title\">Data Export</div>\n        <div class=\"desc\">Query planogram fixtures and export as Excel.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/store-exports\">\n        <div class=\"icon\"><i class=\"bi bi-file-earmark-spreadsheet\"></i></div>\n        <div class=\"title\">MBQ &amp; Order</div>\n        <div class=\"desc\">Generate per-store fixture export bundles.</div>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"tool-section mb-4\">\n    <h6 class=\"section-title\">Edit &amp; Modify</h6>\n    <div class=\"card-grid\">\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/allow-edit\">\n        <div class=\"icon\"><i class=\"bi bi-pencil-square\"></i></div>\n        <div class=\"title\">Allow Edit</div>\n        <div class=\"desc\">Re-enable editing on a published task without losing responses.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/modify-fixture-numbers\">\n        <div class=\"icon\"><i class=\"bi bi-input-cursor-text\"></i></div>\n        <div class=\"title\">Modify Fixture Numbers</div>\n        <div class=\"desc\">Renumber fixtures in a planogram.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/fixture-conformance\">\n        <div class=\"icon\"><i class=\"bi bi-clipboard2-check\"></i></div>\n        <div class=\"title\">Sync Fixtures to Library</div>\n        <div class=\"desc\">Check fixtures against the library and sync shelf count &amp; zones.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/layout-touchup\">\n        <div class=\"icon\"><i class=\"bi bi-arrows-move\"></i></div>\n        <div class=\"title\">Layout Touchup</div>\n        <div class=\"desc\">Reposition or resize layout elements without invalidating responses.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/swap-template\">\n        <div class=\"icon\"><i class=\"bi bi-arrow-left-right\"></i></div>\n        <div class=\"title\">Template Swap</div>\n        <div class=\"desc\">Replace one fixture template with another.</div>\n      </a>\n      <a class=\"tool-card\" routerLink=\"/manage/planogram/plano-tools/move-bucket\">\n        <div class=\"icon\"><i class=\"bi bi-arrow-down-up\"></i></div>\n        <div class=\"title\">Move Store Bucket</div>\n        <div class=\"desc\">Move a floor between Onboarding and ManagePlano.</div>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"tool-section mb-4\">\n    <h6 class=\"section-title text-danger\">Destructive</h6>\n    <div class=\"card-grid\">\n      <a class=\"tool-card tool-card-danger\" routerLink=\"/manage/planogram/plano-tools/delete-task\">\n        <div class=\"icon\"><i class=\"bi bi-trash\"></i></div>\n        <div class=\"title\">Delete Task</div>\n        <div class=\"desc\">Remove a task and its responses.</div>\n      </a>\n      <a class=\"tool-card tool-card-danger\" routerLink=\"/manage/planogram/plano-tools/delete-floor\">\n        <div class=\"icon\"><i class=\"bi bi-trash3\"></i></div>\n        <div class=\"title\">Delete Floor</div>\n        <div class=\"desc\">Remove a floor and all rows referencing it.</div>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"tool-section\">\n    <h6 class=\"section-title\">Create</h6>\n    <div class=\"card-grid\">\n      <button type=\"button\" class=\"tool-card tool-card-primary\" (click)=\"onClickCreateFixtureTemplate()\">\n        <div class=\"icon\"><i class=\"bi bi-plus-lg text-white\" ></i></div>\n        <div class=\"title\">Create Template</div>\n        <div class=\"desc\">Start a new fixture template from scratch.</div>\n      </button>\n    </div>\n  </div>\n</div>\n","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../../../services/store-builder.service\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../../../../interfaces/fixture-template.interface\";\r\n\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { lastValueFrom, Subject, takeUntil } from \"rxjs\";\r\n\r\n@Component({\r\n  selector: \"misplaced-product-fixture\",\r\n  templateUrl: \"./misplaced-product-fixture.component.html\",\r\n  styleUrl: \"./misplaced-product-fixture.component.scss\",\r\n})\r\nexport class MisplacedProductFixtureComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixtureDetails: any;\r\n  fixtureTemplateDetails: any;\r\n\r\n  @Input() selectedProduct: any;\r\n  @Output() targetFixtureFullDetails = new EventEmitter<any>();\r\n\r\n  @ViewChild(\"misplacedFixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n  targetPID: any;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      color: any;\r\n    };\r\n  }[] = [];\r\n\r\n  private isLayoutInitialized = false;\r\n  private isColorsApplied = false;\r\n  isPageLoading: boolean = true;\r\n  targetShelf:any;\r\n\r\n  private destroy$ = new Subject<void>();\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    if (changes[\"fixtureDetails\"]?.currentValue) {\r\n      await this.getFixtureShelfDetails(changes[\"fixtureDetails\"].currentValue);\r\n      setTimeout(() => {\r\n        this.updateHeaderFooterSize();\r\n        this.applyShelfColors();\r\n      }, 200);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isLayoutInitialized) {\r\n      this.isLayoutInitialized = this.updateHeaderFooterSize();\r\n    }\r\n    if (!this.isColorsApplied) {\r\n      this.isColorsApplied = this.applyShelfColors();\r\n    }\r\n  }\r\n\r\n  async getFixtureShelfDetails(data: any) {\r\n    this.isPageLoading = true;\r\n    let payload = {\r\n      fixtureId: data?._id,\r\n      planoId: data?.planoId,\r\n      floorId: data?.floorId,\r\n      compliance: true,\r\n      ...(this.fixtureDetails?.revisionId && {\r\n        revisionId: this.fixtureDetails.revisionId,\r\n      }),\r\n    };\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getShelfDetails(payload),\r\n      );\r\n      if (res?.status === \"success\" && res?.data) {\r\n        this.fixtureTemplateDetails = {\r\n          ...res?.data,\r\n          shelfConfig: res?.data?.shelves ?? [],\r\n        };\r\n\r\n        this.fixtureTemplateDetails.shelfConfig =\r\n          this.fixtureTemplateDetails.shelfConfig.map((s: any) => {\r\n            if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n              s.distributedRows = this.distributeRoundRobin(\r\n                s.products,\r\n                s.trayRows,\r\n              );\r\n            }\r\n            return s;\r\n          });\r\n\r\n        const allProducts = (\r\n          this.fixtureTemplateDetails?.shelfConfig ?? []\r\n        ).flatMap((s: any) => s.products ?? []);\r\n\r\n        allProducts.forEach((p: any, i: number) => {\r\n          if (!p?.productId) {\r\n            p[\"productId\"] = i;\r\n          }\r\n        });\r\n\r\n        this.targetShelf =\r\n        this.fixtureTemplateDetails?.shelfConfig.find(\r\n          (s: any) => s?._id === this.selectedProduct?.fixtureDetails?.shelfId,\r\n        ) ?? {};\r\n\r\n        if (this.targetShelf.shelfType == 'shelf') {\r\n          this.targetPID = this.targetShelf.products.findIndex(\r\n            (prod: any) => {\r\n              return prod.status == \"missing\" || prod.status == \"misPlaced\";\r\n            },\r\n          );\r\n        }\r\n        else {\r\n          this.targetShelf.distributedRows.forEach((prod: any, index: any) => {\r\n            if(!this.targetPID) {\r\n              let prodIndex = prod.findIndex((ele:any) =>{\r\n                return ele.status == \"missing\" || ele.status == \"misPlaced\";\r\n              })\r\n              if(prodIndex != -1) {\r\n                this.targetPID = index.toString() + prodIndex.toString();\r\n              }\r\n            }\r\n          });\r\n        }\r\n\r\n        if (this.targetPID == undefined  || this.targetPID == -1) {\r\n          this.targetPID = \"storage\";\r\n        }\r\n        // this.targetPID = allProducts[0]._id;\r\n        this.targetFixtureFullDetails.emit(this.fixtureTemplateDetails);\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getFixtureShelfDetails [ERR]:\", error);\r\n    } finally {\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  updateHeaderFooterSize() {\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    const header = this.fixtureRoot?.nativeElement?.querySelector(\r\n      \"#header-block\",\r\n    ) as HTMLElement;\r\n\r\n    const footer = this.fixtureRoot?.nativeElement?.querySelector(\r\n      \"#footer-block\",\r\n    ) as HTMLElement;\r\n\r\n    if (header && footer) {\r\n      header.style.width = `${bodyWidth}px`;\r\n      footer.style.width = `${bodyWidth}px`;\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const targetIndex =\r\n      this.fixtureTemplateDetails?.shelfConfig.findIndex(\r\n        (s: any) => s?._id === this.selectedProduct?.fixtureDetails?.shelfId,\r\n      ) ?? 0;\r\n\r\n    shelfDivs.forEach((d, i) => {\r\n      if (d) {\r\n        d.style.backgroundColor = targetIndex === i ? \"#f2fef5\" : \"white\";\r\n        d.style.border = `1.4px solid  ${targetIndex === i ? \"#47d177\" : \"#98a2b3\"}`;\r\n      }\r\n    });\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (let i = 0; i < this.fixtureTemplateDetails?.shelfConfig.length; i++) {\r\n      const s = this.fixtureTemplateDetails?.shelfConfig[i];\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n            color: {\r\n              text: \"#009BF3\",\r\n              textBg: \"#EAF8FF\",\r\n              bg: \"#DAF1FF\",\r\n              border: \"#99DAFF\",\r\n            },\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section #misplacedFixtureRoot id=\"fixture-product-details\" *ngIf=\"!isPageLoading\">\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport scale-down\">\r\n        <!-- Header block -->\r\n        <div id=\"header-block\" class=\"header-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n            <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n        </div>\r\n\r\n        <!-- Body block -->\r\n        <div id=\"body-block-sum\" class=\"body-block\">\r\n\r\n            <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                @if(item.shelfType === 'tray'){\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                        @if(item.products.length){\r\n                            <div *ngFor=\"let row of item.distributedRows;let r = index\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of row;let p = index\" class=\"product\"\r\n                                    [class.error]=\"item?._id == targetShelf?._id && targetPID === (''+r+p)\">\r\n                                    <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n                                        [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n                                    <ng-template #placeholder>\r\n                                        <div></div>\r\n                                    </ng-template>\r\n                                </div>\r\n                            </div>\r\n                        }@else{\r\n                            <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\">\r\n                                </div>\r\n                            </div>\r\n                        }\r\n                    </div>\r\n                }@else {\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n                        @if(item.products.length){\r\n                            <div *ngFor=\"let product of item.products;let p = index\" class=\"product\"\r\n                                [class.error]=\"item?._id == targetShelf?._id && targetPID === p\">\r\n                                <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n                                    alt=\"Product Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div></div>\r\n                                </ng-template>\r\n                            </div>\r\n                        }@else {\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        }\r\n                    </div>\r\n                }\r\n                <!-- @if(item.shelfType ==='shelf'){\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                }@else {\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                        <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        </div>\r\n                    </div>\r\n                } -->\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Footer block -->\r\n        <div id=\"footer-block\" class=\"footer-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\" [class.error]=\"targetPID === 'storage'\">\r\n            <div class=\"sub-footer left-box\"></div>\r\n            <div class=\"sub-footer right-box\"></div>\r\n            <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n        </div>\r\n    </div>\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import { TitleCasePipe } from \"@angular/common\";\r\nimport {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\n\r\nimport * as fabric from \"fabric\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"product-fixture-locator\",\r\n  templateUrl: \"./product-locator.component.html\",\r\n  styleUrl: \"./product-locator.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class ProductLocatorComponent\r\n  implements AfterViewInit, OnChanges, OnDestroy\r\n{\r\n  @Input() floorData: any;\r\n  @Input() selectedProduct?: any;\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  @Output() targetFixtureFullDetails = new EventEmitter<any>();\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n  clientId: string;\r\n\r\n  cdnUrl: string;\r\n\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  isPageLoading: boolean = false;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"floorData\"]?.currentValue) {\r\n      this.floorData = changes[\"floorData\"].currentValue;\r\n\r\n      if (this.floorData?.floorChange) {\r\n        this.onClickClose();\r\n        this.renderFloor();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: false,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 560,\r\n      height: 450,\r\n    });\r\n    // this.setupZoomHandlers();\r\n\r\n    if (this.floorData) {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async renderFloor() {\r\n    this.canvas?.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    if (this.selectedProduct?.fixtureDetails) {\r\n      this.onChangeFixture(this.selectedProduct.fixtureDetails);\r\n    }\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const isTargetFixture =\r\n      this.selectedProduct?.fixtureDetails?.fixtureId === fixtureData?._id;\r\n\r\n    const isCurrentFixture =\r\n      this.selectedProduct?.currentFixture?.fixtureId === fixtureData?._id;\r\n\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n      \r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: isCurrentFixture ? '#f68a83' : isTargetFixture ? \"#51C1FF\" : \"#17c653\",\r\n      strokeWidth: isCurrentFixture ? 4 : 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: isTargetFixture ? \"#51C1FF\" : \"#c2c2c2\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: isTargetFixture ? \"#51C1FF\" : \"#c2c2c2\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: isTargetFixture ? \"#EAF8FF\" : \"#f9fbff\",\r\n        stroke: isTargetFixture ? \"#6BCAFF\" : \"#c2c2c2\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        strokeWidth: 0.27,\r\n        stroke: isTargetFixture ? \"#51C1FF\" : \"#c2c2c2\",\r\n        fill: \"#ffffff\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n      shelves.push(shelf, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          strokeWidth: 0.27,\r\n          stroke: isTargetFixture ? \"#51C1FF\" : \"#c2c2c2\",\r\n          fill: \"#ffffff\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        const isTargetZone = shelvesInGroup.some(\r\n          (s: any) => s._id === this.selectedProduct?.fixtureDetails?.shelfId,\r\n        );\r\n        const isCurrentZone = shelvesInGroup.some(\r\n          (s: any) => s._id === this.selectedProduct?.currentFixture?.shelfId,\r\n        );\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const isFirst = j === 0;\r\n          const isLast = j === shelvesInGroup.length - 1;\r\n\r\n          const fillColor = isCurrentZone ? \"#fef3f2\" : isTargetZone ? \"#f2fef5\" : \"#f9fbff\";\r\n          const borderColor = isCurrentZone ? \"#ffa3a3\" :isTargetZone ? \"#a3ffce\" : \"#c2c2c2\";\r\n\r\n          const pathData = [\r\n            `M ${midX} ${boxY} L ${midX} ${boxY + boxHeight}`,\r\n            `M ${midX + midWidth} ${boxY} L ${midX + midWidth} ${\r\n              boxY + boxHeight\r\n            }`,\r\n            isFirst ? `M ${midX} ${boxY} L ${midX + midWidth} ${boxY}` : \"\",\r\n            isLast\r\n              ? `M ${midX} ${boxY + boxHeight} L ${midX + midWidth} ${\r\n                  boxY + boxHeight\r\n                }`\r\n              : \"\",\r\n          ].join(\" \");\r\n\r\n          const fillRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            fill: fillColor,\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          const borderPath = new fabric.Path(pathData, {\r\n            stroke: borderColor,\r\n            strokeWidth: 0.7,\r\n            fill: \"\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          shelves.push(fillRect, borderPath);\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#1D2939\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"transparent\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: isTargetFixture ? \"#EAF8FF\" : \"#f9fbff\",\r\n        stroke: isTargetFixture ? \"#6BCAFF\" : \"#c2c2c2\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        // hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        hasControls: false,\r\n        lockRotation: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    // fixtureGroup.on(\"mousedown\", (event: any) => {\r\n    //   const target = event.target;\r\n    //   setTimeout(() => {\r\n    //     this.resizeCanvas();\r\n    //     this.fitCanvasToLayoutAnimated();\r\n    //   }, 300);\r\n    //   this.highlightFixture(target);\r\n    //   this.selectFixture(target);\r\n    // });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  selectFixture(target: any) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        taskType: target.taskType,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n        this.selectedFixtureData[\"revisionId\"] = this.floorData.revisionId;\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n        this.selectedFixtureData[\"revisionId\"] = this.floorData.revisionId;\r\n      }\r\n      if (this.selectedFixtureData?.header?.label != \"CL\") {\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      } else {\r\n        this.selectedFixture.fixtureData = null;\r\n      }\r\n    }\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  calcMerchCompliancePercentage() {\r\n    const allFixtures = [\r\n      ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n      ...this.floorData?.centerFixture,\r\n    ];\r\n\r\n    const allShelves = allFixtures.flatMap((f: any) => f.shelfConfig);\r\n\r\n    const compliances = allShelves.map((s: any) => s?.compliance);\r\n\r\n    const total = compliances.length;\r\n    const properCount = compliances.filter((p) => p === \"proper\").length;\r\n    const successPercentage = (properCount / total) * 100;\r\n\r\n    return Math.round(successPercentage);\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#17c653\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n    if (this.activeHighlight) {\r\n      this.canvas.remove(this.activeHighlight);\r\n      this.activeHighlight = null;\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onChangeFixture({\r\n    fixtureId,\r\n    fixtureName,\r\n    shelfId,\r\n    zone,\r\n  }: {\r\n    fixtureId: string;\r\n    fixtureName: string;\r\n    shelfId: string;\r\n    zone: string;\r\n  }) {\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === fixtureId,\r\n      ) as fabric.Group | undefined;\r\n\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture, true);\r\n    this.selectFixture(actionFixture);\r\n  }\r\n\r\n  onClickClose() {\r\n    this.selectedFixture = null;\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n    this.removeHighlight();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"product-locator\">\r\n    <div *ngIf=\"isPageLoading\" class=\"row\">\r\n        <div class=\"col-12 m-0\"><ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container></div>\r\n        <div class=\"col-12\"><ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container></div>\r\n    </div>\r\n\r\n    <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n        <div id=\"body\" class=\"row\">\r\n            <div class=\"col overflow-hidden position-relative compliance-canvas\">\r\n                <div id=\"canvas-card\" class=\"w-100 position-relative\" #canvasContainer>\r\n                    <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n                </div>\r\n            </div>\r\n\r\n            <div [ngClass]=\"{'d-none':!selectedFixture?.fixtureData}\" class=\"col bg-white rounded p-3 fixture-overview\">\r\n                <misplaced-product-fixture [fixtureDetails]=\"selectedFixture?.fixtureData\"\r\n                    [selectedProduct]=\"selectedProduct\"\r\n                    (targetFixtureFullDetails)=\"targetFixtureFullDetails.emit($event)\"></misplaced-product-fixture>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n\r\n\r\n<ng-template #headerSkeleton>\r\n    <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer w-100 p-4 rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke mt-0 animate title\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n    <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>","import {\r\n  Component,\r\n  Input,\r\n  OnChanges,\r\n  OnInit,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { VmLibraryList } from \"../../../../interfaces/vm-library.interface\";\r\n\r\n@Component({\r\n  selector: \"zone-products\",\r\n  templateUrl: \"./zone-products.component.html\",\r\n  styleUrl: \"./zone-products.component.scss\",\r\n})\r\nexport class ZoneProductsComponent implements OnChanges, OnInit {\r\n  @Input() data: any;\r\n  @Input() level: string;\r\n  @Input() floorData: any;\r\n  @Input() vmList: VmLibraryList[] = [];\r\n  @Input() productLocation?: { s: number; pid: any };\r\n\r\n  selectedProduct: any;\r\n\r\n  productNote: string | null;\r\n  allProducts: any[] = [];\r\n  zoneCapacity: number = 0;\r\n\r\n  brandName: string; // only for missing items\r\n  allBrands: any;\r\n  showProductLocation: boolean = false;\r\n  misplacedTargetFixture: any;\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private toastService: ToastService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.data.shelves = this.data.shelves.map((s: any) => {\r\n      if (s.shelfType === \"tray\" && s.products?.length) {\r\n        s.distributedRows = this.distributeRoundRobin(s.products, s.trayRows);\r\n      }\r\n      return s;\r\n    });\r\n\r\n    this.allProducts = (this.data?.shelves ?? []).flatMap(\r\n      (s: any) => s.products ?? [],\r\n    );\r\n\r\n    this.allBrands = [\r\n      ...new Set(this.data.shelves.flatMap((s: any) => s.productBrandName)),\r\n    ];\r\n\r\n    this.zoneCapacity = this.allProducts.length;\r\n\r\n    if (this.productLocation) {\r\n      const shelf = this.data.shelves.find(\r\n        (s: any) => s.shelfNumber === this.productLocation!.s,\r\n      );\r\n\r\n      this.onSelectProduct(this.productLocation.pid, shelf);\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {}\r\n\r\n  onClickRefresh() {}\r\n\r\n  onSelectProduct(pid: any, s: any) {\r\n    this.brandName = s.productBrandName;\r\n    this.selectedProduct = this.allProducts.find(\r\n      (p: any) => p?.productId === pid,\r\n    );\r\n\r\n    this.selectedProduct.currentFixture = {\r\n      zone: s.zone,\r\n      fixtureId: s.fixtureId,\r\n      shelfId: s._id,\r\n    };\r\n\r\n    if (this.selectedProduct.status === \"missing\") {\r\n      this.productNote = `No product found. Please fill the ${this.brandName}`;\r\n    } else if (this.selectedProduct.status === \"misplaced\") {\r\n      if (this.selectedProduct?.fixtureDetails?.fixtureName) {\r\n        this.productNote = `This product belong to fixture '${this.selectedProduct?.fixtureDetails?.fixtureName}'`;\r\n      } else {\r\n        this.productNote = `This product belong to an another fixture.`;\r\n      }\r\n    } else {\r\n      this.productNote = null;\r\n    }\r\n\r\n    this.showProductLocation = false;\r\n    this.misplacedTargetFixture = null;\r\n  }\r\n\r\n  onClickClose() {\r\n    this.activeModal.close();\r\n  }\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  copySKU(text: string) {\r\n    navigator.clipboard\r\n      .writeText(text)\r\n      .then(() => this.toastService.getSuccessToast(\"SKU Copied\"))\r\n      .catch((err) => console.error(\"Failed to copy:\", err));\r\n  }\r\n\r\n  onClickLocateFixture(product: any) {\r\n    this.showProductLocation = !this.showProductLocation;\r\n  }\r\n\r\n  onLoadTargetFixture(targetFixtureDetails: any) {\r\n    this.misplacedTargetFixture = targetFixtureDetails;\r\n  }\r\n}\r\n","<div class=\"modal-container\" id=\"zone-product-details\">\r\n    <div class=\"d-flex justify-content-between mb-4\">\r\n        <h3 class=\"title\">{{data.zone}}</h3>\r\n\r\n        <svg (click)=\"onClickClose()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\" class=\"cursor-pointer\">\r\n            <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n    </div>\r\n\r\n    @if(selectedProduct){\r\n        <div class=\"hero-card\">\r\n            <div class=\"hero-img\">\r\n                <img *ngIf=\"selectedProduct?.productImageUrl; else placeholder\" [src]=\"selectedProduct?.productImageUrl\"\r\n                    alt=\"Product Image\" />\r\n                <ng-template #placeholder>\r\n                    <div class=\"missing-img\">MISSING</div>\r\n                </ng-template>\r\n            </div>\r\n\r\n            <div class=\"hero-details\">\r\n                <div>\r\n                    <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                        <p class=\"heading\">Brand</p>\r\n                        <span> : </span>\r\n                        <p class=\"details\">{{selectedProduct?.productBrand ?? brandName}}</p>\r\n                    </div>\r\n\r\n                    @if(selectedProduct?.status !== 'missing'){\r\n                        <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                            <p class=\"heading\">Category</p>\r\n                            <span> : </span>\r\n                            <p class=\"details\">{{selectedProduct?.brandName}}</p>\r\n                        </div>\r\n                        <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                            <p class=\"heading\">SKU</p>\r\n                            <span> : </span>\r\n                            <div class=\"d-flex gap-2 align-items-center\">\r\n                                <p class=\"details\">{{selectedProduct?.barCode}}</p>\r\n                                <svg (click)=\"copySKU(selectedProduct?.barCode)\" class=\"cursor-pointer\" width=\"16\"\r\n                                    height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <g clip-path=\"url(#clip0_5307_114007)\">\r\n                                        <path\r\n                                            d=\"M3.33203 10H2.66536C2.31174 10 1.9726 9.85956 1.72256 9.60952C1.47251 9.35947 1.33203 9.02033 1.33203 8.66671V2.66671C1.33203 2.31309 1.47251 1.97395 1.72256 1.7239C1.9726 1.47385 2.31174 1.33337 2.66536 1.33337H8.66536C9.01899 1.33337 9.35813 1.47385 9.60817 1.7239C9.85822 1.97395 9.9987 2.31309 9.9987 2.66671V3.33337M7.33203 6.00004H13.332C14.0684 6.00004 14.6654 6.59699 14.6654 7.33337V13.3334C14.6654 14.0698 14.0684 14.6667 13.332 14.6667H7.33203C6.59565 14.6667 5.9987 14.0698 5.9987 13.3334V7.33337C5.9987 6.59699 6.59565 6.00004 7.33203 6.00004Z\"\r\n                                            stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </g>\r\n                                    <defs>\r\n                                        <clipPath id=\"clip0_5307_114007\">\r\n                                            <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                                        </clipPath>\r\n                                    </defs>\r\n                                </svg>\r\n\r\n                            </div>\r\n                        </div>\r\n                    }\r\n                    <div *ngIf=\"selectedProduct?.status\" class=\"d-flex align-items-center gap-2 mb-2\">\r\n                        <p class=\"heading\">Compliance</p>\r\n                        <span> : </span>\r\n                        <span class=\"indicator \"\r\n                            [ngClass]=\"{flagged:selectedProduct?.status === 'missing' || selectedProduct?.status ==='misplaced',completed:selectedProduct?.status ==='proper'}\">\r\n                            {{ selectedProduct?.status ==='proper' ? 'Placement Compliant': selectedProduct?.status | titlecase}}\r\n                        </span>\r\n                    </div>\r\n                    <div class=\"d-flex align-items-center gap-2 mb-2\" *ngIf=\"productNote\">\r\n                        <p class=\"heading\">Action required</p>\r\n                        <span> : </span>\r\n                        <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                            <g clip-path=\"url(#clip0_3914_56687)\">\r\n                                <path\r\n                                    d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                                    stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </g>\r\n                            <defs>\r\n                                <clipPath id=\"clip0_3914_56687\">\r\n                                    <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                </clipPath>\r\n                            </defs>\r\n                        </svg>\r\n\r\n                        @if(selectedProduct?.fixtureDetails?.fixtureName){\r\n                            <a class=\"cursor-pointer text-underline-underline mt-1\"\r\n                                (click)=\"onClickLocateFixture(selectedProduct)\">{{productNote}}</a>\r\n                            @if(showProductLocation){\r\n                                <svg width=\"14\" height=\"8\" viewBox=\"0 0 14 8\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path d=\"M13 7L7 1L1 7\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            }@else {\r\n                                <svg width=\"14\" height=\"8\" viewBox=\"0 0 14 8\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path d=\"M1 1L7 7L13 1\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n\r\n                            }\r\n                        }@else {\r\n                            <p class=\"details\"> {{productNote}} </p>\r\n                        }\r\n\r\n                    </div>\r\n\r\n                </div>\r\n                <div>\r\n                    <svg (click)=\"selectedProduct = null\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                            d=\"M2.66667 9.33333H6.66667M6.66667 9.33333V13.3333M6.66667 9.33333L2 14M13.3333 6.66667H9.33333M9.33333 6.66667V2.66667M9.33333 6.66667L14 2\"\r\n                            stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n\r\n                </div>\r\n            </div>\r\n\r\n        </div>\r\n    }\r\n\r\n    @if(showProductLocation && selectedProduct?.fixtureDetails) {\r\n        <h3 class=\"mt-4\">Step 1: Go to the below highlighted fixture\r\n            “<b>{{this.selectedProduct?.fixtureDetails?.fixtureName}}</b>”</h3>\r\n        <product-fixture-locator [floorData]=\"floorData\" [selectedProduct]=\"selectedProduct\" (targetFixtureFullDetails)=\"onLoadTargetFixture($event)\"></product-fixture-locator>\r\n        <!-- <h3>Step 2: Place the product in the highlighted area.</h3>\r\n        <product-zone-locator [targetProduct]=\"selectedProduct?.fixtureDetails\" [targetFixture]=\"misplacedTargetFixture\"></product-zone-locator>\r\n        <hr> -->\r\n    }\r\n\r\n    <div class=\"zone-details my-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n            <div class=\"zone-info\">\r\n                <span class=\"badge draft mb-3\">\r\n                    {{ data.zone }}\r\n                </span>\r\n                <h1>{{allBrands}}</h1>\r\n                <h4>Capacity {{zoneCapacity}}</h4>\r\n            </div>\r\n\r\n            <div class=\"shelves\">\r\n                <ng-container *ngFor=\"let s of data.shelves; let i = index\">\r\n                    @if(s.shelfType ==='tray'){\r\n                        <div [id]=\"s.shelfType! + (i + 1)\" class=\"block\">\r\n                            @if(s.products.length){\r\n                                <div *ngFor=\"let row of s.distributedRows\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of row\" class=\"product\"\r\n                                        [ngClass]=\"{'selected':selectedProduct?.productId === p.productId,'error':p.status === 'missing' || p.status === 'misplaced'}\"\r\n                                        (click)=\"onSelectProduct(p.productId,s)\">\r\n                                        @if(p.status != 'missing'){\r\n                                            <div class=\"product-img\">\r\n                                                <img *ngIf=\"p?.productImageUrl; else placeholder\"\r\n                                                    [src]=\"p?.productImageUrl\" alt=\"Product Image\" />\r\n                                                <ng-template #placeholder>\r\n                                                    <div></div>\r\n                                                </ng-template>\r\n                                            </div>\r\n                                            <div class=\"product-details\">\r\n                                                <span class=\"badge cluster\">\r\n                                                    {{ p.productId }}\r\n                                                </span>\r\n                                                <h6 class=\"ms-1\">{{p.productName}}</h6>\r\n                                                <p class=\"ms-1\">{{p.productType}}</p>\r\n                                            </div>\r\n                                        }\r\n                                    </div>\r\n                                </div>\r\n                            }@else{\r\n                                <div *ngFor=\"let row of [].constructor(s.trayRows)\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"s.shelfType + (i + 1)\" class=\"block shelf\">\r\n                            @if(s.products.length){\r\n                                <div *ngFor=\"let p of s.products\" class=\"product\"\r\n                                    (click)=\"onSelectProduct(p.productId,s)\"\r\n                                    [ngClass]=\"{'selected':selectedProduct?.productId === p.productId,'error':p.status === 'missing' || p.status === 'misplaced'}\">\r\n\r\n                                    @if(p.status != 'missing'){\r\n                                        <div class=\"product-img\">\r\n                                            <img *ngIf=\"p?.productImageUrl; else placeholder\" [src]=\"p?.productImageUrl\"\r\n                                                alt=\"Product Image\" />\r\n                                            <ng-template #placeholder>\r\n                                                <div></div>\r\n                                            </ng-template>\r\n                                        </div>\r\n                                        <div class=\"product-details\">\r\n                                            <span class=\"badge cluster\">\r\n                                                {{ p.productId }}\r\n                                            </span>\r\n                                            <h6 class=\"ms-1\">{{p.productName}}</h6>\r\n                                            <p class=\"ms-1\">{{p.productType}}</p>\r\n                                        </div>\r\n                                    }\r\n                                </div>\r\n                            }@else {\r\n                                <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </ng-container>\r\n\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n\r\n    <!-- <button type=\"button\" class=\"btn btn-primary w-100\" (click)=\"onClickRefresh()\">Refresh</button> -->\r\n</div>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { VmLibraryList } from \"../../../../interfaces/vm-library.interface\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { Subject, Subscription, takeUntil } from \"rxjs\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { ZoneProductsComponent } from \"../zone-products/zone-products.component\";\r\n\r\n@Component({\r\n  selector: \"fixture-products\",\r\n  templateUrl: \"./fixture-products.component.html\",\r\n  styleUrl: \"./fixture-products.component.scss\",\r\n})\r\nexport class FixtureProductsComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixtureDetails: any;\r\n  @Input() vmList: VmLibraryList[] = [];\r\n  @Input() floorData: any;\r\n\r\n  @Output() onClose = new EventEmitter<any>();\r\n  @Output() changeFixture = new EventEmitter<{\r\n    fixtureId: string;\r\n    fixtureName: string;\r\n    shelfId: string;\r\n    zone: string;\r\n  }>();\r\n\r\n  fixtureTemplateDetails: any;\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n\r\n  zoneColor = {\r\n    right: {\r\n      bg: \"#ffffff\",\r\n      text: \"#12B76A\",\r\n      border: \"#32D583\",\r\n      productBorder: \"#12B76A\",\r\n      productBg: \"#FCFCFD\",\r\n    },\r\n    wrong: {\r\n      bg: \"#ffffff\",\r\n      text: \"#F04438\",\r\n      border: \"#98a2b3\",\r\n      productBorder: \"#F04438\",\r\n      productBg: \"#FECDCA\",\r\n    },\r\n  };\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      products: any;\r\n      improper: boolean;\r\n      missing: number;\r\n      misplaced: number;\r\n      capacity: number;\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n  showVMs: boolean = true;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n  private fixtureSub?: Subscription;\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n    private ngbModal: NgbModal,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.isPageLoading = true;\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    if (changes[\"fixtureDetails\"]?.currentValue) {\r\n      await this.getFixtureShelfDetails(changes[\"fixtureDetails\"].currentValue);\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 200);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  async getFixtureShelfDetails(data: any): Promise<void> {\r\n    // Cancel previous request\r\n    this.fixtureSub?.unsubscribe();\r\n\r\n    this.isPageLoading = true;\r\n\r\n    const payload = {\r\n      fixtureId: data?._id,\r\n      planoId: data?.planoId,\r\n      floorId: data?.floorId,\r\n      compliance: true,\r\n      ...(this.fixtureDetails?.revisionId && {\r\n        revisionId: this.fixtureDetails.revisionId,\r\n      }),\r\n    };\r\n\r\n    return new Promise((resolve, reject) => {\r\n      this.fixtureSub = this.storeBuilderService\r\n        .getShelfDetails(payload)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\" && res?.data) {\r\n              this.fixtureTemplateDetails = {\r\n                ...res.data,\r\n                shelfConfig: res.data?.shelves ?? [],\r\n              };\r\n\r\n              this.fixtureTemplateDetails.shelfConfig =\r\n                this.fixtureTemplateDetails.shelfConfig.map((s: any) => {\r\n                  if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n                    s.distributedRows = this.distributeRoundRobin(\r\n                      s.products,\r\n                      s.trayRows,\r\n                    );\r\n                  }\r\n                  return s;\r\n                });\r\n\r\n              this.fixtureTemplateDetails.actualShelves =\r\n                this.fixtureTemplateDetails?.shelfConfig?.filter(\r\n                  (s: any) => s.shelfType != \"vmonly\",\r\n                );\r\n\r\n              const allProducts = (\r\n                this.fixtureTemplateDetails?.shelfConfig ?? []\r\n              ).flatMap((s: any) => s.products ?? []);\r\n\r\n              allProducts.forEach((p: any, i: number) => {\r\n                if (!p?.productId) {\r\n                  p.productId = i;\r\n                }\r\n              });\r\n            }\r\n\r\n            this.isPageLoading = false;\r\n            resolve();\r\n          },\r\n          error: (err) => {\r\n            this.isPageLoading = false;\r\n            console.error(\"@@ ~ getFixtureShelfDetails [ERR]:\", err);\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  getSelectedVM(vm: any) {\r\n    return this.vmList.find((v) => v.id === vm?.vmId);\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    const header = document.getElementById(\"header-block\") as HTMLElement;\r\n    const footer = document.getElementById(\"footer-block\") as HTMLElement;\r\n\r\n    if (header && footer) {\r\n      header.style.width = `${bodyWidth}px`;\r\n      footer.style.width = `${bodyWidth}px`;\r\n    }\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!bodies) return false;\r\n    const bodyWidth = bodies.offsetWidth;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        // const allProducts = (\r\n        //   this.fixtureTemplateDetails?.shelves ?? []\r\n        // ).flatMap((s: any) => s.products ?? []);\r\n\r\n        // const isImproper =\r\n        //   allProducts.length == 0\r\n        //     ? true\r\n        //     : allProducts.some(\r\n        //         (p: any) =>\r\n        //           p.status === \"misplaced\" ||\r\n        //           p.status === \"missing\" ||\r\n        //           p.status === \"\"\r\n        //       );\r\n\r\n        // shelfDivs.forEach((d) => {\r\n        //   if (d) {\r\n        //     const blockDiv = d.querySelector(\".block\") as HTMLElement;\r\n        //     if (blockDiv) {\r\n        //       blockDiv.style.borderColor = isImproper\r\n        //         ? this.zoneColor.wrong.border\r\n        //         : this.zoneColor.right.border;\r\n        //       blockDiv.style.backgroundColor = isImproper\r\n        //         ? this.zoneColor.wrong.bg\r\n        //         : this.zoneColor.right.bg;\r\n        //     }\r\n        //   }\r\n        // });\r\n        // const l1 = document.getElementById(\"fixture-level\") as HTMLElement;\r\n        // if (l1) {\r\n        //   const bc = l1.querySelector(\".brand-category\") as HTMLElement;\r\n\r\n        //   if (bc) {\r\n        //     if (isImproper) {\r\n        //       bc.classList.add(\"wrong\");\r\n        //     } else {\r\n        //       bc.classList.remove(\"wrong\");\r\n        //     }\r\n        //   }\r\n        // }\r\n\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n            const currentSe = this.sectionByZones.find(\r\n              (s) => s.zone === se.zone,\r\n            );\r\n\r\n            secDivs.forEach((d, i) => {\r\n              // if (d) d.style.backgroundColor = this.shelfColors[i].bg;\r\n              if (d) {\r\n                d.style.backgroundColor = currentSe?.section.improper\r\n                  ? this.zoneColor.wrong.bg\r\n                  : this.zoneColor.right.bg;\r\n                d.style.borderRight = `2px solid`;\r\n                d.style.borderLeft = `2px solid`;\r\n\r\n                if (secDivs.length == 1) {\r\n                  d.style.border = `2px solid`;\r\n                } else if (secDivs.length > 1 && secDivs.length <= 2) {\r\n                  if (i == 0) {\r\n                    d.style.borderTop = `1px solid`;\r\n                    d.style.borderBottom = `0.5px dotted`;\r\n                  } else if (i == secDivs.length - 1) {\r\n                    d.style.borderBottom = `1px solid`;\r\n                  }\r\n                } else {\r\n                  if (i == 0) {\r\n                    d.style.borderTop = `1px solid`;\r\n                  } else if (i == secDivs.length - 1) {\r\n                    d.style.borderBottom = `1px solid`;\r\n                  } else {\r\n                    d.style.borderTop = `0.5px dotted`;\r\n                    d.style.borderBottom = `0.5px dotted`;\r\n                  }\r\n                }\r\n                d.style.borderColor = currentSe?.section.improper\r\n                  ? this.zoneColor.wrong.border\r\n                  : this.zoneColor.right.border;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                // const secBg = rgbToHex(\r\n                //   sz.section.shelfDivs[0]?.style.backgroundColor\r\n                // );\r\n                // const color =\r\n                //   this.shelfColors.find((c) => c.bg === secBg) ??\r\n                //   this.shelfColors[i];\r\n\r\n                // bc.style.borderColor = this.zoneColor.right.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                // const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcX = bodyWidth + 16;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n\r\n            const storeBox = document.getElementById(\r\n              \"storage-box-zone\",\r\n            ) as HTMLElement;\r\n\r\n            const align = bodyWidth + 16;\r\n\r\n            if (storeBox) {\r\n              storeBox.style.left = `${align}px`;\r\n            }\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            // div.style.backgroundColor = this.zoneColor.right.bg;\r\n            // div.style.border = `1.4px solid ${this.zoneColor.right.border}`;\r\n            // if (this.showVMs) return false;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            // bc.style.borderColor = this.zoneColor.right.border;\r\n            // bc.style.backgroundColor = this.zoneColor.right.bg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n      default:\r\n        // shelfDivs.forEach((d) => {\r\n        //   if (d) d.style.backgroundColor = this.zoneColor.right.bg;\r\n        // });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      const hasImproperProduct =\r\n        (s?.products?.length ?? 0) === 0 ||\r\n        (s?.products ?? []).some((p: any) => p.status !== \"proper\");\r\n\r\n      const missCount = (s?.products ?? []).filter(\r\n        (p: any) => p.status === \"missing\",\r\n      ).length;\r\n      const misplacedCount = (s?.products ?? []).filter(\r\n        (p: any) => p.status === \"misplaced\",\r\n      ).length;\r\n\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            products: structuredClone(s?.products) ?? [],\r\n            improper: hasImproperProduct,\r\n            misplaced: misplacedCount,\r\n            missing: missCount,\r\n            capacity: shelfCapacity,\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.products.push(...s.products);\r\n        section.capacity += shelfCapacity;\r\n        if (hasImproperProduct) section.improper = true;\r\n        section.missing += missCount;\r\n        section.misplaced += misplacedCount;\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  openZoneLevelProductModalByProduct(p: any, s: any) {\r\n    const pLocator = {\r\n      s: s.shelfNumber,\r\n      pid: p?.productId,\r\n    };\r\n\r\n    const zoneData = this.sectionByZones.find(\r\n      (sh) => sh.zone === (s?.zone ?? \"Top\"),\r\n    );\r\n\r\n    this.openZoneLevelProductModal(zoneData, \"section\", pLocator);\r\n  }\r\n\r\n  openZoneLevelProductModal(\r\n    zoneData: any,\r\n    level: string,\r\n    pLocator?: { s: number; pid: any },\r\n  ) {\r\n    const data = {\r\n      zone: zoneData.zone,\r\n      shelves: this.fixtureTemplateDetails.shelfConfig.filter(\r\n        (s: any) => s.zone === zoneData.zone && s.shelfType != \"vmonly\",\r\n      ),\r\n    };\r\n    if (data.shelves.every((s: any) => s.products.length > 0)) {\r\n      const modalRef = this.ngbModal.open(ZoneProductsComponent, {\r\n        centered: true,\r\n        windowClass: \"merch-compliance-modal\",\r\n      });\r\n      modalRef.componentInstance.data = data;\r\n      modalRef.componentInstance.level = level;\r\n      modalRef.componentInstance.floorData = this.floorData;\r\n      modalRef.componentInstance.vmList = this.vmList;\r\n      modalRef.componentInstance.productLocation = pLocator;\r\n      modalRef.componentInstance.floorData = this.floorData;\r\n      modalRef.componentInstance.vmList = this.vmList;\r\n\r\n      modalRef.result.then((result: any) => {\r\n        if (result) {\r\n          this.changeFixture.emit(result);\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  openStoreBoxProducts() {\r\n    if (this.fixtureTemplateDetails.storageProducts.length <= 0) return;\r\n\r\n    const MAX_PRODUCTS_PER_SHELF = 6;\r\n    const shelves = [];\r\n\r\n    // Creating Imaginary shelves to display the storage box products.\r\n    for (\r\n      let i = 0;\r\n      i < this.fixtureTemplateDetails.storageProducts.length;\r\n      i += MAX_PRODUCTS_PER_SHELF\r\n    ) {\r\n      shelves.push({\r\n        shelfType: \"shelf\",\r\n        products: this.fixtureTemplateDetails.storageProducts.slice(\r\n          i,\r\n          i + MAX_PRODUCTS_PER_SHELF,\r\n        ),\r\n      });\r\n    }\r\n\r\n    const data = {\r\n      zone: \"Storage Box\",\r\n      shelves: shelves,\r\n    };\r\n\r\n    const modalRef = this.ngbModal.open(ZoneProductsComponent, {\r\n      centered: true,\r\n      windowClass: \"merch-compliance-modal\",\r\n    });\r\n\r\n    modalRef.componentInstance.data = data;\r\n    modalRef.componentInstance.level = \"section\";\r\n  }\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  // isErrorProduct(products?: any[]) {\r\n  //   if (products) {\r\n  //     return products.some(\r\n  //       (p: any) => p.status == \"missing\" || p.status == \"misplaced\"\r\n  //     );\r\n  //   }\r\n  //   return true;\r\n  // }\r\n\r\n  getShelfRowWithProducts() {}\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixture-product-details\" class=\"scale-down\" *ngIf=\"!isPageLoading\">\r\n    <div class=\"hero-block\">\r\n        <svg (click)=\"onClickClose()\" class=\"close-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n        <h1 style=\"font-weight: 600;font-size: 30px;\">{{ fixtureTemplateDetails?.fixtureCompliance ?? 0 }}%</h1>\r\n        <p>Compliance score</p>\r\n        <p>\r\n            {{ fixtureTemplateDetails?.header?.label }}<span>&#8226;</span>\r\n            {{fixtureTemplateDetails?.fixtureCategory}} <span>&#8226;</span>\r\n            {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>&#8226;</span>\r\n            {{fixtureTemplateDetails?.actualShelves?.length}} Shelves\r\n        </p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end mb-4 pe-5\">\r\n        <div class=\"form-check form-switch \">\r\n            <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n                style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n            <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n                Show VM\r\n            </label>\r\n        </div>\r\n    </div>\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n        <div class=\"fixture-wrapper\">\r\n            <!-- Header block -->\r\n            <div id=\"header-block\" class=\"header-block\">\r\n                <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\" [ngClass]=\"{'d-none':!showVMs}\">\r\n                    <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN+vm?.vmImageUrl\"\r\n                                    alt=\"Vm Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                    <div id=\"brand-category\" class=\"brand-category\"\r\n                        *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"badge mt-1\">\r\n                            Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container\r\n                                    *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container\r\n                                    *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n                            (click)=\"openZoneLevelProductModal(item,'section')\"\r\n                            [class.proper]=\"!item?.section?.improper\">\r\n                            <div class=\"d-flex gap-1\">\r\n                                <span class=\"badge inactive\">\r\n                                    {{ item.zone }}\r\n                                </span>\r\n                                <span class=\"badge inactive\">\r\n                                    Capacity {{ item?.section?.capacity }}\r\n                                </span>\r\n                            </div>\r\n\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n\r\n                            <div class=\"d-flex gap-1 mb-1\">\r\n                                <span class=\"badge\" *ngIf=\"item.section.missing > 0\">\r\n                                    Missing {{item.section.missing}}\r\n                                </span>\r\n                                <span class=\"badge\" *ngIf=\"item.section.misplaced > 0\">\r\n                                    Misplaced {{item.section.misplaced}}\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\"\r\n                    *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <span class=\"badge inactive\">\r\n                                    Capacity {{item?.productPerShelf }}\r\n                                </span>\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                            @if(item.products.length){\r\n                                <div *ngFor=\"let row of item.distributedRows;let r = index\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let product of row;let p = index\" class=\"product cursor-pointer\"\r\n                                        [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n                                        (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n                                        @if(product.status != 'missing'){\r\n                                            <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n                                                [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n                                            <ng-template #placeholder>\r\n                                                <div></div>\r\n                                            </ng-template>\r\n                                        }\r\n                                    </div>\r\n                                </div>\r\n                            }@else{\r\n                                <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\">\r\n                                    </div>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            @if(item.products.length){\r\n                                <div *ngFor=\"let product of item.products;let p = index\" class=\"product cursor-pointer\"\r\n                                    [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n                                    (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n                                    @if(product.status != 'missing'){\r\n                                        <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n                                            [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n                                        <ng-template #placeholder>\r\n                                            <div></div>\r\n                                        </ng-template>\r\n                                    }\r\n                                </div>\r\n                            }@else {\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div id=\"footer-block\" class=\"footer-block\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n            </div>\r\n\r\n            <div id=\"storage-box-zone\" *ngIf=\"fixtureTemplateDetails?.storageProducts?.length\" class=\"storage-box\"\r\n                (click)=\"openStoreBoxProducts()\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n\r\n                <span class=\"badge inactive\">\r\n                    Capacity {{ fixtureTemplateDetails?.storageProducts?.length  ?? 0}}\r\n                </span>\r\n\r\n                <div class=\"w-100 d-flex justify-content-center\">\r\n                    <span class=\"brand\">\r\n                        @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n                            {{p.brandName}}\r\n                        }\r\n                    </span>\r\n                    <span class=\"category\">\r\n                        @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n                            {{p.category}}\r\n                        }\r\n                    </span>\r\n                </div>\r\n\r\n                <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                        <!-- Brands -->\r\n                        <p>\r\n                            <b>Brands: </b>\r\n\r\n                            @for (\r\n                            b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n                            track $index;\r\n                            let last = $last\r\n                        ) {\r\n                                {{ b?.brandName }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            }\r\n\r\n                            @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n                                , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n                            }\r\n                        </p>\r\n\r\n                        <!-- Categories -->\r\n                        <p>\r\n                            <b>Categories: </b>\r\n\r\n                            @for (\r\n                            b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n                            track $index;\r\n                            let last = $last\r\n                        ) {\r\n                                {{ b?.category }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            }\r\n\r\n                            @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n                                , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n                            }\r\n                        </p>\r\n                    </div>\r\n                </ng-template>\r\n            </div>\r\n        </div>\r\n\r\n    </div>\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import { TitleCasePipe } from \"@angular/common\";\r\nimport {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\n\r\nimport * as fabric from \"fabric\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"merch-compliance\",\r\n  templateUrl: \"./merch-compliance.component.html\",\r\n  styleUrl: \"./merch-compliance.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class MerchComplianceComponent\r\n  implements AfterViewInit, OnChanges, OnDestroy\r\n{\r\n  @Input() floorData: any;\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n  clientId: string;\r\n\r\n  cdnUrl: string;\r\n\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  isPageLoading: boolean = false;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"floorData\"]?.currentValue) {\r\n      this.floorData = changes[\"floorData\"].currentValue;\r\n\r\n      if (this.floorData?.floorChange) {\r\n        this.onClickClose();\r\n        this.renderFloor();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 1000,\r\n      height: 700,\r\n    });\r\n    this.setupZoomHandlers();\r\n\r\n    if (this.floorData) {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async renderFloor() {\r\n    this.canvas?.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig.length;\r\n\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: \"#EAF8FF\",\r\n        stroke: \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        strokeWidth: 0.27,\r\n        stroke: fixtureData.shelfConfig.some((s: any) => s.compliance === \"proper\")\r\n          ? \"#32D583\"\r\n          : \"#cecece\",\r\n        fill: \"#ffffff\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n      shelves.push(shelf, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          strokeWidth: 0.27,\r\n          stroke:\r\n            fixtureData.shelfConfig?.[i].compliance === \"proper\" ? \"#32D583\" : \"#cecece\",\r\n          fill: \"#ffffff\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        const text = fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        const hasImproper = shelvesInGroup.some(\r\n          (s: any) => s?.compliance === \"improper\",\r\n        );\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const isFirst = j === 0;\r\n          const isLast = j === shelvesInGroup.length - 1;\r\n\r\n          // const fillColor = hasImproper ? \"#FEF3F2\" : \"#ECFDF3\";\r\n          const fillColor = \"#ffffff\";\r\n          const borderColor = hasImproper ? \"#cecece\" : \"#32D583\";\r\n\r\n          const pathData = [\r\n            `M ${midX} ${boxY} L ${midX} ${boxY + boxHeight}`,\r\n            `M ${midX + midWidth} ${boxY} L ${midX + midWidth} ${\r\n              boxY + boxHeight\r\n            }`,\r\n            isFirst ? `M ${midX} ${boxY} L ${midX + midWidth} ${boxY}` : \"\",\r\n            isLast\r\n              ? `M ${midX} ${boxY + boxHeight} L ${midX + midWidth} ${\r\n                  boxY + boxHeight\r\n                }`\r\n              : \"\",\r\n          ].join(\" \");\r\n\r\n          const fillRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            fill: fillColor,\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          const borderPath = new fabric.Path(pathData, {\r\n            stroke: borderColor,\r\n            strokeWidth: 0.7,\r\n            fill: \"\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          shelves.push(fillRect, borderPath);\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text =\r\n            [...sectionBrands].join(\" + \") + (hasImproper ? \" ⓘ\" : \"\");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#1D2939\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"transparent\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: \"#EAF8FF\",\r\n        stroke: \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        hasControls: false,\r\n        lockRotation: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      setTimeout(() => {\r\n        this.resizeCanvas();\r\n        this.fitCanvasToLayoutAnimated();\r\n      }, 300);\r\n      this.highlightFixture(target);\r\n      this.selectFixture(target);\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  selectFixture(target: any) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        taskType: target.taskType,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n        this.selectedFixtureData[\"revisionId\"] = this.floorData.revisionId;\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n        this.selectedFixtureData[\"revisionId\"] = this.floorData.revisionId;\r\n      }\r\n      if (this.selectedFixtureData?.header?.label != \"CL\") {\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      } else {\r\n        this.selectedFixture.fixtureData = null;\r\n      }\r\n    }\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  calcMerchCompliancePercentage() {\r\n    const allFixtures = [\r\n      ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n      ...this.floorData?.centerFixture,\r\n    ];\r\n\r\n    const allShelves = allFixtures.flatMap((f: any) => f.shelfConfig);\r\n\r\n    const compliances = allShelves.map((s: any) => s?.compliance);\r\n\r\n    const total = compliances.length;\r\n    const properCount = compliances.filter((p) => p === \"proper\").length;\r\n    const successPercentage = (properCount / total) * 100;\r\n\r\n    return Math.round(successPercentage);\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.floorData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n    if (this.activeHighlight) {\r\n      this.canvas.remove(this.activeHighlight);\r\n      this.activeHighlight = null;\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onChangeFixture({\r\n    fixtureId,\r\n    fixtureName,\r\n    shelfId,\r\n    zone,\r\n  }: {\r\n    fixtureId: string;\r\n    fixtureName: string;\r\n    shelfId: string;\r\n    zone: string;\r\n  }) {\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === fixtureId,\r\n      ) as fabric.Group | undefined;\r\n\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture, true);\r\n    this.selectFixture(actionFixture);\r\n  }\r\n\r\n  onClickClose() {\r\n    this.selectedFixture = null;\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n    this.removeHighlight();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"merch-compliance\">\r\n    <div *ngIf=\"isPageLoading\" class=\"row\">\r\n        <div class=\"col-12 m-0\"><ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container></div>\r\n        <div class=\"col-12\"><ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container></div>\r\n    </div>\r\n\r\n    <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n        <div id=\"body\" class=\"row\">\r\n            <div class=\"col overflow-hidden position-relative compliance-canvas\">\r\n                <div id=\"canvas-card\" class=\"w-100 position-relative\" #canvasContainer>\r\n                    <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n                    <!-- Rotate Button -->\r\n                    <button style=\"top: 24px; right: 94px\" type=\"button\"\r\n                        class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n                        (click)=\"rotateCanvas(canvas,90)\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n                            <path\r\n                                d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                                fill=\"#1D2939\" />\r\n                            <path\r\n                                d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                                stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                    </button>\r\n\r\n                    <!-- Download Button -->\r\n                    <button style=\"top: 24px; right: 26px\" type=\"button\"\r\n                        class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n                        (click)=\"downloadCanvas()\">\r\n                        <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                            stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n                            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n                                stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n                            <g id=\"SVGRepo_iconCarrier\">\r\n                                <path\r\n                                    d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                                    fill=\"#1D2939\"></path>\r\n                                <path\r\n                                    d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                                    fill=\"#1D2939\"></path>\r\n                            </g>\r\n                        </svg>\r\n                    </button>\r\n                </div>\r\n            </div>\r\n\r\n            <div [ngClass]=\"{'d-none':!selectedFixture?.fixtureData}\" class=\"col bg-white rounded p-3 fixture-overview\">\r\n                <fixture-products [fixtureDetails]=\"selectedFixture?.fixtureData\" (onClose)=\"onClickClose()\"\r\n                    (changeFixture)=\"onChangeFixture($event)\" [floorData]=\"floorData\"></fixture-products>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n\r\n\r\n<ng-template #headerSkeleton>\r\n    <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer w-100 p-4 rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke mt-0 animate title\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n    <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-set-current-plano-modal',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './set-current-plano-modal.component.html',\r\n  styleUrl: './set-current-plano-modal.component.scss',\r\n})\r\nexport class SetCurrentPlanoModalComponent {\r\n  @Input() revisionName = '';\r\n  @Input() revisionIndex = 0;\r\n  @Input() publishedDate = '';\r\n  @Input() storeStatus = '';\r\n\r\n  sendVerificationTask = false;\r\n\r\n  get statusBadgeClass(): string {\r\n    if (this.storeStatus === 'Task Assigned') return 'status-badge status-task-assigned';\r\n    if (this.storeStatus === 'Task Scheduled') return 'status-badge status-task-assigned';\r\n    if (this.storeStatus === 'Review Pending') return 'status-badge status-review-pending';\r\n    if (this.storeStatus === 'Ready to Publish') return 'status-badge status-ready-to-publish';\r\n    if (this.storeStatus === 'Published') return 'badge bg-success text-white';\r\n    if (this.storeStatus === 'Flagged') return 'status-badge status-flagged';\r\n    if (this.storeStatus === 'Yet to Assign') return 'status-badge status-yet-to-assign';\r\n    if (this.storeStatus === 'Completed') return 'badge bg-success text-white';\r\n    return 'status-badge';\r\n  }\r\n\r\n  constructor(private activeModal: NgbActiveModal) {}\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onConfirm() {\r\n    this.activeModal.close({\r\n      sendVerificationTask: this.sendVerificationTask,\r\n    });\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <h3 class=\"mb-4\">Set as Current Planogram</h3>\r\n\r\n  <p class=\"description-text\">\r\n    You're about to set an older revision\r\n    <strong>\"{{ revisionName }}\"</strong>\r\n    as the current planogram. This will replace the existing planogram and its\r\n    responses.\r\n  </p>\r\n\r\n  <div class=\"note-section mb-3\" *ngIf=\"storeStatus\">\r\n    <p class=\"mb-1 text-muted\"><strong>Note:</strong></p>\r\n    <p class=\"mb-0\">\r\n      This store is currently on\r\n      <span [class]=\"statusBadgeClass\">{{ storeStatus }}</span>\r\n      status.\r\n    </p>\r\n  </div>\r\n\r\n  <div class=\"verification-option mb-3\">\r\n    <label class=\"d-flex align-items-center gap-2\">\r\n      <input\r\n        type=\"checkbox\"\r\n        class=\"form-check-input\"\r\n        [(ngModel)]=\"sendVerificationTask\"\r\n      />\r\n      <span>Send fixture verification task</span>\r\n    </label>\r\n  </div>\r\n\r\n  <div class=\"modal-actions mt-4\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">\r\n      Cancel\r\n    </button>\r\n    <button type=\"button\" class=\"btn btn-primary px-4\" (click)=\"onConfirm()\">\r\n      Confirm\r\n    </button>\r\n  </div>\r\n</div>\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n  selector: 'app-edit-revision-name-modal',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './edit-revision-name-modal.component.html',\r\n  styleUrl: './edit-revision-name-modal.component.scss',\r\n})\r\nexport class EditRevisionNameModalComponent {\r\n  @Input() currentName = '';\r\n\r\n  constructor(private activeModal: NgbActiveModal) {}\r\n\r\n  onCancel() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onSave() {\r\n    if (this.currentName.trim()) {\r\n      this.activeModal.close({ name: this.currentName.trim() });\r\n    }\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <h3 class=\"mb-4\">Edit Revision Name</h3>\r\n\r\n  <div class=\"mb-3\">\r\n    <label class=\"form-label fw-semibold\">Revision name</label>\r\n    <input type=\"text\" class=\"form-control\" [(ngModel)]=\"currentName\" />\r\n  </div>\r\n\r\n  <div class=\"modal-actions mt-4\">\r\n    <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">\r\n      Cancel\r\n    </button>\r\n    <button\r\n      type=\"button\"\r\n      class=\"btn btn-primary px-4\"\r\n      [disabled]=\"!currentName.trim()\"\r\n      (click)=\"onSave()\"\r\n    >\r\n      Save\r\n    </button>\r\n  </div>\r\n</div>\r\n","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  inject,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { lastValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { NgbActiveOffcanvas, NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../interfaces/fixture-template.interface\";\r\nimport { SHELF_COLORS } from \"../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../functions/plano.function\";\r\nimport { PlanoDataService } from \"../../services/plano-data.service\";\r\nimport { NgFor, NgIf, NgStyle } from \"@angular/common\";\r\n\r\n@Component({\r\n  selector: \"lib-fixture-overview-panel\",\r\n  templateUrl: \"./fixture-overview-panel.component.html\",\r\n  styleUrl: \"./fixture-overview-panel.component.scss\",\r\n  standalone: true,\r\n  imports: [NgbTooltip, NgFor, NgIf, NgStyle],\r\n})\r\nexport class FixtureOverviewPanelComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  activeOffcanvas = inject(NgbActiveOffcanvas);\r\n  @Input() fixtureDetails: any;\r\n  @Input() totalFixtures: string[] = [];\r\n  @Input() floorData: any;\r\n\r\n  @Output() onClose = new EventEmitter<any>();\r\n  @Output() changeFixture = new EventEmitter<{\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n  }>();\r\n\r\n  @ViewChild(\"fixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n\r\n  fixtureTemplateDetails: any;\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n  fixtureImage: string;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      color: any;\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n  allFixtures: any = [];\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n    private dataService: PlanoDataService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        await this.getFixtureShelfDetails(this.fixtureDetails);\r\n      });\r\n\r\n    this.floorData?.layoutPolygon.forEach((poly: any) => {\r\n      this.allFixtures.push(...poly.fixtures);\r\n    });\r\n\r\n    this.allFixtures.push(...this.floorData?.centerFixture);\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    if (changes[\"fixtureDetails\"]?.currentValue) {\r\n      await this.getFixtureShelfDetails(changes[\"fixtureDetails\"].currentValue);\r\n\r\n      this.floorData?.layoutPolygon.forEach((poly: any) => {\r\n        this.allFixtures.push(...poly.fixtures);\r\n      });\r\n\r\n      this.allFixtures.push(...this.floorData?.centerFixture);\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 300);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  async getFixtureShelfDetails(data: any) {\r\n    this.isPageLoading = true;\r\n    let payload = {\r\n      ...(this.floorData?.revisionId\r\n        ? { revisionId: this.floorData?.revisionId }\r\n        : { floorId: data?.floorId, planoId: data?.planoId }),\r\n      fixtureId: data?._id,\r\n    };\r\n\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.storeBuilderService.getShelfDetails(payload),\r\n      );\r\n      if (res?.status === \"success\" && res?.data) {\r\n        this.fixtureTemplateDetails = {\r\n          ...res?.data,\r\n          shelfConfig: res?.data?.shelves ?? [],\r\n        };\r\n\r\n        this.fixtureTemplateDetails.shelfConfig =\r\n          this.fixtureTemplateDetails.shelfConfig.map((s: any) => {\r\n            if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n              s.distributedRows = this.distributeRoundRobin(\r\n                s.products,\r\n                s.trayRows,\r\n              );\r\n            }\r\n            return s;\r\n          });\r\n\r\n        this.fixtureTemplateDetails.actualShelves =\r\n          this.fixtureTemplateDetails?.shelfConfig?.filter(\r\n            (s: any) => s.shelfType != \"vmonly\",\r\n          );\r\n\r\n        this.fixtureImage = `${this.imgCDN}${this.fixtureTemplateDetails.fixtureImage}`;\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getFixtureShelfDetails [ERR]:\", error);\r\n    } finally {\r\n      console.log(\"test\");\r\n      this.isPageLoading = false;\r\n    }\r\n  }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 253;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid  ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) {\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                d.style.border = `1.4px solid  ${this.shelfColors[i].border}`;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (let i = 0; i < this.fixtureTemplateDetails?.shelfConfig.length; i++) {\r\n      const s = this.fixtureTemplateDetails?.shelfConfig[i];\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      // const hasImproperProduct =\r\n      //   (s?.products?.length ?? 0) === 0 ||\r\n      (s?.products ?? []).some((p: any) => p.status !== \"proper\");\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n            color: this.shelfColors[i],\r\n            // products: structuredClone(s?.products) ?? [],\r\n            // improper: hasImproperProduct,\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n        // if (hasImproperProduct) section.improper = true;\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  openZoneLevelProductModal(zoneData: any, level: string) {}\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n\r\n  async onChangeFixture(change: \"next\" | \"previous\") {\r\n    this.fixtureDetails = null;\r\n    let fixtId = this.fixtureTemplateDetails._id;\r\n    let indexToSelect = this.totalFixtures.findIndex(\r\n      (f: any) => f === this.fixtureTemplateDetails._id,\r\n    );\r\n\r\n    if (change === \"next\") {\r\n      if (indexToSelect == this.totalFixtures.length - 1) return;\r\n      indexToSelect++;\r\n    } else {\r\n      if (indexToSelect == 0) return;\r\n      indexToSelect--;\r\n    }\r\n    let fixtureId = this.totalFixtures[indexToSelect];\r\n\r\n    let fixtureData = this.allFixtures.find(\r\n      (ele: any) => ele._id.toString() == fixtureId,\r\n    );\r\n    if (!fixtureData) {\r\n      return;\r\n    }\r\n    this.fixtureDetails = fixtureData;\r\n    await this.getFixtureShelfDetails(this.fixtureDetails);\r\n    setTimeout(() => {\r\n      this.applyShelfColors();\r\n      this.handleVmPositionAndSize();\r\n    }, 300);\r\n    this.dataService.emit({\r\n      currentFixture: fixtId,\r\n      action: change,\r\n      revisionId: `${this.floorData.revisionId} - ${fixtureId}`,\r\n    });\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixture-product-details\" *ngIf=\"!isPageLoading\">\r\n    <div class=\"offcanvas-header d-flex w-100 justify-content-between p-3 align-items-center\"\r\n        (click)=\"activeOffcanvas.dismiss()\">\r\n        <h4 class=\"m-0\">Fixture details</h4>\r\n        <svg class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n    </div>\r\n    <hr>\r\n    <div class=\"offcanvas-body d-flex align-items-center gap-6 px-3\">\r\n\r\n        <svg (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n\r\n        <h3 class=\"m-0\">{{fixtureTemplateDetails?.header?.label}}</h3>\r\n\r\n        <h3 class=\"m-0 ms-auto\">{{totalFixtures.indexOf(fixtureTemplateDetails?._id) + 1}}/{{totalFixtures.length}}</h3>\r\n\r\n        <svg (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n\r\n    </div>\r\n    <div class=\"hero-block\">\r\n        <div class=\"row g-0 m-0 w-100\">\r\n            <div class=\"col px-4\">\r\n                <p>Fixture name:</p>\r\n                <p>Fixture type:</p>\r\n                <p>Size (Width):</p>\r\n                <p>Total shelves:</p>\r\n                <p>Total product capacity:</p>\r\n            </div>\r\n            <div class=\"col px-4\">\r\n                <p><b>{{fixtureTemplateDetails?.header?.label}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCategory}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}</b>\r\n                </p>\r\n                <p><b>{{fixtureTemplateDetails?.actualShelves?.length}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCapacity}}</b></p>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div class=\"px-4\">\r\n        <h5>Planogram design </h5>\r\n        <p>Fixture designed by the planogram team</p>\r\n    </div>\r\n    <section id=\"fixture-view\" #fixtureRoot>\r\n        <div id=\"vm-products-sum\" class=\"wall-viewport px-4\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n                    <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN + vm?.vmImageUrl\"\r\n                                    alt=\"Vm Image\" />\r\n\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder cursor-pointer\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                    <div id=\"brand-category\" class=\"brand-category\"\r\n                        *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"badge inactive mt-1\">\r\n                            Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container\r\n                                    *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container\r\n                                    *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n                            (click)=\"openZoneLevelProductModal(item,'section')\">\r\n                            <div class=\"d-flex\">\r\n                                <span class=\"badge me-1\"\r\n                                    [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n                                    {{ item.zone }}\r\n                                </span>\r\n                                <span class=\"badge inactive\">\r\n                                    Capacity {{ item?.section?.capacity }}\r\n                                </span>\r\n                            </div>\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\"\r\n                    *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <span class=\"badge inactive\">\r\n                                    Capacity {{item?.productPerShelf }}\r\n                                </span>\r\n\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                            <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            </div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\"\r\n                *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </section>\r\n\r\n\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport * as fabric from \"fabric\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { NgbOffcanvas } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { FixtureOverviewPanelComponent } from \"../../../fixture-overview-panel/fixture-overview-panel.component\";\r\nimport { PlanoDataService } from \"../../../../services/plano-data.service\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-comparison\",\r\n  templateUrl: \"./plano-comparison.component.html\",\r\n  styleUrl: \"./plano-comparison.component.scss\",\r\n  standalone: true,\r\n})\r\nexport class PlanoComparisonComponent\r\n  implements AfterViewInit, OnChanges, OnDestroy, OnInit\r\n{\r\n  @Input() floorData: any;\r\n  // @Input() vmList: VmLibraryList[] = [];\r\n  @Input() totalFixtures: string[] = [];\r\n\r\n  @ViewChild(\"latestCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n\r\n  @ViewChild(\"latestCanvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n  cdnUrl: string;\r\n\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n\r\n  fixturesList: string[] = [];\r\n  enableCompare: boolean = false;\r\n  nextFixture: any;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private offcanvas: NgbOffcanvas,\r\n    private dataService: PlanoDataService,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.nextFixture = this.dataService.nextFixture$.subscribe((data: any) => {\r\n      this.onChangeFixture(data);\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"floorData\"]?.currentValue) {\r\n      this.floorData = changes[\"floorData\"].currentValue;\r\n      this.fixturesList = [\r\n        ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n        ...this.floorData?.centerFixture,\r\n      ].map((f: any) => f._id);\r\n      if (this.floorData?.floorChange) {\r\n        this.onClickClose();\r\n        this.renderFloor();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 1000,\r\n      height: 500,\r\n    });\r\n    this.setupZoomHandlers();\r\n\r\n    if (this.floorData) {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async renderFloor() {\r\n    this.canvas?.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    if (container.clientWidth === 0 || container.clientHeight === 0) return;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          this.floorData.layoutPolygon[index].fixtures[j][\"revisionFixtureId\"] =\r\n            `${this.floorData.revisionId} - ${element.fixtures[j]._id}`;\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      this.floorData.centerFixture[i][\"revisionFixtureId\"] =\r\n        `${this.floorData.revisionId} - ${this.floorData.centerFixture[i]._id}`;\r\n      const fixture = this.floorData.centerFixture[i];\r\n\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n          L ${topX + topWidth - radius} ${topY} \r\n          Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n          L ${topX + topWidth} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + radius} \r\n          Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n      Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n        topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n      L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n      Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n        secondBoxY + innerBoxHeight - radius\r\n      } \r\n      L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n          L ${midX + midWidth - radius} ${firstBoxY} \r\n          Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n            firstBoxY + radius\r\n          } \r\n          L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + radius} \r\n          Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text = fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n          Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n            midX + midWidth - radius\r\n          } ${lastBoxY + boxHeight} \r\n          L ${midX + radius} ${lastBoxY + boxHeight} \r\n          Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n            lastBoxY + boxHeight - radius\r\n          } \r\n          L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        hasControls: false,\r\n        lockRotation: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n      revisionFixtureId: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      setTimeout(() => {\r\n        this.resizeCanvas();\r\n        this.fitCanvasToLayoutAnimated();\r\n      }, 300);\r\n      this.highlightFixture(target);\r\n      this.selectFixture(target);\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n    fixtureGroup.revisionFixtureId = fixtureData.revisionFixtureId;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  selectFixture(target: any, openPanel: boolean = true) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        taskType: target.taskType,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      }\r\n      if (openPanel) {\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n        const ref = this.offcanvas.open(FixtureOverviewPanelComponent, {\r\n          position: \"end\",\r\n          backdrop: true,\r\n          panelClass: \"custom-fixture-offcanvas\",\r\n        });\r\n        ref.componentInstance.fixtureDetails =\r\n          this.selectedFixture?.fixtureData;\r\n        ref.componentInstance.totalFixtures = this.fixturesList;\r\n        ref.componentInstance.floorData = this.floorData;\r\n        // ref.componentInstance.vmList = this.vmList;\r\n      }\r\n    }\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.floorData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n    if (this.activeHighlight) {\r\n      this.canvas.remove(this.activeHighlight);\r\n      this.activeHighlight = null;\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onChangeFixture({\r\n    currentFixture,\r\n    action,\r\n    revisionId,\r\n  }: {\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n    revisionId: string;\r\n  }) {\r\n    let indexToSelect = this.fixturesList.findIndex(\r\n      (f: any) => f === currentFixture,\r\n    );\r\n\r\n    if (action === \"next\") {\r\n      if (indexToSelect == this.fixturesList.length - 1) return;\r\n      indexToSelect++;\r\n    } else {\r\n      if (indexToSelect == 0) return;\r\n      indexToSelect--;\r\n    }\r\n\r\n    const fixtureIdToSelect = this.fixturesList[indexToSelect];\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj.objType === \"fixture\" &&\r\n          obj.revisionFixtureId === revisionId &&\r\n          fixtureIdToSelect,\r\n      ) as fabric.Group | undefined;\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture);\r\n    this.selectFixture(actionFixture, false);\r\n  }\r\n\r\n  onClickClose() {\r\n    this.selectedFixture = null;\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n    this.removeHighlight();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.nextFixture.unsubscribe();\r\n  }\r\n}\r\n","<section id=\"plano-comparison\">\r\n    <div class=\"col overflow-hidden position-relative overview-canvas\">\r\n        <div id=\"canvas-compare-card\" class=\"w-100 position-relative\" #latestCanvasContainer>\r\n            <canvas id=\"latest-canvas\" #latestCanvas style=\"border: 1px dashed #e1e1e1;border-radius:6px\"></canvas>\r\n        </div>\r\n    </div>\r\n</section>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { Subject, Subscription, takeUntil } from \"rxjs\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { SHELF_COLORS } from \"../../../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../../../functions/plano.function\";\r\n@Component({\r\n  selector: \"fixture-overview\",\r\n  templateUrl: \"./fixture-overview.component.html\",\r\n  styleUrl: \"./fixture-overview.component.scss\",\r\n})\r\nexport class FixtureOverviewComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixtureDetails: any;\r\n  @Input() totalFixtures: string[] = [];\r\n  @Input() revisionId: string;\r\n\r\n  @Output() onClose = new EventEmitter<any>();\r\n  @Output() changeFixture = new EventEmitter<{\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n  }>();\r\n\r\n  fixtureTemplateDetails: any;\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n\r\n  shelfColors = SHELF_COLORS;\r\n  fixtureImage: string;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      color: any;\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n  private fixtureSub?: Subscription;\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    if (changes[\"fixtureDetails\"]?.currentValue) {\r\n      await this.getFixtureShelfDetails(changes[\"fixtureDetails\"].currentValue);\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 300);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n  async getFixtureShelfDetails(data: any): Promise<void> {\r\n    // Cancel previous request\r\n    this.fixtureSub?.unsubscribe();\r\n\r\n    this.isPageLoading = true;\r\n\r\n    let payload = {\r\n      ...(this.revisionId\r\n        ? { revisionId: this.revisionId }\r\n        : { floorId: data?.floorId, planoId: data?.planoId }),\r\n      fixtureId: data?._id,\r\n    };\r\n\r\n    return new Promise((resolve, reject) => {\r\n      this.fixtureSub = this.storeBuilderService\r\n        .getShelfDetails(payload)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\" && res?.data) {\r\n              this.fixtureTemplateDetails = {\r\n                ...res.data,\r\n                shelfConfig: res.data?.shelves ?? [],\r\n              };\r\n\r\n              this.fixtureTemplateDetails.shelfConfig =\r\n                this.fixtureTemplateDetails.shelfConfig.map((s: any) => {\r\n                  if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n                    s.distributedRows = this.distributeRoundRobin(\r\n                      s.products,\r\n                      s.trayRows,\r\n                    );\r\n                  }\r\n                  return s;\r\n                });\r\n\r\n              this.fixtureTemplateDetails.actualShelves =\r\n                this.fixtureTemplateDetails?.shelfConfig?.filter(\r\n                  (s: any) => s.shelfType != \"vmonly\",\r\n                );\r\n\r\n              this.fixtureImage = `${this.imgCDN}${this.fixtureTemplateDetails.fixtureImage}`;\r\n            }\r\n\r\n            this.isPageLoading = false;\r\n            resolve();\r\n          },\r\n          error: (err) => {\r\n            this.isPageLoading = false;\r\n            console.error(\"@@ ~ getFixtureShelfDetails [ERR]:\", err);\r\n            reject(err);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    const header = document.getElementById(\"header-block\") as HTMLElement;\r\n    const footer = document.getElementById(\"footer-block\") as HTMLElement;\r\n\r\n    if (header && footer) {\r\n      header.style.width = `${bodyWidth}px`;\r\n      footer.style.width = `${bodyWidth}px`;\r\n    }\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block-sum\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 253;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid  ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) {\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                d.style.border = `1.4px solid  ${this.shelfColors[i].border}`;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (let i = 0; i < this.fixtureTemplateDetails?.shelfConfig.length; i++) {\r\n      const s = this.fixtureTemplateDetails?.shelfConfig[i];\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      // const hasImproperProduct =\r\n      //   (s?.products?.length ?? 0) === 0 ||\r\n      (s?.products ?? []).some((p: any) => p.status !== \"proper\");\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n            color: this.shelfColors[i],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  openZoneLevelProductModal(zoneData: any, level: string) {}\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n\r\n  onChangeFixture(change: \"next\" | \"previous\") {\r\n    this.changeFixture.emit({\r\n      currentFixture: this.fixtureTemplateDetails._id,\r\n      action: change,\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixture-product-details\" class=\"scale-down\" *ngIf=\"!isPageLoading\">\r\n    <div class=\"d-flex w-100 justify-content-between p-3 align-items-center\" (click)=\"onClickClose()\">\r\n        <h4 class=\"m-0\">Fixture details</h4>\r\n        <svg class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n    </div>\r\n    <hr>\r\n    <div class=\"d-flex align-items-center gap-6 mt-7 mt-5 px-3\">\r\n\r\n        <svg (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n\r\n        <h3 class=\"m-0\">{{fixtureTemplateDetails?.header?.label}}</h3>\r\n\r\n        <h3 class=\"m-0 ms-auto\">{{totalFixtures.indexOf(fixtureTemplateDetails?._id) + 1}}/{{totalFixtures.length}}</h3>\r\n\r\n        <svg (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n\r\n    </div>\r\n    <div class=\"hero-block\">\r\n        <div class=\"row g-0 m-0 w-100\">\r\n            <div class=\"col px-4\">\r\n                <p>Fixture name:</p>\r\n                <p>Fixture type:</p>\r\n                <p>Size (Width):</p>\r\n                <p>Total shelves:</p>\r\n                <p>Total product capacity:</p>\r\n            </div>\r\n            <div class=\"col px-4\">\r\n                <p><b>{{fixtureTemplateDetails?.header?.label}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCategory}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}</b>\r\n                </p>\r\n                <p><b>{{fixtureTemplateDetails?.actualShelves?.length}}</b></p>\r\n                <p><b>{{fixtureTemplateDetails?.fixtureCapacity}}</b></p>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div>\r\n        <h5>Planogram design </h5>\r\n        <p>Fixture designed by the planogram team</p>\r\n    </div>\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n        <!-- Header block -->\r\n        <div id=\"header-block\" class=\"header-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n            <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n        </div>\r\n\r\n        <!-- Body block -->\r\n        <div id=\"body-block-sum\" class=\"body-block\">\r\n            <!----------------------------------[VM BLOCK]--------------------------------------->\r\n            <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n                <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n                    <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                        <ng-container>\r\n                            <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN+vm?.vmImageUrl\"\r\n                                alt=\"Vm Image\" />\r\n                            <ng-template #placeholder>\r\n                                <div class=\"vm-placeholder\">\r\n                                    <h3>{{ vm?.vmName }}</h3>\r\n                                </div>\r\n                            </ng-template>\r\n                        </ng-container>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n\r\n            <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n                <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\">\r\n                        <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ b }}\r\n                            </span>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                        <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                            {{ c }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"badge inactive mt-1\">\r\n                        Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n                    </span>\r\n                </div>\r\n                <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                        <p>\r\n                            <b>Brands: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                        <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n                            <b>Categories: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                    </div>\r\n                </ng-template>\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                @for (item of sectionByZones; track $index) {\r\n                    <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n                        (click)=\"openZoneLevelProductModal(item,'section')\">\r\n                        <div class=\"d-flex\">\r\n                            <span class=\"badge me-1\"\r\n                                [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{ item?.section?.capacity }}\r\n                            </span>\r\n                        </div>\r\n                        <div class=\"w-100 d-flex justify-content-center\">\r\n                            <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                            <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                            <p *ngIf=\"item?.section?.categories?.length\">\r\n                                <b>Categories: </b>\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                }\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n                    <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                        <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"item.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{item?.productPerShelf }}\r\n                            </span>\r\n\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n                \r\n                @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                        <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        </div>\r\n                    </div>\r\n                }@else {\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                        [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                }\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Footer block -->\r\n        <div id=\"footer-block\" class=\"footer-block\"\r\n            *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n            <div class=\"sub-footer left-box\"></div>\r\n            <div class=\"sub-footer right-box\"></div>\r\n            <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n        </div>\r\n    </div>\r\n\r\n    <div>\r\n        <h5>Actual fixture image </h5>\r\n        <p>Captured from store</p>\r\n    </div>\r\n    @if(this.fixtureTemplateDetails?.fixtureImage){\r\n        <div class=\"fixture-image\">\r\n            <img [src]=\"fixtureImage\" alt=\"Actual Fixture Image\">\r\n        </div>\r\n    }@else {\r\n        <div class=\"text-center my-7\">\r\n            <svg width=\"186\" height=\"84\" viewBox=\"0 0 186 84\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path\r\n                    d=\"M130.256 15.3284C140.092 15.3284 148.065 23.302 148.065 33.1379C148.065 37.2176 150.826 41.8684 154.906 41.8684H167.972C177.807 41.8687 185.781 49.8422 185.781 59.678C185.781 69.5141 177.807 77.4885 167.971 77.4885H81.3662C69.7186 77.4883 58.6349 68.4084 46.9873 68.4084H5.93652C2.65782 68.4084 0 65.7506 0 62.4719C0.000127823 59.1933 2.6579 56.5354 5.93652 56.5354H61.8728C63.0069 56.5354 63.9669 55.6929 64.2897 54.6056C64.7994 52.8892 63.6267 50.9485 61.8361 50.9485H43.6514C33.8153 50.9485 25.8418 42.974 25.8418 33.1379C25.842 23.302 33.8154 15.3284 43.6514 15.3284H130.256Z\"\r\n                    fill=\"#EAECF0\" />\r\n                <path\r\n                    d=\"M126.664 27.335V48.65L120.959 43.75C118.229 41.405 113.819 41.405 111.089 43.75L96.5291 56.245C93.7991 58.59 89.3891 58.59 86.6591 56.245L85.4691 55.265C82.9841 53.095 79.0291 52.885 76.2291 54.775L59.0091 66.325L58.6241 66.605C57.3291 63.805 56.6641 60.48 56.6641 56.665V27.335C56.6641 14.595 64.2591 7 76.9991 7H106.329C119.069 7 126.664 14.595 126.664 27.335Z\"\r\n                    fill=\"#6BCAFF\" />\r\n                <path\r\n                    d=\"M81.164 36.3299C85.7645 36.3299 89.494 32.6005 89.494 27.9999C89.494 23.3994 85.7645 19.6699 81.164 19.6699C76.5635 19.6699 72.834 23.3994 72.834 27.9999C72.834 32.6005 76.5635 36.3299 81.164 36.3299Z\"\r\n                    fill=\"#00A3FF\" />\r\n                <path\r\n                    d=\"M126.665 48.65V56.665C126.665 69.405 119.07 77 106.33 77H77C68.075 77 61.635 73.255 58.625 66.605L59.01 66.325L76.23 54.775C79.03 52.885 82.985 53.095 85.47 55.265L86.66 56.245C89.39 58.59 93.8 58.59 96.53 56.245L111.09 43.75C113.82 41.405 118.23 41.405 120.96 43.75L126.665 48.65Z\"\r\n                    fill=\"#00A3FF\" />\r\n                <circle cx=\"138.064\" cy=\"28.3128\" r=\"4.40042\" fill=\"#6BCAFF\" />\r\n                <circle cx=\"47.8256\" cy=\"39.2409\" r=\"2.45255\" fill=\"#6BCAFF\" />\r\n                <ellipse cx=\"139.183\" cy=\"61.0072\" rx=\"4.29197\" ry=\"4.59854\" fill=\"#00A3FF\" />\r\n            </svg>\r\n        </div>\r\n\r\n    }\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport * as fabric from \"fabric\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { DatePipe, TitleCasePipe } from \"@angular/common\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { SetCurrentPlanoModalComponent } from \"../../popups/set-current-plano-modal/set-current-plano-modal.component\";\r\nimport { EditRevisionNameModalComponent } from \"../../popups/edit-revision-name-modal/edit-revision-name-modal.component\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"plano-overview\",\r\n  templateUrl: \"./plano-overview.component.html\",\r\n  styleUrl: \"./plano-overview.component.scss\",\r\n  providers: [TitleCasePipe, DatePipe],\r\n})\r\nexport class PlanoOverviewComponent\r\n  implements AfterViewInit, OnChanges, OnDestroy\r\n{\r\n  @Input() floorData: any;\r\n  @Output() currentRevisionInfo = new EventEmitter<{ totalFixtures: number; lastUpdated: string; publishedBy?: string; requiresRefetch?: boolean }>();\r\n  // @Input() vmList: VmLibraryList[] = [];\r\n\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  currentSelect: number;\r\n  previousSelect: number;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n  cdnUrl: string;\r\n  clientId: string;\r\n\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n\r\n  fixturesList: string[] = [];\r\n  enableCompare: boolean = false;\r\n  revisionPlanoList: any = [];\r\n  revisionSelectItems: any[] = [];\r\n  latestFloorData: any;\r\n  previousFloorData: any;\r\n  previousRenderKey: boolean = false;\r\n  latestRenderKey: boolean = false;\r\n  isPageLoading: boolean = false;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private datePipe: DatePipe,\r\n    private apiService: StoreBuilderService,\r\n    private cd: ChangeDetectorRef,\r\n    private modalService: NgbModal,\r\n    private toastService: ToastService,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n    this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe((data: any) => {\r\n      if (data) {\r\n        this.clientId = data.client;\r\n      } else {\r\n        const saved = JSON.parse(localStorage.getItem(\"header-filters\") as string);\r\n        this.clientId = saved?.client;\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"floorData\"]?.currentValue) {\r\n      this.floorData = changes[\"floorData\"].currentValue;\r\n\r\n      this.fixturesList = [\r\n        ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n        ...this.floorData?.centerFixture,\r\n      ].map((f: any) => f._id);\r\n\r\n      if (this.floorData?.floorChange) {\r\n        this.enableCompare = false;\r\n        this.onClickClose();\r\n        this.renderFloor();\r\n      } else if (!this.enableCompare) {\r\n        this.renderFloor();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 1000,\r\n      height: 700,\r\n    });\r\n    this.setupZoomHandlers();\r\n\r\n    if (this.floorData) {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async renderFloor() {\r\n    if (!this.canvas) return;\r\n    this.canvas.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    if (container.clientWidth === 0 || container.clientHeight === 0) return;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n      height: container.clientHeight - 80,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text = fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        hasControls: false,\r\n        lockRotation: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      setTimeout(() => {\r\n        this.resizeCanvas();\r\n        this.fitCanvasToLayoutAnimated();\r\n      }, 300);\r\n      this.highlightFixture(target);\r\n      this.selectFixture(target);\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  selectFixture(target: any) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        taskType: target.taskType,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      }\r\n\r\n      this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n    }\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.floorData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n    if (this.activeHighlight) {\r\n      this.canvas.remove(this.activeHighlight);\r\n      this.activeHighlight = null;\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onChangeFixture({\r\n    currentFixture,\r\n    action,\r\n  }: {\r\n    currentFixture: string;\r\n    action: \"next\" | \"previous\";\r\n  }) {\r\n    let indexToSelect = this.fixturesList.findIndex(\r\n      (f: any) => f === currentFixture,\r\n    );\r\n\r\n    if (action === \"next\") {\r\n      if (indexToSelect == this.fixturesList.length - 1) return;\r\n      indexToSelect++;\r\n    } else {\r\n      if (indexToSelect == 0) return;\r\n      indexToSelect--;\r\n    }\r\n\r\n    const fixtureIdToSelect = this.fixturesList[indexToSelect];\r\n\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj.objType === \"fixture\" && obj.fixtureId === fixtureIdToSelect,\r\n      ) as fabric.Group | undefined;\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture);\r\n    this.selectFixture(actionFixture);\r\n  }\r\n\r\n  onClickClose() {\r\n    this.selectedFixture = null;\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n    this.removeHighlight();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  getRevisionDetails(event: any) {\r\n    if (event.target.checked) {\r\n      this.isPageLoading = true;\r\n      this.apiService\r\n        .getRevisionList({\r\n          storeId: this.floorData.storeId,\r\n          planoId: this.floorData.planoId,\r\n          floorId: this.floorData._id,\r\n        })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res && res.code == 200) {\r\n              this.isPageLoading = false;\r\n              this.revisionPlanoList = res.data;\r\n              this.buildRevisionSelectItems();\r\n              const activeIndex = this.revisionPlanoList.findIndex((r: any) => r.isActive);\r\n              this.currentSelect = activeIndex >= 0 ? activeIndex : this.revisionPlanoList.length - 1;\r\n              this.previousSelect = this.currentSelect > 0\r\n                ? this.currentSelect - 1\r\n                : Math.min(1, this.revisionPlanoList.length - 1);\r\n              this.latestFloorData = res.data[this.currentSelect]?.floorData;\r\n              if (this.latestFloorData) {\r\n                this.latestFloorData[\"revisionId\"] =\r\n                  res.data?.[this.currentSelect]?._id ?? \"\";\r\n                this.latestFloorData[\"createdAt\"] =\r\n                  res.data?.[this.currentSelect]?.createdAt ?? \"\";\r\n                this.latestFloorData[\"createdByName\"] =\r\n                  res.data?.[this.currentSelect]?.createdByName ?? \"\";\r\n              }\r\n              this.previousFloorData = res.data[this.previousSelect]?.floorData;\r\n              if (this.previousFloorData) {\r\n                this.previousFloorData[\"revisionId\"] =\r\n                  res.data?.[this.previousSelect]?._id ?? \"\";\r\n                this.previousFloorData[\"createdAt\"] =\r\n                  res.data?.[this.previousSelect]?.createdAt ?? \"\";\r\n                this.previousFloorData[\"createdByName\"] =\r\n                  res.data?.[this.previousSelect]?.createdByName ?? \"\";\r\n              }\r\n              this.previousRenderKey = true;\r\n              this.latestRenderKey = true;\r\n              this.emitCurrentRevisionInfo();\r\n            }\r\n          },\r\n        });\r\n    } else {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  buildRevisionSelectItems() {\r\n    this.revisionSelectItems = this.revisionPlanoList.map((r: any, i: number) => ({\r\n      _index: i,\r\n      displayName: r.name || (this.updateIndex(i + 1) + ' Revision'),\r\n    }));\r\n  }\r\n\r\n  private emitCurrentRevisionInfo(requiresRefetch = false): void {\r\n    const active = this.revisionPlanoList.find((r: any) => r.isActive)\r\n      ?? this.revisionPlanoList[this.revisionPlanoList.length - 1];\r\n    if (!active) return;\r\n    const allFixtures = [\r\n      ...(active.floorData?.layoutPolygon?.flatMap((e: any) => e.fixtures) ?? []),\r\n      ...(active.floorData?.centerFixture ?? []),\r\n    ];\r\n    this.currentRevisionInfo.emit({\r\n      totalFixtures: allFixtures.length,\r\n      lastUpdated: active.createdAt ?? active.floorData?.lastUpdate ?? '',\r\n      publishedBy: active.createdByName ?? '',\r\n      requiresRefetch,\r\n    });\r\n  }\r\n\r\n  onRevisionChange(index: number, type: string) {\r\n    const revision = this.revisionPlanoList[index];\r\n    if (!revision) return;\r\n    if (type === 'previous') {\r\n      this.previousRenderKey = false;\r\n      this.previousFloorData = revision.floorData;\r\n      this.previousFloorData.revisionId = revision._id;\r\n      this.previousFloorData.createdAt = revision.createdAt;\r\n      this.previousFloorData.createdByName = revision.createdByName;\r\n      this.previousRenderKey = true;\r\n      this.previousFloorData.floorChange = true;\r\n    } else {\r\n      this.latestRenderKey = false;\r\n      this.latestFloorData = revision.floorData;\r\n      this.latestFloorData.revisionId = revision._id;\r\n      this.latestFloorData.createdAt = revision.createdAt;\r\n      this.latestFloorData.createdByName = revision.createdByName;\r\n      this.latestRenderKey = true;\r\n      this.latestFloorData.floorChange = true;\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  loadPlano(event: any, type: string) {\r\n    this.isPageLoading = true;\r\n    if (type == \"previous\") {\r\n      this.previousRenderKey = false;\r\n      this.previousFloorData =\r\n        this.revisionPlanoList[event.target.value]?.floorData;\r\n      this.previousFloorData.revisionId =\r\n        this.revisionPlanoList[event.target.value]?._id;\r\n      this.previousFloorData.createdAt =\r\n        this.revisionPlanoList[event.target.value]?.createdAt;\r\n      this.previousRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.previousFloorData.floorChange = true;\r\n    } else {\r\n      this.latestRenderKey = false;\r\n      this.latestFloorData =\r\n        this.revisionPlanoList[event.target.value]?.floorData;\r\n      this.latestFloorData.revisionId =\r\n        this.revisionPlanoList[event.target.value]?._id;\r\n      this.latestFloorData.createdAt =\r\n        this.revisionPlanoList[event.target.value]?.createdAt;\r\n      this.latestRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.latestFloorData.floorChange = true;\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateIndex(index: number): string {\r\n    if (index.toString().endsWith(\"1\")) {\r\n      return index + \"st\";\r\n    } else if (index.toString().endsWith(\"2\")) {\r\n      return index + \"nd\";\r\n    } else if (index.toString().endsWith(\"3\")) {\r\n      return index + \"rd\";\r\n    } else {\r\n      return index + \"th\";\r\n    }\r\n  }\r\n\r\n  // Mirrors verification-table getStatus(data) so the popup reflects the same\r\n  // status the user sees on the Manage Planogram → Verification table row.\r\n  // Source: manage-plano/verification-table/verification-table.component.ts\r\n  private computeTableStatusLabel(data: any): string {\r\n    const pendingTask = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele?.status !== 'submit',\r\n    );\r\n\r\n    if (\r\n      !pendingTask &&\r\n      data?.taskDetails?.fixtureStatus === 'complete' &&\r\n      data?.taskDetails?.layoutStatus === 'complete'\r\n    ) {\r\n      return data?.layoutStatus?.includes(false) ? 'Ready to Publish' : 'Published';\r\n    }\r\n\r\n    if (this.showBreachForRow(data, 'fixture')) return 'Yet to Assign';\r\n    return this.getTaskTooltipForRow(data, 'fixture') || '';\r\n  }\r\n\r\n  private showBreachForRow(data: any, type: string): boolean {\r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type === type,\r\n    );\r\n    return !!(taskDetails && taskDetails?.status !== 'submit' && taskDetails?.breach);\r\n  }\r\n\r\n  private getTaskTooltipForRow(data: any, type: string): string {\r\n    const statusMap: any = {\r\n      layout: data?.taskDetails?.layoutStatus,\r\n      fixture: data?.taskDetails?.fixtureStatus,\r\n      vm: data?.taskDetails?.fixtureStatus,\r\n    };\r\n    if (type === 'vm') type = 'fixture';\r\n\r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type === type,\r\n    );\r\n    const status = statusMap[type];\r\n\r\n    if (type === 'fixture') {\r\n      const taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n        (ele: any) => ele.status && ele.type === 'fixture',\r\n      );\r\n      if (status === 'pending' && taskInfo?.some((task: any) => task.status === 'submit')) return 'Review Pending';\r\n      if (taskInfo?.length !== data?.layoutCount) return 'Yet to Assign';\r\n      if (taskInfo?.some((task: any) => this.isFutureTaskDate(task?.date))) return 'Task Scheduled';\r\n      if (taskInfo?.some((task: any) => ['open', 'inprogress'].includes(task?.status))) return 'Task Assigned';\r\n    }\r\n\r\n    if (!taskDetails || (taskDetails.status === 'submit' && status === 'disagree')) return 'Yet to Assign';\r\n    if (taskDetails.status !== 'submit') return 'Task Assigned';\r\n    if (status === 'complete') return 'Completed';\r\n    return '';\r\n  }\r\n\r\n  private isFutureTaskDate(dateValue: string): boolean {\r\n    if (!dateValue) return false;\r\n    const taskDate = new Date(dateValue);\r\n    if (isNaN(taskDate.getTime())) return false;\r\n    const today = new Date();\r\n    today.setHours(0, 0, 0, 0);\r\n    taskDate.setHours(0, 0, 0, 0);\r\n    return taskDate.getTime() > today.getTime();\r\n  }\r\n\r\n  openSetCurrentModal(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision) return;\r\n\r\n    const payload = {\r\n      clientId: this.clientId,\r\n      limit: 50,\r\n      offset: 1,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      filter: { country: [], city: [], layout: [], fixture: [], taskPending: 'all', status: [] },\r\n      searchValue: this.floorData?.storeName || '',\r\n    };\r\n\r\n    this.apiService\r\n      .getPlanoList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          let statusLabel = '';\r\n          if (res?.code === 200) {\r\n            const matchingRow = res?.data?.data?.find(\r\n              (r: any) => r._id === this.floorData.planoId,\r\n            );\r\n            if (matchingRow) {\r\n              statusLabel = this.computeTableStatusLabel(matchingRow);\r\n            }\r\n          }\r\n          this.doOpenSetCurrentModal(revision, revisionIndex, statusLabel);\r\n        },\r\n        error: () => this.doOpenSetCurrentModal(revision, revisionIndex, ''),\r\n      });\r\n  }\r\n\r\n  private doOpenSetCurrentModal(revision: any, revisionIndex: number, statusLabel: string) {\r\n    const modalRef = this.modalService.open(SetCurrentPlanoModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      backdrop: \"static\",\r\n    });\r\n    modalRef.componentInstance.revisionName =\r\n      revision.name || this.updateIndex(revisionIndex + 1) + \" Revision\";\r\n    modalRef.componentInstance.revisionIndex = revisionIndex + 1;\r\n    modalRef.componentInstance.publishedDate =\r\n      revision.createdAt || revision.floorData?.lastUpdate || \"\";\r\n    modalRef.componentInstance.storeStatus = statusLabel;\r\n\r\n    modalRef.result.then(\r\n      (res: any) => {\r\n        if (res) {\r\n          this.apiService\r\n            .setActiveRevision({\r\n              revisionId: revision._id,\r\n              planoId: this.floorData.planoId,\r\n              floorId: this.floorData._id,\r\n              sendVerificationTask: res.sendVerificationTask,\r\n            })\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe({\r\n              next: (apiRes: any) => {\r\n                if (apiRes && apiRes.code == 200) {\r\n                  this.revisionPlanoList.forEach((r: any) => {\r\n                    r.isActive = false;\r\n                    if (r.name === \"Current Plano\") r.name = \"\";\r\n                    r.isStaging = false;\r\n                  });\r\n                  revision.isActive = true;\r\n                  revision.name = \"Current Plano\";\r\n                  revision.isStaging = false;\r\n                  this.emitCurrentRevisionInfo(true);\r\n                  this.floorData.verificationStatus = true;\r\n                  this.toastService.getSuccessToast(\r\n                    apiRes?.message || \"Revision set as current planogram\",\r\n                  );\r\n                  this.cd.detectChanges();\r\n                }\r\n              },\r\n              error: () => {\r\n                this.toastService.getErrorToast(\r\n                  \"Failed to set revision as current\",\r\n                );\r\n              },\r\n            });\r\n        }\r\n      },\r\n      () => {},\r\n    );\r\n  }\r\n\r\n  toggleStagingFlag(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision || revision.isActive) return;\r\n\r\n    const newValue = !revision.isStaging;\r\n    this.apiService\r\n      .setStagingFlag({ revisionId: revision._id, isStaging: newValue })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            revision.isStaging = newValue;\r\n            this.toastService.getSuccessToast(\r\n              res?.message || (newValue ? \"Marked for staging\" : \"Unmarked from staging\"),\r\n            );\r\n            this.cd.detectChanges();\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to update staging flag\");\r\n        },\r\n      });\r\n  }\r\n\r\n  openEditNameModal(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision) return;\r\n\r\n    const modalRef = this.modalService.open(EditRevisionNameModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      backdrop: \"static\",\r\n    });\r\n    modalRef.componentInstance.currentName =\r\n      revision.name || this.updateIndex(revisionIndex + 1) + \" Revision\";\r\n\r\n    modalRef.result.then(\r\n      (res: any) => {\r\n        if (res) {\r\n          this.apiService\r\n            .updateRevisionName({\r\n              revisionId: revision._id,\r\n              name: res.name,\r\n            })\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe({\r\n              next: (apiRes: any) => {\r\n                if (apiRes && apiRes.code == 200) {\r\n                  revision.name = res.name;\r\n                  this.buildRevisionSelectItems();\r\n                  this.toastService.getSuccessToast(\r\n                    apiRes?.message || \"Revision name updated\",\r\n                  );\r\n                  this.cd.detectChanges();\r\n                }\r\n              },\r\n              error: () => {\r\n                this.toastService.getErrorToast(\r\n                  \"Failed to update revision name\",\r\n                );\r\n              },\r\n            });\r\n        }\r\n      },\r\n      () => {},\r\n    );\r\n  }\r\n}\r\n","<section id=\"plano-overview\">\r\n    <div>\r\n        <div class=\"row\" *ngIf=\"isPageLoading && !enableCompare\">\r\n            <div class=\"col-12 m-0\">\r\n                <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n            </div>\r\n        </div>\r\n        <div id=\"body\" class=\"row\" [class.d-none]=\"enableCompare\">\r\n            <div class=\"col overflow-hidden position-relative overview-canvas\">\r\n                <div id=\"canvas-card\" class=\"w-100 position-relative\" #canvasContainer>\r\n                    <div class=\"d-flex\">\r\n                        <div class=\"form-check form-switch\" style=\"top: 24px; right: 94px\">\r\n                            <input class=\"form-check-input\" type=\"checkbox\" id=\"planoCompare\"\r\n                                [(ngModel)]=\"enableCompare\" (click)=\"getRevisionDetails($event)\">\r\n                            <label class=\"form-check-label ms-2 compareLabel\" for=\"planoCompare\">Compare Planogram\r\n                            </label>\r\n                        </div>\r\n                        <div>\r\n                            <!-- Rotate Button -->\r\n                            <button style=\"top: 24px; right: 94px\" type=\"button\"\r\n                                class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n                                (click)=\"rotateCanvas(canvas,90)\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                                        fill=\"#1D2939\" />\r\n                                    <path\r\n                                        d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                                        stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </button>\r\n\r\n                            <!-- Download Button -->\r\n                            <button style=\"top: 24px; right: 26px\" type=\"button\"\r\n                                class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n                                (click)=\"downloadCanvas()\">\r\n                                <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\"\r\n                                    stroke-width=\"0.24000000000000005\">\r\n                                    <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                                    <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n                                        stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n                                    <g id=\"SVGRepo_iconCarrier\">\r\n                                        <path\r\n                                            d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                                            fill=\"#1D2939\"></path>\r\n                                        <path\r\n                                            d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                                            fill=\"#1D2939\"></path>\r\n                                    </g>\r\n                                </svg>\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                    <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n                </div>\r\n                <div class=\"active-revision-info\" *ngIf=\"floorData?.revisionName\">\r\n                    {{ floorData.revisionName }}\r\n                    <span class=\"text-muted ms-2\" *ngIf=\"floorData?.createdAt\"\r\n                        [ngbTooltip]=\"floorData?.createdByName ? 'Published by ' + floorData.createdByName : null\">\r\n                        Published at: {{ floorData.createdAt | date:\"d MMM yyyy, hh:mm a\" }}\r\n                    </span>\r\n                </div>\r\n            </div>\r\n\r\n            <div [ngClass]=\"{'d-none':!selectedFixture?.fixtureData}\"\r\n                class=\"col bg-white rounded p-3 fixture-overview card\">\r\n                <fixture-overview [fixtureDetails]=\"selectedFixture?.fixtureData\" (onClose)=\"onClickClose()\"\r\n                    [totalFixtures]=\"fixturesList\" (changeFixture)=\"onChangeFixture($event)\"\r\n                    [revisionId]=\"floorData?.revisionId\"></fixture-overview>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n\r\n    <div *ngIf=\"enableCompare\" class=\"card\">\r\n\r\n        <div class=\"row\">\r\n            <div class=\"form-check form-switch\" style=\"margin-top:21px;\">\r\n                <input class=\"form-check-input\" style=\"margin-left:-1%\" type=\"checkbox\" id=\"planoCompare\"\r\n                    [(ngModel)]=\"enableCompare\" (click)=\"getRevisionDetails($event)\">\r\n                <label class=\"form-check-label ms-2 compareLabel\" for=\"planoCompare\">Compare Planogram </label>\r\n            </div>\r\n            <div *ngIf=\"isPageLoading\" class=\"row\">\r\n                <div class=\"col-12 m-0\">\r\n                    <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n                </div>\r\n                <div class=\"col-12\">\r\n                    <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n                </div>\r\n            </div>\r\n            <div class=\"row h-100\" [hidden]=\"isPageLoading\">\r\n                <div class=\"col-md-6\">\r\n                    <div class=\"d-flex align-items-center revision-header\" *ngIf=\"previousFloorData\"\r\n                        style=\"margin-top: 3%;margin-left: 3%;margin-right: 3%\">\r\n                        <lib-reactive-select\r\n                            class=\"revision-select\"\r\n                            [idField]=\"'_index'\"\r\n                            [nameField]=\"'displayName'\"\r\n                            [data]=\"revisionSelectItems\"\r\n                            [(ngModel)]=\"previousSelect\"\r\n                            (ngModelChange)=\"onRevisionChange($event, 'previous')\">\r\n                        </lib-reactive-select>\r\n                        <span class=\"current-plano-badge ms-2\" *ngIf=\"revisionPlanoList[previousSelect]?.isActive\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#0086c9\"/>\r\n                                <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            Current plano\r\n                        </span>\r\n                        <span class=\"staging-badge ms-2\" *ngIf=\"revisionPlanoList[previousSelect]?.isStaging && !revisionPlanoList[previousSelect]?.isActive\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#667085\"/>\r\n                                <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            Staging\r\n                        </span>\r\n                        <div class=\"kebab-menu ms-auto\" ngbDropdown placement=\"bottom-end\">\r\n                            <button class=\"btn btn-link kebab-btn\" ngbDropdownToggle>\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <circle cx=\"10\" cy=\"4\" r=\"2\" fill=\"#344054\"/>\r\n                                    <circle cx=\"10\" cy=\"10\" r=\"2\" fill=\"#344054\"/>\r\n                                    <circle cx=\"10\" cy=\"16\" r=\"2\" fill=\"#344054\"/>\r\n                                </svg>\r\n                            </button>\r\n                            <div ngbDropdownMenu>\r\n                                <button ngbDropdownItem (click)=\"openSetCurrentModal(previousSelect)\" [disabled]=\"revisionPlanoList[previousSelect]?.isActive\">Set as Current Plano</button>\r\n                                <button ngbDropdownItem (click)=\"openEditNameModal(previousSelect)\">Edit revision name</button>\r\n                                <div class=\"dropdown-item form-check staging-check\"\r\n                                     [class.disabled]=\"revisionPlanoList[previousSelect]?.isActive\"\r\n                                     (click)=\"!revisionPlanoList[previousSelect]?.isActive && toggleStagingFlag(previousSelect)\">\r\n                                    <input type=\"checkbox\" class=\"form-check-input\" id=\"stagingCheckPrev\"\r\n                                           [checked]=\"revisionPlanoList[previousSelect]?.isStaging\"\r\n                                           [disabled]=\"revisionPlanoList[previousSelect]?.isActive\"\r\n                                           (click)=\"$event.preventDefault()\">\r\n                                    <label class=\"form-check-label\" for=\"stagingCheckPrev\">Mark for staging</label>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                    <lib-plano-comparison [floorData]=\"previousFloorData\" [totalFixtures]=\"fixturesList\"\r\n                        *ngIf=\"previousRenderKey && previousFloorData\"></lib-plano-comparison>\r\n                    <div class=\"published-text\" *ngIf=\"previousFloorData\">\r\n                        Published at: {{ previousFloorData?.createdAt | date:\"d MMM yyyy, hh:mm a\" }}<span *ngIf=\"previousFloorData?.createdByName\"> by {{ previousFloorData.createdByName }}</span>\r\n                    </div>\r\n                    <div *ngIf=\"!previousFloorData\" class=\"noDataContent\">\r\n                        <div>\r\n                            <div class=\"text-center\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"315\" height=\"155\" viewBox=\"0 0 315 155\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M103.809 47.0198C89.5458 47.02 77.983 58.5826 77.9829 72.8459C77.9829 78.7619 73.9798 85.5061 68.0638 85.5061H45.2583C30.9948 85.5061 19.4312 97.0688 19.4312 111.332C19.4312 125.596 30.9948 137.158 45.2583 137.158H183.357C200.247 137.158 216.32 123.992 233.21 123.992H299.245C303.999 123.992 307.853 120.138 307.853 115.383C307.853 110.629 303.999 106.775 299.245 106.775H211.624C209.98 106.775 208.588 105.553 208.12 103.976C207.381 101.487 209.082 98.6721 211.678 98.6721H241.909C256.172 98.6719 267.735 87.1093 267.735 72.8459C267.735 58.5827 256.172 47.02 241.909 47.0198H103.809Z\"\r\n                                        fill=\"#EAECF0\" />\r\n                                    <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\"\r\n                                        transform=\"matrix(-1 0 0 1 246.602 48.8572)\" fill=\"#EAECF0\" />\r\n                                    <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\"\r\n                                        transform=\"matrix(-1 0 0 1 56.2979 113.282)\" fill=\"#6BCAFF\" />\r\n                                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\"\r\n                                        transform=\"matrix(-1 0 0 1 244.965 68.8262)\" fill=\"#00A3FF\" />\r\n                                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\"\r\n                                        transform=\"matrix(-1 0 0 1 215.689 13.5271)\" fill=\"#00A3FF\" />\r\n                                    <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\"\r\n                                        transform=\"matrix(-1 0 0 1 104.006 138.221)\" fill=\"#00A3FF\" />\r\n                                    <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\"\r\n                                        fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3\" />\r\n                                    <mask id=\"path-8-inside-1_419_28888\" fill=\"white\">\r\n                                        <path\r\n                                            d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" />\r\n                                    </mask>\r\n                                    <path\r\n                                        d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"\r\n                                        fill=\"#6BCAFF\" />\r\n                                    <path\r\n                                        d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\"\r\n                                        fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_419_28888)\" />\r\n                                    <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\"\r\n                                        stroke-width=\"3.98436\" stroke-linecap=\"round\" />\r\n                                    <circle cx=\"218.205\" cy=\"70.1763\" r=\"3.29663\" fill=\"white\" />\r\n                                    <circle cx=\"111.787\" cy=\"55.1663\" r=\"2.52637\" fill=\"#99DAFF\" />\r\n                                    <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\" />\r\n                                    <path\r\n                                        d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.931 123.894 194.055 127.161 191.5 128.636C188.945 130.111 185.679 129.236 184.204 126.681L164.465 92.4932C149.446 98.6552 131.813 92.92 123.471 78.4717C114.374 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.098 38.6209 151.481 34.7041 140.05 41.3037C128.62 47.9035 124.703 62.5204 131.302 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.38 76.0987 179.297 61.4826 172.698 50.0518Z\"\r\n                                        fill=\"white\" />\r\n                                    <circle cx=\"153\" cy=\"57.0007\" r=\"23.8994\" transform=\"rotate(-30 153 57.0007)\"\r\n                                        fill=\"#99DAFF\" />\r\n                                    <mask id=\"path-16-inside-2_419_28888\" fill=\"white\">\r\n                                        <path\r\n                                            d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\" />\r\n                                    </mask>\r\n                                    <path\r\n                                        d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\"\r\n                                        stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_419_28888)\" />\r\n                                    <path\r\n                                        d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.931 118.894 195.055 122.161 192.5 123.636C189.945 125.111 186.679 124.236 185.204 121.681L165.465 87.4932C150.446 93.6552 132.813 87.92 124.471 73.4717C115.374 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.098 33.6209 152.481 29.7041 141.05 36.3037C129.62 42.9035 125.703 57.5204 132.302 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.38 71.0987 180.297 56.4826 173.698 45.0518Z\"\r\n                                        fill=\"#00A3FF\" />\r\n                                </svg>\r\n                            </div>\r\n                            <div class=\"mainText text-center\">\r\n                                No Previous Revisions\r\n                            </div>\r\n                            <div class=\"subText\">\r\n                                There is no previous revisions available for this planogram\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"col-md-6\">\r\n                    <div class=\"d-flex align-items-center revision-header\"\r\n                        *ngIf=\"latestFloorData\"\r\n                        style=\"margin-top: 3%;margin-left: 3%;margin-right: 3%\">\r\n                        <lib-reactive-select\r\n                            class=\"revision-select\"\r\n                            [idField]=\"'_index'\"\r\n                            [nameField]=\"'displayName'\"\r\n                            [data]=\"revisionSelectItems\"\r\n                            [(ngModel)]=\"currentSelect\"\r\n                            (ngModelChange)=\"onRevisionChange($event, 'latest')\">\r\n                        </lib-reactive-select>\r\n                        <span class=\"current-plano-badge ms-2\" *ngIf=\"revisionPlanoList[currentSelect]?.isActive\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#0086c9\"/>\r\n                                <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            Current plano\r\n                        </span>\r\n                        <span class=\"staging-badge ms-2\" *ngIf=\"revisionPlanoList[currentSelect]?.isStaging && !revisionPlanoList[currentSelect]?.isActive\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                                <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#667085\"/>\r\n                                <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            Staging\r\n                        </span>\r\n                        <div class=\"kebab-menu ms-auto\" ngbDropdown placement=\"bottom-end\">\r\n                            <button class=\"btn btn-link kebab-btn\" ngbDropdownToggle>\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                                    <circle cx=\"10\" cy=\"4\" r=\"2\" fill=\"#344054\"/>\r\n                                    <circle cx=\"10\" cy=\"10\" r=\"2\" fill=\"#344054\"/>\r\n                                    <circle cx=\"10\" cy=\"16\" r=\"2\" fill=\"#344054\"/>\r\n                                </svg>\r\n                            </button>\r\n                            <div ngbDropdownMenu>\r\n                                <button ngbDropdownItem (click)=\"openSetCurrentModal(currentSelect)\" [disabled]=\"revisionPlanoList[currentSelect]?.isActive\">Set as Current Plano</button>\r\n                                <button ngbDropdownItem (click)=\"openEditNameModal(currentSelect)\">Edit revision name</button>\r\n                                <div class=\"dropdown-item form-check staging-check\"\r\n                                     [class.disabled]=\"revisionPlanoList[currentSelect]?.isActive\"\r\n                                     (click)=\"!revisionPlanoList[currentSelect]?.isActive && toggleStagingFlag(currentSelect)\">\r\n                                    <input type=\"checkbox\" class=\"form-check-input\" id=\"stagingCheckCurr\"\r\n                                           [checked]=\"revisionPlanoList[currentSelect]?.isStaging\"\r\n                                           [disabled]=\"revisionPlanoList[currentSelect]?.isActive\"\r\n                                           (click)=\"$event.preventDefault()\">\r\n                                    <label class=\"form-check-label\" for=\"stagingCheckCurr\">Mark for staging</label>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                    <lib-plano-comparison [floorData]=\"latestFloorData\" [totalFixtures]=\"fixturesList\"\r\n                        *ngIf=\"latestRenderKey && latestFloorData\"></lib-plano-comparison>\r\n                    <div class=\"published-text\" *ngIf=\"latestFloorData\">\r\n                        Published at: {{ latestFloorData?.createdAt | date:\"d MMM yyyy, hh:mm a\" }}<span *ngIf=\"latestFloorData?.createdByName\"> by {{ latestFloorData.createdByName }}</span>\r\n                    </div>\r\n                    <div *ngIf=\"!latestFloorData\" class=\"noDataContent\">\r\n                        <div>\r\n                            <div class=\"text-center\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"315\" height=\"155\" viewBox=\"0 0 315 155\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                        d=\"M103.809 47.0198C89.5458 47.02 77.983 58.5826 77.9829 72.8459C77.9829 78.7619 73.9798 85.5061 68.0638 85.5061H45.2583C30.9948 85.5061 19.4312 97.0688 19.4312 111.332C19.4312 125.596 30.9948 137.158 45.2583 137.158H183.357C200.247 137.158 216.32 123.992 233.21 123.992H299.245C303.999 123.992 307.853 120.138 307.853 115.383C307.853 110.629 303.999 106.775 299.245 106.775H211.624C209.98 106.775 208.588 105.553 208.12 103.976C207.381 101.487 209.082 98.6721 211.678 98.6721H241.909C256.172 98.6719 267.735 87.1093 267.735 72.8459C267.735 58.5827 256.172 47.02 241.909 47.0198H103.809Z\"\r\n                                        fill=\"#EAECF0\" />\r\n                                    <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\"\r\n                                        transform=\"matrix(-1 0 0 1 246.602 48.8572)\" fill=\"#EAECF0\" />\r\n                                    <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\"\r\n                                        transform=\"matrix(-1 0 0 1 56.2979 113.282)\" fill=\"#6BCAFF\" />\r\n                                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\"\r\n                                        transform=\"matrix(-1 0 0 1 244.965 68.8262)\" fill=\"#00A3FF\" />\r\n                                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\"\r\n                                        transform=\"matrix(-1 0 0 1 215.689 13.5271)\" fill=\"#00A3FF\" />\r\n                                    <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\"\r\n                                        transform=\"matrix(-1 0 0 1 104.006 138.221)\" fill=\"#00A3FF\" />\r\n                                    <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\"\r\n                                        fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3\" />\r\n                                    <mask id=\"path-8-inside-1_419_28888\" fill=\"white\">\r\n                                        <path\r\n                                            d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" />\r\n                                    </mask>\r\n                                    <path\r\n                                        d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"\r\n                                        fill=\"#6BCAFF\" />\r\n                                    <path\r\n                                        d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\"\r\n                                        fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_419_28888)\" />\r\n                                    <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\"\r\n                                        stroke-width=\"3.98436\" stroke-linecap=\"round\" />\r\n                                    <circle cx=\"218.205\" cy=\"70.1763\" r=\"3.29663\" fill=\"white\" />\r\n                                    <circle cx=\"111.787\" cy=\"55.1663\" r=\"2.52637\" fill=\"#99DAFF\" />\r\n                                    <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\" />\r\n                                    <path\r\n                                        d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.931 123.894 194.055 127.161 191.5 128.636C188.945 130.111 185.679 129.236 184.204 126.681L164.465 92.4932C149.446 98.6552 131.813 92.92 123.471 78.4717C114.374 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.098 38.6209 151.481 34.7041 140.05 41.3037C128.62 47.9035 124.703 62.5204 131.302 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.38 76.0987 179.297 61.4826 172.698 50.0518Z\"\r\n                                        fill=\"white\" />\r\n                                    <circle cx=\"153\" cy=\"57.0007\" r=\"23.8994\" transform=\"rotate(-30 153 57.0007)\"\r\n                                        fill=\"#99DAFF\" />\r\n                                    <mask id=\"path-16-inside-2_419_28888\" fill=\"white\">\r\n                                        <path\r\n                                            d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\" />\r\n                                    </mask>\r\n                                    <path\r\n                                        d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\"\r\n                                        stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_419_28888)\" />\r\n                                    <path\r\n                                        d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.931 118.894 195.055 122.161 192.5 123.636C189.945 125.111 186.679 124.236 185.204 121.681L165.465 87.4932C150.446 93.6552 132.813 87.92 124.471 73.4717C115.374 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.098 33.6209 152.481 29.7041 141.05 36.3037C129.62 42.9035 125.703 57.5204 132.302 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.38 71.0987 180.297 56.4826 173.698 45.0518Z\"\r\n                                        fill=\"#00A3FF\" />\r\n                                </svg>\r\n                            </div>\r\n                            <div class=\"mainText text-center\">\r\n                                No Previous Revisions\r\n                            </div>\r\n                            <div class=\"subText\">\r\n                                There is no previous revisions available for this planogram\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <ng-template #headerSkeleton>\r\n        <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n            <div class=\"shimmer w-100 p-4 rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke mt-0 animate title\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n    <ng-template #skeletonLoader>\r\n        <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden m-0\">\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n</section>","import { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { Component, Input, OnInit } from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\n\r\n@Component({\r\n  selector: \"lib-analytics-popup\",\r\n  templateUrl: \"./analytics-popup.component.html\",\r\n  styleUrl: \"./analytics-popup.component.scss\",\r\n})\r\nexport class AnalyticsPopupComponent implements OnInit {\r\n  @Input() data: any;\r\n  @Input() type: any;\r\n  @Input() selectable: boolean = false;\r\n\r\n  tableData: any = [];\r\n  searchTerm: any;\r\n  sortedColumn: any;\r\n  sortOrder: any;\r\n  columnHeader: any = [];\r\n  title: string;\r\n  dataList: any = [];\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private apiService: StoreBuilderService,\r\n  ) {}\r\n\r\n  onClickClose() {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onSearch() {\r\n    if (this.searchTerm.trim().length) {\r\n      this.tableData = this.dataList.filter((ele: any) =>\r\n        ele.pid?.toString()?.includes(parseInt(this.searchTerm.trim())),\r\n      );\r\n    } else {\r\n      this.tableData = this.dataList;\r\n    }\r\n  }\r\n\r\n  onExport() {\r\n    this.apiService.exportAsExcelFile(\r\n      this.tableData,\r\n      this.title.split(\" \").join(\"_\"),\r\n    );\r\n  }\r\n\r\n  onSortTable(column: any) {}\r\n\r\n  ngOnInit(): void {\r\n    if (this.type == \"footfall\") {\r\n      this.title = \"Top performing fixture based on footfall\";\r\n      this.columnHeader = [\r\n        \"Rank\",\r\n        \"Fixture\",\r\n        \"Footfall\",\r\n        \"Location\",\r\n        \"Position\",\r\n        \"Brands\",\r\n      ];\r\n      this.tableData = this.data;\r\n    } else {\r\n      this.columnHeader = [\"\", \"Brand\", \"SKU\", \"Variant\", \"Count\"];\r\n      if (this.type == \"least_Non_Engaged\") {\r\n        this.tableData = [\r\n          ...this.data[\"Non Engaged\"],\r\n          ...this.data[\"Least Engaged\"],\r\n        ];\r\n        this.title = \"Least/Non Engaged products\";\r\n      } else {\r\n        this.tableData = this.data[this.type];\r\n        this.title = this.type.includes(\"Top\")\r\n          ? \"Top Engaged products\"\r\n          : this.type.includes(\"Least\")\r\n            ? \"Least Engaged products\"\r\n            : \"Non Engaged products\";\r\n      }\r\n      this.dataList = this.tableData;\r\n    }\r\n  }\r\n\r\n  onClickRow(item: any) {\r\n    if (!this.selectable) return;\r\n\r\n    if (this.type == \"footfall\") {\r\n      this.activeModal.close({ fixtureId: item.fixtureDetails?._id,shelfNumber: item.shelfNumber});\r\n    } else {\r\n      this.activeModal.close(item);\r\n    }\r\n  }\r\n}\r\n","<div class=\"modal-container\" id=\"analytics-popup\">\r\n  <div class=\"d-flex justify-content-between mb-4 p-5\">\r\n    <div class=\"title\">{{title}}</div>\r\n    <svg (click)=\"onClickClose()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n      xmlns=\"http://www.w3.org/2000/svg\" class=\"cursor-pointer\">\r\n      <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n        stroke-linejoin=\"round\" />\r\n    </svg>\r\n  </div>\r\n\r\n  <div class=\"content-wrapper\">\r\n    <div class=\"d-flex justify-content-end gap-3\" *ngIf=\"type != 'footfall'\">\r\n      <div style=\"position: relative\">\r\n        <input type=\"text\" [(ngModel)]=\"searchTerm\" (change)=\"onSearch()\"\r\n          style=\"padding-left: 3rem; padding-right: 3rem\" class=\"form-control\" name=\"search\" autocomplete=\"off\"\r\n          placeholder=\"Search\" />\r\n\r\n        <span class=\"search-icon\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n            <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n          </svg>\r\n        </span>\r\n      </div>\r\n\r\n      <button type=\"button\" (click)=\"onExport()\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n        [disabled]=\"!tableData.length\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n          <path\r\n            d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n        </svg>\r\n        <span class=\"ms-2\"></span> Export\r\n      </button>\r\n\r\n    </div>\r\n\r\n    <div class=\"card-body d-flex justify-content-center align-items-center flex-column my-4\" *ngIf=\"!tableData.length\">\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">No data found</div>\r\n      <div class=\"nodatasubtext\">There is no result for manage planogram table</div>\r\n    </div>\r\n\r\n    <section id=\"list-view\" *ngIf=\"tableData.length\" class=\"mt-5\">\r\n      <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n          <thead>\r\n            <tr>\r\n              <th *ngFor=\"let header of columnHeader\" >{{header}}</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let data of tableData;let i =index\" (click)=\"onClickRow(data)\"\r\n              [class.selectable]=\"selectable\">\r\n              <td *ngIf=\"type == 'footfall'\">#{{data?.footfallRank}}</td>\r\n              <td *ngIf=\"type == 'footfall'\">{{data?.fixtureDetails?.header?.label}}</td>\r\n              <td *ngIf=\"type == 'footfall'\">{{data.footfall_count}}</td>\r\n              <td *ngIf=\"type == 'footfall'\">\r\n                {{data?.fixtureDetails?.fixtureType == 'wall' ? 'Wall '+ data?.fixtureDetails.associatedElementNumber : 'Euro Center'}}\r\n              </td>\r\n              <td *ngIf=\"type == 'footfall'\">{{data?.fixtureDetails?.fixtureNumber}}</td>\r\n              <td *ngIf=\"type == 'footfall'\">{{data?.fixtureDetails?.productBrandName?.toString()}}</td>\r\n              <td *ngIf=\"type != 'footfall'\"><img [src]=\"data.imageUrl\" alt=\"Product\" class=\"rounded\"\r\n                  *ngIf=\"data.imageUrl\"></td>\r\n              <td *ngIf=\"type != 'footfall'\">{{data.Brandname}}</td>\r\n              <td *ngIf=\"type != 'footfall'\">{{data?.pid ?? '--'}}</td>\r\n              <td *ngIf=\"type != 'footfall'\">{{data.productBrandName}}</td>\r\n              <td *ngIf=\"type != 'footfall'\">{{data.count}}</td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </section>\r\n  </div>\r\n\r\n</div>","import { Component, EventEmitter, Input, OnInit, Output } from \"@angular/core\";\r\nimport dayjs from \"dayjs\";\r\nimport \"dayjs/locale/en\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\n\r\n@Component({\r\n  selector: 'lib-date-range-picker',\r\n  templateUrl: './date-range-picker.component.html',\r\n  styleUrl: './date-range-picker.component.scss'\r\n})\r\nexport class DateRangePickerComponent {\r\n  @Output() dateChange = new EventEmitter<any>();\r\n    dayjs = dayjs;\r\n    selectedClient:any\r\n     isCustomDate = (m: dayjs.Dayjs) => {\r\n        const isValidDate = m > this.dayjs();\r\n        return isValidDate ? \"invalid-date\" : false;\r\n      };\r\n    selectedDateRange: any = {\r\n      startDate: dayjs().subtract(1, 'days'),\r\n      endDate: dayjs().subtract(1, \"days\"),\r\n    };\r\n    selectedFilters: any = {\r\n      client: null,\r\n      clientName: null,\r\n      clients: [],\r\n      store: null,\r\n      stores: [],\r\n      date: null,\r\n      group: [],\r\n      location: [],\r\n    };\r\n    ranges: any = {};\r\n      constructor(\r\n        public gs: GlobalStateService,\r\n      ) {}\r\n    @Input() value:number;\r\n  \r\n    ngOnInit(): void {\r\n      this.selectedClient = JSON.parse(\r\n        localStorage.getItem(\"header-filters\") || \"{}\"\r\n      );\r\n      this.getDateRanges();\r\n    }\r\n  \r\n   getDateRanges(): any {\r\n      this.ranges = {\r\n      Today: [dayjs(), dayjs()],\r\n        Yesterday: [dayjs().subtract(1, 'days'), dayjs().subtract(1, 'days')],\r\n        'This Week': [dayjs().subtract(7, 'days'), dayjs().subtract(1, 'days')],\r\n        'Last Week': [\r\n          dayjs().subtract(14, 'days').startOf('day'),\r\n          dayjs().subtract(8, 'days').endOf('day'),\r\n        ],\r\n        'This Month': [dayjs().subtract(30, 'days'), dayjs().subtract(1, 'days')],\r\n        'Last Month': [\r\n          dayjs().subtract(1, 'month').startOf('month'),\r\n          dayjs().subtract(1, 'month').endOf('month'),\r\n        ],\r\n      };\r\n   \r\n   }\r\n  \r\n    resetValidation() {\r\n      this.isCustomDate = (m: dayjs.Dayjs) => {\r\n        // Check if the given date is before yesterday\r\n        return m.isAfter(this.dayjs(), 'day') ? 'invalid-date' : false;\r\n      };\r\n    }\r\n    \r\n    onStartDateChange(event: any) {\r\n      if (this.dayjs(event.startDate).isValid()) {\r\n        this.isCustomDate = (m: dayjs.Dayjs) => {\r\n          const isValidDate =\r\n            m > this.dayjs() || m > this.dayjs(event.startDate.add(30, \"days\"));\r\n          return isValidDate ? \"invalid-date\" : false;\r\n        };\r\n      }\r\n      // this.emitDateChange();\r\n    }\r\n    emitDateChange(event:any) {\r\n      if(event.startDate && event.endDate) {      \r\n        this.dateChange.emit({ startDate: dayjs(event.startDate).format('YYYY-MM-DD'), endDate: dayjs(event.endDate).format('YYYY-MM-DD')});\r\n      }\r\n      else {\r\n        this.dateChange.emit({startDate: dayjs().subtract(1, \"days\").format(\"YYYY-MM-DD\"),\r\n              endDate: dayjs().subtract(1, \"days\").format(\"YYYY-MM-DD\")});\r\n      }\r\n      this.resetValidation();\r\n     \r\n    }\r\n    // datechange(event: any) {\r\n    //   if (event && event.startDate && event.endDate) {\r\n    //     if (\r\n    //       this.dayjs(event.startDate).isValid() &&\r\n    //       this.dayjs(event.endDate).isValid()\r\n    //     ) {\r\n    //       this.selectedDateRange.startDate = event.startDate;\r\n    //       this.selectedDateRange.endDate = event.endDate;\r\n    //       var datetime = {\r\n    //         startDate: this.dayjs(event.startDate, \"DD-MM-YYYY\").format(\r\n    //           \"YYYY-MM-DD\"\r\n    //         ),\r\n    //         endDate: this.dayjs(event.endDate, \"DD-MM-YYYY\").format(\"YYYY-MM-DD\"),\r\n    //       };\r\n    //       this.selectedFilters.date = datetime;\r\n    //       localStorage.setItem(\r\n    //         \"header-filters\",\r\n    //         JSON.stringify(this.selectedFilters)\r\n    //       );\r\n    //       this.resetValidation();\r\n    //       // window.location.reload()\r\n    //     this.gs.dataRangeValue.next(this.selectedFilters);\r\n    //     }\r\n    //   } \r\n   \r\n    // }\r\n}\r\n","<div class=\"d-flex align-items-center position-relative\">\r\n    <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path\r\n                d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n                stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n    </span>\r\n    <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n        ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n        [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n        [(ngModel)]=\"selectedDateRange\" [isCustomDate]=\"isCustomDate\" (click)=\"resetValidation()\"  (startDateChanged)=\"onStartDateChange($event)\"\r\n        [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n         name=\"daterange1\" [readonly]=\"true\" (datesUpdated)=\"emitDateChange($event)\"/>\r\n</div>\r\n\r\n<!-- (startDateChanged)=\"onStartDateChange($event)\" -->\r\n\r\n<!-- (datesUpdated)=\"emitDateChange($event)\" -->","import { Component, Input, OnInit } from \"@angular/core\";\r\nimport { NgbActiveModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { lightenColor } from \"../../../../functions/plano.function\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\n\r\n@Component({\r\n  selector: \"zone-analytics\",\r\n  templateUrl: \"./zone-analytics.component.html\",\r\n  styleUrl: \"./zone-analytics.component.scss\",\r\n})\r\nexport class ZoneAnalyticsComponent implements OnInit {\r\n  @Input() zoneData: any;\r\n  @Input() level: string;\r\n  @Input() selectedProduct?: any;\r\n\r\n  allBrands: any;\r\n  zoneCapacity: number = 0;\r\n\r\n  constructor(\r\n    public activeModal: NgbActiveModal,\r\n    private toastService: ToastService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.zoneData.heatmap.bg = lightenColor(\r\n      this.zoneData.heatmap.bg ?? \" #f6fcff\",\r\n      0.4,\r\n    );\r\n\r\n    this.allBrands = [\r\n      ...new Set(this.zoneData.shelves.flatMap((s: any) => s.productBrandName)),\r\n    ];\r\n\r\n    this.zoneCapacity = this.zoneData.shelves.reduce(\r\n      (sum: number, shelf: any) => {\r\n        const capacity =\r\n          shelf.shelfType === \"tray\"\r\n            ? shelf.productPerShelf * shelf.trayRows\r\n            : shelf.productPerShelf;\r\n\r\n        return sum + capacity;\r\n      },\r\n      0,\r\n    );\r\n  }\r\n\r\n  onClickClose() {\r\n    this.activeModal.close();\r\n  }\r\n\r\n  copySKU(text: string) {\r\n    navigator.clipboard\r\n      .writeText(text)\r\n      .then(() => this.toastService.getSuccessToast(\"SKU Copied\"))\r\n      .catch((err) => console.error(\"Failed to copy:\", err));\r\n  }\r\n}\r\n","<div class=\"modal-container\" id=\"zone-product-details\">\r\n    <div class=\"d-flex justify-content-between mb-4\">\r\n        <h3 class=\"title\">{{zoneData.zone}}</h3>\r\n\r\n        <svg (click)=\"onClickClose()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\" class=\"cursor-pointer\">\r\n            <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n    </div>\r\n\r\n    @if(selectedProduct){\r\n        <div class=\"hero-card\">\r\n            <div class=\"hero-img\">\r\n                <img *ngIf=\"selectedProduct?.imageUrl; else placeholder\" [src]=\"selectedProduct?.imageUrl\"\r\n                    alt=\"Product Image\" />\r\n                <ng-template #placeholder>\r\n                    <svg class=\"glass-placeholder\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\" fill=\"none\"\r\n                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                            d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                            fill=\"#98A2B3\" />\r\n                    </svg>\r\n                </ng-template>\r\n            </div>\r\n\r\n            <div class=\"hero-details\">\r\n                <div>\r\n                    <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                        <p class=\"heading\">Brand</p>\r\n                        <span> : </span>\r\n                        <p class=\"details\">{{selectedProduct?.productBrandName ?? 'NA'}}</p>\r\n                    </div>\r\n\r\n                    @if(selectedProduct?.status !== 'missing'){\r\n                        <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                            <p class=\"heading\">Category</p>\r\n                            <span> : </span>\r\n                            <p class=\"details\">{{selectedProduct?.Brandname}}</p>\r\n                        </div>\r\n\r\n                        <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                            <p class=\"heading\">SKU</p>\r\n                            <span> : </span>\r\n                            <div class=\"d-flex gap-2 align-items-center\">\r\n                                <p class=\"details\">{{selectedProduct?.idText}}</p>\r\n                                <svg (click)=\"copySKU(selectedProduct?.idText)\" class=\"cursor-pointer\" width=\"16\"\r\n                                    height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <g clip-path=\"url(#clip0_5307_114007)\">\r\n                                        <path\r\n                                            d=\"M3.33203 10H2.66536C2.31174 10 1.9726 9.85956 1.72256 9.60952C1.47251 9.35947 1.33203 9.02033 1.33203 8.66671V2.66671C1.33203 2.31309 1.47251 1.97395 1.72256 1.7239C1.9726 1.47385 2.31174 1.33337 2.66536 1.33337H8.66536C9.01899 1.33337 9.35813 1.47385 9.60817 1.7239C9.85822 1.97395 9.9987 2.31309 9.9987 2.66671V3.33337M7.33203 6.00004H13.332C14.0684 6.00004 14.6654 6.59699 14.6654 7.33337V13.3334C14.6654 14.0698 14.0684 14.6667 13.332 14.6667H7.33203C6.59565 14.6667 5.9987 14.0698 5.9987 13.3334V7.33337C5.9987 6.59699 6.59565 6.00004 7.33203 6.00004Z\"\r\n                                            stroke=\"#101828\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </g>\r\n                                    <defs>\r\n                                        <clipPath id=\"clip0_5307_114007\">\r\n                                            <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                                        </clipPath>\r\n                                    </defs>\r\n                                </svg>\r\n\r\n                            </div>\r\n                        </div>\r\n\r\n                        <div class=\"d-flex align-items-center gap-2 mb-2\">\r\n                            <p class=\"heading\">Pickup Count</p>\r\n                            <span> : </span>\r\n                            <p class=\"details\">{{selectedProduct?.count}}</p>\r\n                        </div>\r\n                    }\r\n\r\n                </div>\r\n                <div>\r\n                    <svg (click)=\"selectedProduct = null\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <path\r\n                            d=\"M2.66667 9.33333H6.66667M6.66667 9.33333V13.3333M6.66667 9.33333L2 14M13.3333 6.66667H9.33333M9.33333 6.66667V2.66667M9.33333 6.66667L14 2\"\r\n                            stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n\r\n                </div>\r\n            </div>\r\n\r\n        </div>\r\n    }\r\n\r\n    <div class=\"zone-details my-2\">\r\n\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n            <div class=\"zone-info\">\r\n                <span class=\"badge draft mb-3\">\r\n                    {{ zoneData.zone }}\r\n                </span>\r\n                <h1>{{allBrands}}</h1>\r\n                <h4>Capacity {{zoneCapacity}}</h4>\r\n            </div>\r\n            <div class=\"shelves\">\r\n                <ng-container *ngFor=\"let s of zoneData.shelves; let i = index\">\r\n\r\n                    @if(s.shelfType ==='tray'){\r\n                        <div [id]=\"s.shelfType! + (i + 1)\" class=\"block\">\r\n                            @if(s.products.length){\r\n                                <div *ngFor=\"let row of s.distributedRows\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of row\" class=\"product\" [ngClass]=\"p?.engagement\">\r\n                                        @if(p.status != 'missing'){\r\n                                            <div class=\"product-img\">\r\n                                                <img *ngIf=\"p?.productImageUrl; else placeholder\"\r\n                                                    [src]=\"p?.productImageUrl\" alt=\"Product Image\" />\r\n                                                <ng-template #placeholder>\r\n                                                    <div></div>\r\n                                                </ng-template>\r\n                                            </div>\r\n                                            <div class=\"product-details\">\r\n                                                <span class=\"badge cluster\">\r\n                                                    {{ p.productId }}\r\n                                                </span>\r\n                                                <!-- <h6 class=\"ms-1\">{{p.productName}}</h6> -->\r\n                                                <!-- <p class=\"ms-1\">{{p.productType}}</p> -->\r\n                                                <h6 class=\"ms-1\">{{p?.productBrand}}</h6>\r\n                                                <p class=\"ms-1\">{{p?.brandName}}</p>\r\n                                            </div>\r\n                                        }@else {\r\n                                            <svg class=\"glass-placeholder\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                                fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                <path\r\n                                                    d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                                    fill=\"#98A2B3\" />\r\n                                            </svg>\r\n                                        }\r\n                                    </div>\r\n                                </div>\r\n                            }@else{\r\n                                <div *ngFor=\"let row of [].constructor(s.trayRows)\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"s.shelfType + (i + 1)\" class=\"block shelf\">\r\n                            @if(s.products.length){\r\n                                <div *ngFor=\"let p of s.products\" class=\"product\">\r\n                                    @if(p.status != 'missing'){\r\n                                        <div class=\"product-img\">\r\n                                            <img *ngIf=\"p?.productImageUrl; else placeholder\" [src]=\"p?.productImageUrl\"\r\n                                                alt=\"Product Image\" />\r\n                                            <ng-template #placeholder>\r\n                                                <div></div>\r\n                                            </ng-template>\r\n                                        </div>\r\n                                        <div class=\"product-details\">\r\n                                            <span class=\"badge cluster\">\r\n                                                {{ p.productId }}\r\n                                            </span>\r\n                                            <h6 class=\"ms-1\">{{p.productName}}</h6>\r\n                                            <p class=\"ms-1\">{{p.productType}}</p>\r\n                                        </div>\r\n                                    }@else {\r\n                                        <svg class=\"glass-placeholder\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                            <path\r\n                                                d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                                fill=\"#98A2B3\" />\r\n                                        </svg>\r\n                                    }\r\n                                </div>\r\n                            }@else {\r\n                                <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                            }\r\n                        </div>\r\n                    }\r\n\r\n                    <!-- @if(s.shelfType ==='tray'){\r\n                        <div [id]=\"s.shelfType! + (i + 1)\" class=\"block\">\r\n                            <div *ngFor=\"let row of [].constructor(s.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"\r\n                                    [style.background]=\"s?.heatmap?.bg\" [style.border-color]=\"s?.heatmap?.border\">\r\n\r\n                                    <svg class=\"glass-placeholder\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                        fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <path\r\n                                            d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                            fill=\"#98A2B3\" />\r\n                                    </svg>\r\n\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"s.shelfType + (i + 1)\" class=\"block shelf\">\r\n                            <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"\r\n                                [style.background]=\"s?.heatmap?.bg\" [style.border-color]=\"s?.heatmap?.border\">\r\n\r\n                                <svg class=\"glass-placeholder\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path\r\n                                        d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                        fill=\"#98A2B3\" />\r\n                                </svg>\r\n\r\n                            </div>\r\n                        </div>\r\n                    } -->\r\n                </ng-container>\r\n            </div>\r\n        </div>\r\n\r\n\r\n    </div>\r\n\r\n</div>","import {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { NgbModal, NgbModalRef } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { firstValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport {\r\n  ShelfConfig,\r\n  SectionConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { AnalyticsPopupComponent } from \"../analytics-popup/analytics-popup.component\";\r\nimport { ZoneAnalyticsComponent } from \"../zone-analytics/zone-analytics.component\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport {\r\n  FOOTFALL_HEATMAP_COLORS,\r\n  PICKUP_HEATMAP_COLORS,\r\n} from \"../../../../data/fixture-template.data\";\r\nimport { lightenColor } from \"../../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-fixture-analytics\",\r\n  templateUrl: \"./fixture-analytics.component.html\",\r\n  styleUrl: \"./fixture-analytics.component.scss\",\r\n})\r\nexport class FixtureAnalyticsComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixtureDetails: any;\r\n  @Input() floorData: any;\r\n  @Input() startDate: any;\r\n  @Input() endDate: any;\r\n  @Input() dataType: any;\r\n\r\n  @Output() onClose = new EventEmitter<any>();\r\n  @Output() changeFixture = new EventEmitter<{\r\n    fixtureId: string;\r\n    fixtureName: string;\r\n    shelfId: string;\r\n    zone: string;\r\n  }>();\r\n\r\n  @ViewChild(\"analyticsFixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n  fixtureTemplateDetails: any;\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n  fixtureEngagement: number = 0;\r\n  fixtureRankBadgeColors = {\r\n    bg: \"#E3E8F0\",\r\n    border: \"#CBD5E1\",\r\n    innerBg: \"#F8F9FC\",\r\n    text: \"#475467\",\r\n  };\r\n\r\n  zoneColor = {\r\n    right: {\r\n      bg: \"#ffffff\",\r\n      text: \"#12B76A\",\r\n      border: \"#32D583\",\r\n      productBorder: \"#12B76A\",\r\n      productBg: \"#FCFCFD\",\r\n    },\r\n    wrong: {\r\n      bg: \"#ffffff\",\r\n      text: \"#F04438\",\r\n      border: \"#98a2b3\",\r\n      productBorder: \"#F04438\",\r\n      productBg: \"#FECDCA\",\r\n    },\r\n  };\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      pickupCount?: number;\r\n      heatmap?: {\r\n        bg: string;\r\n        border: string;\r\n      };\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n  showVMs: boolean = true;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n  private fixtureLoadVersion = 0;\r\n  private pendingProductOpenTimer: ReturnType<typeof setTimeout> | null = null;\r\n  private activeZoneModalRef: NgbModalRef | null = null;\r\n  engagersList: any;\r\n  fixtureFootfall: any;\r\n\r\n  shelfGroupedData: any;\r\n\r\n  allFixtures: any[] = [];\r\n  allProducts: any[] = [];\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n    private ngbModal: NgbModal,\r\n    private toastService: ToastService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.isPageLoading = true;\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  async ngOnChanges(changes: SimpleChanges): Promise<void> {\r\n    const fixtureChange = changes[\"fixtureDetails\"];\r\n    if (!fixtureChange) return;\r\n\r\n    if (!fixtureChange.currentValue) {\r\n      this.fixtureLoadVersion += 1;\r\n      this.clearPendingProductOpen();\r\n      this.closeActiveZoneModal();\r\n      this.isPageLoading = false;\r\n      return;\r\n    }\r\n\r\n    const currentFixture = fixtureChange.currentValue;\r\n    const requestId = ++this.fixtureLoadVersion;\r\n\r\n    this.clearPendingProductOpen();\r\n    this.closeActiveZoneModal();\r\n    this.isPageLoading = true;\r\n    this.isVMInitialized = false;\r\n    this.isBCInitialized = false;\r\n    this.sectionByZones = [];\r\n    this.shelfGroupedData = null;\r\n    this.fixtureTemplateDetails = null;\r\n    this.engagersList = null;\r\n    this.fixtureFootfall = null;\r\n    this.fixtureEngagement = 0;\r\n    this.setFixtureRankBadgeColors();\r\n    this.allFixtures = [\r\n      ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n      ...this.floorData?.centerFixture,\r\n    ];\r\n\r\n    await Promise.all([\r\n      this.getFixtureShelfDetails(currentFixture, requestId),\r\n      this.getEngagersList(currentFixture, requestId),\r\n      this.getFixtureFootfall(currentFixture, requestId),\r\n    ]);\r\n\r\n    if (!this.isCurrentFixtureRequest(requestId)) {\r\n      return;\r\n    }\r\n\r\n    this.processFixtureHeatMapData();\r\n    this.isPageLoading = false;\r\n\r\n    this.pendingProductOpenTimer = setTimeout(() => {\r\n      if (!this.isCurrentFixtureRequest(requestId)) {\r\n        return;\r\n      }\r\n\r\n      this.applyShelfColors();\r\n      this.handleVmPositionAndSize();\r\n\r\n      if (currentFixture?.targetProduct) {\r\n        this.onClickProduct(currentFixture.targetProduct);\r\n      }\r\n\r\n      this.pendingProductOpenTimer = null;\r\n    }, 200);\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  async getFixtureShelfDetails(data: any, requestId: number) {\r\n    let payload = {\r\n      fixtureId: data?._id,\r\n      planoId: data?.planoId,\r\n      floorId: data?.floorId,\r\n      compliance: true,\r\n      ...(data?.revisionId && {\r\n        revisionId: data.revisionId,\r\n      }),\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService.getShelfDetails(payload).pipe(\r\n          takeUntil(this.destroy$),\r\n        ),\r\n      );\r\n\r\n      if (!this.isCurrentFixtureRequest(requestId)) {\r\n        return;\r\n      }\r\n\r\n      if (res?.status === \"success\" && res?.data) {\r\n        this.fixtureTemplateDetails = {\r\n          ...res?.data,\r\n          shelfConfig: res?.data?.shelves ?? [],\r\n        };\r\n\r\n        this.fixtureTemplateDetails.shelfConfig =\r\n          this.fixtureTemplateDetails.shelfConfig.map((s: any) => {\r\n            if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n              s.distributedRows = this.distributeRoundRobin(\r\n                s.products,\r\n                s.trayRows,\r\n              );\r\n            }\r\n            return s;\r\n          });\r\n\r\n        const allProducts = (\r\n          this.fixtureTemplateDetails?.shelfConfig ?? []\r\n        ).flatMap((s: any) => s.products ?? []);\r\n\r\n        allProducts.forEach((p: any, i: number) => {\r\n          if (!p?.productId) {\r\n            p[\"productId\"] = i;\r\n          }\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getFixtureShelfDetails [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  processFixtureHeatMapData() {\r\n    const topMaskingPos = 1;\r\n    const bottomSlanderPos =\r\n      this.fixtureTemplateDetails?.shelfConfig?.length ?? 0;\r\n\r\n    this.fixtureTemplateDetails.vmConfig =\r\n      this.fixtureTemplateDetails?.vmConfig?.filter(\r\n        (vm: any) =>\r\n          vm.xZone === \"stretch\" &&\r\n          vm.yZone === \"stretch\" &&\r\n          vm.startYPosition === vm.endYPosition &&\r\n          [topMaskingPos, bottomSlanderPos].includes(vm.startYPosition),\r\n      );\r\n\r\n    this.shelfGroupedData = this.buildShelfMap();\r\n  }\r\n\r\n  setFixtureRankBadgeColors() {\r\n    const rank = this.fixtureDetails?.footfallRank;\r\n    const fallbackHeatmap =\r\n      rank > 0\r\n        ? FOOTFALL_HEATMAP_COLORS[\r\n            Math.min(rank - 1, FOOTFALL_HEATMAP_COLORS.length - 1)\r\n          ]\r\n        : {\r\n            bg: \"#E3E8F0\",\r\n            border: \"#CBD5E1\",\r\n          };\r\n\r\n    const heatmap = this.fixtureDetails?.heatmapColor ?? fallbackHeatmap;\r\n\r\n    this.fixtureRankBadgeColors = {\r\n      bg: heatmap?.bg ?? fallbackHeatmap.bg,\r\n      border: heatmap?.border ?? fallbackHeatmap.border,\r\n      innerBg: lightenColor(heatmap?.bg ?? fallbackHeatmap.bg, 0.72),\r\n      text: heatmap?.border ?? fallbackHeatmap.border,\r\n    };\r\n  }\r\n\r\n  buildShelfMap() {\r\n    const shelfMap: any = {};\r\n\r\n    [\"Top Engaged\", \"Least Engaged\", \"Non Engaged\"].forEach((engagerKey) => {\r\n      const products = this.engagersList?.[engagerKey] || [];\r\n\r\n      (products || []).forEach((product: any) => {\r\n        const shelf = product?.shelfNumber || \"Unknown\";\r\n\r\n        if (!shelfMap[shelf]) {\r\n          shelfMap[shelf] = {\r\n            products: [],\r\n            totalPickupCount: 0,\r\n          };\r\n        }\r\n\r\n        shelfMap[shelf].products.push(product);\r\n        shelfMap[shelf].totalPickupCount += product?.count || 0;\r\n      });\r\n    });\r\n\r\n    return shelfMap;\r\n  }\r\n\r\n  async getEngagersList(fixtureDetails: any, requestId: number) {\r\n    let payload = {\r\n      from_date: this.startDate,\r\n      to_date: this.endDate,\r\n      fixtureId: fixtureDetails?._id,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService\r\n          .getStoreFixtureEngagers(payload)\r\n          .pipe(takeUntil(this.destroy$)),\r\n      );\r\n\r\n      if (!this.isCurrentFixtureRequest(requestId)) {\r\n        return;\r\n      }\r\n\r\n      if (res && res.code == 200) {\r\n        const { fixtureEngagement = 0, ...engagersList } = res?.data || {};\r\n\r\n        this.fixtureEngagement = fixtureEngagement;\r\n        this.engagersList = engagersList;\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getEngagersList [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  async getFixtureFootfall(fixtureDetails: any, requestId: number) {\r\n    let payload = {\r\n      fromDate: this.startDate,\r\n      toDate: this.endDate,\r\n      storeId: [this.floorData.storeId],\r\n      zone: `Fixture ${fixtureDetails?.fixtureNumber}`,\r\n      dateType: this.dataType,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.storeBuilderService\r\n          .getStoreFixtureFootfall(payload)\r\n          .pipe(takeUntil(this.destroy$)),\r\n      );\r\n\r\n      if (!this.isCurrentFixtureRequest(requestId)) {\r\n        return;\r\n      }\r\n\r\n      if (res && res.code == 200) {\r\n        this.fixtureFootfall = res?.data?.card || {};\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getFixtureFootfall [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  topEngagers() {\r\n    return this.engagersList?.[\"Top Engaged\"]\r\n      ?.sort((a: any, b: any) => b.count - a.count)\r\n      ?.slice(0, 3);\r\n  }\r\n\r\n  leastEngagers() {\r\n    return [\r\n      ...(this.engagersList?.[\"Non Engaged\"] || []),\r\n      ...(this.engagersList?.[\"Least Engaged\"] || []).sort(\r\n        (a: any, b: any) => a.count - b.count,\r\n      ),\r\n    ]?.slice(0, 3);\r\n  }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    const header = document.getElementById(\"header-block\") as HTMLElement;\r\n    const footer = document.getElementById(\"footer-block\") as HTMLElement;\r\n\r\n    header.style.width = `${bodyWidth}px`;\r\n    footer.style.width = `${bodyWidth}px`;\r\n\r\n    this.fixtureTemplateDetails?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ??\r\n        this.fixtureTemplateDetails?.shelfConfig?.length ??\r\n        1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n    const bodyWidth = bodies.offsetWidth;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.fixtureTemplateDetails?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        // const allProducts = (\r\n        //   this.fixtureTemplateDetails?.shelves ?? []\r\n        // ).flatMap((s: any) => s.products ?? []);\r\n\r\n        // const isImproper =\r\n        //   allProducts.length == 0\r\n        //     ? true\r\n        //     : allProducts.some(\r\n        //         (p: any) =>\r\n        //           p.status === \"misplaced\" ||\r\n        //           p.status === \"missing\" ||\r\n        //           p.status === \"\"\r\n        //       );\r\n\r\n        // shelfDivs.forEach((d) => {\r\n        //   if (d) {\r\n        //     const blockDiv = d.querySelector(\".block\") as HTMLElement;\r\n        //     if (blockDiv) {\r\n        //       blockDiv.style.borderColor = isImproper\r\n        //         ? this.zoneColor.wrong.border\r\n        //         : this.zoneColor.right.border;\r\n        //       blockDiv.style.backgroundColor = isImproper\r\n        //         ? this.zoneColor.wrong.bg\r\n        //         : this.zoneColor.right.bg;\r\n        //     }\r\n        //   }\r\n        // });\r\n        // const l1 = document.getElementById(\"fixture-level\") as HTMLElement;\r\n        // if (l1) {\r\n        //   const bc = l1.querySelector(\".brand-category\") as HTMLElement;\r\n\r\n        //   if (bc) {\r\n        //     if (isImproper) {\r\n        //       bc.classList.add(\"wrong\");\r\n        //     } else {\r\n        //       bc.classList.remove(\"wrong\");\r\n        //     }\r\n        //   }\r\n        // }\r\n\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          this.patchZonePickupCounts();\r\n          // this.generateZoneHeatmapColors();\r\n          this.assignHeatmapFromPalette();\r\n          this.applyZoneHeatmapEverywhere();\r\n\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureTemplateDetails?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n            const currentSe = this.sectionByZones.find(\r\n              (s) => s.zone === se.zone,\r\n            );\r\n\r\n            secDivs.forEach((d, i) => {\r\n              if (d) {\r\n                d.style.backgroundColor = lightenColor(\r\n                  currentSe?.section.heatmap?.bg ?? \"#fff\",\r\n                );\r\n                d.style.borderRight = `1.2px solid`;\r\n                d.style.borderLeft = `1.2px solid`;\r\n\r\n                if (secDivs.length == 1) {\r\n                  d.style.border = `1.2px solid`;\r\n                } else if (secDivs.length > 1 && secDivs.length <= 2) {\r\n                  if (i == 0) {\r\n                    d.style.borderTop = `1px solid`;\r\n                    d.style.borderBottom = `0.5px dotted`;\r\n                  } else if (i == secDivs.length - 1) {\r\n                    d.style.borderBottom = `1px solid`;\r\n                  }\r\n                } else {\r\n                  if (i == 0) {\r\n                    d.style.borderTop = `1px solid`;\r\n                  } else if (i == secDivs.length - 1) {\r\n                    d.style.borderBottom = `1px solid`;\r\n                  } else {\r\n                    d.style.borderTop = `0.5px dotted`;\r\n                    d.style.borderBottom = `0.5px dotted`;\r\n                  }\r\n                }\r\n                d.style.borderColor = `#98a2b3`;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = bodyWidth + 16;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n\r\n            const storeBox = document.getElementById(\r\n              \"storage-box-zone\",\r\n            ) as HTMLElement;\r\n\r\n            const align = bodyWidth + 16;\r\n\r\n            if (storeBox) {\r\n              storeBox.style.left = `${align}px`;\r\n            }\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.zoneColor.right.bg;\r\n            div.style.border = `1.4px solid ${this.zoneColor.right.border}`;\r\n\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.zoneColor.right.border;\r\n            bc.style.backgroundColor = this.zoneColor.right.bg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) d.style.backgroundColor = this.zoneColor.right.bg;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n  }\r\n\r\n  patchZonePickupCounts() {\r\n    const shelfMap = this.shelfGroupedData || {};\r\n\r\n    this.sectionByZones.forEach((zoneObj: any) => {\r\n      let total = 0;\r\n\r\n      zoneObj.section.shelves.forEach((shelfId: string) => {\r\n        const shelfNumber = shelfId.replace(/\\D/g, \"\");\r\n\r\n        total += shelfMap?.[shelfNumber]?.totalPickupCount || 0;\r\n      });\r\n\r\n      zoneObj.section.pickupCount = total;\r\n    });\r\n  }\r\n\r\n  assignHeatmapFromPalette() {\r\n    if (!this.sectionByZones?.length) return;\r\n\r\n    const counts = this.sectionByZones.map((z: any) => z.section.pickupCount);\r\n    const min = Math.min(...counts);\r\n    const max = Math.max(...counts);\r\n    const range = max - min || 1;\r\n\r\n    this.sectionByZones.forEach((zoneObj: any) => {\r\n      const val = zoneObj.section.pickupCount;\r\n      const normalized = (val - min) / range;\r\n\r\n      const index = Math.floor(\r\n        (1 - normalized) * (PICKUP_HEATMAP_COLORS.length - 1),\r\n      );\r\n\r\n      zoneObj.section.heatmap = PICKUP_HEATMAP_COLORS[index];\r\n    });\r\n  }\r\n\r\n  applyZoneHeatmapEverywhere() {\r\n    if (!this.sectionByZones) return;\r\n\r\n    this.sectionByZones.forEach((zoneObj: any) => {\r\n      const heat = zoneObj.section.heatmap;\r\n\r\n      zoneObj.section.shelves.forEach((shelfId: string) => {\r\n        const shelfNumber = shelfId.replace(/\\D/g, \"\");\r\n\r\n        // ---------- APPLY TO SHELF CONFIG ----------\r\n        const shelfConfig = this.fixtureTemplateDetails?.shelfConfig?.find(\r\n          (s: any) => String(s.shelfNumber) === shelfNumber,\r\n        );\r\n\r\n        if (shelfConfig) {\r\n          shelfConfig.heatmap = heat;\r\n        }\r\n\r\n        // ---------- APPLY TO PRODUCTS ----------\r\n        const shelf = this.shelfGroupedData?.[shelfNumber];\r\n        if (shelf?.products) {\r\n          shelf.products.forEach((product: any) => {\r\n            product.heatmap = heat;\r\n          });\r\n        }\r\n      });\r\n    });\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureTemplateDetails?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureTemplateDetails?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  openZoneLevelProductModal(zoneData: any, level: string, product?: any) {\r\n    if (!zoneData) return;\r\n\r\n    this.closeActiveZoneModal();\r\n\r\n    const data = {\r\n      zone: zoneData.zone,\r\n      shelves: this.fixtureTemplateDetails.shelfConfig.filter(\r\n        (s: any) => s.zone === zoneData.zone && s.shelfType != \"vmonly\",\r\n      ),\r\n      heatmap: zoneData.section.heatmap,\r\n    };\r\n\r\n    const modalRef = this.ngbModal.open(ZoneAnalyticsComponent, {\r\n      centered: true,\r\n      windowClass: \"merch-compliance-modal\",\r\n    });\r\n    this.activeZoneModalRef = modalRef;\r\n\r\n    modalRef.componentInstance.zoneData = data;\r\n    modalRef.componentInstance.level = level;\r\n    modalRef.componentInstance.selectedProduct = product;\r\n\r\n    modalRef.result.then(\r\n      (result: any) => {\r\n        if (this.activeZoneModalRef === modalRef) {\r\n          this.activeZoneModalRef = null;\r\n        }\r\n\r\n        if (result) {\r\n          this.changeFixture.emit(result);\r\n        }\r\n      },\r\n      () => {\r\n        if (this.activeZoneModalRef === modalRef) {\r\n          this.activeZoneModalRef = null;\r\n        }\r\n      },\r\n    );\r\n  }\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n\r\n  onClickProduct(product: any) {\r\n    if (product) {\r\n      const zone = this.fixtureTemplateDetails?.shelfConfig?.find(\r\n        (s: any) => s.shelfNumber === Number(product?.shelfNumber ?? \"2\"),\r\n      )?.zone;\r\n      if (!zone) return;\r\n\r\n      const productZone = this.sectionByZones.find((sec) => sec.zone === zone);\r\n\r\n      this.openZoneLevelProductModal(productZone, \"section\", product);\r\n    }\r\n  }\r\n\r\n  openPopup(type: any) {\r\n    const modalRef = this.ngbModal.open(AnalyticsPopupComponent, {\r\n      centered: true,\r\n      windowClass: \"merch-compliance-modal\",\r\n      size: \"lg\",\r\n    });\r\n\r\n    modalRef.componentInstance.data = this.engagersList;\r\n    modalRef.componentInstance.type = type;\r\n    modalRef.componentInstance.selectable = true;\r\n\r\n    modalRef.result.then((result: any) => {\r\n      if (result) {\r\n        this.onClickProduct(result);\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.clearPendingProductOpen();\r\n    this.closeActiveZoneModal();\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  private isCurrentFixtureRequest(requestId: number) {\r\n    return requestId === this.fixtureLoadVersion;\r\n  }\r\n\r\n  private clearPendingProductOpen() {\r\n    if (this.pendingProductOpenTimer) {\r\n      clearTimeout(this.pendingProductOpenTimer);\r\n      this.pendingProductOpenTimer = null;\r\n    }\r\n  }\r\n\r\n  private closeActiveZoneModal() {\r\n    if (this.activeZoneModalRef) {\r\n      this.activeZoneModalRef.dismiss();\r\n      this.activeZoneModalRef = null;\r\n    }\r\n  }\r\n}\r\n","<section #analyticsFixtureRoot id=\"fixture-analytic-details\" class=\"scale-down\" [class.d-none]=\"isPageLoading\">\r\n    <div class=\"hero-block\">\r\n        <svg (click)=\"onClickClose()\" class=\"close-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n        <div class=\"hero-content\">\r\n            <div class=\"hero-rank\">\r\n                <div class=\"rank-badge\" [style.--rank-bg]=\"fixtureRankBadgeColors.bg\"\r\n                    [style.--rank-border]=\"fixtureRankBadgeColors.border\"\r\n                    [style.--rank-inner-bg]=\"fixtureRankBadgeColors.innerBg\"\r\n                    [style.--rank-text]=\"fixtureRankBadgeColors.text\">\r\n                    <span class=\"rank-hash\">#</span>\r\n                    <span class=\"rank-num\">{{ fixtureDetails?.footfallRank ?? 0 }}</span>\r\n                </div>\r\n\r\n                <div class=\"hero-rank-copy\">\r\n                    <h1>Rank based on Footfall</h1>\r\n                    <span class=\"hero-rank-meta\">Out of {{allFixtures.length}} fixtures</span>\r\n                </div>\r\n            </div>\r\n\r\n            <h2 class=\"hero-compliance m-0\">\r\n                Merch compliance: <b>{{fixtureTemplateDetails?.fixtureCompliance}}%</b>\r\n            </h2>\r\n\r\n            <p class=\"hero-meta\">\r\n                <b>\r\n                    {{ fixtureTemplateDetails?.header?.label }}\r\n                </b> <span>&#8226;</span>\r\n\r\n                {{fixtureTemplateDetails?.fixtureCategory}} <span>&#8226;</span>\r\n                {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>&#8226;</span>\r\n                {{fixtureTemplateDetails?.actualShelves?.length}} Shelves\r\n            </p>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"row g-3 mb-3\">\r\n        <div class=\"col-6\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header\">\r\n                        <span class=\"fw-semibold\">Footfall</span>\r\n                    </div>\r\n\r\n                    <div class=\"mt-2\">\r\n                        <h2 class=\"mb-1\">{{fixtureFootfall?.zoneTotal?.count}}</h2>\r\n\r\n                        <div class=\"d-flex align-items-center gap-1 small\"\r\n                            [ngClass]=\"fixtureFootfall?.zoneTotal?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                style=\"transform: rotate(180deg);\"\r\n                                *ngIf=\"!fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                *ngIf=\"fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <span class=\"fw-semibold\">{{fixtureFootfall?.zoneTotal?.PreviousData}}%</span>\r\n                            <span class=\"text-muted\">vs Previous day</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"col-6\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header\">\r\n                        <span class=\"fw-semibold\">Avg Dwell Time</span>\r\n                    </div>\r\n\r\n                    <div class=\"mt-2\">\r\n                        <h2 class=\"mb-1\">{{fixtureFootfall?.dwellTime?.count}} mins</h2>\r\n\r\n                        <div class=\"d-flex align-items-centergap-1 small\"\r\n                            [ngClass]=\"fixtureFootfall?.dwellTime?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                style=\"transform: rotate(180deg);\"\r\n                                *ngIf=\"!fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                *ngIf=\"fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <span class=\"fw-semibold\">{{fixtureFootfall?.dwellTime?.PreviousData}}%</span>\r\n                            <span class=\"text-muted\">vs Previous day</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"col-6\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header\">\r\n                        <span class=\"fw-semibold\">Fixture Conversion</span>\r\n                    </div>\r\n\r\n                    <div class=\"mt-2\">\r\n                        <h2 class=\"mb-1\">{{fixtureFootfall?.conversionCount?.count}}%</h2>\r\n\r\n                        <div class=\"d-flex align-items-center gap-1 small\"\r\n                            [ngClass]=\"fixtureFootfall?.conversionCount?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                style=\"transform: rotate(180deg);\"\r\n                                *ngIf=\"!fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                *ngIf=\"fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n                                <path\r\n                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                    stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                            <span class=\"fw-semibold\">{{fixtureFootfall?.conversionCount?.PreviousData}}%</span>\r\n                            <span class=\"text-muted\">vs Previous day</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n\r\n        <div class=\"col-6\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header\">\r\n                        <span class=\"fw-semibold\">Engagement Conversion</span>\r\n                    </div>\r\n\r\n                    <div class=\"mt-2\">\r\n                        <h2 class=\"mb-1\">\r\n                            {{fixtureEngagement + '%'}}\r\n                        </h2>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- <div class=\"d-flex justify-content-end mt-2 pe-5\" style=\"margin-top:14px\">\r\n        <div class=\"form-check form-switch \">\r\n            <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n                style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n            <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n                Show VM\r\n            </label>\r\n        </div>\r\n    </div> -->\r\n\r\n    <div class=\"row g-3\">\r\n        <div class=\"w-25\" *ngIf=\"engagersList?.['Top Engaged']?.length\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n                        <span>Top Engaged</span>\r\n                        <span>Count</span>\r\n                    </div>\r\n                    <div class=\"row align-items-center py-2 border-bottom mx-0 list-tile\"\r\n                        *ngFor=\"let top of topEngagers()\" (click)=\"onClickProduct(top)\">\r\n                        <div class=\"col-auto\">\r\n                            @if (top?.imageUrl && !top?.imageLoadError) {\r\n                                <img [src]=\"top.imageUrl\" alt=\"Product\" class=\"rounded\"\r\n                                    (error)=\"top.imageLoadError = true\">\r\n                            } @else {\r\n                                <div class=\"card-image-placeholder rounded\"></div>\r\n                            }\r\n                        </div>\r\n                        <div class=\"col\">\r\n                            <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n                            <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n                        </div>\r\n                        <div class=\"col-auto\">\r\n                            <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <div class=\"text-end py-1\">\r\n                        <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                            (click)=\"openPopup('Top Engaged')\">\r\n                            View all\r\n                        </a>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"w-25\" *ngIf=\"engagersList?.['Non Engaged']?.length || engagersList?.['Least Engaged']?.length\">\r\n            <div class=\"card h-100\">\r\n                <div class=\"card-body p-2\">\r\n                    <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n                        <span>Least/Non Engaged</span>\r\n                        <span>Count</span>\r\n                    </div>\r\n                    <div class=\"row align-items-center py-2 border-bottom  mx-0 list-tile\"\r\n                        *ngFor=\"let least of leastEngagers()\" (click)=\"onClickProduct(least)\">\r\n                        <div class=\"col-auto\">\r\n                            @if (least?.imageUrl && !least?.imageLoadError) {\r\n                                <img [src]=\"least.imageUrl\" alt=\"Product\" class=\"rounded\"\r\n                                    (error)=\"least.imageLoadError = true\">\r\n                            } @else {\r\n                                <div class=\"card-image-placeholder rounded\"></div>\r\n                            }\r\n                        </div>\r\n                        <div class=\"col\">\r\n                            <div class=\"fw-medium text-dark small\">{{least.Brandname}}</div>\r\n                            <div class=\"text-muted\" style=\"font-size: 12px;\">{{least?.productBrandName ?? ''}}</div>\r\n                        </div>\r\n                        <div class=\"col-auto\">\r\n                            <span class=\"fw-medium text-dark\">{{least?.count ?? 0}}</span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <div class=\"text-end py-1\">\r\n                        <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                            (click)=\"openPopup('least_Non_Engaged')\">\r\n                            View all\r\n                        </a>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <div id=\"vm-products-sum\" class=\"wall-viewport my-4\">\r\n        <div class=\"fixture-wrapper\">\r\n            <div id=\"header-block\" class=\"header-block\">\r\n                <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n            </div>\r\n\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\" [ngClass]=\"{'d-none':!showVMs}\">\r\n                    <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container>\r\n                                <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN+vm?.vmImageUrl\"\r\n                                    alt=\"Vm Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder\">\r\n                                        <h3>{{ vm?.vmName }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n                            (click)=\"openZoneLevelProductModal(item,'section')\">\r\n                            <div class=\"d-flex gap-1\">\r\n                                <span class=\"badge inactive\">\r\n                                    {{ item.zone }}\r\n                                </span>\r\n                                <span class=\"badge inactive\">\r\n                                    Capacity {{ item?.section?.capacity }}\r\n                                </span>\r\n\r\n                            </div>\r\n\r\n                            <div class=\"d-flex gap-1 my-1\">\r\n                                <span class=\"badge inactive\">\r\n                                    Pickups {{ item?.section?.pickupCount }}\r\n                                </span>\r\n                            </div>\r\n\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\"\r\n                    *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n                    @if(item.shelfType ==='tray'){\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n                            <!-- <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"\r\n                                    [style.background]=\"item?.heatmap?.bg\" [style.border-color]=\"item?.heatmap?.border\"\r\n                                    style=\"opacity: 0.7;\">\r\n\r\n                                    <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <path\r\n                                            d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                            fill=\"#98A2B3\" />\r\n                                    </svg>\r\n\r\n\r\n                                </div>\r\n                            </div> -->\r\n\r\n                            @if(item.products.length){\r\n                                <div *ngFor=\"let row of item.distributedRows;let r = index\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let product of row;let p = index\" class=\"product\"\r\n                                        [style.background]=\"'white'\">\r\n                                        @if(product.status != 'missing'){\r\n                                            <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n                                                [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n                                            <ng-template #placeholder>\r\n                                                <div></div>\r\n                                            </ng-template>\r\n                                        }@else {\r\n                                            <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                                fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                <path\r\n                                                    d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                                    fill=\"#98A2B3\" />\r\n                                            </svg>\r\n                                        }\r\n                                    </div>\r\n                                </div>\r\n                            }@else{\r\n                                <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"\r\n                                        [style.background]=\"item?.heatmap?.bg\"\r\n                                        [style.border-color]=\"item?.heatmap?.border\" style=\"opacity: 0.7;\">\r\n                                        <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                            <path\r\n                                                d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                                fill=\"#98A2B3\" />\r\n                                        </svg>\r\n\r\n                                    </div>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\"\r\n                            [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                            <!-- <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"\r\n                                [style.background]=\"item?.heatmap?.bg\" [style.border-color]=\"item?.heatmap?.border\"\r\n                                style=\"opacity: 0.7;\">\r\n                                <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path\r\n                                        d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                        fill=\"#98A2B3\" />\r\n                                </svg>\r\n\r\n                            </div> -->\r\n\r\n                            @if(item.products.length){\r\n                                <div *ngFor=\"let product of item.products;let p = index\" class=\"product\"\r\n                                    [style.background]=\"'white'\">\r\n                                    @if(product.status != 'missing'){\r\n                                        <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n                                            [src]=\"product?.productImageUrl\" alt=\"Product Image\" />\r\n                                        <ng-template #placeholder>\r\n                                            <div></div>\r\n                                        </ng-template>\r\n                                    }@else {\r\n                                        <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\"\r\n                                            fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                            <path\r\n                                                d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                                fill=\"#98A2B3\" />\r\n                                        </svg>\r\n                                    }\r\n                                </div>\r\n                            }@else {\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"\r\n                                    [style.background]=\"item?.heatmap?.bg\" [style.border-color]=\"item?.heatmap?.border\"\r\n                                    style=\"opacity: 0.7;\">\r\n                                    <svg style=\"opacity: 0.5;\" width=\"40\" height=\"19\" viewBox=\"0 0 40 19\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                        <path\r\n                                            d=\"M31.0536 0.000138522C31.4767 0.00329514 31.8941 0.0635538 32.3075 0.186662C33.7233 0.609655 34.3548 1.37353 35.1425 2.32045C35.2335 2.43086 35.3247 2.53814 35.3573 2.57924L39.8426 7.92397C40.0866 8.21431 40.0413 8.64307 39.7421 8.88295C39.6737 8.93661 39.5985 8.97489 39.5204 9.00014C39.0874 9.70402 38.2056 10.5156 37.9745 10.8439C37.4635 11.5604 37.0333 12.3966 36.6493 13.3087C36.0927 14.9185 35.422 16.1997 34.6278 17.1183C33.8759 17.9926 33.0105 18.5393 32.0243 18.7413C31.8941 18.7666 31.7665 18.7986 31.6395 18.8175C29.9045 19.0921 26.7539 19.1076 25.12 18.4953C24.6448 18.3185 24.2121 18.0437 23.8182 17.7091C23.2681 17.2956 22.4181 15.758 21.7704 14.3722C21.318 13.4068 20.5275 12.7978 20.0653 12.7785C19.5543 12.7564 18.7105 13.3212 18.2352 14.2902C17.8707 15.0257 17.3729 15.7267 17.0702 16.3927C16.0579 18.6213 13.5056 19.0096 10.8788 19.0001C10.1692 18.997 9.46267 18.9367 8.74988 18.8136C6.17861 18.3622 5.44608 18.0592 4.38171 15.796C3.03742 12.9489 2.85847 11.427 0.413939 9.17006C0.30334 9.03755 0.224787 8.91474 0.172728 8.79799C-0.0485357 8.55177 -0.0609602 8.18203 0.157103 7.92006L4.64538 2.57924C4.6812 2.53818 4.7691 2.43091 4.86023 2.32045C5.64465 1.37353 6.27943 0.609667 7.69519 0.186662C8.10524 0.0635809 8.52537 0.00331947 8.94519 0.000138522C9.35851 -0.00301753 9.76884 0.0478256 10.1757 0.145646C10.5532 0.234032 10.7847 0.606854 10.6903 0.969865C10.599 1.33585 10.2149 1.55943 9.8407 1.46791C9.53799 1.39531 9.24171 1.35734 8.95202 1.36049C8.67209 1.36365 8.38854 1.40221 8.10534 1.48744C7.10301 1.78736 6.58865 2.40602 5.95398 3.17299C5.90193 3.23608 5.84615 3.302 5.7323 3.43764L2.24304 7.59487C2.34395 7.58855 2.45203 7.58262 2.55945 7.57631C7.0122 6.99875 11.4358 7.43711 15.83 9.19838C17.4607 9.85179 19.0621 11.0892 20.8426 10.6378C22.0209 10.338 23.7428 9.23354 25.162 8.73158C29.5336 7.188 33.4369 7.18183 37.828 7.68373L34.2635 3.43764C34.1497 3.30205 34.0939 3.23609 34.0419 3.17299C33.4072 2.40597 32.893 1.78731 31.8905 1.48744C31.6073 1.40222 31.327 1.36049 31.0438 1.36049C30.7544 1.35738 30.4585 1.39543 30.1561 1.46791C29.7787 1.55626 29.3979 1.33577 29.3065 0.969865C29.2154 0.603756 29.4427 0.234107 29.8202 0.145646C30.2302 0.0478282 30.6403 -0.00297627 31.0536 0.000138522ZM10.7714 9.006C8.33663 8.45679 5.17599 8.10028 4.31335 9.60268C3.66559 10.7296 4.32964 12.46 4.65515 13.6437C4.95461 14.6537 5.35541 15.4964 5.86316 16.1466C7.56554 18.3244 11.6598 18.2743 14.0555 17.4601C15.7514 17.0781 16.7964 15.7801 16.7411 12.9455C16.7897 10.3004 12.9392 9.49526 10.7714 9.006ZM35.6405 9.60268C34.7778 8.10031 31.6172 8.45678 29.1825 9.006C27.0147 9.49526 23.1642 10.3004 23.2128 12.9455C23.1574 15.7801 24.2024 17.0781 25.8983 17.4601C28.294 18.2743 32.3883 18.3243 34.0907 16.1466C34.6017 15.4964 34.9992 14.6537 35.2987 13.6437C35.6242 12.46 36.2883 10.7296 35.6405 9.60268Z\"\r\n                                            fill=\"#98A2B3\" />\r\n                                    </svg>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <div id=\"footer-block\" class=\"footer-block\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"d-flex gap-3 align-items-center my-4\">\r\n        <span class=\"heatmap-txt\">High</span>\r\n        <svg style=\"height: 18px; width: auto;\" width=\"452\" height=\"39\" viewBox=\"0 0 452 39\" fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\">\r\n            <rect width=\"452\" height=\"39\" rx=\"6\" fill=\"url(#paint0_linear_6676_185872)\" />\r\n            <defs>\r\n                <linearGradient id=\"paint0_linear_6676_185872\" x1=\"0\" y1=\"19.5\" x2=\"452\" y2=\"19.5\"\r\n                    gradientUnits=\"userSpaceOnUse\">\r\n                    <stop stop-color=\"#FCA5A5\" />\r\n                    <stop offset=\"0.2\" stop-color=\"#FECACA\" />\r\n                    <stop offset=\"0.4\" stop-color=\"#93C5FD\" />\r\n                    <stop offset=\"0.6\" stop-color=\"#BAE6FD\" />\r\n                    <stop offset=\"0.8\" stop-color=\"#86EFAC\" />\r\n                    <stop offset=\"1\" stop-color=\"#BBF7D0\" />\r\n                </linearGradient>\r\n            </defs>\r\n        </svg>\r\n        <span class=\"heatmap-txt text-nowrap\">Low engagement rate</span>\r\n    </div>\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" [class.d-none]=\"!isPageLoading\">\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>\r\n","import {\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Input,\r\n  OnInit,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { Subject, finalize, takeUntil } from \"rxjs\";\r\nimport * as fabric from \"fabric\";\r\nimport { VmLibraryList } from \"../../../interfaces/vm-library.interface\";\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { AnalyticsPopupComponent } from \"./analytics-popup/analytics-popup.component\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport dayjs from \"dayjs\";\r\nimport { FOOTFALL_HEATMAP_COLORS } from \"../../../data/fixture-template.data\";\r\nimport { getFixtureCanvasLabel } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-analytics\",\r\n  templateUrl: \"./plano-analytics.component.html\",\r\n  styleUrl: \"./plano-analytics.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class PlanoAnalyticsComponent implements OnInit {\r\n  @Input() floorData: any;\r\n\r\n  readonly footfallHeatmapLegendColors = [\r\n    FOOTFALL_HEATMAP_COLORS[0].bg,\r\n    FOOTFALL_HEATMAP_COLORS[5].bg,\r\n    FOOTFALL_HEATMAP_COLORS[10].bg,\r\n    FOOTFALL_HEATMAP_COLORS[12].bg,\r\n    FOOTFALL_HEATMAP_COLORS[17].bg,\r\n    FOOTFALL_HEATMAP_COLORS[23].bg,\r\n  ];\r\n  footfallList: any = [];\r\n  cardData: any;\r\n  topPerformingZoneList: any = [];\r\n  dayjs = dayjs();\r\n  engagersList: any;\r\n  @ViewChild(\"complianceBaseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"complianceCanvasContainer\")\r\n  containerRef!: ElementRef<HTMLDivElement>;\r\n  startDate: string = this.dayjs.subtract(1, \"d\").format(\"YYYY-MM-DD\");\r\n  endDate: string = this.dayjs.subtract(1, \"d\").format(\"YYYY-MM-DD\");\r\n  pageLoading: boolean = true;\r\n  showCard: boolean = true;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  canvas!: fabric.Canvas;\r\n  clientId: string;\r\n\r\n  cdnUrl: string;\r\n\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  isPageLoading: boolean = false;\r\n  isEngagersLoading: boolean = true;\r\n  isFootfallLoading: boolean = true;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  dataType: string = \"daily\";\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n  private readonly destroy$ = new Subject<void>();\r\n  private readonly zoneNameCollator = new Intl.Collator(undefined, {\r\n    numeric: true,\r\n    sensitivity: \"base\",\r\n  });\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private ngbModal: NgbModal,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => {\r\n      this.cdnUrl = env?.planogramCDN;\r\n    });\r\n  }\r\n\r\n  async getDetails() {\r\n    this.pageLoading = true;\r\n    this.getFootfallDetails();\r\n    // await this.getTopPerformingZones();\r\n    await this.getStoreEngagers();\r\n    this.pageLoading = false;\r\n  }\r\n\r\n  getFootfallDetails() {\r\n    let payload = {\r\n      fromDate: this.startDate,\r\n      toDate: this.endDate,\r\n      storeId: [this.floorData?.storeId],\r\n      clientId: \"11\",\r\n      valueType: \"average\",\r\n      nob: true,\r\n      featureConfigs: {\r\n        open: \"00:00:00\",\r\n        close: \"23:59:59\",\r\n        billableCalculation: \"footfall-count\",\r\n        conversionCalculation: \"footfall-count\",\r\n        missedOpportunityCalculation: \"engagers-conversion\",\r\n      },\r\n      dateType: this.dataType,\r\n    };\r\n    this.apiService\r\n      .getFootfallDetails(payload)\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        finalize(() => (this.isFootfallLoading = false)),\r\n      )\r\n      .subscribe((res: any) => {\r\n        this.isFootfallLoading = true;\r\n        if (res.code == 200) {\r\n          const footfallRaw = res.data?.zones_footfall ?? [];\r\n          this.cardData = res.data?.card ?? [];\r\n\r\n          const rankMap = new Map<number, number>();\r\n\r\n          footfallRaw\r\n            .sort((a: any, b: any) => b.footfall_count - a.footfall_count)\r\n            .forEach((item: any) => {\r\n              if (!rankMap.has(item.footfall_count)) {\r\n                rankMap.set(item.footfall_count, rankMap.size + 1);\r\n              }\r\n            });\r\n\r\n          this.footfallList = footfallRaw.map((item: any) => {\r\n            const rank = rankMap.get(item.footfall_count)!;\r\n            const colorIndex = Math.min(\r\n              rank - 1,\r\n              FOOTFALL_HEATMAP_COLORS.length - 1,\r\n            );\r\n\r\n            return {\r\n              ...item,\r\n              fixtureNumber: this.getFixtureNumber(item.zone_name),\r\n              footfallRank: rank,\r\n              heatmapColor: FOOTFALL_HEATMAP_COLORS[colorIndex],\r\n            };\r\n          });\r\n\r\n          const footfallByFixture = new Map<number, any>();\r\n\r\n          this.footfallList.forEach((item: any) => {\r\n            if (item.fixtureNumber != null) {\r\n              footfallByFixture.set(item.fixtureNumber, item);\r\n            }\r\n          });\r\n\r\n          const allFixtures = [\r\n            ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n            ...this.floorData?.centerFixture,\r\n          ];\r\n\r\n          for (const fixture of allFixtures) {\r\n            const footfall = footfallByFixture.get(fixture.fixtureNumber);\r\n\r\n            fixture.footfallCount = footfall?.footfall_count ?? 0;\r\n            fixture.footfallRank = footfall?.footfallRank ?? null;\r\n            fixture.heatmapColor = footfall?.heatmapColor ?? null;\r\n          }\r\n\r\n          this.footfallList.forEach((ele: any) => {\r\n            ele[\"fixtureDetails\"] = allFixtures.find(\r\n              (fix: any) => fix.fixtureNumber == ele.fixtureNumber,\r\n            );\r\n          });\r\n\r\n          this.renderFloor();\r\n        }\r\n      });\r\n  }\r\n\r\n  private getFixtureNumber(zoneName: string): number | null {\r\n    const match = zoneName?.match(/\\d+/);\r\n    return match ? Number(match[0]) : null;\r\n  }\r\n\r\n  getStoreEngagers() {\r\n    this.engagersList = null;\r\n    this.isEngagersLoading = true;\r\n    let payload = {\r\n      from_date: this.startDate,\r\n      to_date: this.endDate,\r\n      store_name: this.floorData?.storeName,\r\n    };\r\n    this.apiService\r\n      .getStoreEngagers(payload)\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        finalize(() => {\r\n          this.isEngagersLoading = false;\r\n        }),\r\n      )\r\n      .subscribe((res: any) => {\r\n        if (res && res?.code == 200) {\r\n          this.engagersList = res.data ?? {};\r\n        }\r\n      });\r\n  }\r\n\r\n  get topThreeFootfall() {\r\n    return this.footfallList.slice(0, 3);\r\n  }\r\n\r\n  get topEngagers() {\r\n    return this.engagersList[\"Top Engaged\"].slice(0, 3);\r\n  }\r\n\r\n  get leastEngagers() {\r\n    return this.engagersList[\"Least Engaged\"].slice(0, 3);\r\n  }\r\n\r\n  get nonEngagers() {\r\n    return this.engagersList[\"Non Engaged\"].slice(0, 3);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"floorData\"]?.currentValue) {\r\n      this.floorData = changes[\"floorData\"].currentValue;\r\n\r\n      if (this.floorData?.floorChange) {\r\n        this.onClickClose();\r\n        this.renderFloor();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 1000,\r\n      height: 700,\r\n    });\r\n    this.setupZoomHandlers();\r\n\r\n    if (this.floorData) {\r\n      this.renderFloor();\r\n    }\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n      height: container.clientHeight - 80,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  async renderFloor() {\r\n    this.canvas?.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n          L ${topX + topWidth - radius} ${topY} \r\n          Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n          L ${topX + topWidth} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + innerBoxHeight} \r\n          L ${topX} ${topY + radius} \r\n          Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY} \r\n      L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n      Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n        topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n      L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n      Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n        secondBoxY + innerBoxHeight - radius\r\n      } \r\n      L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig.length;\r\n\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n          L ${midX + midWidth - radius} ${firstBoxY} \r\n          Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n            firstBoxY + radius\r\n          } \r\n          L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + boxHeight} \r\n          L ${midX} ${firstBoxY + radius} \r\n          Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: \"#EAF8FF\",\r\n        stroke: \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        strokeWidth: 0.27,\r\n        stroke: \"#cecece\",\r\n        fill: \"#ffffff\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n      shelves.push(shelf, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          strokeWidth: 0.27,\r\n          stroke: \"#cecece\",\r\n          fill: \"#ffffff\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        const text =\r\n          fixtureData.shelfConfig[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#1D2939\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        const hasImproper = shelvesInGroup.some(\r\n          (s: any) => s?.compliance === \"improper\",\r\n        );\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const isFirst = j === 0;\r\n          const isLast = j === shelvesInGroup.length - 1;\r\n\r\n          const fillColor = fixtureData?.heatmapColor?.bg ?? \"#ffffff\";\r\n          const borderColor = fixtureData?.heatmapColor?.border ?? \"#cecece\";\r\n\r\n          const pathData = [\r\n            `M ${midX} ${boxY} L ${midX} ${boxY + boxHeight}`,\r\n            `M ${midX + midWidth} ${boxY} L ${midX + midWidth} ${\r\n              boxY + boxHeight\r\n            }`,\r\n            isFirst ? `M ${midX} ${boxY} L ${midX + midWidth} ${boxY}` : \"\",\r\n            isLast\r\n              ? `M ${midX} ${boxY + boxHeight} L ${midX + midWidth} ${\r\n                  boxY + boxHeight\r\n                }`\r\n              : \"\",\r\n          ].join(\" \");\r\n\r\n          const fillRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            fill: fillColor,\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          const borderPath = new fabric.Path(pathData, {\r\n            stroke: borderColor,\r\n            strokeWidth: 0.7,\r\n            fill: \"\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          shelves.push(fillRect, borderPath);\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#1D2939\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"transparent\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const bottomHeight = (3 / 100) * height;\r\n    const lastBoxExtraHeight = this.verticalMargin + bottomHeight;\r\n    const lastBoxHeight = boxHeight + lastBoxExtraHeight;\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY} \r\n          L ${midX + midWidth} ${lastBoxY + lastBoxHeight - radius} \r\n          Q ${midX + midWidth} ${lastBoxY + lastBoxHeight} ${\r\n            midX + midWidth - radius\r\n          } ${lastBoxY + lastBoxHeight} \r\n          L ${midX + radius} ${lastBoxY + lastBoxHeight} \r\n          Q ${midX} ${lastBoxY + lastBoxHeight} ${midX} ${\r\n            lastBoxY + lastBoxHeight - radius\r\n          } \r\n          L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: \"#EAF8FF\",\r\n        stroke: \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const footfallIconSvg = `<svg width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M0.25 8.16288H3V8.78788C3 9.15255 2.85513 9.50229 2.59727 9.76015C2.33941 10.018 1.98967 10.1629 1.625 10.1629C1.26033 10.1629 0.910591 10.018 0.652728 9.76015C0.394866 9.50229 0.25 9.15255 0.25 8.78788V8.16288ZM2.25 2.22288C3.25 2.22288 3.75 3.66288 3.75 4.66288C3.75 5.16288 3.5 5.66288 3.25 6.41288L3 7.16288H0.25C0.25 6.66288 0 5.91288 0 4.66288C0 3.41288 0.999 2.22288 2.25 2.22288ZM8.277 6.21188L8.1685 6.82738C8.10117 7.18269 7.89656 7.49717 7.59901 7.70271C7.30146 7.90824 6.93492 7.98827 6.57878 7.92547C6.22263 7.86268 5.90557 7.6621 5.69626 7.3672C5.48695 7.07229 5.40225 6.7068 5.4605 6.34988L5.5685 5.73488L8.277 6.21188ZM7.339 0.0153812C8.571 0.232381 9.348 1.57788 9.131 2.80888C8.914 4.03988 8.5375 4.73488 8.451 5.22738L5.7425 4.74988L5.6265 3.96788C5.5105 3.18588 5.3515 2.64988 5.438 2.15788C5.6115 1.17288 6.354 -0.158119 7.339 0.0153812Z\" fill=\"#009BF3\"/>\r\n</svg>`;\r\n\r\n    const loadedFootfallSvg: any =\r\n      await fabric.loadSVGFromString(footfallIconSvg);\r\n    const footfallIcon = fabric.util.groupSVGElements(\r\n      loadedFootfallSvg.objects,\r\n      loadedFootfallSvg.options,\r\n    ) as fabric.Group;\r\n\r\n    const iconTargetHeight = Math.min(8, lastBoxHeight * 0.5);\r\n    const iconScale =\r\n      (footfallIcon.height ? iconTargetHeight / footfallIcon.height : 1) || 1;\r\n    footfallIcon.scale(iconScale);\r\n\r\n    const footfallText = new fabric.Text(`${fixtureData?.footfallCount ?? 0}`, {\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#009BF3\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const rankValue = fixtureData?.footfallRank;\r\n    const hasRank = rankValue != null && rankValue !== \"NA\";\r\n    const rankCircleSize = Math.min(16, lastBoxHeight * 0.8);\r\n    // const rankFill = fixtureData?.heatmapColor?.bg ?? \"transparent\";\r\n    const rankFill = \"transparent\";\r\n    const rankStroke = \"#6BCAFF\";\r\n    const rankGroup = hasRank\r\n      ? new fabric.Group(\r\n          [\r\n            new fabric.Circle({\r\n              radius: rankCircleSize / 2,\r\n              fill: rankFill,\r\n              stroke: rankStroke,\r\n              strokeWidth: 1.5,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              selectable: false,\r\n              evented: false,\r\n            }),\r\n            new fabric.Text(`#${rankValue}`, {\r\n              fontSize: 6,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"#009BF3\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              selectable: false,\r\n              evented: false,\r\n            }),\r\n          ],\r\n          {\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        )\r\n      : null;\r\n\r\n    const gap = 3;\r\n    const rankGap = 6;\r\n    const iconWidth = footfallIcon.getScaledWidth();\r\n    const textWidth = footfallText.width ?? 0;\r\n    const rankWidth = rankGroup ? rankGroup.getScaledWidth() : 0;\r\n    const totalWidth =\r\n      iconWidth + gap + textWidth + (rankGroup ? rankGap + rankWidth : 0);\r\n\r\n    footfallIcon.set({\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: -totalWidth / 2 + iconWidth / 2,\r\n      top: 0,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    footfallText.set({\r\n      left: -totalWidth / 2 + iconWidth + gap + textWidth / 2,\r\n      top: 0,\r\n    });\r\n\r\n    if (rankGroup) {\r\n      rankGroup.set({\r\n        left:\r\n          -totalWidth / 2 +\r\n          iconWidth +\r\n          gap +\r\n          textWidth +\r\n          rankGap +\r\n          rankWidth / 2,\r\n        top: 0,\r\n      });\r\n    }\r\n\r\n    const lastBoxText = new fabric.Group(\r\n      rankGroup\r\n        ? [footfallIcon, footfallText, rankGroup]\r\n        : [footfallIcon, footfallText],\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + lastBoxHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        selectable: false,\r\n        evented: false,\r\n      },\r\n    );\r\n\r\n    // const lastBoxText = new fabric.Textbox(\r\n    //   `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n    //   {\r\n    //     left: midX + midWidth / 2,\r\n    //     top: lastBoxY + boxHeight / 2,\r\n    //     fontSize: 5,\r\n    //     fontFamily: \"Inter\",\r\n    //     fontWeight: \"600\",\r\n    //     fill: \"#101828\",\r\n    //     originX: \"center\",\r\n    //     originY: \"center\",\r\n    //     textAlign: \"center\",\r\n    //     width: midWidth,\r\n    //     height: boxHeight,\r\n    //   },\r\n    // );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        hasControls: false,\r\n        lockRotation: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      setTimeout(() => {\r\n        this.resizeCanvas();\r\n        this.fitCanvasToLayoutAnimated();\r\n      }, 300);\r\n      this.highlightFixture(target);\r\n      this.selectFixture(target);\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  selectFixture(target: any, targetProduct?: any) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        taskType: target.taskType,\r\n      };\r\n\r\n      let fixtureData = null;\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n        fixtureData = wall?.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        fixtureData = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n      }\r\n\r\n      if (!fixtureData) {\r\n        this.selectedFixtureData = null;\r\n        this.selectedFixture.fixtureData = null;\r\n        return;\r\n      }\r\n\r\n      this.selectedFixtureData = {\r\n        ...fixtureData,\r\n        revisionId: this.floorData.revisionId,\r\n        targetProduct,\r\n      };\r\n\r\n      if (this.selectedFixtureData.header?.label != \"CL\") {\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      } else {\r\n        this.selectedFixture.fixtureData = null;\r\n      }\r\n    }\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  calcMerchCompliancePercentage() {\r\n    const allFixtures = [\r\n      ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n      ...this.floorData?.centerFixture,\r\n    ];\r\n\r\n    const allShelves = allFixtures.flatMap((f: any) => f.shelfConfig);\r\n\r\n    const compliances = allShelves.map((s: any) => s?.compliance);\r\n\r\n    const total = compliances.length;\r\n    const properCount = compliances.filter((p) => p === \"proper\").length;\r\n    const successPercentage = (properCount / total) * 100;\r\n\r\n    return Math.round(successPercentage);\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.floorData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n    if (this.activeHighlight) {\r\n      this.canvas.remove(this.activeHighlight);\r\n      this.activeHighlight = null;\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  onChangeFixture({\r\n    fixtureId,\r\n    fixtureName,\r\n    shelfId,\r\n    zone,\r\n  }: {\r\n    fixtureId: string;\r\n    fixtureName?: string;\r\n    shelfId?: string;\r\n    zone?: string;\r\n  }) {\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === fixtureId,\r\n      ) as fabric.Group | undefined;\r\n\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture, true);\r\n    this.selectFixture(actionFixture);\r\n  }\r\n\r\n  onFootfallTileClick(fixtureId?: string) {\r\n    this.scrollToCanvasCard();\r\n\r\n    if (!fixtureId) return;\r\n\r\n    this.onChangeFixture({ fixtureId });\r\n  }\r\n\r\n  onEngagementTileClick(data: any) {\r\n    this.scrollToCanvasCard();\r\n    this.onClickEngagementItem(data);\r\n  }\r\n\r\n  onClickClose() {\r\n    this.selectedFixture = null;\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n    this.removeHighlight();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  openPopup(type: any) {\r\n    const modalRef = this.ngbModal.open(AnalyticsPopupComponent, {\r\n      centered: true,\r\n      windowClass: \"merch-compliance-modal\",\r\n      size: \"lg\",\r\n    });\r\n    modalRef.componentInstance.data =\r\n      type == \"footfall\" ? this.footfallList : this.engagersList;\r\n    modalRef.componentInstance.type = type;\r\n    modalRef.componentInstance.selectable = true;\r\n\r\n    modalRef.result.then((result: any) => {\r\n      if (result) {\r\n        this.scrollToCanvasCard();\r\n        if (result?.shelfNumber) {\r\n          this.onClickEngagementItem(result);\r\n        } else {\r\n          this.onChangeFixture(result);\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  datechange(event: any) {\r\n    this.startDate = event.startDate;\r\n    this.endDate = event.endDate;\r\n    this.engagersList = null;\r\n    this.topPerformingZoneList = [];\r\n    this.getDetails();\r\n    this.selectedFixture = null;\r\n  }\r\n\r\n  private scrollToCanvasCard() {\r\n    this.containerRef?.nativeElement?.scrollIntoView({\r\n      behavior: \"smooth\",\r\n      block: \"start\",\r\n    });\r\n  }\r\n\r\n  onClickEngagementItem(data: any) {\r\n    const fixtureId = data?.fixtureId;\r\n\r\n    if (fixtureId) {\r\n      const actionFixture = this.canvas\r\n        .getObjects()\r\n        .find(\r\n          (obj: any) =>\r\n            obj.objType === \"fixture\" && obj.fixtureId === fixtureId,\r\n        ) as fabric.Group | undefined;\r\n\r\n      if (!actionFixture) return;\r\n\r\n      setTimeout(() => {\r\n        this.resizeCanvas();\r\n        this.fitCanvasToLayoutAnimated();\r\n      }, 300);\r\n\r\n      this.highlightFixture(actionFixture, true);\r\n      this.selectFixture(actionFixture, data);\r\n    }\r\n  }\r\n}\r\n","<section id=\"plano-analytics\">\r\n    <div>\r\n        <div class=\"d-flex gap-5 flex-end align-items-center\">\r\n            <lib-date-range-picker (dateChange)=\"datechange($event)\"></lib-date-range-picker>\r\n            <div class=\"metric-toggler\" (click)=\"showCard=!showCard\">\r\n                @if(showCard) {\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                            d=\"M3.33333 11.6667H8.33333M8.33333 11.6667V16.6667M8.33333 11.6667L2.5 17.5M16.6667 8.33333H11.6667M11.6667 8.33333V3.33333M11.6667 8.33333L17.5 2.5\"\r\n                            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <span class=\"ms-2\"></span> Hide Metrics\r\n                }@else {\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                            d=\"M12.5 2.5H17.5M17.5 2.5V7.5M17.5 2.5L11.6667 8.33333M7.5 17.5H2.5M2.5 17.5V12.5M2.5 17.5L8.33333 11.6667\"\r\n                            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <span class=\"ms-2\"></span> Show Metrics\r\n                }\r\n            </div>\r\n        </div>\r\n        <div class=\"row\" *ngIf=\"pageLoading\">\r\n            <div class=\"col-12 m-0\">\r\n                <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n            </div>\r\n            <div class=\"col-12\">\r\n                <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n            </div>\r\n        </div>\r\n        <div class=\"row g-3 mt-3 scale-down\" *ngIf=\"!pageLoading && showCard\">\r\n            <!-- Rank based on Footfall -->\r\n            <div class=\"w-20\">\r\n                <div class=\"card h-100\">\r\n                    <div class=\"card-body p-2\">\r\n                        @if(isFootfallLoading){\r\n                            <ng-container *ngTemplateOutlet=\"cardSkeleton\"></ng-container>\r\n                        }@else {\r\n                            <div class=\"metric-header bg-header\">\r\n                                Rank based on Footfall\r\n                            </div>\r\n                            @if(footfallList?.length) {\r\n                                <div class=\"row align-items-center mx-0 py-2 border-bottom cursor-pointer list-tile\"\r\n                                    *ngFor=\"let rankItem of topThreeFootfall; let i=index\"\r\n                                    (click)=\"onFootfallTileClick(rankItem.fixtureDetails?._id)\">\r\n                                    <div class=\"col-auto\">\r\n                                        <div class=\"rank-badge\"\r\n                                            [ngClass]=\"rankItem?.footfallRank == 1 ? 'rank-gold' : rankItem?.footfallRank == 2 ? 'rank-blue' : 'rank-purple'\">\r\n                                            <span class=\"rank-hash\">#</span><span\r\n                                                class=\"rank-num\">{{rankItem?.footfallRank}}</span>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col\">\r\n                                        <div class=\"fw-medium text-dark\">{{rankItem?.fixtureDetails?.header?.label}}\r\n                                        </div>\r\n                                        <div class=\"text-muted small d-flex align-items-center gap-1\">\r\n                                            {{ rankItem?.fixtureDetails?.productBrandName?.toString()}}\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n\r\n                                <div class=\"text-end py-1\">\r\n                                    <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                                        (click)=\"openPopup('footfall')\">\r\n                                        View all\r\n                                    </a>\r\n                                </div>\r\n                            }@else {\r\n                                <div\r\n                                    class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n                                    <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                                </div>\r\n                            }\r\n                        }\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Top Engaged -->\r\n            <div class=\"w-20\">\r\n                <div class=\"card h-100\">\r\n                    <div class=\"card-body p-2\">\r\n                        @if(isEngagersLoading){\r\n                            <ng-container *ngTemplateOutlet=\"cardSkeleton\"></ng-container>\r\n                        }@else {\r\n                            <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n                                <span>Top Engaged</span>\r\n                                <span>Count</span>\r\n                            </div>\r\n                            @if(engagersList?.['Top Engaged']?.length) {\r\n                                <div class=\"row align-items-center py-2 border-bottom cursor-pointer list-tile\"\r\n                                    *ngFor=\"let top of topEngagers\" (click)=\"onEngagementTileClick(top)\">\r\n                                    <div class=\"col-auto\">\r\n                                        <img [src]=\"top?.imageUrl ? top.imageUrl : cdnUrl+'fixtureImage/imagenotfound.png'\"\r\n                                            alt=\"Product\" class=\"rounded\">\r\n                                    </div>\r\n                                    <div class=\"col\">\r\n                                        <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n                                        <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col-auto\">\r\n                                        <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n                                    </div>\r\n                                </div>\r\n\r\n                                <div class=\"text-end py-1\">\r\n                                    <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                                        (click)=\"openPopup('Top Engaged')\">\r\n                                        View all\r\n                                    </a>\r\n                                </div>\r\n                            }@else {\r\n                                <div\r\n                                    class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n                                    <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                                </div>\r\n                            }\r\n                        }\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Least Engaged -->\r\n            <div class=\"w-20\">\r\n                <div class=\"card h-100\">\r\n                    <div class=\"card-body p-2\">\r\n                        @if(isEngagersLoading){\r\n                            <ng-container *ngTemplateOutlet=\"cardSkeleton\"></ng-container>\r\n                        }@else {\r\n                            <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n                                <span>Least Engaged</span>\r\n                                <span>Count</span>\r\n                            </div>\r\n\r\n                            @if(engagersList?.['Least Engaged']?.length) {\r\n                                <div class=\"row align-items-center py-2 border-bottom cursor-pointer list-tile\"\r\n                                    *ngFor=\"let least of leastEngagers\" (click)=\"onEngagementTileClick(least)\">\r\n                                    <div class=\"col-auto\">\r\n                                        <img [src]=\"least?.imageUrl ? least.imageUrl : cdnUrl+'fixtureImage/imagenotfound.png'\"\r\n                                            alt=\"Product\" class=\"rounded\">\r\n                                    </div>\r\n                                    <div class=\"col\">\r\n                                        <div class=\"fw-medium text-dark small\">{{least?.Brandname ?? ''}}</div>\r\n                                        <div class=\"text-muted\" style=\"font-size: 12px;\">\r\n                                            {{least?.productBrandName ?? ''}}\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col-auto\">\r\n                                        <span class=\"fw-medium text-dark\">{{least?.count ?? 0}}</span>\r\n                                    </div>\r\n                                </div>\r\n\r\n                                <div class=\"text-end py-1\">\r\n                                    <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                                        (click)=\"openPopup('Least Engaged')\">View all</a>\r\n                                </div>\r\n                            }@else {\r\n                                <div\r\n                                    class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n                                    <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                                </div>\r\n                            }\r\n                        }\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Non-Engaged -->\r\n            <div class=\"w-20\">\r\n                <div class=\"card h-100\">\r\n                    <div class=\"card-body p-2\">\r\n                        @if(isEngagersLoading){\r\n                            <ng-container *ngTemplateOutlet=\"cardSkeleton\"></ng-container>\r\n                        }@else {\r\n                            <div class=\"metric-header bg-header\">\r\n                                Non-Engaged\r\n                            </div>\r\n\r\n                            @if(engagersList?.['Non Engaged']?.length) {\r\n                                <div class=\"row align-items-center py-2 border-bottom cursor-pointer list-tile\"\r\n                                    *ngFor=\"let non of nonEngagers\" (click)=\"onEngagementTileClick(non)\">\r\n                                    <div class=\"col-auto\">\r\n                                        <img [src]=\"non?.imageUrl ? non.imageUrl : cdnUrl+'fixtureImage/imagenotfound.png'\"\r\n                                            alt=\"Product\" class=\"rounded\">\r\n                                    </div>\r\n                                    <div class=\"col\">\r\n                                        <div class=\"fw-medium text-dark small\">{{non.Brandname}}</div>\r\n                                        <div class=\"text-muted\" style=\"font-size: 12px;\">{{non?.productBrandName ?? ''}}\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n\r\n                                <div class=\"text-end py-1\">\r\n                                    <a class=\"text-primary text-decoration-underline cursor-pointer\"\r\n                                        (click)=\"openPopup('Non Engaged')\">\r\n                                        View all\r\n                                    </a>\r\n                                </div>\r\n                            }@else {\r\n                                <div\r\n                                    class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n                                    <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n                                </div>\r\n                            }\r\n                        }\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footfall & Conversion Metrics -->\r\n            <div class=\"w-20\">\r\n                <div class=\"card h-100\">\r\n                    @if(isFootfallLoading){\r\n                        <ng-container *ngTemplateOutlet=\"cardSkeleton\"></ng-container>\r\n                    }@else {\r\n                        @if(cardData?.Footfall?.count) {\r\n                            <div class=\"card-body p-2\">\r\n                                <!-- Footfall Section -->\r\n                                <div class=\"mb-3\">\r\n                                    <div class=\"metric-header\">\r\n                                        <span class=\"fw-semibold\">Avg Footfall</span>\r\n                                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n                                            <path d=\"M3.33333 8H12.6667M12.6667 8L8 3.33333M12.6667 8L8 12.6667\"\r\n                                                stroke=\"#101828\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </svg>\r\n                                        <span class=\"fw-semibold\">Conversion</span>\r\n                                    </div>\r\n\r\n                                    <div class=\"d-flex gap-3 mt-2\">\r\n                                        <!-- Time period selector -->\r\n                                        <div class=\"time-selector\">\r\n                                            <div class=\"time-option\" [ngClass]=\"dataType == 'daily' ? 'active' : ''\"\r\n                                                (click)=\"dataType = 'daily';getFootfallDetails()\">1D</div>\r\n                                            <div class=\"time-option\" [ngClass]=\"dataType == 'weekly' ? 'active':''\"\r\n                                                (click)=\"dataType = 'weekly';getFootfallDetails()\">1W</div>\r\n                                            <div class=\"time-option\" [ngClass]=\"dataType == 'monthly' ? 'active' : ''\"\r\n                                                (click)=\"dataType = 'monthly';getFootfallDetails()\">1M</div>\r\n                                        </div>\r\n\r\n                                        <!-- Metrics -->\r\n                                        <div class=\"flex-fill\">\r\n                                            <div class=\"d-flex justify-content-between mb-2\">\r\n                                                <h2 class=\"mb-0\">{{cardData?.Footfall?.count}}</h2>\r\n                                                <h2 class=\"mb-0\">{{cardData?.Conversion?.count}}<span\r\n                                                        class=\"text-muted\">%</span></h2>\r\n                                            </div>\r\n\r\n                                            <div class=\"d-flex gap-2\">\r\n                                                <div class=\"d-flex align-items-center gap-1 small\"\r\n                                                    [ngClass]=\"!cardData?.Footfall?.PreviousVariation ? 'text-danger' : 'text-success'\">\r\n                                                    <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                        style=\"transform: rotate(180deg);\"\r\n                                                        *ngIf=\"!cardData?.Footfall?.PreviousVariation\">\r\n                                                        <path\r\n                                                            d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                            stroke=\"#D92D20\" stroke-width=\"1.2052\"\r\n                                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                    <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                        *ngIf=\"cardData?.Footfall?.PreviousVariation\">\r\n                                                        <path\r\n                                                            d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                            stroke=\"#039855\" stroke-width=\"1.2052\"\r\n                                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                    <span\r\n                                                        class=\"fw-semibold\">{{cardData?.Footfall?.PreviousData}}%</span>\r\n                                                    <span class=\"text-muted\">vs Prev\r\n                                                        {{dataType == 'daily' ? 'day' : dataType == 'monthly' ? 'month' : 'week'}}</span>\r\n                                                </div>\r\n\r\n                                                <div class=\"d-flex align-items-center gap-1 small\"\r\n                                                    [ngClass]=\"!cardData?.Conversion?.PreviousVariation ? 'text-danger' : 'text-success'\">\r\n                                                    <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                        style=\"transform: rotate(180deg);\"\r\n                                                        *ngIf=\"!cardData?.Conversion?.PreviousVariation\">\r\n                                                        <path\r\n                                                            d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                            stroke=\"#D92D20\" stroke-width=\"1.2052\"\r\n                                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                    <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                        *ngIf=\"cardData?.Conversion?.PreviousVariation\">\r\n                                                        <path\r\n                                                            d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                            stroke=\"#039855\" stroke-width=\"1.2052\"\r\n                                                            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                                    </svg>\r\n                                                    <span\r\n                                                        class=\"fw-semibold\">{{cardData?.Conversion?.PreviousData}}%</span>\r\n                                                </div>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n\r\n                                <!-- Avg Dwell Time Section -->\r\n                                <div>\r\n                                    <div class=\"metric-header\">\r\n                                        <span class=\"fw-semibold\">Avg Dwell time</span>\r\n                                    </div>\r\n\r\n                                    <div class=\"mt-2\">\r\n                                        <h2 class=\"mb-1\">{{cardData?.avgDwell?.count}} <span\r\n                                                class=\"text-muted fs-5\">mins</span></h2>\r\n\r\n                                        <div class=\"d-flex align-items-center gap-1 small\"\r\n                                            [ngClass]=\"!cardData?.avgDwell?.PreviousVariation ? 'text-danger' : 'text-success'\">\r\n                                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                style=\"transform: rotate(180deg);\"\r\n                                                *ngIf=\"!cardData?.avgDwell?.PreviousVariation\">\r\n                                                <path\r\n                                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                    stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                                    stroke-linejoin=\"round\" />\r\n                                            </svg>\r\n                                            <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\"\r\n                                                *ngIf=\"cardData?.avgDwell?.PreviousVariation\">\r\n                                                <path\r\n                                                    d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\"\r\n                                                    stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\"\r\n                                                    stroke-linejoin=\"round\" />\r\n                                            </svg>\r\n                                            <span class=\"fw-semibold\">{{cardData?.avgDwell?.PreviousData}}%</span>\r\n                                            <span class=\"text-muted\">vs Prev\r\n                                                {{dataType == 'daily' ? 'day' : dataType == 'monthly' ? 'month' : 'week'}}</span>\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        }@else {\r\n                            <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n                                <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n\r\n                            </div>\r\n                        }\r\n                    }\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"mt-3\">\r\n            <div id=\"body\" class=\"row\">\r\n                <div class=\"col overflow-hidden position-relative compliance-canvas\">\r\n                    <div id=\"canvas-card\" class=\"w-100 position-relative\" #complianceCanvasContainer>\r\n                        <div class=\"d-flex justify-content-between gap-4 w-100\">\r\n                            <div class=\"d-flex gap-3 align-items-center\">\r\n                                <span class=\"heatmap-txt\">High</span>\r\n\r\n                                <svg width=\"452\" height=\"39\" viewBox=\"0 0 452 39\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\" style=\"height: 18px; width: auto;\">\r\n                                    <rect width=\"452\" height=\"39\" rx=\"6\" fill=\"url(#paint0_linear_6676_185821)\" />\r\n                                    <defs>\r\n                                        <linearGradient id=\"paint0_linear_6676_185821\" x1=\"0\" y1=\"19.5\" x2=\"452\"\r\n                                            y2=\"19.5\" gradientUnits=\"userSpaceOnUse\">\r\n                                            @for (color of footfallHeatmapLegendColors; track $index) {\r\n                                                <stop\r\n                                                    [attr.offset]=\"($index / (footfallHeatmapLegendColors.length - 1)) * 100 + '%'\"\r\n                                                    [attr.stop-color]=\"color\" />\r\n                                            }\r\n                                        </linearGradient>\r\n                                    </defs>\r\n                                </svg>\r\n\r\n                                <span class=\"heatmap-txt\">Low Footfall</span>\r\n                            </div>\r\n\r\n                            <div class=\"d-flex gap-3 align-items-center\">\r\n                                <!-- Rotate Button -->\r\n                                <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\"\r\n                                    (click)=\"rotateCanvas(canvas,90)\">\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n                                        fill=\"none\">\r\n                                        <path\r\n                                            d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                                            fill=\"#1D2939\" />\r\n                                        <path\r\n                                            d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                                            stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                </button>\r\n\r\n                                <!-- Download Button -->\r\n                                <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\"\r\n                                    (click)=\"downloadCanvas()\">\r\n                                    <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n                                        xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\"\r\n                                        stroke-width=\"0.24000000000000005\">\r\n                                        <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                                        <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n                                            stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n                                        <g id=\"SVGRepo_iconCarrier\">\r\n                                            <path\r\n                                                d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                                                fill=\"#1D2939\"></path>\r\n                                            <path\r\n                                                d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                                                fill=\"#1D2939\"></path>\r\n                                        </g>\r\n                                    </svg>\r\n                                </button>\r\n                            </div>\r\n                        </div>\r\n                        <canvas id=\"base-canvas\" #complianceBaseCanvas></canvas>\r\n                    </div>\r\n                </div>\r\n\r\n                <div [ngClass]=\"{'d-none':!selectedFixture?.fixtureData}\"\r\n                    class=\"col bg-white rounded p-3 fixture-overview\">\r\n                    <lib-fixture-analytics [fixtureDetails]=\"selectedFixture?.fixtureData\" (onClose)=\"onClickClose()\"\r\n                        (changeFixture)=\"onChangeFixture($event)\" [floorData]=\"floorData\" [startDate]=\"startDate\"\r\n                        [endDate]=\"endDate\" [dataType]=\"dataType\"></lib-fixture-analytics>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <ng-template #headerSkeleton>\r\n        <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n            <div class=\"shimmer w-100 p-4 rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke mt-0 animate title\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n\r\n    <ng-template #cardSkeleton>\r\n        <div id=\"card-skeleton\"\r\n            class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n            <div class=\"shimmer w-100 p-4 rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke mt-0 animate title\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer w-100 p-4 rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n\r\n    <ng-template #skeletonLoader>\r\n        <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden m-0\">\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from \"@angular/core\";\r\nimport { FormControl } from \"@angular/forms\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  firstValueFrom,\r\n  lastValueFrom,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { CadSourceService } from \"../../../services/cad-source.service\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { Location } from \"@angular/common\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-details-parent\",\r\n  templateUrl: \"./plano-details-parent.component.html\",\r\n  styleUrl: \"./plano-details-parent.component.scss\",\r\n})\r\nexport class PlanoDetailsParentComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  planoData: any;\r\n  floorData: any;\r\n\r\n  selectedFloorId = new FormControl(\"\");\r\n  cdnUrl: string;\r\n\r\n  isPageLoading: boolean = true;\r\n  isReLoading: boolean = false;\r\n  isRolloutPending: boolean = false;\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  planoBriefDetails: PlanoBriefDetails = {\r\n    planoId: \"\",\r\n    floorId: \"\",\r\n    totalFixtures: 0,\r\n    floorLastUpdated: \"\",\r\n    floorPublishedBy: \"\",\r\n    planoStatus: \"\",\r\n    merchCompliancePercentage: 0,\r\n    lastMerchCompliancePercentage: 0,\r\n    lastMerchComplianceCheck: null,\r\n    merchStatus: null,\r\n    missedCount: 0,\r\n    misplacedCount: 0,\r\n    productCount: 0,\r\n    storeName:''\r\n  };\r\n\r\n  selectedTab: TabType = \"overview\";\r\n  storeList: any = [];\r\n  selectedStoreName: any;\r\n  isShowCompliance: boolean = false;\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private location: Location,\r\n    private pageInfo: PageInfoService,\r\n    public cadSource: CadSourceService,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  openSourceCad() {\r\n    const storeName = this.floorData?.storeName ?? this.planoData?.storeName;\r\n    this.cadSource.open(storeName, this.floorData?.cadFiles);\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        filter((data) => !!data), // Filtering null/undefined.\r\n        distinctUntilChanged(), // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe({\r\n        next: async (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string,\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n          // await this.getVmsList();\r\n          const params = this.route.snapshot.queryParams;\r\n          if (params?.tab) {\r\n            this.selectedTab = params?.tab;\r\n          }\r\n          if (params?.planoId && params.floorId) {\r\n            this.planoBriefDetails.planoId = params.planoId;\r\n            this.planoBriefDetails.floorId = params.floorId;\r\n            this.planoBriefDetails.storeName = params.storeName;\r\n            // this.onClickReload();\r\n            this.getStoreFixtures(params.planoId);\r\n            this.getStoreList(params.planoId);\r\n            this.selectedFloorId.valueChanges.subscribe((id) => {\r\n              this.floorData = null;\r\n              this.floorData = structuredClone(\r\n                this.planoData?.floors?.find((floor: any) => floor._id === id),\r\n              );\r\n              this.floorData.storeName = this.planoData.storeName;\r\n              this.floorData.floorChange = true;\r\n              this.planoBriefDetails.floorLastUpdated = this.floorData.createdAt ?? this.floorData.lastUpdate;\r\n              this.planoBriefDetails.floorPublishedBy = this.floorData.createdByName ?? \"\";\r\n              this.planoBriefDetails.floorId = this.floorData._id;\r\n              const newParams = new URLSearchParams(window.location.search);\r\n              newParams.set(\"planoId\", this.floorData.planoId);\r\n              newParams.set(\"floorId\", this.floorData._id);\r\n\r\n              this.location.replaceState(\r\n                window.location.pathname,\r\n                newParams.toString(),\r\n              );\r\n              this.selectedFloorId.setValue(this.floorData._id, {\r\n                emitEvent: false,\r\n              });\r\n\r\n              this.getLayoutRolloutStatus();\r\n              this.getStoreComplianceDetails();\r\n            });\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(this.planoData?.storeName);\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/store-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  async getStoreFixtures(storeId?: string) {\r\n    this.isPageLoading = true;\r\n    let data = {\r\n      planoId: this.planoBriefDetails.planoId,\r\n      floorId: this.planoBriefDetails.floorId,\r\n      clientId: this.clientId,\r\n    };\r\n    this.apiService\r\n      .getStorePlano(data)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.length) {\r\n            this.isPageLoading = false;\r\n            return;\r\n          }\r\n          this.planoData = structuredClone(res.data[0]);\r\n          this.isShowCompliance = this.planoData.storeId === \"11-2793\";\r\n          this.setPageData();\r\n\r\n          if (this.planoBriefDetails.floorId) {\r\n            this.floorData = structuredClone(\r\n              res.data[0].floors.find(\r\n                (floor: any) => floor?._id === this.planoBriefDetails.floorId,\r\n              ),\r\n            );\r\n          } else {\r\n            this.floorData = structuredClone(res.data[0].floors[0]);\r\n          }\r\n\r\n          this.floorData.storeName = this.planoData.storeName;\r\n          this.floorData.storeId = this.planoData.storeId;\r\n          // this.floorData.revisionId = this.planoData.revisionId;\r\n          this.planoBriefDetails.floorLastUpdated = this.floorData.createdAt ?? this.floorData.lastUpdate;\r\n          this.planoBriefDetails.floorPublishedBy = this.floorData.createdByName ?? \"\";\r\n          this.planoBriefDetails.totalFixtures = this.getAllFixtures().length;\r\n\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n          this.getLayoutRolloutStatus();\r\n          await this.getStoreComplianceDetails();\r\n\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err: any) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  // async getVmsList() {\r\n  //   try {\r\n  //     const res: any = await lastValueFrom(\r\n  //       this.apiService.getVMNameList(this.clientId),\r\n  //     );\r\n  //     if (res?.status === \"success\") {\r\n  //       this.vmList = res?.data?.map((item: any) => {\r\n  //         return {\r\n  //           id: item._id,\r\n  //           name: item.vmName,\r\n  //           displayName: item.vmName,\r\n  //           width: item.vmWidth.value,\r\n  //           height: item.vmHeight.value,\r\n  //           type: item.vmType,\r\n  //           ...(item.vmImageUrl\r\n  //             ? { imgUrl: `${this.cdnUrl}${item.vmImageUrl}` }\r\n  //             : {}),\r\n  //         };\r\n  //       });\r\n  //     }\r\n  //   } catch (error) {\r\n  //     console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n  //   } finally {\r\n  //     this.isPageLoading = false;\r\n  //   }\r\n  // }\r\n\r\n  getLayoutRolloutStatus() {\r\n    this.apiService\r\n      .getRolloutTaskInfo({\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n      })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            const tasksInfo = res?.data?.taskDetails;\r\n            if (tasksInfo) {\r\n              this.isRolloutPending = tasksInfo.some(\r\n                (ele: any) => ele.status === \"open\" || ele.status === \"pending\",\r\n              );\r\n            } else {\r\n              this.isRolloutPending = false;\r\n            }\r\n          }\r\n        },\r\n        error: (err: any) => {\r\n          console.log(\"@@ ~ getLayoutRolloutStatus [ERR]:\", err);\r\n        },\r\n      });\r\n  }\r\n\r\n  async getStoreComplianceDetails() {\r\n    try {\r\n      const payload = {\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        storeName: this.floorData.storeName,\r\n      };\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getPlanogramComplianceDetails(payload),\r\n      );\r\n\r\n      if (res?.code == 200 && res?.status == \"success\") {\r\n        this.planoBriefDetails.lastMerchComplianceCheck = res.data.lastCheck;\r\n        this.planoBriefDetails.merchCompliancePercentage =\r\n          res.data.merchCompliance;\r\n        this.planoBriefDetails.lastMerchCompliancePercentage =\r\n          res.data.previousMerchCompliance;\r\n        this.planoBriefDetails.merchStatus = res.data.rateIncrease;\r\n        this.planoBriefDetails.missedCount = res.data.missedCount;\r\n        this.planoBriefDetails.misplacedCount = res.data.misplacedCount;\r\n        this.planoBriefDetails.productCount = res.data.productCount;\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getStoreComplianceDetails [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  onRevisionInfoChange(info: { totalFixtures: number; lastUpdated: string; publishedBy?: string; requiresRefetch?: boolean }): void {\r\n    this.planoBriefDetails.totalFixtures = info.totalFixtures;\r\n    this.planoBriefDetails.floorLastUpdated = info.lastUpdated;\r\n    this.planoBriefDetails.floorPublishedBy = info.publishedBy ?? \"\";\r\n    if (info.requiresRefetch) {\r\n      this.getStoreFixtures();\r\n    }\r\n  }\r\n\r\n  onTabChange(tab: TabType) {\r\n    this.selectedTab = tab;\r\n    this.floorData.floorChange = false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  getAllFixtures() {\r\n    return [\r\n      ...this.floorData?.layoutPolygon.flatMap((e: any) => e.fixtures),\r\n      ...this.floorData?.centerFixture,\r\n    ];\r\n  }\r\n\r\n  calcMerchCompliancePercentage() {\r\n    const allFixtures = this.getAllFixtures();\r\n\r\n    const allShelves = allFixtures.flatMap((f: any) => f.shelfConfig);\r\n\r\n    const compliances = allShelves.map((s: any) => s?.compliance);\r\n\r\n    const total = compliances.length;\r\n    const properCount = compliances.filter((p) => p === \"proper\").length;\r\n    const successPercentage = (properCount / total) * 100;\r\n\r\n    return Math.round(successPercentage);\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n        tab: this.selectedTab,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  async onClickReload(event?: MouseEvent) {\r\n    // this.isPageLoading = true;\r\n    if(event){\r\n      event.stopPropagation();\r\n    }\r\n    if (this.isReLoading) return;\r\n    this.isReLoading = true;\r\n\r\n    try {\r\n      const payload = {\r\n        clientId: this.clientId,\r\n        stores: [this.floorData.storeName],\r\n      };\r\n      const res = await lastValueFrom(\r\n        this.apiService.updateProductMapping(payload),\r\n      );\r\n\r\n      if (res) {\r\n        this.getStoreFixtures(this.planoBriefDetails.planoId);\r\n      }\r\n    } catch (error) {\r\n      console.log(\"@@ ~ onClickReload [ERR]:\", error);\r\n    } finally {\r\n      this.isReLoading = false;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  getStoreList(planoId?: string) {\r\n    this.apiService\r\n      .getPlanoStoreList(this.clientId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.storeList = res.data;\r\n            this.storeList = this.storeList.map((ele: any) => {\r\n              return { ...ele, storeName: ele.storeName.toUpperCase() };\r\n            });\r\n            if (planoId) {\r\n              this.selectedStoreName = this.storeList.find(\r\n                (ele: any) => ele.planoId.toString() == planoId.toString(),\r\n              );\r\n            }\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async onSelected(event: any) {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    this.planoBriefDetails = {\r\n      planoId: \"\",\r\n      floorId: \"\",\r\n      totalFixtures: 0,\r\n      floorLastUpdated: \"\",\r\n      floorPublishedBy: \"\",\r\n      planoStatus: \"\",\r\n      merchCompliancePercentage: 0,\r\n      lastMerchCompliancePercentage: 0,\r\n      lastMerchComplianceCheck: null,\r\n      merchStatus: null,\r\n      missedCount: 0,\r\n      misplacedCount: 0,\r\n      productCount: 0,\r\n      storeName:''\r\n    };\r\n    const newParams = new URLSearchParams(window.location.search);\r\n    newParams.set(\"planoId\", event.planoId);\r\n    newParams.set(\"floorId\", event.floorId);\r\n\r\n    this.location.replaceState(window.location.pathname, newParams.toString());\r\n    this.planoBriefDetails.planoId = event.planoId;\r\n    this.planoBriefDetails.floorId = event.floorId;\r\n    this.isRolloutPending = false;\r\n    this.selectedStoreName = event;\r\n    this.getStoreFixtures(event._id);\r\n  }\r\n}\r\n\r\ntype TabType = \"overview\" | \"merch-compliance\" | \"analytics\";\r\n\r\ninterface PlanoBriefDetails {\r\n  planoId: string;\r\n  floorId: string;\r\n  totalFixtures: number;\r\n  floorLastUpdated: string;\r\n  floorPublishedBy: string;\r\n  planoStatus: string;\r\n  merchCompliancePercentage: number;\r\n  lastMerchCompliancePercentage: number;\r\n  lastMerchComplianceCheck: string | null;\r\n  merchStatus: boolean | null;\r\n  missedCount: number | null;\r\n  misplacedCount: number | null;\r\n  productCount: number | null;\r\n  storeName: String | null;\r\n}\r\n","<section id=\"plano-details\">\r\n    <div *ngIf=\"isPageLoading\" class=\"row\">\r\n        <div class=\"col-12 m-0\">\r\n            <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n        </div>\r\n        <div class=\"col-12\">\r\n            <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n        </div>\r\n    </div>\r\n\r\n    <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n        <div id=\"header\">\r\n            <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n                <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n                    <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n                        <div class=\"d-flex gap-4 align-items-center\">\r\n                            <div class=\"d-flex\">\r\n                                <div style=\"margin-top:10px;margin-left:5px;margin-right:5px\"\r\n                                    *ngIf=\"planoData?.storeName\">\r\n                                    <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n                                </div>\r\n                                <div>\r\n                                    <lib-select-plano *ngIf=\"storeList?.length\" [idField]=\"'_id'\"\r\n                                        [selectedValues]=\"[selectedStoreName]\" [items]=\"storeList\" [multi]=false\r\n                                        searchField=\"storeName\" (selected)=\"onSelected($event)\">\r\n                                    </lib-select-plano>\r\n                                </div>\r\n                            </div>\r\n\r\n                            <lib-reactive-select *ngIf=\"planoData?.floors?.length\" [formControl]=\"selectedFloorId\"\r\n                                [idField]=\"'_id'\" [nameField]=\"'floorName'\"\r\n                                [data]=\"planoData.floors\"></lib-reactive-select>\r\n\r\n                            <div class=\"d-flex gap-2 align-items-center cursor-pointer\"\r\n                                [routerLink]=\"['/manage/planogram/manage-planogram']\" [queryParams]=\"{\r\n                                planoId: floorData?.planoId,\r\n                                floorId: floorData?._id\r\n                                }\">\r\n                                <h2 class=\"title\" style=\"color: #008edf;\">\r\n                                    Edit Plano\r\n                                </h2>\r\n                                <svg width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\"\r\n                                    xmlns=\"http://www.w3.org/2000/svg\">\r\n                                    <path\r\n                                        d=\"M8.5 2.76777H2.66667C2.22464 2.76777 1.80072 2.94336 1.48816 3.25592C1.17559 3.56848 1 3.99241 1 4.43443V16.1011C1 16.5431 1.17559 16.9671 1.48816 17.2796C1.80072 17.5922 2.22464 17.7678 2.66667 17.7678H14.3333C14.7754 17.7678 15.1993 17.5922 15.5118 17.2796C15.8244 16.9671 16 16.5431 16 16.1011V10.2678M14.75 1.51777C15.0815 1.18625 15.5312 1 16 1C16.4688 1 16.9185 1.18625 17.25 1.51777C17.5815 1.84929 17.7678 2.29893 17.7678 2.76777C17.7678 3.23661 17.5815 3.68625 17.25 4.01777L9.33333 11.9344L6 12.7678L6.83333 9.43443L14.75 1.51777Z\"\r\n                                        stroke=\"#008EDF\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                        stroke-linejoin=\"round\" />\r\n                                </svg>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"d-flex gap-4 align-items-center\">\r\n<!-- Source CAD button temporarily disabled\r\n                            <button *ngIf=\"cadSource.hasSource(floorData?.cadFiles)\" type=\"button\"\r\n                                class=\"btn btn-outline text-nowrap d-flex align-items-center gap-2\"\r\n                                ngbTooltip=\"View the source CAD drawing\" (click)=\"openSourceCad()\">\r\n                                <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                  <path d=\"M9.5 1.5H4a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5l-3.5-3.5Z\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>\r\n                                  <path d=\"M9.5 1.5V5H13M6 8.5l2 2 2-2M8 10.5V7\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg>\r\n                                Source CAD\r\n                            </button>\r\n-->\r\n\r\n                            <button ngbAccordionButton></button>\r\n                        </div>\r\n                    </div>\r\n                    <div ngbAccordionCollapse>\r\n                        @if(planoData){\r\n                            <div ngbAccordionBody>\r\n                                <ng-template>\r\n                                    <div class=\"row mx-0 gap-2\">\r\n                                        <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedTab === 'overview' }\"\r\n                                            (click)=\"onTabChange('overview')\">\r\n                                            <h5>Total fixtures</h5>\r\n                                            <h3>{{ planoBriefDetails.totalFixtures }}</h3>\r\n                                            <div class=\"d-flex align-items-center gap-2\">\r\n                                                <p>Published at:</p>\r\n                                                <p [ngbTooltip]=\"planoBriefDetails.floorPublishedBy ? 'Published by ' + planoBriefDetails.floorPublishedBy : null\">\r\n                                                    {{ planoBriefDetails.floorLastUpdated | date:\"d MMM yyyy, hh:mm a\" }}\r\n                                                </p>\r\n                                                <div *ngIf=\"isRolloutPending\" class=\"indicator reviewPending\">\r\n                                                    Rollout review pending\r\n                                                </div>\r\n                                            </div>\r\n                                        </div>\r\n                                        @if(isShowCompliance){\r\n                                            <div class=\"col filter-tab\"\r\n                                                [ngClass]=\"{ selected: selectedTab === 'merch-compliance' }\"\r\n                                                (click)=\"onTabChange('merch-compliance')\">\r\n                                                <div class=\"d-flex gap-2 align-items-center mb-2\">\r\n                                                    <h5 class=\"m-0\">Merchandise compliance</h5>\r\n                                                    <div class=\"badge inactive\">Missing: {{planoBriefDetails.missedCount }}</div>\r\n                                                    <div class=\"badge inactive \">Misplaced: {{planoBriefDetails.misplacedCount}}</div>\r\n\r\n                                                </div>\r\n                                                <h3>{{ planoBriefDetails.merchCompliancePercentage }}%</h3>\r\n                                                @if(planoBriefDetails.lastMerchComplianceCheck){\r\n                                                    <div class=\"d-flex align-items-center gap-2\">\r\n                                                        @if(planoBriefDetails.merchStatus != null){\r\n                                                            @if(planoBriefDetails.merchStatus ){\r\n\r\n                                                                <svg width=\"16\" height=\"10\" viewBox=\"0 0 16 10\"\r\n                                                                    fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                                    <path\r\n                                                                        d=\"M15.3327 0.749999L8.99935 7.08333L5.66602 3.75L0.666016 8.75M15.3327 0.749999L11.3327 0.749999M15.3327 0.749999L15.3327 4.75\"\r\n                                                                        stroke=\"#039855\" stroke-width=\"1.5\"\r\n                                                                        stroke-linecap=\"round\"\r\n                                                                        stroke-linejoin=\"round\" />\r\n                                                                </svg>\r\n\r\n                                                            }@else{\r\n\r\n                                                                <svg width=\"16\" height=\"10\" viewBox=\"0 0 16 10\"\r\n                                                                    fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                                    <path\r\n                                                                        d=\"M0.66732 8.75L7.00065 2.41667L10.334 5.75L15.334 0.75M0.66732 8.75L4.66732 8.75M0.66732 8.75L0.66732 4.75\"\r\n                                                                        stroke=\"#D92D20\" stroke-width=\"1.5\"\r\n                                                                        stroke-linecap=\"round\"\r\n                                                                        stroke-linejoin=\"round\" />\r\n                                                                </svg>\r\n\r\n                                                            }\r\n                                                            <p\r\n                                                                [ngClass]=\"{'text-success':planoBriefDetails.merchStatus,'text-danger':!planoBriefDetails.merchStatus}\">\r\n                                                                {{ planoBriefDetails.lastMerchCompliancePercentage }}%\r\n                                                            </p>\r\n                                                            <p>vs </p>\r\n                                                        }\r\n                                                        <p>Last check:</p>\r\n                                                        <p>{{ planoBriefDetails.lastMerchComplianceCheck }}</p>\r\n                                                        <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n                                                        xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                        (click)=\"onClickReload($event)\" class=\"cursor-pointer\"\r\n                                                        [ngClass]=\"{'rotate':isReLoading}\">\r\n                                                            <g clip-path=\"url(#clip0_4753_11640)\">\r\n                                                                <path\r\n                                                                    d=\"M17.25 3.00006V7.50006M17.25 7.50006H12.75M17.25 7.50006L13.77 4.23006C12.9639 3.42359 11.9667 2.83446 10.8714 2.51764C9.77607 2.20081 8.61833 2.16662 7.50621 2.41825C6.3941 2.66988 5.36385 3.19913 4.5116 3.95662C3.65935 4.71411 3.01288 5.67515 2.6325 6.75006M0.75 15.0001V10.5001M0.75 10.5001H5.25M0.75 10.5001L4.23 13.7701C5.03606 14.5765 6.03328 15.1657 7.12861 15.4825C8.22393 15.7993 9.38167 15.8335 10.4938 15.5819C11.6059 15.3302 12.6361 14.801 13.4884 14.0435C14.3407 13.286 14.9871 12.325 15.3675 11.2501\"\r\n                                                                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                                    stroke-linejoin=\"round\" />\r\n                                                            </g>\r\n                                                            <defs>\r\n                                                                <clipPath id=\"clip0_4753_11640\">\r\n                                                                    <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                                                </clipPath>\r\n                                                            </defs>\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                }@else {\r\n                                                    <div class=\"d-flex\">\r\n                                                        <p>Last check: Not scanned yet</p>\r\n                                                        <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n                                                            xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                            (click)=\"onClickReload($event)\" class=\"cursor-pointer ms-3\"\r\n                                                            [ngClass]=\"{'rotate':isReLoading}\">\r\n                                                            <g clip-path=\"url(#clip0_4753_11640)\">\r\n                                                                <path\r\n                                                                    d=\"M17.25 3.00006V7.50006M17.25 7.50006H12.75M17.25 7.50006L13.77 4.23006C12.9639 3.42359 11.9667 2.83446 10.8714 2.51764C9.77607 2.20081 8.61833 2.16662 7.50621 2.41825C6.3941 2.66988 5.36385 3.19913 4.5116 3.95662C3.65935 4.71411 3.01288 5.67515 2.6325 6.75006M0.75 15.0001V10.5001M0.75 10.5001H5.25M0.75 10.5001L4.23 13.7701C5.03606 14.5765 6.03328 15.1657 7.12861 15.4825C8.22393 15.7993 9.38167 15.8335 10.4938 15.5819C11.6059 15.3302 12.6361 14.801 13.4884 14.0435C14.3407 13.286 14.9871 12.325 15.3675 11.2501\"\r\n                                                                    stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                                    stroke-linejoin=\"round\" />\r\n                                                            </g>\r\n                                                            <defs>\r\n                                                                <clipPath id=\"clip0_4753_11640\">\r\n                                                                    <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                                                </clipPath>\r\n                                                            </defs>\r\n                                                        </svg>\r\n                                                    </div>\r\n                                                }\r\n                                            </div>\r\n                                            <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedTab === 'analytics' }\"\r\n                                                (click)=\"onTabChange('analytics')\">\r\n                                                <h5>Plano Analytics</h5>\r\n                                                <div class=\"d-flex align-items-center gap-2 mb-1\"><h3 class=\"me-2\">{{ planoBriefDetails.productCount}}</h3><p class=\"text\">Active products</p></div>\r\n                                                <div class=\"d-flex align-items-center gap-2\">\r\n                                                    <p>Last Check:</p>\r\n                                                    @if(planoBriefDetails.lastMerchComplianceCheck) {\r\n                                                        <p>{{ planoBriefDetails.lastMerchComplianceCheck}}</p>\r\n                                                    }@else {\r\n                                                        <p>Not scanned yet</p>\r\n                                                    }\r\n                                                </div>\r\n                                            </div>\r\n                                        }\r\n                                    </div>\r\n                                </ng-template>\r\n                            </div>\r\n                        }\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div *ngIf=\"!isPageLoading && planoData\" id=\"body\" class=\"mb-3\">\r\n            @if(selectedTab === 'merch-compliance'){\r\n                <merch-compliance [floorData]=\"floorData\"></merch-compliance>\r\n            }@else if(selectedTab == 'overview') {\r\n                <plano-overview [floorData]=\"floorData\" (currentRevisionInfo)=\"onRevisionInfoChange($event)\"></plano-overview>\r\n            }@else {\r\n                <lib-plano-analytics [floorData]=\"floorData\"></lib-plano-analytics>\r\n            }\r\n        </div>\r\n        <div *ngIf=\"!planoData\">\r\n            <div class=\"card d-flex flex-column justify-content-center align-items-center\" style=\"height:60vh\">\r\n                <div>\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"315\" height=\"155\" viewBox=\"0 0 315 155\" fill=\"none\">\r\n                        <path\r\n                            d=\"M103.809 47.0198C89.5458 47.02 77.983 58.5826 77.9829 72.8459C77.9829 78.7619 73.9798 85.5061 68.0638 85.5061H45.2583C30.9948 85.5061 19.4312 97.0688 19.4312 111.332C19.4312 125.596 30.9948 137.158 45.2583 137.158H183.357C200.247 137.158 216.32 123.992 233.21 123.992H299.245C303.999 123.992 307.853 120.138 307.853 115.383C307.853 110.629 303.999 106.775 299.245 106.775H211.624C209.98 106.775 208.588 105.553 208.12 103.976C207.381 101.487 209.082 98.6721 211.678 98.6721H241.909C256.172 98.6719 267.735 87.1093 267.735 72.8459C267.735 58.5827 256.172 47.02 241.909 47.0198H103.809Z\"\r\n                            fill=\"#EAECF0\" />\r\n                        <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\" transform=\"matrix(-1 0 0 1 246.602 48.8572)\"\r\n                            fill=\"#EAECF0\" />\r\n                        <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\" transform=\"matrix(-1 0 0 1 56.2979 113.282)\"\r\n                            fill=\"#6BCAFF\" />\r\n                        <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 244.965 68.8262)\"\r\n                            fill=\"#00A3FF\" />\r\n                        <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 215.689 13.5271)\"\r\n                            fill=\"#00A3FF\" />\r\n                        <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\" transform=\"matrix(-1 0 0 1 104.006 138.221)\"\r\n                            fill=\"#00A3FF\" />\r\n                        <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\" fill=\"#6BCAFF\"\r\n                            stroke=\"#00A3FF\" stroke-width=\"3\" />\r\n                        <mask id=\"path-8-inside-1_419_28888\" fill=\"white\">\r\n                            <path\r\n                                d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" />\r\n                        </mask>\r\n                        <path\r\n                            d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"\r\n                            fill=\"#6BCAFF\" />\r\n                        <path\r\n                            d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\"\r\n                            fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_419_28888)\" />\r\n                        <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\"\r\n                            stroke-width=\"3.98436\" stroke-linecap=\"round\" />\r\n                        <circle cx=\"218.205\" cy=\"70.1763\" r=\"3.29663\" fill=\"white\" />\r\n                        <circle cx=\"111.787\" cy=\"55.1663\" r=\"2.52637\" fill=\"#99DAFF\" />\r\n                        <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\" />\r\n                        <path\r\n                            d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.931 123.894 194.055 127.161 191.5 128.636C188.945 130.111 185.679 129.236 184.204 126.681L164.465 92.4932C149.446 98.6552 131.813 92.92 123.471 78.4717C114.374 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.098 38.6209 151.481 34.7041 140.05 41.3037C128.62 47.9035 124.703 62.5204 131.302 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.38 76.0987 179.297 61.4826 172.698 50.0518Z\"\r\n                            fill=\"white\" />\r\n                        <circle cx=\"153\" cy=\"57.0007\" r=\"23.8994\" transform=\"rotate(-30 153 57.0007)\" fill=\"#99DAFF\" />\r\n                        <mask id=\"path-16-inside-2_419_28888\" fill=\"white\">\r\n                            <path\r\n                                d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\" />\r\n                        </mask>\r\n                        <path\r\n                            d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\"\r\n                            stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_419_28888)\" />\r\n                        <path\r\n                            d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.931 118.894 195.055 122.161 192.5 123.636C189.945 125.111 186.679 124.236 185.204 121.681L165.465 87.4932C150.446 93.6552 132.813 87.92 124.471 73.4717C115.374 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.098 33.6209 152.481 29.7041 141.05 36.3037C129.62 42.9035 125.703 57.5204 132.302 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.38 71.0987 180.297 56.4826 173.698 45.0518Z\"\r\n                            fill=\"#00A3FF\" />\r\n                    </svg>\r\n                </div>\r\n                <div class=\"title\">\r\n                    Planogram Yet to Publish\r\n                </div>\r\n                <div class=\"lowerText\">\r\n                    <a\r\n                        href=\"/manage/planogram/manage-planogram?planoId={{planoBriefDetails.planoId}}&floorId={{planoBriefDetails.floorId}}\">{{selectedStoreName?.storeName}}</a>\r\n                    is still under verification\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <ng-template #headerSkeleton>\r\n        <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n            <div class=\"shimmer w-100 p-4 rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke mt-0 animate title\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n\r\n    <ng-template #skeletonLoader>\r\n        <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden m-0\">\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n            <div class=\"shimmer rounded\">\r\n                <div class=\"wrapper\">\r\n                    <div class=\"stroke animate link\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                    <div class=\"stroke animate description\"></div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </ng-template>\r\n</section>","import { Component, ViewChild, ElementRef, OnDestroy, AfterViewInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { lastValueFrom, Subject, takeUntil } from 'rxjs';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport * as fabric from \"fabric\";\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../functions/plano.function\";\r\n\r\ntype StoreStatus = 'pending' | 'approved' | 'skipped' | 'not_found';\r\n\r\ninterface StoreChip {\r\n  storeCode: string;\r\n  planoId: string;\r\n  status: StoreStatus;\r\n}\r\n@Component({\r\n  selector: 'lib-collection-update-ai',\r\n  templateUrl: './collection-update-ai.component.html',\r\n  styleUrl: './collection-update-ai.component.scss',\r\n  standalone: true,\r\n  imports: [CommonModule, ReactiveFormsModule],\r\n  providers: [TitleCasePipe],\r\n})\r\n\r\nexport class CollectionUpdateAiComponent implements OnDestroy, AfterViewInit {\r\n\r\n  form: FormGroup;\r\n  loading = false;\r\n\r\n  @ViewChild('beforeCanvas') beforeCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  beforeCanvas!: fabric.Canvas;\r\n  @ViewChild(\"beforeCanvasContainer\") beforeContainerRef!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('afterCanvas') afterCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  afterCanvas!: fabric.Canvas;\r\n  @ViewChild(\"afterCanvasContainer\") afterContainerRef!: ElementRef<HTMLDivElement>;\r\n  destroy$ = new Subject();\r\n  planoData: any;\r\n  floorData: any;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  cdnUrl: string;\r\n  activeHighlight: fabric.Rect | null = null;\r\n  cancelHighlightBlink = false;\r\n  storeChips: StoreChip[] = [];\r\n  selectedStore?: string;\r\n  selectedFixture: any\r\n\r\n\r\n\r\n\r\n  constructor(private fb: FormBuilder,\r\n    private apiService: StoreBuilderService,\r\n    private toastService: ToastService,\r\n    private route: ActivatedRoute,\r\n    private titleCase: TitleCasePipe,\r\n\r\n  ) {\r\n    this.form = this.fb.group({\r\n      stores: ['', Validators.required],\r\n      updateType: ['vm', Validators.required],\r\n      selectionCriteria: ['', Validators.required],\r\n      updationCriteria: ['', Validators.required],\r\n    });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.planoId) {\r\n          this.getStoreFixtures(params?.planoId);\r\n          if (params?.floorId) {\r\n            this.floorData = { _id: params?.floorId };\r\n          }\r\n        }\r\n      });\r\n\r\n    this.beforeCanvas = new fabric.Canvas(this.beforeCanvasRef?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n    });\r\n\r\n    this.afterCanvas = new fabric.Canvas(this.afterCanvasRef?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n    });\r\n\r\n\r\n    this.setupZoomHandlers(this.beforeCanvas);\r\n    this.setupZoomHandlers(this.afterCanvas);\r\n\r\n  }\r\n\r\n  setupZoomHandlers(canvas: fabric.Canvas): void {\r\n    canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  updateAiResponseFixture(fixture: any) {\r\n    let matchFound = false\r\n    for (let i = 0; i < this.floorData.layoutPolygon.length; i++) {\r\n      const element = this.floorData.layoutPolygon[i];\r\n\r\n      if (element.elementType === 'wall' && Array.isArray(element.fixtures)) {\r\n        for (let j = 0; j < element.fixtures.length; j++) {\r\n          const fx = element.fixtures[j];\r\n\r\n          if (fx._id === fixture._id) {\r\n            this.floorData.layoutPolygon[i].fixtures[j] = {\r\n              ...fixture\r\n            };\r\n            matchFound = true\r\n            this.selectedFixture = fixture\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (matchFound) return;\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture.length; i++) {\r\n      const fx = this.floorData?.centerFixture[i];\r\n\r\n      if (fx._id === fixture._id) {\r\n        this.floorData.centerFixture[i] = {\r\n          ...fixture\r\n        }\r\n        this.selectedFixture = fixture\r\n        break;\r\n      }\r\n    }\r\n\r\n\r\n  }\r\n\r\n  submitPrompt() {\r\n    if (this.form.invalid) {\r\n      this.form.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    this.loading = true;\r\n\r\n    const payload = {\r\n      ...this.form.value,\r\n      stores: [this.selectedStore]\r\n    };\r\n\r\n    this.apiService.findFixtureAi(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.loading = false;\r\n\r\n        if (res.code === 200) {\r\n          this.updateAiResponseFixture(res.data)\r\n          this.renderFloor(this.afterCanvas)\r\n\r\n\r\n          setTimeout(() => {\r\n            const actionFixture = this.afterCanvas\r\n              .getObjects()\r\n              .find(\r\n                (obj: any) => {\r\n                  return obj.objType === \"fixture\" && obj.fixtureId === res.data._id\r\n                }\r\n              ) as fabric.Group | undefined;\r\n\r\n            if (!actionFixture) return;\r\n            this.highlightFixture(this.afterCanvas, actionFixture, true);\r\n          }, 0);\r\n        }\r\n      },\r\n      error: () => {\r\n        this.loading = false;\r\n      },\r\n    });\r\n  }\r\n\r\n\r\n  async getStoreFixtures(storeId: string) {\r\n    this.loading = true;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId] })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n\r\n          this.floorData = structuredClone(res.data[0].floors[0]);\r\n\r\n          this.renderFloor(this.beforeCanvas);\r\n          this.renderFloor(this.afterCanvas);\r\n\r\n          this.loading = false;\r\n          setTimeout(() => {\r\n            this.resizeCanvas(this.beforeCanvas, this.beforeContainerRef);\r\n            this.fitCanvasToLayoutAnimated(this.beforeCanvas);\r\n\r\n            this.resizeCanvas(this.afterCanvas, this.afterContainerRef);\r\n            this.fitCanvasToLayoutAnimated(this.afterCanvas);\r\n          }, 300);\r\n        },\r\n        error: (err: any) => {\r\n          this.loading = false;\r\n          this.toastService.getErrorToast(\"Failed to fetch plano\");\r\n        },\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  resizeCanvas(canvas: fabric.Canvas, conteiner: ElementRef<HTMLDivElement>): void {\r\n    const container = conteiner.nativeElement;\r\n    canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(canvas: fabric.Canvas) {\r\n    if (!canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds(canvas);\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = canvas.getWidth();\r\n    const canvasH = canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9; // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom; // center Y\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration: 100,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  private getFullLayoutBounds(canvas: fabric.Canvas) {\r\n    const objects = canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  renderFloor(canvas: fabric.Canvas) {\r\n    this.drawInitialContent(canvas);\r\n  }\r\n\r\n  async drawInitialContent(canvas: fabric.Canvas): Promise<void> {\r\n    canvas.clear();\r\n    await this.drawLayoutElements(canvas);\r\n    // this.drawBg();\r\n  }\r\n\r\n  async drawLayoutElements(canvas: fabric.Canvas) {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = await this.drawWall(canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const a = otherElement.relativePosition.angle;\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit\r\n          );\r\n\r\n          const fixtureObj = this.drawOtherElementsWithLabel(\r\n            canvas,\r\n            x,\r\n            y,\r\n            a,\r\n            w,\r\n            h,\r\n            otherElement\r\n          );\r\n\r\n          // elementsGroup.push(fixtureObj as fabric.Group);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit\r\n      );\r\n      await this.drawFixture(\r\n        canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit\r\n      );\r\n\r\n      const fixtureObj = this.drawOtherElementsWithLabel(\r\n        canvas,\r\n        x,\r\n        y,\r\n        a,\r\n        w,\r\n        h,\r\n        otherElement\r\n      );\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${elementData.elementNumber\r\n      }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    }\r\n\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: true,\r\n      lockScalingX: isVertical,\r\n      lockScalingY: !isVertical,\r\n      // lockRotation: true,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: elementData.angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any\r\n  ) {\r\n    let fixtureColor: any;\r\n    // if ([\"fixture\", \"fixture-redo\"].includes(this.publishingState)) {\r\n    //   fixtureColor = {\r\n    //     primary:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#a5a6a8\"\r\n    //         : fixtureData.status == \"agree\"\r\n    //         ? \"#6CE9A6\"\r\n    //         : \"#51C1FF\",\r\n    //     fill:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#f3f4f8\"\r\n    //         : fixtureData.status == \"agree\"\r\n    //         ? \"#6CE9A6\"\r\n    //         : \"#EAF8FF\",\r\n    //     vmFill:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#a5a6a8\"\r\n    //         : \"#6938EF\",\r\n    //   };\r\n    // }\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n              L ${topX + topWidth - radius} ${topY} \r\n              Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n              L ${topX + topWidth} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + radius} \r\n              Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      }\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${fixtureData.associatedElementFixtureNumber\r\n        ? fixtureData.associatedElementFixtureNumber +\r\n        (fixtureData?.fixtureNumber\r\n          ? \" - FX-\" + fixtureData.fixtureNumber\r\n          : \"\")\r\n        : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${secondBoxY + innerBoxHeight - radius\r\n      } \r\n          L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n              L ${midX + midWidth - radius} ${firstBoxY} \r\n              Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${firstBoxY + radius\r\n      } \r\n              L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + radius} \r\n              Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              }\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          }\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              }\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n              Q ${midX + midWidth} ${lastBoxY + boxHeight} ${midX + midWidth - radius\r\n      } ${lastBoxY + boxHeight} \r\n              L ${midX + radius} ${lastBoxY + boxHeight} \r\n              Q ${midX} ${lastBoxY + boxHeight} ${midX} ${lastBoxY + boxHeight - radius\r\n      } \r\n              L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      }\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${fixtureData?.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      }\r\n    );\r\n\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        // hasControls: fixtureData.fixtureType === \"floor\",\r\n        // lockRotation: fixtureData.fixtureType !== \"floor\",\r\n        // lockMovementX: currentFixtureInfo?.wallDirection === 'up' || currentFixtureInfo?.wallDirection === 'down',\r\n        // lockMovementY: currentFixtureInfo?.wallDirection === 'right' || currentFixtureInfo?.wallDirection === 'left',\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      }\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(fixtureGroup);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  highlightFixture(canvas: fabric.Canvas, group: any, blink: boolean = false) {\r\n    this.removeHighlight(canvas);\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n\r\n    canvas.add(rect);\r\n    canvas.moveObjectTo(rect, canvas.getObjects().length - 1);\r\n    canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight(canvas);\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight(canvas);\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight(canvas);\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              }\r\n            );\r\n          },\r\n        }\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight(canvas: fabric.Canvas,) {\r\n    this.cancelHighlightBlink = true;\r\n\r\n    canvas.getObjects().forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        canvas.remove(obj);\r\n      }\r\n    });\r\n\r\n    this.activeHighlight = null;\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  async applyStores() {\r\n    const value = this.form.value.stores;\r\n    if (!value) return;\r\n\r\n    const codes = value\r\n      .split(',')\r\n      .map((s: string) => s.trim().toUpperCase())\r\n      .filter(Boolean);\r\n\r\n    const response: any = await lastValueFrom(\r\n      this.apiService.getPlanoId({ stores: codes })\r\n    );\r\n\r\n    const data = Array.isArray(response.data) ? response.data : [];\r\n\r\n    const foundStoreSet = new Set(\r\n      data.map((store: any) => store.storeName.toUpperCase())\r\n    );\r\n\r\n    const foundChips = data.map((store: any) => ({\r\n      storeCode: store.storeName,\r\n      status: 'pending',\r\n      planoId: store._id\r\n    }));\r\n\r\n    const notFoundChips = codes\r\n      .filter((code: string) => !foundStoreSet.has(code))\r\n      .map((code: string) => ({\r\n        storeCode: code,\r\n        status: 'not_found'\r\n      }));\r\n\r\n    this.storeChips = [...foundChips, ...notFoundChips];\r\n    const activeChip = this.storeChips.find((chip) => chip.status === 'pending')\r\n    this.selectedStore = activeChip?.storeCode\r\n    this.getStoreFixtures(activeChip!.planoId)\r\n  }\r\n\r\n  private delay(ms: number): Promise<void> {\r\n    return new Promise(resolve => setTimeout(resolve, ms));\r\n  }\r\n\r\n  async autoApprove() {\r\n    for (let i = 0; i < this.storeChips.length; i++) {\r\n      const { storeCode, status, planoId } = this.storeChips[i];\r\n      if (status === 'not_found') continue;\r\n\r\n      const planoRes: any = await lastValueFrom(this.apiService.getStoreFixtures({ id: [planoId] }))\r\n\r\n      if (!planoRes?.data?.[0]?.floors?.length) {\r\n        return;\r\n      }\r\n\r\n      this.planoData = structuredClone(planoRes.data[0]);\r\n\r\n      this.floorData = structuredClone(planoRes.data[0].floors[0]);\r\n\r\n      this.renderFloor(this.beforeCanvas);\r\n      this.renderFloor(this.afterCanvas);\r\n\r\n      this.loading = false;\r\n      setTimeout(() => {\r\n        this.resizeCanvas(this.beforeCanvas, this.beforeContainerRef);\r\n        this.fitCanvasToLayoutAnimated(this.beforeCanvas);\r\n\r\n        this.resizeCanvas(this.afterCanvas, this.afterContainerRef);\r\n        this.fitCanvasToLayoutAnimated(this.afterCanvas);\r\n      }, 100);\r\n\r\n      const payload = {\r\n        ...this.form.value,\r\n        stores: [storeCode]\r\n      };\r\n\r\n      const aiRes: any = await lastValueFrom(this.apiService.findFixtureAi(payload))\r\n\r\n      if (aiRes.code === 200) {\r\n        this.updateAiResponseFixture(aiRes.data)\r\n        this.renderFloor(this.afterCanvas)\r\n\r\n\r\n        setTimeout(() => {\r\n          const actionFixture = this.afterCanvas\r\n            .getObjects()\r\n            .find(\r\n              (obj: any) => {\r\n                return obj.objType === \"fixture\" && obj.fixtureId === aiRes.data._id\r\n              }\r\n            ) as fabric.Group | undefined;\r\n\r\n          if (!actionFixture) return;\r\n          this.highlightFixture(this.afterCanvas, actionFixture, true);\r\n        }, 0);\r\n      }\r\n\r\n      const updatePayload = {\r\n        fixtures: [this.selectedFixture]\r\n      }\r\n\r\n      await lastValueFrom(this.apiService.updateFixtureData(updatePayload))\r\n      this.storeChips[i].status = 'approved'\r\n      const activeChip = this.storeChips.find((chip) => chip.status === 'pending')\r\n      this.selectedStore = activeChip?.storeCode\r\n\r\n      await this.delay(3000);\r\n\r\n    }\r\n  }\r\n\r\n  approveStore() {\r\n    const payload = {\r\n      fixtures: [this.selectedFixture]\r\n    }\r\n\r\n    this.apiService.updateFixtureData(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res.code === 200) {\r\n          this.storeChips.find((chip) => chip.storeCode === this.selectedStore)!.status = 'approved'\r\n          const nextChip = this.storeChips.find((chip) => chip.status === 'pending')\r\n          this.selectedStore = nextChip?.storeCode\r\n          this.getStoreFixtures(nextChip!.planoId)\r\n        }\r\n      }\r\n    })\r\n  }\r\n\r\n  selectStore(chip: StoreChip) {\r\n    this.selectedStore = chip.storeCode\r\n    this.getStoreFixtures(chip.planoId)\r\n  }\r\n}\r\n","<form class=\"ai-container\" [formGroup]=\"form\" (ngSubmit)=\"submitPrompt()\">\r\n\r\n  <!-- ================= Applicable Stores ================= -->\r\n  <div class=\"field\">\r\n    <label>Applicable Stores</label>\r\n\r\n    <div class=\"d-flex gap-2 align-items-center\">\r\n      <input type=\"text\" class=\"form-control\" formControlName=\"stores\" placeholder=\"e.g. LKST345, LKST346\" />\r\n\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"applyStores()\">\r\n        Apply\r\n      </button>\r\n    </div>\r\n\r\n    <span class=\"error\" *ngIf=\"form.controls.stores.touched && form.controls.stores.invalid\">\r\n      Applicable stores is required\r\n    </span>\r\n  </div>\r\n\r\n  <!-- ================= Store Chips ================= -->\r\n  <div class=\"store-chips\" *ngIf=\"storeChips.length\">\r\n    <div (click)=\"selectStore(chip)\" class=\"store-chip\" *ngFor=\"let chip of storeChips\" [ngClass]=\"[\r\n      chip.status,\r\n      chip.storeCode === selectedStore ? 'active' : ''\r\n    ]\">\r\n      {{ chip.storeCode }}\r\n    </div>\r\n  </div>\r\n\r\n\r\n  <!-- ================= Update Type ================= -->\r\n  <div class=\"field\">\r\n    <label>Update Type</label>\r\n\r\n    <div class=\"radio-group\">\r\n      <label class=\"radio-option\">\r\n        <input type=\"radio\" formControlName=\"updateType\" value=\"vm\" />.\r\n        VM\r\n      </label>\r\n\r\n      <label class=\"radio-option\">\r\n        <input type=\"radio\" formControlName=\"updateType\" value=\"pid\" />\r\n        PID\r\n      </label>\r\n    </div>\r\n\r\n    <span class=\"error\" *ngIf=\"form.controls.updateType.touched && form.controls.updateType.invalid\">\r\n      Update type is required\r\n    </span>\r\n  </div>\r\n\r\n  <!-- ================= AI Prompt ================= -->\r\n  <div class=\"field\">\r\n    <label>AI Prompt</label>\r\n\r\n    <div class=\"row\">\r\n\r\n      <!-- Selection Criteria -->\r\n      <div class=\"col-md-6\">\r\n        <div class=\"form-group\">\r\n          <label class=\"small fw-semibold\">Selection Criteria</label>\r\n\r\n          <textarea rows=\"3\" class=\"form-control\" formControlName=\"selectionCriteria\"\r\n            placeholder=\"e.g. Select premium shades on wall fixtures\"></textarea>\r\n\r\n          <span class=\"error\"\r\n            *ngIf=\"form.controls.selectionCriteria.touched && form.controls.selectionCriteria.invalid\">\r\n            Selection criteria is required\r\n          </span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Updation Criteria -->\r\n      <div class=\"col-md-6\">\r\n        <div class=\"form-group\">\r\n          <label class=\"small fw-semibold\">Updation Criteria</label>\r\n\r\n          <textarea rows=\"3\" class=\"form-control\" formControlName=\"updationCriteria\"\r\n            placeholder=\"e.g. Move selected fixtures to mid shelves\"></textarea>\r\n\r\n          <span class=\"error\" *ngIf=\"form.controls.updationCriteria.touched && form.controls.updationCriteria.invalid\">\r\n            Updation criteria is required\r\n          </span>\r\n        </div>\r\n      </div>\r\n\r\n    </div>\r\n  </div>\r\n\r\n  <!-- ================= Submit ================= -->\r\n  <div class=\"d-flex justify-content-end mt-3\">\r\n    <button type=\"submit\" class=\"submit-btn\" [disabled]=\"loading\">\r\n      {{ loading ? 'Thinking…' : 'Submit' }}\r\n    </button>\r\n  </div>\r\n\r\n  <!-- ================= Canvases ================= -->\r\n  <div class=\"canvas-grid mt-4\">\r\n\r\n    <div class=\"canvas-box\" #beforeCanvasContainer>\r\n      <div class=\"canvas-title\">Before Update</div>\r\n      <canvas #beforeCanvas></canvas>\r\n    </div>\r\n\r\n    <div class=\"canvas-box\" #afterCanvasContainer>\r\n      <div class=\"canvas-title\">After Update</div>\r\n      <canvas #afterCanvas></canvas>\r\n    </div>\r\n\r\n  </div>\r\n\r\n  <div class=\"d-flex align-items-center justify-content-end\">\r\n    <!-- ================= Auto Approve ================= -->\r\n    <button (click)=\"autoApprove()\" type=\"button\" class=\"btn btn-warning me-3\">\r\n      ⚠ Auto Approve\r\n    </button>\r\n\r\n    <!-- ================= Approve Changes ================= -->\r\n    <button type=\"button\" class=\"btn btn-success\" (click)=\"approveStore()\" [disabled]=\"form.invalid\">\r\n      ✔ Approve Changes\r\n    </button>\r\n  </div>\r\n\r\n\r\n</form>","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject, takeUntil, tap, catchError } from 'rxjs';\r\nimport { FindReplace } from '../models/find-replace.model';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CollectionUpdateAiDataService implements OnDestroy {\r\n  private findReplaceData$ = new BehaviorSubject<FindReplace | null>(null);\r\n  private saveDraftSubject$ = new Subject<Partial<FindReplace>>();\r\n  private loading$ = new BehaviorSubject<boolean>(false);\r\n  private savedId$ = new Subject<string>();\r\n  private editMode$ = new BehaviorSubject<boolean>(false);\r\n  private destroy$ = new Subject<void>();\r\n  private saveSubscription: any = null;\r\n  \r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toastService: ToastService\r\n  ) {\r\n    // Subscribe to save draft events\r\n    this.saveDraftSubject$\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        this.saveAsDraft(data);\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  /**\r\n   * Get current FindReplace data as Observable\r\n   */\r\n  getFindReplaceData(): Observable<FindReplace | null> {\r\n    return this.findReplaceData$.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Get loading state as Observable\r\n   */\r\n  getLoadingState(): Observable<boolean> {\r\n    return this.loading$.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Get saved ID as Observable (emits when save is successful)\r\n   */\r\n  getSavedId(): Observable<string> {\r\n    return this.savedId$.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Get edit mode state as Observable\r\n   */\r\n  getEditMode(): Observable<boolean> {\r\n    return this.editMode$.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Get current edit mode value\r\n   */\r\n  isEditMode(): boolean {\r\n    return this.editMode$.value;\r\n  }\r\n\r\n  /**\r\n   * Set edit mode\r\n   */\r\n  setEditMode(enabled: boolean): void {\r\n    this.editMode$.next(enabled);\r\n  }\r\n\r\n  /**\r\n   * Get current FindReplace data value\r\n   */\r\n  getCurrentData(): FindReplace | null {\r\n    return this.findReplaceData$.value;\r\n  }\r\n\r\n  /**\r\n   * Initialize or update FindReplace data\r\n   */\r\n  setFindReplaceData(data: FindReplace | null): void {\r\n    this.findReplaceData$.next(data);\r\n  }\r\n\r\n  /**\r\n   * Update partial data and merge with existing\r\n   */\r\n  updateData(partialData: Partial<FindReplace>): void {\r\n    const currentData = this.findReplaceData$.value;\r\n    if (currentData) {\r\n      const updatedData = { ...currentData, ...partialData };\r\n      this.findReplaceData$.next(updatedData);\r\n    } else {\r\n      // If no existing data, create new with partial data\r\n      const newData = {\r\n        _id: partialData._id || '',\r\n        status: 'draft' as const,\r\n        ...partialData\r\n      } as FindReplace;\r\n      this.findReplaceData$.next(newData);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Trigger save as draft with updated data\r\n   * Components can call this to save current state\r\n   * @param data Optional partial data to update before saving\r\n   * @param showToast Whether to show the success toast (default: false)\r\n   */\r\n  triggerSaveDraft(data?: Partial<FindReplace>, showToast: boolean = false): void {\r\n    if (data) {\r\n      this.updateData(data);\r\n    }\r\n    const currentData = this.findReplaceData$.value;\r\n    // Allow saving even if no data exists (for first-time upsert)\r\n    if (currentData) {\r\n      this.saveDraftSubject$.next({ ...currentData, _showToast: showToast } as any);\r\n    } else {\r\n      // Initialize with minimal data for first-time save\r\n      const newData: Partial<FindReplace> = {\r\n        _id: '',\r\n        status: 'draft',\r\n        name: '',\r\n        target: 'merch',\r\n        findPrompt: '',\r\n        replacePrompt: '',\r\n        stores: [],\r\n        storeCount: 0,\r\n        ...data\r\n      };\r\n      this.saveDraftSubject$.next({ ...newData, _showToast: showToast } as any);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Save as draft and return an Observable that can be awaited\r\n   * Use this when you need to wait for the save to complete\r\n   */\r\n  saveDraftAndWait(data?: Partial<FindReplace>): Observable<any> {\r\n    if (data) {\r\n      this.updateData(data);\r\n    }\r\n    const currentData = this.findReplaceData$.value;\r\n    const hadIdBefore = !!(currentData?._id || data?._id);\r\n    \r\n    // Merge current data with incoming data\r\n    const mergedData = currentData ? { ...currentData, ...data } : (data as FindReplace);\r\n    \r\n    // Preserve existing status when saving as draft (don't change status)\r\n    const preservedStatus = mergedData?.status || 'draft';\r\n    \r\n    const payload: any = {\r\n      id: mergedData?._id || '',\r\n      name: mergedData?.name || '',\r\n      searchMode: mergedData?.searchMode,\r\n      storeSearchString: mergedData?.storeSearchString,\r\n      target: mergedData?.target || 'merch',\r\n      findPrompt: mergedData?.findPrompt || '',\r\n      replacePrompt: mergedData?.replacePrompt || '',\r\n      replaceBrand: mergedData?.replaceBrand ?? null,\r\n      replaceVm: mergedData?.replaceVm ?? null,\r\n      stores: mergedData?.stores || [],\r\n      storeCount: mergedData?.storeCount || 0,\r\n      selectedClusters: mergedData?.selectedClusters || undefined,\r\n      status: preservedStatus as FindReplace['status'],\r\n      schedule: mergedData?.schedule,\r\n      scheduleDate: mergedData?.scheduleDate\r\n    };\r\n\r\n    this.loading$.next(true);\r\n    \r\n    return this.storeBuilderService.saveAsDraft(payload).pipe(\r\n      takeUntil(this.destroy$),\r\n      // Handle response and update local data\r\n      tap((response: any) => {\r\n        this.loading$.next(false);\r\n        if (response?.code === 200) {\r\n          let savedId: string | null = null;\r\n          \r\n          // Update local data with saved data if response contains it\r\n          if (response?.data) {\r\n            this.setFindReplaceData(response.data);\r\n            savedId = response.data._id || response.data.id || null;\r\n          } else if (response?.data?._id) {\r\n            savedId = response.data._id;\r\n            if (savedId) {\r\n              this.loadAndSetFindReplaceDataById(savedId);\r\n            }\r\n          } else {\r\n            const id = payload.id;\r\n            if (id) {\r\n              savedId = id;\r\n              this.loadAndSetFindReplaceDataById(id);\r\n            }\r\n          }\r\n          \r\n          // Emit saved ID if this was an initial save (no ID before)\r\n          if (savedId && !hadIdBefore) {\r\n            this.savedId$.next(savedId);\r\n          }\r\n        }\r\n      }),\r\n      catchError((error) => {\r\n        this.loading$.next(false);\r\n        console.error('Error saving as draft:', error);\r\n        throw error;\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Save as draft - internal method\r\n   */\r\n  private saveAsDraft(data: Partial<FindReplace> | FindReplace): void {\r\n    const currentData = this.findReplaceData$.value;\r\n    const hadIdBefore = !!(currentData?._id || (data as any)._id);\r\n    \r\n    // Extract showToast flag from data (if present)\r\n    const showToast = !!(data as any)._showToast;\r\n    // Remove the _showToast flag from data before processing\r\n    const { _showToast, ...cleanData } = data as any;\r\n    \r\n    this.loading$.next(true);\r\n    \r\n    // Merge current data with incoming data (incoming data takes precedence)\r\n    const mergedData = currentData ? { ...currentData, ...cleanData } : (cleanData as FindReplace);\r\n    \r\n    // Preserve existing status when saving as draft (don't change status)\r\n    // Only set to 'draft' if there's no existing status\r\n    const preservedStatus = mergedData.status || 'draft';\r\n    \r\n    const payload: any = {\r\n      id: mergedData._id || '',\r\n      name: mergedData.name || '',\r\n      searchMode: mergedData.searchMode,\r\n      storeSearchString: mergedData.storeSearchString,\r\n      target: mergedData.target || 'merch',\r\n      findPrompt: mergedData.findPrompt || '',\r\n      replacePrompt: mergedData.replacePrompt || '',\r\n      replaceBrand: mergedData.replaceBrand ?? null,\r\n      replaceVm: mergedData.replaceVm ?? null,\r\n      stores: mergedData.stores || [],\r\n      storeCount: mergedData.storeCount || 0,\r\n      selectedClusters: mergedData.selectedClusters || undefined,\r\n      status: preservedStatus as FindReplace['status'],\r\n      schedule: mergedData.schedule,\r\n      scheduleDate: mergedData.scheduleDate,\r\n      clientId: mergedData?.clientId || '11'\r\n    };\r\n\r\n    // Cancel previous save if still in progress\r\n    if (this.saveSubscription) {\r\n      this.saveSubscription.unsubscribe();\r\n    }\r\n    \r\n    this.saveSubscription = this.storeBuilderService.saveAsDraft(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (response: any) => {\r\n          this.loading$.next(false);\r\n          if (response?.code === 200) {\r\n            let savedId: string | null = null;\r\n            \r\n            // Update local data with saved data if response contains it\r\n            if (response?.data) {\r\n              this.setFindReplaceData(response.data);\r\n              savedId = response.data._id || response.data.id || null;\r\n            } else if (response?.data?._id) {\r\n              // If response contains ID but not full data, fetch it from API\r\n              savedId = response.data._id;\r\n              if (savedId) {\r\n                this.loadAndSetFindReplaceDataById(savedId);\r\n              }\r\n            } else {\r\n              // If response doesn't contain data, fetch it from API using payload ID\r\n              const id = payload.id;\r\n              if (id) {\r\n                savedId = id;\r\n                this.loadAndSetFindReplaceDataById(id);\r\n              }\r\n            }\r\n            \r\n            // Emit saved ID if this was an initial save (no ID before)\r\n            if (savedId && !hadIdBefore) {\r\n              this.savedId$.next(savedId);\r\n            }\r\n            \r\n            // Only show toast if explicitly requested\r\n            if (showToast) {\r\n              this.toastService.getSuccessToast('Saved as draft successfully');\r\n            }\r\n          } else {\r\n            // Only show error toast if explicitly requested (for button clicks)\r\n            if (showToast) {\r\n              this.toastService.getErrorToast(response?.message || 'Failed to save as draft');\r\n            }\r\n          }\r\n          this.saveSubscription = null;\r\n        },\r\n        error: (error) => {\r\n          this.loading$.next(false);\r\n          // Only show error toast if explicitly requested (for button clicks)\r\n          if (showToast) {\r\n            this.toastService.getErrorToast('Failed to save as draft');\r\n          }\r\n          console.error('Error saving as draft:', error);\r\n          this.saveSubscription = null;\r\n        }\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Load FindReplace data by ID\r\n   */\r\n  loadFindReplaceDataById(id: string): Observable<any> {\r\n    return this.storeBuilderService.getFindReplaceDataById({ id });\r\n  }\r\n\r\n  /**\r\n   * Load and set FindReplace data by ID\r\n   */\r\n  loadAndSetFindReplaceDataById(id: string): void {\r\n    this.loading$.next(true);\r\n    this.storeBuilderService.getFindReplaceDataById({ id })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (response: any) => {\r\n          this.loading$.next(false);\r\n          if (response?.code === 200 && response?.data) {\r\n            this.setFindReplaceData(response.data);\r\n          }\r\n        },\r\n        error: (error) => {\r\n          this.loading$.next(false);\r\n          console.error('Error fetching find replace data:', error);\r\n        }\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Clear all data\r\n   */\r\n  clearData(): void {\r\n    this.findReplaceData$.next(null);\r\n  }\r\n}\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { RouterOutlet, ActivatedRoute, Router } from '@angular/router';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FindReplace } from '../models/find-replace.model';\r\nimport { CollectionUpdateAiDataService } from '../services/data.service';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { NgIf, CommonModule } from '@angular/common';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CancelConfirmationModalComponent } from './cancel-confirmation-modal/cancel-confirmation-modal.component';\r\nimport { RescheduleModalComponent } from '../find-replace-table/reschedule-modal/reschedule-modal.component';\r\nimport { PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\n\r\n@Component({\r\n  selector: 'lib-find-replace-layout',\r\n  standalone: true,\r\n  imports: [RouterOutlet, FormsModule, NgIf, CommonModule],\r\n  templateUrl: './find-replace-layout.component.html',\r\n  styleUrl: './find-replace-layout.component.scss'\r\n})\r\nexport class FindReplaceLayoutComponent implements OnInit, OnDestroy {\r\n  findReplaceData: FindReplace | null = null;\r\n  private destroy$ = new Subject<void>();\r\n  loading: boolean = false;\r\n  private batchProgressInterval: any = null;\r\n  private isPollingActive: boolean = false;\r\n\r\n  constructor(\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private dataService: CollectionUpdateAiDataService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private modalService: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private toastService: ToastService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Set breadcrumbs\r\n    this.setBreadcrumbs();\r\n\r\n    // Subscribe to data changes from service\r\n    this.dataService.getFindReplaceData()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        const previousStatus = this.findReplaceData?.status;\r\n        this.findReplaceData = data;\r\n        \r\n        // Update breadcrumbs when title changes\r\n        this.setBreadcrumbs();\r\n        \r\n        // Handle batch-running status polling\r\n        if (data?.status === 'batch-running') {\r\n          // If status changed to batch-running or page was refreshed with batch-running status\r\n          // (previousStatus will be undefined/null on initial load or different status)\r\n          if (previousStatus !== 'batch-running') {\r\n            // Call API immediately on status change or page refresh\r\n            this.updateBatchProgressAndRefetch();\r\n            // Start polling if not already started\r\n            this.startBatchProgressPolling();\r\n          }\r\n          // Don't restart polling if it's already active (to prevent restarting on data updates)\r\n        } else {\r\n          // Stop polling if status is not batch-running\r\n          this.stopBatchProgressPolling();\r\n          \r\n          // Handle status-based routing when batch running completes\r\n          // This ensures redirect to /review when batch completes (status changes to yet-to-approve/approved)\r\n          if (data?.status && previousStatus === 'batch-running') {\r\n            this.handleStatusBasedRouting(data.status);\r\n          }\r\n        }\r\n        \r\n        // Handle status-based routing for other status changes (not from batch-running)\r\n        // This handles initial load and other status transitions\r\n        if (data?.status && previousStatus !== 'batch-running' && previousStatus !== data.status) {\r\n          this.handleStatusBasedRouting(data.status);\r\n        }\r\n      });\r\n\r\n    // Subscribe to loading state from service\r\n    this.dataService.getLoadingState()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((loading) => {\r\n        this.loading = loading;\r\n      });\r\n\r\n    // Subscribe to saved ID to update URL query params for initial saves\r\n    this.dataService.getSavedId()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((id) => {\r\n        // Check if there's no ID in current query params (initial save)\r\n        const currentParams = this.route.snapshot.queryParams;\r\n        if (!currentParams?.['id'] && id) {\r\n          // Update URL with the new ID without navigating\r\n          this.router.navigate([], {\r\n            relativeTo: this.route,\r\n            queryParams: { id: id },\r\n            queryParamsHandling: 'merge',\r\n            replaceUrl: true\r\n          });\r\n        }\r\n      });\r\n\r\n    // Load data from route params\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.['id']) {\r\n          this.loadFindReplaceDataById(params['id']);\r\n        }\r\n      });\r\n  }\r\n\r\n  loadFindReplaceDataById(id: string): void {\r\n    this.dataService.loadAndSetFindReplaceDataById(id);\r\n  }\r\n\r\n  async onCancel() {\r\n    // Check if batch is running - show confirmation modal\r\n    if (this.isBatchRunning()) {\r\n      const modalRef = this.modalService.open(CancelConfirmationModalComponent, {\r\n        centered: true,\r\n        size: 'lg',\r\n        backdrop: 'static',\r\n        windowClass: 'cancel-confirmation-modal'\r\n      });\r\n\r\n      try {\r\n        const result = await modalRef.result;\r\n        // User confirmed cancellation\r\n        if (result) {\r\n          this.proceedWithCancel();\r\n        }\r\n      } catch (dismissed) {\r\n        // User dismissed the modal (clicked \"Keep Processing\" or outside)\r\n        // Do nothing, just close the modal\r\n      }\r\n    } else {\r\n      // If not batch running, proceed directly with cancel\r\n      this.proceedWithCancel();\r\n    }\r\n  }\r\n\r\n  private proceedWithCancel() {\r\n    // If there's a findReplaceId, call the cancel API and refetch data\r\n    if (this.findReplaceData?._id) {\r\n      const findReplaceId = this.findReplaceData._id;\r\n      this.loading = true;\r\n      this.storeBuilderService.cancelFindReplace({\r\n        findReplaceId: findReplaceId\r\n      })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (response: any) => {\r\n            if (response?.code === 200) {\r\n              // Refetch find and replace data after successful cancel\r\n              this.dataService.loadFindReplaceDataById(findReplaceId)\r\n                .pipe(takeUntil(this.destroy$))\r\n                .subscribe({\r\n                  next: (getResponse: any) => {\r\n                    this.loading = false;\r\n                    if (getResponse?.code === 200 && getResponse?.data) {\r\n                      this.dataService.setFindReplaceData(getResponse.data);\r\n                    }\r\n                  },\r\n                  error: (error) => {\r\n                    this.loading = false;\r\n                    console.error('Error fetching find replace data:', error);\r\n                  }\r\n                });\r\n            } else {\r\n              this.loading = false;\r\n              console.error('Error canceling find replace:', response?.message || 'Unknown error');\r\n            }\r\n          },\r\n          error: (error) => {\r\n            this.loading = false;\r\n            console.error('Error canceling find replace:', error);\r\n          }\r\n        });\r\n    } else {\r\n      // If no ID, just navigate away\r\n      this.router.navigate(['/manage/planogram/find-replace-table']);\r\n    }\r\n  }\r\n\r\n  onBackToDashboard() {\r\n    this.router.navigate(['/manage/planogram/find-replace-table']);\r\n  }\r\n\r\n  onSaveDraft() {\r\n    const currentTitle = this.findReplaceData?.name || this.title || '';\r\n    if (!currentTitle || currentTitle.trim() === '') {\r\n      this.toastService.getWarningToast('Please enter a title before saving');\r\n      return;\r\n    }\r\n    // Pass true to showToast parameter to show the toast when button is clicked\r\n    this.dataService.triggerSaveDraft(undefined, true);\r\n  }\r\n\r\n  isStep2Active(): boolean {\r\n    if (!this.findReplaceData?.status) {\r\n      return false;\r\n    }\r\n    const reviewStatuses: Array<FindReplace['status']> = ['yet-to-approve', 'approved', 'scheduled'];\r\n    return reviewStatuses.includes(this.findReplaceData.status);\r\n  }\r\n\r\n  isLineActive(): boolean {\r\n    return this.isStep2Active();\r\n  }\r\n\r\n  /**\r\n   * Check if the stepper steps are clickable (status is yet-to-approve or approved)\r\n   */\r\n  isStepperClickable(): boolean {\r\n    return this.isStep2Active();\r\n  }\r\n\r\n  /**\r\n   * Check if currently on the prepare route\r\n   */\r\n  isOnPrepare(): boolean {\r\n    return this.router.url.includes('/prepare');\r\n  }\r\n\r\n  /**\r\n   * Check if currently on the review route\r\n   */\r\n  isOnReview(): boolean {\r\n    return this.router.url.includes('/review');\r\n  }\r\n\r\n  /**\r\n   * Navigate to prepare step\r\n   */\r\n  goToStep1(): void {\r\n    if (this.isStepperClickable() && this.isOnReview()) {\r\n      this.router.navigate(['./prepare'], {\r\n        relativeTo: this.route,\r\n        queryParamsHandling: 'preserve'\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Navigate to review step\r\n   */\r\n  goToStep2(): void {\r\n    if (this.isStepperClickable() && this.isOnPrepare()) {\r\n      this.router.navigate(['./review'], {\r\n        relativeTo: this.route,\r\n        queryParamsHandling: 'preserve'\r\n      });\r\n    }\r\n  }\r\n\r\n  isBatchRunning(): boolean {\r\n    return this.findReplaceData?.status === 'batch-running';\r\n  }\r\n\r\n  getBatchProgress(): number {\r\n    return this.findReplaceData?.batchProgress ?? 0;\r\n  }\r\n\r\n  getStoreCount(): number {\r\n    return this.findReplaceData?.storeCount || this.findReplaceData?.stores?.length || 0;\r\n  }\r\n\r\n  get title(): string {\r\n    return this.findReplaceData?.name || '';\r\n  }\r\n\r\n  set title(value: string) {\r\n    const actualValue = value;\r\n    if (this.findReplaceData) {\r\n      this.findReplaceData.name = actualValue;\r\n      // Update the service with the new name\r\n      this.dataService.updateData({ name: actualValue });\r\n    } else {\r\n      // Initialize data if it doesn't exist\r\n      this.dataService.updateData({ \r\n        name: actualValue,\r\n        status: 'draft',\r\n        target: 'merch'\r\n      });\r\n    }\r\n  }\r\n\r\n  formatScheduledDate(dateString: string | null | undefined): string {\r\n    if (!dateString) return '';\r\n    const date = new Date(dateString);\r\n    if (isNaN(date.getTime())) return dateString;\r\n    \r\n    // Format: \"11 Feb, 2026\"\r\n    const day = date.getDate();\r\n    const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n    const month = monthNames[date.getMonth()];\r\n    const year = date.getFullYear();\r\n    \r\n    return `${day} ${month}, ${year}`;\r\n  }\r\n\r\n  /**\r\n   * Handle status-based routing\r\n   */\r\n  private handleStatusBasedRouting(status: FindReplace['status']): void {\r\n    if (!status) {\r\n      return;\r\n    }\r\n\r\n    const currentUrl = this.router.url;\r\n    const reviewStatuses: Array<FindReplace['status']> = ['yet-to-approve', 'approved', 'scheduled'];\r\n    \r\n    // Redirect to /review if status is in review statuses\r\n    if (reviewStatuses.includes(status)) {\r\n      // Check if we're not already on the review route\r\n      if (!currentUrl.includes('/review')) {\r\n        this.router.navigate(['./review'], {\r\n          relativeTo: this.route,\r\n          queryParamsHandling: 'preserve'\r\n        });\r\n      }\r\n    }\r\n    // Redirect to /prepare if status is draft\r\n    else if (status === 'draft') {\r\n      // Check if we're not already on the prepare route\r\n      if (!currentUrl.includes('/prepare')) {\r\n        this.router.navigate(['./prepare'], {\r\n          relativeTo: this.route,\r\n          queryParamsHandling: 'preserve'\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update batch progress and refetch find replace data\r\n   * Returns a Promise that resolves when both API calls complete\r\n   */\r\n  private updateBatchProgressAndRefetch(): Promise<void> {\r\n    return new Promise((resolve, reject) => {\r\n      if (!this.findReplaceData?._id) {\r\n        resolve();\r\n        return;\r\n      }\r\n\r\n      this.storeBuilderService.updateBatchProgress({\r\n        findReplaceId: this.findReplaceData._id\r\n      })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (response: any) => {\r\n            // After updating batch progress, refetch the find replace data\r\n            if (this.findReplaceData?._id) {\r\n              this.dataService.loadFindReplaceDataById(this.findReplaceData._id)\r\n                .pipe(takeUntil(this.destroy$))\r\n                .subscribe({\r\n                  next: (getResponse: any) => {\r\n                    if (getResponse?.code === 200 && getResponse?.data) {\r\n                      this.dataService.setFindReplaceData(getResponse.data);\r\n                    }\r\n                    resolve();\r\n                  },\r\n                  error: (error) => {\r\n                    console.error('Error fetching find replace data:', error);\r\n                    resolve(); // Resolve anyway to continue polling\r\n                  }\r\n                });\r\n            } else {\r\n              resolve();\r\n            }\r\n          },\r\n          error: (error) => {\r\n            console.error('Error updating batch progress:', error);\r\n            resolve(); // Resolve anyway to continue polling\r\n          }\r\n        });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Start polling for batch progress updates every 10 seconds\r\n   * Timer only starts after both update and get API calls complete\r\n   */\r\n  private startBatchProgressPolling(): void {\r\n    // Don't start if already polling\r\n    if (this.isPollingActive) {\r\n      return;\r\n    }\r\n\r\n    // Clear any existing interval/timeout\r\n    this.stopBatchProgressPolling();\r\n\r\n    // Mark polling as active\r\n    this.isPollingActive = true;\r\n\r\n    // Start the polling cycle\r\n    this.scheduleNextPoll();\r\n  }\r\n\r\n  /**\r\n   * Schedule the next poll after both API calls complete\r\n   */\r\n  private scheduleNextPoll(): void {\r\n    // Clear any existing timeout\r\n    if (this.batchProgressInterval) {\r\n      clearTimeout(this.batchProgressInterval);\r\n    }\r\n\r\n    // Check if we should continue polling\r\n    if (this.findReplaceData?.status !== 'batch-running') {\r\n      this.stopBatchProgressPolling();\r\n      return;\r\n    }\r\n\r\n    // Call the APIs and schedule next poll after they complete\r\n    this.updateBatchProgressAndRefetch()\r\n      .then(() => {\r\n        // Only schedule next poll if status is still batch-running\r\n        if (this.findReplaceData?.status === 'batch-running') {\r\n          // Start timer for next poll (10 seconds after both APIs complete)\r\n          this.batchProgressInterval = setTimeout(() => {\r\n            this.scheduleNextPoll();\r\n          }, 10000); // 10 seconds\r\n        } else {\r\n          // Stop polling if status changed\r\n          this.stopBatchProgressPolling();\r\n        }\r\n      })\r\n      .catch((error) => {\r\n        console.error('Error in polling cycle:', error);\r\n        // Continue polling even on error\r\n        if (this.findReplaceData?.status === 'batch-running') {\r\n          this.batchProgressInterval = setTimeout(() => {\r\n            this.scheduleNextPoll();\r\n          }, 10000);\r\n        }\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Stop polling for batch progress updates\r\n   */\r\n  private stopBatchProgressPolling(): void {\r\n    if (this.batchProgressInterval) {\r\n      clearTimeout(this.batchProgressInterval);\r\n      this.batchProgressInterval = null;\r\n    }\r\n    this.isPollingActive = false;\r\n  }\r\n\r\n  private setBreadcrumbs(): void {\r\n    const breadcrumbs = [\r\n      {\r\n        title: 'Find & Replace',\r\n        path: '/manage/planogram/fixture-templates?tab=find-replace',\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: 'Find & Replace Table',\r\n        path: '/manage/planogram/find-replace-table',\r\n        isActive: false,\r\n        isSeparator: true,\r\n      }\r\n    ];\r\n    this.pageInfo.setBreadcrumbs(breadcrumbs);\r\n    this.pageInfo.setTitle(\"Prepare & Review\");\r\n\r\n  }\r\n\r\n  isApproved(): boolean {\r\n    return this.findReplaceData?.status === 'approved';\r\n  }\r\n\r\n  hasAnyAction(): boolean {\r\n    return this.shouldShowReschedule();\r\n  }\r\n\r\n  shouldShowReschedule(): boolean {\r\n    return this.findReplaceData?.status === 'scheduled';\r\n  }\r\n\r\n  onEdit(): void {\r\n    // Enable edit mode in data service\r\n    this.dataService.setEditMode(true);\r\n  }\r\n\r\n  async onReschedule(): Promise<void> {\r\n    if (!this.findReplaceData?._id) {\r\n      return;\r\n    }\r\n\r\n    const modalRef = this.modalService.open(RescheduleModalComponent, {\r\n      centered: true,\r\n      size: 'md',\r\n      backdrop: 'static',\r\n      windowClass: 'reschedule-modal'\r\n    });\r\n\r\n    // Pass the initial schedule values to the modal\r\n    modalRef.componentInstance.initialSchedule = this.findReplaceData?.schedule || false;\r\n    modalRef.componentInstance.initialScheduleDate = this.findReplaceData?.scheduleDate || null;\r\n\r\n    try {\r\n      const result = await modalRef.result;\r\n      if (result) {\r\n        // Prepare data for saveAsDraft API\r\n        const draftData: any = {\r\n          id: this.findReplaceData._id,\r\n          schedule: result.schedule,\r\n          scheduleDate: result.scheduleDate\r\n        };\r\n\r\n        // Call saveAsDraft API first\r\n        this.loading = true;\r\n        this.storeBuilderService.saveAsDraft(draftData).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === 'success' || res?.code === 200) {\r\n              // If schedule is false, call approveReplace API\r\n              if (!result.schedule) {\r\n                this.storeBuilderService.approveReplace({\r\n                  findReplaceId: this.findReplaceData!._id\r\n                }).subscribe({\r\n                  next: (approveRes: any) => {\r\n                    this.loading = false;\r\n                    if (approveRes?.status === 'success' || approveRes?.code === 200) {\r\n                      this.toastService.getSuccessToast(approveRes?.message || 'Find and replace approved successfully');\r\n                      // Reload the data\r\n                      if (this.findReplaceData?._id) {\r\n                        this.dataService.loadFindReplaceDataById(this.findReplaceData._id)\r\n                          .pipe(takeUntil(this.destroy$))\r\n                          .subscribe({\r\n                            next: (getResponse: any) => {\r\n                              if (getResponse?.code === 200 && getResponse?.data) {\r\n                                this.dataService.setFindReplaceData(getResponse.data);\r\n                              }\r\n                            },\r\n                            error: (error) => {\r\n                              console.error('Error fetching find replace data:', error);\r\n                            }\r\n                          });\r\n                      }\r\n                    } else {\r\n                      this.toastService.getErrorToast(approveRes?.message || 'Failed to approve find and replace');\r\n                    }\r\n                  },\r\n                  error: (approveErr) => {\r\n                    this.loading = false;\r\n                    this.toastService.getErrorToast(approveErr?.error?.error || approveErr?.error?.message || 'Failed to approve find and replace');\r\n                    console.error('Error approving find replace:', approveErr);\r\n                  }\r\n                });\r\n              } else {\r\n                // Schedule is true, just show success message and reload\r\n                this.loading = false;\r\n                this.toastService.getSuccessToast(res?.message || 'Find and replace rescheduled successfully');\r\n                // Reload the data\r\n                if (this.findReplaceData?._id) {\r\n                  this.dataService.loadFindReplaceDataById(this.findReplaceData._id)\r\n                    .pipe(takeUntil(this.destroy$))\r\n                    .subscribe({\r\n                      next: (getResponse: any) => {\r\n                        if (getResponse?.code === 200 && getResponse?.data) {\r\n                          this.dataService.setFindReplaceData(getResponse.data);\r\n                        }\r\n                      },\r\n                      error: (error) => {\r\n                        console.error('Error fetching find replace data:', error);\r\n                      }\r\n                    });\r\n                }\r\n              }\r\n            } else {\r\n              this.loading = false;\r\n              this.toastService.getErrorToast(res?.message || 'Failed to reschedule find and replace');\r\n            }\r\n          },\r\n          error: (err) => {\r\n            this.loading = false;\r\n            this.toastService.getErrorToast(err?.error?.error || err?.error?.message || 'Failed to reschedule find and replace');\r\n            console.error('Error rescheduling find replace:', err);\r\n          }\r\n        });\r\n      }\r\n    } catch (error) {\r\n      // User dismissed the modal\r\n      console.log('Reschedule modal dismissed');\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.stopBatchProgressPolling();\r\n    // Clear service data when exiting the component\r\n    this.dataService.clearData();\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","    <!-- Batch Running UI -->\r\n    <div *ngIf=\"isBatchRunning()\" class=\"batch-processing-container\">\r\n        <!-- SVG Illustration -->\r\n        <div class=\"batch-illustration\">\r\n            <svg fill=\"none\" preserveAspectRatio=\"none\" viewBox=\"0 0 331 183\">\r\n                <g id=\"Group 2891\">\r\n                    <path d=\"M247.99 46C268.149 46 284.49 62.3416 284.49 82.5C284.49 91.0788 290.281 101 298.859 101H312C322.493 101 331 109.507 331 120C331 130.493 322.493 139 312 139H272.962C268.634 139 265.721 144.171 265.721 148.5C265.721 158.165 257.886 166 248.221 166H119.221C109.556 166 101.721 158.165 101.721 148.5C101.721 144.171 98.8077 139 94.479 139H19C8.50659 139 0 130.493 0 120C0 109.507 8.50659 101 19 101H65.121C73.6998 101 79.4902 91.0788 79.4902 82.5C79.4902 62.3416 95.8319 46 115.99 46H247.99Z\" fill=\"#EAECF0\" id=\"Union\" />\r\n                    <rect fill=\"#99DAFF\" height=\"104\" id=\"Rectangle 2270\" rx=\"4\" width=\"64\" x=\"176.19\" y=\"76\" />\r\n                    <rect fill=\"#99DAFF\" height=\"104\" id=\"Rectangle 2269\" rx=\"4\" width=\"64\" x=\"119.19\" y=\"16\" />\r\n                    <path d=\"M225.605 121.414C226.386 120.633 226.386 119.367 225.605 118.586L212.877 105.858C212.096 105.077 210.829 105.077 210.048 105.858C209.267 106.639 209.267 107.905 210.048 108.686L221.362 120L210.048 131.314C209.267 132.095 209.267 133.361 210.048 134.142C210.829 134.923 212.096 134.923 212.877 134.142L225.605 121.414ZM182.19 49.5C182.19 50.6046 183.086 51.5 184.19 51.5C185.295 51.5 186.19 50.6046 186.19 49.5H184.19H182.19ZM124.19 15V17H178.19V15V13H124.19V15ZM224.19 120V118H124.19V120V122H224.19V120ZM118.19 114H120.19V21H118.19H116.19V114H118.19ZM184.19 21H182.19V49.5H184.19H186.19V21H184.19ZM124.19 120V118C121.981 118 120.19 116.209 120.19 114H118.19H116.19C116.19 118.418 119.772 122 124.19 122V120ZM178.19 15V17C180.4 17 182.19 18.7909 182.19 21H184.19H186.19C186.19 16.5817 182.609 13 178.19 13V15ZM124.19 15V13C119.772 13 116.19 16.5817 116.19 21H118.19H120.19C120.19 18.7909 121.981 17 124.19 17V15Z\" fill=\"#00A3FF\" id=\"Rectangle 2254\" />\r\n                    <path d=\"M132.776 74.5858C131.995 75.3668 131.995 76.6332 132.776 77.4142L145.504 90.1421C146.285 90.9232 147.552 90.9232 148.333 90.1421C149.114 89.3611 149.114 88.0947 148.333 87.3137L137.019 76L148.333 64.6863C149.114 63.9052 149.114 62.6389 148.333 61.8579C147.552 61.0768 146.285 61.0768 145.504 61.8579L132.776 74.5858ZM176.19 146.5C176.19 145.395 175.295 144.5 174.19 144.5C173.086 144.5 172.19 145.395 172.19 146.5L174.19 146.5L176.19 146.5ZM234.19 181L234.19 179L180.19 179L180.19 181L180.19 183L234.19 183L234.19 181ZM134.19 76L134.19 78L234.19 78L234.19 76L234.19 74L134.19 74L134.19 76ZM240.19 82L238.19 82L238.19 175L240.19 175L242.19 175L242.19 82L240.19 82ZM174.19 175L176.19 175L176.19 146.5L174.19 146.5L172.19 146.5L172.19 175L174.19 175ZM234.19 76L234.19 78C236.4 78 238.19 79.7909 238.19 82L240.19 82L242.19 82C242.19 77.5817 238.609 74 234.19 74L234.19 76ZM180.19 181L180.19 179C177.981 179 176.19 177.209 176.19 175L174.19 175L172.19 175C172.19 179.418 175.772 183 180.19 183L180.19 181ZM234.19 181L234.19 183C238.609 183 242.19 179.418 242.19 175L240.19 175L238.19 175C238.19 177.209 236.4 179 234.19 179L234.19 181Z\" fill=\"#00A3FF\" id=\"Rectangle 2256\" />\r\n                    <path d=\"M140.232 30L140.95 33.4281C141.316 35.1758 142.129 36.7989 143.309 38.139C144.489 39.4791 145.996 40.4906 147.684 41.0747L149.274 41.625L147.684 42.1752C145.996 42.7594 144.489 43.7709 143.309 45.111C142.129 46.4511 141.316 48.0742 140.95 49.8219L140.232 53.25L139.514 49.8219C139.148 48.0742 138.335 46.4511 137.155 45.111C135.975 43.7709 134.468 42.7594 132.78 42.1752L131.19 41.625L132.78 41.0747C134.468 40.4906 135.975 39.4791 137.155 38.139C138.335 36.7989 139.148 35.1758 139.514 33.4281L140.232 30Z\" id=\"Vector\" stroke=\"#00A3FF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M217.232 143L217.95 146.428C218.316 148.176 219.129 149.799 220.309 151.139C221.489 152.479 222.996 153.491 224.684 154.075L226.274 154.625L224.684 155.175C222.996 155.759 221.489 156.771 220.309 158.111C219.129 159.451 218.316 161.074 217.95 162.822L217.232 166.25L216.514 162.822C216.148 161.074 215.335 159.451 214.155 158.111C212.975 156.771 211.468 155.759 209.78 155.175L208.19 154.625L209.78 154.075C211.468 153.491 212.975 152.479 214.155 151.139C215.335 149.799 216.148 148.176 216.514 146.428L217.232 143Z\" id=\"Vector_2\" stroke=\"#00A3FF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M192.19 148L192.588 149.917C192.79 150.894 193.239 151.802 193.892 152.551C194.545 153.3 195.378 153.866 196.311 154.192L197.19 154.5L196.311 154.808C195.378 155.134 194.545 155.7 193.892 156.449C193.239 157.198 192.79 158.106 192.588 159.083L192.19 161L191.793 159.083C191.591 158.106 191.141 157.198 190.489 156.449C189.836 155.7 189.003 155.134 188.07 154.808L187.19 154.5L188.07 154.192C189.003 153.866 189.836 153.3 190.489 152.551C191.141 151.802 191.591 150.894 191.793 149.917L192.19 148Z\" id=\"Vector_3\" stroke=\"#6BCAFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M107.19 2L107.588 3.91678C107.79 4.894 108.239 5.80152 108.892 6.55084C109.545 7.30016 110.378 7.86571 111.311 8.19233L112.19 8.5L111.311 8.80767C110.378 9.13429 109.545 9.69984 108.892 10.4492C108.239 11.1985 107.79 12.106 107.588 13.0832L107.19 15L106.793 13.0832C106.591 12.106 106.141 11.1985 105.489 10.4492C104.836 9.69984 104.003 9.13429 103.07 8.80767L102.19 8.5L103.07 8.19233C104.003 7.86571 104.836 7.30016 105.489 6.55084C106.141 5.80152 106.591 4.894 106.793 3.91678L107.19 2Z\" id=\"Vector_4\" stroke=\"#6BCAFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M262.19 81L262.588 82.9168C262.79 83.894 263.239 84.8015 263.892 85.5508C264.545 86.3002 265.378 86.8657 266.311 87.1923L267.19 87.5L266.311 87.8077C265.378 88.1343 264.545 88.6998 263.892 89.4492C263.239 90.1985 262.79 91.106 262.588 92.0832L262.19 94L261.793 92.0832C261.591 91.106 261.141 90.1985 260.489 89.4492C259.836 88.6998 259.003 88.1343 258.07 87.8077L257.19 87.5L258.07 87.1923C259.003 86.8657 259.836 86.3002 260.489 85.5508C261.141 84.8015 261.591 83.894 261.793 82.9168L262.19 81Z\" id=\"Vector_5\" stroke=\"#6BCAFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M154.5 134L154.778 135.327C154.92 136.004 155.234 136.632 155.691 137.151C156.148 137.669 156.731 138.061 157.384 138.287L158 138.5L157.384 138.713C156.731 138.939 156.148 139.331 155.691 139.849C155.234 140.368 154.92 140.996 154.778 141.673L154.5 143L154.222 141.673C154.08 140.996 153.766 140.368 153.309 139.849C152.852 139.331 152.269 138.939 151.616 138.713L151 138.5L151.616 138.287C152.269 138.061 152.852 137.669 153.309 137.151C153.766 136.632 154.08 136.004 154.222 135.327L154.5 134Z\" id=\"Vector_6\" stroke=\"#6BCAFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M95.6904 101L96.2067 103.507C96.4698 104.784 97.0541 105.971 97.9024 106.951C98.7508 107.931 99.8343 108.671 101.047 109.098L102.19 109.5L101.047 109.902C99.8343 110.329 98.7508 111.069 97.9024 112.049C97.0541 113.029 96.4698 114.216 96.2067 115.493L95.6904 118L95.1741 115.493C94.911 114.216 94.3268 113.029 93.4784 112.049C92.6301 111.069 91.5466 110.329 90.3335 109.902L89.1904 109.5L90.3335 109.098C91.5466 108.671 92.6301 107.931 93.4784 106.951C94.3268 105.971 94.911 104.784 95.1741 103.507L95.6904 101Z\" id=\"Vector_7\" stroke=\"#00A3FF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                    <path d=\"M142.232 28L142.95 31.4281C143.316 33.1758 144.129 34.7989 145.309 36.139C146.489 37.4791 147.996 38.4906 149.684 39.0747L151.274 39.625L149.684 40.1752C147.996 40.7594 146.489 41.7709 145.309 43.111C144.129 44.4511 143.316 46.0742 142.95 47.8219L142.232 51.25L141.514 47.8219C141.148 46.0742 140.335 44.4511 139.155 43.111C137.975 41.7709 136.468 40.7594 134.78 40.1752L133.19 39.625L134.78 39.0747C136.468 38.4906 137.975 37.4791 139.155 36.139C140.335 34.7989 141.148 33.1758 141.514 31.4281L142.232 28Z\" id=\"Vector_8\" stroke=\"white\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"4\" />\r\n                </g>\r\n            </svg>\r\n        </div>\r\n\r\n        <!-- Content Section -->\r\n        <div class=\"batch-content-section\">\r\n            <!-- Text Section -->\r\n            <div class=\"batch-text-section\">\r\n                <p class=\"batch-title\">\r\n                    Batch processing<span class=\"loading-dots\">\r\n                        <span class=\"dot\">.</span><span class=\"dot\">.</span><span class=\"dot\">.</span>\r\n                    </span>\r\n                </p>\r\n                <p class=\"batch-description\">Running a batch for all {{ getStoreCount() }} stores. This might take a while. You can continue browsing and check back later.</p>\r\n            </div>\r\n\r\n            <!-- Button Container -->\r\n            <div class=\"batch-button-container\">\r\n                <button class=\"btn-batch-custom\" type=\"button\" (click)=\"onCancel()\">Cancel</button>\r\n                <button class=\"btn-batch-custom\" type=\"button\" (click)=\"onBackToDashboard()\">Back To Dashboard</button>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- Header -->\r\n    <div *ngIf=\"!isBatchRunning()\" class=\"header-card\">\r\n        <div class=\"d-flex justify-content-between align-items-center flex-wrap\">\r\n            <!-- Title -->\r\n            <div class=\"title-container\">\r\n                <input type=\"text\" class=\"header-title\" [(ngModel)]=\"title\" placeholder=\"Untitled\" [disabled]=\"isApproved()\">\r\n                <div *ngIf=\"findReplaceData?.status === 'scheduled' && findReplaceData?.scheduleDate\" class=\"scheduled-details\">\r\n                    <span class=\"scheduled-badge\">Scheduled:</span>\r\n                    <span class=\"scheduled-date\">{{ formatScheduledDate(findReplaceData!.scheduleDate!) }}</span>\r\n                </div>\r\n                <div *ngIf=\"findReplaceData?.status === 'approved'\" class=\"completed-details\">\r\n                    <span class=\"completed-badge\">Completed</span>\r\n                </div>\r\n            </div>\r\n            \r\n            <!-- Stepper -->\r\n            <div class=\"stepper-container\">\r\n                <div class=\"stepper-step\" \r\n                     [class.clickable]=\"isStepperClickable() && isOnReview()\" \r\n                     (click)=\"goToStep1()\">\r\n                    <div class=\"stepper-circle active\" [class.clickable-indicator]=\"isStepperClickable() && isOnReview()\">1</div>\r\n                    <p class=\"stepper-text active\" [class.clickable-indicator]=\"isStepperClickable() && isOnReview()\">Prepare template</p>\r\n                </div>\r\n                <div class=\"stepper-line\" [class.active]=\"isStep2Active()\"></div>\r\n                <div class=\"stepper-step\" \r\n                     [class.clickable]=\"isStepperClickable() && isOnPrepare()\" \r\n                     (click)=\"goToStep2()\">\r\n                    <div class=\"stepper-circle\" [class.active]=\"isStep2Active()\" [class.inactive]=\"!isStep2Active()\" [class.clickable-indicator]=\"isStepperClickable() && isOnPrepare()\">2</div>\r\n                    <p class=\"stepper-text\" [class.active]=\"isStep2Active()\" [class.inactive]=\"!isStep2Active()\" [class.clickable-indicator]=\"isStepperClickable() && isOnPrepare()\">Review and Approve</p>\r\n                </div>\r\n            </div>\r\n            \r\n            <!-- Action Buttons -->\r\n            <div class=\"d-flex gap-2 align-items-center\">\r\n                <button class=\"btn-cancel\" type=\"button\" (click)=\"onBackToDashboard()\">Cancel</button>\r\n                <button class=\"btn-save-draft\" type=\"button\" (click)=\"onSaveDraft()\" [disabled]=\"loading || isApproved()\">Save As Draft</button>\r\n                <!-- Ellipsis Menu -->\r\n                <div class=\"dropdown ms-2\" *ngIf=\"hasAnyAction()\">\r\n                    <button class=\"btn btn-link p-0\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n                        <ng-container *ngTemplateOutlet=\"verticalDots\"></ng-container>\r\n                    </button>\r\n                    <ul class=\"dropdown-menu dropdown-menu-end\">\r\n                        <li *ngIf=\"shouldShowReschedule()\">\r\n                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onReschedule()\">Reschedule</a>\r\n                        </li>\r\n                        <li *ngIf=\"shouldShowReschedule()\">\r\n                            <a class=\"dropdown-item cursor-pointer\" (click)=\"onEdit()\">Edit</a>\r\n                        </li>\r\n                    </ul>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    \r\n    <!-- Main Content -->\r\n    <router-outlet *ngIf=\"!isBatchRunning()\"></router-outlet>\r\n\r\n<ng-template #verticalDots>\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"4\" height=\"18\" viewBox=\"0 0 4 18\" fill=\"none\">\r\n        <path\r\n            d=\"M1 9C1 9.55228 1.44771 10 2 10C2.55228 10 3 9.55228 3 9C3 8.44772 2.55228 8 2 8C1.44771 8 1 8.44772 1 9Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n        <path\r\n            d=\"M0.999999 16C0.999999 16.5523 1.44771 17 2 17C2.55228 17 3 16.5523 3 16C3 15.4477 2.55228 15 2 15C1.44771 15 0.999999 15.4477 0.999999 16Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n        <path\r\n            d=\"M1 2C1 2.55228 1.44772 3 2 3C2.55228 3 3 2.55228 3 2C3 1.44772 2.55228 1 2 1C1.44772 1 1 1.44772 1 2Z\"\r\n            stroke=\"#101828\"\r\n            stroke-width=\"2\"\r\n            stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\"\r\n        />\r\n    </svg>\r\n</ng-template>","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, HostListener, ElementRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface StoreOption {\r\n  id: string;\r\n  label: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-store-select',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './store-select.component.html',\r\n  styleUrl: './store-select.component.scss'\r\n})\r\nexport class StoreSelectComponent implements OnInit, OnChanges {\r\n  @Input() options: StoreOption[] = [];\r\n  @Input() initialSelected: StoreOption[] = [];\r\n  @Input() singleSelect: boolean = false;\r\n  @Output() selectedChange = new EventEmitter<StoreOption[]>();\r\n  @ViewChild('inputWrapper', { static: false }) inputWrapper!: ElementRef;\r\n\r\n  selectedItems: Set<string> = new Set();\r\n  inputText: string = '';\r\n  isDropdownOpen: boolean = false;\r\n  searchText: string = '';\r\n\r\n  ngOnInit() {\r\n    // Initialize with any pre-selected items if needed\r\n    this.setInitialSelections();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    if (changes['initialSelected'] || changes['options']) {\r\n      this.setInitialSelections();\r\n    }\r\n  }\r\n\r\n  setInitialSelections() {\r\n    // Clear selections first\r\n    this.selectedItems.clear();\r\n    \r\n    // Only set initial selections if both options and initialSelected are available and not empty\r\n    if (this.initialSelected && this.initialSelected.length > 0 && this.options && this.options.length > 0) {\r\n      this.initialSelected.forEach(option => {\r\n        // Match by id first, then by label\r\n        const matchedOption = this.options.find(\r\n          opt => opt.id === option.id || opt.label === option.label\r\n        );\r\n        if (matchedOption) {\r\n          this.selectedItems.add(matchedOption.id);\r\n        }\r\n      });\r\n    }\r\n    \r\n    // Always emit the selected options (even if empty) to notify parent of changes\r\n    this.selectedChange.emit(this.selectedOptions);\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent) {\r\n    if (this.inputWrapper && !this.inputWrapper.nativeElement.contains(event.target)) {\r\n      this.isDropdownOpen = false;\r\n    }\r\n  }\r\n\r\n  get selectedOptions(): StoreOption[] {\r\n    return this.options.filter(option => this.selectedItems.has(option.id));\r\n  }\r\n\r\n  get isAllSelected(): boolean {\r\n    return this.filteredOptions.length > 0 && \r\n           this.filteredOptions.every(option => this.selectedItems.has(option.id));\r\n  }\r\n\r\n  get isIndeterminate(): boolean {\r\n    const filteredSelectedCount = this.filteredOptions.filter(option => \r\n      this.selectedItems.has(option.id)\r\n    ).length;\r\n    return filteredSelectedCount > 0 && filteredSelectedCount < this.filteredOptions.length;\r\n  }\r\n\r\n  get filteredOptions(): StoreOption[] {\r\n    if (!this.searchText || this.searchText.trim() === '') {\r\n      return this.options;\r\n    }\r\n    const searchTerm = this.searchText.toLowerCase().trim();\r\n    return this.options.filter(option => \r\n      option.label.toLowerCase().includes(searchTerm)\r\n    );\r\n  }\r\n\r\n  isSelected(id: string): boolean {\r\n    return this.selectedItems.has(id);\r\n  }\r\n\r\n  toggleSelectAll() {\r\n    if (this.isAllSelected) {\r\n      // Deselect all filtered options\r\n      this.filteredOptions.forEach(option => {\r\n        this.selectedItems.delete(option.id);\r\n      });\r\n    } else {\r\n      // Select all filtered options\r\n      this.filteredOptions.forEach(option => {\r\n        this.selectedItems.add(option.id);\r\n      });\r\n    }\r\n    this.selectedChange.emit(this.selectedOptions);\r\n  }\r\n\r\n  onSearchChange() {\r\n    // Search is handled by the filteredOptions getter\r\n    // This method can be used for additional logic if needed\r\n  }\r\n\r\n  onInputChange(event: Event) {\r\n    const target = event.target as HTMLTextAreaElement;\r\n    this.inputText = target.value;\r\n  }\r\n\r\n  onKeyDown(event: Event) {\r\n    const keyboardEvent = event as KeyboardEvent;\r\n    if (keyboardEvent.key === 'Enter') {\r\n      keyboardEvent.preventDefault();\r\n      const target = keyboardEvent.target as HTMLTextAreaElement;\r\n      const value = target.value.trim();\r\n\r\n      if (value.length > 0) {\r\n        // Split by comma and newline, then process each value\r\n        const values = value.split(/[,\\n\\r]+/).map(v => v.trim()).filter(v => v.length > 0);\r\n        let hasChanges = false;\r\n\r\n        const valuesToProcess = this.singleSelect ? values.slice(0, 1) : values;\r\n\r\n        valuesToProcess.forEach(val => {\r\n          // Match by label (store name) OR id (store code), case-insensitive\r\n          const needle = val.toLowerCase();\r\n          const matchedOption = this.options.find(\r\n            opt =>\r\n              opt.label.toLowerCase() === needle ||\r\n              String(opt.id ?? '').toLowerCase() === needle\r\n          );\r\n\r\n          if (matchedOption && !this.selectedItems.has(matchedOption.id)) {\r\n            if (this.singleSelect) {\r\n              this.selectedItems.clear();\r\n            }\r\n            this.selectedItems.add(matchedOption.id);\r\n            hasChanges = true;\r\n          }\r\n        });\r\n\r\n        // Only emit if there were changes\r\n        if (hasChanges) {\r\n          this.selectedChange.emit(this.selectedOptions);\r\n        }\r\n\r\n        // Clear input after processing\r\n        this.inputText = '';\r\n        target.value = '';\r\n      }\r\n    }\r\n  }\r\n\r\n  onInputClick() {\r\n    // Open dropdown on input click\r\n    this.isDropdownOpen = true;\r\n  }\r\n\r\n  onInputFocus() {\r\n    // Open dropdown on focus\r\n    this.isDropdownOpen = true;\r\n  }\r\n\r\n  toggleSelection(option: StoreOption) {\r\n    if (this.singleSelect) {\r\n      if (this.selectedItems.has(option.id)) {\r\n        this.selectedItems.delete(option.id);\r\n      } else {\r\n        this.selectedItems.clear();\r\n        this.selectedItems.add(option.id);\r\n      }\r\n      this.isDropdownOpen = false;\r\n      this.selectedChange.emit(this.selectedOptions);\r\n      return;\r\n    }\r\n    if (this.selectedItems.has(option.id)) {\r\n      this.selectedItems.delete(option.id);\r\n    } else {\r\n      this.selectedItems.add(option.id);\r\n    }\r\n    this.selectedChange.emit(this.selectedOptions);\r\n  }\r\n\r\n  removeChip(option: StoreOption, event: Event) {\r\n    event.stopPropagation();\r\n    event.preventDefault();\r\n    this.selectedItems.delete(option.id);\r\n    this.selectedChange.emit(this.selectedOptions);\r\n  }\r\n\r\n  onDropdownClick(event: Event) {\r\n    // Prevent click from bubbling to document\r\n    event.stopPropagation();\r\n  }\r\n}\r\n","<div class=\"input-wrapper\" #inputWrapper>\r\n    <div class=\"form-control custom-input d-flex align-items-center gap-2 flex-wrap\" \r\n         (click)=\"onInputClick()\">\r\n        <span *ngFor=\"let option of selectedOptions\" \r\n              class=\"store-badge\"\r\n              (click)=\"removeChip(option, $event)\">\r\n            <span class=\"badge-text\">{{ option.label }}</span>\r\n            <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n            </svg>\r\n        </span>\r\n        <textarea \r\n            class=\"input-text\"\r\n            rows=\"1\"\r\n            [value]=\"inputText\"\r\n            (input)=\"onInputChange($event)\"\r\n            (keydown)=\"onKeyDown($event)\"\r\n            (focus)=\"onInputFocus()\"\r\n            placeholder=\"Type and press Enter\"\r\n            autocomplete=\"off\"></textarea>\r\n    </div>\r\n    <div class=\"dropdown-menu-custom\" \r\n         *ngIf=\"isDropdownOpen && options.length > 0\"\r\n         (click)=\"onDropdownClick($event)\">\r\n        <div class=\"dropdown-item-custom select-all-item\"\r\n             *ngIf=\"!singleSelect\"\r\n             (click)=\"toggleSelectAll()\">\r\n            <div class=\"custom-checkbox\">\r\n                <div class=\"checkbox-box\" [class.checked]=\"isAllSelected\" [class.indeterminate]=\"isIndeterminate\">\r\n                    <svg *ngIf=\"isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                    <svg *ngIf=\"isIndeterminate && !isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <path d=\"M2 6H10\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\"/>\r\n                    </svg>\r\n                </div>\r\n            </div>\r\n            <span class=\"dropdown-item-text\">Select All</span>\r\n        </div>\r\n        <div class=\"w-100 search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n            <input \r\n                type=\"text\" \r\n                [(ngModel)]=\"searchText\"\r\n                (input)=\"onSearchChange()\"\r\n                placeholder=\"Search\"\r\n                autocomplete=\"off\">\r\n            <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n                <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n            </svg>\r\n        </div>\r\n        <hr class=\"dropdown-divider\">\r\n        <div *ngFor=\"let option of filteredOptions\" \r\n             class=\"dropdown-item-custom\"\r\n             (click)=\"toggleSelection(option)\">\r\n            <div class=\"custom-checkbox\">\r\n                <div class=\"checkbox-box\" [class.checked]=\"isSelected(option.id)\">\r\n                    <svg *ngIf=\"isSelected(option.id)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                </div>\r\n            </div>\r\n            <span class=\"dropdown-item-text\">{{ option.label }}</span>\r\n        </div>\r\n    </div>\r\n</div>","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\n\r\n@Component({\r\n  selector: 'lib-store-dropdown',\r\n  templateUrl: './store-dropdown.component.html',\r\n  styleUrl: './store-dropdown.component.scss',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StoreDropdownComponent implements OnChanges, OnInit, OnDestroy {\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onClick(event: MouseEvent) {\r\n    const target = event.target as HTMLElement;\r\n    if (!target.closest('.dropdown')) {\r\n      this.showDropdown = false;\r\n    }\r\n  }\r\n\r\n  @Input() items: any\r\n  @Input() searchField: string\r\n  @Input() multi: boolean\r\n  @Input() idField: string\r\n  @Input() selectedValues: any = []\r\n  @Input() disabled: boolean | undefined\r\n  @Input() label: string\r\n\r\n  @Output() selected = new EventEmitter<any>()\r\n  filteredValues: any = []\r\n  showDropdown: boolean\r\n  searchValue: string\r\n  instanceId: any;\r\n  private destroy$ = new Subject<void>();\r\n  private isUpdating = false;\r\n\r\n  constructor(private cd: ChangeDetectorRef, private authService: StoreBuilderService) { }\r\n  \r\n  ngOnInit(): void {\r\n    this.instanceId = crypto.randomUUID();\r\n    this.authService.dropDownTrigger\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((e) => {\r\n        if (e !== this.instanceId) {\r\n          this.showDropdown = false\r\n          this.cd.detectChanges()\r\n        }\r\n      })\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Prevent infinite loops\r\n    if (this.isUpdating) {\r\n      return;\r\n    }\r\n\r\n    if (changes['items']) {\r\n      const itemsChanged = JSON.stringify(changes['items'].currentValue) !== JSON.stringify(changes['items'].previousValue);\r\n      if (itemsChanged && this.items?.length) {\r\n        this.initializeItems();\r\n      }\r\n    }\r\n    \r\n    if (changes['selectedValues']) {\r\n      const selectedChanged = JSON.stringify(changes['selectedValues'].currentValue) !== JSON.stringify(changes['selectedValues'].previousValue);\r\n      if (selectedChanged && Array.isArray(changes['selectedValues']?.currentValue)) {\r\n        if (changes['selectedValues'].currentValue.length > 0) {\r\n          this.updateSelectedValues();\r\n        } else {\r\n          // Clear selections if empty array\r\n          this.filteredValues.forEach((item: any) => {\r\n            item.isSelected = false;\r\n          });\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  initializeItems() {\r\n    this.isUpdating = true;\r\n    this.filteredValues = this.items.map((item: any) => ({ ...item, isSelected: false }));\r\n    this.updateSelectedValues();\r\n    this.isUpdating = false;\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateSelectedValues() {\r\n    if (!this.filteredValues || !this.selectedValues) {\r\n      return;\r\n    }\r\n    \r\n    // First, clear all selections\r\n    this.filteredValues.forEach((item: any) => {\r\n      item.isSelected = false;\r\n    });\r\n    \r\n    // Then, set selected items\r\n    this.selectedValues?.forEach((selectedItem: any) => {\r\n      const item = this.filteredValues?.find((filteredItem: any) => filteredItem?.[this.idField] === selectedItem?.[this.idField]);\r\n      if (item) {\r\n        item.isSelected = true;\r\n      }\r\n    });\r\n  }\r\n\r\n  openDropdown(event: any) {\r\n    this.authService.dropDownTrigger.next(this.instanceId)\r\n    event.stopPropagation();\r\n    this.showDropdown = !this.showDropdown;\r\n  }\r\n\r\n  onInput(event: any) {\r\n    if (!event.target.value) {\r\n      this.filteredValues = this.items.map((item: any) => ({ ...item }));\r\n    } else {\r\n      const searchTerm = event.target.value.toLowerCase();\r\n      this.filteredValues = this.items\r\n        .filter((item: any) => item[this.searchField]?.toLowerCase().includes(searchTerm))\r\n        .map((item: any) => ({ ...item }));\r\n    }\r\n    // Preserve selection state when filtering\r\n    this.updateSelectedValues();\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  onSelect(event: any, item: any) {\r\n    this.isUpdating = true;\r\n    \r\n    let newSelectedValues: any[];\r\n    \r\n    if (this.multi) {\r\n      if (event.currentTarget.checked) {\r\n        // Create new array instead of mutating input\r\n        newSelectedValues = [...this.selectedValues, item];\r\n      } else {\r\n        newSelectedValues = this.selectedValues.filter((elem: any) => elem[this.idField] !== item[this.idField]);\r\n      }\r\n    } else {\r\n      newSelectedValues = [{ ...item }];\r\n      this.filteredValues.forEach((element: any) => {\r\n        if (element[this.idField] !== item[this.idField]) {\r\n          element.isSelected = false\r\n        } else {\r\n          element.isSelected = true;\r\n        }\r\n      });\r\n      this.showDropdown = false;\r\n    }\r\n\r\n    // Update internal state\r\n    this.selectedValues = newSelectedValues;\r\n    this.updateSelectedValues();\r\n\r\n    const valuesToEmit = newSelectedValues.map((value: any) => {\r\n      const selectedItem = { ...value };\r\n      delete selectedItem.isSelected;\r\n      return selectedItem;\r\n    });\r\n\r\n    this.isUpdating = false;\r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n  }\r\n\r\n  onSelectAll(event: any) {\r\n    this.isUpdating = true;\r\n    const selectAll = event.currentTarget.checked;\r\n    this.filteredValues.forEach((item: any) => item.isSelected = selectAll);\r\n\r\n    // Create new array instead of mutating input\r\n    if (selectAll) {\r\n      this.selectedValues = [...this.filteredValues];\r\n    } else {\r\n      this.selectedValues = [];\r\n    }\r\n\r\n    const valuesToEmit = this.selectedValues.map((value: any) => {\r\n      const { isSelected, ...selectedItem } = value;\r\n      return selectedItem;\r\n    });\r\n\r\n    this.isUpdating = false;\r\n    this.cd.detectChanges();\r\n    this.emitSelectedValues(valuesToEmit);\r\n  }\r\n\r\n\r\n  emitSelectedValues(values: any[]) {\r\n    if (this.multi) {\r\n      this.selected.emit(values);\r\n    } else {\r\n      this.selected.emit(values[0]);\r\n    }\r\n  }\r\n\r\n  checkIfAllSelected() {\r\n    return this.filteredValues.every((item: any) => item.isSelected);\r\n  }\r\n}\r\n","<div class=\"outer-container\">\r\n    <div [ngClass]=\"disabled ? 'disable-input':''\"  (click)=\"openDropdown($event)\"  class=\"form-select\">\r\n        <span class=\"select-text\">\r\n            <ng-container *ngIf=\"multi\" >\r\n                {{selectedValues?.length}} {{label}} Selected    \r\n            </ng-container>\r\n            <ng-container *ngIf=\"!multi\" >\r\n                {{selectedValues?.[0]?.[searchField] || 'Select store'}}\r\n            </ng-container>\r\n        </span>\r\n        <svg class=\"chevron-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n        </svg>\r\n    </div>\r\n    <div [ngClass]=\"showDropdown ? '' : 'd-none'\" class=\"input-container dropdown\" >\r\n        <div class=\"w-100 input-wrapper\">\r\n        <input [(ngModel)]=\"searchValue\" placeholder=\"Search\"  (input)=\"onInput($event)\" type=\"text\">  \r\n        <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n            <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n          </svg>  \r\n        </div>\r\n        <ul>\r\n            <li *ngIf=\"multi && filteredValues?.length\">\r\n                <label class=\"form-check\" for=\"selectAll\">\r\n                    <input (change)=\"onSelectAll($event)\" [checked]=\"checkIfAllSelected()\" class=\"form-check-input me-3\" type=\"checkbox\"\r\n                        id=\"selectAll\">\r\n                    <span class=\"form-check-label\" >\r\n                        Select All\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngFor=\"let item of filteredValues\" [ngClass]=\"item.isSelected && !multi ? 'selected' : ''\" >\r\n                <label [for]=\"item[idField] + instanceId\" [ngClass]=\"multi  ? '': 'ps-0'\" class=\"form-check\">\r\n                    <input [ngClass]=\"multi  ? '': 'd-none'\" (change)=\"onSelect($event, item)\" [(ngModel)]=\"item.isSelected\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\"\r\n                        [id]=\"item[idField] + instanceId\">\r\n                    <span class=\"form-check-label\" >\r\n                        {{item[searchField]}}\r\n                    </span>\r\n                </label>\r\n            </li>\r\n            <li *ngIf=\"!filteredValues?.length\" >\r\n                <span class=\"d-flex align-items-center justify-content-center\" >No data found</span>\r\n            </li>\r\n        </ul>  \r\n    </div>  \r\n   \r\n</div>\r\n","import { NgFor, NgIf } from \"@angular/common\";\r\nimport {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  SimpleChanges,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { SHELF_COLORS } from \"../../../../data/fixture-template.data\";\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { firstValueFrom, Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport {\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../../../interfaces/fixture-template.interface\";\r\nimport { rgbToHex } from \"../../../../functions/plano.function\";\r\nimport { NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\n\r\n@Component({\r\n  selector: \"lib-store-fixture\",\r\n  standalone: true,\r\n  imports: [NgIf, NgFor, NgbTooltip],\r\n  templateUrl: \"./store-fixture.component.html\",\r\n  styleUrl: \"./store-fixture.component.scss\",\r\n})\r\nexport class StoreFixtureComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixture: any;\r\n\r\n  @Input() showColors: boolean = true;\r\n  @Input() showVMs: boolean = true;\r\n  @Input() showBCs: boolean = true;\r\n  @Input() disable: boolean = false;\r\n\r\n  @ViewChild(\"fixtureRoot\", { static: false })\r\n  fixtureRoot!: ElementRef<HTMLElement>;\r\n\r\n  clientId: string;\r\n\r\n  imgCDN: string;\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n    };\r\n  }[] = [];\r\n\r\n  isPageLoading: boolean = true;\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.isPageLoading = true;\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        this.isPageLoading = false;\r\n      });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"fixture\"]?.currentValue) {\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      }, 400);\r\n    }\r\n    // Handle showBCs changes to refresh brand category display\r\n    if (changes[\"showBCs\"] && !changes[\"showBCs\"].firstChange) {\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n      }, 100);\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  getSelectedVM(vm: any) {\r\n    // Return VM data directly from vmConfig, constructing the needed object\r\n    if (!vm) return null;\r\n    \r\n    // Construct imgUrl from vmConfig data\r\n    let imgUrl: string | undefined;\r\n    if (vm.vmImageUrl) {\r\n      imgUrl = this.imgCDN ? `${this.imgCDN}${vm.vmImageUrl}` : vm.vmImageUrl;\r\n    } else if (vm.vmImage) {\r\n      imgUrl = this.imgCDN ? `${this.imgCDN}${vm.vmImage}` : vm.vmImage;\r\n    } else if (vm.imgUrl) {\r\n      imgUrl = vm.imgUrl;\r\n    }\r\n    \r\n    // Return VM data with proper structure from vmConfig\r\n    return {\r\n      id: vm.vmId || vm._id,\r\n      name: vm.vmName || vm.name,\r\n      type: vm.vmType || vm.type,\r\n      imgUrl: imgUrl,\r\n      ...vm\r\n    };\r\n  }\r\n\r\n  private get bodyEl(): HTMLElement | null {\r\n    return (\r\n      this.fixtureRoot?.nativeElement?.querySelector(\"#body-block-sum\") ?? null\r\n    );\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    if (!this.showVMs) return true;\r\n\r\n    const viewPort = this.bodyEl;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    this.fixture?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf = e?.endYPosition ?? this.fixture?.shelfConfig?.length ?? 1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort?.querySelector(`#shelf${k}`) ||\r\n          viewPort?.querySelector(`#tray${k}`) ||\r\n          viewPort?.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = this.bodyEl;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"sumShelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 0;\r\n    switch (this.fixture?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixture?.shelfConfig ?? []\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\")\r\n            );\r\n\r\n            if (this.showColors) {\r\n              secDivs.forEach((d) => {\r\n                if (!d) return;\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n                cap.style.border = `1px solid ${this.shelfColors[i].border}`;\r\n              });\r\n            }\r\n          });\r\n\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            y += d.offsetHeight;\r\n          });\r\n\r\n          if (!this.showBCs) return true;\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id)\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                if (this.showColors) {\r\n                  bc.style.borderColor = color.border;\r\n                  bc.style.backgroundColor = \"#fff\";\r\n                }\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          let y = 0;\r\n\r\n          shelfDivs.forEach((div, i) => {\r\n            const cap = div.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (div.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[i].border}`;\r\n            y += div.offsetHeight;\r\n\r\n            if (this.showColors) {\r\n              div.style.backgroundColor = this.shelfColors[i].bg;\r\n              div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            }\r\n\r\n            if (!this.showBCs) return;\r\n\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            if (this.showColors) {\r\n              bc.style.borderColor = this.shelfColors[i].border;\r\n              bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            }\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          let y = 0;\r\n          shelfDivs.forEach((d) => {\r\n            if (!d) return;\r\n\r\n            if (this.showColors) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n            }\r\n\r\n            const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n            const sY =\r\n              y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n            cap.style.transform = `translateY(${sY}px)`;\r\n            cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n            y += d.offsetHeight;\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        let y = 0;\r\n        shelfDivs.forEach((d) => {\r\n          if (!d) return;\r\n\r\n          if (this.showColors) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n          }\r\n\r\n          const cap = d.querySelector(\".capacity\") as HTMLElement;\r\n          const sY =\r\n            y + (d.offsetHeight - cap.offsetHeight) / 2 - cap.offsetTop;\r\n          cap.style.transform = `translateY(${sY}px)`;\r\n          cap.style.border = `1px solid ${this.shelfColors[0].border}`;\r\n          y += d.offsetHeight;\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n\r\n    let pZone: string | null = null;\r\n    for (const s of this.fixture?.shelfConfig ?? []) {\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        newSectionByZones[newSectionByZones.length - 1].section.shelves.push(\r\n          shelfId\r\n        );\r\n        newSectionByZones[newSectionByZones.length - 1].section.shelfDivs.push(\r\n          shelfDiv\r\n        );\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixture?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixture?.shelfConfig?.map((s: any) => {\r\n        const shelfLabel = `${s.shelfType} ${s.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...s,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","@if(isPageLoading){\r\n    <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n}@else {\r\n    <section #fixtureRoot id=\"fixture-view\" [class.disabled]=\"disable\">\r\n        <div id=\"vm-products-sum\" class=\"wall-viewport\">\r\n            <!-- Header block -->\r\n            <div class=\"header-block\" *ngIf=\"fixture?.header?.isEnabled && fixture?.fixtureType === 'wall'\">\r\n                <p>{{ fixture?.header?.label }}</p>\r\n            </div>\r\n\r\n            <!-- Body block -->\r\n            <div id=\"body-block-sum\" class=\"body-block\">\r\n                <!----------------------------------[VM BLOCK]--------------------------------------->\r\n                <div *ngIf=\"fixture?.vmConfig?.length && showVMs\">\r\n                    <ng-container *ngFor=\"let vm of fixture?.vmConfig; let i = index\">\r\n                        <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                            <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n                                <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n                                    alt=\"Vm Image\" />\r\n                                <ng-template #placeholder>\r\n                                    <div class=\"vm-placeholder\">\r\n                                        <h3>{{ selectedVM?.name }}</h3>\r\n                                    </div>\r\n                                </ng-template>\r\n                            </ng-container>\r\n                        </div>\r\n                    </ng-container>\r\n                </div>\r\n\r\n                <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"fixture-level\" *ngIf=\"fixture?.productResolutionLevel === 'L1' && showBCs\">\r\n                    <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixture?.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\">\r\n                            <ng-container *ngFor=\"let b of fixture?.productBrandName; let last = last\">\r\n                                <span class=\"badge draft me-1\">\r\n                                    {{ b }}\r\n                                </span>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span class=\"category\" *ngIf=\"fixture?.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"fixture?.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of fixture?.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n                <div id=\"section-level\" *ngIf=\"fixture?.productResolutionLevel === 'L3' && showBCs\">\r\n                    <!-- <div id=\"body-loader\">\r\n                    <div class=\"loader\"></div>\r\n                </div> -->\r\n                    @for (item of sectionByZones; track $index) {\r\n                        <div [id]=\"'brand-category' + $index\" class=\"brand-category\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <div class=\"w-100 d-flex justify-content-center\">\r\n                                <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                                <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                                <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </span>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                        {{ b }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                                <p *ngIf=\"item?.section?.categories?.length\">\r\n                                    <b>Categories: </b>\r\n                                    @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    }\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    }\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixture?.shelfConfig; let i = index\">\r\n                    <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                    <div id=\"shelf-level\" *ngIf=\"fixture?.productResolutionLevel === 'L2' && showBCs\">\r\n                        <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                            [ngbTooltip]=\"brandCategoryTooltip\">\r\n                            <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                            <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                                <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </span>\r\n                        </div>\r\n                        <ng-template #brandCategoryTooltip>\r\n                            <div>\r\n                                <p>\r\n                                    <b>Brands: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                                <p *ngIf=\"item.productCategory?.length\">\r\n                                    <b>Categories: </b>\r\n                                    <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                        {{ c }}\r\n                                        <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                    </ng-container>\r\n                                </p>\r\n                            </div>\r\n                        </ng-template>\r\n                    </div>\r\n                    <!------------------------------------------------------------------------->\r\n\r\n                    @if(item.shelfType ==='shelf'){\r\n                        <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            <div class=\"capacity\">{{item.productPerShelf}}</div>\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                            <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                                <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                            </div>\r\n                            <div class=\"capacity\">{{item.productPerShelf * item.trayRows}}</div>\r\n                        </div>\r\n                    }\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Footer block -->\r\n            <div class=\"footer-block\" *ngIf=\"fixture?.footer?.isEnabled && fixture?.fixtureType === 'wall'\">\r\n                <div class=\"sub-footer left-box\"></div>\r\n                <div class=\"sub-footer right-box\"></div>\r\n                <p>{{ fixture?.footer?.label }}</p>\r\n            </div>\r\n        </div>\r\n    </section>\r\n}\r\n","import { Component, inject, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'lib-batch-confirmation-modal',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  templateUrl: './batch-confirmation-modal.component.html',\r\n  styleUrl: './batch-confirmation-modal.component.scss'\r\n})\r\nexport class BatchConfirmationModalComponent {\r\n  activeModal = inject(NgbActiveModal);\r\n  \r\n  @Input() storeCount: number = 0;\r\n\r\n  onCancel(): void {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onProceed(): void {\r\n    this.activeModal.close(true);\r\n  }\r\n}\r\n","<div class=\"modal-content-custom\">\r\n    <!-- Modal Header -->\r\n    <div class=\"modal-header-custom\">\r\n        <h5 class=\"modal-title\">Start batch process?</h5>\r\n    </div>\r\n    \r\n    <!-- Modal Body -->\r\n    <div class=\"modal-body-custom\">\r\n        <p class=\"description-text\">\r\n            This will initiate the batch process for {{ storeCount }} {{ storeCount === 1 ? 'store' : 'stores' }}. \r\n            This process will take time and you need to review several stores before proceeding.\r\n        </p>\r\n        <p class=\"description-text\">\r\n            Are you sure you want to continue?\r\n        </p>\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)=\"onProceed()\">Proceed</button>\r\n    </div>\r\n</div>\r\n","import { Component, OnInit, OnDestroy, AfterViewInit, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { CommonModule, TitleCasePipe } from '@angular/common';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { ReactiveSelectComponent } from '../../../reactive-select/reactive-select.component';\r\nimport { StoreSelectComponent, StoreOption } from '../../components/store-select/store-select.component';\r\nimport { StoreDropdownComponent } from '../../components/store-dropdown/store-dropdown.component';\r\nimport { FormControl } from '@angular/forms';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\nimport { CollectionUpdateAiDataService } from '../../services/data.service';\r\nimport { Store, FindReplace } from '../../models/find-replace.model';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport * as fabric from \"fabric\";\r\nimport { StoreFixtureComponent } from '../../components/store-fixture/store-fixture.component';\r\nimport { VmLibraryList } from '../../../../interfaces/vm-library.interface';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { BatchConfirmationModalComponent } from './batch-confirmation-modal/batch-confirmation-modal.component';\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from '../../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: 'lib-prepare-template',\r\n  standalone: true,\r\n  imports: [CommonModule, ReactiveFormsModule, FormsModule, ReactiveSelectComponent, StoreSelectComponent, StoreDropdownComponent, StoreFixtureComponent],\r\n  templateUrl: './prepare-template.component.html',\r\n  styleUrl: './prepare-template.component.scss',\r\n  providers: [TitleCasePipe]\r\n})\r\n\r\nexport class PrepareTemplateComponent implements OnInit, OnDestroy, AfterViewInit {\r\n  searchModes = [\r\n    { value: 'store', label: 'Stores' },\r\n    { value: 'cluster', label: 'Clusters' },\r\n  ];\r\n  selectedMode = new FormControl('store');\r\n  target = new FormControl('both');\r\n  findPrompt = new FormControl('');\r\n  replacePrompt = new FormControl('');\r\n  // lib-reactive-select binds via ControlValueAccessor and emits the selected ID, not the full object.\r\n  // Keep the FormControl typed as a string (the _id) and look up the full record via getReplaceBrandSelection() / getReplaceVmSelection().\r\n  replaceBrand = new FormControl<string | null>(null);\r\n  replaceVm = new FormControl<string | null>(null);\r\n  \r\n  storeOptions: StoreOption[] = [];\r\n  clusterData: any[] = [];\r\n  loading: boolean = false;\r\n  savingDraft: boolean = false;\r\n  batchProcessing: boolean = false;\r\n  private destroy$ = new Subject<void>();\r\n  \r\n  selectedStores: StoreOption[] = [];\r\n  findReplaceData: FindReplace | null = null;\r\n  selectedStoreForPreview: any = null;\r\n  storeListForDropdown: any[] = [];\r\n  storeDropdownItems: any[] = [];\r\n  selectedStoreValues: any[] = [];\r\n\r\n  // Canvas properties\r\n  @ViewChild('previewCanvas') previewCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('previewCanvasContainer') previewCanvasContainerRef!: ElementRef<HTMLDivElement>;\r\n  previewCanvas!: fabric.Canvas;\r\n  planoData: any;\r\n  floorData: any;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  cdnUrl: string = '';\r\n  activeHighlight: fabric.Rect | null = null;\r\n  cancelHighlightBlink = false;\r\n  selectedFixture: any;\r\n  selectedFixtureData: any = null;\r\n  originalFixtureData: any = null;\r\n  private originalFixturesMap: Map<string, any> = new Map();\r\n  isRightPanelCollapsed = false;\r\n  canvasLoading = false;\r\n  findLoading = false;\r\n  replaceLoading = false;\r\n  findExecuted = false;\r\n  replaceExecuted = false;\r\n  isFindPromptFromApi = false;\r\n  allFixtureInstances: any[] = [];\r\n  vmList: VmLibraryList[] = [];\r\n  brandList: any[] = [];\r\n  replaceVmList: any[] = [];\r\n  clientId: string = '';\r\n  hideMetadata: boolean = false;\r\n\r\n  private previousSearchMode: 'store' | 'cluster' | null = null;\r\n  private isInitialLoad = true;\r\n  private hasRestoredData = false;\r\n  private isUpdatingFromService = false;\r\n  private isLoadingPlanogram = false;\r\n\r\n  get hasStores(): boolean {\r\n    return !!(this.findReplaceData?.stores && this.findReplaceData.stores.length > 0);\r\n  }\r\n\r\n  getStoreCount(): number {\r\n    return this.findReplaceData?.storeCount || this.findReplaceData?.stores?.length || 0;\r\n  }\r\n\r\n  getCurrentFixtureData(): any {\r\n    return this.selectedFixtureData || this.originalFixtureData;\r\n  }\r\n\r\n  getFixtureLabel(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.header?.label || '';\r\n  }\r\n\r\n  getFixtureCategory(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.fixtureCategory || '';\r\n  }\r\n\r\n  getFixtureWidth(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    if (!fixture?.fixtureWidth) return '';\r\n    const width = fixture.fixtureWidth.value;\r\n    const unit = fixture.fixtureWidth.unit || 'mm';\r\n    let dimensionStr = `${width}${unit}`;\r\n    // Convert to feet if needed (1200mm = 4ft)\r\n    if (unit === 'mm' && width === 1200) {\r\n      dimensionStr = `${width}${unit}/4ft`;\r\n    } else if (unit === 'mm' && width > 0) {\r\n      const feet = Math.round(width / 300);\r\n      if (feet > 0) {\r\n        dimensionStr = `${width}${unit}/${feet}ft`;\r\n      }\r\n    }\r\n    return dimensionStr;\r\n  }\r\n\r\n  getShelfCount(): number {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.shelfConfig?.length || 0;\r\n  }\r\n\r\n  getFixtureCapacity(): number {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.fixtureCapacity || 0;\r\n  }\r\n\r\n  getOriginalFixtureForDisplay(): any {\r\n    // If originalFixtureData exists, use it\r\n    if (this.originalFixtureData) {\r\n      return this.originalFixtureData;\r\n    }\r\n    // If not, try to get from map using selectedFixtureData ID\r\n    if (this.selectedFixtureData?._id) {\r\n      const storedOriginal = this.originalFixturesMap.get(this.selectedFixtureData._id);\r\n      if (storedOriginal) {\r\n        return storedOriginal;\r\n      }\r\n    }\r\n    // Fallback to selectedFixtureData (for find-only case)\r\n    return this.selectedFixtureData;\r\n  }\r\n\r\n  shouldShowBeforeAfter(): boolean {\r\n    // Show Before/After only when selectedFixtureData exists AND it has find data\r\n    if (!this.selectedFixtureData) {\r\n      return false;\r\n    }\r\n    // Check if this fixture has find data (findResponseData exists for this specific fixture)\r\n    if (this.findReplaceData?.stores && this.selectedStoreForPreview) {\r\n      const store = this.findReplaceData.stores.find(\r\n        (s: Store) => s.storeName === this.selectedStoreForPreview.storeName\r\n      );\r\n      // Show Before/After if findResponseData exists and matches the current fixture\r\n      if (store?.findResponseData && store.findResponseData === this.selectedFixtureData._id) {\r\n        return true;\r\n      }\r\n    }\r\n    // Also check if findExecuted flag is set AND we have originalFixtureData or it's in the map\r\n    // This handles the case when find was just executed\r\n    if (this.findExecuted) {\r\n      const fixtureId = this.selectedFixtureData._id;\r\n      // Check if we have original fixture stored (either in originalFixtureData or map)\r\n      if (this.originalFixtureData || this.originalFixturesMap.has(fixtureId)) {\r\n        return true;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  isAfterDisabled(): boolean {\r\n    // Enable After only when replaceResponseData exists for the current fixture\r\n    // After clicking \"Run\" on find, the fixture should be disabled until replace response is available\r\n    if (!this.selectedFixtureData) {\r\n      return true; // Disable if no fixture data\r\n    }\r\n    \r\n    // Check if replaceResponseData exists for current store\r\n    // replaceResponseData is an object with vmConfig and/or shelfConfig when replace is executed\r\n    if (this.findReplaceData?.stores && this.selectedStoreForPreview) {\r\n      const store = this.findReplaceData.stores.find(\r\n        (s: Store) => s.storeName === this.selectedStoreForPreview.storeName\r\n      );\r\n      \r\n      // Check if replaceResponseData exists and is an object (has vmConfig or shelfConfig)\r\n      if (store?.replaceResponseData && typeof store.replaceResponseData === 'object') {\r\n        // Verify it has at least one config property (vmConfig or shelfConfig)\r\n        if (store.replaceResponseData.vmConfig || store.replaceResponseData.shelfConfig) {\r\n          return false; // Replace response available, enable After\r\n        }\r\n      }\r\n    }\r\n    \r\n    // Also check replaceExecuted flag as a fallback (for immediate updates after replace)\r\n    if (this.replaceExecuted && this.originalFixtureData) {\r\n      return false; // Replace was just executed, enable After\r\n    }\r\n    \r\n    // Default: disable After if no replace response is available\r\n    return true;\r\n  }\r\n\r\n  constructor(\r\n    private storeBuilderService: StoreBuilderService,\r\n    private dataService: CollectionUpdateAiDataService,\r\n    private titleCase: TitleCasePipe,\r\n    private cdr: ChangeDetectorRef,\r\n    private gs: GlobalStateService,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private toastService: ToastService,\r\n    private modalService: NgbModal\r\n  ) {}\r\n\r\n\r\n\r\n  ngOnInit(): void {\r\n    // Get client ID and CDN URL\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => {\r\n        this.cdnUrl = env.planogramCDN || '';\r\n      });\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          const headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string\r\n          );\r\n          if (headerData?.client) {\r\n            this.clientId = headerData.client;\r\n          }\r\n        }\r\n        if (this.clientId) {\r\n          this.loadReplaceLibraries();\r\n        }\r\n      });\r\n\r\n    // Subscribe to data service to restore saved data\r\n    this.dataService.getFindReplaceData()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        // Prevent infinite loops by skipping updates when we're updating from form changes\r\n        if (this.isUpdatingFromService) {\r\n          return;\r\n        }\r\n        \r\n        this.findReplaceData = data;\r\n        \r\n        if (data && !this.hasRestoredData) {\r\n          // Restore all form values on first data load\r\n          // Don't call updateStoreDropdownItems here as restoreFormValues will handle it\r\n          this.restoreFormValues(data);\r\n          this.hasRestoredData = true;\r\n        } else if (data && this.hasRestoredData) {\r\n\r\n          // Update store dropdown items when stores change (after initial restore)\r\n          this.updateStoreDropdownItems();\r\n          \r\n          // If data already restored, only handle searchMode changes\r\n          if (data.searchMode && data.searchMode !== this.previousSearchMode) {\r\n            this.selectedMode.setValue(data.searchMode, { emitEvent: false });\r\n            this.previousSearchMode = data.searchMode;\r\n            this.loadStoresOrClusters(data);\r\n          }\r\n          // Check if currently previewed store is still in the list\r\n          if (data.stores && data.stores.length > 0) {\r\n            const isCurrentStoreStillInList = this.selectedStoreForPreview && \r\n              data.stores.some((store: Store) => \r\n                (store.storeId || store.storeName) === this.selectedStoreForPreview.storeId ||\r\n                store.storeName === this.selectedStoreForPreview.storeName\r\n              );\r\n            \r\n            // If current store was removed or no store is selected, switch to first store\r\n            if (!isCurrentStoreStillInList) {\r\n              const newStore = this.storeDropdownItems[0];\r\n              if (newStore) {\r\n                this.selectedStoreForPreview = newStore;\r\n                this.updateSelectedStoreValues();\r\n                \r\n                // Restore findResponseData and replaceResponseData for the selected store if available\r\n                this.restoreStoreResponseData(newStore.storeName);\r\n                \r\n                // Load planogram for the selected store\r\n                this.cdr.detectChanges();\r\n                setTimeout(() => {\r\n                  if (this.initializeCanvas()) {\r\n                    this.loadPlanogramForStore(newStore.storeName);\r\n                  }\r\n                }, 50);\r\n              }\r\n            }\r\n          } else if (data.stores && data.stores.length === 0) {\r\n            // If all stores are removed, clear the preview\r\n            this.selectedStoreForPreview = null;\r\n            this.updateSelectedStoreValues();\r\n          }\r\n        } else if (!data && this.isInitialLoad) {\r\n          // Load initial data if no saved data\r\n          this.loadStoresOrClusters();\r\n          this.isInitialLoad = false;\r\n        }\r\n      });\r\n\r\n    // Subscribe to save draft loading state\r\n    this.dataService.getLoadingState()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((isLoading) => {\r\n        this.savingDraft = isLoading;\r\n      });\r\n\r\n    // Watch for mode changes\r\n    this.selectedMode.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((newMode) => {\r\n        if (newMode !== this.previousSearchMode && !this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.previousSearchMode = newMode as 'store' | 'cluster';\r\n          \r\n          // Get current data to preserve selectedClusters if switching to cluster mode\r\n          const currentData = this.dataService.getCurrentData();\r\n          \r\n          // Update data service with new searchMode\r\n          this.dataService.updateData({ \r\n            searchMode: newMode as 'store' | 'cluster',\r\n            stores: [], // Clear stores when mode changes\r\n            selectedClusters: newMode === 'store' ? undefined : currentData?.selectedClusters\r\n          });\r\n          \r\n          this.loadStoresOrClusters();\r\n          // Clear selected stores when mode changes manually\r\n          this.selectedStores = [];\r\n          \r\n          // Clear preview when mode changes\r\n          this.selectedStoreForPreview = null;\r\n          this.updateSelectedStoreValues();\r\n          this.selectedFixtureData = null;\r\n          this.originalFixtureData = null;\r\n          this.originalFixturesMap.clear();\r\n          \r\n          // Reset flags\r\n          this.findExecuted = false;\r\n          this.replaceExecuted = false;\r\n          \r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n\r\n    // Watch for target changes - debounce to prevent excessive updates\r\n    this.target.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((value) => {\r\n        if (value && !this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.dataService.updateData({ target: value as 'merch' | 'vm' | 'both' });\r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n\r\n    // Watch for find prompt changes - debounce to prevent excessive updates\r\n    this.findPrompt.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((value) => {\r\n        // Reset findExecuted flag when user edits the find prompt\r\n        if (this.findExecuted) {\r\n          this.findExecuted = false;\r\n        }\r\n        \r\n        // Reset isFindPromptFromApi flag when user edits the find prompt\r\n        if (this.isFindPromptFromApi) {\r\n          this.isFindPromptFromApi = false;\r\n        }\r\n        \r\n        if (!this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.dataService.updateData({ findPrompt: value || '' });\r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n\r\n    // Watch for replace prompt changes - debounce to prevent excessive updates\r\n    this.replacePrompt.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((value) => {\r\n        // Reset replaceExecuted flag when user edits the replace prompt\r\n        if (this.replaceExecuted) {\r\n          this.replaceExecuted = false;\r\n        }\r\n\r\n        if (!this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.dataService.updateData({ replacePrompt: value || '' });\r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n\r\n    // Watch for replaceBrand changes (form control holds the brand _id)\r\n    this.replaceBrand.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((id) => {\r\n        if (this.replaceExecuted) {\r\n          this.replaceExecuted = false;\r\n        }\r\n        if (!this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.dataService.updateData({ replaceBrand: this.getReplaceBrandSelection() });\r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n\r\n    // Watch for replaceVm changes (form control holds the vm _id)\r\n    this.replaceVm.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((id) => {\r\n        if (this.replaceExecuted) {\r\n          this.replaceExecuted = false;\r\n        }\r\n        if (!this.isUpdatingFromService) {\r\n          this.isUpdatingFromService = true;\r\n          this.dataService.updateData({ replaceVm: this.getReplaceVmSelection() });\r\n          setTimeout(() => {\r\n            this.isUpdatingFromService = false;\r\n          }, 0);\r\n        }\r\n      });\r\n  }\r\n\r\n  getReplaceBrandSelection(): { _id: string; brandName: string } | null {\r\n    const id = this.replaceBrand.value;\r\n    if (!id) return null;\r\n    const found = this.brandList.find((b: any) => b._id === id);\r\n    return found ? { _id: found._id, brandName: found.brandName } : null;\r\n  }\r\n\r\n  getReplaceVmSelection(): { _id: string; vmName: string; vmType?: string; vmBrand?: string } | null {\r\n    const id = this.replaceVm.value;\r\n    if (!id) return null;\r\n    const found = this.replaceVmList.find((v: any) => v._id === id);\r\n    return found\r\n      ? { _id: found._id, vmName: found.vmName, vmType: found.vmType, vmBrand: found.vmBrand }\r\n      : null;\r\n  }\r\n\r\n  private loadReplaceLibraries(): void {\r\n    if (!this.clientId) return;\r\n\r\n    if (!this.brandList.length) {\r\n      this.storeBuilderService.getReplaceBrandList(this.clientId)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res?.code === 200 && Array.isArray(res?.data)) {\r\n              this.brandList = res.data;\r\n              // Sync the data service with the resolved object now that the list is available\r\n              if (this.replaceBrand.value) {\r\n                this.dataService.updateData({ replaceBrand: this.getReplaceBrandSelection() });\r\n              }\r\n            }\r\n          },\r\n          error: (err) => console.error('Error loading brand list:', err)\r\n        });\r\n    }\r\n\r\n    if (!this.replaceVmList.length) {\r\n      this.storeBuilderService.getReplaceVmList(this.clientId)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res?.code === 200 && Array.isArray(res?.data)) {\r\n              this.replaceVmList = res.data;\r\n              if (this.replaceVm.value) {\r\n                this.dataService.updateData({ replaceVm: this.getReplaceVmSelection() });\r\n              }\r\n            }\r\n          },\r\n          error: (err) => console.error('Error loading replace vm list:', err)\r\n        });\r\n    }\r\n  }\r\n\r\n  needsReplaceBrand(): boolean {\r\n    const t = this.target.value;\r\n    return t === 'merch' || t === 'both';\r\n  }\r\n\r\n  needsReplaceVm(): boolean {\r\n    const t = this.target.value;\r\n    return t === 'vm' || t === 'both';\r\n  }\r\n\r\n  hasReplaceSelection(): boolean {\r\n    if (this.needsReplaceBrand() && !this.replaceBrand.value) {\r\n      return false;\r\n    }\r\n    if (this.needsReplaceVm() && !this.replaceVm.value) {\r\n      return false;\r\n    }\r\n    return this.needsReplaceBrand() || this.needsReplaceVm();\r\n  }\r\n\r\n  private restoreFormValues(data: FindReplace): void {\r\n    // Restore searchMode\r\n    if (data.searchMode) {\r\n      this.selectedMode.setValue(data.searchMode, { emitEvent: false });\r\n      this.previousSearchMode = data.searchMode;\r\n    }\r\n    \r\n    // Restore target\r\n    if (data.target) {\r\n      this.target.setValue(data.target, { emitEvent: false });\r\n    }\r\n    \r\n    // Restore findPrompt\r\n    if (data.findPrompt) {\r\n      this.findPrompt.setValue(data.findPrompt, { emitEvent: false });\r\n      this.isFindPromptFromApi = true;\r\n    }\r\n    \r\n    // Restore replacePrompt\r\n    if (data.replacePrompt) {\r\n      this.replacePrompt.setValue(data.replacePrompt, { emitEvent: false });\r\n    }\r\n\r\n    // Restore replaceBrand / replaceVm — form controls hold the _id only\r\n    if (data.replaceBrand?._id) {\r\n      this.replaceBrand.setValue(data.replaceBrand._id, { emitEvent: false });\r\n    }\r\n    if (data.replaceVm?._id) {\r\n      this.replaceVm.setValue(data.replaceVm._id, { emitEvent: false });\r\n    }\r\n    \r\n    // Load stores/clusters and restore selections\r\n    if (data.searchMode) {\r\n      this.loadStoresOrClusters(data);\r\n    } else {\r\n      this.loadStoresOrClusters();\r\n    }\r\n    \r\n    // Set initial selected store for preview\r\n    if (data.stores && data.stores.length > 0) {\r\n      // Skip planogram load here as we'll load it explicitly below\r\n      this.updateStoreDropdownItems(true);\r\n      if (this.storeDropdownItems.length > 0) {\r\n        this.selectedStoreForPreview = this.storeDropdownItems[0];\r\n        this.updateSelectedStoreValues();\r\n        // Load planogram after view is initialized\r\n        this.cdr.detectChanges();\r\n        setTimeout(() => {\r\n          if (this.initializeCanvas() && this.selectedStoreForPreview) {\r\n            this.loadPlanogramForStore(this.selectedStoreForPreview.storeName);\r\n          } else {\r\n            // Retry if canvas not ready\r\n            setTimeout(() => {\r\n              if (this.initializeCanvas() && this.selectedStoreForPreview) {\r\n                this.loadPlanogramForStore(this.selectedStoreForPreview.storeName);\r\n              }\r\n            }, 200);\r\n          }\r\n        }, 100);\r\n      }\r\n    }\r\n    \r\n    this.isInitialLoad = false;\r\n  }\r\n\r\n  private updateStoreDropdownItems(skipPlanogramLoad: boolean = false): void {\r\n    if (!this.findReplaceData?.stores) {\r\n      this.storeDropdownItems = [];\r\n      this.selectedStoreValues = [];\r\n      // If no stores, clear preview\r\n      if (this.selectedStoreForPreview) {\r\n        this.selectedStoreForPreview = null;\r\n      }\r\n      return;\r\n    }\r\n    \r\n    const newItems = this.findReplaceData.stores.map((store: Store) => ({\r\n      storeId: store.storeId || store.storeName,\r\n      storeName: store.storeName,\r\n      _id: store.storeId || store.storeName\r\n    }));\r\n    \r\n    // Check if currently previewed store is still in the list\r\n    const isCurrentStoreStillInList = this.selectedStoreForPreview && \r\n      newItems.some((item: any) => \r\n        item.storeId === this.selectedStoreForPreview.storeId ||\r\n        item.storeName === this.selectedStoreForPreview.storeName\r\n      );\r\n    \r\n    // Only update if items actually changed\r\n    const itemsChanged = JSON.stringify(newItems) !== JSON.stringify(this.storeDropdownItems);\r\n    if (itemsChanged) {\r\n      this.storeDropdownItems = newItems;\r\n      \r\n      // If current store was removed, switch to first store in the list\r\n      if (!isCurrentStoreStillInList && newItems.length > 0) {\r\n        const firstStore = newItems[0];\r\n        this.selectedStoreForPreview = firstStore;\r\n        this.updateSelectedStoreValues();\r\n        \r\n        // Restore findResponseData and replaceResponseData for the selected store if available\r\n        this.restoreStoreResponseData(firstStore.storeName);\r\n        \r\n        // Load planogram for the new store (unless skipped during initial restore)\r\n        if (!skipPlanogramLoad) {\r\n          this.cdr.detectChanges();\r\n          setTimeout(() => {\r\n            if (this.initializeCanvas()) {\r\n              this.loadPlanogramForStore(firstStore.storeName);\r\n            }\r\n          }, 50);\r\n        }\r\n      } else {\r\n        this.updateSelectedStoreValues();\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateSelectedStoreValues(): void {\r\n    if (this.selectedStoreForPreview) {\r\n      this.selectedStoreValues = [this.selectedStoreForPreview];\r\n    } else {\r\n      this.selectedStoreValues = [];\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    // Canvas will be initialized when store is selected and canvas element is available\r\n  }\r\n\r\n  initializeCanvas(): boolean {\r\n    if (this.previewCanvas) {\r\n      return true; // Already initialized\r\n    }\r\n    \r\n    if (this.previewCanvasRef?.nativeElement) {\r\n      try {\r\n        this.previewCanvas = new fabric.Canvas(this.previewCanvasRef.nativeElement, {\r\n          selectionFullyContained: true,\r\n          perPixelTargetFind: true,\r\n          targetFindTolerance: 5,\r\n        });\r\n        this.setupZoomHandlers(this.previewCanvas);\r\n        return true;\r\n      } catch (error) {\r\n        console.error('Error initializing canvas:', error);\r\n        return false;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  onStoreSelectedForPreview(store: any): void {\r\n    if (store && (!this.selectedStoreForPreview || this.selectedStoreForPreview.storeId !== store.storeId)) {\r\n      this.selectedStoreForPreview = store;\r\n      this.updateSelectedStoreValues();\r\n      \r\n      // Clear selected fixture when switching stores\r\n      this.selectedFixture = null;\r\n      this.selectedFixtureData = null;\r\n      this.originalFixtureData = null;\r\n      this.originalFixturesMap.clear(); // Clear the map when switching stores\r\n      \r\n      // Restore findResponseData and replaceResponseData for the selected store if available\r\n      this.restoreStoreResponseData(store.storeName);\r\n      \r\n      // Force change detection to ensure canvas element is in DOM\r\n      this.cdr.detectChanges();\r\n      \r\n      // Initialize canvas if not already done, then load planogram\r\n      setTimeout(() => {\r\n        if (this.initializeCanvas()) {\r\n          this.loadPlanogramForStore(store.storeName);\r\n        } else {\r\n          // Retry after a short delay if canvas element not ready\r\n          setTimeout(() => {\r\n            if (this.initializeCanvas()) {\r\n              this.loadPlanogramForStore(store.storeName);\r\n            }\r\n          }, 100);\r\n        }\r\n      }, 50);\r\n    }\r\n  }\r\n\r\n  // Restore findResponseData and replaceResponseData for a specific store\r\n  private restoreStoreResponseData(storeName: string): void {\r\n    if (!this.findReplaceData?.stores) {\r\n      return;\r\n    }\r\n\r\n    const store = this.findReplaceData.stores.find(\r\n      (s: Store) => s.storeName === storeName\r\n    );\r\n\r\n    if (!store) {\r\n      return;\r\n    }\r\n\r\n    // findResponseData is a string (fixture _id)\r\n    // replaceResponseData is an object with vmConfig and/or shelfConfig\r\n    const fixtureId = store.findResponseData;\r\n    if (!fixtureId) return;\r\n\r\n    this.selectedFixture = { fixtureId, fixtureType: undefined };\r\n    // We'll re-hydrate selectedFixtureData from the loaded planogram (floorData) after load.\r\n    this.selectedFixtureData = null;\r\n  }\r\n\r\n  // Apply stored findResponseData and replaceResponseData to floor data\r\n  private applyStoredResponseData(): void {\r\n    if (!this.findReplaceData?.stores || !this.selectedStoreForPreview || !this.floorData) {\r\n      return;\r\n    }\r\n\r\n    const store = this.findReplaceData.stores.find(\r\n      (s: Store) => s.storeName === this.selectedStoreForPreview.storeName\r\n    );\r\n\r\n    if (!store) {\r\n      return;\r\n    }\r\n\r\n    // findResponseData is a string (fixture _id) - use it to find the fixture\r\n    const fixtureId = store.findResponseData;\r\n    if (!fixtureId) return;\r\n\r\n    // Find the fixture in floorData\r\n    const fixture = this.getFixtureByIdFromFloor(fixtureId);\r\n    if (!fixture) return;\r\n\r\n    // Apply replaceResponseData configs if available (merge with existing fixture)\r\n    if (store.replaceResponseData) {\r\n      // Store the original fixture (before replace) for before/after comparison\r\n      // Only store if not already in map (preserve initial planogram fixture)\r\n      if (!this.originalFixturesMap.has(fixtureId)) {\r\n        const originalFixture = structuredClone(fixture);\r\n        this.originalFixturesMap.set(fixtureId, originalFixture);\r\n      }\r\n      // Restore originalFixtureData from map to ensure it's always the initial planogram fixture\r\n      const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n      if (storedOriginal) {\r\n        this.originalFixtureData = structuredClone(storedOriginal);\r\n      }\r\n      \r\n      const updatedFixture: any = { ...fixture };\r\n      \r\n      // Merge vmConfig if present in replaceResponseData\r\n      if (store.replaceResponseData.vmConfig) {\r\n        updatedFixture.vmConfig = store.replaceResponseData.vmConfig;\r\n      }\r\n      \r\n      // Merge shelfConfig if present in replaceResponseData\r\n      if (store.replaceResponseData.shelfConfig) {\r\n        updatedFixture.shelfConfig = store.replaceResponseData.shelfConfig;\r\n      }\r\n\r\n      // Update the fixture in floorData\r\n      this.updateAiResponseFixture(updatedFixture);\r\n      \r\n      // Set selected fixture data (after replace)\r\n      this.selectedFixture = {\r\n        fixtureId: updatedFixture._id,\r\n        fixtureType: updatedFixture.fixtureType,\r\n      };\r\n      this.selectedFixtureData = updatedFixture;\r\n    } else {\r\n      // No replaceResponseData, clear original fixture and just set the selected fixture from findResponseData\r\n      this.originalFixtureData = null;\r\n      this.selectedFixture = {\r\n        fixtureId: fixture._id,\r\n        fixtureType: fixture.fixtureType,\r\n      };\r\n      this.selectedFixtureData = fixture;\r\n    }\r\n  }\r\n\r\n  private getFixtureByIdFromFloor(fixtureId: string): any | null {\r\n    if (!fixtureId || !this.floorData) return null;\r\n\r\n    for (const element of this.floorData.layoutPolygon || []) {\r\n      if (element?.elementType === \"wall\" && Array.isArray(element.fixtures)) {\r\n        const hit = element.fixtures.find((fx: any) => fx?._id === fixtureId);\r\n        if (hit) return hit;\r\n      }\r\n    }\r\n\r\n    for (const fx of this.floorData.centerFixture || []) {\r\n      if (fx?._id === fixtureId) return fx;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  async loadPlanogramForStore(storeName: string): Promise<void> {\r\n    if (!storeName) {\r\n      console.warn('Cannot load planogram: storeName not available');\r\n      return;\r\n    }\r\n    \r\n    // Prevent duplicate concurrent calls\r\n    if (this.isLoadingPlanogram) {\r\n      console.log('Planogram load already in progress, skipping duplicate call');\r\n      return;\r\n    }\r\n    \r\n    if (!this.previewCanvas) {\r\n      console.warn('Canvas not initialized, attempting to initialize...');\r\n      if (!this.initializeCanvas()) {\r\n        console.error('Failed to initialize canvas');\r\n        return;\r\n      }\r\n    }\r\n    \r\n    this.isLoadingPlanogram = true;\r\n    this.canvasLoading = true;\r\n    try {\r\n      // Get planoId from store name\r\n      const response: any = await this.storeBuilderService.getPlanoId({ stores: [storeName.toUpperCase()] }).toPromise();\r\n      \r\n      if (response?.code === 200 && response?.data?.length > 0) {\r\n        const planoId = response.data[0]._id;\r\n        await this.getStoreFixtures(planoId);\r\n      } else {\r\n        console.warn('No planogram found for store:', storeName);\r\n        this.canvasLoading = false;\r\n        this.isLoadingPlanogram = false;\r\n        this.cdr.detectChanges();\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading planogram:', error);\r\n      this.canvasLoading = false;\r\n      this.isLoadingPlanogram = false;\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  loadStoresOrClusters(savedData?: FindReplace): void {\r\n    const searchMode = this.selectedMode.value as 'store' | 'cluster';\r\n    if (!searchMode) return;\r\n\r\n    this.loading = true;\r\n    this.storeBuilderService.getStoreOrClusterList({ searchMode })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (response: any) => {\r\n          this.loading = false;\r\n          if (response?.code === 200 && response?.data && Array.isArray(response.data)) {\r\n            if (searchMode === 'store') {\r\n              // For store mode, use data directly\r\n              this.storeOptions = response.data.map((item: any) => ({\r\n                id: item.id,\r\n                label: item.label\r\n              }));\r\n              this.clusterData = []; // Clear cluster data\r\n              \r\n              // Restore saved selections for store mode\r\n              if (savedData?.stores && savedData.stores.length > 0) {\r\n                this.restoreStoreSelections(savedData.stores);\r\n              }\r\n            } else {\r\n              // For cluster mode, show clusters in the dropdown\r\n              // Store full cluster data for later use\r\n              this.clusterData = response.data;\r\n              this.storeOptions = response.data.map((cluster: any) => ({\r\n                id: cluster.id,\r\n                label: cluster.label\r\n              }));\r\n              \r\n              // Restore saved selections for cluster mode\r\n              if (savedData?.stores && savedData.stores.length > 0) {\r\n                this.restoreClusterSelections(savedData.stores);\r\n              }\r\n            }\r\n          } else {\r\n            this.storeOptions = [];\r\n            this.clusterData = [];\r\n          }\r\n        },\r\n        error: (error) => {\r\n          this.loading = false;\r\n          console.error('Error loading stores/clusters:', error);\r\n          this.storeOptions = [];\r\n        }\r\n      });\r\n  }\r\n\r\n  restoreStoreSelections(savedStores: Store[]): void {\r\n    // Match saved stores by storeName\r\n    const savedStoreNames = new Set(savedStores.map(s => s.storeName));\r\n    this.selectedStores = this.storeOptions.filter(option => \r\n      savedStoreNames.has(option.label)\r\n    );\r\n  }\r\n\r\n  restoreClusterSelections(_savedStores: Store[]): void {\r\n    // Restore cluster selection ONLY from selectedClusters (no derivation from stores)\r\n    const savedClusters = this.findReplaceData?.selectedClusters || [];\r\n    if (!savedClusters.length) {\r\n      this.selectedStores = [];\r\n      return;\r\n    }\r\n\r\n    const savedClusterIds = new Set(savedClusters.map(c => c.id));\r\n    const selectedClusters: StoreOption[] = [];\r\n\r\n    this.clusterData.forEach((cluster: any) => {\r\n      if (savedClusterIds.has(cluster.id)) {\r\n        selectedClusters.push({\r\n          id: cluster.id,\r\n          label: cluster.label\r\n        });\r\n      }\r\n    });\r\n\r\n    this.selectedStores = selectedClusters;\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    this.selectedStores = stores;\r\n  }\r\n\r\n  async onReviewAndReplace(): Promise<void> {\r\n    if (!this.findReplaceData?._id) {\r\n      console.error('No find replace ID available');\r\n      return;\r\n    }\r\n\r\n    // Show confirmation modal\r\n    const modalRef = this.modalService.open(BatchConfirmationModalComponent, {\r\n      centered: true,\r\n      size: 'md',\r\n      backdrop: 'static',\r\n      windowClass: 'batch-confirmation-modal'\r\n    });\r\n\r\n    // Pass store count to modal\r\n    modalRef.componentInstance.storeCount = this.getStoreCount();\r\n\r\n    try {\r\n      const result = await modalRef.result;\r\n      if (result) {\r\n        // User confirmed, proceed with batch process\r\n        this.proceedWithBatchProcess();\r\n      }\r\n    } catch (error) {\r\n      // User dismissed the modal\r\n      console.log('Batch confirmation modal dismissed');\r\n    }\r\n  }\r\n\r\n  private proceedWithBatchProcess(): void {\r\n    if (!this.findReplaceData?._id) {\r\n      console.error('No find replace ID available');\r\n      return;\r\n    }\r\n\r\n    this.loading = true;\r\n    this.batchProcessing = true;\r\n    const findReplaceId = this.findReplaceData._id;\r\n    \r\n    this.storeBuilderService.batchFindReplace({ findReplaceId })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (response: any) => {\r\n          this.loading = false;\r\n          this.batchProcessing = false;\r\n          if (response?.code === 200) {\r\n            // Refetch find replace data to update UI\r\n            this.dataService.loadAndSetFindReplaceDataById(findReplaceId);\r\n          } else {\r\n            console.error('Failed to start batch find replace:', response?.message);\r\n          }\r\n        },\r\n        error: (error) => {\r\n          this.loading = false;\r\n          this.batchProcessing = false;\r\n          console.error('Error starting batch find replace:', error);\r\n        }\r\n      });\r\n  }\r\n\r\n  onApply(): void {\r\n    const searchMode = this.selectedMode.value as 'store' | 'cluster';\r\n    let stores: Store[] = [];\r\n    let selectedClusters: Array<{ id: string; label: string }> | undefined = undefined;\r\n    \r\n    if (searchMode === 'store') {\r\n      // For store mode, convert selected stores directly\r\n      stores = this.selectedStores.map((storeOption: StoreOption) => ({\r\n        storeName: storeOption.label,\r\n      }));\r\n    } else {\r\n      // For cluster mode, save selected clusters and extract all stores from selected clusters\r\n      selectedClusters = this.selectedStores.map((storeOption: StoreOption) => ({\r\n        id: storeOption.id,\r\n        label: storeOption.label\r\n      }));\r\n      \r\n      const selectedClusterIds = new Set(this.selectedStores.map(s => s.id));\r\n      stores = [];\r\n      \r\n      // Find selected clusters and extract their stores\r\n      this.clusterData.forEach((cluster: any) => {\r\n        if (selectedClusterIds.has(cluster.id) && cluster.stores && Array.isArray(cluster.stores)) {\r\n          cluster.stores.forEach((store: any) => {\r\n            stores.push({\r\n              storeName: store.label ,\r\n            });\r\n          });\r\n        }\r\n      });\r\n    }\r\n\r\n    // Update data service with all current values\r\n    const updateData: any = {\r\n      searchMode: searchMode,\r\n      stores: stores,\r\n      storeCount: stores.length,\r\n      target: this.target.value as 'merch' | 'vm' | 'both',\r\n      findPrompt: this.findPrompt.value || '',\r\n      replacePrompt: this.replacePrompt.value || '',\r\n      replaceBrand: this.getReplaceBrandSelection(),\r\n      replaceVm: this.getReplaceVmSelection()\r\n    };\r\n\r\n    // Add selectedClusters only when searchMode is cluster\r\n    if (searchMode === 'cluster' && selectedClusters) {\r\n      updateData.selectedClusters = selectedClusters;\r\n    }\r\n\r\n    this.dataService.updateData(updateData);\r\n\r\n    // Trigger save as draft\r\n    this.dataService.triggerSaveDraft();\r\n  }\r\n\r\n  // Canvas setup methods\r\n  setupZoomHandlers(canvas: fabric.Canvas): void {\r\n    // Disable object selection globally\r\n    canvas.selection = false;\r\n    \r\n    canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n        canvas.zoomToPoint({ x: e.offsetX, y: e.offsetY } as fabric.Point, zoom);\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    canvas.on(\"mouse:down\", (opt: any) => {\r\n      // Handle fixture clicks - use findTarget to get the actual group\r\n      if (opt.target) {\r\n        const obj = opt.target as any;\r\n        // Check if it's a fixture group or nested within one\r\n        let fixtureGroup = obj;\r\n        \r\n        // Traverse up to find the fixture group\r\n        let attempts = 0;\r\n        while (fixtureGroup && !(fixtureGroup as any).fixtureId && !(fixtureGroup as any).objType && attempts < 10) {\r\n          if ((fixtureGroup as any).parent) {\r\n            fixtureGroup = (fixtureGroup as any).parent;\r\n          } else if ((fixtureGroup as any).group) {\r\n            fixtureGroup = (fixtureGroup as any).group;\r\n          } else {\r\n            break;\r\n          }\r\n          attempts++;\r\n        }\r\n        \r\n        // Check if we found a fixture group\r\n        if ((fixtureGroup as any).objType === \"fixture\" || (fixtureGroup as any).fixtureId) {\r\n          this.onFixtureClick(fixtureGroup);\r\n          canvas.setActiveObject(fixtureGroup);\r\n          canvas.requestRenderAll();\r\n          return;\r\n        }\r\n        \r\n        // For other elements, just highlight\r\n        canvas.setActiveObject(opt.target);\r\n        canvas.requestRenderAll();\r\n        return;\r\n      }\r\n      \r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && canvas.viewportTransform && !opt.target) {\r\n        const e = opt.e;\r\n        const vpt = canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      canvas.selection = false;\r\n    });\r\n\r\n    // Prevent all object movement (walls, entrances, fixtures, other elements)\r\n    canvas.on(\"object:moving\", (e: any) => {\r\n      const obj = e.target;\r\n      if (obj && (obj as any).objType) {\r\n        e.e.preventDefault();\r\n        e.e.stopPropagation();\r\n        // Reset position\r\n        obj.setCoords();\r\n        canvas.requestRenderAll();\r\n      }\r\n    });\r\n\r\n    // Prevent all object modifications (scaling, rotating, etc.)\r\n    canvas.on(\"object:modified\", (e: any) => {\r\n      const obj = e.target;\r\n      if (obj && (obj as any).objType) {\r\n        // Reset any changes\r\n        obj.setCoords();\r\n        canvas.requestRenderAll();\r\n      }\r\n    });\r\n\r\n    // Prevent object scaling\r\n    canvas.on(\"object:scaling\", (e: any) => {\r\n      const obj = e.target;\r\n      if (obj && (obj as any).objType) {\r\n        e.e.preventDefault();\r\n        e.e.stopPropagation();\r\n        obj.setCoords();\r\n        canvas.requestRenderAll();\r\n      }\r\n    });\r\n\r\n    // Prevent object rotating\r\n    canvas.on(\"object:rotating\", (e: any) => {\r\n      const obj = e.target;\r\n      if (obj && (obj as any).objType) {\r\n        e.e.preventDefault();\r\n        e.e.stopPropagation();\r\n        obj.setCoords();\r\n        canvas.requestRenderAll();\r\n      }\r\n    });\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string): Promise<void> {\r\n    if (!this.previewCanvas) {\r\n      console.warn('Canvas not initialized');\r\n      this.canvasLoading = false;\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n\r\n    this.canvasLoading = true;\r\n    this.storeBuilderService.getStoreFixtures({ id: [storeId] })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            this.canvasLoading = false;\r\n            this.isLoadingPlanogram = false;\r\n            this.cdr.detectChanges();\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          this.floorData = structuredClone(res.data[0].floors[0]);\r\n          \r\n          // Apply stored findResponseData and replaceResponseData if available for this store\r\n          // This updates the floorData with the stored fixture changes and sets selectedFixtureData\r\n          this.applyStoredResponseData();\r\n          \r\n          // Open panel if we have selected fixture data\r\n          if (this.selectedFixtureData) {\r\n            this.isRightPanelCollapsed = false;\r\n          }\r\n          \r\n          // Collect all fixtures for preview\r\n          this.collectAllFixtures();\r\n          \r\n          // Ensure canvas is initialized before rendering\r\n          if (!this.previewCanvas) {\r\n            this.initializeCanvas();\r\n          }\r\n          \r\n          if (this.previewCanvas) {\r\n            // Render the planogram with the updated floorData (which includes stored response data)\r\n            await this.renderFloor(this.previewCanvas);\r\n            this.canvasLoading = false;\r\n            this.isLoadingPlanogram = false;\r\n            this.cdr.detectChanges();\r\n\r\n            // Re-center and highlight the selected fixture if stored response data exists\r\n            setTimeout(() => {\r\n              if (this.previewCanvasContainerRef?.nativeElement) {\r\n                this.resizeCanvas(this.previewCanvas, this.previewCanvasContainerRef);\r\n                this.fitCanvasToLayoutAnimated(this.previewCanvas);\r\n                \r\n                // Highlight the fixture if we have stored response data\r\n                if (this.selectedFixture?.fixtureId) {\r\n                  const actionFixture = this.previewCanvas.getObjects().find(\r\n                    (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === this.selectedFixture.fixtureId\r\n                  ) as fabric.Group | undefined;\r\n                  if (actionFixture) {\r\n                    this.highlightFixture(this.previewCanvas, actionFixture, false);\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // Automatically trigger find and replace if prompts are available and store doesn't have results\r\n              this.autoFindAndReplaceIfNeeded();\r\n            }, 300);\r\n          } else {\r\n            this.canvasLoading = false;\r\n            this.isLoadingPlanogram = false;\r\n            this.cdr.detectChanges();\r\n          }\r\n        },\r\n        error: (err: any) => {\r\n          this.canvasLoading = false;\r\n          this.isLoadingPlanogram = false;\r\n          this.cdr.detectChanges();\r\n          console.error('Error fetching plano:', err);\r\n        },\r\n      });\r\n  }\r\n\r\n  resizeCanvas(canvas: fabric.Canvas, container: ElementRef<HTMLDivElement>): void {\r\n    const containerEl = container.nativeElement;\r\n    canvas.setDimensions({\r\n      width: containerEl.clientWidth,\r\n      height: containerEl.clientHeight,\r\n    });\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(canvas: fabric.Canvas) {\r\n    if (!canvas) return;\r\n    const bounds = this.getFullLayoutBounds(canvas);\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = canvas.getWidth();\r\n    const canvasH = canvas.getHeight();\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9;\r\n\r\n    const targetVpt = [...(canvas.viewportTransform || [1, 0, 0, 1, 0, 0])] as fabric.TMat2D;\r\n    targetVpt[0] = targetZoom;\r\n    targetVpt[3] = targetZoom;\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const startVpt = [...canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration: 100,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = canvas.viewportTransform!;\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n        canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  private getFullLayoutBounds(canvas: fabric.Canvas) {\r\n    const objects = canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return { left: minX, top: minY, width: maxX - minX, height: maxY - minY };\r\n  }\r\n\r\n  async renderFloor(canvas: fabric.Canvas) {\r\n    await this.drawInitialContent(canvas);\r\n  }\r\n\r\n  async drawInitialContent(canvas: fabric.Canvas): Promise<void> {\r\n    canvas.clear();\r\n    await this.drawLayoutElements(canvas);\r\n  }\r\n\r\n  // Automatically trigger find and replace if prompts are available and store doesn't have results\r\n  private autoFindAndReplaceIfNeeded(): void {\r\n    if (!this.selectedStoreForPreview || !this.findReplaceData) {\r\n      return;\r\n    }\r\n\r\n    // Check if prompts are available\r\n    const hasFindPrompt = this.findReplaceData.findPrompt && this.findReplaceData.findPrompt.trim().length > 0;\r\n\r\n    // Require at least find prompt to auto-apply\r\n    if (!hasFindPrompt) {\r\n      return;\r\n    }\r\n\r\n    // Check if current store already has findResponseData and replaceResponseData\r\n    const store = this.findReplaceData.stores?.find(\r\n      (s: Store) => s.storeName === this.selectedStoreForPreview.storeName\r\n    );\r\n\r\n    // When switching stores, we want to re-apply find even if the store already has findResponseData\r\n    // This allows auto-apply when only find prompt exists and user changes stores\r\n    // Only skip if both findResponseData and replaceResponseData exist (already fully processed)\r\n    if (store?.findResponseData && store?.replaceResponseData) {\r\n      // Store already has both find and replace results, skip to preserve the state\r\n      return;\r\n    }\r\n\r\n    // Set the prompts in the form controls if not already set\r\n    if (!this.findPrompt.value && this.findReplaceData.findPrompt) {\r\n      this.findPrompt.setValue(this.findReplaceData.findPrompt, { emitEvent: false });\r\n      this.isFindPromptFromApi = true;\r\n    }\r\n    if (!this.replaceBrand.value && this.findReplaceData.replaceBrand?._id) {\r\n      this.replaceBrand.setValue(this.findReplaceData.replaceBrand._id, { emitEvent: false });\r\n    }\r\n    if (!this.replaceVm.value && this.findReplaceData.replaceVm?._id) {\r\n      this.replaceVm.setValue(this.findReplaceData.replaceVm._id, { emitEvent: false });\r\n    }\r\n\r\n    // Automatically trigger find first, then replace after find completes (if a valid replace selection exists)\r\n    this.autoFind();\r\n  }\r\n\r\n  // Auto find - will trigger replace after completion\r\n  private autoFind(): void {\r\n    if (!this.findPrompt.value || !this.selectedStoreForPreview) {\r\n      return;\r\n    }\r\n\r\n    this.findLoading = true;\r\n    this.canvasLoading = true;\r\n    const payload = {\r\n      selectionCriteria: this.findPrompt.value,\r\n      stores: [this.selectedStoreForPreview.storeName],\r\n    };\r\n\r\n    this.storeBuilderService.findFixture(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.findLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n          if (res.code === 200) {\r\n            // Check if the response indicates \"NOT FOUND\"\r\n            if (res.status === 'success' && res.message === 'NOT FOUND') {\r\n              this.toastService.getWarningToast('No matching fixture found for the given prompt');\r\n              return;\r\n            }\r\n            \r\n            // Check if res.data exists before processing\r\n            if (!res.data) {\r\n              this.toastService.getWarningToast('No matching fixture found for the given prompt');\r\n              return;\r\n            }\r\n            \r\n            this.updateAiResponseFixture(res.data);\r\n            // Store the found fixture for potential replace operation\r\n            this.selectedFixture = {\r\n              fixtureId: res.data._id,\r\n              fixtureType: res.data.fixtureType,\r\n            };\r\n            this.selectedFixtureData = res.data;\r\n            \r\n            // Save findResponseData to the specific store\r\n            this.saveFindResponseData(res.data);\r\n            \r\n            // Render the floor and wait for it to complete\r\n            this.renderFloor(this.previewCanvas).then(() => {\r\n              // Wait for canvas to fully render before highlighting\r\n              setTimeout(() => {\r\n                const actionFixture = this.previewCanvas.getObjects().find(\r\n                  (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === res.data._id\r\n                ) as fabric.Group | undefined;\r\n                if (actionFixture) {\r\n                  this.highlightFixture(this.previewCanvas, actionFixture, true);\r\n                }\r\n                \r\n                // After find completes, automatically trigger replace only if a valid replace selection exists\r\n                if (this.hasReplaceSelection()) {\r\n                  setTimeout(() => {\r\n                    this.autoReplace();\r\n                  }, 500);\r\n                }\r\n              }, 300);\r\n            });\r\n          }\r\n        },\r\n        error: () => {\r\n          this.findLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n  // Auto replace - called after auto find completes\r\n  private autoReplace(): void {\r\n    if (!this.hasReplaceSelection()) {\r\n      return;\r\n    }\r\n\r\n    // Get the found fixture ID from the store's findResponseData (not the clicked fixture)\r\n    const foundFixtureId = this.getCurrentStoreFindResponseData();\r\n    if (!foundFixtureId) {\r\n      // Fallback to selected fixture if no findResponseData exists\r\n      if (!this.selectedFixture?.fixtureId && !this.selectedFixtureData?._id) {\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Use the found fixture ID (from findResponseData) instead of the clicked fixture\r\n    const fixtureId = foundFixtureId || this.selectedFixture?.fixtureId || this.selectedFixtureData?._id;\r\n\r\n    // Get the original fixture data from the found fixture (not the clicked one)\r\n    const foundFixture = this.getFixtureByIdFromFloor(fixtureId);\r\n    const originalFixture = foundFixture ? structuredClone(foundFixture) : null;\r\n\r\n    this.replaceLoading = true;\r\n    this.canvasLoading = true;\r\n    const payload: any = {\r\n      fixtureId: fixtureId,\r\n      updateType: this.target.value,\r\n      replaceBrand: this.needsReplaceBrand() ? this.getReplaceBrandSelection() : null,\r\n      replaceVm: this.needsReplaceVm() ? this.getReplaceVmSelection() : null,\r\n      updationCriteria: this.replacePrompt.value || '',\r\n    };\r\n\r\n    this.storeBuilderService.replaceFixture(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.replaceLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n          if (res.code === 200) {\r\n            // Mark replace as executed to disable the button\r\n            this.replaceExecuted = true;\r\n\r\n            // Store original fixture for before/after comparison\r\n            // Only store if not already in map (preserve initial planogram fixture)\r\n            if (originalFixture && !this.originalFixturesMap.has(fixtureId)) {\r\n              this.originalFixturesMap.set(fixtureId, originalFixture);\r\n            }\r\n            // Restore originalFixtureData from map to ensure it's always the initial planogram fixture\r\n            const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n            if (storedOriginal) {\r\n              this.originalFixtureData = structuredClone(storedOriginal);\r\n            }\r\n\r\n            this.updateAiResponseFixture(res.data);\r\n\r\n            // Save replaceResponseData to the specific store\r\n            this.saveReplaceResponseData(res.data);\r\n\r\n            // Update selected fixture data to the found fixture (after replace)\r\n            this.selectedFixture = {\r\n              fixtureId: res.data._id,\r\n              fixtureType: res.data.fixtureType,\r\n            };\r\n            this.selectedFixtureData = res.data;\r\n\r\n            // Render the floor and wait for it to complete\r\n            this.renderFloor(this.previewCanvas).then(() => {\r\n              // Wait for canvas to fully render before highlighting\r\n              setTimeout(() => {\r\n                // Highlight the found fixture (not the clicked one)\r\n                const actionFixture = this.previewCanvas.getObjects().find(\r\n                  (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === res.data._id\r\n                ) as fabric.Group | undefined;\r\n                if (actionFixture) {\r\n                  this.highlightFixture(this.previewCanvas, actionFixture, true);\r\n                }\r\n              }, 300);\r\n            });\r\n          }\r\n        },\r\n        error: () => {\r\n          this.replaceLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n  // Find and Replace button handlers\r\n  onFind(): void {\r\n    if (!this.findPrompt.value || !this.selectedStoreForPreview) {\r\n      return;\r\n    }\r\n\r\n    this.findLoading = true;\r\n    this.canvasLoading = true;\r\n    const payload = {\r\n      selectionCriteria: this.findPrompt.value,\r\n      stores: [this.selectedStoreForPreview.storeName],\r\n    };\r\n\r\n    this.storeBuilderService.findFixture(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.findLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n          if (res.code === 200) {\r\n            // Check if the response indicates \"NOT FOUND\"\r\n            if (res.status === 'success' && res.message === 'NOT FOUND') {\r\n              this.toastService.getWarningToast('No matching fixture found for the given prompt');\r\n              return;\r\n            }\r\n            \r\n            // Check if res.data exists before processing\r\n            if (!res.data) {\r\n              this.toastService.getWarningToast('No matching fixture found for the given prompt');\r\n              return;\r\n            }\r\n            \r\n            this.updateAiResponseFixture(res.data);\r\n            // Store the found fixture for potential replace operation\r\n            const fixtureId = res.data._id;\r\n            this.selectedFixture = {\r\n              fixtureId: fixtureId,\r\n              fixtureType: res.data.fixtureType,\r\n            };\r\n            this.selectedFixtureData = res.data;\r\n            \r\n            // Store the original fixture from floorData before any modifications\r\n            // This allows us to show Before/After even when only find data exists\r\n            if (!this.originalFixturesMap.has(fixtureId)) {\r\n              const foundFixture = this.getFixtureByIdFromFloor(fixtureId);\r\n              const originalFixture = foundFixture ? structuredClone(foundFixture) : null;\r\n              // If found, store it in the map\r\n              if (originalFixture) {\r\n                this.originalFixturesMap.set(fixtureId, originalFixture);\r\n                // Set originalFixtureData for display\r\n                this.originalFixtureData = structuredClone(originalFixture);\r\n              }\r\n            } else {\r\n              // If already in map, restore it\r\n              const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n              if (storedOriginal) {\r\n                this.originalFixtureData = structuredClone(storedOriginal);\r\n              }\r\n            }\r\n            \r\n            // Mark find as executed to disable the button\r\n            this.findExecuted = true;\r\n            \r\n            // Save findResponseData to the specific store\r\n            this.saveFindResponseData(res.data);\r\n            \r\n            // Render the floor and wait for it to complete\r\n            this.renderFloor(this.previewCanvas).then(() => {\r\n              // Wait for canvas to fully render before highlighting\r\n              setTimeout(() => {\r\n                const actionFixture = this.previewCanvas.getObjects().find(\r\n                  (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === res.data._id\r\n                ) as fabric.Group | undefined;\r\n                if (actionFixture) {\r\n                  this.highlightFixture(this.previewCanvas, actionFixture, true);\r\n                }\r\n              }, 300);\r\n            });\r\n          }\r\n        },\r\n        error: () => {\r\n          this.findLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n\r\n  onReplace(): void {\r\n    if (!this.hasReplaceSelection()) {\r\n      this.toastService.getWarningToast(\r\n        this.needsReplaceBrand() && this.needsReplaceVm()\r\n          ? 'Please select a brand and a VM to replace with'\r\n          : this.needsReplaceBrand()\r\n            ? 'Please select a brand to replace with'\r\n            : 'Please select a VM to replace with'\r\n      );\r\n      return;\r\n    }\r\n\r\n    // Get the found fixture ID from the store's findResponseData (not the clicked fixture)\r\n    const foundFixtureId = this.getCurrentStoreFindResponseData();\r\n    if (!foundFixtureId) {\r\n      // Fallback to selected fixture if no findResponseData exists\r\n      if (!this.selectedFixture?.fixtureId && !this.selectedFixtureData?._id) {\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Use the found fixture ID (from findResponseData) instead of the clicked fixture\r\n    const fixtureId = foundFixtureId || this.selectedFixture?.fixtureId || this.selectedFixtureData?._id;\r\n\r\n    // Get the original fixture data from the found fixture (not the clicked one)\r\n    const foundFixture = this.getFixtureByIdFromFloor(fixtureId);\r\n    const originalFixture = foundFixture ? structuredClone(foundFixture) : null;\r\n\r\n    this.replaceLoading = true;\r\n    this.canvasLoading = true;\r\n    const payload: any = {\r\n      fixtureId: fixtureId,\r\n      updateType: this.target.value,\r\n      replaceBrand: this.needsReplaceBrand() ? this.getReplaceBrandSelection() : null,\r\n      replaceVm: this.needsReplaceVm() ? this.getReplaceVmSelection() : null,\r\n      updationCriteria: this.replacePrompt.value || '',\r\n    };\r\n\r\n    this.storeBuilderService.replaceFixture(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.replaceLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n          if (res.code === 200) {\r\n            // Mark replace as executed to disable the button\r\n            this.replaceExecuted = true;\r\n            \r\n            // Store original fixture for before/after comparison\r\n            // Only store if not already in map (preserve initial planogram fixture)\r\n            if (originalFixture && !this.originalFixturesMap.has(fixtureId)) {\r\n              this.originalFixturesMap.set(fixtureId, originalFixture);\r\n            }\r\n            // Restore originalFixtureData from map to ensure it's always the initial planogram fixture\r\n            const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n            if (storedOriginal) {\r\n              this.originalFixtureData = structuredClone(storedOriginal);\r\n            }\r\n            \r\n            this.updateAiResponseFixture(res.data);\r\n            \r\n            // Save replaceResponseData to the specific store\r\n            this.saveReplaceResponseData(res.data);\r\n            \r\n            // Update selected fixture data to the found fixture (after replace)\r\n            this.selectedFixture = {\r\n              fixtureId: res.data._id,\r\n              fixtureType: res.data.fixtureType,\r\n            };\r\n            this.selectedFixtureData = res.data;\r\n            \r\n            // Render the floor and wait for it to complete\r\n            this.renderFloor(this.previewCanvas).then(() => {\r\n              // Wait for canvas to fully render before highlighting\r\n              setTimeout(() => {\r\n                // Highlight the found fixture (not the clicked one)\r\n                const actionFixture = this.previewCanvas.getObjects().find(\r\n                  (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === res.data._id\r\n                ) as fabric.Group | undefined;\r\n                if (actionFixture) {\r\n                  this.highlightFixture(this.previewCanvas, actionFixture, true);\r\n                }\r\n              }, 300);\r\n            });\r\n          }\r\n        },\r\n        error: () => {\r\n          this.replaceLoading = false;\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n        },\r\n      });\r\n  }\r\n\r\n  // Helper method to get findResponseData for current store\r\n  getCurrentStoreFindResponseData(): string | null {\r\n    if (!this.findReplaceData?.stores || !this.selectedStoreForPreview) {\r\n      return null;\r\n    }\r\n    const store = this.findReplaceData.stores.find(\r\n      (s: Store) => s.storeName === this.selectedStoreForPreview.storeName\r\n    );\r\n    return store?.findResponseData || null;\r\n  }\r\n\r\n  // Save findResponseData to specific store and trigger save as draft\r\n  private saveFindResponseData(responseData: any): void {\r\n    if (!this.findReplaceData || !this.selectedStoreForPreview) {\r\n      return;\r\n    }\r\n\r\n    const updatedStores = (this.findReplaceData.stores || []).map((store: Store) => {\r\n      if (store.storeName === this.selectedStoreForPreview.storeName) {\r\n        return {\r\n          ...store,\r\n          findResponseData: responseData?._id\r\n        };\r\n      }\r\n      return store;\r\n    });\r\n\r\n    // Update local findReplaceData immediately\r\n    this.findReplaceData = {\r\n      ...this.findReplaceData,\r\n      stores: updatedStores\r\n    };\r\n\r\n    // Update the data service\r\n    this.dataService.updateData({\r\n      stores: updatedStores\r\n    });\r\n\r\n    // Trigger save as draft\r\n    this.dataService.triggerSaveDraft();\r\n  }\r\n\r\n  // Save replaceResponseData to specific store and trigger save as draft\r\n  // Only saves vmConfig and/or shelfConfig based on target\r\n  private saveReplaceResponseData(responseData: any): void {\r\n    if (!this.findReplaceData || !this.selectedStoreForPreview) {\r\n      return;\r\n    }\r\n\r\n    const target = this.target.value as 'merch' | 'vm' | 'both';\r\n    const replaceData: { vmConfig?: any[]; shelfConfig?: any[] } = {};\r\n\r\n    // Extract only the relevant configs based on target\r\n    if (target === 'vm' || target === 'both') {\r\n      if (responseData?.vmConfig) {\r\n        replaceData.vmConfig = responseData.vmConfig;\r\n      }\r\n    }\r\n    \r\n    if (target === 'merch' || target === 'both') {\r\n      if (responseData?.shelfConfig) {\r\n        replaceData.shelfConfig = responseData.shelfConfig;\r\n      }\r\n    }\r\n\r\n    const updatedStores = (this.findReplaceData.stores || []).map((store: Store) => {\r\n      if (store.storeName === this.selectedStoreForPreview.storeName) {\r\n        return {\r\n          ...store,\r\n          replaceResponseData: replaceData\r\n        };\r\n      }\r\n      return store;\r\n    });\r\n\r\n    // Update local findReplaceData immediately\r\n    this.findReplaceData = {\r\n      ...this.findReplaceData,\r\n      stores: updatedStores\r\n    };\r\n\r\n    // Update the data service\r\n    this.dataService.updateData({\r\n      stores: updatedStores\r\n    });\r\n\r\n    // Trigger save as draft\r\n    this.dataService.triggerSaveDraft();\r\n  }\r\n\r\n  updateAiResponseFixture(fixture: any) {\r\n    let matchFound = false;\r\n    for (let i = 0; i < this.floorData.layoutPolygon.length; i++) {\r\n      const element = this.floorData.layoutPolygon[i];\r\n      if (element.elementType === 'wall' && Array.isArray(element.fixtures)) {\r\n        for (let j = 0; j < element.fixtures.length; j++) {\r\n          const fx = element.fixtures[j];\r\n          if (fx._id === fixture._id) {\r\n            // Preserve existing vmConfig if the new fixture doesn't have it\r\n            const existingVmConfig = fx.vmConfig || [];\r\n            const updatedFixture = { \r\n              ...fixture,\r\n              // Preserve vmConfig from existing fixture if new fixture doesn't have it\r\n              vmConfig: fixture.vmConfig || existingVmConfig\r\n            };\r\n            this.floorData.layoutPolygon[i].fixtures[j] = updatedFixture;\r\n            matchFound = true;\r\n            this.selectedFixture = updatedFixture;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (matchFound) return;\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture.length; i++) {\r\n      const fx = this.floorData?.centerFixture[i];\r\n      if (fx._id === fixture._id) {\r\n        // Preserve existing vmConfig if the new fixture doesn't have it\r\n        const existingVmConfig = fx.vmConfig || [];\r\n        const updatedFixture = { \r\n          ...fixture,\r\n          // Preserve vmConfig from existing fixture if new fixture doesn't have it\r\n          vmConfig: fixture.vmConfig || existingVmConfig\r\n        };\r\n        this.floorData.centerFixture[i] = updatedFixture;\r\n        this.selectedFixture = updatedFixture;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  highlightFixture(canvas: fabric.Canvas, group: any, blink: boolean = false) {\r\n    this.removeHighlight(canvas);\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8,\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n    canvas.add(rect);\r\n    canvas.moveObjectTo(rect, canvas.getObjects().length - 1);\r\n    canvas.requestRenderAll();\r\n    this.activeHighlight = rect;\r\n\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight(canvas);\r\n        return;\r\n      }\r\n      rect.animate({ opacity: 1 }, {\r\n        duration: 200,\r\n        onChange: () => canvas.requestRenderAll(),\r\n        onComplete: () => {\r\n          if (this.cancelHighlightBlink) {\r\n            this.removeHighlight(canvas);\r\n            return;\r\n          }\r\n          rect.animate({ opacity: 0 }, {\r\n            duration: 200,\r\n            onChange: () => canvas.requestRenderAll(),\r\n            onComplete: () => {\r\n              if (this.cancelHighlightBlink) {\r\n                this.removeHighlight(canvas);\r\n                return;\r\n              }\r\n              cycles++;\r\n              if (cycles < 20) {\r\n                blinkOnce();\r\n              } else {\r\n                if (!this.cancelHighlightBlink) {\r\n                  rect.set({ opacity: 1 });\r\n                  canvas.requestRenderAll();\r\n                }\r\n              }\r\n            },\r\n          });\r\n        },\r\n      });\r\n    };\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight(canvas: fabric.Canvas) {\r\n    this.cancelHighlightBlink = true;\r\n    canvas.getObjects().forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        canvas.remove(obj);\r\n      }\r\n    });\r\n    this.activeHighlight = null;\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  // Planogram rendering methods (simplified versions from collection-update-ai)\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  async drawLayoutElements(canvas: fabric.Canvas) {\r\n    if (!this.floorData) return;\r\n    \r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n      let wall;\r\n\r\n      element.relativePosition ??= { x: 0, y: 0, unit: \"ft\" };\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = await this.drawWall(canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        this.drawEntrance(canvas, x, y, 80, 75, 40, element);\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const fx = this.toPixels(fixture.relativePosition.x, fixture.relativePosition.unit);\r\n          const fy = this.toPixels(fixture.relativePosition.y, fixture.relativePosition.unit);\r\n          const fh = this.toPixels(fixture.fixtureStaticLength.value, fixture.fixtureStaticLength.unit);\r\n          const fw = this.toPixels(fixture.fixtureStaticWidth.value, fixture.fixtureStaticWidth.unit);\r\n          const fixtureObj = await this.drawFixture(canvas, fx, fy, fh, fw, fixture);\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => canvas.remove(f));\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: false,\r\n            selectable: false,\r\n            lockMovementX: true,\r\n            lockMovementY: true,\r\n            lockRotation: true,\r\n            lockScalingX: true,\r\n            lockScalingY: true,\r\n            subTargetCheck: true,\r\n          });\r\n          combinedGroup.set({ isLocked: true });\r\n          canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const ox = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const oy = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const oa = otherElement.relativePosition.angle;\r\n          const oh = this.toPixels(otherElement.fixtureStaticLength.value, otherElement.fixtureStaticLength.unit);\r\n          const ow = this.toPixels(otherElement.fixtureStaticWidth.value, otherElement.fixtureStaticWidth.unit);\r\n          this.drawOtherElementsWithLabel(canvas, ox, oy, oa, ow, oh, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(fixture.relativePosition.x, fixture.relativePosition.unit);\r\n      const y = this.toPixels(fixture.relativePosition.y, fixture.relativePosition.unit);\r\n      const h = this.toPixels(fixture.fixtureStaticLength.value, fixture.fixtureStaticLength.unit);\r\n      const w = this.toPixels(fixture.fixtureStaticWidth.value, fixture.fixtureStaticWidth.unit);\r\n      await this.drawFixture(canvas, x, y, h, w, fixture);\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(otherElement.fixtureStaticLength.value, otherElement.fixtureStaticLength.unit);\r\n      const w = this.toPixels(otherElement.fixtureStaticWidth.value, otherElement.fixtureStaticWidth.unit);\r\n      this.drawOtherElementsWithLabel(canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${elementData.elementNumber\r\n      }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    }\r\n\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n      angle: elementData.angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any\r\n  ) {\r\n    // Match fixture palette/logic used in `/manage/planogram/manage-rollout` (`plano-rollout.component.ts`)\r\n\r\n\r\n    let primaryStroke = \"#a5a6a8\";\r\n    let primaryFill = \"#f3f4f8\";\r\n    let headerColor = \"#101828\";\r\n    let vmFill = \"#a5a6a8\";\r\n    let footerFill = \"#f3f4f8\";\r\n\r\n    if (fixtureData?.complete === true && !fixtureData?.approvalStatus) {\r\n      primaryStroke = \"#6CE9A6\";\r\n      primaryFill = \"#6CE9A6\";\r\n      footerFill = \"#6CE9A6\";\r\n      vmFill = \"#6938EF\";\r\n      headerColor = \"#101828\";\r\n    }\r\n\r\n    if (fixtureData?.issue === true) {\r\n      primaryStroke = \"#D92D20\";\r\n      primaryFill = \"#D92D20\";\r\n      headerColor = \"#FFF\";\r\n      footerFill = \"#FEE4E2\";\r\n      vmFill = \"#6938EF\";\r\n    }\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n              L ${topX + topWidth - radius} ${topY} \r\n              Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n              L ${topX + topWidth} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + radius} \r\n              Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      }\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${fixtureData.associatedElementFixtureNumber\r\n        ? fixtureData.associatedElementFixtureNumber +\r\n        (fixtureData?.fixtureNumber\r\n          ? \" - FX-\" + fixtureData.fixtureNumber\r\n          : \"\")\r\n        : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${secondBoxY + innerBoxHeight - radius\r\n      } \r\n          L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: primaryStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n              L ${midX + midWidth - radius} ${firstBoxY} \r\n              Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${firstBoxY + radius\r\n      } \r\n              L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + radius} \r\n              Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: primaryFill,\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: headerColor,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const shelves: fabric.Object[] = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: primaryStroke,\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              }\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: primaryStroke,\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: primaryStroke,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          }\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              }\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: vmFill,\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n              Q ${midX + midWidth} ${lastBoxY + boxHeight} ${midX + midWidth - radius\r\n      } ${lastBoxY + boxHeight} \r\n              L ${midX + radius} ${lastBoxY + boxHeight} \r\n              Q ${midX} ${lastBoxY + boxHeight} ${midX} ${lastBoxY + boxHeight - radius\r\n      } \r\n              L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: footerFill,\r\n        stroke: primaryStroke,\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      }\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${fixtureData.shelfConfig?.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      }\r\n    );\r\n\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        selectable: false,\r\n        hoverCursor: \"default\",\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        lockRotation: true,\r\n        hasControls: false,\r\n        subTargetCheck: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      }\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    // Add click handler directly on the fixture group\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      // Use the fixture group itself (which has all the fixture properties)\r\n      // The event.target might be a child element, so we use fixtureGroup directly\r\n      if (fixtureGroup && (fixtureGroup as any).fixtureId) {\r\n        this.onFixtureClick(fixtureGroup);\r\n      }\r\n    });\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(fixtureGroup);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  collectAllFixtures(): void {\r\n    this.allFixtureInstances = [];\r\n    \r\n    // Collect wall fixtures\r\n    if (this.floorData?.layoutPolygon) {\r\n      for (const element of this.floorData.layoutPolygon) {\r\n        if (element.fixtures && Array.isArray(element.fixtures)) {\r\n          this.allFixtureInstances.push(...element.fixtures);\r\n        }\r\n      }\r\n    }\r\n    \r\n    // Collect floor fixtures\r\n    if (this.floorData?.centerFixture && Array.isArray(this.floorData.centerFixture)) {\r\n      this.allFixtureInstances.push(...this.floorData.centerFixture);\r\n    }\r\n  }\r\n\r\n  onFixtureClick(target: any): void {\r\n    if (!target || !this.floorData) return;\r\n    \r\n    const fixtureId = (target as any).fixtureId;\r\n    const fixtureType = (target as any).fixtureType;\r\n    \r\n    if (!fixtureId) {\r\n      console.warn('Fixture click: No fixtureId found on target', target);\r\n      return;\r\n    }\r\n    \r\n    // Find the fixture data\r\n    let fixtureData: any = null;\r\n    \r\n    if (fixtureType === \"wall\") {\r\n      const wallIndex = (target as any).wallIndex;\r\n      \r\n      if (this.floorData.layoutPolygon && wallIndex !== undefined && wallIndex !== null) {\r\n        // Find wall by elementNumber (wallIndex is the elementNumber)\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (w: any) => w.elementNumber === wallIndex\r\n        );\r\n        if (wall && wall.fixtures) {\r\n          // Always use fixtureId to find the fixture (more reliable than index-based lookup)\r\n          fixtureData = wall.fixtures.find((f: any) => f._id === fixtureId);\r\n        }\r\n      }\r\n    } else if (fixtureType === \"floor\") {\r\n      fixtureData = this.floorData.centerFixture?.find((f: any) => f._id === fixtureId);\r\n    }\r\n    \r\n    if (!fixtureData) {\r\n      console.warn('Fixture click: Fixture data not found', { \r\n        fixtureId, \r\n        fixtureType, \r\n        wallIndex: (target as any).wallIndex, \r\n        fixtureIndex: (target as any).fixtureIndex,\r\n        floorData: this.floorData \r\n      });\r\n      return;\r\n    }\r\n    \r\n    // Ensure vmConfig is always an array (even if empty) to avoid display issues\r\n    // Handle cases where vmConfig might be null, undefined, or not an array\r\n    if (!Array.isArray(fixtureData.vmConfig)) {\r\n      fixtureData.vmConfig = [];\r\n    }\r\n    \r\n    // Create a deep clone to ensure change detection works\r\n    const clonedData = structuredClone(fixtureData);\r\n    \r\n    this.selectedFixture = {\r\n      fixtureId: fixtureId,\r\n      fixtureType: fixtureType,\r\n      wallIndex: (target as any).wallIndex,\r\n      fixtureIndex: (target as any).fixtureIndex,\r\n    };\r\n    \r\n    // Check if this fixture has replaceResponseData (for before/after comparison)\r\n    const store = this.findReplaceData?.stores?.find(\r\n      (s: Store) => s.storeName === this.selectedStoreForPreview?.storeName\r\n    );\r\n    \r\n    // If this fixture matches the findResponseData and has replaceResponseData,\r\n    // restore the original fixture data for before/after comparison\r\n    if (store?.findResponseData === fixtureId && store?.replaceResponseData) {\r\n      // Restore originalFixtureData from the map (persists even when clicking other fixtures)\r\n      const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n      if (storedOriginal) {\r\n        this.originalFixtureData = structuredClone(storedOriginal);\r\n      } else {\r\n        // If not in map (shouldn't happen if applyStoredResponseData ran), \r\n        // use current fixture as fallback\r\n        this.originalFixtureData = structuredClone(clonedData);\r\n      }\r\n    } else {\r\n      // No replace data for this fixture, clear original\r\n      this.originalFixtureData = null;\r\n    }\r\n    \r\n    // Force change detection by creating a new object reference\r\n    this.selectedFixtureData = null;\r\n    this.cdr.detectChanges();\r\n    \r\n    setTimeout(() => {\r\n      this.selectedFixtureData = clonedData;\r\n      this.isRightPanelCollapsed = false;\r\n      this.cdr.detectChanges();\r\n      \r\n      // Re-center planogram when panel opens (similar to manage-planogram)\r\n      setTimeout(() => {\r\n        if (this.previewCanvas && this.previewCanvasContainerRef?.nativeElement) {\r\n          this.resizeCanvas(this.previewCanvas, this.previewCanvasContainerRef);\r\n          this.fitCanvasToLayoutAnimated(this.previewCanvas);\r\n        }\r\n      }, 400);\r\n    }, 0);\r\n  }\r\n\r\n  toggleRightPanel(): void {\r\n    this.isRightPanelCollapsed = !this.isRightPanelCollapsed;\r\n    \r\n    // Resize canvas when panel is toggled\r\n    setTimeout(() => {\r\n      if (this.previewCanvas && this.previewCanvasContainerRef?.nativeElement) {\r\n        this.resizeCanvas(this.previewCanvas, this.previewCanvasContainerRef);\r\n        this.fitCanvasToLayoutAnimated(this.previewCanvas);\r\n      }\r\n    }, 400);\r\n  }\r\n\r\n  onHideMetadataToggle(): void {\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.previewCanvas) {\r\n      this.previewCanvas.dispose();\r\n    }\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<div class=\"main-card\">\r\n    <form>\r\n        <!-- Section 1: Add Stores -->\r\n        <div class=\"section-row\">\r\n            <div class=\"section-number\">1</div>\r\n            <div class=\"section-content\">\r\n                <h2 class=\"section-title\">Add stores</h2>\r\n                <div class=\"store-input-wrapper\">\r\n                   <div class=\"store-dropdown\">\r\n                        <lib-reactive-select\r\n                            [idField]=\"'value'\"\r\n                            [nameField]=\"'label'\"\r\n                            [data]=\"searchModes\"\r\n                            [formControl]=\"selectedMode\" \r\n                            >\r\n                        </lib-reactive-select>\r\n                    </div> \r\n                    <lib-store-select \r\n                        [options]=\"storeOptions\"\r\n                        [initialSelected]=\"selectedStores\"\r\n                        (selectedChange)=\"onStoresSelected($event)\">\r\n                    </lib-store-select>\r\n                    <button class=\"btn-apply\" type=\"button\" (click)=\"onApply()\" [disabled]=\"loading || findLoading || replaceLoading || savingDraft\">\r\n                        {{ savingDraft ? 'Saving...' : 'Apply' }}\r\n                    </button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        \r\n        <!-- Section 2: Choose Target -->\r\n        <div class=\"section-row\" *ngIf=\"hasStores\">\r\n            <div class=\"section-number\">2</div>\r\n            <div class=\"section-content\">\r\n                <h2 class=\"section-title\">Choose target</h2>\r\n                <div class=\"target-buttons\">\r\n                    <label class=\"target-btn\" [class.active]=\"target.value === 'both'\">\r\n                        <input type=\"radio\" name=\"target\" value=\"both\" [formControl]=\"target\">\r\n                        Both\r\n                    </label>\r\n                    <label class=\"target-btn\" [class.active]=\"target.value === 'merch'\">\r\n                        <input type=\"radio\" name=\"target\" value=\"merch\" [formControl]=\"target\">\r\n                        Merchandise\r\n                    </label>\r\n                    <label class=\"target-btn\" [class.active]=\"target.value === 'vm'\">\r\n                        <input type=\"radio\" name=\"target\" value=\"vm\" [formControl]=\"target\">\r\n                        Visual Merchandise\r\n                    </label>\r\n                </div>\r\n\r\n                <div class=\"replace-selection-stack\" *ngIf=\"needsReplaceBrand() || needsReplaceVm()\">\r\n                    <div *ngIf=\"needsReplaceBrand()\" class=\"replace-selection-row\">\r\n                        <span class=\"replace-selection-tag\">Merchandise <span class=\"text-danger\">*</span></span>\r\n                        <lib-reactive-select\r\n                            class=\"replace-selection-dropdown\"\r\n                            [idField]=\"'_id'\"\r\n                            [nameField]=\"'brandName'\"\r\n                            [searchField]=\"'brandName'\"\r\n                            [data]=\"brandList\"\r\n                            [search]=\"true\"\r\n                            [formControl]=\"replaceBrand\">\r\n                        </lib-reactive-select>\r\n                    </div>\r\n                    <div *ngIf=\"needsReplaceVm()\" class=\"replace-selection-row\">\r\n                        <span class=\"replace-selection-tag\">Visual Merchandise <span class=\"text-danger\">*</span></span>\r\n                        <lib-reactive-select\r\n                            class=\"replace-selection-dropdown\"\r\n                            [idField]=\"'_id'\"\r\n                            [nameField]=\"'vmName'\"\r\n                            [searchField]=\"'vmName'\"\r\n                            [subTextField]=\"'vmType'\"\r\n                            [data]=\"replaceVmList\"\r\n                            [search]=\"true\"\r\n                            [formControl]=\"replaceVm\">\r\n                        </lib-reactive-select>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        \r\n        <!-- Section 3: Find and Replace -->\r\n        <div class=\"section-row\" *ngIf=\"hasStores\">\r\n            <div class=\"section-number\">3</div>\r\n            <div class=\"section-content\">\r\n                <h2 class=\"section-title\">Provide an instruction to find and replace in the selected store</h2>\r\n            </div>\r\n        </div>\r\n        \r\n        <!-- Find and Replace Inputs -->\r\n        <div class=\"find-replace-wrapper\" *ngIf=\"hasStores\">\r\n            <div class=\"find-replace-box\">\r\n                <label class=\"find-replace-label\">Target</label>\r\n                <div class=\"find-replace-input\">\r\n                    <textarea \r\n                        placeholder=\"Instruct what to find it in the selected store\"\r\n                        [formControl]=\"findPrompt\"></textarea>\r\n                    <div class=\"input-btn-container\">\r\n                        <button \r\n                            class=\"btn-find\" \r\n                            type=\"button\"\r\n                            (click)=\"onFind()\"\r\n                            [disabled]=\"findLoading || replaceLoading || !selectedStoreForPreview || (findPrompt.value && findExecuted) || isFindPromptFromApi\">\r\n                            {{ findLoading ? 'Processing...' : 'Run' }}\r\n                        </button>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            \r\n            <div class=\"arrow-icon\">\r\n                <svg width=\"27\" height=\"15\" viewBox=\"0 0 27 15\" fill=\"none\">\r\n                    <path d=\"M26.7071 8.07107C27.0976 7.68054 27.0976 7.04738 26.7071 6.65685L20.3431 0.292893C19.9526 -0.097631 19.3195 -0.097631 18.9289 0.292893C18.5384 0.683418 18.5384 1.31658 18.9289 1.70711L24.5858 7.36396L18.9289 13.0208C18.5384 13.4113 18.5384 14.0445 18.9289 14.435C19.3195 14.8256 19.9526 14.8256 20.3431 14.435L26.7071 8.07107ZM0 7.36396V8.36396H26V7.36396V6.36396H0V7.36396Z\" fill=\"#98A2B3\"/>\r\n                </svg>\r\n            </div>\r\n            \r\n            <div class=\"find-replace-box\">\r\n                <label class=\"find-replace-label\">Change</label>\r\n                <div class=\"find-replace-input\">\r\n                    <textarea\r\n                        placeholder=\"Type what would you like to replace in the selected fixture\"\r\n                        [formControl]=\"replacePrompt\"></textarea>\r\n                    <div class=\"input-btn-container\">\r\n                        <button\r\n                            class=\"btn-replace\"\r\n                            type=\"button\"\r\n                            (click)=\"onReplace()\"\r\n                            [disabled]=\"!findPrompt.value || !hasReplaceSelection() || findLoading || replaceLoading || !getCurrentStoreFindResponseData() || replaceExecuted\">\r\n                            {{ replaceLoading ? 'Processing...' : 'Update' }}\r\n                        </button>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        \r\n        <!-- Preview Section -->\r\n        <div class=\"preview-wrapper\" [ngStyle]=\"{'display': hasStores ? 'block' : 'none'}\">\r\n            <div class=\"row g-0 preview-layout\">\r\n                <!-- Left Column: Canvas -->\r\n                <div class=\"col\" [ngClass]=\"{ \r\n                    'col-6': !isRightPanelCollapsed && selectedFixtureData && shouldShowBeforeAfter(),\r\n                    'col-9': !isRightPanelCollapsed && selectedFixtureData && !shouldShowBeforeAfter(), \r\n                    'col-12': isRightPanelCollapsed || !selectedFixtureData \r\n                }\">\r\n                    <div class=\"d-flex align-items-start gap-3 mb-3\">\r\n                        <!-- Store Dropdown -->\r\n                        <lib-store-dropdown \r\n                            *ngIf=\"hasStores && storeDropdownItems.length > 0\"\r\n                            [items]=\"storeDropdownItems\"\r\n                            [idField]=\"'storeId'\"\r\n                            [searchField]=\"'storeName'\"\r\n                            [multi]=\"false\"\r\n                            [selectedValues]=\"selectedStoreValues\"\r\n                            (selected)=\"onStoreSelectedForPreview($event)\">\r\n                        </lib-store-dropdown>\r\n                        \r\n                        <!-- Content Area -->\r\n                        <div class=\"flex-grow-1\">\r\n                            <!-- Preview Title -->\r\n                            <p class=\"fw-semibold mb-1\" style=\"font-size: 14px; color: #1d2939;\">\r\n                                Preview \r\n                                <span *ngIf=\"getStoreCount() > 0\" style=\"font-weight: 400; color: #667085;\">\r\n                                    ({{ getStoreCount() }} {{ getStoreCount() === 1 ? 'Store' : 'Stores' }})\r\n                                </span>\r\n                            </p>\r\n                            \r\n                            <!-- Description -->\r\n                            <p class=\"mb-0\" style=\"font-size: 14px; color: #475467;\">Check if the prompt fit into the expected results in order to proceed to review and approve</p>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <!-- Canvas Container -->\r\n                    <div class=\"canvas-container\" #previewCanvasContainer [ngStyle]=\"{'display': selectedStoreForPreview ? 'block' : 'none'}\">\r\n                        <div class=\"canvas-loading\" *ngIf=\"canvasLoading\">\r\n                            <div class=\"spinner-border text-primary\" role=\"status\">\r\n                                <span class=\"visually-hidden\">Loading...</span>\r\n                            </div>\r\n                        </div>\r\n                        <canvas #previewCanvas></canvas>\r\n                    </div>\r\n                </div>\r\n\r\n                <!-- Right Column: Fixture Preview -->\r\n                <div class=\"fixture-preview-panel\" \r\n                     *ngIf=\"selectedFixtureData && !isRightPanelCollapsed\"\r\n                     [ngClass]=\"{ 'col-6': shouldShowBeforeAfter(), 'col-3': !shouldShowBeforeAfter() }\"\r\n                     [style.min-width]=\"shouldShowBeforeAfter() ? '680px' : '340px'\">\r\n                    <div class=\"s-card\">\r\n                        <!-- Panel Header -->\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 class=\"d-flex justify-content-end mt-2\">\r\n                                <div class=\"form-check form-switch\">\r\n                                    <input class=\"form-check-input\" type=\"checkbox\" id=\"hideMetadata\" [(ngModel)]=\"hideMetadata\" [ngModelOptions]=\"{ standalone: true }\" (change)=\"onHideMetadataToggle()\" style=\"cursor: pointer\" />\r\n                                    <label class=\"form-check-label ms-2\" for=\"hideMetadata\" style=\"color: black; white-space: nowrap;\">\r\n                                        Hide metadata\r\n                                    </label>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n\r\n                        <!-- Fixture Component -->\r\n                        <div class=\"fixture-preview-content\">\r\n                            <!-- Show Before/After when find data exists -->\r\n                            <div *ngIf=\"shouldShowBeforeAfter()\" 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]=\"getOriginalFixtureForDisplay()\" \r\n                                            [showColors]=\"true\"\r\n                                            [showVMs]=\"true\"\r\n                                            [showBCs]=\"!hideMetadata\">\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]=\"!hideMetadata\"\r\n                                            [disable]=\"isAfterDisabled()\">\r\n                                        </lib-store-fixture>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                            \r\n                            <!-- Show single fixture when no find data -->\r\n                            <div *ngIf=\"!shouldShowBeforeAfter() && 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]=\"!hideMetadata\">\r\n                                    </lib-store-fixture>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n\r\n                <!-- Collapse Button -->\r\n                <div class=\"collapse-handler right\" \r\n                     *ngIf=\"selectedFixtureData\"\r\n                     (click)=\"toggleRightPanel()\">\r\n                    <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <!-- No Preview Section -->\r\n        <div class=\"no-preview\" *ngIf=\"hasStores && !selectedStoreForPreview\">\r\n            <div >\r\n                <svg width=\"315\" height=\"155\" viewBox=\"0 0 315 155\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <path d=\"M103.81 47.0195C89.5463 47.0197 77.9834 58.5824 77.9834 72.8457C77.9834 78.7617 73.9803 85.5059 68.0643 85.5059H45.2588C30.9953 85.5059 19.4316 97.0686 19.4316 111.332C19.4316 125.596 30.9953 137.158 45.2588 137.158H183.357C200.248 137.158 216.32 123.992 233.21 123.992H299.245C304 123.992 307.854 120.137 307.854 115.383C307.853 110.629 303.999 106.774 299.245 106.774H211.625C209.98 106.774 208.588 105.553 208.12 103.976C207.381 101.486 209.082 98.6719 211.679 98.6719H241.909C256.172 98.6717 267.735 87.109 267.735 72.8457C267.735 58.5824 256.172 47.0198 241.909 47.0195H103.81Z\" fill=\"#EAECF0\"/>\r\n                    <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\" transform=\"matrix(-1 0 0 1 246.603 48.8574)\" fill=\"#EAECF0\"/>\r\n                    <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\" transform=\"matrix(-1 0 0 1 56.2979 113.281)\" fill=\"#6BCAFF\"/>\r\n                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 244.965 68.8262)\" fill=\"#00A3FF\"/>\r\n                    <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 215.689 13.5273)\" fill=\"#00A3FF\"/>\r\n                    <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\" transform=\"matrix(-1 0 0 1 104.006 138.221)\" fill=\"#00A3FF\"/>\r\n                    <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\" fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3\"/>\r\n                    <mask id=\"path-8-inside-1_936_150383\" fill=\"white\">\r\n                    <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"/>\r\n                    </mask>\r\n                    <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" fill=\"#6BCAFF\"/>\r\n                    <path d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\" fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_936_150383)\"/>\r\n                    <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\" stroke-width=\"3.98436\" stroke-linecap=\"round\"/>\r\n                    <circle cx=\"218.206\" cy=\"70.1755\" r=\"3.29663\" fill=\"white\"/>\r\n                    <circle cx=\"111.787\" cy=\"55.167\" r=\"2.52637\" fill=\"#99DAFF\"/>\r\n                    <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\"/>\r\n                    <path d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.932 123.894 194.056 127.161 191.501 128.636C188.946 130.111 185.679 129.236 184.204 126.681L164.466 92.4932C149.447 98.6552 131.814 92.92 123.472 78.4717C114.375 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.099 38.6209 151.482 34.7041 140.051 41.3037C128.62 47.9035 124.703 62.5204 131.303 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.381 76.0987 179.297 61.4826 172.698 50.0518Z\" fill=\"white\"/>\r\n                    <circle cx=\"153.001\" cy=\"57.0017\" r=\"23.8994\" transform=\"rotate(-30 153.001 57.0017)\" fill=\"#99DAFF\"/>\r\n                    <mask id=\"path-16-inside-2_936_150383\" fill=\"white\">\r\n                    <path d=\"M153.384 40.9957C153.435 39.7001 152.423 38.5927 151.131 38.7095C148.858 38.9151 146.636 39.5491 144.586 40.5854C141.835 41.976 139.484 44.045 137.755 46.597C136.026 49.149 134.977 52.0996 134.706 55.1701C134.504 57.4583 134.739 59.7568 135.391 61.9447C135.762 63.1872 137.166 63.7169 138.35 63.1891C139.534 62.6612 140.044 61.2746 139.73 60.0165C139.37 58.5735 139.251 57.0753 139.383 55.583C139.584 53.3078 140.361 51.1214 141.642 49.2304C142.924 47.3394 144.666 45.8063 146.704 44.7758C148.041 44.1 149.477 43.6551 150.95 43.4542C152.235 43.2792 153.333 42.2913 153.384 40.9957Z\"/>\r\n                    </mask>\r\n                    <path d=\"M153.384 40.9957C153.435 39.7001 152.423 38.5927 151.131 38.7095C148.858 38.9151 146.636 39.5491 144.586 40.5854C141.835 41.976 139.484 44.045 137.755 46.597C136.026 49.149 134.977 52.0996 134.706 55.1701C134.504 57.4583 134.739 59.7568 135.391 61.9447C135.762 63.1872 137.166 63.7169 138.35 63.1891C139.534 62.6612 140.044 61.2746 139.73 60.0165C139.37 58.5735 139.251 57.0753 139.383 55.583C139.584 53.3078 140.361 51.1214 141.642 49.2304C142.924 47.3394 144.666 45.8063 146.704 44.7758C148.041 44.1 149.477 43.6551 150.95 43.4542C152.235 43.2792 153.333 42.2913 153.384 40.9957Z\" stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_936_150383)\"/>\r\n                    <path d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.932 118.894 195.056 122.161 192.501 123.636C189.946 125.111 186.679 124.236 185.204 121.681L165.466 87.4932C150.447 93.6552 132.814 87.92 124.472 73.4717C115.375 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.099 33.6209 152.482 29.7041 141.051 36.3037C129.62 42.9035 125.703 57.5204 132.303 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.381 71.0987 180.297 56.4826 173.698 45.0518Z\" fill=\"#00A3FF\"/>\r\n                    </svg>                    \r\n            </div>\r\n            <h3>No preview yet</h3>\r\n            <p>Add a find and replacement to preview.</p>\r\n        </div>\r\n\r\n        <!-- Action Button Section -->\r\n        <div class=\"action-button-section\" *ngIf=\"hasStores\">\r\n            <button class=\"btn-apply\" type=\"button\" (click)=\"onReviewAndReplace()\" [disabled]=\"loading || findLoading || replaceLoading || batchProcessing || !findPrompt.value || !hasReplaceSelection()\">\r\n                {{ batchProcessing ? 'Processing...' : 'Review And Replace' }}\r\n            </button>\r\n        </div>\r\n    </form>\r\n</div>\r\n","import { Component, inject, Input, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';\r\nimport { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { StoreFixtureComponent } from '../../../components/store-fixture/store-fixture.component';\r\n\r\n@Component({\r\n  selector: 'lib-fixture-before-after',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, StoreFixtureComponent],\r\n  templateUrl: './fixture-before-after.component.html',\r\n  styleUrl: './fixture-before-after.component.scss'\r\n})\r\nexport class FixtureBeforeAfterComponent implements OnInit, OnChanges {\r\n  activeOffcanvas = inject(NgbActiveOffcanvas);\r\n  cdr = inject(ChangeDetectorRef);\r\n  \r\n  @Input() selectedFixtureData: any = null;\r\n  @Input() originalFixtureData: any = null;\r\n  \r\n  hideMetadata: boolean = false; \r\n\r\n  ngOnInit(): void {\r\n    // Ensure data is properly initialized\r\n    this.ensureFixtureDataStructure(this.selectedFixtureData);\r\n    this.ensureFixtureDataStructure(this.originalFixtureData);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['selectedFixtureData']?.currentValue) {\r\n      this.ensureFixtureDataStructure(changes['selectedFixtureData'].currentValue);\r\n    }\r\n    if (changes['originalFixtureData']?.currentValue) {\r\n      this.ensureFixtureDataStructure(changes['originalFixtureData'].currentValue);\r\n    }\r\n  }\r\n\r\n  private ensureFixtureDataStructure(fixture: any): void {\r\n    if (!fixture) return;\r\n    \r\n    // Ensure vmConfig is an array\r\n    if (!Array.isArray(fixture.vmConfig)) {\r\n      fixture.vmConfig = [];\r\n    }\r\n    \r\n    // Ensure shelfConfig is an array\r\n    if (!Array.isArray(fixture.shelfConfig)) {\r\n      fixture.shelfConfig = [];\r\n    }\r\n  }\r\n\r\n  getCurrentFixtureData(): any {\r\n    return this.selectedFixtureData || this.originalFixtureData;\r\n  }\r\n\r\n  getFixtureLabel(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.header?.label || '';\r\n  }\r\n\r\n  getFixtureCategory(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.fixtureCategory || '';\r\n  }\r\n\r\n  getFixtureWidth(): string {\r\n    const fixture = this.getCurrentFixtureData();\r\n    if (!fixture?.fixtureWidth) return '';\r\n    const width = fixture.fixtureWidth.value;\r\n    const unit = fixture.fixtureWidth.unit || 'mm';\r\n    let dimensionStr = `${width}${unit}`;\r\n    // Convert to feet if needed (1200mm = 4ft)\r\n    if (unit === 'mm' && width === 1200) {\r\n      dimensionStr = `${width}${unit}/4ft`;\r\n    } else if (unit === 'mm' && width > 0) {\r\n      const feet = Math.round(width / 300);\r\n      if (feet > 0) {\r\n        dimensionStr = `${width}${unit}/${feet}ft`;\r\n      }\r\n    }\r\n    return dimensionStr;\r\n  }\r\n\r\n  getShelfCount(): number {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.shelfConfig?.length || 0;\r\n  }\r\n\r\n  getFixtureCapacity(): number {\r\n    const fixture = this.getCurrentFixtureData();\r\n    return fixture?.fixtureCapacity || 0;\r\n  }\r\n\r\n  onHideMetadataToggle(): void {\r\n    this.cdr.detectChanges();\r\n  }\r\n}\r\n","<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 class=\"d-flex justify-content-end mt-2\">\r\n            <div class=\"form-check form-switch\">\r\n                <input class=\"form-check-input\" type=\"checkbox\" id=\"hideMetadata\" [(ngModel)]=\"hideMetadata\" [ngModelOptions]=\"{ standalone: true }\" (change)=\"onHideMetadataToggle()\" style=\"cursor: pointer\" />\r\n                <label class=\"form-check-label ms-2\" for=\"hideMetadata\" style=\"color: black; white-space: nowrap;\">\r\n                    Hide metadata\r\n                </label>\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]=\"!hideMetadata\">\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]=\"!hideMetadata\">\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]=\"!hideMetadata\">\r\n                </lib-store-fixture>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>\r\n","import { Component, inject, ViewChild, ElementRef, Input, OnInit } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n  selector: 'lib-approve-complete-modal',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './approve-complete-modal.component.html',\r\n  styleUrl: './approve-complete-modal.component.scss'\r\n})\r\nexport class ApproveCompleteModalComponent implements OnInit {\r\n  activeModal = inject(NgbActiveModal);\r\n  \r\n  @ViewChild('dateInput') dateInput!: ElementRef<HTMLInputElement>;\r\n  \r\n  @Input() initialSchedule: boolean = false;\r\n  @Input() initialScheduleDate: string | null = null;\r\n  \r\n  schedule: boolean = false;\r\n  scheduleDate: string = '';\r\n\r\n  ngOnInit(): void {\r\n    // Pre-fill the schedule value\r\n    this.schedule = this.initialSchedule;\r\n    \r\n    // Pre-fill the schedule date if it exists\r\n    if (this.initialScheduleDate) {\r\n      // Convert the date to YYYY-MM-DD format if needed\r\n      const date = new Date(this.initialScheduleDate);\r\n      if (!isNaN(date.getTime())) {\r\n        const dateStr = date.toISOString().split('T')[0];\r\n        const tomorrow = new Date();\r\n        tomorrow.setDate(tomorrow.getDate() + 1);\r\n        const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n        // Only use the initial date if it's tomorrow or later\r\n        this.scheduleDate = dateStr >= tomorrowStr ? dateStr : tomorrowStr;\r\n      }\r\n    }\r\n    \r\n    // If schedule is enabled, ensure date is set to tomorrow (or later)\r\n    if (this.schedule) {\r\n      const tomorrow = new Date();\r\n      tomorrow.setDate(tomorrow.getDate() + 1);\r\n      const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n      if (!this.scheduleDate || this.scheduleDate < tomorrowStr) {\r\n        this.scheduleDate = tomorrowStr;\r\n      }\r\n    }\r\n  }\r\n\r\n  get minDate(): string {\r\n    const tomorrow = new Date();\r\n    tomorrow.setDate(tomorrow.getDate() + 1);\r\n    return tomorrow.toISOString().split('T')[0];\r\n  }\r\n\r\n  onScheduleChange(): void {\r\n    if (this.schedule) {\r\n      // Always set default date to tomorrow when schedule is checked\r\n      // This ensures the input always shows tomorrow, not today\r\n      const tomorrow = new Date();\r\n      tomorrow.setDate(tomorrow.getDate() + 1);\r\n      const tomorrowStr = tomorrow.toISOString().split('T')[0];\r\n      \r\n      // Only update if scheduleDate is empty or if it's today's date\r\n      if (!this.scheduleDate || this.scheduleDate < tomorrowStr) {\r\n        this.scheduleDate = tomorrowStr;\r\n      }\r\n    } else {\r\n      // Clear schedule date when schedule is unchecked\r\n      this.scheduleDate = '';\r\n    }\r\n  }\r\n\r\n  openDatePicker(event: Event): void {\r\n    // Ensure date is set to tomorrow if empty or invalid\r\n    if (this.schedule && (!this.scheduleDate || this.scheduleDate < this.minDate)) {\r\n      this.scheduleDate = this.minDate;\r\n    }\r\n    \r\n    const input = event.target as HTMLInputElement;\r\n    if (input && 'showPicker' in input && typeof (input as any).showPicker === 'function') {\r\n      // Modern browsers support showPicker()\r\n      (input as any).showPicker();\r\n    } else {\r\n      // Fallback: focus the input which should trigger the picker\r\n      input.focus();\r\n      input.click();\r\n    }\r\n  }\r\n\r\n  onCancel(): void {\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onApproveAndComplete(): void {\r\n    this.activeModal.close({ \r\n      schedule: this.schedule, \r\n      scheduleDate: this.schedule ? this.scheduleDate : null \r\n    });\r\n  }\r\n}\r\n","<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                (ngModelChange)=\"onScheduleChange()\">\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","import { Component, OnInit, OnDestroy, AfterViewInit, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule, TitleCasePipe } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RouterModule, Router } from '@angular/router';\r\nimport { CollectionUpdateAiDataService } from '../../services/data.service';\r\nimport { Store, FindReplace } from '../../models/find-replace.model';\r\nimport { StoreBuilderService } from '../../../../services/store-builder.service';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport * as fabric from \"fabric\";\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { CommonSharedModule } from 'tango-app-ui-shared';\r\nimport { NgbOffcanvas, NgbModal, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { FixtureBeforeAfterComponent } from './fixture-before-after/fixture-before-after.component';\r\nimport { ApproveCompleteModalComponent } from './approve-complete-modal/approve-complete-modal.component';\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from '../../../../functions/plano.function';\r\n\r\n@Component({\r\n  selector: 'lib-review-replace',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, RouterModule, CommonSharedModule, NgbDropdownModule],\r\n  templateUrl: './review-replace.component.html',\r\n  styleUrl: './review-replace.component.scss',\r\n  providers: [TitleCasePipe]\r\n})\r\nexport class ReviewReplaceComponent implements OnInit, OnDestroy, AfterViewInit {\r\n  findReplaceData: FindReplace | null = null;\r\n  stores: Store[] = [];\r\n  filteredStores: Store[] = [];\r\n  selectedStores: Set<string> = new Set();\r\n  searchTerm: string = '';\r\n  selectedStore: Store | null = null;\r\n\r\n  // Filter properties\r\n  selectedStatusFilters: Set<string> = new Set();\r\n  statusOptions = [\r\n    { value: 'match', label: 'Match' },\r\n    { value: 'no-match', label: 'No Match' }\r\n  ];\r\n\r\n  // Canvas properties\r\n  @ViewChild('previewCanvas') previewCanvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('previewCanvasContainer') previewCanvasContainerRef!: ElementRef<HTMLDivElement>;\r\n  previewCanvas!: fabric.Canvas;\r\n  planoData: any;\r\n  floorData: any;\r\n  canvasLoading = false;\r\n  approveLoading = false;\r\n  cdnUrl: string = '';\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  allFixtureInstances: any[] = [];\r\n\r\n  // Fixture selection and highlighting\r\n  selectedFixture: any = null;\r\n  selectedFixtureData: any = null;\r\n  originalFixtureData: any = null; // Original fixture before replace (for before/after comparison)\r\n  private originalFixturesMap: Map<string, any> = new Map(); // Store original fixtures by fixtureId\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  private destroy$ = new Subject<void>();\r\n  editMode: boolean = false;\r\n\r\n  constructor(\r\n    private dataService: CollectionUpdateAiDataService,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private cdr: ChangeDetectorRef,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private offcanvasService: NgbOffcanvas,\r\n    private modalService: NgbModal,\r\n    private router: Router\r\n  ) { }\r\n\r\n  ngOnInit(): void {\r\n    // Get CDN URL\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => {\r\n        this.cdnUrl = env.planogramCDN || '';\r\n      });\r\n\r\n    // Subscribe to edit mode\r\n    this.dataService.getEditMode()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((editMode) => {\r\n        this.editMode = editMode;\r\n        this.cdr.detectChanges();\r\n      });\r\n\r\n    // Subscribe to data service\r\n    this.dataService.getFindReplaceData()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data) => {\r\n        this.findReplaceData = data;\r\n        if (data?.stores) {\r\n          this.stores = data.stores;\r\n\r\n          // Restore checkbox state from isApproved property\r\n          this.selectedStores.clear();\r\n          this.stores.forEach(store => {\r\n            if (store.isApproved && !this.hasNoMatch(store)) {\r\n              this.selectedStores.add(store.storeName);\r\n            }\r\n          });\r\n\r\n          this.applyFilters();\r\n\r\n          // Select first store by default if none selected\r\n          if (!this.selectedStore && this.filteredStores.length > 0) {\r\n            this.onStoreSelect(this.filteredStores[0]);\r\n          }\r\n        }\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    // Canvas will be initialized when store is selected\r\n  }\r\n\r\n  initializeCanvas(): boolean {\r\n    if (this.previewCanvas) {\r\n      return true;\r\n    }\r\n\r\n    if (this.previewCanvasRef?.nativeElement && this.previewCanvasContainerRef?.nativeElement) {\r\n      try {\r\n        const containerEl = this.previewCanvasContainerRef.nativeElement;\r\n        this.previewCanvas = new fabric.Canvas(this.previewCanvasRef.nativeElement, {\r\n          selectionFullyContained: true,\r\n          perPixelTargetFind: true,\r\n          targetFindTolerance: 5,\r\n          width: containerEl.clientWidth,\r\n          height: containerEl.clientHeight,\r\n        });\r\n        this.setupZoomHandlers(this.previewCanvas);\r\n        return true;\r\n      } catch (error) {\r\n        console.error('Error initializing canvas:', error);\r\n        return false;\r\n      }\r\n    }\r\n    return false;\r\n  }\r\n\r\n  setupZoomHandlers(canvas: fabric.Canvas): void {\r\n    canvas.selection = false;\r\n\r\n    canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n        canvas.zoomToPoint({ x: e.offsetX, y: e.offsetY } as fabric.Point, zoom);\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    canvas.on(\"mouse:down\", (opt: any) => {\r\n      // Handle fixture clicks - use findTarget to get the actual group\r\n      if (opt.target) {\r\n        const obj = opt.target as any;\r\n        // Check if it's a fixture group or nested within one\r\n        let fixtureGroup = obj;\r\n\r\n        // Traverse up to find the fixture group\r\n        let attempts = 0;\r\n        while (fixtureGroup && !(fixtureGroup as any).fixtureId && !(fixtureGroup as any).objType && attempts < 10) {\r\n          if ((fixtureGroup as any).parent) {\r\n            fixtureGroup = (fixtureGroup as any).parent;\r\n          } else if ((fixtureGroup as any).group) {\r\n            fixtureGroup = (fixtureGroup as any).group;\r\n          } else {\r\n            break;\r\n          }\r\n          attempts++;\r\n        }\r\n\r\n        // Check if we found a fixture group\r\n        if ((fixtureGroup as any).objType === \"fixture\" || (fixtureGroup as any).fixtureId) {\r\n          this.onFixtureClick(fixtureGroup);\r\n          canvas.setActiveObject(fixtureGroup);\r\n          canvas.requestRenderAll();\r\n          return;\r\n        }\r\n      }\r\n\r\n      // For non-fixture clicks, enable dragging\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && canvas.viewportTransform && !opt.target) {\r\n        const e = opt.e;\r\n        const vpt = canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      canvas.selection = false;\r\n    });\r\n  }\r\n\r\n  onStoreSelect(store: Store): void {\r\n    // Allow viewing planogram even for stores with no-match status\r\n    this.selectedStore = store;\r\n    this.cdr.detectChanges();\r\n\r\n    setTimeout(() => {\r\n      if (this.initializeCanvas()) {\r\n        // Resize canvas to container size\r\n        if (this.previewCanvasContainerRef?.nativeElement) {\r\n          this.resizeCanvas(this.previewCanvas, this.previewCanvasContainerRef);\r\n        }\r\n        this.loadPlanogramForStore(store.storeName);\r\n      }\r\n    }, 100);\r\n  }\r\n\r\n  async loadPlanogramForStore(storeName: string): Promise<void> {\r\n    if (!storeName || !this.previewCanvas) {\r\n      return;\r\n    }\r\n\r\n    this.canvasLoading = true;\r\n    try {\r\n      const response: any = await this.storeBuilderService.getPlanoId({ stores: [storeName.toUpperCase()] }).toPromise();\r\n\r\n      if (response?.code === 200 && response?.data?.length > 0) {\r\n        const planoId = response.data[0]._id;\r\n        await this.getStoreFixtures(planoId);\r\n      } else {\r\n        this.canvasLoading = false;\r\n        this.cdr.detectChanges();\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading planogram:', error);\r\n      this.canvasLoading = false;\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string): Promise<void> {\r\n    if (!this.previewCanvas) {\r\n      this.canvasLoading = false;\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n\r\n    this.storeBuilderService.getStoreFixtures({ id: [storeId] })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            this.canvasLoading = false;\r\n            this.cdr.detectChanges();\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          this.floorData = structuredClone(res.data[0].floors[0]);\r\n\r\n          // Apply stored response data if available\r\n          this.applyStoredResponseData();\r\n\r\n          // Collect all fixtures\r\n          this.collectAllFixtures();\r\n\r\n          if (this.previewCanvas) {\r\n            // Render the planogram first\r\n            await this.renderFloor(this.previewCanvas);\r\n            this.canvasLoading = false;\r\n            this.cdr.detectChanges();\r\n\r\n            // Wait for all objects to be rendered, then resize and recenter\r\n            setTimeout(() => {\r\n              if (this.previewCanvasContainerRef?.nativeElement && this.previewCanvas) {\r\n                // Resize canvas to container dimensions\r\n                this.resizeCanvas(this.previewCanvas, this.previewCanvasContainerRef);\r\n\r\n                // Wait a bit more for canvas to update, then recenter\r\n                setTimeout(() => {\r\n                  if (this.previewCanvas) {\r\n                    this.fitCanvasToLayoutAnimated(this.previewCanvas);\r\n\r\n                    // Highlight fixture if it has replaceResponseData\r\n                    const store = this.findReplaceData?.stores?.find(\r\n                      (s: Store) => s.storeName === this.selectedStore?.storeName\r\n                    );\r\n                    if (store?.findResponseData && store?.replaceResponseData) {\r\n                      const fixtureGroup = this.previewCanvas.getObjects().find(\r\n                        (obj: any) => obj.objType === \"fixture\" && obj.fixtureId === store.findResponseData\r\n                      ) as fabric.Group | undefined;\r\n                      if (fixtureGroup) {\r\n                        this.highlightFixture(this.previewCanvas, fixtureGroup, false);\r\n                      }\r\n                    }\r\n                  }\r\n                }, 100);\r\n              }\r\n            }, 300);\r\n          } else {\r\n            this.canvasLoading = false;\r\n            this.cdr.detectChanges();\r\n          }\r\n        },\r\n        error: (err: any) => {\r\n          this.canvasLoading = false;\r\n          this.cdr.detectChanges();\r\n          console.error('Error fetching plano:', err);\r\n        },\r\n      });\r\n  }\r\n\r\n  private applyStoredResponseData(): void {\r\n    if (!this.findReplaceData?.stores || !this.selectedStore || !this.floorData) {\r\n      return;\r\n    }\r\n\r\n    const store = this.findReplaceData.stores.find(\r\n      (s: Store) => s.storeName === this.selectedStore?.storeName\r\n    );\r\n\r\n    if (!store?.replaceResponseData) {\r\n      return;\r\n    }\r\n\r\n    const fixtureId = store.findResponseData;\r\n    if (!fixtureId) return;\r\n\r\n    const fixture = this.getFixtureByIdFromFloor(fixtureId);\r\n    if (!fixture) return;\r\n\r\n    // Store the original fixture (before replace) for before/after comparison\r\n    const originalFixture = structuredClone(fixture);\r\n    this.originalFixturesMap.set(fixtureId, originalFixture);\r\n\r\n    // Create a deep copy of the fixture to preserve all original properties\r\n    const updatedFixture = structuredClone(fixture);\r\n\r\n    // Merge replaceResponseData properties while preserving all other fixture properties\r\n    if (store.replaceResponseData.vmConfig) {\r\n      updatedFixture.vmConfig = Array.isArray(store.replaceResponseData.vmConfig)\r\n        ? store.replaceResponseData.vmConfig\r\n        : [];\r\n    }\r\n\r\n    // Merge shelfConfig intelligently - preserve original shelf structure and only update provided properties\r\n    if (store.replaceResponseData.shelfConfig && Array.isArray(store.replaceResponseData.shelfConfig)) {\r\n      const originalShelfConfig = Array.isArray(fixture.shelfConfig) ? fixture.shelfConfig : [];\r\n\r\n      // Create a map of original shelves by shelf identifier (shelfType + shelfNumber)\r\n      const originalShelvesMap = new Map();\r\n      originalShelfConfig.forEach((shelf: any) => {\r\n        const key = `${shelf.shelfType || ''}_${shelf.shelfNumber || ''}`;\r\n        originalShelvesMap.set(key, shelf);\r\n      });\r\n\r\n      // Merge: for each shelf in replaceResponseData, find the original and merge\r\n      updatedFixture.shelfConfig = store.replaceResponseData.shelfConfig.map((newShelf: any) => {\r\n        const key = `${newShelf.shelfType || ''}_${newShelf.shelfNumber || ''}`;\r\n        const originalShelf = originalShelvesMap.get(key);\r\n\r\n        if (originalShelf) {\r\n          // Merge: preserve all original properties, update with new ones\r\n          return {\r\n            ...originalShelf,\r\n            ...newShelf,\r\n            // Ensure critical numeric properties are preserved\r\n            productPerShelf: newShelf.productPerShelf !== undefined ? newShelf.productPerShelf : originalShelf.productPerShelf,\r\n            trayRows: newShelf.trayRows !== undefined ? newShelf.trayRows : originalShelf.trayRows,\r\n            shelfType: newShelf.shelfType || originalShelf.shelfType,\r\n            shelfNumber: newShelf.shelfNumber !== undefined ? newShelf.shelfNumber : originalShelf.shelfNumber,\r\n          };\r\n        } else {\r\n          // New shelf not in original - use as is but ensure required properties\r\n          return {\r\n            ...newShelf,\r\n            productPerShelf: newShelf.productPerShelf || 0,\r\n            trayRows: newShelf.trayRows || 1,\r\n          };\r\n        }\r\n      });\r\n    } else if (!Array.isArray(updatedFixture.shelfConfig)) {\r\n      updatedFixture.shelfConfig = [];\r\n    }\r\n\r\n    // Ensure arrays are always arrays\r\n    if (!Array.isArray(updatedFixture.vmConfig)) {\r\n      updatedFixture.vmConfig = [];\r\n    }\r\n    if (!Array.isArray(updatedFixture.shelfConfig)) {\r\n      updatedFixture.shelfConfig = [];\r\n    }\r\n\r\n    this.updateAiResponseFixture(updatedFixture);\r\n  }\r\n\r\n  private getFixtureByIdFromFloor(fixtureId: string): any | null {\r\n    if (!fixtureId || !this.floorData) return null;\r\n\r\n    for (const element of this.floorData.layoutPolygon || []) {\r\n      if (element?.elementType === \"wall\" && Array.isArray(element.fixtures)) {\r\n        const hit = element.fixtures.find((fx: any) => fx?._id === fixtureId);\r\n        if (hit) return hit;\r\n      }\r\n    }\r\n\r\n    for (const fx of this.floorData.centerFixture || []) {\r\n      if (fx?._id === fixtureId) return fx;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private updateAiResponseFixture(updatedFixture: any): void {\r\n    if (!this.floorData) return;\r\n\r\n    for (const element of this.floorData.layoutPolygon || []) {\r\n      if (element?.elementType === \"wall\" && Array.isArray(element.fixtures)) {\r\n        const index = element.fixtures.findIndex((fx: any) => fx?._id === updatedFixture._id);\r\n        if (index !== -1) {\r\n          element.fixtures[index] = updatedFixture;\r\n          return;\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < (this.floorData.centerFixture || []).length; i++) {\r\n      if (this.floorData.centerFixture[i]?._id === updatedFixture._id) {\r\n        this.floorData.centerFixture[i] = updatedFixture;\r\n        return;\r\n      }\r\n    }\r\n  }\r\n\r\n  collectAllFixtures(): void {\r\n    this.allFixtureInstances = [];\r\n\r\n    // Collect wall fixtures\r\n    if (this.floorData?.layoutPolygon) {\r\n      for (const element of this.floorData.layoutPolygon) {\r\n        if (element.fixtures && Array.isArray(element.fixtures)) {\r\n          this.allFixtureInstances.push(...element.fixtures);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Collect floor fixtures\r\n    if (this.floorData?.centerFixture && Array.isArray(this.floorData.centerFixture)) {\r\n      this.allFixtureInstances.push(...this.floorData.centerFixture);\r\n    }\r\n  }\r\n\r\n  async renderFloor(canvas: fabric.Canvas): Promise<void> {\r\n    await this.drawInitialContent(canvas);\r\n  }\r\n\r\n  async drawInitialContent(canvas: fabric.Canvas): Promise<void> {\r\n    // Clear canvas and reset viewport\r\n    canvas.clear();\r\n    canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n    await this.drawLayoutElements(canvas);\r\n    // Force render after drawing\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  async drawLayoutElements(canvas: fabric.Canvas) {\r\n    if (!this.floorData) return;\r\n\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n      let wall;\r\n\r\n      element.relativePosition ??= { x: 0, y: 0, unit: \"ft\" };\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = await this.drawWall(canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        this.drawEntrance(canvas, x, y, 80, 75, 40, element);\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const fx = this.toPixels(fixture.relativePosition.x, fixture.relativePosition.unit);\r\n          const fy = this.toPixels(fixture.relativePosition.y, fixture.relativePosition.unit);\r\n          const fh = this.toPixels(fixture.fixtureStaticLength.value, fixture.fixtureStaticLength.unit);\r\n          const fw = this.toPixels(fixture.fixtureStaticWidth.value, fixture.fixtureStaticWidth.unit);\r\n          const fixtureObj = await this.drawFixture(canvas, fx, fy, fh, fw, fixture);\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => canvas.remove(f));\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: false,\r\n            selectable: false,\r\n            lockMovementX: true,\r\n            lockMovementY: true,\r\n            lockRotation: true,\r\n            lockScalingX: true,\r\n            lockScalingY: true,\r\n            subTargetCheck: true,\r\n          });\r\n          combinedGroup.set({ isLocked: true });\r\n          canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const ox = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const oy = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const oa = otherElement.relativePosition.angle;\r\n          const oh = this.toPixels(otherElement.fixtureStaticLength.value, otherElement.fixtureStaticLength.unit);\r\n          const ow = this.toPixels(otherElement.fixtureStaticWidth.value, otherElement.fixtureStaticWidth.unit);\r\n          this.drawOtherElementsWithLabel(canvas, ox, oy, oa, ow, oh, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(fixture.relativePosition.x, fixture.relativePosition.unit);\r\n      const y = this.toPixels(fixture.relativePosition.y, fixture.relativePosition.unit);\r\n      const h = this.toPixels(fixture.fixtureStaticLength.value, fixture.fixtureStaticLength.unit);\r\n      const w = this.toPixels(fixture.fixtureStaticWidth.value, fixture.fixtureStaticWidth.unit);\r\n      await this.drawFixture(canvas, x, y, h, w, fixture);\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(otherElement.fixtureStaticLength.value, otherElement.fixtureStaticLength.unit);\r\n      const w = this.toPixels(otherElement.fixtureStaticWidth.value, otherElement.fixtureStaticWidth.unit);\r\n      this.drawOtherElementsWithLabel(canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${elementData.elementNumber\r\n      }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            }\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          })\r\n        );\r\n      }\r\n    }\r\n\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n      angle: elementData.angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any\r\n  ) {\r\n    let fixtureColor: any;\r\n    // if ([\"fixture\", \"fixture-redo\"].includes(this.publishingState)) {\r\n    //   fixtureColor = {\r\n    //     primary:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#a5a6a8\"\r\n    //         : fixtureData.status == \"agree\"\r\n    //         ? \"#6CE9A6\"\r\n    //         : \"#51C1FF\",\r\n    //     fill:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#f3f4f8\"\r\n    //         : fixtureData.status == \"agree\"\r\n    //         ? \"#6CE9A6\"\r\n    //         : \"#EAF8FF\",\r\n    //     vmFill:\r\n    //       fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n    //         ? \"#a5a6a8\"\r\n    //         : \"#6938EF\",\r\n    //   };\r\n    // }\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n              L ${topX + topWidth - radius} ${topY} \r\n              Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n              L ${topX + topWidth} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + innerBoxHeight} \r\n              L ${topX} ${topY + radius} \r\n              Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      }\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${fixtureData.associatedElementFixtureNumber\r\n        ? fixtureData.associatedElementFixtureNumber +\r\n        (fixtureData?.fixtureNumber\r\n          ? \" - FX-\" + fixtureData.fixtureNumber\r\n          : \"\")\r\n        : \"new\"\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY} \r\n          L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n          Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${topX + topWidth - radius\r\n      } ${secondBoxY + innerBoxHeight} \r\n          L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n          Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${secondBoxY + innerBoxHeight - radius\r\n      } \r\n          L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n              L ${midX + midWidth - radius} ${firstBoxY} \r\n              Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${firstBoxY + radius\r\n      } \r\n              L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + boxHeight} \r\n              L ${midX} ${firstBoxY + radius} \r\n              Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      }\r\n    );\r\n\r\n    const shelves: fabric.Object[] = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              }\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                }\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          }\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              }\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY} \r\n              L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n              Q ${midX + midWidth} ${lastBoxY + boxHeight} ${midX + midWidth - radius\r\n      } ${lastBoxY + boxHeight} \r\n              L ${midX + radius} ${lastBoxY + boxHeight} \r\n              Q ${midX} ${lastBoxY + boxHeight} ${midX} ${lastBoxY + boxHeight - radius\r\n      } \r\n              L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      }\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      }\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${fixtureData.shelfConfig?.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      }\r\n    );\r\n\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        selectable: false,\r\n        hoverCursor: \"default\",\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        lockMovementX: true,\r\n        lockMovementY: true,\r\n        lockRotation: true,\r\n        hasControls: false,\r\n        subTargetCheck: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n      }\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    // Add click handler directly on the fixture group\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      // Use the fixture group itself (which has all the fixture properties)\r\n      // The event.target might be a child element, so we use fixtureGroup directly\r\n      if (fixtureGroup && (fixtureGroup as any).fixtureId) {\r\n        // this.onFixtureClick(fixtureGroup);\r\n      }\r\n    });\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(fixtureGroup);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      hasControls: false,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      lockMovementX: true,\r\n      lockMovementY: true,\r\n      evented: true,\r\n      hoverCursor: \"default\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        canvas.setActiveObject(group);\r\n        canvas.requestRenderAll();\r\n      } catch { }\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  resizeCanvas(canvas: fabric.Canvas, container: ElementRef<HTMLDivElement>): void {\r\n    const containerEl = container.nativeElement;\r\n    const width = containerEl.clientWidth || containerEl.offsetWidth;\r\n    const height = containerEl.clientHeight || containerEl.offsetHeight;\r\n\r\n    if (width > 0 && height > 0) {\r\n      canvas.setDimensions({\r\n        width: width,\r\n        height: height,\r\n      });\r\n      canvas.calcOffset();\r\n      canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(canvas: fabric.Canvas) {\r\n    if (!canvas) return;\r\n\r\n    // Ensure canvas has objects before calculating bounds\r\n    const objects = canvas.getObjects();\r\n    if (!objects || objects.length === 0) {\r\n      console.warn('No objects on canvas to fit');\r\n      return;\r\n    }\r\n\r\n    // Force recalculation of object coordinates\r\n    canvas.calcOffset();\r\n\r\n    const bounds = this.getFullLayoutBounds(canvas);\r\n    if (!bounds.width || !bounds.height || bounds.width === 0 || bounds.height === 0) {\r\n      console.warn('Invalid bounds for canvas fitting', bounds);\r\n      return;\r\n    }\r\n\r\n    const canvasW = canvas.getWidth();\r\n    const canvasH = canvas.getHeight();\r\n\r\n    if (canvasW === 0 || canvasH === 0) {\r\n      console.warn('Canvas dimensions are zero');\r\n      return;\r\n    }\r\n\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    // Use smaller multiplier (0.5) to zoom out more and ensure planogram fits with more padding inside canvas\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9;\r\n\r\n    // Ensure zoom is within reasonable bounds\r\n    const finalZoom = Math.max(0.1, Math.min(targetZoom, 3));\r\n\r\n    const targetVpt = [...(canvas.viewportTransform || [1, 0, 0, 1, 0, 0])] as fabric.TMat2D;\r\n    targetVpt[0] = finalZoom;\r\n    targetVpt[3] = finalZoom;\r\n\r\n    // Calculate center of layout bounds for horizontal centering\r\n    const centerX = bounds.left + bounds.width / 2;\r\n\r\n    // Position from top with very minimal padding (use top space)\r\n    const topPadding = 10; // Fixed 10px padding from top\r\n\r\n    // Calculate translation: center horizontally, position from top\r\n    targetVpt[4] = canvasW / 2 - centerX * finalZoom;\r\n    targetVpt[5] = topPadding - bounds.top * finalZoom;\r\n\r\n    const startVpt = [...canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration: 500,\r\n      onChange: (value: number) => {\r\n        const vpt = [...startVpt] as fabric.TMat2D;\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n        canvas.setViewportTransform(vpt);\r\n        canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  private getFullLayoutBounds(canvas: fabric.Canvas) {\r\n    const objects = canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      // Get bounding rect which accounts for object's position, rotation, and scale\r\n      const boundingRect = obj.getBoundingRect();\r\n\r\n      // Get the actual bounding box\r\n      const left = boundingRect.left;\r\n      const top = boundingRect.top;\r\n      const right = left + boundingRect.width;\r\n      const bottom = top + boundingRect.height;\r\n\r\n      minX = Math.min(minX, left);\r\n      minY = Math.min(minY, top);\r\n      maxX = Math.max(maxX, right);\r\n      maxY = Math.max(maxY, bottom);\r\n    }\r\n\r\n    return { left: minX, top: minY, width: maxX - minX, height: maxY - minY };\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8): number {\r\n    let pixels: number;\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  // Store list methods\r\n  onSelectAll(checked: boolean): void {\r\n    // Prevent changes if status is approved or scheduled (unless in edit mode)\r\n    if ((this.isApproved() || this.isScheduledApprove()) && !this.editMode) {\r\n      return;\r\n    }\r\n\r\n    if (checked) {\r\n      // Only select stores that don't have no-match status\r\n      this.filteredStores.forEach(store => {\r\n        if (!this.hasNoMatch(store)) {\r\n          store.isApproved = true;\r\n          this.selectedStores.add(store.storeName);\r\n        }\r\n      });\r\n    } else {\r\n      // Deselect all stores\r\n      this.filteredStores.forEach(store => {\r\n        store.isApproved = false;\r\n      });\r\n      this.selectedStores.clear();\r\n    }\r\n\r\n    // Update findReplaceData stores array and notify data service\r\n    if (this.findReplaceData?.stores) {\r\n      const stores = this.findReplaceData.stores;\r\n      this.filteredStores.forEach(filteredStore => {\r\n        if (filteredStore && stores) {\r\n          const storeIndex = stores.findIndex(s => s && s.storeName === filteredStore.storeName);\r\n          if (storeIndex !== -1 && stores[storeIndex]) {\r\n            stores[storeIndex].isApproved = filteredStore.isApproved;\r\n          }\r\n        }\r\n      });\r\n      // Update data service to preserve state\r\n      if (stores) {\r\n        this.dataService.updateData({ stores: stores });\r\n      }\r\n    }\r\n  }\r\n\r\n  onStoreCheckboxChange(store: Store, checked: boolean): void {\r\n    // Prevent changes if status is approved or scheduled (unless in edit mode)\r\n    if ((this.isApproved() || this.isScheduledApprove()) && !this.editMode) {\r\n      return;\r\n    }\r\n\r\n    // Prevent selection if store has no-match status\r\n    if (this.hasNoMatch(store)) {\r\n      return;\r\n    }\r\n\r\n    if (!store) {\r\n      return;\r\n    }\r\n\r\n    // Update isApproved property on the store object\r\n    store.isApproved = checked;\r\n\r\n    // Update the store in the local stores array\r\n    const localStoreIndex = this.stores.findIndex(s => s.storeName === store.storeName);\r\n    if (localStoreIndex !== -1 && this.stores[localStoreIndex]) {\r\n      this.stores[localStoreIndex].isApproved = checked;\r\n    }\r\n\r\n    // Update selectedStores set for backward compatibility\r\n    if (checked) {\r\n      this.selectedStores.add(store.storeName);\r\n    } else {\r\n      this.selectedStores.delete(store.storeName);\r\n    }\r\n\r\n    // Update the store in findReplaceData stores array and notify data service to preserve state\r\n    if (this.findReplaceData?.stores) {\r\n      const storeIndex = this.findReplaceData.stores.findIndex(s => s.storeName === store.storeName);\r\n      if (storeIndex !== -1 && this.findReplaceData.stores[storeIndex]) {\r\n        this.findReplaceData.stores[storeIndex].isApproved = checked;\r\n        // Update data service to preserve state when save as draft is called\r\n        this.dataService.updateData({ stores: this.findReplaceData.stores });\r\n      }\r\n    }\r\n  }\r\n\r\n  isStoreSelected(storeName: string): boolean {\r\n    // Check both selectedStores set and isApproved property\r\n    const store = this.stores.find(s => s.storeName === storeName);\r\n    return this.selectedStores.has(storeName) || (store?.isApproved === true);\r\n  }\r\n\r\n  isAllSelected(): boolean {\r\n    // Only consider selectable stores (exclude no-match stores)\r\n    const selectableStores = this.filteredStores.filter(store => !this.hasNoMatch(store));\r\n    return selectableStores.length > 0 && selectableStores.every(store => store.isApproved === true);\r\n  }\r\n\r\n  onSearch(): void {\r\n    this.applyFilters();\r\n  }\r\n\r\n  applyFilters(): void {\r\n    let filtered = [...this.stores];\r\n\r\n    // Apply search filter\r\n    if (this.searchTerm.trim()) {\r\n      const term = this.searchTerm.toLowerCase();\r\n      filtered = filtered.filter(store =>\r\n        store.storeName.toLowerCase().includes(term)\r\n      );\r\n    }\r\n\r\n    // Apply status filter\r\n    if (this.selectedStatusFilters.size > 0) {\r\n      filtered = filtered.filter(store => {\r\n        if (!store.responseStatus) {\r\n          return this.selectedStatusFilters.has('unknown');\r\n        }\r\n        return this.selectedStatusFilters.has(store.responseStatus);\r\n      });\r\n    }\r\n\r\n    this.filteredStores = filtered;\r\n  }\r\n\r\n  onDownload(): void {\r\n    if (!this.stores || this.stores.length === 0) {\r\n      console.warn('No stores to export');\r\n      return;\r\n    }\r\n\r\n    // Prepare data for Excel export\r\n    const exportData = this.stores.map(store => {\r\n      let status = store.responseStatus === 'match' ? 'Match' :\r\n        store.responseStatus === 'no-match' ? 'No Match' :\r\n          'Unknown';\r\n      \r\n      // Add \"Approved\" status if conditions are met\r\n      if (store.responseStatus === 'match' && this.findReplaceData?.status === 'approved') {\r\n        status = status + ', Approved';\r\n      }\r\n      \r\n      return {\r\n        'Store Name': store.storeName,\r\n        'Status': status\r\n      };\r\n    });\r\n\r\n    // Export to Excel\r\n    const fileName = `Stores_Export_${new Date().toISOString().split('T')[0]}`;\r\n    this.storeBuilderService.exportAsExcelFile(exportData, fileName);\r\n  }\r\n\r\n  onFilter(): void {\r\n    // Filter functionality is handled via dropdown in template\r\n  }\r\n\r\n  onStatusFilterChange(status: string, event: any): void {\r\n    // Prevent changes if status is approved or scheduled (unless in edit mode)\r\n    if ((this.isApproved() || this.isScheduledApprove()) && !this.editMode) {\r\n      return;\r\n    }\r\n\r\n    const isChecked = event.target.checked;\r\n    if (isChecked) {\r\n      this.selectedStatusFilters.add(status);\r\n    } else {\r\n      this.selectedStatusFilters.delete(status);\r\n    }\r\n    this.applyFilters();\r\n  }\r\n\r\n  isStatusFilterSelected(status: string): boolean {\r\n    return this.selectedStatusFilters.has(status);\r\n  }\r\n\r\n  clearFilters(): void {\r\n    this.selectedStatusFilters.clear();\r\n    this.searchTerm = '';\r\n    this.applyFilters();\r\n  }\r\n\r\n  hasActiveFilters(): boolean {\r\n    return this.selectedStatusFilters.size > 0 || this.searchTerm.trim().length > 0;\r\n  }\r\n\r\n  async onApproveAndComplete(): Promise<void> {\r\n    try {\r\n      const modalRef = this.modalService.open(ApproveCompleteModalComponent, {\r\n        centered: true,\r\n        size: 'lg',\r\n        backdrop: 'static',\r\n        windowClass: 'approve-complete-modal'\r\n      });\r\n\r\n      // Pre-fill modal with existing schedule values if available\r\n      modalRef.componentInstance.initialSchedule = this.findReplaceData?.schedule || false;\r\n      modalRef.componentInstance.initialScheduleDate = this.findReplaceData?.scheduleDate || null;\r\n\r\n      const result = await modalRef.result;\r\n      if (result) {\r\n        // Handle the approve and complete action\r\n        console.log('Approve and complete with schedule:', result.schedule, 'scheduleDate:', result.scheduleDate);\r\n\r\n        // Get findReplaceId from findReplaceData\r\n        if (!this.findReplaceData?._id) {\r\n          console.error('FindReplace ID is missing');\r\n          return;\r\n        }\r\n\r\n        // Save stores, schedule, and scheduleDate using save as draft first\r\n        const draftData: any = {};\r\n        if (this.findReplaceData.stores && this.findReplaceData.stores.length > 0) {\r\n          draftData.stores = this.findReplaceData.stores;\r\n        }\r\n        if (result.schedule !== undefined) {\r\n          draftData.schedule = result.schedule;\r\n        }\r\n        if (result.scheduleDate !== undefined) {\r\n          draftData.scheduleDate = result.scheduleDate;\r\n        }\r\n        \r\n        // Wait for save as draft to complete before calling approveReplace\r\n        this.approveLoading = true;\r\n        try {\r\n          // Save all the data using save as draft and wait for it to complete\r\n          if (Object.keys(draftData).length > 0) {\r\n            const saveResponse: any = await this.dataService.saveDraftAndWait(draftData).toPromise();\r\n            if (saveResponse?.code !== 200) {\r\n              console.error('Failed to save as draft:', saveResponse?.message || 'Unknown error');\r\n              this.approveLoading = false;\r\n              return;\r\n            }\r\n          }\r\n\r\n          // Call the approveReplace API with only findReplaceId after save as draft completes\r\n          const response: any = await this.storeBuilderService.approveReplace({\r\n            findReplaceId: this.findReplaceData._id,\r\n          }).toPromise();\r\n\r\n          console.log('Approve replace response:', response);\r\n          this.approveLoading = false;\r\n          \r\n          // Navigate to table page on successful response\r\n          if (response?.code === 200) {\r\n            // Disable edit mode after successful approval\r\n            this.dataService.setEditMode(false);\r\n            this.router.navigate(['/manage/planogram/find-replace-table']);\r\n          }\r\n        } catch (error) {\r\n          console.error('Error approving replace:', error);\r\n          this.approveLoading = false;\r\n          // TODO: Handle error (e.g., show error message)\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.log('Modal dismissed');\r\n    }\r\n  }\r\n\r\n  hasNoMatch(store: Store): boolean {\r\n    return store.responseStatus === 'no-match';\r\n  }\r\n\r\n  isApprovedChip(store: Store): boolean {\r\n    return store.responseStatus === 'match' && this.findReplaceData?.status === 'approved' && store.isApproved === true;\r\n  }\r\n\r\n  isApproved(): boolean {\r\n    return this.findReplaceData?.status === 'approved' ;\r\n  }\r\n\r\n  isScheduledApprove(): boolean {\r\n    return this.findReplaceData?.status === 'scheduled';\r\n  }\r\n\r\n  hasAnyStoreSelected(): boolean {\r\n    // Check if any store checkbox is selected in the store list\r\n    return this.selectedStores.size > 0;\r\n  }\r\n\r\n\r\n  previousNext(step: 'previous' | 'next'): void {\r\n    if (!this.selectedStore || this.filteredStores.length === 0) return;\r\n\r\n    const curIdx = this.filteredStores.findIndex(\r\n      (store: Store) => store.storeName === this.selectedStore?.storeName\r\n    );\r\n\r\n    let newIdx: number;\r\n    if (step === 'previous') {\r\n      if (curIdx === 0) return;\r\n      newIdx = curIdx - 1;\r\n    } else {\r\n      if (curIdx === this.filteredStores.length - 1) return;\r\n      newIdx = curIdx + 1;\r\n    }\r\n\r\n    this.onStoreSelect(this.filteredStores[newIdx]);\r\n  }\r\n\r\n\r\n\r\n  highlightFixture(canvas: fabric.Canvas, group: any, blink: boolean = false) {\r\n    this.removeHighlight(canvas);\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8,\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n    canvas.add(rect);\r\n    canvas.moveObjectTo(rect, canvas.getObjects().length - 1);\r\n    canvas.requestRenderAll();\r\n    this.activeHighlight = rect;\r\n\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight(canvas);\r\n        return;\r\n      }\r\n      rect.animate({ opacity: 1 }, {\r\n        duration: 200,\r\n        onChange: () => canvas.requestRenderAll(),\r\n        onComplete: () => {\r\n          if (this.cancelHighlightBlink) {\r\n            this.removeHighlight(canvas);\r\n            return;\r\n          }\r\n          rect.animate({ opacity: 0 }, {\r\n            duration: 200,\r\n            onChange: () => canvas.requestRenderAll(),\r\n            onComplete: () => {\r\n              if (this.cancelHighlightBlink) {\r\n                this.removeHighlight(canvas);\r\n                return;\r\n              }\r\n              cycles++;\r\n              if (cycles < 20) {\r\n                blinkOnce();\r\n              } else {\r\n                if (!this.cancelHighlightBlink) {\r\n                  rect.set({ opacity: 1 });\r\n                  canvas.requestRenderAll();\r\n                }\r\n              }\r\n            },\r\n          });\r\n        },\r\n      });\r\n    };\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight(canvas: fabric.Canvas) {\r\n    this.cancelHighlightBlink = true;\r\n    canvas.getObjects().forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        canvas.remove(obj);\r\n      }\r\n    });\r\n    this.activeHighlight = null;\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  onFixtureClick(target: any): void {\r\n    if (!target || !this.floorData) return;\r\n\r\n    const fixtureId = (target as any).fixtureId;\r\n    const fixtureType = (target as any).fixtureType;\r\n\r\n    if (!fixtureId) {\r\n      console.warn('Fixture click: No fixtureId found on target', target);\r\n      return;\r\n    }\r\n\r\n    // Find the fixture data\r\n    let fixtureData: any = null;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      const wallIndex = (target as any).wallIndex;\r\n\r\n      if (this.floorData.layoutPolygon && wallIndex !== undefined && wallIndex !== null) {\r\n        // Find wall by elementNumber (wallIndex is the elementNumber)\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (w: any) => w.elementNumber === wallIndex\r\n        );\r\n        if (wall && wall.fixtures) {\r\n          fixtureData = wall.fixtures.find((f: any) => f._id === fixtureId);\r\n        }\r\n      }\r\n    } else if (fixtureType === \"floor\") {\r\n      fixtureData = this.floorData.centerFixture?.find((f: any) => f._id === fixtureId);\r\n    }\r\n\r\n    if (!fixtureData) {\r\n      console.warn('Fixture click: Fixture data not found', {\r\n        fixtureId,\r\n        fixtureType,\r\n        wallIndex: (target as any).wallIndex,\r\n        fixtureIndex: (target as any).fixtureIndex,\r\n        floorData: this.floorData\r\n      });\r\n      return;\r\n    }\r\n\r\n    // Ensure vmConfig is always an array (even if empty) to avoid display issues\r\n    if (!Array.isArray(fixtureData.vmConfig)) {\r\n      fixtureData.vmConfig = [];\r\n    }\r\n\r\n    // Ensure shelfConfig is always an array (even if empty) to avoid display issues\r\n    if (!Array.isArray(fixtureData.shelfConfig)) {\r\n      fixtureData.shelfConfig = [];\r\n    }\r\n\r\n    // Create a deep clone to ensure change detection works\r\n    const clonedData = structuredClone(fixtureData);\r\n\r\n    // Ensure cloned data also has proper array structures\r\n    if (!Array.isArray(clonedData.vmConfig)) {\r\n      clonedData.vmConfig = [];\r\n    }\r\n    if (!Array.isArray(clonedData.shelfConfig)) {\r\n      clonedData.shelfConfig = [];\r\n    }\r\n\r\n    this.selectedFixture = {\r\n      fixtureId: fixtureId,\r\n      fixtureType: fixtureType,\r\n      wallIndex: (target as any).wallIndex,\r\n      fixtureIndex: (target as any).fixtureIndex,\r\n    };\r\n\r\n    // Check if this fixture has replaceResponseData (for before/after comparison)\r\n    const store = this.findReplaceData?.stores?.find(\r\n      (s: Store) => s.storeName === this.selectedStore?.storeName\r\n    );\r\n\r\n    // If this fixture matches the findResponseData and has replaceResponseData,\r\n    // restore the original fixture data for before/after comparison\r\n    if (store?.findResponseData === fixtureId && store?.replaceResponseData) {\r\n      // Restore originalFixtureData from the map (persists even when clicking other fixtures)\r\n      const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n      if (storedOriginal) {\r\n        this.originalFixtureData = structuredClone(storedOriginal);\r\n        // Ensure original data has proper array structures\r\n        if (!Array.isArray(this.originalFixtureData.vmConfig)) {\r\n          this.originalFixtureData.vmConfig = [];\r\n        }\r\n        if (!Array.isArray(this.originalFixtureData.shelfConfig)) {\r\n          this.originalFixtureData.shelfConfig = [];\r\n        }\r\n      } else {\r\n        // If not in map (shouldn't happen if applyStoredResponseData ran), \r\n        // use current fixture as fallback\r\n        this.originalFixtureData = structuredClone(clonedData);\r\n        if (!Array.isArray(this.originalFixtureData.vmConfig)) {\r\n          this.originalFixtureData.vmConfig = [];\r\n        }\r\n        if (!Array.isArray(this.originalFixtureData.shelfConfig)) {\r\n          this.originalFixtureData.shelfConfig = [];\r\n        }\r\n      }\r\n    } else {\r\n      // No replace data for this fixture, clear original\r\n      this.originalFixtureData = null;\r\n    }\r\n\r\n    // Set selected fixture data (this is the \"after\" data with replaceResponseData applied)\r\n    // For fixtures with replaceResponseData, ensure all original properties are preserved\r\n    if (store?.findResponseData === fixtureId && store?.replaceResponseData) {\r\n      const storedOriginal = this.originalFixturesMap.get(fixtureId);\r\n      if (storedOriginal) {\r\n        // Merge: start with original to preserve all base properties, then apply updates\r\n        this.selectedFixtureData = {\r\n          ...storedOriginal,  // Preserve all original properties (fixtureType, header, footer, etc.)\r\n          ...clonedData,      // Apply updated data (which has replaceResponseData applied)\r\n          // Explicitly ensure arrays are correct\r\n          vmConfig: Array.isArray(clonedData.vmConfig) ? clonedData.vmConfig : (storedOriginal.vmConfig || []),\r\n          shelfConfig: Array.isArray(clonedData.shelfConfig) ? clonedData.shelfConfig : (storedOriginal.shelfConfig || [])\r\n        };\r\n      } else {\r\n        this.selectedFixtureData = clonedData;\r\n      }\r\n    } else {\r\n      this.selectedFixtureData = clonedData;\r\n    }\r\n\r\n    // Don't highlight on click - keep highlight fixed on the fixture with findResponseData\r\n    // The highlight is set when the planogram loads and should remain fixed\r\n\r\n    // Open offcanvas with before/after comparison\r\n    this.openFixtureOffcanvas();\r\n  }\r\n\r\n  openFixtureOffcanvas(): void {\r\n    // Use wider offcanvas when showing before/after comparison\r\n    const hasBeforeAfter = !!this.originalFixtureData;\r\n    const panelClass = hasBeforeAfter\r\n      ? 'fixture-before-after-offcanvas-wide'\r\n      : 'fixture-before-after-offcanvas';\r\n\r\n    const offcanvasRef = this.offcanvasService.open(FixtureBeforeAfterComponent, {\r\n      position: 'end',\r\n      panelClass: panelClass,\r\n      backdrop: true,\r\n      backdropClass: 'offcanvas-backdrop'\r\n    });\r\n\r\n    offcanvasRef.componentInstance.selectedFixtureData = this.selectedFixtureData;\r\n    offcanvasRef.componentInstance.originalFixtureData = this.originalFixtureData;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    if (this.previewCanvas) {\r\n      this.previewCanvas.dispose();\r\n    }\r\n  }\r\n}\r\n","<div class=\"review-replace-container\">\r\n    <div class=\"row g-0 h-100\">\r\n        <!-- Left Sidebar: Store List -->\r\n        <div class=\"col-3 sidebar-container\">\r\n            <div class=\"sidebar-content\">\r\n                <!-- Header Section -->\r\n                <div class=\"header-section\">\r\n                    <div class=\"all-stores-box\">\r\n                        <p class=\"all-stores-text\">All stores</p>\r\n                    </div>\r\n                    <button class=\"download-btn\" (click)=\"onDownload()\" aria-label=\"Download\">\r\n                        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path d=\"M17.5 12.5V13.5C17.5 14.9001 17.5 15.6002 17.2275 16.135C16.9878 16.6054 16.6054 16.9878 16.135 17.2275C15.6002 17.5 14.9001 17.5 13.5 17.5H6.5C5.09987 17.5 4.3998 17.5 3.86502 17.2275C3.39462 16.9878 3.01217 16.6054 2.77248 16.135C2.5 15.6002 2.5 14.9001 2.5 13.5V12.5M14.1667 8.33333L10 12.5M10 12.5L5.83333 8.33333M10 12.5V2.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                        </svg>\r\n                    </button>\r\n                </div>\r\n\r\n                <!-- Select All Section -->\r\n                <div class=\"select-all-section\">\r\n                    <div class=\"form-check\">\r\n                        <input \r\n                            class=\"form-check-input\" \r\n                            type=\"checkbox\" \r\n                            id=\"selectAll\"\r\n                            [checked]=\"isAllSelected()\"\r\n                            [disabled]=\"(isApproved() || isScheduledApprove()) && !editMode\"\r\n                            (change)=\"onSelectAll($any($event.target).checked)\">\r\n                        <label class=\"form-check-label select-all-label\" for=\"selectAll\">\r\n                            Select all ({{ filteredStores.length }})\r\n                        </label>\r\n                    </div>\r\n                </div>\r\n\r\n                <!-- Search and Filter Section -->\r\n                <div class=\"search-filter-section\">\r\n                    <div class=\"search-input-wrapper\">\r\n                        <svg class=\"search-icon\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <path d=\"M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                        </svg>\r\n                        <input \r\n                            type=\"text\" \r\n                            class=\"search-input\" \r\n                            placeholder=\"Search\"\r\n                            [(ngModel)]=\"searchTerm\"\r\n                            (input)=\"onSearch()\">\r\n                    </div>\r\n                    <div class=\"dropdown\" ngbDropdown>\r\n                        <button \r\n                            class=\"filter-btn\" \r\n                            [class.active]=\"hasActiveFilters()\"\r\n                            id=\"filterDropdown\" \r\n                            ngbDropdownToggle\r\n                            aria-label=\"Filter\">\r\n                            <svg width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                <path d=\"M17.5026 0.835938H0.835938L7.5026 8.71927V14.1693L10.8359 15.8359V8.71927L17.5026 0.835938Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            <span *ngIf=\"hasActiveFilters()\" class=\"filter-badge\">{{ selectedStatusFilters.size }}</span>\r\n                        </button>\r\n                        <div class=\"dropdown-menu filter-dropdown\" ngbDropdownMenu aria-labelledby=\"filterDropdown\">\r\n                            <div class=\"filter-dropdown-header\">\r\n                                <h6 class=\"filter-title\">Filter by Status</h6>\r\n                                <button \r\n                                    *ngIf=\"hasActiveFilters()\" \r\n                                    class=\"clear-filters-btn\" \r\n                                    (click)=\"clearFilters()\">\r\n                                    Clear\r\n                                </button>\r\n                            </div>\r\n                            <div class=\"filter-dropdown-body\">\r\n                                <div \r\n                                    *ngFor=\"let option of statusOptions\" \r\n                                    class=\"filter-option\">\r\n                                    <input \r\n                                        class=\"form-check-input\" \r\n                                        type=\"checkbox\" \r\n                                        [id]=\"'statusFilter' + option.value\"\r\n                                        [checked]=\"isStatusFilterSelected(option.value)\"\r\n                                        [disabled]=\"(isApproved() || isScheduledApprove()) && !editMode\"\r\n                                        (change)=\"onStatusFilterChange(option.value, $event)\">\r\n                                    <label \r\n                                        [for]=\"'statusFilter' + option.value\" \r\n                                        class=\"filter-option-label\">\r\n                                        {{ option.label }}\r\n                                    </label>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n\r\n                <!-- Store List Container (Scrollable) -->\r\n                <div class=\"list-container\">\r\n                    <!-- Store List -->\r\n                    <div class=\"store-list\">\r\n                        <div \r\n                            *ngFor=\"let store of filteredStores; let i = index\" \r\n                            class=\"store-item\"\r\n                            [class.selected]=\"selectedStore?.storeName === store.storeName\"\r\n                            (click)=\"onStoreSelect(store)\">\r\n                            <div class=\"store-item-content\" [class.disabled-content]=\"hasNoMatch(store) || ((isApproved() || isScheduledApprove()) && !editMode)\">\r\n                                <input \r\n                                    class=\"form-check-input\" \r\n                                    type=\"checkbox\" \r\n                                    [id]=\"'store' + i\"\r\n                                    [checked]=\"store.isApproved === true\"\r\n                                    [disabled]=\"hasNoMatch(store) || ((isApproved() || isScheduledApprove()) && !editMode)\"\r\n                                    (click)=\"$event.stopPropagation()\"\r\n                                    (change)=\"onStoreCheckboxChange(store, $any($event.target).checked)\">\r\n                                <label \r\n                                    class=\"store-item-text\" \r\n                                    [for]=\"'store' + i\"\r\n                                    [class.disabled]=\"hasNoMatch(store) || ((isApproved() || isScheduledApprove()) && !editMode)\"\r\n                                    (click)=\"(hasNoMatch(store) || ((isApproved() || isScheduledApprove()) && !editMode)) && $event.stopPropagation()\">\r\n                                    {{ store.storeName }}\r\n                                </label>\r\n                            </div>\r\n                            <span *ngIf=\"hasNoMatch(store)\" class=\"badge-error\">Didn't match</span>\r\n                            <span *ngIf=\"isApprovedChip(store)\" class=\"badge-approved\">Approved</span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Right Side: Canvas Area -->\r\n        <div class=\"col-9 canvas-area-container\">\r\n            <div class=\"canvas-wrapper\">\r\n                <!-- Header Section with Store Slider and Approve Button -->\r\n                <div class=\"canvas-header\" *ngIf=\"selectedStore && !canvasLoading\">\r\n                    <!-- Store Slider Navigation -->\r\n                    <div class=\"store-slider\">\r\n                    <div (click)=\"previousNext('previous')\" class=\"arrow\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                            <path\r\n                                d=\"M14.3942 6.33329L8.72756 12L14.3942 17.6666\"\r\n                                stroke=\"#344054\"\r\n                                stroke-width=\"1.88889\"\r\n                                stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                    <div\r\n                        class=\"storename\"\r\n                        [routerLink]=\"['/manage/stores/plano']\"\r\n                        [queryParams]=\"{ storeId: selectedStore.storeId }\"\r\n                    >\r\n                        <span class=\"txt me-3\">{{ selectedStore.storeName }} - Plano</span>\r\n                        <svg\r\n                            style=\"cursor: pointer\"\r\n                            xmlns=\"http://www.w3.org/2000/svg\"\r\n                            width=\"24\"\r\n                            height=\"24\"\r\n                            viewBox=\"0 0 24 24\"\r\n                            fill=\"none\"\r\n                        >\r\n                            <path\r\n                                d=\"M17.6261 12.9688V18.7819C17.6261 19.2958 17.422 19.7886 17.0586 20.152C16.6952 20.5154 16.2023 20.7195 15.6884 20.7195H5.03119C4.51728 20.7195 4.02443 20.5154 3.66104 20.152C3.29765 19.7886 3.09351 19.2958 3.09351 18.7819V8.1246C3.09351 7.6107 3.29765 7.11784 3.66104 6.75445C4.02443 6.39107 4.51728 6.18692 5.03119 6.18692H10.8442M14.7196 3.2804H20.5326M20.5326 3.2804V9.09344M20.5326 3.2804L9.87539 13.9376\"\r\n                                stroke=\"#008EDF\"\r\n                                stroke-width=\"1.93768\"\r\n                                stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                    <div (click)=\"previousNext('next')\" class=\"arrow\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"23\" height=\"24\" viewBox=\"0 0 23 24\" fill=\"none\">\r\n                            <path\r\n                                d=\"M8.6059 17.6667L14.2726 12L8.6059 6.33337\"\r\n                                stroke=\"#344054\"\r\n                                stroke-width=\"1.88889\"\r\n                                stroke-linecap=\"round\"\r\n                                stroke-linejoin=\"round\"\r\n                            />\r\n                        </svg>\r\n                    </div>\r\n                    </div>\r\n                    <!-- Approve And Complete Button -->\r\n                    <button class=\"approve-complete-btn\" (click)=\"onApproveAndComplete()\" [disabled]=\"approveLoading || (isApproved() && !editMode) || (isScheduledApprove() && !editMode) || !hasAnyStoreSelected()\">\r\n                        {{ approveLoading ? 'Processing...' : (isScheduledApprove() && !editMode ? 'Scheduled' : (isApproved() && !editMode ? 'Approved' : 'Approve & Complete')) }}\r\n                    </button>\r\n                </div>\r\n\r\n                <!-- Canvas Container -->\r\n                <div class=\"canvas-container\" #previewCanvasContainer *ngIf=\"selectedStore\">\r\n                    <!-- Loading State - Centered on Canvas -->\r\n                    <div class=\"canvas-loading\" *ngIf=\"canvasLoading\">\r\n                        <div class=\"spinner-border text-primary\" role=\"status\">\r\n                            <span class=\"visually-hidden\">Loading...</span>\r\n                        </div>\r\n                    </div>\r\n                    <canvas #previewCanvas></canvas>\r\n                </div>\r\n\r\n                <!-- Empty State -->\r\n                <div class=\"empty-state\" *ngIf=\"!selectedStore\">\r\n                    <p>Select a store to view its planogram</p>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>\r\n","import {\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  Input,\r\n  Output,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\n\r\n@Component({\r\n  selector: \"file-upload\",\r\n  standalone: true,\r\n  templateUrl: \"./file-upload.component.html\",\r\n  styleUrls: [\"./file-upload.component.scss\"],\r\n})\r\nexport class FileUploadComponent {\r\n  @ViewChild(\"fileInput\") fileInput!: ElementRef<HTMLInputElement>;\r\n\r\n  @Input() disabled = false;\r\n  @Output() fileChange = new EventEmitter<File | null>();\r\n\r\n  file: File | null = null;\r\n  isDragOver = false;\r\n\r\n  constructor(private toastService: ToastService) {}\r\n\r\n  onDragOver(event: DragEvent) {\r\n    if (this.disabled) return;\r\n    event.preventDefault();\r\n    this.isDragOver = true;\r\n  }\r\n\r\n  onDragLeave() {\r\n    if (this.disabled) return;\r\n    this.isDragOver = false;\r\n  }\r\n\r\n  onDrop(event: DragEvent) {\r\n    if (this.disabled) return;\r\n\r\n    event.preventDefault();\r\n    this.isDragOver = false;\r\n\r\n    const file = event.dataTransfer?.files?.[0];\r\n    if (file) this.validateAndSetFile(file);\r\n  }\r\n\r\n  onFileSelect(event: Event) {\r\n    if (this.disabled) return;\r\n\r\n    const input = event.target as HTMLInputElement;\r\n    const file = input.files?.[0];\r\n    if (file) this.validateAndSetFile(file);\r\n  }\r\n\r\n  triggerFileSelect() {\r\n    if (this.disabled) return;\r\n    this.fileInput.nativeElement.click();\r\n  }\r\n\r\n  private validateAndSetFile(file: File) {\r\n    if (!file.name.toLowerCase().endsWith(\".dxf\")) {\r\n      this.toastService.getErrorToast(\"Only .DXF files are supported\");\r\n      return;\r\n    }\r\n\r\n    this.file = file;\r\n    this.fileChange.emit(file);\r\n  }\r\n\r\n  removeFile() {\r\n    if (this.disabled || !this.file) return;\r\n\r\n    this.file = null;\r\n    this.fileInput.nativeElement.value = \"\";\r\n    this.fileChange.emit(null);\r\n  }\r\n}\r\n","<div class=\"upload-box\" [class.drag-over]=\"isDragOver\" [class.disabled]=\"disabled\" (dragover)=\"onDragOver($event)\"\r\n    (dragleave)=\"onDragLeave()\" (drop)=\"onDrop($event)\">\r\n    <input #fileInput type=\"file\" accept=\".dxf\" hidden [disabled]=\"disabled\" (change)=\"onFileSelect($event)\" />\r\n\r\n    @if (file) {\r\n        <div class=\"file-chip\">\r\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n                <rect width=\"24\" height=\"24\" fill=\"url(#pattern0_767_7382)\" />\r\n                <defs>\r\n                    <pattern id=\"pattern0_767_7382\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\r\n                        <use xlink:href=\"#image0_767_7382\" transform=\"scale(0.00195312)\" />\r\n                    </pattern>\r\n                    <image id=\"image0_767_7382\" width=\"512\" height=\"512\" preserveAspectRatio=\"none\"\r\n                        xlink:href=\"data:image/png;base64,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\" />\r\n                </defs>\r\n            </svg>\r\n\r\n            <span class=\"name\">{{ file.name }}</span>\r\n\r\n            <svg class=\"remove\" (click)=\"removeFile()\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n                xmlns=\"http://www.w3.org/2000/svg\">\r\n                <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                    stroke-linejoin=\"round\" />\r\n            </svg>\r\n\r\n\r\n        </div>\r\n    }\r\n\r\n    @else {\r\n        <div class=\"empty-state\" (click)=\"triggerFileSelect()\">\r\n            <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n                <path\r\n                    d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n                    fill=\"#D0D5DD\" />\r\n                <path\r\n                    d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n                    stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                <path\r\n                    d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n                    fill=\"#33B5FF\" />\r\n            </svg>\r\n\r\n            <p>\r\n                <span class=\"link\">Upload</span> or Drag and drop CAD\r\n            </p>\r\n            <small>Supports only .DXF</small>\r\n        </div>\r\n    }\r\n</div>","import {\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\nimport { NgbActiveModal, NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  AbstractControl,\r\n  FormBuilder,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n  ValidatorFn,\r\n  Validators,\r\n} from \"@angular/forms\";\r\nimport { NgClass, NgIf, TitleCasePipe, UpperCasePipe } from \"@angular/common\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { Loader } from \"@googlemaps/js-api-loader\";\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { NgxGpAutocompleteModule } from \"@angular-magic/ngx-gp-autocomplete\";\r\nimport { ReactiveSelectComponent } from \"../../reactive-select/reactive-select.component\";\r\nimport { FileUploadComponent } from \"../../file-upload/file-upload.component\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport {\r\n  generalValidator,\r\n  getNameFromEmail,\r\n  indianPincodeValidator,\r\n} from \"../../../functions/plano.function\";\r\nimport lottie, { AnimationItem } from \"lottie-web\";\r\n\r\n@Component({\r\n  selector: \"app-create-planogram\",\r\n  templateUrl: \"./create-planogram.component.html\",\r\n  styleUrl: \"./create-planogram.component.scss\",\r\n  standalone: true,\r\n  imports: [\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    ReactiveSelectComponent,\r\n    FileUploadComponent,\r\n    NgIf,\r\n    NgxGpAutocompleteModule,\r\n    NgbTooltip,\r\n    UpperCasePipe,\r\n    TitleCasePipe,\r\n    NgClass,\r\n  ],\r\n  providers: [\r\n    {\r\n      provide: Loader,\r\n      useFactory: (gs: GlobalStateService) => {\r\n        const env = gs.environment.value;\r\n        return new Loader({\r\n          apiKey: env?.mapKeyUrl || 'AIzaSyAqFbyZeSyDBaDkGaPpfcLO-nEgraAAfWw',\r\n          libraries: ['places'],\r\n        });\r\n      },\r\n      deps: [GlobalStateService],\r\n    },\r\n  ],\r\n})\r\nexport class CreatePlanogramComponent implements OnInit, OnDestroy {\r\n  @Input() clientId: string;\r\n  @ViewChild(\"cadProcessingLottie\")\r\n  cadProcessingLottieRef?: ElementRef<HTMLDivElement>;\r\n\r\n  selectedStore: string;\r\n  selectedFloor: number;\r\n  selectedFile: File | null = null;\r\n\r\n  storeList: {\r\n    label: string;\r\n    value: string;\r\n  }[] = [];\r\n\r\n  floorList: {\r\n    label: string;\r\n    value: number;\r\n  }[] = [\r\n    { label: \"Floor 1\", value: 1 },\r\n    { label: \"Floor 2\", value: 2 },\r\n    { label: \"Floor 3\", value: 3 },\r\n  ];\r\n\r\n  selectedStoreFloors: any = [];\r\n\r\n  isLayoutExist: boolean = false;\r\n  isButtonLoading: boolean = false;\r\n  isPopupLoading: boolean = false;\r\n  isCadProcessing: boolean = false;\r\n  isCreateStoreMode: boolean = false;\r\n  newStoreDetails: any;\r\n  private cadProcessingAnimation?: AnimationItem;\r\n\r\n  createStoreForm: any;\r\n  storeTypeList: {\r\n    label: string;\r\n    value: string;\r\n  }[] = [\r\n    { label: \"High Street\", value: \"High Street\" },\r\n    { label: \"Mall Store\", value: \"Mall Store\" },\r\n    { label: \"Kiosk\", value: \"Kiosk\" },\r\n  ];\r\n\r\n  businessTypeList: {\r\n    label: string;\r\n    value: string;\r\n  }[] = [\r\n    { label: \"COCO\", value: \"COCO\" },\r\n    { label: \"COFO\", value: \"COFO\" },\r\n    { label: \"FOFO\", value: \"FOFO\" },\r\n    { label: \"FOCO\", value: \"FOCO\" },\r\n  ];\r\n\r\n  isManual: boolean = false;\r\n\r\n  constructor(\r\n    private activeModal: NgbActiveModal,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private toastService: ToastService,\r\n    private fb: FormBuilder,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    await this.getStoreList();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroyCadProcessingAnimation();\r\n  }\r\n\r\n  get isValidToCreatePlano() {\r\n    const hasStoreSelection = !!this.selectedStore || !!this.newStoreDetails;\r\n    const floorNumber = this.selectedFloor || this.newStoreDetails?.floor;\r\n\r\n    return (\r\n      hasStoreSelection && floorNumber && (this.selectedFile || this.isManual)\r\n    );\r\n  }\r\n\r\n  get isModalBusy() {\r\n    return this.isPopupLoading || this.isButtonLoading || this.isCadProcessing;\r\n  }\r\n\r\n  async getStoreList() {\r\n    this.isPopupLoading = true;\r\n    try {\r\n      const stores: any = await firstValueFrom(\r\n        this.storeBuilderService.getAllStores(this.clientId),\r\n      );\r\n      this.storeList = stores?.data?.map((s: any) => {\r\n        return { label: s.storeName, value: s.storeId };\r\n      });\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getStoreList [ERR]:\", error);\r\n    } finally {\r\n      this.isPopupLoading = false;\r\n    }\r\n  }\r\n\r\n  async onStoreChange() {\r\n    if (this.isModalBusy || !this.selectedStore) return;\r\n\r\n    try {\r\n      const floors: any = await firstValueFrom(\r\n        this.storeBuilderService.getStoreFloorsList(this.selectedStore),\r\n      );\r\n      this.selectedStoreFloors = floors?.data ?? [];\r\n      this.onFloorChange();\r\n    } catch (error) {\r\n      console.log(\"@@ ~ getStoreList [ERR]:\", error);\r\n    }\r\n  }\r\n\r\n  onFloorChange() {\r\n    if (this.isModalBusy) return;\r\n\r\n    if (this.selectedFloor) {\r\n      this.isLayoutExist = this.selectedStoreFloors.some(\r\n        (f: any) => f.floorNumber === this.selectedFloor,\r\n      );\r\n    } else {\r\n      this.isLayoutExist = false;\r\n    }\r\n  }\r\n\r\n  onFileChange(file: File | null) {\r\n    if (this.isModalBusy) return;\r\n    this.selectedFile = file;\r\n  }\r\n\r\n  async onCreateLayoutPlano() {\r\n    if (this.isModalBusy) return;\r\n    if (!this.isValidToCreatePlano) return;\r\n\r\n    const hasCadFile = !!this.selectedFile;\r\n    let shouldResetNewStoreSummary = false;\r\n\r\n    try {\r\n      this.isButtonLoading = true;\r\n      if (hasCadFile) {\r\n        this.showCadProcessingLoader();\r\n      }\r\n\r\n      const storeContext = await this.ensureStoreForPlanoCreation();\r\n      if (!storeContext) return;\r\n\r\n      let planoRes: any;\r\n      if (this.selectedFile) {\r\n        planoRes = await firstValueFrom(\r\n          this.storeBuilderService.createPlanoFromCAD(\r\n            this.selectedFile!,\r\n            storeContext.storeId,\r\n            storeContext.storeName ?? storeContext.storeId,\r\n            storeContext.floorNumber,\r\n          ),\r\n        );\r\n      } else {\r\n        planoRes = await firstValueFrom(\r\n          this.storeBuilderService.createEmptyPlano({\r\n            clientId: this.clientId,\r\n            storeId: storeContext.storeId,\r\n            floorNumber: storeContext.floorNumber,\r\n          }),\r\n        );\r\n      }\r\n\r\n      if (!planoRes?.data) return;\r\n      this.activeModal.close(planoRes?.data);\r\n    } catch (error: any) {\r\n      shouldResetNewStoreSummary =\r\n        !!this.newStoreDetails?.storeId &&\r\n        !!this.newStoreDetails?.infraTicketCreated;\r\n      this.toastService.getErrorToast(this.getPlanoCreationErrorMessage(error));\r\n      console.log(\"@@ ~ onCreate [ERR]:\", error);\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n      if (hasCadFile) {\r\n        this.hideCadProcessingLoader();\r\n      }\r\n      if (shouldResetNewStoreSummary) {\r\n        this.newStoreDetails = null;\r\n        this.selectedStoreFloors = [];\r\n        this.isLayoutExist = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  private showCadProcessingLoader() {\r\n    this.isCadProcessing = true;\r\n    setTimeout(() => this.loadCadProcessingAnimation(), 0);\r\n  }\r\n\r\n  private hideCadProcessingLoader() {\r\n    this.isCadProcessing = false;\r\n    this.destroyCadProcessingAnimation();\r\n  }\r\n\r\n  private getPlanoCreationErrorMessage(error: any): string {\r\n    const cadErrors =\r\n      error?.error?.error?.errInfo?.cadData?.errors ??\r\n      error?.error?.error?.errorInfo?.cadData?.errors;\r\n\r\n    if (Array.isArray(cadErrors) && cadErrors.length) {\r\n      const formattedCadErrors = cadErrors\r\n        .filter(\r\n          (cadError: unknown) =>\r\n            typeof cadError === \"string\" && cadError.trim().length > 0,\r\n        )\r\n        .join(\" | \");\r\n\r\n      if (formattedCadErrors) {\r\n        return formattedCadErrors;\r\n      }\r\n    }\r\n\r\n    return (\r\n      error?.error?.error?.errMsg ??\r\n      error?.error?.message ??\r\n      error?.message ??\r\n      \"Failed to extract plano from CAD file.\"\r\n    );\r\n  }\r\n\r\n  private loadCadProcessingAnimation() {\r\n    const container = this.cadProcessingLottieRef?.nativeElement;\r\n    if (!container) return;\r\n\r\n    this.destroyCadProcessingAnimation();\r\n    this.cadProcessingAnimation = lottie.loadAnimation({\r\n      container,\r\n      renderer: \"svg\",\r\n      loop: true,\r\n      autoplay: true,\r\n      path: \"assets/animations/string_loading.json\",\r\n    });\r\n  }\r\n\r\n  private destroyCadProcessingAnimation() {\r\n    this.cadProcessingAnimation?.destroy();\r\n    this.cadProcessingAnimation = undefined;\r\n  }\r\n\r\n  async onCreateStore() {\r\n    if (this.isModalBusy) return;\r\n\r\n    try {\r\n      this.isButtonLoading = true;\r\n      const spocUser = await this.getSpocUserDetails(\r\n        this.createStoreForm.value.storeName.trim(),\r\n      );\r\n\r\n      if (!spocUser) return;\r\n\r\n      this.selectedStore = \"\";\r\n      this.selectedFloor = this.createStoreForm.get(\"floor\")?.value ?? 1;\r\n      this.selectedStoreFloors = [];\r\n      this.isLayoutExist = false;\r\n      this.newStoreDetails = this.buildPendingStoreDetails(spocUser);\r\n      this.isCreateStoreMode = false;\r\n    } catch (error: any) {\r\n      this.toastService.getErrorToast(\"Failed to prepare store details\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  private buildPendingStoreDetails(spocUser: any) {\r\n    const createStorePayload = {\r\n      storeName: this.createStoreForm.value.storeName?.toUpperCase()?.trim(),\r\n      clientId: this.clientId,\r\n      businessType: this.createStoreForm.value.businessType,\r\n      cluster: [],\r\n      storeType: {\r\n        type: this.createStoreForm.value.storeType,\r\n        name: this.createStoreForm.value?.storeTypeName?.trim(),\r\n      },\r\n      storeProfile: {\r\n        storeCode: this.createStoreForm?.value?.storeCode,\r\n        address: this.createStoreForm.value?.address,\r\n        country: this.toTitleCaseLocation(this.createStoreForm.value?.country),\r\n        state: this.toTitleCaseLocation(this.createStoreForm.value?.state),\r\n        city: this.toTitleCaseLocation(this.createStoreForm.value?.city),\r\n        pincode: this.createStoreForm.value?.pincode,\r\n        latitude: this.createStoreForm.value.latitude?.toString().trim()\r\n          ? this.createStoreForm.value.latitude\r\n          : 0,\r\n        longitude: this.createStoreForm.value.longitude?.toString().trim()\r\n          ? this.createStoreForm.value.longitude\r\n          : 0,\r\n        timeZone: \"Asia/Kolkata\",\r\n        open: \"10:00:00\",\r\n        close: \"20:00:00\",\r\n      },\r\n      edge: {\r\n        serverType: false,\r\n      },\r\n      spocDetails: [spocUser],\r\n    };\r\n\r\n    return {\r\n      ...createStorePayload,\r\n      createStorePayload,\r\n      floor: this.createStoreForm.get(\"floor\")?.value ?? 1,\r\n      storeId: null,\r\n      infraTicketCreated: false,\r\n    };\r\n  }\r\n\r\n  private toTitleCaseLocation(value: string | null | undefined): string {\r\n    if (!value) return \"\";\r\n\r\n    return value\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(\r\n        /(^|[\\s'-])([a-z])/g,\r\n        (_, separator: string, character: string) => {\r\n          return `${separator}${character.toUpperCase()}`;\r\n        },\r\n      );\r\n  }\r\n\r\n  private async ensureStoreForPlanoCreation() {\r\n    const floorNumber = this.selectedFloor || this.newStoreDetails?.floor;\r\n\r\n    if (!this.newStoreDetails) {\r\n      if (!this.selectedStore || !floorNumber) return null;\r\n\r\n      const storeName = this.storeList.find(\r\n        (s) => s.value === this.selectedStore,\r\n      )?.label;\r\n\r\n      return {\r\n        storeId: this.selectedStore,\r\n        storeName: storeName ?? this.selectedStore,\r\n        floorNumber,\r\n      };\r\n    }\r\n\r\n    try {\r\n      if (!this.newStoreDetails.storeId) {\r\n        const res: any = await firstValueFrom(\r\n          this.storeBuilderService.createStore(\r\n            this.newStoreDetails.createStorePayload,\r\n          ),\r\n        );\r\n\r\n        const newStore = res?.data?.store;\r\n\r\n        if (!newStore?.storeId) {\r\n          this.toastService.getErrorToast(\"Unable to create store\");\r\n          return null;\r\n        }\r\n\r\n        this.newStoreDetails.storeId = newStore.storeId;\r\n        this.newStoreDetails.storeName = newStore.storeName;\r\n        this.selectedStore = newStore.storeId;\r\n        this.selectedFloor = floorNumber;\r\n        this.selectedStoreFloors = [];\r\n        this.isLayoutExist = false;\r\n      }\r\n\r\n      if (!this.newStoreDetails.infraTicketCreated) {\r\n        await firstValueFrom(\r\n          this.storeBuilderService.createInfraTicket({\r\n            storeId: this.newStoreDetails.storeId,\r\n            Date: new Date().toISOString().split(\"T\")[0],\r\n            issueType: \"installation\",\r\n          }),\r\n        );\r\n        this.newStoreDetails.infraTicketCreated = true;\r\n      }\r\n\r\n      const storeContext = {\r\n        storeId: this.newStoreDetails.storeId,\r\n        storeName: this.newStoreDetails.storeName,\r\n        floorNumber,\r\n      };\r\n\r\n      if (\r\n        this.newStoreDetails.storeId &&\r\n        this.newStoreDetails.infraTicketCreated\r\n      ) {\r\n        if (\r\n          !this.storeList.some(\r\n            (store) => store.value === this.newStoreDetails.storeId,\r\n          )\r\n        ) {\r\n          this.storeList.push({\r\n            label: this.newStoreDetails.storeName,\r\n            value: this.newStoreDetails.storeId,\r\n          });\r\n        }\r\n      }\r\n\r\n      return storeContext;\r\n    } catch (error: any) {\r\n      console.log(\"@@ ~ error:\", error);\r\n\r\n      if (error?.error?.error?.error === \"The store name already exists\") {\r\n        this.toastService.getErrorToast(\r\n          \"This store name already exists in 'Deactivate' state\",\r\n        );\r\n      } else {\r\n        this.toastService.getErrorToast(\"Failed to create store\");\r\n      }\r\n      return null;\r\n    }\r\n  }\r\n\r\n  async getSpocUserDetails(storeName: string) {\r\n    const safeStoreName = storeName\r\n      ?.toLowerCase()\r\n      .trim()\r\n      .replace(/\\s+/g, \"_\")\r\n      .replace(/[^a-z0-9._-]/g, \"\");\r\n\r\n    const userEmail = this.createStoreForm.get(\"email\")?.value?.toLowerCase();\r\n    const email = userEmail || `${safeStoreName}_planogram@lenskart.com`;\r\n\r\n    try {\r\n      const result = await firstValueFrom(\r\n        this.storeBuilderService.spocEmailCheck({\r\n          clientId: this.clientId,\r\n          email: [email],\r\n        }),\r\n      );\r\n      if (result) {\r\n        return {\r\n          name: userEmail\r\n            ? getNameFromEmail(email)\r\n            : storeName.toUpperCase().trim(),\r\n          email: email,\r\n          contact: \"9999999999\",\r\n        };\r\n      }\r\n      return null;\r\n    } catch (error: any) {\r\n      console.log(\"@@ ~ getSpocUserDetails [ERR]: \", error);\r\n      this.toastService.getErrorToast(\r\n        error?.error?.error ?? \"Unable to create User\",\r\n      );\r\n      return null;\r\n    }\r\n  }\r\n\r\n  addNewStore() {\r\n    if (this.isModalBusy) return;\r\n\r\n    this.createStoreForm = this.fb.group({\r\n      storeName: [\r\n        \"\",\r\n        [\r\n          Validators.required,\r\n          this.storeNameValidator(),\r\n          this.storeNameExistsValidator(),\r\n          generalValidator(),\r\n        ],\r\n      ],\r\n      email: [\"\", Validators.email],\r\n      floor: [1],\r\n      businessType: [\"\", Validators.required],\r\n      storeType: [\"\", Validators.required],\r\n      storeTypeName: [\"\", generalValidator()],\r\n      address: [\"\", Validators.required],\r\n      country: [\"\", Validators.required],\r\n      state: [\"\", Validators.required],\r\n      city: [\"\", Validators.required],\r\n      pincode: [\r\n        \"\",\r\n        [\r\n          Validators.required,\r\n          //  indianPincodeValidator()\r\n        ],\r\n      ],\r\n      latitude: [\"\"],\r\n      longitude: [\"\"],\r\n    });\r\n\r\n    this.isCreateStoreMode = true;\r\n\r\n    this.createStoreForm\r\n      .get(\"storeType\")\r\n      ?.valueChanges.subscribe((value: any) => {\r\n        if (value !== \"Mall Store\") {\r\n          this.createStoreForm.get(\"storeTypeName\")?.reset();\r\n        }\r\n      });\r\n\r\n    this.createStoreForm\r\n      .get(\"storeName\")\r\n      ?.valueChanges.subscribe((value: any) => {\r\n        if (value) {\r\n          const upper = value.toUpperCase();\r\n          if (value !== upper) {\r\n            this.createStoreForm\r\n              .get(\"storeName\")\r\n              ?.setValue(upper, { emitEvent: false });\r\n          }\r\n        }\r\n      });\r\n\r\n    // const urlTree = this.router.createUrlTree([\"/manage/stores/add-single-store\"]);\r\n    // const url = this.router.serializeUrl(urlTree);\r\n    // window.open(url, \"_blank\");\r\n  }\r\n\r\n  storeNameExistsValidator = (): ValidatorFn => {\r\n    return (control: AbstractControl) => {\r\n      const value = control.value;\r\n      if (!value) return null; // allow required validator to handle empty\r\n\r\n      const trimmed = value.trim().toLocaleLowerCase();\r\n\r\n      const s = this.storeList.find(\r\n        (s) => s?.label?.trim()?.toLocaleLowerCase() === trimmed,\r\n      );\r\n      if (s) return { exists: true };\r\n\r\n      return null;\r\n    };\r\n  };\r\n\r\n  storeNameValidator(): ValidatorFn {\r\n    return (control: AbstractControl) => {\r\n      if (!control.value) return null;\r\n\r\n      const value = control.value.toUpperCase();\r\n\r\n      const stPattern = /^ST\\d{4}$/; // ST1234\r\n      const lkstPattern = /^LKST\\d{4}$/; // LKST1234\r\n\r\n      const isValid = stPattern.test(value) || lkstPattern.test(value);\r\n\r\n      return isValid ? null : { invalidStoreName: true };\r\n    };\r\n  }\r\n\r\n  onAddressChange(place: google.maps.places.PlaceResult | any) {\r\n    if (this.isModalBusy || !this.createStoreForm || !place?.geometry) return;\r\n\r\n    let country = \"\",\r\n      city = \"\",\r\n      state = \"\",\r\n      pincode = \"\";\r\n\r\n    let latitude = place.geometry.location.lat();\r\n    let longitude = place.geometry.location.lng();\r\n\r\n    place.address_components.forEach((component: any) => {\r\n      if (component.types.includes(\"country\")) {\r\n        country = component.long_name;\r\n      } else if (component.types.includes(\"locality\")) {\r\n        city = component.long_name;\r\n      } else if (component.types.includes(\"administrative_area_level_1\")) {\r\n        state = component.long_name;\r\n      } else if (component.types.includes(\"postal_code\")) {\r\n        pincode = component.long_name;\r\n      }\r\n    });\r\n\r\n    this.createStoreForm.get(\"address\")?.setValue(place.formatted_address);\r\n    this.createStoreForm\r\n      .get(\"country\")\r\n      ?.setValue(this.toTitleCaseLocation(country));\r\n    this.createStoreForm.get(\"city\")?.setValue(\r\n      this.toTitleCaseLocation(city),\r\n    );\r\n    this.createStoreForm.get(\"state\")?.setValue(\r\n      this.toTitleCaseLocation(state),\r\n    );\r\n    this.createStoreForm.get(\"pincode\")?.setValue(pincode);\r\n    this.createStoreForm.get(\"latitude\")?.setValue(latitude);\r\n    this.createStoreForm.get(\"longitude\")?.setValue(longitude);\r\n  }\r\n\r\n  onCancel() {\r\n    if (this.isModalBusy) return;\r\n    this.activeModal.dismiss();\r\n  }\r\n\r\n  onBack() {\r\n    if (this.isModalBusy) return;\r\n\r\n    if (!this.isCreateStoreMode && this.newStoreDetails) {\r\n      this.isCreateStoreMode = true;\r\n      return;\r\n    }\r\n\r\n    this.isCreateStoreMode = false;\r\n    this.newStoreDetails = null;\r\n  }\r\n}\r\n","<div class=\"modal-wrapper\">\r\n  <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n    <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n      <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n    </svg>\r\n  </div>\r\n\r\n  <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n  @if(isCreateStoreMode){\r\n    <div class=\"d-flex algn-items-center gap-2\">\r\n      <p>Step 1: Onboard store with basic details</p>\r\n      <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n        ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n        <path\r\n          d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n          stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n    </div>\r\n  }\r\n\r\n\r\n  @if(isCreateStoreMode){\r\n    <form [formGroup]=\"createStoreForm\">\r\n      <div class=\"row mb-4\">\r\n        <div class=\"col-6 mb-4\">\r\n          <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n            placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\r\n\r\n          <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n            @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n              <small class=\"text-danger\">\r\n                Store already exists.\r\n              </small>\r\n            }@else {\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n                Store name is required.\r\n              </small>\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n                Store name cannot be only whitespace.\r\n              </small>\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n                No leading or trailing whitespace allowed.\r\n              </small>\r\n\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n                Store name must be ST1234 or LKST1234 format.\r\n              </small>\r\n            }\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n            formControlName=\"floor\" [disabled]=\"isModalBusy\">\r\n          </lib-reactive-select>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n            [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\r\n          </lib-reactive-select>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n            [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\r\n          </lib-reactive-select>\r\n        </div>\r\n\r\n        @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\r\n          <div class=\"col-12 mb-4\">\r\n            <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n            <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n              placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\r\n            <ng-container\r\n              *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n                Mall name cannot be only whitespace.\r\n              </small>\r\n              <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n                No leading or trailing whitespace allowed.\r\n              </small>\r\n            </ng-container>\r\n          </div>\r\n        }\r\n\r\n        <div class=\"col-12 mb-4\">\r\n          <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n            placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\r\n            [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n              Address is required.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\r\n            [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n              Country is required.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\r\n            [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n              State is required.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\r\n            [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n              City / Town is required.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-6 mb-4\">\r\n          <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n            placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n              Pin / Zip Code is required.\r\n            </small>\r\n            <small class=\"text-danger\"\r\n              *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n              Pincode cannot contain whitespace.\r\n            </small>\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n              Enter a valid 6-digit pincode\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n        <div class=\"col-12 mb-4\">\r\n          <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\r\n          <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n            placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\r\n          <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n            <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n              Email is invalid.\r\n            </small>\r\n          </ng-container>\r\n        </div>\r\n\r\n      </div>\r\n    </form>\r\n  }\r\n  @else {\r\n    @if(newStoreDetails){\r\n      <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n      <div class=\"row mb-6\">\r\n        <div class=\"col\">\r\n          <p class=\"mb-2\">Store name</p>\r\n          <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n        </div>\r\n        <div class=\"col\">\r\n          <p class=\"mb-2\">Floor</p>\r\n          <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n        </div>\r\n        <div class=\"col\">\r\n          <p class=\"mb-2\">Business type</p>\r\n          <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n        </div>\r\n        <div class=\"col\">\r\n          <p class=\"mb-2\">Store type</p>\r\n          <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n        </div>\r\n      </div>\r\n    }@else {\r\n      <div class=\"row mb-4\">\r\n        <div class=\"col-6\">\r\n          <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n            [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n            [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\r\n          </lib-reactive-select>\r\n        </div>\r\n        <div class=\"col-6\">\r\n          <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n            [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\r\n          </lib-reactive-select>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n        <div class=\"layout-exist-warning mb-4\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n              stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n\r\n          This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can’t be undone.\r\n        </div>\r\n      </div>\r\n    }\r\n    <div class=\"mb-4\">\r\n      @if (isCadProcessing) {\r\n        <div class=\"cad-loader-panel\">\r\n          <!--\r\n          <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n          <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n          -->\r\n          <div class=\"cad-loader-content\">\r\n            <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n              <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n            </svg>\r\n            <p class=\"cad-loader-text mb-0\">\r\n              Building layout\r\n              <span class=\"loading-dots\" aria-hidden=\"true\">\r\n                <span>.</span>\r\n                <span>.</span>\r\n                <span>.</span>\r\n              </span>\r\n            </p>\r\n          </div>\r\n        </div>\r\n      } @else {\r\n        <div class=\"row\">\r\n          <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\r\n            <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n          </div>\r\n          <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\r\n            class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\r\n            <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n              <path\r\n                d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n                fill=\"#D0D5DD\" />\r\n              <path\r\n                d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n                stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              <path\r\n                d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n                fill=\"#33B5FF\" />\r\n            </svg>\r\n            <div class=\"d-flex gap-1 align-items-center\">\r\n              <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\r\n                [disabled]=\"isModalBusy\">\r\n              <label for=\"manual\">Create manually</label>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      }\r\n    </div>\r\n  }\r\n  <div class=\"modal-actions\">\r\n    @if(isCreateStoreMode){\r\n      <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\r\n        (click)=\"onCreateStore()\">\r\n        <span *ngIf=\"!isButtonLoading\">\r\n          Next\r\n        </span>\r\n        <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n          <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n        </svg>\r\n      </button>\r\n    }@else {\r\n      <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\r\n        [disabled]=\"isModalBusy\">Back</button>\r\n      <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\r\n        [disabled]=\"isModalBusy\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n\r\n        Create new store\r\n      </button>\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\r\n        (click)=\"onCreateLayoutPlano()\">\r\n        <span *ngIf=\"!isButtonLoading || isCadProcessing\">\r\n          {{isLayoutExist ?  'Overwrite' : 'Create'}}\r\n        </span>\r\n\r\n        <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n          <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n        </svg>\r\n      </button>\r\n    }\r\n  </div>\r\n</div>\r\n","import { Component, OnDestroy, OnInit, ViewChild } from \"@angular/core\";\r\nimport { Router, ActivatedRoute } from \"@angular/router\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  Subject,\r\n  Subscription,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { PlanoList } from \"../../../interfaces/planogram.interface\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { BulkUploadPlanogramComponent } from \"../popups/bulk-upload-planogram/bulk-upload-planogram.component\";\r\nimport {\r\n  getQueryParamNumber,\r\n  getQueryParamString,\r\n} from \"../../../functions/plano.function\";\r\nimport { CreatePlanogramComponent } from \"../../onboard-store-plano/create-planogram/create-planogram.component\";\r\nimport { PlanoFilterComponent } from \"../../planogram/plano-table/plano-filter/plano-filter.component\";\r\n\r\n@Component({\r\n  selector: \"lib-plano-onboard-table\",\r\n  templateUrl: \"./onboard-table.component.html\",\r\n  styleUrl: \"./onboard-table.component.scss\",\r\n})\r\nexport class PlanoOnboardTableComponent implements OnInit, OnDestroy {\r\n  @ViewChild(\"planoFilterRef\") planoFilterRef?: PlanoFilterComponent;\r\n\r\n  clientId: string;\r\n\r\n  cardInfo: any;\r\n  planogramsList: PlanoList[] = [];\r\n\r\n  selectedFilterTab: string = \"all\";\r\n\r\n  sortedColumn: string = \"\";\r\n  sortOrder: number = 1;\r\n\r\n  searchTerm: string = \"\";\r\n\r\n  limit: number = 10;\r\n  offset: number = 1;\r\n  totalItems: number = 0;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  filterObject = [\r\n    {\r\n      title: \"Status\",\r\n      type: \"multi\",\r\n      isOpened: false,\r\n      options: [\r\n        { name: \"Draft\", value: \"draft\", checked: false },\r\n        {\r\n          name: \"Allocation pending\",\r\n          value: \"allocationPending\",\r\n          checked: false,\r\n        },\r\n      ],\r\n    },\r\n  ];\r\n\r\n  appliedFilters: any = {\r\n    country: [],\r\n    city: [],\r\n    status: [],\r\n  };\r\n\r\n  isFilterApplied: boolean = false;\r\n\r\n  isPageLoading: boolean = true;\r\n  isButtonLoading: boolean = false;\r\n  isError: boolean = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private planoSub?: Subscription;\r\n\r\n  constructor(\r\n    private ngbModal: NgbModal,\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private storeBuilderService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private pageInfo: PageInfoService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$), // Subscription will be cancelled on component destroy.\r\n        debounceTime(200), // To avoid immediate frequent calls.\r\n        filter((data) => !!data), // Filtering null/undefined.\r\n        distinctUntilChanged(), // Emitting only different values. (Ignores same clientId).\r\n      )\r\n      .subscribe({\r\n        next: (data: any) => {\r\n          if (data) {\r\n            this.clientId = data.client;\r\n          } else {\r\n            let data = JSON.parse(\r\n              localStorage.getItem(\"header-filters\") as string,\r\n            );\r\n            this.clientId = data?.client;\r\n          }\r\n\r\n          this.route.queryParamMap\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe((params) => {\r\n              this.searchTerm = getQueryParamString({\r\n                params,\r\n                key: \"search\",\r\n                fallback: \"\",\r\n              });\r\n              this.isFilterApplied = this.searchTerm ? true : false;\r\n\r\n              this.selectedFilterTab = getQueryParamString({\r\n                params,\r\n                key: \"tab\",\r\n                fallback: \"all\",\r\n              });\r\n\r\n              this.appliedFilters.status = [this.selectedFilterTab];\r\n\r\n              this.limit = getQueryParamNumber({\r\n                params,\r\n                key: \"limit\",\r\n                fallback: 10,\r\n                min: 1,\r\n                max: 30,\r\n              });\r\n\r\n              this.offset = getQueryParamNumber({\r\n                params,\r\n                key: \"offset\",\r\n                fallback: 1,\r\n                min: 1,\r\n              });\r\n\r\n              this.getPlanoTableList();\r\n            });\r\n        },\r\n      });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Manage Planogram\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  getPlanoTableList() {\r\n    this.planoSub?.unsubscribe(); // Cancel previous request\r\n\r\n    this.isPageLoading = true;\r\n    this.planogramsList = [];\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.limit,\r\n      offset: this.offset,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      // export: false,\r\n      // emptyDownload: false\r\n    };\r\n\r\n    this.planoSub = this.storeBuilderService\r\n      .getOnboardPlanoList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res?.code == 200) {\r\n            this.totalItems = res?.data?.count;\r\n            this.planogramsList = res?.data?.data ?? [];\r\n            this.cardInfo = res?.data?.cardInfo?.[0] || [];\r\n            if (this.totalItems < 10) {\r\n              this.paginationSizes = [this.totalItems];\r\n            } else {\r\n              this.paginationSizes = [10, 20, 30];\r\n            }\r\n          }\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n\r\n    this.totalItems = this.planogramsList.length;\r\n  }\r\n\r\n  openBulkUploadModal() {\r\n    const modelRef = this.ngbModal.open(BulkUploadPlanogramComponent);\r\n  }\r\n\r\n  onClickCreatePlanogram() {\r\n    let modelRef: any;\r\n\r\n    modelRef = this.ngbModal.open(CreatePlanogramComponent, {\r\n      size: \"md\",\r\n      windowClass: \"create-planogram-modal\",\r\n      centered: true,\r\n      backdrop: \"static\",\r\n      beforeDismiss: () => !modelRef.componentInstance?.isModalBusy,\r\n    });\r\n\r\n    modelRef.componentInstance.clientId = this.clientId;\r\n    modelRef.result.then((result:any) => {\r\n      if (result) {\r\n        this.router.navigate([\"/manage/planogram/onboard-planogram\"], {\r\n          queryParams: { planoId: result?.planoId, floorId: result?.floorId },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  onSearch() {\r\n    this.sortedColumn = \"\";\r\n    this.sortOrder = 1;\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n\r\n    this.isFilterApplied = this.searchTerm ? true : false;\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onSortTable(column: string) {\r\n    if (this.sortedColumn === column) {\r\n      this.sortOrder = this.sortOrder === 1 ? -1 : 1;\r\n    } else {\r\n      this.sortedColumn = column;\r\n      this.sortOrder = 1;\r\n    }\r\n    this.offset = 1;\r\n    this.limit = 10;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  filterTable(data: string) {\r\n    if (this.selectedFilterTab !== data) {\r\n      this.planoFilterRef?.onResetFilter(false);\r\n      this.selectedFilterTab = data;\r\n      this.appliedFilters = {\r\n        country: [],\r\n        city: [],\r\n        status: [this.selectedFilterTab],\r\n      };\r\n      this.isFilterApplied = false;\r\n      this.offset = 1;\r\n      this.limit = 10;\r\n      this.searchTerm = \"\";\r\n      this.updateQueryParams();\r\n    }\r\n  }\r\n\r\n  applyFilters(event: any) {\r\n    event.forEach((ele: any) => {\r\n      let key = ele.title.toLowerCase();\r\n      if (key === \"store category\") {\r\n        this.appliedFilters[\"planoStrategy\"] = ele.selected;\r\n      } else {\r\n        this.appliedFilters[ele.title.toLowerCase()] = ele.selected;\r\n      }\r\n    });\r\n\r\n    this.offset = 1;\r\n    this.getPlanoTableList();\r\n  }\r\n\r\n  paginationSize(): number {\r\n    return this.totalItems < 10 ? this.totalItems : this.limit;\r\n  }\r\n\r\n  onPageChange(pageOffset: number) {\r\n    this.offset = Number(pageOffset);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  onPageSizeChange(pageSize: number) {\r\n    this.offset = 1;\r\n    this.limit = Number(pageSize);\r\n    this.updateQueryParams();\r\n  }\r\n\r\n  planoFloorDetails(data: any) {\r\n    if (data.layoutDetails.length > 1) {\r\n      let completeCount = data?.taskDetails?.completeLayout || 0;\r\n      return completeCount + \"/\" + data.layoutDetails.length;\r\n    } else {\r\n      return 1;\r\n    }\r\n  }\r\n\r\n  // getTaskStatus(data: any, type: string) {\r\n  //   const statusMap: any = {\r\n  //     layout: data.taskDetails?.layoutStatus,\r\n  //     fixture: data.taskDetails?.fixtureStatus,\r\n  //     vm: data.taskDetails?.fixtureStatus,\r\n  //   };\r\n  //   if (type == \"vm\") {\r\n  //     type = \"fixture\";\r\n  //   }\r\n  //   const status = statusMap[type];\r\n\r\n  //   const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n  //     (ele: any) => ele.type == type,\r\n  //   );\r\n\r\n  //   if (type == \"fixture\") {\r\n  //     let taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n  //       (ele: any) => ele.status && ele.type == \"fixture\",\r\n  //     );\r\n  //     if (\r\n  //       status === \"pending\" &&\r\n  //       taskInfo?.some((task: any) => task.status == \"submit\")\r\n  //     )\r\n  //       return \"reviewPending\";\r\n  //     if (taskInfo?.length != data.layoutCount) {\r\n  //       return \"yetToAssign\";\r\n  //     }\r\n  //     if (taskInfo.includes(\"open\") || taskInfo.includes(\"inprogress\")) {\r\n  //       return \"taskAssigned\";\r\n  //     }\r\n  //   }\r\n\r\n  //   if (\r\n  //     !taskDetails ||\r\n  //     (taskDetails.status == \"submit\" && status === \"disagree\")\r\n  //   )\r\n  //     return \"yetToAssign\";\r\n\r\n  //   if (taskDetails.status !== \"submit\") return \"taskAssigned\";\r\n\r\n  //   if (status === \"complete\") return \"completed\";\r\n  // }\r\n\r\n  // getTaskTooltip(data: any, type: string) {\r\n  //   const statusMap: any = {\r\n  //     layout: data.taskDetails?.layoutStatus,\r\n  //     fixture: data.taskDetails?.fixtureStatus,\r\n  //     vm: data.taskDetails?.fixtureStatus,\r\n  //   };\r\n  //   if (type == \"vm\") {\r\n  //     type = \"fixture\";\r\n  //   }\r\n  //   const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n  //     (ele: any) => ele.type == type,\r\n  //   );\r\n\r\n  //   const status = statusMap[type];\r\n\r\n  //   if (type == \"fixture\") {\r\n  //     let taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n  //       (ele: any) => ele.status && ele.type == \"fixture\",\r\n  //     );\r\n  //     if (\r\n  //       status === \"pending\" &&\r\n  //       taskInfo?.some((task: any) => task.status == \"submit\")\r\n  //     )\r\n  //       return \"Review Pending\";\r\n  //     if (taskInfo?.length != data.layoutCount) {\r\n  //       return \"Yet to Assign\";\r\n  //     }\r\n  //     if (taskInfo.includes(\"open\") || taskInfo.includes(\"inprogress\")) {\r\n  //       return \"Task Assigned\";\r\n  //     }\r\n  //   }\r\n\r\n  //   if (\r\n  //     !taskDetails ||\r\n  //     (taskDetails.status == \"submit\" && status === \"disagree\")\r\n  //   )\r\n  //     return \"Yet to Assign\";\r\n\r\n  //   if (taskDetails.status !== \"submit\") return \"Task Assigned\";\r\n\r\n  //   if (status === \"complete\") return \"Completed\";\r\n  // }\r\n\r\n  getProgressValue(plano: any) {\r\n    const status = this.getStatusBadge(plano);\r\n\r\n    if (status === \"allocationPending\") {\r\n      return 25;\r\n    } else {\r\n      return 0;\r\n    }\r\n  }\r\n\r\n  getStatus(plano: any) {\r\n    const status = this.getStatusBadge(plano);\r\n\r\n    if (status === \"allocationPending\") {\r\n      return \"Allocation pending\";\r\n    } else {\r\n      return \"Draft\";\r\n    }\r\n  }\r\n\r\n  getStatusBadge(plano: any) {\r\n    const floor = this.getPriorityFloor(plano);\r\n    return floor?.status;\r\n  }\r\n\r\n  getPriorityFloor(plano: any) {\r\n    let priorityFloor = plano?.layoutDetails?.find(\r\n      (f: any) => f.status === \"allocationPending\",\r\n    );\r\n\r\n    if (!priorityFloor) {\r\n      priorityFloor = plano?.layoutDetails[0];\r\n    }\r\n\r\n    return priorityFloor;\r\n  }\r\n\r\n  getSubmit(data: any) {\r\n    const statusMap: any = {\r\n      layout: data.taskDetails?.layoutStatus,\r\n      fixture: data.taskDetails?.fixtureStatus,\r\n      vm: data.taskDetails?.vmStatus,\r\n    };\r\n    let submitTask = data?.planoTask?.[0]?.taskStatus.find(\r\n      (ele: any) => ele.status == \"submit\" && statusMap[ele.type] == \"pending\",\r\n    );\r\n    if (submitTask) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  updateQueryParams() {\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: {\r\n        tab: this.selectedFilterTab,\r\n        search: this.searchTerm,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n      },\r\n      queryParamsHandling: \"merge\",\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  redirectStore(storeId: any) {\r\n    let data: any = JSON.parse(localStorage.getItem(\"header-filters\") || \"\");\r\n    data.store = storeId;\r\n    localStorage.setItem(\"header-filters\", JSON.stringify(data));\r\n    this.router.navigateByUrl(`manage/stores/plano?storeId=${storeId}`);\r\n  }\r\n\r\n  onExport() {\r\n    this.isButtonLoading = true;\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      limit: this.totalItems,\r\n      offset: 1,\r\n      sortColumnName: this.sortedColumn,\r\n      sortBy: this.sortOrder,\r\n      filter: this.appliedFilters,\r\n      searchValue: this.searchTerm,\r\n      export: true,\r\n    };\r\n\r\n    this.storeBuilderService\r\n      .getOnboardPlanoListExport(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res) {\r\n            this.storeBuilderService.saveAsExcelFile(\r\n              res,\r\n              \"Onboarding Plano List\",\r\n            );\r\n          }\r\n\r\n          this.isButtonLoading = false;\r\n        },\r\n        error: (err) => {\r\n          console.log(err, \"err\");\r\n          this.isButtonLoading = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.planoSub?.unsubscribe();\r\n  }\r\n}\r\n","<div class=\"row mx-0 my-5 gap-2\">\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'all' }\" (click)=\"filterTable('all')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardInfo?.allStores ?? 0 }}</h3>\r\n    <p>All stores</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'allocationPending' }\"\r\n    (click)=\"filterTable('allocationPending')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardInfo?.allocationPendingStores ?? 0 }}</h3>\r\n    <p>Allocation pending</p>\r\n  </div>\r\n  <div class=\"col filter-tab\" [ngClass]=\"{ selected: selectedFilterTab === 'draft' }\" (click)=\"filterTable('draft')\">\r\n    <div class=\"card-stat-shimmer\" *ngIf=\"isPageLoading\"></div>\r\n    <h3 *ngIf=\"!isPageLoading\">{{ cardInfo?.draftStores ?? 0 }}</h3>\r\n    <p>Draft</p>\r\n  </div>\r\n</div>\r\n\r\n<div class=\"content-wrapper\">\r\n  <div [class.restrict-interaction]=\"isButtonLoading\">\r\n    <!-- Manage Planogram view header -->\r\n    <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n      <div>\r\n        <h4>Onboard stores</h4>\r\n        <span>{{ totalItems }} - Total stores</span>\r\n      </div>\r\n\r\n      <div class=\"d-flex align-items-center gap-3\">\r\n        <div style=\"position: relative\">\r\n          <input type=\"text\" [(ngModel)]=\"searchTerm\" (change)=\"onSearch()\"\r\n            style=\"padding-left: 3rem; padding-right: 3rem\" class=\"form-control\" name=\"search\" autocomplete=\"off\"\r\n            placeholder=\"Search\" />\r\n\r\n          <span class=\"search-icon\">\r\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n              <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n              <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n            </svg>\r\n          </span>\r\n\r\n          <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\"\r\n            class=\"clear-search\">\r\n            <svg width=\"64px\" height=\"64px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                </path>\r\n                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n                </path>\r\n                <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                  stroke-linejoin=\"round\"></circle>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- <button type=\"button\" (click)=\"openBulkUploadModal()\" class=\"btn btn-outline text-nowrap\">\r\n          <svg class=\"me-2\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"currentColor\"\r\n              stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Bulk Upload\r\n        </button> -->\r\n\r\n        <!-- <button type=\"button\" class=\"btn btn-outline d-line-flex align-items-center text-nowrap\">\r\n          <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n            <path\r\n              d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\"\r\n              stroke=\"#344054\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n          Filter\r\n        </button> -->\r\n\r\n        @if(selectedFilterTab === 'all'){\r\n          <plano-filter #planoFilterRef [clientId]=\"clientId\" [data]=\"filterObject\" (applyFilters)=\"applyFilters($event)\"\r\n          (resetFilters)=\"applyFilters($event)\"\r\n          [config]=\"{ 'Merchandise compliance': false, 'Store category': false }\"></plano-filter>\r\n        }\r\n\r\n        <button type=\"button\" (click)=\"onExport()\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n          [disabled]=\"!planogramsList.length\">\r\n\r\n          <svg *ngIf=\"!isButtonLoading\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n            fill=\"none\">\r\n            <path\r\n              d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n              stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n          </svg>\r\n\r\n          <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n            <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n          </svg>\r\n\r\n          <span class=\"ms-2\"> Export</span>\r\n\r\n        </button>\r\n\r\n        <button type=\"button\" (click)=\"onClickCreatePlanogram()\"\r\n          class=\"btn btn-primary d-inline-flex align-items-center\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n            <path d=\"M10.0001 4.16663V15.8333M4.16675 9.99996H15.8334\" stroke=\"white\" stroke-width=\"1.67\"\r\n              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <span class=\"ms-2 text-white\">Create </span>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"isPageLoading\">\r\n      <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n        <div class=\"shimmer\">\r\n          <div class=\"wrapper\">\r\n            <div class=\"stroke animate title\"></div>\r\n            <div class=\"stroke animate link\"></div>\r\n            <div class=\"stroke animate description\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    <div class=\"card-body d-flex justify-content-center align-items-center flex-column\"\r\n      *ngIf=\"!isPageLoading && planogramsList.length === 0\">\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">No data found</div>\r\n      <div class=\"nodatasubtext\">There is no result for onboard planogram table</div>\r\n    </div>\r\n\r\n    <!-- Onboard Planogram list view -->\r\n    <section id=\"list-view\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n      <div class=\"table-responsive\">\r\n        <table class=\"w-100 table bottom-border text-nowrap\">\r\n          <thead>\r\n            <tr>\r\n              <th>\r\n                <span (click)=\"onSortTable('storeName')\" class=\"cursor-pointer\">\r\n                  Store Name\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'storeName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'storeName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutName')\" class=\"cursor-pointer\">\r\n                  Plano Name\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'layoutName' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutName' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                Country\r\n              </th>\r\n              <th>\r\n                City\r\n              </th>\r\n              <th>\r\n                <span class=\"cursor-pointer d-flex align-items-center\">\r\n                  Completion %\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n                    ngbTooltip=\"% of overall planogram completion\" class=\"ms-2\">\r\n                    <g clip-path=\"url(#clip0_844_17538)\">\r\n                      <path\r\n                        d=\"M8.00065 10.6663V7.99967M8.00065 5.33301H8.00732M14.6673 7.99967C14.6673 11.6816 11.6826 14.6663 8.00065 14.6663C4.31875 14.6663 1.33398 11.6816 1.33398 7.99967C1.33398 4.31778 4.31875 1.33301 8.00065 1.33301C11.6826 1.33301 14.6673 4.31778 14.6673 7.99967Z\"\r\n                        stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_17538\">\r\n                        <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                <span (click)=\"onSortTable('layoutCount')\" class=\"cursor-pointer\">\r\n                  Layout\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'layoutCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'layoutCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('fixtureCount')\" class=\"cursor-pointer\">\r\n                  #Fixtures\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'fixtureCount' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCount' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <ng-template #tooltip>\r\n                  <div class=\"w-100\">\r\n                    <h6>Total store capacity</h6>\r\n                    <span> Combining product capacity of all fixtures </span>\r\n                  </div>\r\n                </ng-template>\r\n                <span (click)=\"onSortTable('fixtureCapacity')\" class=\"cursor-pointer d-flex align-items-center\">\r\n                  Capacity\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'fixtureCapacity' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'fixtureCapacity' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n                    [ngbTooltip]=\"tooltip\" class=\"ms-2\">\r\n                    <g clip-path=\"url(#clip0_844_17538)\">\r\n                      <path\r\n                        d=\"M8.00065 10.6663V7.99967M8.00065 5.33301H8.00732M14.6673 7.99967C14.6673 11.6816 11.6826 14.6663 8.00065 14.6663C4.31875 14.6663 1.33398 11.6816 1.33398 7.99967C1.33398 4.31778 4.31875 1.33301 8.00065 1.33301C11.6826 1.33301 14.6673 4.31778 14.6673 7.99967Z\"\r\n                        stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_844_17538\">\r\n                        <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </span>\r\n              </th>\r\n              <th class=\"text-center\">\r\n                <span (click)=\"onSortTable('lastUpdate')\" class=\"cursor-pointer\">\r\n                  Last update\r\n                  <i class=\"fa ms-1 mt-1\" [ngStyle]=\"{ color: sortedColumn === 'lastUpdate' ? '#009BF3' : '' }\"\r\n                    [ngClass]=\"sortOrder === 1 && sortedColumn === 'lastUpdate' ? 'fa-arrow-up' : 'fa-arrow-down'\"\r\n                    aria-hidden=\"true\"></i>\r\n                </span>\r\n              </th>\r\n              <th>\r\n                Status\r\n              </th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let plano of planogramsList\">\r\n              <td>\r\n                <div class=\"d-flex align-items-center\">\r\n                  <a (click)=\"redirectStore(plano.storeId)\" class=\"cursor-pointer text-decoration-underline\">\r\n                    {{ plano.storeName }}</a>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <a [routerLink]=\"['/manage/planogram/onboard-planogram']\"\r\n                  [queryParams]=\"{ planoId: plano._id, floorId: getPriorityFloor(plano)?.id }\"\r\n                  class=\"text-decoration-underline\">\r\n                  {{ plano.layoutName }}\r\n                </a>\r\n              </td>\r\n              <td>\r\n                {{plano?.country}}\r\n              </td>\r\n              <td>\r\n                {{plano?.city}}\r\n              </td>\r\n              <td>\r\n                <div class=\"row align-items-center\">\r\n                  <div class=\"col-9\">\r\n                    <div class=\"progress\" style=\"height: 4px\">\r\n                      <div class=\"progress-bar\" [ngClass]=\"\r\n                          [25, 50].includes(getProgressValue(plano))\r\n                            ? 'bg-warning'\r\n                            : 'bg-success'\r\n                        \" role=\"progressbar\"\r\n                        [style]=\"  (plano) ? 'width: ' + getProgressValue(plano) + '%' : 'width:25%'\"\r\n                        [attr.aria-valuenow]=\"getProgressValue(plano)\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"col-3\">{{ getProgressValue(plano) }}%</div>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    @if(plano?.layoutCount === 1){\r\n                      1\r\n                    }@else{\r\n                      {{getPriorityFloor(plano)?.floorNumber??0}}/{{plano?.layoutCount??0}}\r\n                    }\r\n                  </span>\r\n\r\n                  @if(getStatusBadge(plano) === 'allocationPending'){\r\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"#D1FADF\" />\r\n                      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                        d=\"M9.97284 4.31097L5.79617 8.3418L4.68784 7.15763C4.48367 6.96513 4.16284 6.95347 3.9295 7.1168C3.702 7.28597 3.63784 7.58347 3.77784 7.82263L5.09034 9.95763C5.21867 10.156 5.44034 10.2785 5.69117 10.2785C5.93034 10.2785 6.15784 10.156 6.28617 9.95763C6.49617 9.68347 10.5037 4.90597 10.5037 4.90597C11.0287 4.3693 10.3928 3.8968 9.97284 4.30513V4.31097Z\"\r\n                        fill=\"#12B76A\" />\r\n                    </svg>\r\n\r\n                  }@else{\r\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"#F2F4F7\" />\r\n                      <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                        d=\"M9.97284 4.31097L5.79617 8.3418L4.68784 7.15763C4.48367 6.96513 4.16284 6.95347 3.9295 7.1168C3.702 7.28597 3.63784 7.58347 3.77784 7.82263L5.09034 9.95763C5.21867 10.156 5.44034 10.2785 5.69117 10.2785C5.93034 10.2785 6.15784 10.156 6.28617 9.95763C6.49617 9.68347 10.5037 4.90597 10.5037 4.90597C11.0287 4.3693 10.3928 3.8968 9.97284 4.30513V4.31097Z\"\r\n                        fill=\"#667085\" />\r\n                    </svg>\r\n                  }\r\n\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano?.fixtureCount ?? 0 }}\r\n                    @if(getStatusBadge(plano) === 'allocationPending'){\r\n                      <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"#FFFAEB\" />\r\n                        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                          d=\"M9.97284 4.31097L5.79617 8.3418L4.68784 7.15763C4.48367 6.96513 4.16284 6.95347 3.9295 7.1168C3.702 7.28597 3.63784 7.58347 3.77784 7.82263L5.09034 9.95763C5.21867 10.156 5.44034 10.2785 5.69117 10.2785C5.93034 10.2785 6.15784 10.156 6.28617 9.95763C6.49617 9.68347 10.5037 4.90597 10.5037 4.90597C11.0287 4.3693 10.3928 3.8968 9.97284 4.30513V4.31097Z\"\r\n                          fill=\"#B54708\" />\r\n                      </svg>\r\n\r\n\r\n                    }@else{\r\n                      <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"#F2F4F7\" />\r\n                        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                          d=\"M9.97284 4.31097L5.79617 8.3418L4.68784 7.15763C4.48367 6.96513 4.16284 6.95347 3.9295 7.1168C3.702 7.28597 3.63784 7.58347 3.77784 7.82263L5.09034 9.95763C5.21867 10.156 5.44034 10.2785 5.69117 10.2785C5.93034 10.2785 6.15784 10.156 6.28617 9.95763C6.49617 9.68347 10.5037 4.90597 10.5037 4.90597C11.0287 4.3693 10.3928 3.8968 9.97284 4.30513V4.31097Z\"\r\n                          fill=\"#667085\" />\r\n                      </svg>\r\n                    }\r\n                  </span>\r\n                </div>\r\n              </td>\r\n              <td>\r\n                <div class=\"d-flex align-items-center justify-content-center gap-2\">\r\n                  <span>\r\n                    {{ plano?.fixtureCapacity ?? 0 }}\r\n                  </span>\r\n                </div>\r\n              </td>\r\n              <td class=\"text-center\">\r\n                <span [ngbTooltip]=\"plano?.lastUpdate | date : 'medium'\">\r\n                  {{ plano?.lastUpdate | date }}\r\n                </span>\r\n              </td>\r\n              <td>\r\n                <div class=\"badge\" [ngClass]=\"getStatusBadge(plano)\">\r\n                  {{ getStatus(plano) }}\r\n                </div>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </section>\r\n\r\n    <!-- Pagination -->\r\n    <lib-pagination [itemsPerPage]=\"limit\" [currentPage]=\"offset\" [totalItems]=\"totalItems\"\r\n      [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\" (pageChange)=\"onPageChange($event)\"\r\n      (pageSizeChange)=\"onPageSizeChange($event)\" *ngIf=\"!isPageLoading && planogramsList.length !== 0\">\r\n    </lib-pagination>\r\n  </div>\r\n</div>\r\n","/**\r\n * Axis-based whitespace compaction for CAD-derived planograms.\r\n *\r\n * Visual-only render transform: produces a cloned floor with remapped\r\n * coordinates. Never mutates the source. See docs/whitespace-compaction.md\r\n * for the full rationale.\r\n */\r\n\r\nexport interface CompactionConfig {\r\n  /** Gaps smaller than this (in feet) are left alone. */\r\n  gapThresholdFt: number;\r\n  /** Target width (in feet) for any gap that exceeds the threshold. */\r\n  gapPaddingFt: number;\r\n  /** Padding around each fixture AABB when computing occupancy. */\r\n  marginFt: number;\r\n  /** Angles within this many degrees of 0/90/180/270 count as axis-aligned. */\r\n  diagonalToleranceDeg: number;\r\n}\r\n\r\nexport const DEFAULT_COMPACTION_CONFIG: CompactionConfig = {\r\n  gapThresholdFt: 4,\r\n  gapPaddingFt: 1.5,\r\n  marginFt: 2,\r\n  diagonalToleranceDeg: 15,\r\n};\r\n\r\n/**\r\n * Tolerance (in feet) for considering a wall fixture \"still attached\" to\r\n * its current wall. If the perpendicular distance from the fixture to\r\n * the wall segment exceeds this — or the fixture's projection falls\r\n * outside the wall's longitudinal extent — it's reassigned to the\r\n * nearest surviving wall in the destructive pipeline.\r\n */\r\nconst WALL_FIXTURE_DRIFT_TOL_FT = 0.5;\r\n\r\n/**\r\n * Maximum distance (in feet) a floor fixture is allowed to slide while\r\n * resolving an overlap with a wall fixture. If the collision can't be\r\n * cleared within this budget, we accept the residual and warn — better\r\n * than infinite-loop slides across the layout.\r\n */\r\nconst MAX_OVERLAP_SLIDE_FT = 5;\r\n\r\n/**\r\n * Step size (in feet) used when iteratively sliding a floor fixture out\r\n * of overlap. Smaller = finer adjustments but more iterations.\r\n */\r\nconst OVERLAP_SLIDE_STEP_FT = 0.25;\r\n\r\n/**\r\n * Walls shorter than this (in feet) are candidates for removal by\r\n * simplifyShortWalls — CAD exports often introduce staircase micro-segments\r\n * at corners that serve no visual purpose. Raised from 1.5 to 5 ft so\r\n * chamfers and short connector walls also collapse.\r\n */\r\nconst SHORT_WALL_THRESHOLD_FT = 5;\r\n\r\n/**\r\n * Max allowed corner drift (in feet) when collapsing a short wall into\r\n * the intersection of its neighbours. Bounds the overall silhouette\r\n * change — overall shape stays within this many feet of the original\r\n * at any corner. Kept small so cutouts ≥ ~2.5 ft survive.\r\n */\r\nconst MAX_CORNER_DRIFT_FT = 2.5;\r\n\r\n/**\r\n * Max passes of wall simplification per compaction call. Each pass\r\n * alternates simplifyOnePass (drops short runs, inserts bridges) with\r\n * mergeColinearPass (merges consecutive colinear walls). Merging a pair\r\n * into one long wall often exposes more short-run opportunities in the\r\n * next pass, so a few iterations are needed for the polygon to settle.\r\n */\r\nconst MAX_SIMPLIFY_PASSES = 6;\r\n\r\n/**\r\n * Max angular deviation (degrees) between two consecutive walls for them\r\n * to count as colinear and mergeable.\r\n */\r\nconst COLINEAR_ANGLE_TOL_DEG = 1.5;\r\n\r\n/**\r\n * Max chain-closure gap (feet) between wall A's end and wall B's start\r\n * for them to count as still connected for merge purposes. Larger gaps\r\n * indicate a hanging wall, which merging would mask.\r\n */\r\nconst MERGE_CHAIN_GAP_FT = 0.5;\r\n\r\n/**\r\n * Epsilon floor for any wall length after compaction. Prevents pure\r\n * zero-length walls (which would render as degenerate points) without\r\n * forcing a visible overhang past the next corner. The previous 1.5 ft\r\n * floor created stacked / overlapping corner artifacts whenever a corner\r\n * stub's natural length post-remap was below the floor — the wall would\r\n * be drawn 1+ ft past where the adjacent wall's remapped start sits.\r\n */\r\nconst MIN_WALL_FT = 0.1;\r\n\r\n/**\r\n * Cross-product magnitude below which two unit direction vectors count\r\n * as parallel. sin(~3°) ≈ 0.052, so this catches CAD walls that are\r\n * notionally parallel but drifted by a degree or two.\r\n */\r\nconst PARALLEL_CROSS_TOLERANCE = 0.05;\r\n\r\nexport interface AxisRemap {\r\n  fx: (x: number) => number;\r\n  fy: (y: number) => number;\r\n  fxInverse: (xp: number) => number;\r\n  fyInverse: (yp: number) => number;\r\n}\r\n\r\ntype Interval = [number, number];\r\n\r\nconst MM_PER_FT = 304.8;\r\n\r\nfunction toFeet(value: number, unit: string | undefined): number {\r\n  if (value == null || !isFinite(value)) return 0;\r\n  if (unit === \"mm\") return value / MM_PER_FT;\r\n  return value;\r\n}\r\n\r\nfunction isAxisAligned(angleDeg: number, toleranceDeg: number): boolean {\r\n  const a = ((angleDeg % 360) + 360) % 360;\r\n  const deltas = [0, 90, 180, 270, 360].map((t) => Math.abs(a - t));\r\n  return Math.min(...deltas) <= toleranceDeg;\r\n}\r\n\r\n/**\r\n * World-space AABB of a floor's layoutPolygon, computed from each wall's\r\n * (start, end) pair in feet. Used to detect whether a compaction pass\r\n * actually shrank the layout — if both dimensions are unchanged within\r\n * a small tolerance, the store is already at its compact size and the\r\n * caller can surface that to the user instead of silently applying a\r\n * no-op.\r\n */\r\nexport function getFloorBoundsFt(\r\n  floor: any,\r\n): { minX: number; maxX: number; minY: number; maxY: number } {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  let minX = Infinity;\r\n  let maxX = -Infinity;\r\n  let minY = Infinity;\r\n  let maxY = -Infinity;\r\n  for (const el of walls) {\r\n    const rp = el?.relativePosition;\r\n    if (!rp) continue;\r\n    const sx = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const sy = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    const dist = toFeet(el.distance ?? 0, el.unit ?? \"ft\");\r\n    const angleRad = ((el.angle ?? 0) * Math.PI) / 180;\r\n    const ex = sx + dist * Math.cos(angleRad);\r\n    const ey = sy + dist * Math.sin(angleRad);\r\n    minX = Math.min(minX, sx, ex);\r\n    maxX = Math.max(maxX, sx, ex);\r\n    minY = Math.min(minY, sy, ey);\r\n    maxY = Math.max(maxY, sy, ey);\r\n  }\r\n  if (!isFinite(minX)) return { minX: 0, maxX: 0, minY: 0, maxY: 0 };\r\n  return { minX, maxX, minY, maxY };\r\n}\r\n\r\n/**\r\n * World-space AABB for a fixture whose `relativePosition` is the top-left\r\n * corner of its bounding box (Fabric default origin), rotated about that\r\n * top-left point by `angleDeg`. Returns absolute min/max in floor coords.\r\n *\r\n * The renderer creates each fixture as a `fabric.Group({ left, top, angle })`\r\n * without an explicit origin, which means rotation pivots on the top-left\r\n * — NOT the center. Treating `(rp.x, rp.y)` as a centered AABB shifts the\r\n * compaction's view of the fixture by half its dimensions, so gaps above\r\n * the wall get over-compressed and the wall slides through the fixture's\r\n * real extent.\r\n */\r\nfunction fixtureWorldAabb(\r\n  topLeftX: number,\r\n  topLeftY: number,\r\n  widthFt: number,\r\n  heightFt: number,\r\n  angleDeg: number,\r\n): { minX: number; maxX: number; minY: number; maxY: number } {\r\n  const rad = (angleDeg * Math.PI) / 180;\r\n  const c = Math.cos(rad);\r\n  const s = Math.sin(rad);\r\n  const xs = [0, widthFt * c, -heightFt * s, widthFt * c - heightFt * s];\r\n  const ys = [0, widthFt * s, heightFt * c, widthFt * s + heightFt * c];\r\n  return {\r\n    minX: topLeftX + Math.min(...xs),\r\n    maxX: topLeftX + Math.max(...xs),\r\n    minY: topLeftY + Math.min(...ys),\r\n    maxY: topLeftY + Math.max(...ys),\r\n  };\r\n}\r\n\r\nfunction mergeIntervals(arr: Interval[]): Interval[] {\r\n  if (!arr.length) return [];\r\n  const sorted = arr\r\n    .filter((i) => isFinite(i[0]) && isFinite(i[1]) && i[1] >= i[0])\r\n    .sort((a, b) => a[0] - b[0]);\r\n  if (!sorted.length) return [];\r\n  const out: Interval[] = [[sorted[0][0], sorted[0][1]]];\r\n  for (let i = 1; i < sorted.length; i++) {\r\n    const last = out[out.length - 1];\r\n    const cur = sorted[i];\r\n    if (cur[0] <= last[1]) {\r\n      last[1] = Math.max(last[1], cur[1]);\r\n    } else {\r\n      out.push([cur[0], cur[1]]);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n/**\r\n * Given merged occupied intervals and compaction params, build the breakpoint\r\n * list [origVal, newVal] that defines the piecewise-linear remap.\r\n * First occupied point anchors to itself (no leftmost shift).\r\n */\r\nfunction buildBreakpoints(\r\n  intervals: Interval[],\r\n  thresholdFt: number,\r\n  paddingFt: number,\r\n): Array<[number, number]> {\r\n  if (!intervals.length) return [];\r\n  const pts: Array<[number, number]> = [];\r\n  const [a0, b0] = intervals[0];\r\n  pts.push([a0, a0]);\r\n  pts.push([b0, a0 + (b0 - a0)]);\r\n  let cursor = a0 + (b0 - a0);\r\n\r\n  for (let i = 1; i < intervals.length; i++) {\r\n    const prevEnd = intervals[i - 1][1];\r\n    const [curStart, curEnd] = intervals[i];\r\n    const gap = curStart - prevEnd;\r\n    const newGap = gap > thresholdFt ? paddingFt : gap;\r\n    cursor += newGap;\r\n    pts.push([curStart, cursor]);\r\n    cursor += curEnd - curStart;\r\n    pts.push([curEnd, cursor]);\r\n  }\r\n  return pts;\r\n}\r\n\r\nfunction applyPiecewiseLinear(\r\n  pts: Array<[number, number]>,\r\n  v: number,\r\n  inverse: boolean,\r\n): number {\r\n  if (!pts.length) return v;\r\n  const srcIdx = inverse ? 1 : 0;\r\n  const dstIdx = inverse ? 0 : 1;\r\n  const first = pts[0];\r\n  const last = pts[pts.length - 1];\r\n  if (v <= first[srcIdx]) return v + (first[dstIdx] - first[srcIdx]);\r\n  if (v >= last[srcIdx]) return v + (last[dstIdx] - last[srcIdx]);\r\n  for (let i = 0; i < pts.length - 1; i++) {\r\n    const a = pts[i];\r\n    const b = pts[i + 1];\r\n    if (v >= a[srcIdx] && v <= b[srcIdx]) {\r\n      const span = b[srcIdx] - a[srcIdx];\r\n      if (span === 0) return a[dstIdx];\r\n      const t = (v - a[srcIdx]) / span;\r\n      return a[dstIdx] + t * (b[dstIdx] - a[dstIdx]);\r\n    }\r\n  }\r\n  return v;\r\n}\r\n\r\n/**\r\n * Build per-axis occupancy intervals from the floor, covering:\r\n *   - wall corners (zero-width, preserves polygon closure)\r\n *   - entrance endpoints (zero-width)\r\n *   - non-axis-aligned walls (full extent — prevents diagonal skew)\r\n *   - all fixtures + otherElements, inflated by marginFt, rotated AABB\r\n * Excludes ghost fixtures and placeholders named \"space\".\r\n */\r\nfunction collectOccupancy(\r\n  floor: any,\r\n  cfg: CompactionConfig,\r\n): { x: Interval[]; y: Interval[] } {\r\n  const x: Interval[] = [];\r\n  const y: Interval[] = [];\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n\r\n  for (const el of walls) {\r\n    const rp = el?.relativePosition;\r\n    if (!rp) continue;\r\n    const sx = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const sy = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    x.push([sx, sx]);\r\n    y.push([sy, sy]);\r\n\r\n    const unit = el.unit ?? \"ft\";\r\n    const dist = toFeet(el.distance ?? 0, unit);\r\n    const angleRad = ((el.angle ?? 0) * Math.PI) / 180;\r\n    const ex = sx + dist * Math.cos(angleRad);\r\n    const ey = sy + dist * Math.sin(angleRad);\r\n\r\n    if (el.elementType === \"entrance\") {\r\n      x.push([ex, ex]);\r\n      y.push([ey, ey]);\r\n      continue;\r\n    }\r\n\r\n    if (!isAxisAligned(el.angle ?? 0, cfg.diagonalToleranceDeg)) {\r\n      x.push([Math.min(sx, ex), Math.max(sx, ex)]);\r\n      y.push([Math.min(sy, ey), Math.max(sy, ey)]);\r\n    }\r\n  }\r\n\r\n  const addFixture = (f: any) => {\r\n    if (!f || f.ghost === true) return;\r\n    if (typeof f.fixtureName === \"string\" && f.fixtureName.toLowerCase() === \"space\") return;\r\n    const rp = f.relativePosition;\r\n    if (!rp) return;\r\n    const tlx = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const tly = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    const L = toFeet(\r\n      f.fixtureStaticLength?.value ?? 0,\r\n      f.fixtureStaticLength?.unit ?? \"ft\",\r\n    );\r\n    const W = toFeet(\r\n      f.fixtureStaticWidth?.value ?? 0,\r\n      f.fixtureStaticWidth?.unit ?? \"ft\",\r\n    );\r\n    const aabb = fixtureWorldAabb(tlx, tly, W, L, rp.angle ?? 0);\r\n    x.push([aabb.minX - cfg.marginFt, aabb.maxX + cfg.marginFt]);\r\n    y.push([aabb.minY - cfg.marginFt, aabb.maxY + cfg.marginFt]);\r\n  };\r\n\r\n  for (const el of walls) {\r\n    if (Array.isArray(el.fixtures)) el.fixtures.forEach(addFixture);\r\n    if (Array.isArray(el.otherElements)) el.otherElements.forEach(addFixture);\r\n  }\r\n  if (Array.isArray(floor?.centerFixture)) floor.centerFixture.forEach(addFixture);\r\n  if (Array.isArray(floor?.otherElements)) floor.otherElements.forEach(addFixture);\r\n\r\n  return { x, y };\r\n}\r\n\r\nexport function computeAxisRemap(\r\n  floor: any,\r\n  cfg: CompactionConfig = DEFAULT_COMPACTION_CONFIG,\r\n): AxisRemap {\r\n  const { x: xRaw, y: yRaw } = collectOccupancy(floor, cfg);\r\n  const mergedX = mergeIntervals(xRaw);\r\n  const mergedY = mergeIntervals(yRaw);\r\n  const ptsX = buildBreakpoints(mergedX, cfg.gapThresholdFt, cfg.gapPaddingFt);\r\n  const ptsY = buildBreakpoints(mergedY, cfg.gapThresholdFt, cfg.gapPaddingFt);\r\n  return {\r\n    fx: (v: number) => applyPiecewiseLinear(ptsX, v, false),\r\n    fy: (v: number) => applyPiecewiseLinear(ptsY, v, false),\r\n    fxInverse: (v: number) => applyPiecewiseLinear(ptsX, v, true),\r\n    fyInverse: (v: number) => applyPiecewiseLinear(ptsY, v, true),\r\n  };\r\n}\r\n\r\n/**\r\n * Returns a deep-cloned floor with all relevant coordinates remapped:\r\n *   - wall start points, then recomputed distances from each wall's own\r\n *     (start, end) after independent remapping — no reliance on polygon\r\n *     ordering and no risk of direction flips\r\n *   - wall-mounted fixtures + per-wall otherElements\r\n *   - floor centerFixtures + floor-level otherElements\r\n * Fixture dimensions (length/width) are never touched.\r\n * Wall length is clamped to MIN_WALL_FT so corner-to-corner segments\r\n * that sit entirely inside a compressed gap don't visually disappear.\r\n * Each remapped position has its `unit` normalized to \"ft\".\r\n */\r\nexport function applyRemapToFloor(floor: any, remap: AxisRemap): any {\r\n  const clone = structuredClone(floor);\r\n  const { fx, fy } = remap;\r\n\r\n  const remapRelPos = (rp: any) => {\r\n    if (!rp) return;\r\n    const xFt = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const yFt = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    rp.x = fx(xFt);\r\n    rp.y = fy(yFt);\r\n    rp.unit = \"ft\";\r\n  };\r\n\r\n  const walls: any[] = Array.isArray(clone?.layoutPolygon)\r\n    ? clone.layoutPolygon\r\n    : [];\r\n\r\n  for (const el of walls) {\r\n    const rp = el?.relativePosition;\r\n    if (!rp) continue;\r\n    const unit = el.unit ?? \"ft\";\r\n    const oldSxFt = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const oldSyFt = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    const oldDistFt = toFeet(el.distance ?? 0, unit);\r\n    const angleRad = ((el.angle ?? 0) * Math.PI) / 180;\r\n    const oldDx = Math.cos(angleRad);\r\n    const oldDy = Math.sin(angleRad);\r\n    const oldExFt = oldSxFt + oldDistFt * oldDx;\r\n    const oldEyFt = oldSyFt + oldDistFt * oldDy;\r\n\r\n    const newSx = fx(oldSxFt);\r\n    const newSy = fy(oldSyFt);\r\n    const newEx = fx(oldExFt);\r\n    const newEy = fy(oldEyFt);\r\n\r\n    const newDist = Math.hypot(newEx - newSx, newEy - newSy);\r\n    const clamped =\r\n      el.elementType === \"wall\" ? Math.max(newDist, MIN_WALL_FT) : newDist;\r\n\r\n    // Post-remap direction. Non-uniform fx/fy can rotate a tilted wall's\r\n    // effective direction (different scale on each axis), so we can't\r\n    // assume the stored `el.angle` still describes how the wall now lies.\r\n    // Falling back to the old direction keeps degenerate (zero-length)\r\n    // walls stable.\r\n    const newDx = newDist > 1e-9 ? (newEx - newSx) / newDist : oldDx;\r\n    const newDy = newDist > 1e-9 ? (newEy - newSy) / newDist : oldDy;\r\n\r\n    // Drag wall-attached fixtures and otherElements with the wall.\r\n    // Decompose each fixture's offset in the OLD wall frame (long/perp),\r\n    // scale longitudinal by the wall's length ratio, then re-anchor onto\r\n    // the wall's NEW frame so fixtures stay glued to the wall regardless\r\n    // of how the remap rotated or shortened it.\r\n    const lengthScale = oldDistFt > 0 ? clamped / oldDistFt : 1;\r\n    const dragWithWall = (frp: any): void => {\r\n      if (!frp) return;\r\n      const oldFxFt = toFeet(frp.x, frp.unit ?? \"ft\");\r\n      const oldFyFt = toFeet(frp.y, frp.unit ?? \"ft\");\r\n      const relX = oldFxFt - oldSxFt;\r\n      const relY = oldFyFt - oldSyFt;\r\n      const longFt = relX * oldDx + relY * oldDy;\r\n      const perpFt = -relX * oldDy + relY * oldDx;\r\n      const newLongFt = longFt * lengthScale;\r\n      const newFxFt = newSx + newLongFt * newDx + perpFt * -newDy;\r\n      const newFyFt = newSy + newLongFt * newDy + perpFt * newDx;\r\n      frp.x = Number(newFxFt.toFixed(4));\r\n      frp.y = Number(newFyFt.toFixed(4));\r\n      frp.unit = \"ft\";\r\n    };\r\n    if (Array.isArray(el.fixtures)) {\r\n      el.fixtures.forEach((f: any) => dragWithWall(f?.relativePosition));\r\n    }\r\n    if (Array.isArray(el.otherElements)) {\r\n      el.otherElements.forEach((oe: any) => dragWithWall(oe?.relativePosition));\r\n    }\r\n\r\n    rp.x = newSx;\r\n    rp.y = newSy;\r\n    rp.unit = \"ft\";\r\n    el.distance = Number(clamped.toFixed(4));\r\n    el.unit = \"ft\";\r\n    // Sync angle to the post-remap direction so the renderer's drawn\r\n    // endpoint coincides with the next wall's remapped start. Without\r\n    // this, any wall not perfectly axis-aligned (entrance segments,\r\n    // walls left tilted by simplify, walls in irregular floors) renders\r\n    // along its OLD direction at the NEW length — producing the open /\r\n    // overlapping corners visible in the compacted screenshots.\r\n    if (newDist > 1e-9) {\r\n      const newAngleDeg = (Math.atan2(newDy, newDx) * 180) / Math.PI;\r\n      el.angle = ((newAngleDeg % 360) + 360) % 360;\r\n    }\r\n  }\r\n\r\n  // Floor (centerFixture) and floor-level otherElements aren't anchored\r\n  // to a wall, so they get the plain fx/fy remap. resolveFixtureOverlaps\r\n  // (called downstream in compactFloorDestructive) slides any of these\r\n  // that ends up overlapping a wall fixture out of the way.\r\n  if (Array.isArray(clone?.centerFixture)) clone.centerFixture.forEach((f: any) => remapRelPos(f?.relativePosition));\r\n  if (Array.isArray(clone?.otherElements)) clone.otherElements.forEach((oe: any) => remapRelPos(oe?.relativePosition));\r\n\r\n  return clone;\r\n}\r\n\r\n/**\r\n * Weighted-circular mean of wall angles taken mod 90°, so horizontal and\r\n * vertical walls fall into the same bucket. Returns the shortest rotation\r\n * (in degrees) needed to bring the store's dominant wall direction onto\r\n * the X/Y axes. Range: (-45, 45]. Small magnitudes mean the store is\r\n * already axis-aligned.\r\n */\r\nfunction computePrincipalAngle(floor: any): number {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon.filter((el: any) => el?.elementType === \"wall\")\r\n    : [];\r\n  if (!walls.length) return 0;\r\n\r\n  let sumCos = 0;\r\n  let sumSin = 0;\r\n  let totalLen = 0;\r\n  for (const w of walls) {\r\n    const ang = (((w.angle ?? 0) % 90) + 90) % 90; // [0, 90)\r\n    const r = (ang * 2 * Math.PI) / 180; // double to close the 90° circle\r\n    const len = Math.max(toFeet(w.distance ?? 0, w.unit ?? \"ft\"), 0);\r\n    if (len === 0) continue;\r\n    sumCos += len * Math.cos(r);\r\n    sumSin += len * Math.sin(r);\r\n    totalLen += len;\r\n  }\r\n  if (totalLen === 0) return 0;\r\n\r\n  const meanDoubled = Math.atan2(sumSin, sumCos);\r\n  const meanDeg = ((meanDoubled / 2) * 180) / Math.PI;\r\n  let theta = ((meanDeg % 90) + 90) % 90; // [0, 90)\r\n  if (theta > 45) theta -= 90; // prefer the shorter rotation, (-45, 45]\r\n  return theta;\r\n}\r\n\r\nfunction computeWallCentroid(floor: any): { x: number; y: number } {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  let cx = 0;\r\n  let cy = 0;\r\n  let n = 0;\r\n  for (const el of walls) {\r\n    const rp = el?.relativePosition;\r\n    if (!rp) continue;\r\n    cx += toFeet(rp.x, rp.unit ?? \"ft\");\r\n    cy += toFeet(rp.y, rp.unit ?? \"ft\");\r\n    n++;\r\n  }\r\n  return n > 0 ? { x: cx / n, y: cy / n } : { x: 0, y: 0 };\r\n}\r\n\r\nfunction rotateFloorCoords(\r\n  floor: any,\r\n  pivot: { x: number; y: number },\r\n  angleDeg: number,\r\n): any {\r\n  const clone = structuredClone(floor);\r\n  const r = (angleDeg * Math.PI) / 180;\r\n  const c = Math.cos(r);\r\n  const s = Math.sin(r);\r\n\r\n  const rotateRp = (rp: any) => {\r\n    if (!rp) return;\r\n    const xFt = toFeet(rp.x, rp.unit ?? \"ft\");\r\n    const yFt = toFeet(rp.y, rp.unit ?? \"ft\");\r\n    const dx = xFt - pivot.x;\r\n    const dy = yFt - pivot.y;\r\n    rp.x = c * dx - s * dy + pivot.x;\r\n    rp.y = s * dx + c * dy + pivot.y;\r\n    rp.unit = \"ft\";\r\n    if (typeof rp.angle === \"number\") {\r\n      rp.angle = ((rp.angle + angleDeg) % 360 + 360) % 360;\r\n    }\r\n  };\r\n\r\n  const walls: any[] = Array.isArray(clone?.layoutPolygon)\r\n    ? clone.layoutPolygon\r\n    : [];\r\n  for (const el of walls) {\r\n    rotateRp(el?.relativePosition);\r\n    if (typeof el.angle === \"number\") {\r\n      el.angle = ((el.angle + angleDeg) % 360 + 360) % 360;\r\n    }\r\n    if (Array.isArray(el.fixtures)) el.fixtures.forEach((f: any) => rotateRp(f?.relativePosition));\r\n    if (Array.isArray(el.otherElements)) el.otherElements.forEach((oe: any) => rotateRp(oe?.relativePosition));\r\n  }\r\n  if (Array.isArray(clone?.centerFixture)) clone.centerFixture.forEach((f: any) => rotateRp(f?.relativePosition));\r\n  if (Array.isArray(clone?.otherElements)) clone.otherElements.forEach((oe: any) => rotateRp(oe?.relativePosition));\r\n\r\n  return clone;\r\n}\r\n\r\n/**\r\n * Intersect two infinite lines expressed as (point, direction).\r\n * Returns null if the lines are parallel or near-parallel.\r\n */\r\nfunction intersectLines(\r\n  p1: { x: number; y: number },\r\n  d1: { x: number; y: number },\r\n  p2: { x: number; y: number },\r\n  d2: { x: number; y: number },\r\n): { x: number; y: number } | null {\r\n  const det = d1.x * -d2.y + d1.y * d2.x;\r\n  if (Math.abs(det) < 1e-9) return null;\r\n  const t = ((p2.x - p1.x) * -d2.y + (p2.y - p1.y) * d2.x) / det;\r\n  return { x: p1.x + t * d1.x, y: p1.y + t * d1.y };\r\n}\r\n\r\n/**\r\n * One pass of run-based wall simplification.\r\n *\r\n * Classifies each wall as:\r\n *   - \"anchor\" — has fixtures, otherElements, is an entrance, is not a\r\n *     wall at all, or is at least SHORT_WALL_THRESHOLD_FT long\r\n *   - \"simplifiable\" — everything else (short connector walls)\r\n *\r\n * For each consecutive pair of anchors (A, B) in polygon order, the\r\n * entire run of simplifiable walls between them is collapsed:\r\n *\r\n *   - Non-parallel A, B: snap both to the intersection of their lines\r\n *     (existing behaviour, drift-bounded).\r\n *   - Parallel same-direction A, B (the common CAD staircase): extend A\r\n *     along its axis; then either snap B colinearly onto A (when the\r\n *     perpendicular offset is below threshold) or insert a single\r\n *     perpendicular bridge wall (when the offset is ≥ threshold, so the\r\n *     inserted wall itself passes the \"bigger than a fixture\" bar).\r\n *   - Parallel anti-direction A, B: skipped — collapsing a U-turn/notch\r\n *     could invert the polygon.\r\n *\r\n * Skips a run when:\r\n *   - A or B is not a wall (entrances and other specials stay put)\r\n *   - any run member is not a wall (don't collapse across an entrance)\r\n *   - for the non-parallel case, the corner drift exceeds\r\n *     `max(MAX_CORNER_DRIFT_FT, runSpan × 2)`\r\n *   - the merge would leave A or B shorter than MIN_WALL_FT\r\n *   - the merge would require A or B to reverse direction\r\n *   - a fixture on A or B would fall outside the new wall extent\r\n */\r\ninterface SimplifyOptions {\r\n  /**\r\n   * Whether the parallel-anchor case may insert a perpendicular bridge\r\n   * wall when the perpendicular offset exceeds the threshold. False is\r\n   * useful for the post-compaction cleanup pass, where the goal is to\r\n   * drop stubs without growing the polygon back with new connector walls.\r\n   */\r\n  allowBridges?: boolean;\r\n}\r\n\r\nfunction simplifyOnePass(\r\n  floor: any,\r\n  thresholdFt: number,\r\n  options: SimplifyOptions = {},\r\n): { floor: any; removed: number } {\r\n  const allowBridges = options.allowBridges !== false;\r\n  const clone = structuredClone(floor);\r\n  const walls: any[] = Array.isArray(clone?.layoutPolygon)\r\n    ? clone.layoutPolygon\r\n    : [];\r\n  if (walls.length < 4) return { floor: clone, removed: 0 };\r\n\r\n  const isSimplifiable = (w: any): boolean => {\r\n    if (w?.elementType !== \"wall\") return false;\r\n    if (Array.isArray(w.fixtures) && w.fixtures.length > 0) return false;\r\n    if (Array.isArray(w.otherElements) && w.otherElements.length > 0) return false;\r\n    const d = toFeet(w.distance ?? 0, w.unit ?? \"ft\");\r\n    return d < thresholdFt;\r\n  };\r\n\r\n  const n = walls.length;\r\n  const anchorIdxs: number[] = [];\r\n  for (let i = 0; i < n; i++) if (!isSimplifiable(walls[i])) anchorIdxs.push(i);\r\n  if (anchorIdxs.length < 2) return { floor: clone, removed: 0 };\r\n\r\n  const asDir = (angleDeg: number) => {\r\n    const r = (angleDeg * Math.PI) / 180;\r\n    return { x: Math.cos(r), y: Math.sin(r) };\r\n  };\r\n\r\n  const fixtureOutside = (\r\n    wall: any,\r\n    startX: number,\r\n    startY: number,\r\n    dir: { x: number; y: number },\r\n    lenFt: number,\r\n  ): boolean => {\r\n    const arr: any[] = Array.isArray(wall?.fixtures) ? wall.fixtures : [];\r\n    for (const f of arr) {\r\n      const rp = f?.relativePosition;\r\n      if (!rp) continue;\r\n      const fx = toFeet(rp.x, rp.unit ?? \"ft\");\r\n      const fy = toFeet(rp.y, rp.unit ?? \"ft\");\r\n      const t = (fx - startX) * dir.x + (fy - startY) * dir.y;\r\n      if (t < -0.5 || t > lenFt + 0.5) return true;\r\n    }\r\n    return false;\r\n  };\r\n\r\n  const keep: boolean[] = walls.map(() => true);\r\n  // Bridge walls keyed by the original index of the anchor they follow.\r\n  const insertionsAt: Map<number, any[]> = new Map();\r\n  let removed = 0;\r\n\r\n  for (let a = 0; a < anchorIdxs.length; a++) {\r\n    const aIdx = anchorIdxs[a];\r\n    const bIdx = anchorIdxs[(a + 1) % anchorIdxs.length];\r\n\r\n    const runIdxs: number[] = [];\r\n    let j = (aIdx + 1) % n;\r\n    while (j !== bIdx) {\r\n      runIdxs.push(j);\r\n      j = (j + 1) % n;\r\n    }\r\n    if (runIdxs.length === 0) continue;\r\n\r\n    let runValid = true;\r\n    for (const r of runIdxs) {\r\n      if (walls[r]?.elementType !== \"wall\") {\r\n        runValid = false;\r\n        break;\r\n      }\r\n    }\r\n    if (!runValid) continue;\r\n\r\n    const before = walls[aIdx];\r\n    const after = walls[bIdx];\r\n    if (before?.elementType !== \"wall\" || after?.elementType !== \"wall\") continue;\r\n    if (!before.relativePosition || !after.relativePosition) continue;\r\n\r\n    const beforeStart = {\r\n      x: toFeet(before.relativePosition.x, before.relativePosition.unit ?? \"ft\"),\r\n      y: toFeet(before.relativePosition.y, before.relativePosition.unit ?? \"ft\"),\r\n    };\r\n    const afterStart = {\r\n      x: toFeet(after.relativePosition.x, after.relativePosition.unit ?? \"ft\"),\r\n      y: toFeet(after.relativePosition.y, after.relativePosition.unit ?? \"ft\"),\r\n    };\r\n    const beforeDir = asDir(before.angle ?? 0);\r\n    const afterDir = asDir(after.angle ?? 0);\r\n    const beforeDistFt = toFeet(before.distance ?? 0, before.unit ?? \"ft\");\r\n    const afterDistFt = toFeet(after.distance ?? 0, after.unit ?? \"ft\");\r\n    const beforeEnd = {\r\n      x: beforeStart.x + beforeDistFt * beforeDir.x,\r\n      y: beforeStart.y + beforeDistFt * beforeDir.y,\r\n    };\r\n    const afterEnd = {\r\n      x: afterStart.x + afterDistFt * afterDir.x,\r\n      y: afterStart.y + afterDistFt * afterDir.y,\r\n    };\r\n\r\n    const cross = beforeDir.x * afterDir.y - beforeDir.y * afterDir.x;\r\n    const dot = beforeDir.x * afterDir.x + beforeDir.y * afterDir.y;\r\n    const isParallel = Math.abs(cross) < PARALLEL_CROSS_TOLERANCE;\r\n\r\n    if (!isParallel) {\r\n      const intersection = intersectLines(beforeStart, beforeDir, afterStart, afterDir);\r\n      if (!intersection) continue;\r\n\r\n      // Signed distances along each anchor's forward direction. Negative\r\n      // values would require the wall to flip 180° — skip.\r\n      const newBeforeSigned =\r\n        (intersection.x - beforeStart.x) * beforeDir.x +\r\n        (intersection.y - beforeStart.y) * beforeDir.y;\r\n      const newAfterSigned =\r\n        (afterEnd.x - intersection.x) * afterDir.x +\r\n        (afterEnd.y - intersection.y) * afterDir.y;\r\n      if (newBeforeSigned < MIN_WALL_FT || newAfterSigned < MIN_WALL_FT) continue;\r\n\r\n      const driftBefore = Math.hypot(\r\n        intersection.x - beforeEnd.x,\r\n        intersection.y - beforeEnd.y,\r\n      );\r\n      const driftAfter = Math.hypot(\r\n        intersection.x - afterStart.x,\r\n        intersection.y - afterStart.y,\r\n      );\r\n      const runSpan = Math.hypot(\r\n        afterStart.x - beforeEnd.x,\r\n        afterStart.y - beforeEnd.y,\r\n      );\r\n      const maxAllowedDrift = Math.max(MAX_CORNER_DRIFT_FT, runSpan * 2);\r\n      if (driftBefore > maxAllowedDrift || driftAfter > maxAllowedDrift) continue;\r\n\r\n      if (\r\n        fixtureOutside(before, beforeStart.x, beforeStart.y, beforeDir, newBeforeSigned) ||\r\n        fixtureOutside(after, intersection.x, intersection.y, afterDir, newAfterSigned)\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      before.distance = Number(newBeforeSigned.toFixed(4));\r\n      before.unit = \"ft\";\r\n      after.relativePosition.x = intersection.x;\r\n      after.relativePosition.y = intersection.y;\r\n      after.relativePosition.unit = \"ft\";\r\n      after.distance = Number(newAfterSigned.toFixed(4));\r\n      after.unit = \"ft\";\r\n      for (const r of runIdxs) {\r\n        keep[r] = false;\r\n        removed++;\r\n      }\r\n      continue;\r\n    }\r\n\r\n    // Parallel case. Only handle same-direction (staircase); anti-parallel\r\n    // runs are notches/U-turns and collapsing them risks inverting the\r\n    // polygon, so we leave them alone.\r\n    if (dot <= 0) continue;\r\n\r\n    // Left-perpendicular of A's direction.\r\n    const perpDir = { x: -beforeDir.y, y: beforeDir.x };\r\n    const gapX = afterStart.x - beforeEnd.x;\r\n    const gapY = afterStart.y - beforeEnd.y;\r\n    const parOff = gapX * beforeDir.x + gapY * beforeDir.y;\r\n    const perpOff = gapX * perpDir.x + gapY * perpDir.y;\r\n    const perpOffAbs = Math.abs(perpOff);\r\n\r\n    // Extend A along its own direction to absorb the parallel gap.\r\n    const newBeforeDist = beforeDistFt + parOff;\r\n    if (newBeforeDist < MIN_WALL_FT) continue;\r\n    if (fixtureOutside(before, beforeStart.x, beforeStart.y, beforeDir, newBeforeDist)) continue;\r\n\r\n    const extendedAEnd = {\r\n      x: beforeStart.x + newBeforeDist * beforeDir.x,\r\n      y: beforeStart.y + newBeforeDist * beforeDir.y,\r\n    };\r\n\r\n    if (perpOffAbs >= thresholdFt) {\r\n      // Bridge insertion is opt-out: the post-compaction cleanup pass\r\n      // disables bridges since its job is to drop stubs without re-adding\r\n      // perpendicular connector walls.\r\n      if (!allowBridges) continue;\r\n      // Insert a single perpendicular bridge wall. Its length = perpOffAbs\r\n      // is ≥ threshold by construction, so it won't be classified as\r\n      // simplifiable on a later pass.\r\n      const sign = perpOff >= 0 ? 1 : -1;\r\n      const bridgeDir = { x: sign * perpDir.x, y: sign * perpDir.y };\r\n      const bridgeAngleDeg = (Math.atan2(bridgeDir.y, bridgeDir.x) * 180) / Math.PI;\r\n      const bridgeAngleNorm = ((bridgeAngleDeg % 360) + 360) % 360;\r\n\r\n      const newAfterStart = {\r\n        x: extendedAEnd.x + perpOffAbs * bridgeDir.x,\r\n        y: extendedAEnd.y + perpOffAbs * bridgeDir.y,\r\n      };\r\n      const toEndX = afterEnd.x - newAfterStart.x;\r\n      const toEndY = afterEnd.y - newAfterStart.y;\r\n      const newAfterSigned = toEndX * afterDir.x + toEndY * afterDir.y;\r\n      if (newAfterSigned < MIN_WALL_FT) continue;\r\n      if (fixtureOutside(after, newAfterStart.x, newAfterStart.y, afterDir, newAfterSigned)) continue;\r\n\r\n      // Template from a run wall to preserve schema fields the renderer\r\n      // may read (styling, elementType, etc.), then override geometry.\r\n      const template = structuredClone(walls[runIdxs[0]] ?? {});\r\n      template.elementType = \"wall\";\r\n      template.relativePosition = {\r\n        x: extendedAEnd.x,\r\n        y: extendedAEnd.y,\r\n        angle: 0,\r\n        unit: \"ft\",\r\n      };\r\n      template.angle = bridgeAngleNorm;\r\n      template.distance = Number(perpOffAbs.toFixed(4));\r\n      template.unit = \"ft\";\r\n      template.fixtures = [];\r\n      template.otherElements = [];\r\n      // Null out identity fields so the bridge doesn't duplicate a run\r\n      // wall's id in keyed renderers.\r\n      if (template.id != null) template.id = undefined;\r\n      if (template._id != null) template._id = undefined;\r\n      if (template.elementNumber != null) template.elementNumber = undefined;\r\n\r\n      before.distance = Number(newBeforeDist.toFixed(4));\r\n      before.unit = \"ft\";\r\n      after.relativePosition.x = newAfterStart.x;\r\n      after.relativePosition.y = newAfterStart.y;\r\n      after.relativePosition.unit = \"ft\";\r\n      after.distance = Number(newAfterSigned.toFixed(4));\r\n      after.unit = \"ft\";\r\n      for (const r of runIdxs) {\r\n        keep[r] = false;\r\n        removed++;\r\n      }\r\n      if (!insertionsAt.has(aIdx)) insertionsAt.set(aIdx, []);\r\n      insertionsAt.get(aIdx)!.push(template);\r\n    } else {\r\n      // Perpendicular offset is below threshold: can't legally insert a\r\n      // bridge (it would itself be a short wall). Snap B onto A's line\r\n      // colinearly — extend A, align B's start with A's extension, and\r\n      // rotate B onto A's direction.\r\n      const toEndX = afterEnd.x - extendedAEnd.x;\r\n      const toEndY = afterEnd.y - extendedAEnd.y;\r\n      const newAfterSigned = toEndX * beforeDir.x + toEndY * beforeDir.y;\r\n      if (newAfterSigned < MIN_WALL_FT) continue;\r\n      if (fixtureOutside(after, extendedAEnd.x, extendedAEnd.y, beforeDir, newAfterSigned)) continue;\r\n\r\n      before.distance = Number(newBeforeDist.toFixed(4));\r\n      before.unit = \"ft\";\r\n      // B's start moves perpendicular onto A's line — by construction the\r\n      // shift is purely perpendicular (parOff is absorbed by extending A,\r\n      // so extendedAEnd's parallel position equals afterStart's). Apply\r\n      // the same shift to every fixture/otherElement on B so they follow\r\n      // their wall instead of being left behind on B's old line — that's\r\n      // the source of the \"fixtures overlapping the wall\" pattern after a\r\n      // CAD staircase collapses.\r\n      const shiftX = extendedAEnd.x - afterStart.x;\r\n      const shiftY = extendedAEnd.y - afterStart.y;\r\n      const shiftRp = (rp: any): void => {\r\n        if (!rp) return;\r\n        const xFt = toFeet(rp.x, rp.unit ?? \"ft\");\r\n        const yFt = toFeet(rp.y, rp.unit ?? \"ft\");\r\n        rp.x = Number((xFt + shiftX).toFixed(4));\r\n        rp.y = Number((yFt + shiftY).toFixed(4));\r\n        rp.unit = \"ft\";\r\n      };\r\n      if (Array.isArray(after.fixtures)) {\r\n        after.fixtures.forEach((f: any) => shiftRp(f?.relativePosition));\r\n      }\r\n      if (Array.isArray(after.otherElements)) {\r\n        after.otherElements.forEach((oe: any) => shiftRp(oe?.relativePosition));\r\n      }\r\n      after.relativePosition.x = extendedAEnd.x;\r\n      after.relativePosition.y = extendedAEnd.y;\r\n      after.relativePosition.unit = \"ft\";\r\n      after.angle = ((before.angle ?? 0) % 360 + 360) % 360;\r\n      after.distance = Number(newAfterSigned.toFixed(4));\r\n      after.unit = \"ft\";\r\n      for (const r of runIdxs) {\r\n        keep[r] = false;\r\n        removed++;\r\n      }\r\n      // B's end has moved perpendicular onto A's line by the same amount\r\n      // its start did, so the segment immediately after B (typically the\r\n      // perpendicular wall heading into the next side of the polygon)\r\n      // would otherwise still start at B's old end, leaving an open\r\n      // corner. Move that segment's start to B's new end and recompute\r\n      // its distance to keep its OWN end fixed — that preserves closure\r\n      // with the wall after it without cascading the shift around the\r\n      // polygon.\r\n      const nextIdx = (bIdx + 1) % n;\r\n      const nextSeg = walls[nextIdx];\r\n      if (nextSeg?.relativePosition) {\r\n        const bNewEndX = extendedAEnd.x + newAfterSigned * beforeDir.x;\r\n        const bNewEndY = extendedAEnd.y + newAfterSigned * beforeDir.y;\r\n        const nx = toFeet(\r\n          nextSeg.relativePosition.x,\r\n          nextSeg.relativePosition.unit ?? \"ft\",\r\n        );\r\n        const ny = toFeet(\r\n          nextSeg.relativePosition.y,\r\n          nextSeg.relativePosition.unit ?? \"ft\",\r\n        );\r\n        const nDist = toFeet(nextSeg.distance ?? 0, nextSeg.unit ?? \"ft\");\r\n        const nAng = ((nextSeg.angle ?? 0) * Math.PI) / 180;\r\n        const nEndX = nx + nDist * Math.cos(nAng);\r\n        const nEndY = ny + nDist * Math.sin(nAng);\r\n        nextSeg.relativePosition.x = Number(bNewEndX.toFixed(4));\r\n        nextSeg.relativePosition.y = Number(bNewEndY.toFixed(4));\r\n        nextSeg.relativePosition.unit = \"ft\";\r\n        const newNDist = Math.hypot(nEndX - bNewEndX, nEndY - bNewEndY);\r\n        nextSeg.distance = Number(newNDist.toFixed(4));\r\n        nextSeg.unit = \"ft\";\r\n      }\r\n    }\r\n  }\r\n\r\n  // Reassemble: keep in original order, dropping removed walls and\r\n  // splicing bridge walls immediately after the anchor that spawned them.\r\n  const result: any[] = [];\r\n  for (let i = 0; i < walls.length; i++) {\r\n    if (keep[i]) result.push(walls[i]);\r\n    const ins = insertionsAt.get(i);\r\n    if (ins) for (const w of ins) result.push(w);\r\n  }\r\n  clone.layoutPolygon = result;\r\n  return { floor: clone, removed };\r\n}\r\n\r\n/**\r\n * Merges consecutive walls that (a) share the same direction within\r\n * COLINEAR_ANGLE_TOL_DEG and (b) meet at their shared corner within\r\n * MERGE_CHAIN_GAP_FT. After simplifyOnePass's colinear-snap path we\r\n * often leave a sequence of wall records that all point the same way\r\n * and visually form one line — this pass collapses them into a single\r\n * LayoutElement so the renderer sees one wall instead of a seam.\r\n *\r\n * Combines fixtures and otherElements from the absorbed wall into the\r\n * surviving wall. Fixture relativePositions are in floor coordinates,\r\n * so they don't need recomputation.\r\n *\r\n * Also handles the polygon wrap-around: if the last wall is colinear\r\n * with and connects to the first wall, they're merged into one record\r\n * stored at the start of the array.\r\n */\r\nfunction mergeColinearPass(floor: any): { floor: any; merged: number } {\r\n  const clone = structuredClone(floor);\r\n  const walls: any[] = Array.isArray(clone?.layoutPolygon)\r\n    ? clone.layoutPolygon\r\n    : [];\r\n  if (walls.length < 2) return { floor: clone, merged: 0 };\r\n\r\n  const angleDiff = (a: number, b: number): number => {\r\n    const d = ((((a - b) % 360) + 540) % 360) - 180;\r\n    return Math.abs(d);\r\n  };\r\n\r\n  const endOf = (w: any): { x: number; y: number } => {\r\n    const startX = toFeet(w.relativePosition.x, w.relativePosition.unit ?? \"ft\");\r\n    const startY = toFeet(w.relativePosition.y, w.relativePosition.unit ?? \"ft\");\r\n    const dist = toFeet(w.distance ?? 0, w.unit ?? \"ft\");\r\n    const r = ((w.angle ?? 0) * Math.PI) / 180;\r\n    return { x: startX + dist * Math.cos(r), y: startY + dist * Math.sin(r) };\r\n  };\r\n\r\n  const canMergePair = (a: any, b: any): boolean => {\r\n    if (a?.elementType !== \"wall\" || b?.elementType !== \"wall\") return false;\r\n    if (!a.relativePosition || !b.relativePosition) return false;\r\n    if (angleDiff(a.angle ?? 0, b.angle ?? 0) > COLINEAR_ANGLE_TOL_DEG) return false;\r\n    const aEnd = endOf(a);\r\n    const bStartX = toFeet(b.relativePosition.x, b.relativePosition.unit ?? \"ft\");\r\n    const bStartY = toFeet(b.relativePosition.y, b.relativePosition.unit ?? \"ft\");\r\n    return Math.hypot(aEnd.x - bStartX, aEnd.y - bStartY) <= MERGE_CHAIN_GAP_FT;\r\n  };\r\n\r\n  // Absorb `b`'s extent, fixtures, and otherElements into `a`. `a`'s\r\n  // direction wins; `a`'s new distance is `|bEnd - aStart|`.\r\n  const absorbInto = (a: any, b: any): void => {\r\n    const aStartX = toFeet(a.relativePosition.x, a.relativePosition.unit ?? \"ft\");\r\n    const aStartY = toFeet(a.relativePosition.y, a.relativePosition.unit ?? \"ft\");\r\n    const bEnd = endOf(b);\r\n    const newDist = Math.hypot(bEnd.x - aStartX, bEnd.y - aStartY);\r\n    a.distance = Number(newDist.toFixed(4));\r\n    a.unit = \"ft\";\r\n    if (Array.isArray(b.fixtures) && b.fixtures.length > 0) {\r\n      a.fixtures = [...(Array.isArray(a.fixtures) ? a.fixtures : []), ...b.fixtures];\r\n    }\r\n    if (Array.isArray(b.otherElements) && b.otherElements.length > 0) {\r\n      a.otherElements = [\r\n        ...(Array.isArray(a.otherElements) ? a.otherElements : []),\r\n        ...b.otherElements,\r\n      ];\r\n    }\r\n  };\r\n\r\n  const result: any[] = [];\r\n  let merged = 0;\r\n  for (const w of walls) {\r\n    const last = result[result.length - 1];\r\n    if (last && canMergePair(last, w)) {\r\n      absorbInto(last, w);\r\n      merged++;\r\n    } else {\r\n      result.push(w);\r\n    }\r\n  }\r\n\r\n  // Polygon wrap-around: last wall may join the first.\r\n  while (result.length >= 2) {\r\n    const last = result[result.length - 1];\r\n    const first = result[0];\r\n    if (!canMergePair(last, first)) break;\r\n    // Rebase `first` so its start = last's start, then absorb first's\r\n    // extent. This keeps the merged wall at index 0 without shuffling\r\n    // other indices.\r\n    const lastStartX = toFeet(last.relativePosition.x, last.relativePosition.unit ?? \"ft\");\r\n    const lastStartY = toFeet(last.relativePosition.y, last.relativePosition.unit ?? \"ft\");\r\n    const firstEnd = endOf(first);\r\n    const newDist = Math.hypot(firstEnd.x - lastStartX, firstEnd.y - lastStartY);\r\n    first.relativePosition.x = lastStartX;\r\n    first.relativePosition.y = lastStartY;\r\n    first.relativePosition.unit = \"ft\";\r\n    first.angle = ((last.angle ?? 0) % 360 + 360) % 360;\r\n    first.distance = Number(newDist.toFixed(4));\r\n    first.unit = \"ft\";\r\n    if (Array.isArray(last.fixtures) && last.fixtures.length > 0) {\r\n      first.fixtures = [\r\n        ...last.fixtures,\r\n        ...(Array.isArray(first.fixtures) ? first.fixtures : []),\r\n      ];\r\n    }\r\n    if (Array.isArray(last.otherElements) && last.otherElements.length > 0) {\r\n      first.otherElements = [\r\n        ...last.otherElements,\r\n        ...(Array.isArray(first.otherElements) ? first.otherElements : []),\r\n      ];\r\n    }\r\n    result.pop();\r\n    merged++;\r\n  }\r\n\r\n  clone.layoutPolygon = result;\r\n  return { floor: clone, merged };\r\n}\r\n\r\n/**\r\n * Iterated polygon simplification. Each pass runs simplifyOnePass (drops\r\n * short-wall runs, inserts bridges) followed by mergeColinearPass\r\n * (collapses consecutive colinear walls into one). Stops as soon as a\r\n * full pass produces no removals or merges, or MAX_SIMPLIFY_PASSES is\r\n * reached. The alternation matters: simplifyOnePass often leaves\r\n * adjacent walls colinear via its colinear-snap path, and merging them\r\n * exposes cleaner anchors for the next simplify pass.\r\n */\r\nfunction simplifyShortWalls(\r\n  floor: any,\r\n  thresholdFt: number,\r\n  options: SimplifyOptions = {},\r\n): any {\r\n  let current = floor;\r\n  for (let pass = 0; pass < MAX_SIMPLIFY_PASSES; pass++) {\r\n    const sr = simplifyOnePass(current, thresholdFt, options);\r\n    const mr = mergeColinearPass(sr.floor);\r\n    current = mr.floor;\r\n    if (sr.removed === 0 && mr.merged === 0) return current;\r\n  }\r\n  return current;\r\n}\r\n\r\n/**\r\n * High-level compaction pipeline:\r\n *   1. Simplify CAD staircase micro-segments (remove useless tiny walls).\r\n *   2. Detect the layout's principal tilt angle and rotate into the\r\n *      principal frame so per-axis compaction sees a box-shaped store.\r\n *   3. Run axis compaction.\r\n *   4. Rotate back.\r\n *\r\n * Skips rotation when the layout is already within 1° of axis-aligned\r\n * to avoid numerical drift. If the layout is too irregular to find\r\n * useful gaps, the result is effectively identical to the input\r\n * (silent no-op).\r\n */\r\nexport function compactFloor(\r\n  floor: any,\r\n  cfg: CompactionConfig = DEFAULT_COMPACTION_CONFIG,\r\n): any {\r\n  if (!floor) return floor;\r\n\r\n  const simplified = simplifyShortWalls(floor, SHORT_WALL_THRESHOLD_FT);\r\n\r\n  const theta = computePrincipalAngle(simplified);\r\n  const needsRotation = Math.abs(theta) > 1;\r\n  const pivot = needsRotation\r\n    ? computeWallCentroid(simplified)\r\n    : { x: 0, y: 0 };\r\n\r\n  const aligned = needsRotation\r\n    ? rotateFloorCoords(simplified, pivot, -theta)\r\n    : simplified;\r\n  const remap = computeAxisRemap(aligned, cfg);\r\n  const compacted = applyRemapToFloor(aligned, remap);\r\n  // Post-remap cleanup: the axis remap can flatten previously-perpendicular\r\n  // walls into the same line (e.g. a short connector that compressed to\r\n  // near-zero leaves its two neighbours colinear) and `applyRemapToFloor`\r\n  // syncs each wall's angle to its post-remap direction, so a final pass\r\n  // through mergeColinearPass collapses those into single records and\r\n  // eliminates the \"stacked walls at one corner\" artifact.\r\n  const merged = mergeColinearPass(compacted).floor;\r\n  // Compaction can compress a once-tall connector wall (say, 6 ft) down to\r\n  // a sub-foot stub at a corner. The pre-remap simplify can't see this —\r\n  // those walls were anchors at that point. Run simplify again here to\r\n  // drop newly-tiny stubs, with bridges disabled so we never re-grow the\r\n  // polygon with perpendicular connector walls during cleanup.\r\n  const cleaned = simplifyShortWalls(merged, SHORT_WALL_THRESHOLD_FT, {\r\n    allowBridges: false,\r\n  });\r\n  return needsRotation ? rotateFloorCoords(cleaned, pivot, theta) : cleaned;\r\n}\r\n\r\n/**\r\n * Stamps every wall fixture with the elementNumber of the wall it sits\r\n * on at the moment of tagging. The tag survives structuredClone, so\r\n * after compaction we can recover \"where did this fixture originally\r\n * come from\" without maintaining an external map. Stripped at the end\r\n * of the destructive pipeline.\r\n */\r\nfunction tagFixturesWithOriginalWall(floor: any): void {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  for (const w of walls) {\r\n    if (w?.elementType !== \"wall\") continue;\r\n    if (!Array.isArray(w.fixtures)) continue;\r\n    for (const f of w.fixtures) {\r\n      if (!f) continue;\r\n      f.__origWallElementNumber = w.elementNumber;\r\n    }\r\n  }\r\n}\r\n\r\nfunction stripFixtureTags(floor: any): void {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  for (const w of walls) {\r\n    if (!Array.isArray(w?.fixtures)) continue;\r\n    for (const f of w.fixtures) {\r\n      if (f && \"__origWallElementNumber\" in f) {\r\n        delete f.__origWallElementNumber;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\ninterface SegmentDistance {\r\n  /** Perpendicular distance from the query point to the wall segment,\r\n   *  measured AFTER clamping the projection to the segment's extent. */\r\n  dist: number;\r\n  /** Unclamped parametric position along the segment (0 = start, 1 = end). */\r\n  t: number;\r\n  /** Projected point on the segment, clamped to [0, 1]. */\r\n  qx: number;\r\n  qy: number;\r\n  /** True iff the unclamped t is in [0, 1] (with small epsilon). */\r\n  withinExtent: boolean;\r\n}\r\n\r\nfunction pointToWallSegment(\r\n  px: number,\r\n  py: number,\r\n  wall: any,\r\n): SegmentDistance {\r\n  const ax = toFeet(wall.relativePosition.x, wall.relativePosition.unit ?? \"ft\");\r\n  const ay = toFeet(wall.relativePosition.y, wall.relativePosition.unit ?? \"ft\");\r\n  const dist = toFeet(wall.distance ?? 0, wall.unit ?? \"ft\");\r\n  const angleRad = ((wall.angle ?? 0) * Math.PI) / 180;\r\n  const bx = ax + dist * Math.cos(angleRad);\r\n  const by = ay + dist * Math.sin(angleRad);\r\n  const dx = bx - ax;\r\n  const dy = by - ay;\r\n  const len2 = dx * dx + dy * dy;\r\n  if (len2 < 1e-9) {\r\n    return {\r\n      dist: Math.hypot(px - ax, py - ay),\r\n      t: 0,\r\n      qx: ax,\r\n      qy: ay,\r\n      withinExtent: true,\r\n    };\r\n  }\r\n  const t = ((px - ax) * dx + (py - ay) * dy) / len2;\r\n  const tClamped = Math.max(0, Math.min(1, t));\r\n  const qx = ax + tClamped * dx;\r\n  const qy = ay + tClamped * dy;\r\n  return {\r\n    dist: Math.hypot(px - qx, py - qy),\r\n    t,\r\n    qx,\r\n    qy,\r\n    withinExtent: t >= -1e-3 && t <= 1 + 1e-3,\r\n  };\r\n}\r\n\r\n/**\r\n * Reassigns wall fixtures that have drifted off their assigned wall after\r\n * compaction. Drift can come from two sources:\r\n *\r\n *   - mergeColinearPass absorbing one wall's fixtures into a longer\r\n *     surviving wall (the absorbed wall's elementNumber is gone, so the\r\n *     fixtures' __origWallElementNumber tag points to a missing wall);\r\n *   - simplifyOnePass snapping an anchor wall onto a different line,\r\n *     leaving its fixtures up to ~thresholdFt away from the new segment.\r\n *\r\n * Algorithm:\r\n *   1. For every wall fixture, compute perp distance + projection extent\r\n *      against its current wall. Mark drifted ones (perp > tol or\r\n *      projection outside extent).\r\n *   2. Group drifted fixtures by their __origWallElementNumber tag.\r\n *      Fixtures missing a tag fall back to grouping by current wall.\r\n *   3. For each group, pick a single destination wall: the surviving\r\n *      wall whose segment minimizes perp distance from the group's\r\n *      centroid. Walls where the centroid actually projects within\r\n *      the segment are preferred over walls where it doesn't.\r\n *   4. For each fixture in the group, project its current position\r\n *      onto the destination wall (clamped to extent) and move it into\r\n *      the destination wall's fixtures[] array.\r\n *\r\n * The \"all fixtures from one original wall to one destination\" rule\r\n * comes from grouping at step 2 before destination selection at step 3.\r\n */\r\nfunction reassignOrphanedFixtures(floor: any): void {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  const surviving = walls.filter((w: any) => w?.elementType === \"wall\");\r\n  if (!surviving.length) return;\r\n\r\n  type DriftedEntry = {\r\n    fixture: any;\r\n    currentWall: any;\r\n    origElementNumber: number | undefined;\r\n  };\r\n  const drifted: DriftedEntry[] = [];\r\n\r\n  for (const w of surviving) {\r\n    if (!Array.isArray(w.fixtures)) continue;\r\n    for (const f of w.fixtures) {\r\n      if (!f?.relativePosition) continue;\r\n      const fx = toFeet(f.relativePosition.x, f.relativePosition.unit ?? \"ft\");\r\n      const fy = toFeet(f.relativePosition.y, f.relativePosition.unit ?? \"ft\");\r\n      const seg = pointToWallSegment(fx, fy, w);\r\n      const isOnWall =\r\n        seg.dist <= WALL_FIXTURE_DRIFT_TOL_FT && seg.withinExtent;\r\n      if (!isOnWall) {\r\n        drifted.push({\r\n          fixture: f,\r\n          currentWall: w,\r\n          origElementNumber: f.__origWallElementNumber,\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  if (!drifted.length) return;\r\n\r\n  const groups = new Map<string, DriftedEntry[]>();\r\n  for (const d of drifted) {\r\n    const key =\r\n      d.origElementNumber != null\r\n        ? `orig:${d.origElementNumber}`\r\n        : `cur:${d.currentWall.elementNumber}`;\r\n    const arr = groups.get(key) ?? [];\r\n    arr.push(d);\r\n    groups.set(key, arr);\r\n  }\r\n\r\n  for (const group of groups.values()) {\r\n    let cx = 0;\r\n    let cy = 0;\r\n    for (const d of group) {\r\n      cx += toFeet(\r\n        d.fixture.relativePosition.x,\r\n        d.fixture.relativePosition.unit ?? \"ft\",\r\n      );\r\n      cy += toFeet(\r\n        d.fixture.relativePosition.y,\r\n        d.fixture.relativePosition.unit ?? \"ft\",\r\n      );\r\n    }\r\n    cx /= group.length;\r\n    cy /= group.length;\r\n\r\n    let bestWall: any = null;\r\n    let bestScore = Infinity;\r\n    for (const w of surviving) {\r\n      const seg = pointToWallSegment(cx, cy, w);\r\n      // Penalize walls where the centroid lies outside the segment so a\r\n      // truly nearby wall always wins over a far wall the centroid\r\n      // happens to be perpendicular to.\r\n      const score = seg.withinExtent ? seg.dist : seg.dist + 1000;\r\n      if (score < bestScore) {\r\n        bestScore = score;\r\n        bestWall = w;\r\n      }\r\n    }\r\n    if (!bestWall) continue;\r\n\r\n    const bestAx = toFeet(\r\n      bestWall.relativePosition.x,\r\n      bestWall.relativePosition.unit ?? \"ft\",\r\n    );\r\n    const bestAy = toFeet(\r\n      bestWall.relativePosition.y,\r\n      bestWall.relativePosition.unit ?? \"ft\",\r\n    );\r\n    const bestLen = toFeet(bestWall.distance ?? 0, bestWall.unit ?? \"ft\");\r\n    const bestAngleRad = ((bestWall.angle ?? 0) * Math.PI) / 180;\r\n    const bestDx = Math.cos(bestAngleRad);\r\n    const bestDy = Math.sin(bestAngleRad);\r\n\r\n    for (const d of group) {\r\n      const fx = toFeet(\r\n        d.fixture.relativePosition.x,\r\n        d.fixture.relativePosition.unit ?? \"ft\",\r\n      );\r\n      const fy = toFeet(\r\n        d.fixture.relativePosition.y,\r\n        d.fixture.relativePosition.unit ?? \"ft\",\r\n      );\r\n      // Decompose the fixture's position into longitudinal (along wall) and\r\n      // perpendicular (across wall) components. Clamp longitudinal to the\r\n      // wall's extent so it stays on the segment, but PRESERVE the perpendicular\r\n      // offset — Fabric draws fixtures with a top-left origin, so a fixture's\r\n      // relativePosition is its top-left corner, not its center. For top/left\r\n      // walls that offset is ~0; for bottom/right walls it is -H or -W. Snapping\r\n      // perpendicular to 0 would flip the fixture to the wrong side of the wall.\r\n      const tLong = (fx - bestAx) * bestDx + (fy - bestAy) * bestDy;\r\n      const tPerp = -(fx - bestAx) * bestDy + (fy - bestAy) * bestDx;\r\n      const tLongClamped = Math.max(0, Math.min(bestLen, tLong));\r\n      // Cap the preserved perpendicular offset to the fixture's own extent so a\r\n      // wildly drifted fixture doesn't end up floating across the layout.\r\n      const fixL = toFeet(\r\n        d.fixture.fixtureStaticLength?.value ?? 0,\r\n        d.fixture.fixtureStaticLength?.unit ?? \"ft\",\r\n      );\r\n      const fixW = toFeet(\r\n        d.fixture.fixtureStaticWidth?.value ?? 0,\r\n        d.fixture.fixtureStaticWidth?.unit ?? \"ft\",\r\n      );\r\n      const maxPerp = Math.max(fixL, fixW);\r\n      const tPerpClamped =\r\n        Math.abs(tPerp) > maxPerp && maxPerp > 0\r\n          ? Math.sign(tPerp) * maxPerp\r\n          : tPerp;\r\n      const newX =\r\n        bestAx + tLongClamped * bestDx + tPerpClamped * -bestDy;\r\n      const newY =\r\n        bestAy + tLongClamped * bestDy + tPerpClamped * bestDx;\r\n      d.fixture.relativePosition.x = Number(newX.toFixed(4));\r\n      d.fixture.relativePosition.y = Number(newY.toFixed(4));\r\n      d.fixture.relativePosition.unit = \"ft\";\r\n      if (d.currentWall !== bestWall) {\r\n        const idx = d.currentWall.fixtures.indexOf(d.fixture);\r\n        if (idx >= 0) d.currentWall.fixtures.splice(idx, 1);\r\n        if (!Array.isArray(bestWall.fixtures)) bestWall.fixtures = [];\r\n        bestWall.fixtures.push(d.fixture);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\ninterface FixtureBox {\r\n  minX: number;\r\n  maxX: number;\r\n  minY: number;\r\n  maxY: number;\r\n}\r\n\r\nfunction fixtureAabb(f: any): FixtureBox | null {\r\n  const rp = f?.relativePosition;\r\n  if (!rp) return null;\r\n  const tlx = toFeet(rp.x, rp.unit ?? \"ft\");\r\n  const tly = toFeet(rp.y, rp.unit ?? \"ft\");\r\n  const L = toFeet(\r\n    f.fixtureStaticLength?.value ?? 0,\r\n    f.fixtureStaticLength?.unit ?? \"ft\",\r\n  );\r\n  const W = toFeet(\r\n    f.fixtureStaticWidth?.value ?? 0,\r\n    f.fixtureStaticWidth?.unit ?? \"ft\",\r\n  );\r\n  return fixtureWorldAabb(tlx, tly, W, L, rp.angle ?? 0);\r\n}\r\n\r\nfunction aabbsOverlap(a: FixtureBox, b: FixtureBox): boolean {\r\n  return (\r\n    a.maxX >= b.minX &&\r\n    a.minX <= b.maxX &&\r\n    a.maxY >= b.minY &&\r\n    a.minY <= b.maxY\r\n  );\r\n}\r\n\r\n/**\r\n * Slides each floor (centerFixture) fixture along the line from its\r\n * center toward the layout's wall centroid, in OVERLAP_SLIDE_STEP_FT\r\n * increments, until it no longer overlaps any wall fixture's AABB —\r\n * or until the slide budget MAX_OVERLAP_SLIDE_FT is exhausted.\r\n *\r\n * Wall fixtures are anchored to their wall and are never moved here.\r\n * Floor-vs-floor and wall-vs-wall overlaps are not addressed in this\r\n * pass; the per-fixture loop is structured so adding them later is a\r\n * straightforward extension (collect into one list, double-loop, pick\r\n * which side slides per pair).\r\n *\r\n * Ghost fixtures and \"space\" placeholders are excluded — they're UI\r\n * scaffolding, not real fixtures.\r\n */\r\nfunction resolveFixtureOverlaps(floor: any): void {\r\n  const walls: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  const isReal = (f: any): boolean => {\r\n    if (!f || f.ghost === true) return false;\r\n    if (\r\n      typeof f.fixtureName === \"string\" &&\r\n      f.fixtureName.toLowerCase() === \"space\"\r\n    ) {\r\n      return false;\r\n    }\r\n    return true;\r\n  };\r\n\r\n  const wallFixtures: any[] = [];\r\n  for (const w of walls) {\r\n    if (!Array.isArray(w?.fixtures)) continue;\r\n    for (const f of w.fixtures) if (isReal(f)) wallFixtures.push(f);\r\n  }\r\n  const floorFixtures: any[] = Array.isArray(floor?.centerFixture)\r\n    ? floor.centerFixture.filter(isReal)\r\n    : [];\r\n  if (!wallFixtures.length || !floorFixtures.length) return;\r\n\r\n  const centroid = computeWallCentroid(floor);\r\n\r\n  for (const ff of floorFixtures) {\r\n    const maxIters = Math.ceil(MAX_OVERLAP_SLIDE_FT / OVERLAP_SLIDE_STEP_FT);\r\n    for (let i = 0; i < maxIters; i++) {\r\n      const ffAabb = fixtureAabb(ff);\r\n      if (!ffAabb) break;\r\n      let hit: any = null;\r\n      for (const wf of wallFixtures) {\r\n        const wfAabb = fixtureAabb(wf);\r\n        if (!wfAabb) continue;\r\n        if (aabbsOverlap(ffAabb, wfAabb)) {\r\n          hit = wfAabb;\r\n          break;\r\n        }\r\n      }\r\n      if (!hit) break;\r\n      const fx = toFeet(\r\n        ff.relativePosition.x,\r\n        ff.relativePosition.unit ?? \"ft\",\r\n      );\r\n      const fy = toFeet(\r\n        ff.relativePosition.y,\r\n        ff.relativePosition.unit ?? \"ft\",\r\n      );\r\n      const dx = centroid.x - fx;\r\n      const dy = centroid.y - fy;\r\n      const mag = Math.hypot(dx, dy);\r\n      if (mag < 1e-6) break;\r\n      ff.relativePosition.x = Number(\r\n        (fx + (dx / mag) * OVERLAP_SLIDE_STEP_FT).toFixed(4),\r\n      );\r\n      ff.relativePosition.y = Number(\r\n        (fy + (dy / mag) * OVERLAP_SLIDE_STEP_FT).toFixed(4),\r\n      );\r\n      ff.relativePosition.unit = \"ft\";\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Renumbers walls so that the wall immediately following the entrance\r\n * (in layoutPolygon array order) becomes wall 1, the next wall is 2,\r\n * and so on. Also cyclically rotates the polygon array so the entrance\r\n * sits at the END — this keeps array order in sync with the assigned\r\n * elementNumbers, so the left-side panel (which iterates layoutPolygon\r\n * in array order) renders walls as Wall 1, 2, 3, … N instead of\r\n * starting somewhere in the middle.\r\n *\r\n * Non-wall elements (entrances, partitions) are skipped without\r\n * consuming a number. If no entrance is present, falls back to numbering\r\n * walls 1..N in existing array order (matches the legacy\r\n * updateWallElementNumber behavior so we never regress for hand-drawn\r\n * floors with no entrance).\r\n *\r\n * Cyclic rotation is geometry-preserving: walls connect via their\r\n * absolute start/end coordinates, so changing the array's \"starting\r\n * point\" does not break polygon closure.\r\n *\r\n * Assumes the polygon is already in clockwise order — today's CAD\r\n * extractor produces CW order, and updateWallElementNumber relies on\r\n * the same assumption. If we ever observe CCW data we'll add an\r\n * orientation check, but the current pipeline does not require one.\r\n */\r\nfunction renumberWallsClockwiseFromEntrance(floor: any): void {\r\n  const polygon: any[] = Array.isArray(floor?.layoutPolygon)\r\n    ? floor.layoutPolygon\r\n    : [];\r\n  if (!polygon.length) return;\r\n  const entranceIdx = polygon.findIndex(\r\n    (el: any) => el?.elementType === \"entrance\",\r\n  );\r\n  if (entranceIdx >= 0) {\r\n    // Rotate so the wall after the entrance is at index 0 and the\r\n    // entrance ends up at the last index.\r\n    const rotated = [\r\n      ...polygon.slice(entranceIdx + 1),\r\n      ...polygon.slice(0, entranceIdx),\r\n      polygon[entranceIdx],\r\n    ];\r\n    floor.layoutPolygon = rotated;\r\n  }\r\n  const renumbered: any[] = floor.layoutPolygon;\r\n  let nextNumber = 1;\r\n  for (const el of renumbered) {\r\n    if (el?.elementType === \"wall\") {\r\n      el.elementNumber = nextNumber++;\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Destructive sibling of compactFloor. Runs the visual compaction\r\n * pipeline plus the cleanup steps required to make the result a valid\r\n * canonical floor representation:\r\n *\r\n *   1. Tag every wall fixture with its current wall's elementNumber so\r\n *      we can recover original assignments after walls are removed or\r\n *      merged.\r\n *   2. Run the existing visual compaction (simplify short walls, axis\r\n *      remap with rotation into the principal frame).\r\n *   3. Reassign any wall fixture that drifted off its wall during\r\n *      compaction to the nearest surviving wall, projecting its\r\n *      position onto that wall's segment. All fixtures from one\r\n *      original wall land on a single destination wall.\r\n *   4. Slide floor fixtures out of any AABB overlap with wall fixtures.\r\n *   5. Renumber surviving walls clockwise starting from the wall after\r\n *      the entrance.\r\n *   6. Strip the snapshot tags so the returned object matches the\r\n *      regular floor schema.\r\n *\r\n * The caller is expected to follow up with:\r\n *   - reorderFixture(floor) on the component side, to refresh every\r\n *     fixture's associatedElementNumber and associatedElementFixtureNumber\r\n *     against the new wall numbering;\r\n *   - a form-rebuilding render so the left-panel form reflects the new\r\n *     wall and fixture layout.\r\n *\r\n * The input floor is never mutated.\r\n */\r\nexport function compactFloorDestructive(\r\n  floor: any,\r\n  cfg: CompactionConfig = DEFAULT_COMPACTION_CONFIG,\r\n): any {\r\n  if (!floor) return floor;\r\n  const working = structuredClone(floor);\r\n  tagFixturesWithOriginalWall(working);\r\n  const compacted = compactFloor(working, cfg);\r\n  reassignOrphanedFixtures(compacted);\r\n  resolveFixtureOverlaps(compacted);\r\n  renumberWallsClockwiseFromEntrance(compacted);\r\n  stripFixtureTags(compacted);\r\n  return compacted;\r\n}\r\n\r\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\n\r\n@Component({\r\n  selector: \"ivm-logic-explorer\",\r\n  templateUrl: \"./ivm-logic-explorer.component.html\",\r\n  styleUrl: \"./ivm-logic-explorer.component.scss\",\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n})\r\nexport class IvmLogicExplorerComponent implements OnChanges {\r\n  @Input() fixtures: any[] = [];\r\n  @Input() selectedFixture: any = null;\r\n\r\n  allocationLogic = [\r\n    {\r\n      templateGroupName: 'VC Eye / LK Air',\r\n      header: [\r\n        { name: 'Trending', color: '#EAF8FF' },\r\n        { name: 'Innovation', color: '#FFFAEB' },\r\n        { name: 'Work Essentials', color: '#ECFDF3' }\r\n      ],\r\n      type: \"value\"\r\n    },\r\n    {\r\n      templateGroupName: 'VC Sun',\r\n      header: [\r\n        { name: 'Shades', color: '#FEF3C7' }\r\n      ],\r\n      type: \"value\"\r\n    },\r\n    {\r\n      templateGroupName: 'Hooper',\r\n      header: [\r\n        { name: 'Kids', color: '#FCE7F3' }\r\n      ],\r\n      type: \"value\"\r\n    },\r\n    {\r\n      templateGroupName: 'Tentpole',\r\n      header: [\r\n        { name: 'Tentpole', color: '#D1FAE5' }\r\n      ],\r\n      type: \"value\"\r\n    },\r\n    {\r\n      templateGroupName: 'Hustlr',\r\n      header: [\r\n        { name: 'Hustlr', color: '#E0E7FF' }\r\n      ],\r\n      type: \"value\"\r\n    },\r\n    {\r\n      templateGroupName: 'JJ Eye + OD',\r\n      header: [\r\n        { name: 'Premium Trending', color: '#F4F3FF' },\r\n        { name: 'Premium Work', color: '#D9D6FE' }\r\n      ],\r\n      type: \"premium\"\r\n    },\r\n    {\r\n      templateGroupName: 'JJ Sun',\r\n      header: [\r\n        { name: 'Premium Shades', color: '#FDF2F8' }\r\n      ],\r\n      type: \"premium\"\r\n    },\r\n    {\r\n      templateGroupName: 'LPL',\r\n      header: [\r\n        { name: 'Premium Trending', color: '#F4F3FF' }\r\n      ],\r\n      type: \"premium\"\r\n    },\r\n    {\r\n      templateGroupName: 'Fossil',\r\n      header: [\r\n        { name: 'Premium Trending', color: '#F4F3FF' }\r\n      ],\r\n      type: \"premium\"\r\n    },\r\n    {\r\n      templateGroupName: 'Meller',\r\n      header: [\r\n        { name: 'Premium Shades', color: '#FDF2F8' }\r\n      ],\r\n      type: \"premium\"\r\n    },\r\n  ];\r\n\r\n  processedData: any[] = [];\r\n  userJourney: { value: number; premium: number } = { value: 0, premium: 0 };\r\n  firstType: 'value' | 'premium' | null = null;\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['fixtures'] || changes['selectedFixture']) {\r\n      this.processFixtures();\r\n    }\r\n  }\r\n\r\n  processFixtures() {\r\n    // const fixturesToProcess = this.selectedFixture \r\n    //   ? [this.selectedFixture] \r\n    //   : (this.fixtures || []);\r\n    \r\n    const fixturesToProcess = this.fixtures || []\r\n\r\n    const valueGroups = [\"VC Eye / LK Air\", \"VC Sun\", \"Hooper\", \"Tentpole\", \"Hustlr\"];\r\n    const premiumGroups = [\"JJ Eye + OD\", \"JJ Sun\", \"LPL\", \"Fossil\", \"Meller\"];\r\n\r\n    const groupedFixtures: any = {};\r\n    const seenFixtures = new Set<string>();\r\n    let valueCount = 0;\r\n    let premiumCount = 0;\r\n    let firstValueFixtureNumber: number | null = null;\r\n    let firstPremiumFixtureNumber: number | null = null;\r\n\r\n    fixturesToProcess.forEach((fixture: any) => {\r\n      const templateGroup = fixture?.templateGroupName?.trim();\r\n\r\n      if (!templateGroup) return;\r\n\r\n      const logicItem = this.allocationLogic.find(\r\n        (item) => item.templateGroupName === templateGroup\r\n      );\r\n\r\n      if (logicItem) {\r\n        const fixtureId = fixture._id || \r\n          fixture.id || \r\n          `${fixture.fixtureNumber || fixture.associatedElementFixtureNumber || ''}_${templateGroup}_${fixture?.header?.label || ''}`;\r\n        \r\n        if (seenFixtures.has(fixtureId)) {\r\n          return;\r\n        }\r\n        \r\n        seenFixtures.add(fixtureId);\r\n        \r\n        const fixtureNumber = fixture.fixtureNumber || fixture.associatedElementFixtureNumber || Infinity;\r\n        \r\n        if (valueGroups.includes(templateGroup)) {\r\n          valueCount++;\r\n          if (firstValueFixtureNumber === null || fixtureNumber < firstValueFixtureNumber) {\r\n            firstValueFixtureNumber = fixtureNumber;\r\n          }\r\n        } else if (premiumGroups.includes(templateGroup)) {\r\n          premiumCount++;\r\n          if (firstPremiumFixtureNumber === null || fixtureNumber < firstPremiumFixtureNumber) {\r\n            firstPremiumFixtureNumber = fixtureNumber;\r\n          }\r\n        }\r\n        \r\n        if (!groupedFixtures[templateGroup]) {\r\n          groupedFixtures[templateGroup] = {\r\n            templateGroupName: templateGroup,\r\n            type: logicItem.type,\r\n            fixtures: []\r\n          };\r\n        }\r\n        \r\n        const shelfConfig = fixture.shelfConfig || [];\r\n        const zoneBrandGroups: any = {};\r\n        \r\n        shelfConfig.forEach((shelf: any) => {\r\n          const zone = shelf.zone || 'Unknown';\r\n          const brand = shelf.productBrandName || 'N/A';\r\n          const zoneBrandKey = `${zone}_${brand}`;\r\n          \r\n          if (!zoneBrandGroups[zoneBrandKey]) {\r\n            zoneBrandGroups[zoneBrandKey] = {\r\n              zone: zone,\r\n              brand: brand\r\n            };\r\n          }\r\n        });\r\n        \r\n        const headerLabel = fixture?.header?.label?.trim();\r\n        let headerColor = '#F2F4F7';\r\n        let dividerColor = '#D0D5DD';\r\n        \r\n        if (headerLabel) {\r\n          const headerConfig = logicItem.header.find((h: any) => {\r\n            if (typeof h === 'string') {\r\n              return h === headerLabel;\r\n            }\r\n            return h.name === headerLabel;\r\n          });\r\n          \r\n          if (headerConfig) {\r\n            if (typeof headerConfig === 'object' && headerConfig.color) {\r\n              headerColor = headerConfig.color;\r\n              dividerColor = this.darkenColor(headerConfig.color, 0.2);\r\n            }\r\n          }\r\n        }\r\n        \r\n        const processedFixture = {\r\n          ...fixture,\r\n          groupedShelves: Object.values(zoneBrandGroups),\r\n          headerColor: headerColor,\r\n          dividerColor: dividerColor\r\n        };\r\n        \r\n        groupedFixtures[templateGroup].fixtures.push(processedFixture);\r\n      }\r\n    });\r\n\r\n    this.userJourney = { value: valueCount, premium: premiumCount };\r\n    \r\n    // Determine which type appears first based on fixture numbering\r\n    if (firstValueFixtureNumber !== null && firstPremiumFixtureNumber !== null) {\r\n      this.firstType = firstValueFixtureNumber < firstPremiumFixtureNumber ? 'value' : 'premium';\r\n    } else if (firstValueFixtureNumber !== null) {\r\n      this.firstType = 'value';\r\n    } else if (firstPremiumFixtureNumber !== null) {\r\n      this.firstType = 'premium';\r\n    } else {\r\n      this.firstType = null;\r\n    }\r\n\r\n    this.processedData = Object.values(groupedFixtures).map((group: any) => {\r\n      return {\r\n        ...group,\r\n        fixtures: group.fixtures.sort((a: any, b: any) => {\r\n          const aNum = a.fixtureNumber || a.associatedElementFixtureNumber || 0;\r\n          const bNum = b.fixtureNumber || b.associatedElementFixtureNumber || 0;\r\n          return aNum - bNum;\r\n        })\r\n      };\r\n    });\r\n  }\r\n\r\n  onClickViewSheet() {\r\n    const url = 'https://docs.google.com/spreadsheets/d/1AFi3wQn3wl_RCst_TPamqxF5u_JbFlnJcDZBRJwGBG4/edit?gid=1104514994#gid=1104514994';\r\n    window.open(url, '_blank');\r\n  }\r\n\r\n  darkenColor(color: string, amount: number): string {\r\n    const hex = color.replace('#', '');\r\n    \r\n    const r = parseInt(hex.substring(0, 2), 16);\r\n    const g = parseInt(hex.substring(2, 4), 16);\r\n    const b = parseInt(hex.substring(4, 6), 16);\r\n    \r\n    const newR = Math.max(0, Math.floor(r * (1 - amount)));\r\n    const newG = Math.max(0, Math.floor(g * (1 - amount)));\r\n    const newB = Math.max(0, Math.floor(b * (1 - amount)));\r\n    \r\n    const toHex = (n: number) => {\r\n      const hex = n.toString(16);\r\n      return hex.length === 1 ? '0' + hex : hex;\r\n    };\r\n    \r\n    return `#${toHex(newR)}${toHex(newG)}${toHex(newB)}`;\r\n  }\r\n}\r\n","<section id=\"ivm-logic-explorer\">\r\n  <div class=\"d-flex justify-content-between align-items-center my-5\">\r\n    <h1>\r\n      Allocation Logic Applied\r\n    </h1>\r\n\r\n    <button type=\"button\" class=\"btn btn-outline d-flex align-items-center bg-white\" (click)=\"onClickViewSheet()\">\r\n      <svg class=\"me-2\" width=\"20\" height=\"15\" viewBox=\"0 0 20 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M0.833984 7.50163C0.833984 7.50163 4.16732 0.834961 10.0007 0.834961C15.834 0.834961 19.1673 7.50163 19.1673 7.50163C19.1673 7.50163 15.834 14.1683 10.0007 14.1683C4.16732 14.1683 0.833984 7.50163 0.833984 7.50163Z\"\r\n          stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        <path\r\n          d=\"M10.0007 10.0016C11.3814 10.0016 12.5007 8.88234 12.5007 7.50163C12.5007 6.12092 11.3814 5.00163 10.0007 5.00163C8.61994 5.00163 7.50065 6.12092 7.50065 7.50163C7.50065 8.88234 8.61994 10.0016 10.0007 10.0016Z\"\r\n          stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n      <span>View logic sheet</span>\r\n      \r\n    </button>\r\n  </div>\r\n\r\n  <div class=\"explorer-body\">\r\n\r\n    <h2>User Journey:</h2>\r\n\r\n    <div class=\"d-flex align-items-center mb-7\">\r\n      <div class=\"badge block\">Entrance</div>\r\n      <svg width=\"15\" height=\"8\" viewBox=\"0 0 15 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path\r\n          d=\"M14.3536 4.03568C14.5488 3.84042 14.5488 3.52384 14.3536 3.32858L11.1716 0.146595C10.9763 -0.0486672 10.6597 -0.0486672 10.4645 0.146595C10.2692 0.341857 10.2692 0.65844 10.4645 0.853702L13.2929 3.68213L10.4645 6.51056C10.2692 6.70582 10.2692 7.0224 10.4645 7.21766C10.6597 7.41293 10.9763 7.41293 11.1716 7.21766L14.3536 4.03568ZM0 3.68213V4.18213H14V3.68213V3.18213H0V3.68213Z\"\r\n          fill=\"#344054\" />\r\n      </svg>\r\n      \r\n      <!-- Show Value first if it appears first in numbering -->\r\n      <ng-container *ngIf=\"firstType === 'value' || (firstType === null && userJourney.value > 0)\">\r\n        <div class=\"badge value\" *ngIf=\"userJourney.value > 0\">Value ({{ userJourney.value }})</div>\r\n        <svg *ngIf=\"userJourney.value > 0 && userJourney.premium > 0\" width=\"15\" height=\"8\" viewBox=\"0 0 15 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M14.3536 4.03568C14.5488 3.84042 14.5488 3.52384 14.3536 3.32858L11.1716 0.146595C10.9763 -0.0486672 10.6597 -0.0486672 10.4645 0.146595C10.2692 0.341857 10.2692 0.65844 10.4645 0.853702L13.2929 3.68213L10.4645 6.51056C10.2692 6.70582 10.2692 7.0224 10.4645 7.21766C10.6597 7.41293 10.9763 7.41293 11.1716 7.21766L14.3536 4.03568ZM0 3.68213V4.18213H14V3.68213V3.18213H0V3.68213Z\"\r\n            fill=\"#344054\" />\r\n        </svg>\r\n        <div class=\"badge premium\" *ngIf=\"userJourney.premium > 0\">Premium ({{ userJourney.premium }})</div>\r\n      </ng-container>\r\n      \r\n      <!-- Show Premium first if it appears first in numbering -->\r\n      <ng-container *ngIf=\"firstType === 'premium'\">\r\n        <div class=\"badge premium\" *ngIf=\"userJourney.premium > 0\">Premium ({{ userJourney.premium }})</div>\r\n        <svg *ngIf=\"userJourney.value > 0 && userJourney.premium > 0\" width=\"15\" height=\"8\" viewBox=\"0 0 15 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path\r\n            d=\"M14.3536 4.03568C14.5488 3.84042 14.5488 3.52384 14.3536 3.32858L11.1716 0.146595C10.9763 -0.0486672 10.6597 -0.0486672 10.4645 0.146595C10.2692 0.341857 10.2692 0.65844 10.4645 0.853702L13.2929 3.68213L10.4645 6.51056C10.2692 6.70582 10.2692 7.0224 10.4645 7.21766C10.6597 7.41293 10.9763 7.41293 11.1716 7.21766L14.3536 4.03568ZM0 3.68213V4.18213H14V3.68213V3.18213H0V3.68213Z\"\r\n            fill=\"#344054\" />\r\n        </svg>\r\n        <div class=\"badge value\" *ngIf=\"userJourney.value > 0\">Value ({{ userJourney.value }})</div>\r\n      </ng-container>\r\n\r\n    </div>\r\n\r\n    <ng-container *ngFor=\"let group of processedData\">\r\n      <div class=\"mb-7\" *ngIf=\"group.fixtures.length > 0\">\r\n        <div class=\"d-flex align-items-center gap-3\">\r\n          <h2>If {{ group.fixtures.length }} fixture{{ group.fixtures.length > 1 ? 's have' : ' has' }} {{ group.templateGroupName }}</h2>\r\n          <div class=\"badge\" [ngClass]=\"group.type\"> {{ group.type === 'value' ? 'Value' : 'Premium' }} ({{ group.fixtures.length }}) </div>\r\n        </div>\r\n\r\n        <p>{{ group.type === 'value' ? 'Value' : 'Premium' }} logic for {{ group.fixtures.length }} fixture{{ group.fixtures.length > 1 ? 's' : '' }} with {{ group.templateGroupName }} is below:</p>\r\n\r\n        <div class=\"d-flex gap-3 overflow-x-auto mt-5\">\r\n          <div class=\"fixture-block\" *ngFor=\"let fixture of group.fixtures\" \r\n               [style.background-color]=\"fixture.headerColor\">\r\n            <h3 class=\"header\">{{ fixture.header?.label || group.header }}</h3>\r\n\r\n            <div class=\"divider\" [style.border-color]=\"fixture.dividerColor\"></div>\r\n\r\n            <ng-container>\r\n              <p *ngFor=\"let shelfGroup of (fixture.groupedShelves || [])\">{{ shelfGroup.brand }}</p>\r\n              <p *ngIf=\"!fixture.groupedShelves || fixture.groupedShelves.length === 0\">No products assigned</p>\r\n            </ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n\r\n    <div *ngIf=\"processedData.length === 0\" class=\"text-center py-5\">\r\n      <p>No allocation data available</p>\r\n    </div>\r\n\r\n  </div>\r\n\r\n</section>","import { NgFor, NgIf, NgStyle } from \"@angular/common\";\r\nimport {\r\n  AfterViewChecked,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  OnInit,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { NgbTooltip } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  SectionConfig,\r\n  ShelfConfig,\r\n} from \"../../interfaces/fixture-template.interface\";\r\nimport { SHELF_COLORS } from \"../../data/fixture-template.data\";\r\nimport { rgbToHex } from \"../../functions/plano.function\";\r\n@Component({\r\n  selector: \"fixture-preview\",\r\n  templateUrl: \"./fixture-preview.component.html\",\r\n  styleUrl: \"./fixture-preview.component.scss\",\r\n  standalone: true,\r\n  imports: [NgIf, NgFor, NgbTooltip, NgStyle],\r\n})\r\nexport class FixturePreviewComponent\r\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\r\n{\r\n  @Input() fixtureData: any;\r\n\r\n  imgCDN: string;\r\n  clientId: string;\r\n  shelfColors = SHELF_COLORS;\r\n\r\n  sectionByZones: {\r\n    zone: string;\r\n    section: {\r\n      brands: string[];\r\n      categories: string[];\r\n      shelves: string[];\r\n      shelfDivs: (HTMLElement | null | undefined)[];\r\n      capacity: number;\r\n      color: any;\r\n    };\r\n  }[] = [];\r\n\r\n  private isVMInitialized = false;\r\n  private isBCInitialized = false;\r\n  isPageLoading: boolean = true;\r\n\r\n  private destroy$ = new Subject<void>();\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.environment\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((env) => (this.imgCDN = env.planogramCDN));\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n      });\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"fixtureData\"]?.currentValue) {\r\n      console.log(\"@@ ~ fixtureData:\", this.fixtureData);\r\n      setTimeout(() => {\r\n        this.applyShelfColors();\r\n        this.handleVmPositionAndSize();\r\n      });\r\n    }\r\n  }\r\n\r\n  ngAfterViewChecked(): void {\r\n    if (!this.isBCInitialized) {\r\n      this.isBCInitialized = this.applyShelfColors();\r\n    }\r\n    if (!this.isVMInitialized) {\r\n      this.isVMInitialized = this.handleVmPositionAndSize();\r\n    }\r\n  }\r\n\r\n  handleVmPositionAndSize() {\r\n    const viewPort = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!viewPort) return false;\r\n\r\n    const bodyWidth = viewPort.offsetWidth;\r\n\r\n    const header = document.getElementById(\"header-block\") as HTMLElement;\r\n    const footer = document.getElementById(\"footer-block\") as HTMLElement;\r\n\r\n    if (header && footer) {\r\n      header.style.width = `${bodyWidth}px`;\r\n      footer.style.width = `${bodyWidth}px`;\r\n    }\r\n\r\n    this.fixtureData?.vmConfig?.forEach((e: any, i: number) => {\r\n      let startShelf = e?.startYPosition ?? 1;\r\n\r\n      let endShelf =\r\n        e?.endYPosition ?? this.fixtureData?.shelfConfig?.length ?? 1;\r\n\r\n      const vm = viewPort.querySelector(`#vm${i}`) as HTMLElement;\r\n      if (!vm) return;\r\n\r\n      let x = 0;\r\n      let y = 0;\r\n\r\n      let yStart = 0;\r\n      for (let k = 1; k < startShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n\r\n        yStart += s.offsetHeight;\r\n      }\r\n\r\n      let placementHeight = 0;\r\n      let placementWidth = bodyWidth;\r\n\r\n      for (let k = startShelf; k <= endShelf; k++) {\r\n        const s = getShelfDiv(k);\r\n        if (!s) return;\r\n        placementHeight += s.offsetHeight;\r\n      }\r\n\r\n      let defaultW = placementWidth / 3;\r\n      let defaultH = placementHeight / 3;\r\n\r\n      let width = defaultW;\r\n      let height = defaultH;\r\n\r\n      switch (e?.xZone) {\r\n        case \"left\":\r\n          x = 0;\r\n          width = defaultW;\r\n          break;\r\n        case \"right\":\r\n          width = defaultW;\r\n          x = bodyWidth - width;\r\n          break;\r\n        case \"middle\":\r\n          width = defaultW;\r\n          x = (bodyWidth - width) / 2;\r\n          break;\r\n        case \"stretch\":\r\n          width = bodyWidth;\r\n          x = 0;\r\n          break;\r\n      }\r\n\r\n      switch (e?.yZone) {\r\n        case \"top\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = yStart;\r\n          break;\r\n        case \"middle\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = (placementHeight - height) / 2 + yStart;\r\n          break;\r\n        case \"bottom\":\r\n          height = placementHeight < defaultH ? placementHeight - 20 : defaultH;\r\n          y = placementHeight - height + yStart;\r\n          break;\r\n        case \"stretch\":\r\n          height = placementHeight;\r\n          y = yStart;\r\n          break;\r\n      }\r\n\r\n      vm.style.width = `${width}px`;\r\n      vm.style.height = ` ${height}px`;\r\n      vm.style.transform = `translate(${x}px, ${y}px)`;\r\n\r\n      function getShelfDiv(k: number) {\r\n        return (viewPort.querySelector(`#shelf${k}`) ||\r\n          viewPort.querySelector(`#tray${k}`) ||\r\n          viewPort.querySelector(`#vmonly${k}`)) as HTMLElement;\r\n      }\r\n    });\r\n    return true;\r\n  }\r\n\r\n  applyShelfColors() {\r\n    const bodies = document.getElementById(\"body-block\") as HTMLElement;\r\n    if (!bodies) return false;\r\n\r\n    const bodyChildren = Array.from(bodies?.children ?? []) as HTMLElement[];\r\n\r\n    const shelfDivs = bodyChildren\r\n      .map((div) => div as HTMLElement)\r\n      .filter((d) => d?.id.includes(\"shelfContainer\"));\r\n\r\n    if (!shelfDivs) return false;\r\n\r\n    const adjust = 253;\r\n    switch (this.fixtureData?.productResolutionLevel) {\r\n      case \"L1\": //fixture\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid  ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n\r\n      case \"L3\": //section\r\n        {\r\n          const shelves = shelfDivs\r\n            .map((div) =>\r\n              div.lastElementChild?.tagName.toLowerCase() === \"div\"\r\n                ? (div.lastElementChild as HTMLElement)\r\n                : null,\r\n            )\r\n            .filter(Boolean);\r\n\r\n          this.constructSequentialSection(shelves);\r\n          const sectionArray = this.groupShelvesByZone(\r\n            this.fixtureData?.shelfConfig ?? [],\r\n          );\r\n          const allSectionShelves: string[] = [];\r\n\r\n          sectionArray.forEach((se, i) => {\r\n            const shelfIds =\r\n              se.shelves?.map((sh) => sh.replace(/\\s/g, \"\").toLowerCase()) ??\r\n              [];\r\n            allSectionShelves.push(...shelfIds);\r\n            const secDivs = shelves.filter((item) =>\r\n              shelfIds?.includes(item?.id ?? \"\"),\r\n            );\r\n\r\n            secDivs.forEach((d) => {\r\n              if (d) {\r\n                d.style.backgroundColor = this.shelfColors[i].bg;\r\n                d.style.border = `1.4px solid  ${this.shelfColors[i].border}`;\r\n              }\r\n            });\r\n          });\r\n\r\n          const unassignedShelves = shelfDivs.filter(\r\n            (item) => !allSectionShelves.includes(item.id),\r\n          );\r\n          unassignedShelves.forEach((d) => (d.style.backgroundColor = \"white\"));\r\n\r\n          let sectionGroupHeight = 0;\r\n          setTimeout(() => {\r\n            this.sectionByZones.forEach((sz, i) => {\r\n              const currentSectionHeight = sz.section.shelfDivs.reduce(\r\n                (h, d) => h + (d?.offsetHeight ?? 0),\r\n                0,\r\n              );\r\n              const currentSectionWidth =\r\n                sz.section.shelfDivs[0]?.offsetWidth ?? 345;\r\n\r\n              const bc = bodies.querySelector<HTMLElement>(\r\n                `#brand-category${i}`,\r\n              );\r\n\r\n              if (bc) {\r\n                const secBg = rgbToHex(\r\n                  sz.section.shelfDivs[0]?.style.backgroundColor,\r\n                );\r\n                const color =\r\n                  this.shelfColors.find((c) => c.bg === secBg) ??\r\n                  this.shelfColors[i];\r\n\r\n                bc.style.borderColor = color.border;\r\n                bc.style.backgroundColor = \"#fff\";\r\n\r\n                const bcX = (currentSectionWidth - bc.offsetWidth) / 2;\r\n                const bcY =\r\n                  (currentSectionHeight - bc.offsetHeight) / 2 +\r\n                  sectionGroupHeight;\r\n                bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n\r\n                sectionGroupHeight += currentSectionHeight;\r\n              }\r\n            });\r\n          }, 0);\r\n        }\r\n\r\n        break;\r\n\r\n      case \"L2\": //shelf\r\n        {\r\n          shelfDivs.forEach((div, i) => {\r\n            div.style.backgroundColor = this.shelfColors[i].bg;\r\n            div.style.border = `1.4px solid ${this.shelfColors[i].border}`;\r\n            const bc = div.querySelector<HTMLElement>(`#brand-category${i}`);\r\n            if (!bc) return;\r\n\r\n            const bcX = (div.offsetWidth - bc.offsetWidth) / 2;\r\n            const bcY = (div.offsetHeight - bc.offsetHeight) / 2;\r\n\r\n            bc.style.borderColor = this.shelfColors[i].border;\r\n            bc.style.backgroundColor = this.shelfColors[i].textBg;\r\n            bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;\r\n          });\r\n        }\r\n        break;\r\n      case \"L4\": //spot\r\n        {\r\n          shelfDivs.forEach((d) => {\r\n            if (d) {\r\n              d.style.backgroundColor = this.shelfColors[0].bg;\r\n              d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n            }\r\n          });\r\n        }\r\n        break;\r\n      default:\r\n        shelfDivs.forEach((d) => {\r\n          if (d) {\r\n            d.style.backgroundColor = this.shelfColors[0].bg;\r\n            d.style.border = `1.4px solid ${this.shelfColors[0].border}`;\r\n          }\r\n        });\r\n        break;\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  constructSequentialSection(shelfDivs: (HTMLElement | null)[]) {\r\n    const newSectionByZones = [];\r\n    let pZone: string | null = null;\r\n\r\n    for (let i = 0; i < this.fixtureData?.shelfConfig.length; i++) {\r\n      const s = this.fixtureData?.shelfConfig[i];\r\n      const zone = s.zone || \"\";\r\n      const shelfId = `${s.shelfType}${s.shelfNumber}`;\r\n      const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);\r\n\r\n      if (zone === \"\") continue;\r\n\r\n      // const hasImproperProduct =\r\n      //   (s?.products?.length ?? 0) === 0 ||\r\n      (s?.products ?? []).some((p: any) => p.status !== \"proper\");\r\n      const shelfCapacity =\r\n        s.shelfType === \"tray\"\r\n          ? s.productPerShelf * s.trayRows\r\n          : s.productPerShelf;\r\n      if (zone !== pZone) {\r\n        newSectionByZones.push({\r\n          zone,\r\n          section: {\r\n            brands: s.productBrandName ?? [],\r\n            categories: s.productCategory ?? [],\r\n            shelves: [shelfId],\r\n            shelfDivs: [shelfDiv],\r\n            capacity: shelfCapacity,\r\n            color: this.shelfColors[i],\r\n          },\r\n        });\r\n        pZone = zone;\r\n      } else {\r\n        const section = newSectionByZones[newSectionByZones.length - 1].section;\r\n        section.shelves.push(shelfId);\r\n        section.shelfDivs.push(shelfDiv);\r\n        section.capacity += shelfCapacity;\r\n\r\n        if (!section.brands.length) section.brands = s?.productBrandName ?? [];\r\n        if (!section.categories.length)\r\n          section.categories = s?.productCategory ?? [];\r\n      }\r\n    }\r\n\r\n    this.sectionByZones = [...newSectionByZones];\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  groupShelvesByZone(input: ShelfConfig[]): SectionConfig[] {\r\n    const zoneMap: { [zone: string]: SectionConfig } = {};\r\n\r\n    for (const item of input) {\r\n      const zone = item?.zone ?? \"\";\r\n      const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;\r\n\r\n      if (!zoneMap[zone]) {\r\n        zoneMap[zone] = {\r\n          shelves: [],\r\n          productBrandName:\r\n            this.fixtureData?.productResolutionLevel === \"L2\"\r\n              ? item.productBrandName\r\n              : [],\r\n          productCategory:\r\n            this.fixtureData?.productResolutionLevel === \"L2\"\r\n              ? item.productCategory\r\n              : [],\r\n          zone: zone,\r\n        };\r\n      }\r\n\r\n      zoneMap[zone]?.shelves?.push(shelfLabel);\r\n    }\r\n\r\n    return Object.values(zoneMap);\r\n  }\r\n\r\n  applySectionConfigToShelves(sections: SectionConfig[]): ShelfConfig[] {\r\n    const sectionMap = new Map<\r\n      string,\r\n      Pick<SectionConfig, \"zone\" | \"productBrandName\" | \"productCategory\">\r\n    >();\r\n\r\n    for (const section of sections) {\r\n      for (const shelfLabel of section.shelves!) {\r\n        sectionMap.set(shelfLabel, {\r\n          zone: section.zone,\r\n          productBrandName: section.productBrandName,\r\n          productCategory: section.productCategory,\r\n        });\r\n      }\r\n    }\r\n\r\n    // Apply overrides to matching shelves\r\n    return (\r\n      this.fixtureData?.shelfConfig?.map((shelf: any) => {\r\n        const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;\r\n        const override = sectionMap.get(shelfLabel);\r\n\r\n        return {\r\n          ...shelf,\r\n          zone: override?.zone || \"\",\r\n          productBrandName: override?.productBrandName ?? [],\r\n          productCategory: override?.productCategory ?? [],\r\n        };\r\n      }) ?? []\r\n    );\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"fixture-preview\">\r\n    <div class=\"wall-viewport\">\r\n        <!-- Header block -->\r\n        <div id=\"header-block\" class=\"header-block\">\r\n            <p>{{ fixtureData?.header?.label }}</p>\r\n        </div>\r\n\r\n        <!-- Body block -->\r\n        <div id=\"body-block\" class=\"body-block\">\r\n            <div *ngIf=\"fixtureData?.vmConfig?.length\">\r\n                <ng-container *ngFor=\"let vm of fixtureData?.vmConfig; let i = index\">\r\n                    <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n                        <ng-container>\r\n                            <img *ngIf=\"vm?.vmImageUrl; else placeholder\" [src]=\"imgCDN+vm?.vmImageUrl\"\r\n                                alt=\"Vm Image\" />\r\n                            <ng-template #placeholder>\r\n                                <div class=\"vm-placeholder\">\r\n                                    <h3>{{ vm?.vmName }}</h3>\r\n                                </div>\r\n                            </ng-template>\r\n                        </ng-container>\r\n                    </div>\r\n                </ng-container>\r\n            </div>\r\n\r\n            <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"fixture-level\" *ngIf=\"fixtureData?.productResolutionLevel === 'L1'\">\r\n                <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureData?.productBrandName?.length\"\r\n                    [ngbTooltip]=\"brandCategoryTooltip\">\r\n                    <span class=\"brand\">\r\n                        <ng-container *ngFor=\"let b of fixtureData?.productBrandName; let last = last\">\r\n                            <span class=\"badge draft me-1\">\r\n                                {{ b }}\r\n                            </span>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"category\" *ngIf=\"fixtureData?.productCategory?.length\">\r\n                        <ng-container *ngFor=\"let c of fixtureData?.productCategory; let last = last\">\r\n                            {{ c }}\r\n                            <ng-container *ngIf=\"!last\">, </ng-container>\r\n                        </ng-container>\r\n                    </span>\r\n                    <span class=\"badge inactive mt-1\">\r\n                        Capacity {{fixtureData?.fixtureCapacity }}\r\n                    </span>\r\n                </div>\r\n                <ng-template #brandCategoryTooltip>\r\n                    <div>\r\n                        <p>\r\n                            <b>Brands: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureData?.productBrandName; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                        <p *ngIf=\"fixtureData?.productCategory?.length\">\r\n                            <b>Categories: </b>\r\n                            <ng-container *ngFor=\"let c of fixtureData?.productCategory; let last = last\">\r\n                                {{ c }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </p>\r\n                    </div>\r\n                </ng-template>\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n            <div id=\"section-level\" *ngIf=\"fixtureData?.productResolutionLevel === 'L3'\">\r\n                @for (item of sectionByZones; track $index) {\r\n                    <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <div class=\"d-flex\">\r\n                            <span class=\"badge me-1\"\r\n                                [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n                                {{ item.zone }}\r\n                            </span>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{ item?.section?.capacity }}\r\n                            </span>\r\n                        </div>\r\n                        <div class=\"w-100 d-flex justify-content-center\">\r\n                            <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                            <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n                            <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                @for (b of item?.section?.brands;track $index; let last = $last) {\r\n                                    {{ b }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                            <p *ngIf=\"item?.section?.categories?.length\">\r\n                                <b>Categories: </b>\r\n                                @for (c of item?.section?.categories;track $index; let last = $last) {\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                }\r\n                            </p>\r\n                        </div>\r\n                    </ng-template>\r\n                }\r\n            </div>\r\n            <!------------------------------------------------------------------------->\r\n\r\n            <div [id]=\"'shelfContainer' + i\" *ngFor=\"let item of fixtureData?.shelfConfig; let i = index\">\r\n                <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n                <div id=\"shelf-level\" *ngIf=\"fixtureData?.productResolutionLevel === 'L2'\">\r\n                    <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n                        [ngbTooltip]=\"brandCategoryTooltip\">\r\n                        <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                        <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n                        <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n                            <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n                                {{ b }}\r\n                                <ng-container *ngIf=\"!last\">, </ng-container>\r\n                            </ng-container>\r\n                        </span>\r\n                    </div>\r\n                    <ng-template #brandCategoryTooltip>\r\n                        <div>\r\n                            <p>\r\n                                <b>Brands: </b>\r\n                                <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <p *ngIf=\"item.productCategory?.length\">\r\n                                <b>Categories: </b>\r\n                                <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n                                    {{ c }}\r\n                                    <ng-container *ngIf=\"!last\">, </ng-container>\r\n                                </ng-container>\r\n                            </p>\r\n                            <span class=\"badge inactive\">\r\n                                Capacity {{item?.productPerShelf }}\r\n                            </span>\r\n\r\n                        </div>\r\n                    </ng-template>\r\n                </div>\r\n                <!------------------------------------------------------------------------->\r\n\r\n                @if(item.shelfType ==='tray'){\r\n                    <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n                        <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n                            <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                        </div>\r\n                    </div>\r\n                }@else {\r\n                    <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\"\r\n                        [class.vmonly-placeholder]=\"item.shelfType ==='vmonly'\">\r\n                        <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n                    </div>\r\n                }\r\n            </div>\r\n\r\n\r\n        </div>\r\n\r\n\r\n        <!-- Footer block -->\r\n        <div id=\"footer-block\" class=\"footer-block\">\r\n            <div class=\"sub-footer left-box\"></div>\r\n            <div class=\"sub-footer right-box\"></div>\r\n            <p>{{ fixtureData?.footer?.label }}</p>\r\n        </div>\r\n    </div>\r\n</section>","import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnChanges,\r\n  Output,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\nimport { IvmLogicExplorerComponent } from \"../../ivm-logic-explorer/ivm-logic-explorer.component\";\r\nimport { FixturePreviewComponent } from \"../../fixture-preview/fixture-preview.component\";\r\n\r\n@Component({\r\n  selector: \"onboard-fixture\",\r\n  templateUrl: \"./onboard-fixture.component.html\",\r\n  styleUrl: \"./onboard-fixture.component.scss\",\r\n  standalone: true,\r\n  imports: [IvmLogicExplorerComponent,FixturePreviewComponent],\r\n})\r\nexport class OnboardFixtureComponent implements OnChanges {\r\n  @Input() fixtureData: any;\r\n  @Input() isAllocationRun: boolean = false;\r\n  @Input() allFixtures: any[] = [];\r\n  @Output() onClose = new EventEmitter<any>();\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes[\"fixtureData\"]?.currentValue) {\r\n      this.fixtureData.actualShelves =\r\n        this.fixtureData.shelfConfig?.filter(\r\n          (s: any) => s.shelfType != \"vmonly\",\r\n        ) ?? [];\r\n    }\r\n  }\r\n\r\n  onClickClose() {\r\n    this.onClose.emit(\"\");\r\n  }\r\n}\r\n","<section id=\"onboard-fixture\" #onboardFixture>\r\n\r\n    <svg (click)=\"onClickClose()\" class=\"close-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n        xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path d=\"M13.5 4.5L4.5 13.5M4.5 4.5L13.5 13.5\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n            stroke-linejoin=\"round\" />\r\n    </svg>\r\n\r\n    @if(isAllocationRun){\r\n        @if(fixtureData){\r\n            <div id=\"basic-details\" class=\"d-flex flex-column align-items-center justify-content-center gap-2 my-5\">\r\n                <h2>{{fixtureData?.header?.label}}</h2>\r\n\r\n                <div class=\"d-flex gap-3 align-items-center justify-content-center\">\r\n                    <p>{{fixtureData?.fixtureCategory}}</p>\r\n\r\n                    <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                    </svg>\r\n\r\n                    <p>{{fixtureData?.fixtureWidth?.value}} {{fixtureData?.fixtureWidth?.unit}}</p>\r\n\r\n                    <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                    </svg>\r\n\r\n                    <p>Shelves: {{fixtureData?.actualShelves?.length}}</p>\r\n\r\n                    <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                    </svg>\r\n\r\n                    <p>Capacity: {{fixtureData?.fixtureCapacity}}</p>\r\n                </div>\r\n            </div>\r\n\r\n            <fixture-preview [fixtureData]=\"fixtureData\"></fixture-preview>\r\n        }\r\n\r\n        <ivm-logic-explorer [fixtures]=\"allFixtures\" [selectedFixture]=\"fixtureData\"></ivm-logic-explorer>\r\n    }@else {\r\n        @if(fixtureData){\r\n            <div id=\"basic-details\" class=\"d-flex flex-column align-items-center justify-content-center gap-2 my-5\">\r\n                <h2>{{fixtureData?.header?.label}}</h2>\r\n\r\n                <div class=\"d-flex gap-3 align-items-center justify-content-center\">\r\n                    <p>{{fixtureData?.fixtureCategory}}</p>\r\n                    <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                    </svg>\r\n                    <p>{{fixtureData?.fixtureWidth?.value}} {{fixtureData?.fixtureWidth?.unit}}</p>\r\n                    <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                        <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                    </svg>\r\n                    <p>{{fixtureData?.actualShelves?.length}} Shelves</p>\r\n                </div>\r\n            </div>\r\n        }\r\n\r\n        <div class=\"info-container\">\r\n            <svg width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n                <path\r\n                    d=\"M48.334 50C42.734 50 40.9007 52.25 40.3007 53.7333C42.084 54.5 43.334 56.2667 43.334 58.3333C43.334 59.6594 42.8072 60.9312 41.8695 61.8689C40.9319 62.8065 39.6601 63.3333 38.334 63.3333C37.0079 63.3333 35.7362 62.8065 34.7985 61.8689C33.8608 60.9312 33.334 59.6594 33.334 58.3333C33.334 56.15 34.7173 54.3 36.6673 53.6167V39.7167C35.6907 39.374 34.845 38.7357 34.2477 37.8905C33.6504 37.0452 33.331 36.035 33.334 35C33.334 33.6739 33.8608 32.4021 34.7985 31.4645C35.7362 30.5268 37.0079 30 38.334 30C39.6601 30 40.9319 30.5268 41.8695 31.4645C42.8072 32.4021 43.334 33.6739 43.334 35C43.334 37.1833 41.9507 39.0333 40.0007 39.7167V48.5333C41.4673 47.45 43.6007 46.6667 46.6673 46.6667C51.1173 46.6667 52.6007 44.4333 53.084 42.95C52.1722 42.5701 51.393 41.9292 50.8444 41.1078C50.2958 40.2864 50.0023 39.3211 50.0007 38.3333C50.0007 37.0073 50.5275 35.7355 51.4651 34.7978C52.4028 33.8601 53.6746 33.3333 55.0007 33.3333C56.3268 33.3333 57.5985 33.8601 58.5362 34.7978C59.4739 35.7355 60.0007 37.0073 60.0007 38.3333C60.0007 40.5667 58.534 42.5 56.5173 43.1C56.084 45.4833 54.4673 50 48.334 50ZM38.334 56.6667C37.892 56.6667 37.4681 56.8423 37.1555 57.1548C36.8429 57.4674 36.6673 57.8913 36.6673 58.3333C36.6673 58.7754 36.8429 59.1993 37.1555 59.5118C37.4681 59.8244 37.892 60 38.334 60C38.776 60 39.2 59.8244 39.5125 59.5118C39.8251 59.1993 40.0007 58.7754 40.0007 58.3333C40.0007 57.8913 39.8251 57.4674 39.5125 57.1548C39.2 56.8423 38.776 56.6667 38.334 56.6667ZM38.334 33.3333C37.892 33.3333 37.4681 33.5089 37.1555 33.8215C36.8429 34.134 36.6673 34.558 36.6673 35C36.6673 35.442 36.8429 35.866 37.1555 36.1785C37.4681 36.4911 37.892 36.6667 38.334 36.6667C38.776 36.6667 39.2 36.4911 39.5125 36.1785C39.8251 35.866 40.0007 35.442 40.0007 35C40.0007 34.558 39.8251 34.134 39.5125 33.8215C39.2 33.5089 38.776 33.3333 38.334 33.3333ZM55.0007 36.6667C54.5586 36.6667 54.1347 36.8423 53.8222 37.1548C53.5096 37.4674 53.334 37.8913 53.334 38.3333C53.334 38.7754 53.5096 39.1993 53.8222 39.5118C54.1347 39.8244 54.5586 40 55.0007 40C55.4427 40 55.8666 39.8244 56.1792 39.5118C56.4917 39.1993 56.6673 38.7754 56.6673 38.3333C56.6673 37.8913 56.4917 37.4674 56.1792 37.1548C55.8666 36.8423 55.4427 36.6667 55.0007 36.6667Z\"\r\n                    fill=\"#33B5FF\" />\r\n            </svg>\r\n\r\n            <h2>Allocation Pending</h2>\r\n            <p>Preview will be available once the allocations are done</p>\r\n        </div>\r\n\r\n\r\n    }\r\n\r\n\r\n    <!-- @if(fixtureData){\r\n\r\n        <div id=\"basic-details\" class=\"d-flex flex-column align-items-center justify-content-center gap-2 my-5\">\r\n            <h2>{{fixtureData?.header?.label}}</h2>\r\n\r\n            <div class=\"d-flex gap-3 align-items-center justify-content-center\">\r\n                <p>{{fixtureData?.fixtureCategory}}</p>\r\n                <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                </svg>\r\n                <p>{{fixtureData?.fixtureWidth?.value}} {{fixtureData?.fixtureWidth?.unit}}</p>\r\n                <svg width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#D0D5DD\" />\r\n                </svg>\r\n                <p>{{fixtureData?.actualShelves?.length}} Shelves</p>\r\n            </div>\r\n        </div>\r\n\r\n        @if(isAllocationRun) {\r\n            <ivm-logic-explorer [fixtures]=\"allFixtures\" [selectedFixture]=\"fixtureData\"></ivm-logic-explorer>\r\n        } @else {\r\n            <div class=\"info-container\">\r\n                <svg width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                    <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n                        stroke-width=\"13.3333\" />\r\n                    <path\r\n                        d=\"M48.334 50C42.734 50 40.9007 52.25 40.3007 53.7333C42.084 54.5 43.334 56.2667 43.334 58.3333C43.334 59.6594 42.8072 60.9312 41.8695 61.8689C40.9319 62.8065 39.6601 63.3333 38.334 63.3333C37.0079 63.3333 35.7362 62.8065 34.7985 61.8689C33.8608 60.9312 33.334 59.6594 33.334 58.3333C33.334 56.15 34.7173 54.3 36.6673 53.6167V39.7167C35.6907 39.374 34.845 38.7357 34.2477 37.8905C33.6504 37.0452 33.331 36.035 33.334 35C33.334 33.6739 33.8608 32.4021 34.7985 31.4645C35.7362 30.5268 37.0079 30 38.334 30C39.6601 30 40.9319 30.5268 41.8695 31.4645C42.8072 32.4021 43.334 33.6739 43.334 35C43.334 37.1833 41.9507 39.0333 40.0007 39.7167V48.5333C41.4673 47.45 43.6007 46.6667 46.6673 46.6667C51.1173 46.6667 52.6007 44.4333 53.084 42.95C52.1722 42.5701 51.393 41.9292 50.8444 41.1078C50.2958 40.2864 50.0023 39.3211 50.0007 38.3333C50.0007 37.0073 50.5275 35.7355 51.4651 34.7978C52.4028 33.8601 53.6746 33.3333 55.0007 33.3333C56.3268 33.3333 57.5985 33.8601 58.5362 34.7978C59.4739 35.7355 60.0007 37.0073 60.0007 38.3333C60.0007 40.5667 58.534 42.5 56.5173 43.1C56.084 45.4833 54.4673 50 48.334 50ZM38.334 56.6667C37.892 56.6667 37.4681 56.8423 37.1555 57.1548C36.8429 57.4674 36.6673 57.8913 36.6673 58.3333C36.6673 58.7754 36.8429 59.1993 37.1555 59.5118C37.4681 59.8244 37.892 60 38.334 60C38.776 60 39.2 59.8244 39.5125 59.5118C39.8251 59.1993 40.0007 58.7754 40.0007 58.3333C40.0007 57.8913 39.8251 57.4674 39.5125 57.1548C39.2 56.8423 38.776 56.6667 38.334 56.6667ZM38.334 33.3333C37.892 33.3333 37.4681 33.5089 37.1555 33.8215C36.8429 34.134 36.6673 34.558 36.6673 35C36.6673 35.442 36.8429 35.866 37.1555 36.1785C37.4681 36.4911 37.892 36.6667 38.334 36.6667C38.776 36.6667 39.2 36.4911 39.5125 36.1785C39.8251 35.866 40.0007 35.442 40.0007 35C40.0007 34.558 39.8251 34.134 39.5125 33.8215C39.2 33.5089 38.776 33.3333 38.334 33.3333ZM55.0007 36.6667C54.5586 36.6667 54.1347 36.8423 53.8222 37.1548C53.5096 37.4674 53.334 37.8913 53.334 38.3333C53.334 38.7754 53.5096 39.1993 53.8222 39.5118C54.1347 39.8244 54.5586 40 55.0007 40C55.4427 40 55.8666 39.8244 56.1792 39.5118C56.4917 39.1993 56.6673 38.7754 56.6673 38.3333C56.6673 37.8913 56.4917 37.4674 56.1792 37.1548C55.8666 36.8423 55.4427 36.6667 55.0007 36.6667Z\"\r\n                        fill=\"#33B5FF\" />\r\n                </svg>\r\n\r\n                <h2>Allocation Pending</h2>\r\n                <p>Preview will be available once the allocations are done</p>\r\n            </div>\r\n        }\r\n    }@else {\r\n        @if(isAllocationRun) {\r\n            <ivm-logic-explorer [fixtures]=\"allFixtures\" [selectedFixture]=\"null\"></ivm-logic-explorer>\r\n        } @else {\r\n            <div class=\"info-container mt-5\">\r\n                <svg width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                    <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n                    <rect x=\"6.66699\" y=\"6.6665\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n                        stroke-width=\"13.3333\" />\r\n                    <path\r\n                        d=\"M48.334 50C42.734 50 40.9007 52.25 40.3007 53.7333C42.084 54.5 43.334 56.2667 43.334 58.3333C43.334 59.6594 42.8072 60.9312 41.8695 61.8689C40.9319 62.8065 39.6601 63.3333 38.334 63.3333C37.0079 63.3333 35.7362 62.8065 34.7985 61.8689C33.8608 60.9312 33.334 59.6594 33.334 58.3333C33.334 56.15 34.7173 54.3 36.6673 53.6167V39.7167C35.6907 39.374 34.845 38.7357 34.2477 37.8905C33.6504 37.0452 33.331 36.035 33.334 35C33.334 33.6739 33.8608 32.4021 34.7985 31.4645C35.7362 30.5268 37.0079 30 38.334 30C39.6601 30 40.9319 30.5268 41.8695 31.4645C42.8072 32.4021 43.334 33.6739 43.334 35C43.334 37.1833 41.9507 39.0333 40.0007 39.7167V48.5333C41.4673 47.45 43.6007 46.6667 46.6673 46.6667C51.1173 46.6667 52.6007 44.4333 53.084 42.95C52.1722 42.5701 51.393 41.9292 50.8444 41.1078C50.2958 40.2864 50.0023 39.3211 50.0007 38.3333C50.0007 37.0073 50.5275 35.7355 51.4651 34.7978C52.4028 33.8601 53.6746 33.3333 55.0007 33.3333C56.3268 33.3333 57.5985 33.8601 58.5362 34.7978C59.4739 35.7355 60.0007 37.0073 60.0007 38.3333C60.0007 40.5667 58.534 42.5 56.5173 43.1C56.084 45.4833 54.4673 50 48.334 50ZM38.334 56.6667C37.892 56.6667 37.4681 56.8423 37.1555 57.1548C36.8429 57.4674 36.6673 57.8913 36.6673 58.3333C36.6673 58.7754 36.8429 59.1993 37.1555 59.5118C37.4681 59.8244 37.892 60 38.334 60C38.776 60 39.2 59.8244 39.5125 59.5118C39.8251 59.1993 40.0007 58.7754 40.0007 58.3333C40.0007 57.8913 39.8251 57.4674 39.5125 57.1548C39.2 56.8423 38.776 56.6667 38.334 56.6667ZM38.334 33.3333C37.892 33.3333 37.4681 33.5089 37.1555 33.8215C36.8429 34.134 36.6673 34.558 36.6673 35C36.6673 35.442 36.8429 35.866 37.1555 36.1785C37.4681 36.4911 37.892 36.6667 38.334 36.6667C38.776 36.6667 39.2 36.4911 39.5125 36.1785C39.8251 35.866 40.0007 35.442 40.0007 35C40.0007 34.558 39.8251 34.134 39.5125 33.8215C39.2 33.5089 38.776 33.3333 38.334 33.3333ZM55.0007 36.6667C54.5586 36.6667 54.1347 36.8423 53.8222 37.1548C53.5096 37.4674 53.334 37.8913 53.334 38.3333C53.334 38.7754 53.5096 39.1993 53.8222 39.5118C54.1347 39.8244 54.5586 40 55.0007 40C55.4427 40 55.8666 39.8244 56.1792 39.5118C56.4917 39.1993 56.6673 38.7754 56.6673 38.3333C56.6673 37.8913 56.4917 37.4674 56.1792 37.1548C55.8666 36.8423 55.4427 36.6667 55.0007 36.6667Z\"\r\n                        fill=\"#33B5FF\" />\r\n                </svg>\r\n\r\n                <h2>Allocation Pending</h2>\r\n                <p>Preview will be available once the allocations are done</p>\r\n            </div>\r\n        }\r\n    } -->\r\n</section>","import {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  TemplateRef,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\n\r\nimport { Location, TitleCasePipe } from \"@angular/common\";\r\n\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  Validators,\r\n} from \"@angular/forms\";\r\n\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\nimport {\r\n  Subject,\r\n  Subscription,\r\n  debounceTime,\r\n  firstValueFrom,\r\n  fromEvent,\r\n  takeUntil,\r\n} from \"rxjs\";\r\n\r\nimport { NgbAccordionDirective, NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport * as fabric from \"fabric\";\r\n\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\n\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { CadSourceService } from \"../../services/cad-source.service\";\r\nimport { LayoutEditConfirmationComponent } from \"../popups/layout-edit-confirmation/layout-edit-confirmation.component\";\r\nimport { DeleteConfirmationComponent } from \"../popups/delete-confirmation/delete-confirmation.component\";\r\nimport { DropdownIF } from \"../../interfaces/plano-general.interface\";\r\nimport {\r\n  DEFAULT_COMPACTION_CONFIG,\r\n  compactFloorDestructive,\r\n  getFloorBoundsFt,\r\n} from \"./utils/axis-compaction\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"lib-onboard-store-plano\",\r\n  templateUrl: \"./onboard-store-plano.component.html\",\r\n  styleUrl: \"./onboard-store-plano.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class OnboardStorePlanoComponent\r\n  implements AfterViewInit, OnDestroy, OnInit\r\n{\r\n  @ViewChild(\"baseCanvas\")\r\n  canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  @ViewChild(\"applyLogics\") applyLogicsModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"approveLayoutModal\") approveLayoutModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"revertAllocationModal\")\r\n  revertAllocationModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"completeAllocationModal\")\r\n  completeAllocationModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"bodyAccordion\") bodyAccordion?: NgbAccordionDirective;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  destroy$ = new Subject();\r\n\r\n  clientId: string;\r\n\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n\r\n  layoutForm: FormGroup;\r\n  selectedFloorId = new FormControl(\"\");\r\n  floorsList: DropdownIF[][] = [];\r\n  fixtureConfigSubscriptions: Subscription[] = [];\r\n  fixtureTemplateIdSubscriptions: Subscription[] = [];\r\n  otherElementsSubscriptions: Subscription[] = [];\r\n\r\n  planoData: any;\r\n\r\n  floorData: any;\r\n  readonly originalFloorData: any; // used to rollback to original layout state on click cancel while editing.\r\n\r\n  /**\r\n   * Compact is a one-shot action, not a toggle. Clicking it compacts the\r\n   * layout destructively and drops the user into edit mode so the change\r\n   * shows up as an unsaved edit (revertable via Cancel, persistable via\r\n   * Save / Submit). If no compaction is possible we keep the user in view\r\n   * mode and surface the reason via toast — no silent no-ops.\r\n   */\r\n  compactLayout(): void {\r\n    if (!this.floorData) return;\r\n    const before = getFloorBoundsFt(this.floorData);\r\n    const compacted = compactFloorDestructive(\r\n      this.floorData,\r\n      DEFAULT_COMPACTION_CONFIG,\r\n    );\r\n    const after = getFloorBoundsFt(compacted);\r\n    const widthShrink = (before.maxX - before.minX) - (after.maxX - after.minX);\r\n    const heightShrink = (before.maxY - before.minY) - (after.maxY - after.minY);\r\n    if (widthShrink < 0.5 && heightShrink < 0.5) {\r\n      this.toastService.getWarningToast(\r\n        \"Layout is already compact — no further compaction possible\",\r\n      );\r\n      return;\r\n    }\r\n    this.floorData.layoutPolygon = compacted.layoutPolygon;\r\n    this.floorData.centerFixture = compacted.centerFixture;\r\n    if (Array.isArray(compacted.otherElements)) {\r\n      this.floorData.otherElements = compacted.otherElements;\r\n    }\r\n    this.reorderFixture(this.floorData);\r\n    // Drop into edit mode so the compaction lives as an unsaved edit —\r\n    // Cancel will refetch and revert it, Save / Submit will persist it.\r\n    this.togglePanel(\"right\", true);\r\n    this.togglePanel(\"left\", false);\r\n    this.createForm();\r\n    this.layoutForm.enable({ emitEvent: false });\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  get canShowCompactToggle(): boolean {\r\n    return !!this.floorData?._id && this.getStatus === \"draft\";\r\n  }\r\n\r\n  cdnUrl: string;\r\n  fixtureTemplates: any[] = [];\r\n  allFixtures: any[] = []; // all fixtures including the master templates for tree view\r\n  // allFixtureInstances: any[] = []; // only the layout fixtures instances.\r\n  storeFeedback: any;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  editFixture: boolean = false;\r\n  editFixtureSection: \"basic-details\" | \"products\" | \"vms\" = \"basic-details\";\r\n  submitFixture = false;\r\n\r\n  highlightedFixtureFormId: string | null = null;\r\n\r\n  layoutMetrics = {\r\n    allStore: 0,\r\n    allocationPending: 0,\r\n    draft: 0,\r\n  };\r\n\r\n  isPageLoading: boolean = true;\r\n  isRightPanelCollapsed: boolean = true;\r\n  isLeftPanelCollapsed: boolean = true;\r\n\r\n  disableEdit: boolean = true;\r\n  isSavingLayout: boolean = false;\r\n\r\n  isAllocationRun: boolean = false;\r\n  floorDataBeforeAllocation: any = null;\r\n\r\n  otherElementList: DropdownIF[] = [\r\n    { label: \"POS Counter\", value: \"POS Counter\" },\r\n    { label: \"Discussion Table\", value: \"Discussion Table\" },\r\n    { label: \"Mirror\", value: \"Mirror\" },\r\n    { label: \"Others\", value: \"Others\" },\r\n  ];\r\n  storeList: any = [];\r\n  selectedStoreName: any;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  isButtonLoading = false;\r\n\r\n  layoutBounds: any;\r\n\r\n  isRunAllocationAllowed: boolean = false;\r\n\r\n  ivmAliasKeys: Set<string> = new Set();\r\n  fixtureLibraryByWidth: Map<number, Set<string>> = new Map();\r\n\r\n  libraryCategories: string[] = [];\r\n  libraryByCategory: Map<string, Set<number>> = new Map();\r\n\r\n  // Flipped to true by any layout-level mutation (add / delete / move / template\r\n  // change). Reset to false on successful save. Gates the per-fixture edit icon\r\n  // so the user must save layout changes first.\r\n  layoutHasUnsavedChanges: boolean = false;\r\n\r\n  restrictedUsers: string[] = [\r\n    \"mathew.rhea@lenskart.com\",\r\n    \"sawran.singh@dealskart.in\",\r\n    \"abhinav.krishna@lenskart.in\",\r\n    \"sudha@tangotech.co.in\",\r\n    // \"gopinath@tangotech.co.in\"\r\n  ];\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private route: ActivatedRoute,\r\n    private fb: FormBuilder,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private toastService: ToastService,\r\n    private modalService: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private location: Location,\r\n    private router: Router,\r\n    private cd: ChangeDetectorRef,\r\n    public cadSource: CadSourceService,\r\n  ) {\r\n    this.createForm();\r\n\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        // await this.getVmsList();\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.planoId) {\r\n          this.getStoreFixtures(params?.planoId);\r\n          if (params?.floorId) {\r\n            this.floorData = { _id: params?.floorId };\r\n          }\r\n        }\r\n\r\n        const storedUserInfo = localStorage.getItem(\"user-info\");\r\n        const userData = storedUserInfo ? JSON.parse(storedUserInfo) : null;\r\n        const isNonRestrictedUser =\r\n          !!userData && !this.restrictedUsers.includes(userData?.email);\r\n        const isAllocationOverrideEnabled = params?.allocation === \"true\";\r\n\r\n        if (isNonRestrictedUser || isAllocationOverrideEnabled) {\r\n          this.isRunAllocationAllowed = true;\r\n        }\r\n      });\r\n\r\n    this.selectedFloorId.valueChanges.subscribe(async (id) => {\r\n      const clickedFloor = this.planoData?.floors?.find(\r\n        (f: any) => f._id === id,\r\n      );\r\n\r\n      if (clickedFloor.status === \"completed\") {\r\n        this.router.navigateByUrl(\r\n          `manage/planogram/manage-planogram?planoId=${clickedFloor.planoId}&floorId=${clickedFloor._id}`,\r\n        );\r\n      } else {\r\n        this.floorData = null;\r\n        this.createForm();\r\n        this.removeHighlight();\r\n        this.isLeftPanelCollapsed = true;\r\n        this.isRightPanelCollapsed = true;\r\n\r\n        this.floorData = clickedFloor;\r\n        this.renderFloor();\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        const newParams = new URLSearchParams(window.location.search);\r\n        newParams.set(\"planoId\", this.floorData.planoId);\r\n        newParams.set(\"floorId\", this.floorData._id);\r\n\r\n        this.location.replaceState(\r\n          window.location.pathname,\r\n          newParams.toString(),\r\n        );\r\n        this.selectedFloorId.setValue(this.floorData._id, { emitEvent: false });\r\n      }\r\n    });\r\n\r\n    this.canvas = new fabric.Canvas(this.canvasRef?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n    });\r\n\r\n    fromEvent(this.canvas as any, \"object:modified\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(async (e: any) => {\r\n        const movedObj: any = e.target;\r\n\r\n        if (!movedObj) return;\r\n\r\n        if (this.layoutForm?.enabled) {\r\n          this.layoutHasUnsavedChanges = true;\r\n        }\r\n\r\n        if (movedObj?.type === \"activeSelection\") {\r\n          this.applyGroupTransform(movedObj);\r\n        }\r\n\r\n        const action = e.transform?.action;\r\n\r\n        const isResize =\r\n          action === \"scale\" || action === \"scaleX\" || action === \"scaleY\";\r\n\r\n        if (isResize) {\r\n          const type = movedObj?.objType ?? \"group\";\r\n\r\n          const updatedConfig = {\r\n            x: movedObj.left,\r\n            y: movedObj.top,\r\n            width: movedObj.getScaledWidth(),\r\n            height: movedObj.getScaledHeight(),\r\n            angle: movedObj.angle,\r\n            elementData: movedObj.data,\r\n          };\r\n\r\n          switch (type) {\r\n            case \"wall\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.angle = updatedConfig.angle;\r\n\r\n              const newWall = await this.drawWall(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                this.wallThickness,\r\n                updatedConfig.width - 0.27,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newWall as any).objType = \"wall\";\r\n              (newWall as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newWall);\r\n              break;\r\n            }\r\n\r\n            case \"others\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.relativePosition.angle =\r\n                updatedConfig.angle;\r\n\r\n              const newOther = this.drawOtherElementsWithLabel(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                updatedConfig.angle,\r\n                updatedConfig.width - 2,\r\n                updatedConfig.height - 2,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newOther as any).objType = \"others\";\r\n              (newOther as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newOther);\r\n              break;\r\n            }\r\n\r\n            case \"entrance\": {\r\n              break;\r\n            }\r\n\r\n            case \"fixture\": {\r\n              break;\r\n            }\r\n\r\n            default:\r\n              break;\r\n          }\r\n\r\n          this.canvas.requestRenderAll();\r\n        }\r\n\r\n        this.updateWallCoordinates();\r\n        this.updateFixtureCoordinates();\r\n        this.updateOtherElementsCoordinates();\r\n        this.updateEntranceCoordinates();\r\n      });\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    this.listenToDeleteKey();\r\n    this.togglePanel(\"left\", true);\r\n  }\r\n\r\n  async updateAllPositions() {\r\n    this.updateWallCoordinates();\r\n    this.updateFixtureCoordinates();\r\n    this.updateOtherElementsCoordinates();\r\n    this.updateEntranceCoordinates();\r\n\r\n    this.floorData.cadLayout = false;\r\n  }\r\n\r\n  applyGroupTransform(selection: fabric.ActiveSelection) {\r\n    const matrix = selection.calcTransformMatrix();\r\n\r\n    selection.getObjects().forEach((obj: any) => {\r\n      const objMatrix = obj.calcTransformMatrix();\r\n      const finalMatrix = fabric.util.multiplyTransformMatrices(\r\n        matrix,\r\n        objMatrix,\r\n      );\r\n\r\n      const point = new fabric.Point(0, 0).transform(finalMatrix);\r\n\r\n      obj.set({\r\n        left: point.x,\r\n        top: point.y,\r\n        angle: selection.angle + (obj.angle ?? 0),\r\n      });\r\n\r\n      obj.setCoords();\r\n    });\r\n\r\n    // Ungroup after applying transform\r\n    this.canvas.discardActiveObject();\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Create Store Plano\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Planogram\",\r\n        path: \"/manage/planogram/manage-planograms/onboard\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  onFixtureSave() {\r\n    this.submitFixture = true;\r\n    setTimeout(() => {\r\n      this.submitFixture = false;\r\n    }, 100);\r\n  }\r\n\r\n  async onFixturePageCancel() {\r\n    this.selectedFixtureData = null;\r\n    this.editFixtureSection = \"basic-details\";\r\n    this.editFixture = false;\r\n    await this.renderFloor(false);\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  onFixtureSubmit(event: any) {\r\n    if (!event && !this.selectedFixtureData) return;\r\n\r\n    if (event?.shelf && this.selectedFixtureData?.shelfConfig) {\r\n      event.shelf = event.shelf.map((shelf: any, index: any) => {\r\n        let findShelf = this.selectedFixtureData.shelfConfig.find(\r\n          (ele: any) => ele.shelfNumber == index + 1,\r\n        );\r\n        if (findShelf) {\r\n          shelf = { ...findShelf, ...shelf };\r\n        } else {\r\n          let details =\r\n            this.selectedFixtureData.shelfConfig[\r\n              this.selectedFixtureData.shelfConfig.length - 1\r\n            ];\r\n          details.shelfNumber = index + 1;\r\n          shelf = { ...details, ...shelf };\r\n        }\r\n        return shelf;\r\n      });\r\n\r\n      this.selectedFixtureData[\"shelfConfig\"] = event?.shelf;\r\n      this.selectedFixtureData[\"description\"] = event?.description ?? \"\";\r\n      this.selectedFixtureData[\"templateGroupName\"] =\r\n        event?.templateGroupName ?? \"\";\r\n      this.selectedFixtureData.header.label = event?.headerLabel ?? \"\";\r\n      this.selectedFixtureData.footer.label = event?.footerLabel ?? \"\";\r\n\r\n      this.validateFixtures();\r\n      this.renderFloor(false);\r\n    } else if (event?.section) {\r\n      event.section.forEach((sec: any) => {\r\n        let number = sec?.shelves?.map((ele: any) =>\r\n          parseInt(ele.split(\" \")[1]),\r\n        );\r\n        this.selectedFixtureData?.shelfConfig.forEach((shelf: any) => {\r\n          if (number.includes(shelf.shelfNumber)) {\r\n            shelf.zone = sec.zone;\r\n            shelf.productBrandName = sec.productBrandName;\r\n            shelf.productCategory = sec.productCategory;\r\n          }\r\n        });\r\n      });\r\n    } else if (event?.vmConfig && this.selectedFixtureData?.vmConfig) {\r\n      this.selectedFixtureData[\"vmConfig\"] = event?.vmConfig;\r\n    } else {\r\n      if (event) {\r\n        // this.getVmsList();\r\n        this.createForm();\r\n        this.selectedFixtureData = null;\r\n        this.editFixtureSection = \"basic-details\";\r\n        this.editFixture = false;\r\n        this.getStoreFixtures(this.planoData?._id);\r\n      }\r\n    }\r\n  }\r\n\r\n  togglePanel(side: \"left\" | \"right\", action?: boolean) {\r\n    if (side === \"left\") {\r\n      this.isLeftPanelCollapsed = action ?? !this.isLeftPanelCollapsed;\r\n      if (!this.isLeftPanelCollapsed) this.isRightPanelCollapsed = true;\r\n    } else {\r\n      this.isRightPanelCollapsed = action ?? !this.isRightPanelCollapsed;\r\n      if (!this.isRightPanelCollapsed) this.isLeftPanelCollapsed = true;\r\n    }\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 400);\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  transferArrayItem<T = any>(\r\n    currentArray: T[],\r\n    targetArray: T[],\r\n    currentIndex: number,\r\n    targetIndex: number,\r\n  ): void {\r\n    const from = Math.max(0, Math.min(currentArray.length - 1, currentIndex));\r\n    const to = Math.max(0, Math.min(targetArray.length, targetIndex));\r\n\r\n    if (currentArray.length) {\r\n      targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);\r\n    }\r\n  }\r\n\r\n  reorderFixture(floorData: any) {\r\n    // Walls\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\") {\r\n        let wallAssociatedIndex = 1;\r\n\r\n        element.fixtures.forEach((fixture: any) => {\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = element.elementNumber;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            // fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    // Center floor fixtures\r\n    let floorAssociatedIndex = 1;\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        // fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  getElementValue(group: any) {\r\n    return group.get(\"elementNumber\")?.value;\r\n  }\r\n\r\n  private getWallByNumber(elementNumber: number): any | undefined {\r\n    return this.floorData?.layoutPolygon?.find(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === elementNumber,\r\n    );\r\n  }\r\n\r\n  roundToTwo(num: number) {\r\n    return Math.round(num * 100) / 100;\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string, enable: boolean = true) {\r\n    this.removeHighlight();\r\n    this.isPageLoading = true;\r\n    if (!this.fixtureTemplates.length) {\r\n      await this.getFixtureTemplates();\r\n    }\r\n    this.selectedFixture = null;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId] })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          if (this.floorData?._id) {\r\n            this.floorData = structuredClone(\r\n              res.data[0].floors.find(\r\n                (floor: any) => floor?._id === this.floorData?._id,\r\n              ),\r\n            );\r\n          } else {\r\n            this.floorData = structuredClone(res.data[0].floors[0]);\r\n          }\r\n          this.floorsList = this.planoData.floors.map((f: any) => ({\r\n            label: f.floorNum,\r\n            value: f._id,\r\n            // disabled: f.status === \"completed\",\r\n          }));\r\n\r\n          this.extractAllFixtures(this.floorData);\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n\r\n          this.disableEdit = false;\r\n\r\n          if (!this.ivmAliasKeys.size || !this.fixtureLibraryByWidth.size) {\r\n            await Promise.all([\r\n              this.ivmAliasKeys.size ? Promise.resolve() : this.fetchIvmAlias(),\r\n              this.fixtureLibraryByWidth.size\r\n                ? Promise.resolve()\r\n                : this.fetchFixtureLibraryKeys(),\r\n            ]);\r\n          }\r\n          this.validateFixtures();\r\n\r\n          this.renderFloor();\r\n\r\n          this.isPageLoading = false;\r\n          if (enable) {\r\n            this.layoutForm?.disable({ emitEvent: false });\r\n          }\r\n        },\r\n        error: (err: any) => {\r\n          this.isPageLoading = false;\r\n          this.toastService.getErrorToast(\"Failed to fetch plano\");\r\n        },\r\n      });\r\n  }\r\n\r\n  extractAllFixtures(floorData: any) {\r\n    const extractedFixture = [\r\n      ...(floorData?.masterTemplates ?? []),\r\n      ...(floorData?.centerFixture ?? []),\r\n    ];\r\n\r\n    floorData?.layoutPolygon?.forEach((lp: any) => {\r\n      extractedFixture.push(...(lp.fixtures ?? []));\r\n    });\r\n\r\n    this.allFixtures = extractedFixture;\r\n\r\n    // this.allFixtureInstances = [\r\n    //   ...this.floorData!.layoutPolygon.flatMap((e: any) => e?.fixtures ?? []),\r\n    //   ...(this.floorData?.centerFixture ?? []),\r\n    // ];\r\n  }\r\n\r\n  get allFixtureInstances() {\r\n    const allFixtures = [\r\n      ...(this.floorData?.layoutPolygon?.flatMap(\r\n        (e: any) => e?.fixtures ?? [],\r\n      ) ?? []),\r\n      ...(this.floorData?.centerFixture ?? []),\r\n    ];\r\n\r\n    const seenFixtures = new Set<string>();\r\n    const uniqueFixtures: any[] = [];\r\n\r\n    allFixtures.forEach((fixture: any) => {\r\n      if (!fixture) return;\r\n\r\n      const fixtureId = fixture._id;\r\n\r\n      if (!seenFixtures.has(fixtureId)) {\r\n        seenFixtures.add(fixtureId);\r\n        uniqueFixtures.push(fixture);\r\n      }\r\n    });\r\n\r\n    return uniqueFixtures;\r\n  }\r\n\r\n  async fetchIvmAlias() {\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getIvmConversionAlias(),\r\n      );\r\n      if (res?.data && typeof res.data === \"object\") {\r\n        this.ivmAliasKeys = new Set(Object.keys(res.data));\r\n      }\r\n    } catch {\r\n      // silently fail — validation skipped if alias unavailable\r\n    }\r\n  }\r\n\r\n  async fetchFixtureLibraryKeys() {\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getFixtureLibNameList(this.clientId, \"non-draft\"),\r\n      );\r\n      if (!Array.isArray(res?.data)) return;\r\n\r\n      const grouped = new Map<number, Set<string>>();\r\n      const categorySet = new Set<string>();\r\n      const byCategory = new Map<string, Set<number>>();\r\n      for (const item of res.data) {\r\n        const name: string = item?.fixtureName;\r\n        if (typeof name !== \"string\" || !name.length) continue;\r\n\r\n        // Backend format: \"<category> - <value><unit>\" e.g. \"Euro Center - 4ft\".\r\n        // Split on the LAST \" - \" so categories containing hyphens are preserved.\r\n        const sepIdx = name.lastIndexOf(\" - \");\r\n        if (sepIdx < 0) continue;\r\n        const categoryRaw = name.slice(0, sepIdx);\r\n        const widthPart = name.slice(sepIdx + 3);\r\n        const widthMatch = widthPart.match(/^(\\d+(?:\\.\\d+)?)/);\r\n        if (!widthMatch) continue;\r\n        const width = parseFloat(widthMatch[1]);\r\n        if (Number.isNaN(width)) continue;\r\n\r\n        const normalized = this.normalizeForMatch(categoryRaw);\r\n        if (!normalized) continue;\r\n\r\n        if (!grouped.has(width)) grouped.set(width, new Set<string>());\r\n        grouped.get(width)!.add(normalized);\r\n        categorySet.add(categoryRaw);\r\n        if (!byCategory.has(categoryRaw)) byCategory.set(categoryRaw, new Set<number>());\r\n        byCategory.get(categoryRaw)!.add(width);\r\n      }\r\n      this.fixtureLibraryByWidth = grouped;\r\n      this.libraryCategories = Array.from(categorySet).sort();\r\n      this.libraryByCategory = byCategory;\r\n    } catch {\r\n      // silently fail — library validation skipped if unavailable\r\n    }\r\n  }\r\n\r\n  // Normalize a category string for matching: lowercase + strip everything\r\n  // except a-z. Spaces, punctuation, and digits all dropped. Digits in\r\n  // category names are noise (CAD model codes like \"1010\"/\"1200\", vendor\r\n  // size suffixes) — the real width comes from fixtureWidth.value.\r\n  private normalizeForMatch(str: string): string {\r\n    if (typeof str !== \"string\") return \"\";\r\n    return str.toLowerCase().replace(/[^a-z]/g, \"\");\r\n  }\r\n\r\n  // Damerau-Levenshtein edit distance: counts insertions, deletions,\r\n  // substitutions, and adjacent-char transpositions (a swap like\r\n  // \"hybird\"<->\"hybrid\" is 1 edit, not 2).\r\n  private damerauLevenshteinDistance(a: string, b: string): number {\r\n    if (a === b) return 0;\r\n    const aLen = a.length;\r\n    const bLen = b.length;\r\n    if (!aLen) return bLen;\r\n    if (!bLen) return aLen;\r\n\r\n    const matrix: number[][] = Array.from({ length: aLen + 1 }, () =>\r\n      new Array(bLen + 1).fill(0),\r\n    );\r\n    for (let i = 0; i <= aLen; i++) matrix[i][0] = i;\r\n    for (let j = 0; j <= bLen; j++) matrix[0][j] = j;\r\n\r\n    for (let i = 1; i <= aLen; i++) {\r\n      for (let j = 1; j <= bLen; j++) {\r\n        const cost = a[i - 1] === b[j - 1] ? 0 : 1;\r\n        matrix[i][j] = Math.min(\r\n          matrix[i - 1][j] + 1,\r\n          matrix[i][j - 1] + 1,\r\n          matrix[i - 1][j - 1] + cost,\r\n        );\r\n        if (\r\n          i > 1 &&\r\n          j > 1 &&\r\n          a[i - 1] === b[j - 2] &&\r\n          a[i - 2] === b[j - 1]\r\n        ) {\r\n          matrix[i][j] = Math.min(matrix[i][j], matrix[i - 2][j - 2] + 1);\r\n        }\r\n      }\r\n    }\r\n    return matrix[aLen][bLen];\r\n  }\r\n\r\n  // Similarity ratio in [0, 1] after normalization. 1.0 = identical.\r\n  private similarityRatio(a: string, b: string): number {\r\n    const normA = this.normalizeForMatch(a);\r\n    const normB = this.normalizeForMatch(b);\r\n    if (!normA || !normB) return 0;\r\n    if (normA === normB) return 1;\r\n    const distance = this.damerauLevenshteinDistance(normA, normB);\r\n    const maxLen = Math.max(normA.length, normB.length);\r\n    return 1 - distance / maxLen;\r\n  }\r\n\r\n  // Returns true if the fixture's (category, width) has a library match.\r\n  // Width must equal exactly; category passes if it's an exact normalized\r\n  // match OR a fuzzy match >= 80% against any library category at that width.\r\n  private isLibraryMatch(fixture: any): boolean {\r\n    const width = fixture?.fixtureWidth?.value;\r\n    if (width == null) return false;\r\n    const candidates = this.fixtureLibraryByWidth.get(width);\r\n    if (!candidates || candidates.size === 0) return false;\r\n\r\n    const fixtureCat = this.normalizeForMatch(fixture?.fixtureCategory ?? \"\");\r\n    if (!fixtureCat) return false;\r\n\r\n    if (candidates.has(fixtureCat)) return true;\r\n\r\n    for (const libCat of candidates) {\r\n      if (this.similarityRatio(fixtureCat, libCat) >= 0.8) return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  validateFixtures() {\r\n    const hasIvm = this.ivmAliasKeys.size > 0;\r\n    const hasLib = this.fixtureLibraryByWidth.size > 0;\r\n    if (!hasIvm && !hasLib) return;\r\n\r\n    this.allFixtureInstances.forEach((fixture: any) => {\r\n      if (fixture.fixtureName === \"space\") return;\r\n\r\n      if (hasIvm) {\r\n        const headerLabel: string = fixture?.header?.label ?? \"\";\r\n        fixture.headerInvalid =\r\n          !headerLabel || !this.ivmAliasKeys.has(headerLabel);\r\n      }\r\n\r\n      if (hasLib) {\r\n        fixture.libraryInvalid = !this.isLibraryMatch(fixture);\r\n      }\r\n    });\r\n  }\r\n\r\n  // templateGroupNames that legitimately carry no brand/zone allocation, so they\r\n  // must never be flagged red for \"missing allocation\". \"CL\" is Contact Lens,\r\n  // which the IVM brand/zone logic does not allocate. Compared case-insensitively.\r\n  private readonly allocationExemptGroups = new Set<string>([\"cl\"]);\r\n\r\n  private isAllocationExempt(fixture: any): boolean {\r\n    const group = `${fixture?.templateGroupName ?? \"\"}`.trim().toLowerCase();\r\n    return !!group && this.allocationExemptGroups.has(group);\r\n  }\r\n\r\n  // True if `brand` holds at least one non-empty value. Shelf/fixture brand\r\n  // names are arrays post-allocation but can also arrive as a bare string, so\r\n  // both shapes are handled.\r\n  private hasBrandValue(brand: any): boolean {\r\n    if (Array.isArray(brand)) {\r\n      return brand.some((b: any) => b != null && `${b}`.trim() !== \"\");\r\n    }\r\n    return brand != null && `${brand}`.trim() !== \"\";\r\n  }\r\n\r\n  // Post-allocation check: is this fixture missing an allocation it should have?\r\n  // Allocation writes a brand at the fixture level and/or onto each product shelf\r\n  // (grouped into zones Top/Mid/Bottom/All). Wall and floor (center) fixtures are\r\n  // treated identically. A fixture is flagged when:\r\n  //   - it has no allocation anywhere (empty fixture), or\r\n  //   - its shelves are allocated but a product zone was left without a brand.\r\n  // \"space\", pure VM-only fixtures, and exempt groups (e.g. CL) are never flagged.\r\n  private hasZoneWithoutAllocation(fixture: any): boolean {\r\n    if (!fixture || fixture.fixtureName === \"space\") return false;\r\n    if (this.isAllocationExempt(fixture)) return false;\r\n\r\n    const shelves = Array.isArray(fixture.shelfConfig)\r\n      ? fixture.shelfConfig\r\n      : [];\r\n    // VM-only shelves never hold product, so they can't carry an allocation\r\n    // and are excluded from the zone check (mirrors `actualShelves`).\r\n    const productShelves = shelves.filter(\r\n      (s: any) => s?.shelfType !== \"vmonly\",\r\n    );\r\n    const level = `${fixture?.productResolutionLevel ?? \"\"}`.toUpperCase();\r\n\r\n    // L1 fixtures hold a single fixture-level allocation (no per-zone split), so\r\n    // they are complete as long as the fixture carries a brand.\r\n    if (level === \"L1\") {\r\n      return !this.hasBrandValue(fixture?.productBrandName);\r\n    }\r\n\r\n    // No product shelves to break into zones. A pure VM-only fixture (it has\r\n    // shelves, but all VM-only) holds no product and is never flagged; anything\r\n    // else (e.g. a floor fixture with no shelfConfig) is judged by its\r\n    // fixture-level brand.\r\n    if (!productShelves.length) {\r\n      if (shelves.length > 0) return false;\r\n      return !this.hasBrandValue(fixture?.productBrandName);\r\n    }\r\n\r\n    // Per-zone (L2/L3): every product zone must carry at least one brand. The\r\n    // fixture-level aggregate brand is intentionally ignored here so a stale or\r\n    // aggregate value can't mask a zone the allocation actually left empty.\r\n    const zoneHasBrand = new Map<string, boolean>();\r\n    for (const shelf of productShelves) {\r\n      const zone = `${shelf?.zone ?? \"\"}`.trim() || \"All\";\r\n      zoneHasBrand.set(\r\n        zone,\r\n        (zoneHasBrand.get(zone) ?? false) ||\r\n          this.hasBrandValue(shelf?.productBrandName),\r\n      );\r\n    }\r\n\r\n    return Array.from(zoneHasBrand.values()).some((allocated) => !allocated);\r\n  }\r\n\r\n  // Stamps `allocationInvalid` onto every fixture so the canvas can paint\r\n  // unallocated fixtures red and the Complete button can gate on them. Only\r\n  // meaningful once allocation has run; otherwise all flags are cleared.\r\n  validateZoneAllocations() {\r\n    const fixtures = this.allFixtureInstances;\r\n    if (!this.isAllocationRun) {\r\n      fixtures.forEach((f: any) => (f.allocationInvalid = false));\r\n      return;\r\n    }\r\n    fixtures.forEach((f: any) => {\r\n      f.allocationInvalid = this.hasZoneWithoutAllocation(f);\r\n    });\r\n  }\r\n\r\n  get hasInvalidHeaderFixtures(): boolean {\r\n    if (!this.ivmAliasKeys.size) return false;\r\n    return this.allFixtureInstances.some(\r\n      (f: any) => f.fixtureName !== \"space\" && f.headerInvalid,\r\n    );\r\n  }\r\n\r\n  get invalidHeaderFixtureCount(): number {\r\n    return this.allFixtureInstances.filter(\r\n      (f: any) => f.fixtureName !== \"space\" && f.headerInvalid,\r\n    ).length;\r\n  }\r\n\r\n  get hasInvalidLibraryFixtures(): boolean {\r\n    if (!this.fixtureLibraryByWidth.size) return false;\r\n    return this.allFixtureInstances.some(\r\n      (f: any) => f.fixtureName !== \"space\" && f.libraryInvalid,\r\n    );\r\n  }\r\n\r\n  get invalidLibraryFixtureCount(): number {\r\n    return this.allFixtureInstances.filter(\r\n      (f: any) => f.fixtureName !== \"space\" && f.libraryInvalid,\r\n    ).length;\r\n  }\r\n\r\n  get hasInvalidFixtures(): boolean {\r\n    return this.hasInvalidHeaderFixtures || this.hasInvalidLibraryFixtures;\r\n  }\r\n\r\n  get invalidFixturesTooltip(): string {\r\n    if (!this.hasInvalidFixtures) return \"\";\r\n\r\n    const parts: string[] = [];\r\n    const headerCount = this.invalidHeaderFixtureCount;\r\n    const libCount = this.invalidLibraryFixtureCount;\r\n\r\n    if (headerCount > 0) {\r\n      parts.push(\r\n        `${headerCount} fixture${headerCount === 1 ? \"\" : \"s\"} ` +\r\n          `${headerCount === 1 ? \"has\" : \"have\"} unrecognized headers.`,\r\n      );\r\n    }\r\n    if (libCount > 0) {\r\n      parts.push(\r\n        `${libCount} fixture${libCount === 1 ? \"\" : \"s\"} ` +\r\n          `${libCount === 1 ? \"does\" : \"do\"} not match any library entry.`,\r\n      );\r\n    }\r\n    parts.push(\"Fix them to run allocation\");\r\n    return parts.join(\" \");\r\n  }\r\n\r\n  // After allocation, true if any fixture still has a zone without an\r\n  // allocation. Used to keep the Complete Allocation button disabled.\r\n  get hasUnallocatedZoneFixtures(): boolean {\r\n    if (!this.isAllocationRun) return false;\r\n    return this.allFixtureInstances.some((f: any) => f.allocationInvalid);\r\n  }\r\n\r\n  get unallocatedZoneFixtureCount(): number {\r\n    if (!this.isAllocationRun) return 0;\r\n    return this.allFixtureInstances.filter((f: any) => f.allocationInvalid)\r\n      .length;\r\n  }\r\n\r\n  get unallocatedZonesTooltip(): string {\r\n    const count = this.unallocatedZoneFixtureCount;\r\n    if (!count) return \"\";\r\n    return (\r\n      `${count} fixture${count === 1 ? \"\" : \"s\"} ` +\r\n      `${count === 1 ? \"has\" : \"have\"} a zone without any allocation. ` +\r\n      `Fix the highlighted fixtures to complete allocation.`\r\n    );\r\n  }\r\n\r\n  get isEditLayoutAllowed() {\r\n    if (this.layoutForm.disabled && !this.isAllocationRun) {\r\n      if (this.getStatus === \"draft\") {\r\n        return true;\r\n      }\r\n\r\n      if (\r\n        this.getStatus === \"allocationPending\" &&\r\n        this.isRunAllocationAllowed\r\n      ) {\r\n        return true;\r\n      }\r\n\r\n      return false;\r\n    } else {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async renderFloor(update: boolean = true) {\r\n    this.drawInitialContent();\r\n    if (update) {\r\n      this.createForm();\r\n\r\n      this.floorData.layoutPolygon.forEach((wall: any) => {\r\n        if (wall.elementType === \"wall\") {\r\n          const wallItem = this.patchWallElements({\r\n            elementType: wall.elementType,\r\n            elementNumber: wall.elementNumber,\r\n          });\r\n\r\n          wall.fixtures.forEach((fixture: any) => {\r\n            if (fixture?.fixtureName === \"space\") return;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: fixture.fixtureName,\r\n              fixtureConfigId: fixture.fixtureConfigId,\r\n              _id: fixture._id,\r\n            });\r\n            (wallItem.get(\"fixtures\") as FormArray).push(fixtureGroup);\r\n          });\r\n\r\n          wall.otherElements?.forEach((ele: any) => {\r\n            const eleGroup = this.fb.group({\r\n              type: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? ele.fixtureName\r\n                  : \"Others\",\r\n              ],\r\n              customName: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? \"\"\r\n                  : ele.fixtureName,\r\n              ],\r\n            });\r\n            (wallItem.get(\"otherElements\") as FormArray).push(eleGroup);\r\n          });\r\n\r\n          this.getFormWalls.push(wallItem);\r\n        }\r\n      });\r\n\r\n      if (this.floorData?.centerFixture?.length) {\r\n        this.floorData?.centerFixture.forEach((fixture: any) => {\r\n          const fixtureGroup = this.patchFixture({\r\n            fixtureName: fixture.fixtureName,\r\n            fixtureConfigId: fixture.fixtureConfigId,\r\n            _id: fixture._id,\r\n          });\r\n          (this.layoutForm.get(\"floorFixtures\") as FormArray).push(\r\n            fixtureGroup,\r\n          );\r\n        });\r\n      }\r\n\r\n      if (this.floorData?.otherElements?.length) {\r\n        this.floorData?.otherElements?.forEach((ele: any) => {\r\n          const eleGroup = this.fb.group({\r\n            type: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? ele.fixtureName\r\n                : \"Others\",\r\n            ],\r\n            customName: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? \"\"\r\n                : ele.fixtureName,\r\n            ],\r\n          });\r\n\r\n          (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n            eleGroup,\r\n          );\r\n        });\r\n      }\r\n    }\r\n\r\n    this.subscribeToFixtureConfigIdChanges();\r\n    this.subscribeToOtherElementsChanges();\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    this.canvas.clear();\r\n    this.reorderFixture(this.floorData);\r\n    await this.drawLayoutElements();\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.updateAllPositions();\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  // Shared median helper for the robust (outlier-tolerant) bounds below.\r\n  private median(values: number[]): number {\r\n    if (!values.length) return 0;\r\n    const sorted = [...values].sort((a, b) => a - b);\r\n    const mid = Math.floor(sorted.length / 2);\r\n    return sorted.length % 2\r\n      ? sorted[mid]\r\n      : (sorted[mid - 1] + sorted[mid]) / 2;\r\n  }\r\n\r\n  // Union bounds of the canvas objects with gross positional outliers removed.\r\n  // A single element carrying a bad far coordinate — a CAD orphan wall stranded\r\n  // at the origin, an unplaced fixture — would otherwise inflate the frame and\r\n  // collapse the fit zoom to an invisible speck. We drop objects whose center\r\n  // lies far outside the cluster (median center + a generous multiple of the\r\n  // spread) and fit to what remains, so no single stray of ANY type (wall,\r\n  // entrance, fixture, other) can hide the whole layout. Falls back to the full\r\n  // union when there are too few objects to reason about statistically.\r\n  private getRobustLayoutBounds() {\r\n    const entries = this.canvas\r\n      .getObjects()\r\n      .map((o: any) => ({ o, r: o.getBoundingRect() }))\r\n      .filter(\r\n        ({ r }) =>\r\n          Number.isFinite(r.left) &&\r\n          Number.isFinite(r.top) &&\r\n          Number.isFinite(r.width) &&\r\n          Number.isFinite(r.height),\r\n      );\r\n    if (!entries.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    const union = (list: { r: any }[]) => {\r\n      let minX = Infinity,\r\n        minY = Infinity,\r\n        maxX = -Infinity,\r\n        maxY = -Infinity;\r\n      for (const { r } of list) {\r\n        minX = Math.min(minX, r.left);\r\n        minY = Math.min(minY, r.top);\r\n        maxX = Math.max(maxX, r.left + r.width);\r\n        maxY = Math.max(maxY, r.top + r.height);\r\n      }\r\n      return { left: minX, top: minY, width: maxX - minX, height: maxY - minY };\r\n    };\r\n\r\n    if (entries.length < 4) return union(entries);\r\n\r\n    const cxs = entries.map(({ r }) => r.left + r.width / 2);\r\n    const cys = entries.map(({ r }) => r.top + r.height / 2);\r\n    const medX = this.median(cxs);\r\n    const medY = this.median(cys);\r\n    const dists = entries.map((_, i) =>\r\n      Math.hypot(cxs[i] - medX, cys[i] - medY),\r\n    );\r\n    const medDist = this.median(dists);\r\n    const mad = this.median(dists.map((d) => Math.abs(d - medDist)));\r\n    const spread = mad > 1 ? mad : medDist > 1 ? medDist : 1;\r\n    const threshold = medDist + 6 * spread;\r\n\r\n    const kept = entries.filter((_, i) => dists[i] <= threshold);\r\n    const dropped = entries.filter((_, i) => dists[i] > threshold);\r\n\r\n    if (dropped.length) {\r\n      console.warn(\r\n        `[fit] ignoring ${dropped.length} out-of-cluster object(s) while fitting`,\r\n        dropped.map(({ o, r }) => ({\r\n          type: o?.objType,\r\n          id: o?.fixtureId ?? o?.data?._id ?? o?.data?.elementNumber,\r\n          bounds: r,\r\n        })),\r\n      );\r\n    }\r\n\r\n    return kept.length ? union(kept) : union(entries);\r\n  }\r\n\r\n  // Wall start-points (px, in element order) for the real outline, with only\r\n  // genuine ORPHAN walls removed. An orphan is detected by connectivity, not by\r\n  // distance: walls are joined into components by endpoint proximity, the main\r\n  // component (largest total length) is the outline, and a separate component is\r\n  // dropped ONLY if it also sits far from that outline (a stranded CAD artifact\r\n  // like LKST5100's wall at the origin). This is shape-agnostic — elongated and\r\n  // L-shaped stores keep every wall, so a proper layout is never mis-trimmed and\r\n  // its fixtures are never falsely flagged as stray.\r\n  private getConnectedWallPolygon(): { x: number; y: number }[] {\r\n    const walls = (this.floorData?.layoutPolygon ?? []).filter(\r\n      (w: any) => w?.elementType === \"wall\",\r\n    );\r\n\r\n    const seg = walls\r\n      .map((w: any) => {\r\n        const unit = w.relativePosition?.unit || \"ft\";\r\n        const sx = this.toPixels(w.relativePosition?.x ?? 0, unit);\r\n        const sy = this.toPixels(w.relativePosition?.y ?? 0, unit);\r\n        const a = fabric.util.degreesToRadians(w.angle ?? 0);\r\n        const len = this.toPixels(w.distance ?? 0, w.unit || \"ft\");\r\n        return { sx, sy, ex: sx + Math.cos(a) * len, ey: sy + Math.sin(a) * len };\r\n      })\r\n      .filter((s: any) =>\r\n        [s.sx, s.sy, s.ex, s.ey].every((n: number) => Number.isFinite(n)),\r\n      );\r\n\r\n    const startPts = () => seg.map((s: any) => ({ x: s.sx, y: s.sy }));\r\n    if (seg.length < 4) return startPts();\r\n\r\n    // Join walls whose endpoints touch (within tolerance) into components.\r\n    const tol = this.toPixels(4, \"ft\");\r\n    const near = (ax: number, ay: number, bx: number, by: number) =>\r\n      Math.hypot(ax - bx, ay - by) <= tol;\r\n    const connected = (a: any, b: any) =>\r\n      near(a.sx, a.sy, b.sx, b.sy) ||\r\n      near(a.sx, a.sy, b.ex, b.ey) ||\r\n      near(a.ex, a.ey, b.sx, b.sy) ||\r\n      near(a.ex, a.ey, b.ex, b.ey);\r\n\r\n    const parent = seg.map((_: any, i: number) => i);\r\n    const find = (i: number): number => {\r\n      while (parent[i] !== i) {\r\n        parent[i] = parent[parent[i]];\r\n        i = parent[i];\r\n      }\r\n      return i;\r\n    };\r\n    for (let i = 0; i < seg.length; i++) {\r\n      for (let j = i + 1; j < seg.length; j++) {\r\n        if (connected(seg[i], seg[j])) parent[find(i)] = find(j);\r\n      }\r\n    }\r\n\r\n    const groups = new Map<number, number[]>();\r\n    seg.forEach((_: any, i: number) => {\r\n      const r = find(i);\r\n      if (!groups.has(r)) groups.set(r, []);\r\n      groups.get(r)!.push(i);\r\n    });\r\n    // Only one component → nothing to trim; a proper layout returns untouched.\r\n    if (groups.size < 2) return startPts();\r\n\r\n    const boundsOf = (idxs: number[]) => {\r\n      const xs = idxs.flatMap((i) => [seg[i].sx, seg[i].ex]);\r\n      const ys = idxs.flatMap((i) => [seg[i].sy, seg[i].ey]);\r\n      return {\r\n        l: Math.min(...xs),\r\n        t: Math.min(...ys),\r\n        r: Math.max(...xs),\r\n        b: Math.max(...ys),\r\n      };\r\n    };\r\n    const lenOf = (idxs: number[]) =>\r\n      idxs.reduce(\r\n        (s, i) => s + Math.hypot(seg[i].ex - seg[i].sx, seg[i].ey - seg[i].sy),\r\n        0,\r\n      );\r\n\r\n    let main = [...groups.values()][0];\r\n    for (const g of groups.values()) if (lenOf(g) > lenOf(main)) main = g;\r\n\r\n    const mb = boundsOf(main);\r\n    const mainDiag = Math.hypot(mb.r - mb.l, mb.b - mb.t);\r\n    // Far = separated from the outline by more than its own size (generous, so\r\n    // only a genuinely stranded component is dropped, never a nearby segment).\r\n    const farThreshold = Math.max(mainDiag, this.toPixels(20, \"ft\"));\r\n    const rectGap = (A: any, B: any) => {\r\n      const dx = Math.max(0, A.l - B.r, B.l - A.r);\r\n      const dy = Math.max(0, A.t - B.b, B.t - A.b);\r\n      return Math.hypot(dx, dy);\r\n    };\r\n\r\n    const orphan = new Set<number>();\r\n    for (const g of groups.values()) {\r\n      if (g === main) continue;\r\n      if (rectGap(boundsOf(g), mb) > farThreshold) {\r\n        g.forEach((i) => orphan.add(i));\r\n      }\r\n    }\r\n    if (!orphan.size) return startPts();\r\n\r\n    // Keep every non-orphan wall, preserving element order for the polygon.\r\n    return seg\r\n      .map((s: any, i: number) => ({ s, i }))\r\n      .filter(({ i }: any) => !orphan.has(i))\r\n      .map(({ s }: any) => ({ x: s.sx, y: s.sy }));\r\n  }\r\n\r\n  // Reclaims elements whose stored position renders them outside the wall\r\n  // perimeter — the bad-coordinate artifacts a CAD import can leave behind.\r\n  // Wall fixtures snap back onto their own wall; floor fixtures collapse into\r\n  // the center cluster; other elements are packed into free interior space.\r\n  // Mutates floorData positions in place (purely from data, before any drawing)\r\n  // so the layout renders tight AND the corrected coordinates persist on the\r\n  // next save. Returns how many elements were moved.\r\n  private reclaimStrayElements(): number {\r\n    const floor = this.floorData;\r\n    if (!floor?.layoutPolygon?.length) return 0;\r\n\r\n    // Connectivity-based wall polygon: only a genuinely stranded orphan wall is\r\n    // excluded, so elongated / L-shaped layouts keep their full outline and\r\n    // their fixtures are never falsely flagged.\r\n    const wallPolygon = this.getConnectedWallPolygon();\r\n    if (wallPolygon.length < 3) return 0;\r\n\r\n    const bounds = this.polygonBounds(wallPolygon);\r\n    if (!bounds.width || !bounds.height) return 0;\r\n\r\n    const margin = this.toPixels(3, \"ft\");\r\n    const padMinX = bounds.left - margin;\r\n    const padMinY = bounds.top - margin;\r\n    const padMaxX = bounds.left + bounds.width + margin;\r\n    const padMaxY = bounds.top + bounds.height + margin;\r\n\r\n    const rectOf = (el: any) => {\r\n      const rp = el?.relativePosition ?? {};\r\n      const unit = rp.unit || \"ft\";\r\n      return {\r\n        x: this.toPixels(rp.x ?? 0, unit),\r\n        y: this.toPixels(rp.y ?? 0, unit),\r\n        w: this.toPixels(\r\n          el?.fixtureStaticWidth?.value ?? 0,\r\n          el?.fixtureStaticWidth?.unit || \"ft\",\r\n        ),\r\n        h: this.toPixels(\r\n          el?.fixtureStaticLength?.value ?? 0,\r\n          el?.fixtureStaticLength?.unit || \"ft\",\r\n        ),\r\n      };\r\n    };\r\n\r\n    // Stray = rect fully outside the padded perimeter, or has non-finite coords.\r\n    const isStray = (r: { x: number; y: number; w: number; h: number }) => {\r\n      if (![r.x, r.y, r.w, r.h].every((n) => Number.isFinite(n))) return true;\r\n      return !(\r\n        r.x < padMaxX &&\r\n        r.x + r.w > padMinX &&\r\n        r.y < padMaxY &&\r\n        r.y + r.h > padMinY\r\n      );\r\n    };\r\n\r\n    // Safety net: gather every candidate element and bail out entirely if a\r\n    // large fraction look \"stray\". On a proper layout almost nothing is stray;\r\n    // a high ratio means the perimeter was mis-derived, and mass-relocating a\r\n    // correct layout is far worse than doing nothing. The robust fit still keeps\r\n    // the layout visible in that case.\r\n    const candidates: any[] = [\r\n      ...floor.layoutPolygon.flatMap((w: any) =>\r\n        w?.elementType === \"wall\" && Array.isArray(w.fixtures)\r\n          ? w.fixtures.filter((f: any) => f?.fixtureName !== \"space\")\r\n          : [],\r\n      ),\r\n      ...(Array.isArray(floor.centerFixture)\r\n        ? floor.centerFixture.filter((f: any) => f?.fixtureName !== \"space\")\r\n        : []),\r\n      ...(Array.isArray(floor.otherElements) ? floor.otherElements : []),\r\n      ...floor.layoutPolygon.flatMap((w: any) =>\r\n        w?.elementType === \"wall\" && Array.isArray(w.otherElements)\r\n          ? w.otherElements\r\n          : [],\r\n      ),\r\n    ];\r\n    const strayCount = candidates.filter((el) => isStray(rectOf(el))).length;\r\n    if (candidates.length && strayCount / candidates.length > 0.5) {\r\n      console.warn(\r\n        `[reclaim] ${strayCount}/${candidates.length} elements flagged stray — ` +\r\n          `skipping reclaim to avoid disrupting a proper layout`,\r\n      );\r\n      return 0;\r\n    }\r\n\r\n    // Occupancy seeded with wall footprints so nothing gets placed on a wall.\r\n    const occupancy: { x: number; y: number; w: number; h: number }[] = [];\r\n    for (const w of floor.layoutPolygon) {\r\n      if (w?.elementType === \"wall\") occupancy.push(this.wallAabb(w));\r\n    }\r\n\r\n    let moved = 0;\r\n    const log: any[] = [];\r\n\r\n    // --- Wall fixtures: snap strays onto their own wall, after the run ---\r\n    for (const wall of floor.layoutPolygon) {\r\n      if (wall?.elementType !== \"wall\" || !Array.isArray(wall.fixtures)) {\r\n        continue;\r\n      }\r\n\r\n      const angleRad = fabric.util.degreesToRadians(wall.angle ?? 0);\r\n      const dirX = Math.cos(angleRad);\r\n      const dirY = Math.sin(angleRad);\r\n      const normX = Math.cos(angleRad + Math.PI / 2) * this.wallThickness;\r\n      const normY = Math.sin(angleRad + Math.PI / 2) * this.wallThickness;\r\n      const baseX = this.toPixels(\r\n        wall.relativePosition?.x ?? 0,\r\n        wall.relativePosition?.unit || \"ft\",\r\n      );\r\n      const baseY = this.toPixels(\r\n        wall.relativePosition?.y ?? 0,\r\n        wall.relativePosition?.unit || \"ft\",\r\n      );\r\n      const wallLenPx = this.toPixels(wall.distance ?? 0, wall.unit || \"ft\");\r\n      const startBuffer = 40;\r\n      const gap = 8;\r\n\r\n      // How far along the wall the already well-placed fixtures reach.\r\n      let cursor = startBuffer;\r\n      const strays: any[] = [];\r\n      for (const f of wall.fixtures) {\r\n        if (f?.fixtureName === \"space\") continue;\r\n        const r = rectOf(f);\r\n        if (isStray(r)) {\r\n          strays.push(f);\r\n          continue;\r\n        }\r\n        const t = (r.x - baseX) * dirX + (r.y - baseY) * dirY;\r\n        cursor = Math.max(cursor, t + r.w + gap);\r\n        occupancy.push(r);\r\n      }\r\n      for (const f of strays) {\r\n        const r = rectOf(f);\r\n        const offset = Math.max(\r\n          startBuffer,\r\n          Math.min(cursor, Math.max(startBuffer, wallLenPx - r.w)),\r\n        );\r\n        const nx = baseX + dirX * offset + normX;\r\n        const ny = baseY + dirY * offset + normY;\r\n        f.relativePosition = { ...(f.relativePosition ?? {}), unit: \"ft\" };\r\n        f.relativePosition.x = this.fromPixels(nx, \"ft\");\r\n        f.relativePosition.y = this.fromPixels(ny, \"ft\");\r\n        occupancy.push({ x: nx, y: ny, w: r.w, h: r.h });\r\n        cursor += r.w + gap;\r\n        moved++;\r\n        log.push({\r\n          kind: \"wall-fixture\",\r\n          wall: wall.elementNumber,\r\n          name: f.fixtureName,\r\n        });\r\n      }\r\n    }\r\n\r\n    // --- Center (floor) fixtures: pull strays into the cluster centroid ---\r\n    const centers = Array.isArray(floor.centerFixture)\r\n      ? floor.centerFixture\r\n      : [];\r\n    const goodCenters = centers.filter(\r\n      (f: any) => f?.fixtureName !== \"space\" && !isStray(rectOf(f)),\r\n    );\r\n    const clusterCenter = () => {\r\n      if (goodCenters.length) {\r\n        let sx = 0;\r\n        let sy = 0;\r\n        for (const f of goodCenters) {\r\n          const r = rectOf(f);\r\n          sx += r.x + r.w / 2;\r\n          sy += r.y + r.h / 2;\r\n        }\r\n        return { cx: sx / goodCenters.length, cy: sy / goodCenters.length };\r\n      }\r\n      return {\r\n        cx: bounds.left + bounds.width / 2,\r\n        cy: bounds.top + bounds.height / 2,\r\n      };\r\n    };\r\n    for (const f of centers) {\r\n      if (f?.fixtureName === \"space\") continue;\r\n      const r = rectOf(f);\r\n      if (!isStray(r)) {\r\n        occupancy.push(r);\r\n        continue;\r\n      }\r\n      const { cx, cy } = clusterCenter();\r\n      const nx = cx - r.w / 2;\r\n      const ny = cy - r.h / 2;\r\n      f.relativePosition = { ...(f.relativePosition ?? {}), unit: \"ft\" };\r\n      f.relativePosition.x = this.fromPixels(nx, \"ft\");\r\n      f.relativePosition.y = this.fromPixels(ny, \"ft\");\r\n      occupancy.push({ x: nx, y: ny, w: r.w, h: r.h });\r\n      moved++;\r\n      log.push({ kind: \"floor-fixture\", name: f.fixtureName });\r\n    }\r\n\r\n    // --- Other elements (wall-attached + floor): pack into free interior ---\r\n    const others: any[] = [\r\n      ...(Array.isArray(floor.otherElements) ? floor.otherElements : []),\r\n      ...floor.layoutPolygon.flatMap((w: any) =>\r\n        w?.elementType === \"wall\" && Array.isArray(w.otherElements)\r\n          ? w.otherElements\r\n          : [],\r\n      ),\r\n    ];\r\n    for (const o of others) {\r\n      const r = rectOf(o);\r\n      if (!isStray(r)) {\r\n        occupancy.push(r);\r\n        continue;\r\n      }\r\n      const spot = this.findFreeInteriorSpot(\r\n        r.w,\r\n        r.h,\r\n        wallPolygon,\r\n        bounds,\r\n        occupancy,\r\n      );\r\n      o.relativePosition = { ...(o.relativePosition ?? {}), unit: \"ft\" };\r\n      o.relativePosition.x = this.fromPixels(spot.x, \"ft\");\r\n      o.relativePosition.y = this.fromPixels(spot.y, \"ft\");\r\n      occupancy.push({ x: spot.x, y: spot.y, w: r.w, h: r.h });\r\n      moved++;\r\n      log.push({ kind: \"other\", name: o.fixtureName });\r\n    }\r\n\r\n    if (moved) {\r\n      console.warn(\r\n        `[reclaim] moved ${moved} stray element(s) back into the layout`,\r\n        log,\r\n      );\r\n    }\r\n    return moved;\r\n  }\r\n\r\n  // AABB (px) of a wall segment including its thickness, for occupancy tests.\r\n  private wallAabb(wall: any) {\r\n    const angleRad = fabric.util.degreesToRadians(wall?.angle ?? 0);\r\n    const bx = this.toPixels(\r\n      wall?.relativePosition?.x ?? 0,\r\n      wall?.relativePosition?.unit || \"ft\",\r\n    );\r\n    const by = this.toPixels(\r\n      wall?.relativePosition?.y ?? 0,\r\n      wall?.relativePosition?.unit || \"ft\",\r\n    );\r\n    const len = this.toPixels(wall?.distance ?? 0, wall?.unit || \"ft\");\r\n    const ex = bx + Math.cos(angleRad) * len;\r\n    const ey = by + Math.sin(angleRad) * len;\r\n    const half = this.wallThickness / 2;\r\n    return {\r\n      x: Math.min(bx, ex) - half,\r\n      y: Math.min(by, ey) - half,\r\n      w: Math.abs(ex - bx) + this.wallThickness,\r\n      h: Math.abs(ey - by) + this.wallThickness,\r\n    };\r\n  }\r\n\r\n  // Bounding box (px) of a set of polygon points.\r\n  private polygonBounds(points: { x: number; y: number }[]) {\r\n    const xs = points.map((p) => p.x);\r\n    const ys = points.map((p) => p.y);\r\n    const left = Math.min(...xs);\r\n    const top = Math.min(...ys);\r\n    return {\r\n      left,\r\n      top,\r\n      width: Math.max(...xs) - left,\r\n      height: Math.max(...ys) - top,\r\n    };\r\n  }\r\n\r\n  // Scans the wall interior for a spot that fits a w×h rect fully inside the\r\n  // polygon and clear of `occupancy`, preferring roomy, central spots (mirrors\r\n  // the placement used when adding a new floor fixture). Falls back to a relaxed\r\n  // overlap-allowed scan, then dead center, so it always returns a point.\r\n  private findFreeInteriorSpot(\r\n    w: number,\r\n    h: number,\r\n    polygon: { x: number; y: number }[],\r\n    bounds: { left: number; top: number; width: number; height: number },\r\n    occupancy: { x: number; y: number; w: number; h: number }[],\r\n  ): { x: number; y: number } {\r\n    const fits = (x: number, y: number) =>\r\n      this.isPointInsidePolygon({ x, y }, polygon) &&\r\n      this.isPointInsidePolygon({ x: x + w, y }, polygon) &&\r\n      this.isPointInsidePolygon({ x, y: y + h }, polygon) &&\r\n      this.isPointInsidePolygon({ x: x + w, y: y + h }, polygon);\r\n\r\n    const overlaps = (x: number, y: number) =>\r\n      occupancy.some((o) => this.rectsOverlap({ x, y, w, h }, o));\r\n\r\n    const centerX = bounds.left + bounds.width / 2;\r\n    const centerY = bounds.top + bounds.height / 2;\r\n    const step = Math.max(w / 2, this.toPixels(0.5, \"ft\"));\r\n\r\n    const scan = (skipOverlap: boolean) => {\r\n      let bestScore = -Infinity;\r\n      let bestPos: { x: number; y: number } | null = null;\r\n      for (let y = bounds.top; y <= bounds.top + bounds.height - h; y += step) {\r\n        for (\r\n          let x = bounds.left;\r\n          x <= bounds.left + bounds.width - w;\r\n          x += step\r\n        ) {\r\n          if (!fits(x, y)) continue;\r\n          if (!skipOverlap && overlaps(x, y)) continue;\r\n          const emptyMargin = this.computeEmptyMargin(\r\n            { x, y, w, h },\r\n            bounds,\r\n            occupancy,\r\n          );\r\n          const dx = centerX - (x + w / 2);\r\n          const dy = centerY - (y + h / 2);\r\n          const score = emptyMargin * 1000 - (dx * dx + dy * dy) * 0.001;\r\n          if (score > bestScore) {\r\n            bestScore = score;\r\n            bestPos = { x, y };\r\n          }\r\n        }\r\n      }\r\n      return bestPos;\r\n    };\r\n\r\n    return (\r\n      scan(false) ?? scan(true) ?? { x: centerX - w / 2, y: centerY - h / 2 }\r\n    );\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    if (this.layoutForm.enabled) return;\r\n\r\n    // Fit to the cluster of objects with gross outliers removed, rather than the\r\n    // union of everything. A single element with a bad far coordinate — e.g. a\r\n    // CAD orphan wall stranded at the origin while the real store sits thousands\r\n    // of feet away — would otherwise blow up the frame and collapse the zoom to\r\n    // an invisible speck. getRobustLayoutBounds() drops such strays of any type.\r\n    const bounds = this.getRobustLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    // Clamp to the same bounds the manual wheel-zoom uses so a degenerate or\r\n    // oversized layout can never shrink the view to an invisible speck.\r\n    const targetZoom = Math.max(\r\n      0.05,\r\n      Math.min(Math.min(scaleX, scaleY) * 0.9, 5),\r\n    ); // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    const extraTopPaddingPx = 24;\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] =\r\n      canvasH / 2 -\r\n      (bounds.top + bounds.height / 2) * targetZoom +\r\n      extraTopPaddingPx; // center Y + extra top padding\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    const floor = this.floorData;\r\n\r\n    // Pull any elements sitting outside the wall perimeter (bad CAD-import\r\n    // coordinates) back into the layout before drawing, so the layout renders\r\n    // tight and the corrected positions persist on save. No-op when nothing is\r\n    // out of bounds. Runs before compaction so far strays can't skew it. The\r\n    // perimeter comes from getConnectedWallPolygon (orphan walls detected by\r\n    // connectivity, not distance) so elongated / L-shaped layouts like LKST4936\r\n    // keep every wall and are never disturbed.\r\n    this.reclaimStrayElements();\r\n\r\n    for (let index = 0; index < floor.layoutPolygon.length; index++) {\r\n      const element = floor.layoutPolygon[index];\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        let width = this.toPixels(element.distance, element.unit);\r\n        if (width < height) width = this.wallThickness + 1;\r\n        await this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n    }\r\n\r\n    // For cad layouts only.\r\n    this.layoutBounds = this.getFullLayoutBounds();\r\n\r\n    for (let index = 0; index < floor.layoutPolygon.length; index++) {\r\n      const element = floor.layoutPolygon[index];\r\n      if (element.elementType !== \"wall\") continue;\r\n\r\n      const fixtureGroups: fabric.Group[] = [];\r\n\r\n      for (let j = 0; j < element?.fixtures?.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        const fixtureHeight = this.toPixels(\r\n          fixture.fixtureStaticLength.value,\r\n          fixture.fixtureStaticLength.unit,\r\n        );\r\n        const fixtureWidth = this.toPixels(\r\n          fixture.fixtureStaticWidth.value,\r\n          fixture.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        let x = this.toPixels(\r\n          fixture.relativePosition.x,\r\n          fixture.relativePosition.unit,\r\n        );\r\n        let y = this.toPixels(\r\n          fixture.relativePosition.y,\r\n          fixture.relativePosition.unit,\r\n        );\r\n\r\n        // override the fixture position for initial cad layouts.\r\n        // if (this.floorData?.cadLayout) {\r\n        //   const baseX = this.toPixels(\r\n        //     element.relativePosition.x,\r\n        //     element.relativePosition.unit,\r\n        //   );\r\n\r\n        //   const baseY = this.toPixels(\r\n        //     element.relativePosition.y,\r\n        //     element.relativePosition.unit,\r\n        //   );\r\n        //   const startBuffer = 40;\r\n        //   const spacing = 136;\r\n        //   const offset = startBuffer + spacing * j;\r\n\r\n        //   const angleRad = fabric.util.degreesToRadians(element.angle);\r\n\r\n        //   const dirX = Math.cos(angleRad);\r\n        //   const dirY = Math.sin(angleRad);\r\n\r\n        //   const normalOffset = this.wallThickness;\r\n\r\n        //   const normX = Math.cos(angleRad + Math.PI / 2) * normalOffset;\r\n        //   const normY = Math.sin(angleRad + Math.PI / 2) * normalOffset;\r\n\r\n        //   x = baseX + dirX * offset + normX;\r\n        //   y = baseY + dirY * offset + normY;\r\n        // }\r\n\r\n        const fixtureObj = await this.drawFixture(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          fixtureHeight,\r\n          fixtureWidth,\r\n          fixture,\r\n        );\r\n        fixtureGroups.push(fixtureObj as fabric.Group);\r\n      }\r\n\r\n      for (let j = 0; j < element?.otherElements?.length; j++) {\r\n        const otherElement = element.otherElements[j];\r\n        const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n        const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n        const a = otherElement.relativePosition.angle;\r\n        const h = this.toPixels(\r\n          otherElement.fixtureStaticLength.value,\r\n          otherElement.fixtureStaticLength.unit,\r\n        );\r\n        const w = this.toPixels(\r\n          otherElement.fixtureStaticWidth.value,\r\n          otherElement.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        this.drawOtherElementsWithLabel(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          a,\r\n          w,\r\n          h,\r\n          otherElement,\r\n        );\r\n      }\r\n    }\r\n\r\n    // //If CAD layout\r\n    // if (this.floorData?.cadLayout && this.floorData?.centerFixture?.length) {\r\n    //   const fixtures = this.floorData.centerFixture;\r\n\r\n    //   const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n    //   const occupiedRects = this.getOccupiedRects();\r\n\r\n    //   const fixtureWidthPx = this.toPixels(\r\n    //     fixtures[0].fixtureStaticWidth.value,\r\n    //     fixtures[0].fixtureStaticWidth.unit,\r\n    //   );\r\n\r\n    //   const fixtureHeightPx = this.toPixels(\r\n    //     fixtures[0].fixtureStaticLength.value,\r\n    //     fixtures[0].fixtureStaticLength.unit,\r\n    //   );\r\n\r\n    //   const total = fixtures.length;\r\n\r\n    //   const maxRows = 2;\r\n    //   const rows = Math.min(maxRows, total);\r\n    //   const columns = Math.ceil(total / rows);\r\n\r\n    //   const gridWidth = columns * fixtureWidthPx;\r\n    //   const gridHeight = rows * fixtureHeightPx;\r\n\r\n    //   const bounds = this.getFullLayoutBounds();\r\n    //   const centerX = bounds.left + bounds.width / 2;\r\n    //   const centerY = bounds.top + bounds.height / 2;\r\n\r\n    //   const isInsidePolygon = (x: number, y: number) => {\r\n    //     return (\r\n    //       this.isPointInsidePolygon({ x, y }, layoutPolygon) &&\r\n    //       this.isPointInsidePolygon({ x: x + gridWidth, y }, layoutPolygon) &&\r\n    //       this.isPointInsidePolygon({ x, y: y + gridHeight }, layoutPolygon) &&\r\n    //       this.isPointInsidePolygon(\r\n    //         { x: x + gridWidth, y: y + gridHeight },\r\n    //         layoutPolygon,\r\n    //       )\r\n    //     );\r\n    //   };\r\n\r\n    //   const overlapsOccupied = (x: number, y: number) => {\r\n    //     const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n    //     for (const occ of occupiedRects) {\r\n    //       if (this.rectsOverlap(gridRect, occ)) {\r\n    //         return true;\r\n    //       }\r\n    //     }\r\n\r\n    //     return false;\r\n    //   };\r\n\r\n    //   const findBestPosition = (mode: \"strict\" | \"relaxed\") => {\r\n    //     let bestScore = -Infinity;\r\n    //     let bestPos: { x: number; y: number } | null = null;\r\n\r\n    //     const step = fixtureWidthPx / 2;\r\n\r\n    //     for (\r\n    //       let y = bounds.top;\r\n    //       y <= bounds.top + bounds.height - gridHeight;\r\n    //       y += step\r\n    //     ) {\r\n    //       for (\r\n    //         let x = bounds.left;\r\n    //         x <= bounds.left + bounds.width - gridWidth;\r\n    //         x += step\r\n    //       ) {\r\n    //         if (!isInsidePolygon(x, y)) continue;\r\n\r\n    //         if (mode === \"strict\" && overlapsOccupied(x, y)) continue;\r\n\r\n    //         const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n    //         const emptyMargin = this.computeEmptyMargin(\r\n    //           gridRect,\r\n    //           bounds,\r\n    //           occupiedRects,\r\n    //         );\r\n\r\n    //         const dx = centerX - (x + gridWidth / 2);\r\n    //         const dy = centerY - (y + gridHeight / 2);\r\n    //         const centerPenalty = dx * dx + dy * dy;\r\n\r\n    //         const score = emptyMargin * 1000 - centerPenalty * 0.001;\r\n\r\n    //         if (score > bestScore) {\r\n    //           bestScore = score;\r\n    //           bestPos = { x, y };\r\n    //         }\r\n    //       }\r\n    //     }\r\n\r\n    //     return bestPos;\r\n    //   };\r\n\r\n    //   let bestPos = findBestPosition(\"strict\");\r\n\r\n    //   if (!bestPos) {\r\n    //     console.warn(\"Strict placement failed. Trying relaxed mode...\");\r\n    //     bestPos = findBestPosition(\"relaxed\");\r\n    //   }\r\n\r\n    //   if (!bestPos) {\r\n    //     console.warn(\"Relaxed placement failed. Falling back to center.\");\r\n    //     bestPos = {\r\n    //       x: centerX - gridWidth / 2,\r\n    //       y: centerY - gridHeight / 2,\r\n    //     };\r\n    //   }\r\n\r\n    //   fixtures.forEach((fixture: any, index: number) => {\r\n    //     // N-shape traversal: col fills left-to-right, each column fills bottom row first then top row\r\n    //     const col = Math.floor(index / 2);\r\n    //     const row = index % 2 === 0 ? 1 : 0;\r\n\r\n    //     const x = bestPos!.x + col * fixtureWidthPx;\r\n    //     const y = bestPos!.y + row * fixtureHeightPx;\r\n\r\n    //     fixture.relativePosition.x = this.fromPixels(x, \"ft\");\r\n    //     fixture.relativePosition.y = this.fromPixels(y, \"ft\");\r\n    //   });\r\n    // }\r\n\r\n    if (\r\n      this.floorData?.cadLayout &&\r\n      this.floorData?.centerFixture?.length\r\n    ) {\r\n      this.compactCenterFixtures(this.floorData.centerFixture);\r\n    }\r\n\r\n    for (let i = 0; i < floor?.centerFixture?.length; i++) {\r\n      const fixture = floor.centerFixture[i];\r\n\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < floor?.otherElements?.length; j++) {\r\n      const otherElement = floor.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawOtherElementsWithLabel(this.canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  compactCenterFixtures(fixtures: any[]) {\r\n    if (!fixtures?.length) return;\r\n\r\n    const GAP_FACTOR = 0.3; // 70% reduction\r\n\r\n    const items = fixtures.map((f) => {\r\n      const w = this.toPixels(\r\n        f.fixtureStaticWidth.value,\r\n        f.fixtureStaticWidth.unit,\r\n      );\r\n      const h = this.toPixels(\r\n        f.fixtureStaticLength.value,\r\n        f.fixtureStaticLength.unit,\r\n      );\r\n\r\n      const x = this.toPixels(f.relativePosition.x, f.relativePosition.unit);\r\n      const y = this.toPixels(f.relativePosition.y, f.relativePosition.unit);\r\n\r\n      return { f, x, y, w, h };\r\n    });\r\n\r\n    // 👉 Capture original center\r\n    const getBounds = (list:any) => {\r\n      const minX = Math.min(...list.map((i:any) => i.x));\r\n      const minY = Math.min(...list.map((i:any) => i.y));\r\n      const maxX = Math.max(...list.map((i:any) => i.x + i.w));\r\n      const maxY = Math.max(...list.map((i:any) => i.y + i.h));\r\n\r\n      return {\r\n        minX,\r\n        minY,\r\n        width: maxX - minX,\r\n        height: maxY - minY,\r\n        centerX: minX + (maxX - minX) / 2,\r\n        centerY: minY + (maxY - minY) / 2,\r\n      };\r\n    };\r\n\r\n    const originalBounds = getBounds(items);\r\n\r\n    // STEP 1: group rows\r\n    const rowThreshold = Math.min(...items.map((i) => i.h)) / 2;\r\n\r\n    const rows: any[][] = [];\r\n    items.sort((a, b) => a.y - b.y);\r\n\r\n    for (const item of items) {\r\n      let placed = false;\r\n\r\n      for (const row of rows) {\r\n        if (Math.abs(row[0].y - item.y) < rowThreshold) {\r\n          row.push(item);\r\n          placed = true;\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (!placed) rows.push([item]);\r\n    }\r\n\r\n    rows.forEach((row) => row.sort((a, b) => a.x - b.x));\r\n\r\n    // STEP 2: horizontal compaction (scaled gaps)\r\n    rows.forEach((row) => {\r\n      for (let i = 1; i < row.length; i++) {\r\n        const prev = row[i - 1];\r\n        const curr = row[i];\r\n\r\n        const originalGap = curr.x - (prev.x + prev.w);\r\n\r\n        if (originalGap > 0) {\r\n          const newGap = originalGap * GAP_FACTOR;\r\n          curr.x = prev.x + prev.w + newGap;\r\n        }\r\n      }\r\n    });\r\n\r\n    // STEP 3: vertical compaction (scaled gaps)\r\n    for (let r = 1; r < rows.length; r++) {\r\n      const prevRow = rows[r - 1];\r\n      const currRow = rows[r];\r\n\r\n      const prevBottom = Math.max(...prevRow.map((i) => i.y + i.h));\r\n      const currTop = Math.min(...currRow.map((i) => i.y));\r\n\r\n      const originalGap = currTop - prevBottom;\r\n\r\n      if (originalGap > 0) {\r\n        const newGap = originalGap * GAP_FACTOR;\r\n        const shift = originalGap - newGap;\r\n\r\n        currRow.forEach((item) => {\r\n          item.y -= shift;\r\n        });\r\n      }\r\n    }\r\n\r\n    // STEP 4: restore center\r\n    const newBounds = getBounds(items);\r\n\r\n    const dx = originalBounds.centerX - newBounds.centerX;\r\n    const dy = originalBounds.centerY - newBounds.centerY;\r\n\r\n    items.forEach((item) => {\r\n      item.x += dx;\r\n      item.y += dy;\r\n    });\r\n\r\n    // STEP 5: write back\r\n    items.forEach((item) => {\r\n      item.f.relativePosition.x = this.fromPixels(item.x, \"ft\");\r\n      item.f.relativePosition.y = this.fromPixels(item.y, \"ft\");\r\n    });\r\n  }\r\n\r\n\r\n  private isPointInsidePolygon(\r\n    point: { x: number; y: number },\r\n    polygon: { x: number; y: number }[],\r\n  ): boolean {\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x,\r\n        yi = polygon[i].y;\r\n      const xj = polygon[j].x,\r\n        yj = polygon[j].y;\r\n\r\n      const intersect =\r\n        yi > point.y !== yj > point.y &&\r\n        point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n  private getOccupiedRects(): { x: number; y: number; w: number; h: number }[] {\r\n    return this.canvas.getObjects().map((obj) => {\r\n      const r = obj.getBoundingRect();\r\n      return {\r\n        x: r.left,\r\n        y: r.top,\r\n        w: r.width,\r\n        h: r.height,\r\n      };\r\n    });\r\n  }\r\n\r\n  private rectsOverlap(\r\n    a: { x: number; y: number; w: number; h: number },\r\n    b: { x: number; y: number; w: number; h: number },\r\n  ): boolean {\r\n    return !(\r\n      a.x + a.w <= b.x ||\r\n      a.x >= b.x + b.w ||\r\n      a.y + a.h <= b.y ||\r\n      a.y >= b.y + b.h\r\n    );\r\n  }\r\n\r\n  private computeEmptyMargin(\r\n    gridRect: { x: number; y: number; w: number; h: number },\r\n    bounds: { left: number; top: number; width: number; height: number },\r\n    occupiedRects: { x: number; y: number; w: number; h: number }[],\r\n  ): number {\r\n    let minMargin = Infinity;\r\n\r\n    // distance to layout bounds\r\n    minMargin = Math.min(\r\n      minMargin,\r\n      gridRect.x - bounds.left,\r\n      bounds.left + bounds.width - (gridRect.x + gridRect.w),\r\n      gridRect.y - bounds.top,\r\n      bounds.top + bounds.height - (gridRect.y + gridRect.h),\r\n    );\r\n\r\n    // distance to other objects\r\n    for (const occ of occupiedRects) {\r\n      // horizontal gap\r\n      if (occ.y < gridRect.y + gridRect.h && occ.y + occ.h > gridRect.y) {\r\n        if (occ.x + occ.w <= gridRect.x) {\r\n          minMargin = Math.min(minMargin, gridRect.x - (occ.x + occ.w));\r\n        } else if (occ.x >= gridRect.x + gridRect.w) {\r\n          minMargin = Math.min(minMargin, occ.x - (gridRect.x + gridRect.w));\r\n        }\r\n      }\r\n\r\n      // vertical gap\r\n      if (occ.x < gridRect.x + gridRect.w && occ.x + occ.w > gridRect.x) {\r\n        if (occ.y + occ.h <= gridRect.y) {\r\n          minMargin = Math.min(minMargin, gridRect.y - (occ.y + occ.h));\r\n        } else if (occ.y >= gridRect.y + gridRect.h) {\r\n          minMargin = Math.min(minMargin, occ.y - (gridRect.y + gridRect.h));\r\n        }\r\n      }\r\n    }\r\n\r\n    return minMargin;\r\n  }\r\n\r\n  drawFixtureRowLabel(text: string, x: number, y: number) {\r\n    const label = new fabric.Text(text, {\r\n      left: x,\r\n      top: y,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#333\",\r\n      originX: \"left\",\r\n      originY: \"bottom\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(label);\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const lockSvgString = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n       <path d=\"M7 11V7C7 5.67392 7.52678 4.40215 8.46447 3.46447C9.40215 2.52678 10.6739 2 12 2C13.3261 2 14.5979 2.52678 15.5355 3.46447C16.4732 4.40215 17 5.67392 17 7V11M5 11H19C20.1046 11 21 11.8954 21 13V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V13C3 11.8954 3.89543 11 5 11Z\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n       </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(lockSvgString);\r\n\r\n    let lockSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    const wallCenterX = width / 2;\r\n    const wallCenterY = height / 2;\r\n\r\n    lockSvg.scaleToWidth(20);\r\n    lockSvg.scaleToHeight(20);\r\n\r\n    if (isVertical) {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: -90,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    } else {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: 0,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    }\r\n\r\n    lockSvg.set({\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    lockSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n      elementData.isLocked = !elementData?.isLocked;\r\n      this.renderFloor(false);\r\n    });\r\n\r\n    elements.push(lockSvg);\r\n\r\n    let modCenterX = x;\r\n    let modCenterY = y;\r\n    let angle = elementData.angle;\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: modCenterX,\r\n      top: modCenterY,\r\n      hasControls: true,\r\n      lockScalingX: isVertical,\r\n      lockScalingY: !isVertical,\r\n      selectable: this.layoutForm.enabled,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n\r\n    // Single guard driving the red treatment. Header/library mismatches flag a\r\n    // fixture before allocation; `allocationInvalid` flags a fixture with a zone\r\n    // left without an allocation after allocation has run. All paint red.\r\n    const fixtureInvalid =\r\n      fixtureData.headerInvalid ||\r\n      fixtureData.libraryInvalid ||\r\n      fixtureData.allocationInvalid;\r\n\r\n    // When flagged, the whole fixture frame (not just the header/shelves) is\r\n    // painted red so empty fixtures — which have little or no shelf area to\r\n    // colour — are still unmistakably highlighted.\r\n    const frameStroke = fixtureInvalid ? \"#D92D20\" : \"#51C1FF\";\r\n    const frameFill = fixtureInvalid ? \"#FEE4E2\" : \"white\";\r\n\r\n    // Resolve the angle the fixture group will render at. For first-render of a\r\n    // CAD-uploaded layout, the wall angle is the source of truth (otherwise we\r\n    // honor the fixture's own saved angle). When that angle lies in the\r\n    // upside-down range (90°, 270°), we flip the fixture body 180° in place so\r\n    // it renders canonical (header at top, storage at bottom). The body flip\r\n    // also brings the text upright as a side effect, so no per-text rotation\r\n    // is needed. Trade-off: on flipped walls the storage box ends up visually\r\n    // touching the wall instead of the header.\r\n    let angle = fixtureData?.relativePosition?.angle ?? 0;\r\n    if (this.floorData.cadLayout && fixtureData.fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(\r\n        fixtureData.associatedElementNumber,\r\n      );\r\n      angle = wallData?.angle ?? 0;\r\n    }\r\n    const normAngle = ((((angle as number) % 360) + 360) % 360);\r\n    const shouldFlipBody =\r\n      this.floorData.cadLayout &&\r\n      fixtureData.fixtureType === \"wall\" &&\r\n      normAngle > 90 &&\r\n      normAngle < 270;\r\n\r\n    // To rotate the body 180° while keeping the same on-canvas region, shift\r\n    // the anchor by R(originalAngle)·(width, height) — that's the canvas\r\n    // position of the un-rotated bbox's bottom-right corner relative to the\r\n    // anchor — and add 180° to the rotation. fabric still pivots around\r\n    // top-left of the un-rotated bbox at the new anchor.\r\n    let renderX = x;\r\n    let renderY = y;\r\n    let renderAngle = angle as number;\r\n    if (shouldFlipBody) {\r\n      const rad = ((angle as number) * Math.PI) / 180;\r\n      const cosA = Math.cos(rad);\r\n      const sinA = Math.sin(rad);\r\n      renderX = x + cosA * width - sinA * height;\r\n      renderY = y + sinA * width + cosA * height;\r\n      renderAngle = (angle as number) + 180;\r\n    }\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? frameStroke,\r\n      strokeWidth: 0.27,\r\n      fill: frameFill,\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? frameStroke,\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n         L ${topX + topWidth - radius} ${topY} \r\n         Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n         L ${topX + topWidth} ${topY + innerBoxHeight} \r\n         L ${topX} ${topY + innerBoxHeight} \r\n         L ${topX} ${topY + radius} \r\n         Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? frameStroke,\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topFieldText =\r\n      (fixtureData.fixtureType === \"wall\"\r\n        ? `Wall-${fixtureData.associatedElementNumber} - `\r\n        : \"Floor - \") +\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`;\r\n\r\n    const topText = new fabric.Textbox(topFieldText, {\r\n      left: topX + topWidth / 2,\r\n      top: topY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n     L ${topX + topWidth} ${secondBoxY} \r\n     L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n     Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n       topX + topWidth - radius\r\n     } ${secondBoxY + innerBoxHeight} \r\n     L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n     Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n       secondBoxY + innerBoxHeight - radius\r\n     } \r\n     L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? frameStroke,\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? frameStroke,\r\n      strokeWidth: 0.27,\r\n      fill: frameFill,\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n         L ${midX + midWidth - radius} ${firstBoxY} \r\n         Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n           firstBoxY + radius\r\n         } \r\n         L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n         L ${midX} ${firstBoxY + boxHeight} \r\n         L ${midX} ${firstBoxY + radius} \r\n         Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureInvalid\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureInvalid\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureInvalid ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureInvalid\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureInvalid\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureInvalid\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureInvalid\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        if (\r\n          startIndex > fixtureData?.shelfConfig.length ||\r\n          endIndex > fixtureData?.shelfConfig.length\r\n        )\r\n          continue;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n         L ${midX + midWidth} ${lastBoxY} \r\n         L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n         Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n           midX + midWidth - radius\r\n         } ${lastBoxY + boxHeight} \r\n         L ${midX + radius} ${lastBoxY + boxHeight} \r\n         Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n           lastBoxY + boxHeight - radius\r\n         } \r\n         L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureInvalid\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureInvalid\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${\r\n        getFixtureProductCapacity(fixtureData?.shelfConfig)\r\n      } . VM - ${fixtureData?.vmConfig?.length ?? 0}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const svgString = `\r\n       <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n       <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"white\"/>\r\n       <path d=\"M14.9998 6.60001C15.1574 6.44243 15.3445 6.31742 15.5504 6.23214C15.7563 6.14685 15.977 6.10296 16.1998 6.10296C16.4227 6.10296 16.6434 6.14685 16.8492 6.23214C17.0551 6.31742 17.2422 6.44243 17.3998 6.60001C17.5574 6.7576 17.6824 6.94468 17.7677 7.15058C17.853 7.35648 17.8969 7.57715 17.8969 7.80001C17.8969 8.02288 17.853 8.24355 17.7677 8.44945C17.6824 8.65535 17.5574 8.84243 17.3998 9.00001L9.29982 17.1L5.99982 18L6.89982 14.7L14.9998 6.60001Z\" stroke=\"#1D2939\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n       </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(svgString);\r\n\r\n    let editSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    editSvg.set({\r\n      scaleX: 1,\r\n      scaleY: 1,\r\n      left: x + width - 30,\r\n      top: y + 14,\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true, // allow events\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    editSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n\r\n      if (this.hasUnsavedLayoutChanges()) {\r\n        this.toastService.getErrorToast(\r\n          \"Save your layout changes before editing the fixture\",\r\n        );\r\n        return;\r\n      }\r\n\r\n      this.selectedFixture = {\r\n        fixtureType: fixtureData.fixtureType,\r\n        wallIndex: fixtureData.associatedElementNumber,\r\n        fixtureIndex: fixtureData.associatedElementFixtureNumber,\r\n        fixtureId: fixtureData._id,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = fixture;\r\n      }\r\n      delete this?.selectedFixtureData?.taskType;\r\n      this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      this.editFixture = true;\r\n    });\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n        editSvg,\r\n      ],\r\n      {\r\n        left: renderX,\r\n        top: renderY,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: this.layoutForm.enabled,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        angle: renderAngle,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    if (\r\n      !fixtureData?.issue &&\r\n      !fixtureData?.unsavedChanges &&\r\n      this.layoutForm.enabled\r\n    ) {\r\n      fixtureGroup.on(\"mouseover\", function () {\r\n        editSvg.set(\"visible\", true);\r\n        canvas.renderAll();\r\n      });\r\n      fixtureGroup.on(\"mouseout\", function () {\r\n        editSvg.set(\"visible\", false);\r\n        canvas.renderAll();\r\n      });\r\n    }\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      if (this.layoutForm.disabled) {\r\n        this.togglePanel(\"right\", false);\r\n      } else {\r\n        this.highlightFixtureInAccordion(fixtureData);\r\n      }\r\n\r\n      this.highlightFixture(target);\r\n      this.selectFixtureOnCanvasClick(target, true);\r\n      this.selectedFixtureData = fixtureData;\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n    (fixtureGroup as any).data = fixtureData;\r\n\r\n    // this.canvas.on(\"object:moving\", (e) => {\r\n    //   const target = e.target as any;\r\n    //   if (!target || target.objType !== \"fixture\") return;\r\n\r\n    //   const angleDeg = target.angle || 0;\r\n    //   const angle = (angleDeg * Math.PI) / 180;\r\n    //   if (!target._lastLeft) {\r\n    //     target._lastLeft = target.left;\r\n    //     target._lastTop = target.top;\r\n    //   }\r\n    //   const dx = target.left - target._lastLeft;\r\n    //   const dy = target.top - target._lastTop;\r\n    //   const projected = dx * Math.cos(angle) + dy * Math.sin(angle);\r\n    //   target.left = target._lastLeft + projected * Math.cos(angle);\r\n    //   target.top = target._lastTop + projected * Math.sin(angle);\r\n    //   target._lastLeft = target.left;\r\n    //   target._lastTop = target.top;\r\n    // });\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(fixtureGroup);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n    const angle = elementData.angle;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: this.layoutForm.enabled,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n\r\n    setTimeout(() => {\r\n      this.drawEntranceDissectionLine(canvas, group, width, height, angle);\r\n    }, 0);\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      selectable: this.layoutForm.enabled,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  subscribeToFixtureConfigIdChanges() {\r\n    this.fixtureConfigSubscriptions.forEach((sub) => sub.unsubscribe());\r\n    this.fixtureConfigSubscriptions = [];\r\n\r\n    this.getFormWalls.controls.forEach((control, i) => {\r\n      const wallGroup = control as FormGroup;\r\n      const fixturesArray = wallGroup.get(\"fixtures\") as FormArray;\r\n\r\n      fixturesArray.controls.forEach((fixtureControl, j) => {\r\n        const fixtureGroup = fixtureControl as FormGroup;\r\n        const sub = fixtureGroup\r\n          .get(\"fixtureConfigId\")\r\n          ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n          .subscribe((newValue) => {\r\n            this.changeFixtureTemplate(newValue, \"wall\", j, i);\r\n          });\r\n\r\n        if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n      });\r\n    });\r\n\r\n    this.getFormFloorFixtures.controls.forEach((fixtureControl, k) => {\r\n      const fixtureGroup = fixtureControl as FormGroup;\r\n      const sub = fixtureGroup\r\n        .get(\"fixtureConfigId\")\r\n        ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n        .subscribe((newValue) => {\r\n          this.changeFixtureTemplate(newValue, \"floor\", k);\r\n        });\r\n\r\n      if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n    });\r\n  }\r\n\r\n  subscribeToOtherElementsChanges() {\r\n    this.otherElementsSubscriptions.forEach((sub) => sub?.unsubscribe());\r\n    this.otherElementsSubscriptions = [];\r\n\r\n    // Wall-level otherElements label subscriptions\r\n    this.getFormWalls.controls.forEach((control) => {\r\n      const wallGroup = control as FormGroup;\r\n      const otherArray = wallGroup.get(\"otherElements\") as FormArray;\r\n\r\n      otherArray.controls.forEach((ctrl, otherIdx) => {\r\n        const elementGroup = ctrl as FormGroup;\r\n        const typeControl = elementGroup.get(\"type\") as FormControl;\r\n        const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n\r\n        const wallMeta = this.floorData.layoutPolygon.find(\r\n          (el: any) =>\r\n            el.elementType === wallGroup.get(\"elementType\")?.value &&\r\n            el.elementNumber === wallGroup.get(\"elementNumber\")?.value,\r\n        );\r\n        const elementRef = wallMeta?.otherElements?.[otherIdx];\r\n        if (!elementRef) return;\r\n\r\n        // when type changes (dropdown)\r\n        const subType = typeControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((selected: string) => {\r\n            // if user picks \"Others\", prefer customName if present, otherwise set fixtureName to \"Others\"\r\n            elementRef.fixtureName =\r\n              selected === \"Others\"\r\n                ? customNameControl?.value || \"Others\"\r\n                : selected;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          });\r\n\r\n        // when customName changes (text input visible only when type === 'Others')\r\n        const subCustom = customNameControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((custom: string) => {\r\n            if (typeControl.value === \"Others\") {\r\n              elementRef.fixtureName = custom;\r\n              this.updateCanvasOtherElementLabel(elementRef);\r\n            }\r\n          });\r\n\r\n        this.otherElementsSubscriptions.push(subType, subCustom);\r\n      });\r\n    });\r\n\r\n    // Floor-level otherElements label subscriptions\r\n    this.getFormFloorOtherElements.controls.forEach((ctrl, idx) => {\r\n      const elementGroup = ctrl as FormGroup;\r\n      const typeControl = elementGroup.get(\"type\") as FormControl;\r\n      const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n      const elementRef = this.floorData?.otherElements?.[idx];\r\n      if (!elementRef) return;\r\n\r\n      const subType = typeControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((selected: string) => {\r\n          elementRef.fixtureName =\r\n            selected === \"Others\"\r\n              ? customNameControl?.value || \"Others\"\r\n              : selected;\r\n          this.updateCanvasOtherElementLabel(elementRef);\r\n        });\r\n\r\n      const subCustom = customNameControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((custom: string) => {\r\n          if (typeControl.value === \"Others\") {\r\n            elementRef.fixtureName = custom;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          }\r\n        });\r\n\r\n      this.otherElementsSubscriptions.push(subType, subCustom);\r\n    });\r\n  }\r\n\r\n  updateCanvasOtherElementLabel(elementRef: any) {\r\n    if (!this.canvas) return;\r\n    const group = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj?.objType === \"others\" && obj?.data._id === elementRef._id,\r\n      ) as any;\r\n\r\n    if (!group) return;\r\n    group.data = elementRef;\r\n\r\n    const textObj = (group.getObjects() || []).find(\r\n      (o: any) => o?.type === \"text\" || o?.type === \"textbox\",\r\n    ) as fabric.Text | fabric.Textbox | undefined;\r\n\r\n    if (textObj) {\r\n      (textObj as any).set({ text: elementRef.fixtureName });\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  selectFixtureOnCanvasClick(target: any, collapseTaskInfo: boolean = false) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        vmConfig: target.vmConfig,\r\n      };\r\n    }\r\n  }\r\n\r\n  async getFixtureTemplates(): Promise<void> {\r\n    const payload = {\r\n      clientId: this.clientId,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getAllTemplates(payload),\r\n      );\r\n      const data = res?.data;\r\n\r\n      if (data) {\r\n        this.fixtureTemplates = data.map((t: any) => {\r\n          return {\r\n            _id: t._id,\r\n            name: t.fixtureName.includes(\"-ft\")\r\n              ? t.fixtureName\r\n              : `${t.fixtureName} - ${t.fixtureWidth.value} ${t.fixtureWidth.unit}`,\r\n            subtext: `${t.productBrandName?.join(\", \")}`,\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Error fetching fixture templates:\", error);\r\n    }\r\n  }\r\n\r\n  createForm() {\r\n    this.layoutForm = this.fb.group({\r\n      walls: this.fb.array([]),\r\n      floorFixtures: this.fb.array([]),\r\n      floorOtherElements: this.fb.array([]),\r\n    });\r\n  }\r\n\r\n  get getFormWalls() {\r\n    return this.layoutForm.get(\"walls\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorFixtures() {\r\n    return this.layoutForm.get(\"floorFixtures\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorOtherElements() {\r\n    return this.layoutForm.get(\"floorOtherElements\") as FormArray;\r\n  }\r\n\r\n  get getEntrances() {\r\n    return this.floorData?.layoutPolygon?.filter(\r\n      (ele: any) => ele.elementType === \"entrance\",\r\n    );\r\n  }\r\n\r\n  getWallOtherElements(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"otherElements\") as FormArray;\r\n  }\r\n\r\n  getFormFixtures(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"fixtures\") as FormArray;\r\n  }\r\n\r\n  patchWallElements({ elementType, elementNumber }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      elementType: [elementType ? elementType : \"\", [Validators.required]],\r\n      elementNumber: [elementNumber ? elementNumber : 0, [Validators.required]],\r\n      fixtures: this.fb.array([]),\r\n      otherElements: this.fb.array([]),\r\n    });\r\n    return item;\r\n  }\r\n\r\n  patchFixture({ fixtureName, fixtureConfigId, _id }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      fixtureName: [fixtureName ? fixtureName : \"\", [Validators.required]],\r\n      fixtureConfigId: [\r\n        fixtureConfigId ? fixtureConfigId : \"\",\r\n        [Validators.required],\r\n      ],\r\n      _id: [_id ? _id : \"\", [Validators.required]],\r\n    });\r\n    return item;\r\n  }\r\n\r\n  addWallSpace(wallIndex: number, operation: \"increment\" | \"decrement\") {\r\n    if (this.layoutForm.disabled) return;\r\n    const clickedWallNumber = wallIndex + 1;\r\n    const mmToFeet = 305;\r\n    const fixtureHeight = 1524 / mmToFeet; // ~5 ft (horizontal increment)\r\n    const fixtureWidth = 1220 / mmToFeet; // ~4 ft (vertical increment)\r\n\r\n    const layout = this.floorData.layoutPolygon;\r\n\r\n    const getWall = (num: number) =>\r\n      layout.find(\r\n        (el: any) => el.elementType === \"wall\" && el.elementNumber === num,\r\n      );\r\n\r\n    const amount = operation === \"increment\" ? 1 : -1;\r\n\r\n    const w1 = getWall(1);\r\n    const w2 = getWall(2);\r\n    const w3 = getWall(3);\r\n    const w4 = getWall(4);\r\n    const w5 = getWall(5);\r\n    const entrance = layout.find((el: any) => el.elementType === \"entrance\");\r\n\r\n    // ----------------------------------------------\r\n    // Horizontal growth  (Wall-1 / Wall-3)\r\n    // ----------------------------------------------\r\n    if (clickedWallNumber === 1 || clickedWallNumber === 3) {\r\n      if (w1) w1.distance += amount * fixtureWidth;\r\n      if (w3) w3.distance += amount * fixtureWidth;\r\n\r\n      if (w2) {\r\n        w2.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.x =\r\n            (fx.relativePosition.x || 0) + amount * fixtureWidth;\r\n        });\r\n      }\r\n    }\r\n\r\n    // ----------------------------------------------\r\n    // Vertical growth  (Wall-2 / Wall-4 / Wall-5)\r\n    // ----------------------------------------------\r\n    if (\r\n      clickedWallNumber === 2 ||\r\n      clickedWallNumber === 4 ||\r\n      clickedWallNumber === 5\r\n    ) {\r\n      if (w2) w2.distance += amount * fixtureHeight;\r\n\r\n      if (w3) {\r\n        w3.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.y =\r\n            (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n        });\r\n      }\r\n\r\n      const entranceY = entrance?.distance || 0;\r\n      const existingW4 = w4?.distance || 0;\r\n      const existingW5 = w5?.distance || 0;\r\n\r\n      // Grow wall-4 if we clicked wall-4 OR wall-2\r\n      if ((clickedWallNumber === 4 || clickedWallNumber === 2) && w4) {\r\n        w4.distance = this.roundToTwo(existingW4 + amount * fixtureHeight);\r\n      }\r\n\r\n      // Grow wall-5 if we clicked wall-5 OR wall-2\r\n      if ((clickedWallNumber === 5 || clickedWallNumber === 2) && w5) {\r\n        w5.distance = this.roundToTwo(existingW5 + amount * fixtureHeight);\r\n\r\n        if (w4) {\r\n          w4.fixtures.forEach((fx: any) => {\r\n            fx.relativePosition.y =\r\n              (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n          });\r\n        }\r\n      }\r\n\r\n      // Prevent overflow: shrink back if total > w2 size\r\n      const totalUsed = entranceY + (w4?.distance || 0) + (w5?.distance || 0);\r\n      if (totalUsed > w2!.distance) {\r\n        if (w5) {\r\n          w5.distance = this.roundToTwo(\r\n            w5.distance - (totalUsed - w2!.distance),\r\n          );\r\n        }\r\n      }\r\n    }\r\n\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  deleteFixture(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      this.getFormFixtures(wallIndex!).removeAt(fixtureIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.fixtures)) {\r\n        wall.fixtures.splice(fixtureIndex, 1);\r\n      }\r\n    } else if (fixtureType === \"floor\") {\r\n      this.getFormFloorFixtures.removeAt(fixtureIndex);\r\n\r\n      if (Array.isArray(this.floorData.centerFixture)) {\r\n        this.floorData.centerFixture.splice(fixtureIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  removeOtherElement(\r\n    elementType: \"wall\" | \"floor\",\r\n    elementIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (elementType === \"wall\") {\r\n      this.getWallOtherElements(wallIndex!).removeAt(elementIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.otherElements)) {\r\n        wall.otherElements.splice(elementIndex, 1);\r\n      }\r\n    } else if (elementType === \"floor\") {\r\n      this.getFormFloorOtherElements.removeAt(elementIndex);\r\n\r\n      if (Array.isArray(this.floorData.otherElements)) {\r\n        this.floorData.otherElements.splice(elementIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  changeFixtureTemplate(\r\n    configId: string,\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    this.apiService\r\n      .getFixtureTemplate(configId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (fixtureType === \"wall\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            this.getFormFixtures(wallIndex!).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            const wallRef = this.getWallByNumber(wallIndex! + 1)!;\r\n            wallRef.fixtures[fixtureIndex] = {\r\n              ...wallRef.fixtures[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          } else if (fixtureType === \"floor\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            (this.layoutForm.get(\"floorFixtures\") as FormArray).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            this.floorData.centerFixture[fixtureIndex] = {\r\n              ...this.floorData.centerFixture[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          }\r\n\r\n          this.renderFloor(false);\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to fetch templates\");\r\n        },\r\n      });\r\n  }\r\n\r\n  onDrop(\r\n    event: any,\r\n    destinationWallIndex: number | \"floor\",\r\n    destinationFixtureIndex?: number,\r\n  ) {\r\n    const data = event.data;\r\n\r\n    if (this.layoutForm.disabled) return;\r\n    const isSourceFloor = data.wallIndex === \"floor\";\r\n    const isDestinationFloor = destinationWallIndex === \"floor\";\r\n\r\n    const sourceFormArray: FormArray = isSourceFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(data.wallIndex);\r\n\r\n    const destinationFormArray: FormArray = isDestinationFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(destinationWallIndex as number);\r\n\r\n    const sourceWallMeta = isSourceFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls.at(data.wallIndex).get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const destinationWallMeta = isDestinationFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls\r\n            .at(destinationWallIndex as number)\r\n            .get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const sFixtureIndex = sourceWallMeta.findIndex(\r\n      (fixture: any) =>\r\n        fixture._id ===\r\n        sourceFormArray.at(data.fixtureIndex)?.get(\"_id\")?.value,\r\n    );\r\n\r\n    const dFixtureIndex =\r\n      destinationFixtureIndex !== undefined\r\n        ? destinationWallMeta.findIndex(\r\n            (fixture: any) =>\r\n              fixture._id ===\r\n              destinationFormArray.at(destinationFixtureIndex)?.get(\"_id\")\r\n                ?.value,\r\n          )\r\n        : destinationFormArray.length;\r\n\r\n    const sPosition = {\r\n      fixtureNumber: sourceWallMeta[sFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n    const dPosition = {\r\n      fixtureNumber: destinationWallMeta[dFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n\r\n    if (sourceWallMeta === destinationWallMeta) {\r\n      destinationWallMeta[dFixtureIndex].fixtureNumber =\r\n        sPosition.fixtureNumber;\r\n      destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber =\r\n        sPosition.associatedElementFixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    } else {\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    }\r\n\r\n    this.transferArrayItem(\r\n      sourceFormArray.controls,\r\n      destinationFormArray.controls,\r\n      data.fixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.transferArrayItem(\r\n      sourceWallMeta,\r\n      destinationWallMeta,\r\n      sFixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 2,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  private createExportLayoutBackground() {\r\n    const points = this.buildLayoutPolygonFromWalls();\r\n\r\n    return new fabric.Polygon(points, {\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n      objectCaching: false,\r\n    });\r\n  }\r\n\r\n  private buildLayoutPolygonFromWalls() {\r\n    return this.floorData.layoutPolygon\r\n      .filter((w: any) => w.elementType === \"wall\")\r\n      .map((w: any) => ({\r\n        x: this.toPixels(w.relativePosition.x, \"ft\"),\r\n        y: this.toPixels(w.relativePosition.y, \"ft\"),\r\n      }));\r\n  }\r\n\r\n  rotateWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n    if (wall.angle + 90 < 360) {\r\n      wall.angle += 90;\r\n    } else {\r\n      wall.angle = 0;\r\n    }\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewWall(eleNumber: number) {\r\n    const getWallEndPoint = (wall: any) => {\r\n      const angleRad = (wall.angle * Math.PI) / 180;\r\n      const length = wall.distance;\r\n\r\n      return {\r\n        x: wall.relativePosition.x + length * Math.cos(angleRad),\r\n        y: wall.relativePosition.y + length * Math.sin(angleRad),\r\n        unit: wall.relativePosition.unit,\r\n      };\r\n    };\r\n\r\n    const index = this.floorData.layoutPolygon.findIndex(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === eleNumber,\r\n    );\r\n\r\n    if (index === -1 && eleNumber !== 0) return;\r\n\r\n    let startPosition;\r\n\r\n    if (eleNumber === 0) {\r\n      startPosition = {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n    } else {\r\n      const prevWall = this.floorData.layoutPolygon[index];\r\n      startPosition = getWallEndPoint(prevWall);\r\n    }\r\n\r\n    const baseWall =\r\n      eleNumber === 0\r\n        ? { angle: 0, direction: \"right\", unit: \"ft\" }\r\n        : this.floorData.layoutPolygon[index];\r\n\r\n    const newWall = {\r\n      elementType: \"wall\",\r\n      distance: 15,\r\n      unit: baseWall.unit,\r\n      direction: baseWall.direction,\r\n      angle: baseWall.angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: startPosition,\r\n      fixtures: [],\r\n      otherElements: [],\r\n      newAdded: true,\r\n    };\r\n\r\n    this.floorData.layoutPolygon.splice(\r\n      eleNumber === 0 ? 0 : index + 1,\r\n      0,\r\n      newWall,\r\n    );\r\n\r\n    this.updateWallElementNumber();\r\n    this.updateWallCoordinates();\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewEntrance() {\r\n    const layoutPolygon = this.floorData?.layoutPolygon ?? [];\r\n    const eleNumber =\r\n      layoutPolygon.filter((ele: any) => ele.elementType === \"entrance\")\r\n        ?.length ?? 0;\r\n\r\n    const gapPx = 24;\r\n    const defaultEntranceWidthPx = 80;\r\n\r\n    let xFt = 0;\r\n    let yFt = 0;\r\n    let angle = 0;\r\n    let isPositionResolved = false;\r\n\r\n    // 1) If entrance(s) already exist, place next to the latest one.\r\n    const existingEntranceObjects = (this.canvas?.getObjects() ?? [])\r\n      .filter((obj: any) => obj?.objType === \"entrance\")\r\n      .sort(\r\n        (a: any, b: any) =>\r\n          Number(a?.data?.elementNumber || 0) -\r\n          Number(b?.data?.elementNumber || 0),\r\n      );\r\n\r\n    const latestEntranceObj = existingEntranceObjects.at(-1) as any;\r\n\r\n    if (latestEntranceObj) {\r\n      const leftPx = latestEntranceObj.left ?? 0;\r\n      const topPx = latestEntranceObj.top ?? 0;\r\n      const widthPx =\r\n        latestEntranceObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n      const anchorAngle = Number(latestEntranceObj.angle || 0);\r\n      const angleRad = (anchorAngle * Math.PI) / 180;\r\n      const stepPx = widthPx + gapPx;\r\n\r\n      xFt = this.fromPixels(leftPx + stepPx * Math.cos(angleRad), \"ft\");\r\n      yFt = this.fromPixels(topPx + stepPx * Math.sin(angleRad), \"ft\");\r\n      angle = anchorAngle;\r\n      isPositionResolved = true;\r\n    }\r\n\r\n    if (!isPositionResolved) {\r\n      const existingEntrances = layoutPolygon\r\n        .filter((ele: any) => ele.elementType === \"entrance\")\r\n        .sort(\r\n          (a: any, b: any) =>\r\n            Number(a?.elementNumber || 0) - Number(b?.elementNumber || 0),\r\n        );\r\n\r\n      const latestEntrance = existingEntrances.at(-1);\r\n      if (latestEntrance) {\r\n        const anchorAngle = Number(latestEntrance?.angle || 0);\r\n        const angleRad = (anchorAngle * Math.PI) / 180;\r\n        const stepFt =\r\n          Number(\r\n            latestEntrance?.distance ||\r\n              this.fromPixels(defaultEntranceWidthPx, \"ft\"),\r\n          ) + this.fromPixels(gapPx, \"ft\");\r\n\r\n        xFt =\r\n          Number(latestEntrance?.relativePosition?.x || 0) +\r\n          stepFt * Math.cos(angleRad);\r\n        yFt =\r\n          Number(latestEntrance?.relativePosition?.y || 0) +\r\n          stepFt * Math.sin(angleRad);\r\n        angle = anchorAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 2) If no entrance, place next to wall-1.\r\n    if (!isPositionResolved) {\r\n      const wall1 = layoutPolygon.find(\r\n        (ele: any) =>\r\n          ele.elementType === \"wall\" && Number(ele.elementNumber) === 1,\r\n      );\r\n\r\n      if (wall1) {\r\n        const wallAngle = Number(wall1?.angle || 0);\r\n        const wallAngleRad = (wallAngle * Math.PI) / 180;\r\n        const alongWallFt = Math.min(Number(wall1?.distance || 0) / 2, 4);\r\n        const sideOffsetFt = 1.5;\r\n        const wallX = Number(wall1?.relativePosition?.x || 0);\r\n        const wallY = Number(wall1?.relativePosition?.y || 0);\r\n\r\n        xFt =\r\n          wallX +\r\n          alongWallFt * Math.cos(wallAngleRad) +\r\n          sideOffsetFt * -Math.sin(wallAngleRad);\r\n        yFt =\r\n          wallY +\r\n          alongWallFt * Math.sin(wallAngleRad) +\r\n          sideOffsetFt * Math.cos(wallAngleRad);\r\n        angle = wallAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 3) If no wall (e.g. layoutPolygon is empty), place next to any canvas object.\r\n    if (!isPositionResolved) {\r\n      const anchorObj = (this.canvas?.getObjects() ?? []).find((obj: any) => {\r\n        return !!obj?.objType && obj?.isDissectionLine !== true;\r\n      }) as any;\r\n\r\n      if (anchorObj) {\r\n        const leftPx = anchorObj.left ?? 0;\r\n        const topPx = anchorObj.top ?? 0;\r\n        const widthPx = anchorObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n\r\n        xFt = this.fromPixels(leftPx + widthPx + gapPx, \"ft\");\r\n        yFt = this.fromPixels(topPx, \"ft\");\r\n        angle = Number(anchorObj?.angle || 0);\r\n      }\r\n    }\r\n\r\n    const newEntrance = {\r\n      elementType: \"entrance\",\r\n      distance: 6,\r\n      unit: \"ft\",\r\n      direction: \"up\",\r\n      angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: {\r\n        x: xFt,\r\n        y: yFt,\r\n        unit: \"ft\",\r\n      },\r\n      fixtures: [],\r\n      otherElements: [],\r\n    };\r\n\r\n    this.floorData.layoutPolygon.push(newEntrance);\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n    this.updateEntranceCoordinates();\r\n  }\r\n\r\n  private isAddingFixture = false;\r\n\r\n  async addNewFixture(fixtureType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n    // Re-entry guard: getTemplate awaits an HTTP call, and a double-fired click\r\n    // (or rapid second click) would race past the await with the same\r\n    // existingFixtures snapshot, computing the same placement and pushing two\r\n    // fixtures at identical coordinates.\r\n    if (this.isAddingFixture) return;\r\n    this.isAddingFixture = true;\r\n    try {\r\n      await this.addNewFixtureInternal(fixtureType, wallIndex);\r\n    } finally {\r\n      this.isAddingFixture = false;\r\n    }\r\n  }\r\n\r\n  private async addNewFixtureInternal(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    wallIndex?: number,\r\n  ) {\r\n    const template: any = await this.getTemplate(this.fixtureTemplates[0]._id);\r\n    const templateData = template.data;\r\n    const fixtureId = `new-${crypto.randomUUID()}`;\r\n    const fixtureGroup = this.patchFixture({\r\n      fixtureName: templateData.fixtureName,\r\n      fixtureConfigId: templateData._id,\r\n      _id: fixtureId,\r\n    });\r\n\r\n    const fixtureData = {\r\n      ...templateData,\r\n      fixtureConfigId: templateData._id,\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      _id: fixtureId,\r\n      unsavedChanges: true,\r\n      newAdded: true,\r\n    };\r\n    this.layoutHasUnsavedChanges = true;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n\r\n      const w = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n      const wp = this.fromPixels(w, \"ft\");\r\n\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n        const cosA = Math.cos(angleRad);\r\n        const sinA = Math.sin(angleRad);\r\n\r\n        // Project all existing fixtures onto the wall axis to get occupied ranges (in ft).\r\n        // Projection recovers t correctly even with the 1ft perpendicular offset applied\r\n        // during placement: (−sinA·cosA + cosA·sinA) cancels to 0.\r\n        const existingFixtures = (wallData.fixtures || []).filter(\r\n          (f: any) => f.fixtureName !== \"space\",\r\n        );\r\n\r\n        const occupied: Array<[number, number]> = existingFixtures.map(\r\n          (f: any) => {\r\n            const fWidth = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticWidth.value,\r\n                f.fixtureStaticWidth.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n            const fHeight = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticLength.value,\r\n                f.fixtureStaticLength.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n\r\n            // CAD-uploaded fixtures on inverted walls (wall angle ∈ (90°, 270°))\r\n            // have their saved (x, y) shifted by R(wallAngle)·(w, h) to keep the\r\n            // canonical visual after a 180° body flip — see drawFixture. To\r\n            // recover the wall-axis position the gap-finder needs, unshift any\r\n            // fixture whose saved angle differs from the wall angle by ~180°.\r\n            const fAngle = (f.relativePosition.angle ?? 0) as number;\r\n            const angleDiff =\r\n              ((((fAngle - angleDeg) % 360) + 360) % 360);\r\n            const isFlipped = Math.abs(angleDiff - 180) < 1;\r\n\r\n            let projX = f.relativePosition.x;\r\n            let projY = f.relativePosition.y;\r\n            if (isFlipped) {\r\n              projX -= cosA * fWidth - sinA * fHeight;\r\n              projY -= sinA * fWidth + cosA * fHeight;\r\n            }\r\n\r\n            const tStart = (projX - x0) * cosA + (projY - y0) * sinA;\r\n            return [Math.max(0, tStart), Math.max(0, tStart) + fWidth] as [\r\n              number,\r\n              number,\r\n            ];\r\n          },\r\n        );\r\n\r\n        occupied.sort((a, b) => a[0] - b[0]);\r\n\r\n        // Walk from wall start; find first gap that fits the new fixture.\r\n        // EPSILON absorbs floating-point drift from repeated unit round-trips.\r\n        const EPSILON = 0.001;\r\n        let placementT: number | null = null;\r\n        let cursor = 0;\r\n\r\n        for (const [rangeStart, rangeEnd] of occupied) {\r\n          if (rangeStart - cursor >= wp - EPSILON) {\r\n            placementT = cursor;\r\n            break;\r\n          }\r\n          cursor = Math.max(cursor, rangeEnd);\r\n        }\r\n\r\n        // No gap found → place after last fixture.\r\n        // Overflow beyond wall length is intentional per requirements.\r\n        if (placementT === null) {\r\n          placementT = cursor;\r\n        }\r\n\r\n        const fx = x0 + placementT * cosA;\r\n        const fy = y0 + placementT * sinA;\r\n        const offset = 0.9;\r\n        const fx_offset = fx + offset * -sinA;\r\n        const fy_offset = fy + offset * cosA;\r\n\r\n        fixtureData.relativePosition.x = fx_offset;\r\n        fixtureData.relativePosition.y = fy_offset;\r\n        fixtureData.relativePosition.angle = angleDeg;\r\n\r\n        // If the wall angle puts the fixture in the upside-down range, bake\r\n        // the same 180° body flip drawFixture applies during CAD first-render\r\n        // (shift anchor by R(wallAngle)·(w, h) and rotate +180°). drawFixture's\r\n        // own flip path is gated on cadLayout=true, so for fixtures added\r\n        // post-CAD via the side panel we have to bake the flip here — it\r\n        // makes the new fixture land canonical instead of upside-down.\r\n        const normWallAngle = (((angleDeg % 360) + 360) % 360);\r\n        if (normWallAngle > 90 && normWallAngle < 270) {\r\n          const widthFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticWidth.value,\r\n              fixtureData.fixtureStaticWidth.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          const heightFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticLength.value,\r\n              fixtureData.fixtureStaticLength.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          fixtureData.relativePosition.x =\r\n            fx_offset + cosA * widthFt - sinA * heightFt;\r\n          fixtureData.relativePosition.y =\r\n            fy_offset + sinA * widthFt + cosA * heightFt;\r\n          fixtureData.relativePosition.angle = angleDeg + 180;\r\n        }\r\n      }\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"fixtures\") as FormArray).push(\r\n        fixtureGroup,\r\n      );\r\n      this.getWallByNumber(wallIndex! + 1)?.fixtures.push(fixtureData);\r\n    } else if (fixtureType === \"floor\") {\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtureData.fixtureStaticLength.value,\r\n        fixtureData.fixtureStaticLength.unit,\r\n      );\r\n\r\n      // N-shape grid placement: col fills left-to-right, each column fills bottom row (row=1) first then top row (row=0)\r\n      const newIndex = this.floorData.centerFixture.length;\r\n      const newCol = Math.floor(newIndex / 2);\r\n      const newRow = newIndex % 2 === 0 ? 1 : 0;\r\n\r\n      let gridOriginX: number;\r\n      let gridOriginY: number;\r\n\r\n      if (this.floorData.centerFixture.length > 0) {\r\n        // Recover grid origin from fixture at index 0 (always placed at row=1, col=0)\r\n        const f0 = this.floorData.centerFixture[0];\r\n        const f0x = this.toPixels(\r\n          f0.relativePosition.x,\r\n          f0.relativePosition.unit,\r\n        );\r\n        const f0y = this.toPixels(\r\n          f0.relativePosition.y,\r\n          f0.relativePosition.unit,\r\n        );\r\n        // f0 is at row=1 → gridOriginY = f0y - 1 * fixtureHeightPx; col=0 → gridOriginX = f0x\r\n        gridOriginX = f0x;\r\n        gridOriginY = f0y - fixtureHeightPx;\r\n      } else {\r\n        // No existing center fixtures — find best grid origin via polygon scan (same as drawLayoutElements)\r\n        const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n        const occupiedRects = this.getOccupiedRects();\r\n        const bounds = this.getFullLayoutBounds();\r\n\r\n        // Reserve space for 2 rows and 1 column as the starting grid footprint\r\n        const gridW = fixtureWidthPx;\r\n        const gridH = 2 * fixtureHeightPx;\r\n\r\n        const centerX = bounds.left + bounds.width / 2;\r\n        const centerY = bounds.top + bounds.height / 2;\r\n\r\n        const fitsInPolygon = (x: number, y: number) =>\r\n          this.isPointInsidePolygon({ x, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x: x + gridW, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x, y: y + gridH }, layoutPolygon) &&\r\n          this.isPointInsidePolygon(\r\n            { x: x + gridW, y: y + gridH },\r\n            layoutPolygon,\r\n          );\r\n\r\n        const overlapsOccupied = (x: number, y: number) =>\r\n          occupiedRects.some((occ) =>\r\n            this.rectsOverlap({ x, y, w: gridW, h: gridH }, occ),\r\n          );\r\n\r\n        const scanForBestOrigin = (skipOverlap: boolean) => {\r\n          let bestScore = -Infinity;\r\n          let bestPos: { x: number; y: number } | null = null;\r\n          const step = fixtureWidthPx / 2;\r\n\r\n          for (\r\n            let y = bounds.top;\r\n            y <= bounds.top + bounds.height - gridH;\r\n            y += step\r\n          ) {\r\n            for (\r\n              let x = bounds.left;\r\n              x <= bounds.left + bounds.width - gridW;\r\n              x += step\r\n            ) {\r\n              if (!fitsInPolygon(x, y)) continue;\r\n              if (!skipOverlap && overlapsOccupied(x, y)) continue;\r\n\r\n              const gridRect = { x, y, w: gridW, h: gridH };\r\n              const emptyMargin = this.computeEmptyMargin(\r\n                gridRect,\r\n                bounds,\r\n                occupiedRects,\r\n              );\r\n              const dx = centerX - (x + gridW / 2);\r\n              const dy = centerY - (y + gridH / 2);\r\n              const score = emptyMargin * 1000 - (dx * dx + dy * dy) * 0.001;\r\n\r\n              if (score > bestScore) {\r\n                bestScore = score;\r\n                bestPos = { x, y };\r\n              }\r\n            }\r\n          }\r\n          return bestPos;\r\n        };\r\n\r\n        const bestPos = scanForBestOrigin(false) ??\r\n          scanForBestOrigin(true) ?? {\r\n            x: centerX - gridW / 2,\r\n            y: centerY - gridH / 2,\r\n          };\r\n\r\n        gridOriginX = bestPos.x;\r\n        gridOriginY = bestPos.y;\r\n      }\r\n\r\n      const x = gridOriginX + newCol * fixtureWidthPx;\r\n      const y = gridOriginY + newRow * fixtureHeightPx;\r\n\r\n      fixtureData.relativePosition.x = this.fromPixels(x, \"ft\");\r\n      fixtureData.relativePosition.y = this.fromPixels(y, \"ft\");\r\n\r\n      (this.layoutForm.get(\"floorFixtures\") as FormArray).push(fixtureGroup);\r\n      this.floorData.centerFixture.push(fixtureData);\r\n    }\r\n\r\n    await this.renderFloor(false);\r\n    this.updateFixtureCoordinates();\r\n  }\r\n\r\n  addNewOtherElements(posType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    const posData = {\r\n      _id: `new-${crypto.randomUUID()}`,\r\n      fixtureName: `POS Counter`,\r\n      fixtureType: \"other\",\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      fixtureStaticLength: {\r\n        value: 3,\r\n        unit: \"ft\",\r\n      },\r\n      fixtureStaticWidth: {\r\n        value: 5,\r\n        unit: \"ft\",\r\n      },\r\n    };\r\n\r\n    let x = posData.relativePosition.x;\r\n    let y = posData.relativePosition.y;\r\n    let a = posData.relativePosition.angle;\r\n\r\n    const h = this.toPixels(\r\n      posData.fixtureStaticLength.value,\r\n      posData.fixtureStaticLength.unit,\r\n    );\r\n    const w = this.toPixels(\r\n      posData.fixtureStaticWidth.value,\r\n      posData.fixtureStaticWidth.unit,\r\n    );\r\n\r\n    const newOtherGroup = this.fb.group({\r\n      type: [posData.fixtureName || \"POS Counter\"], // default selected label\r\n      customName: [\"\"],\r\n    });\r\n\r\n    if (posType == \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const length = wallData.distance;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n\r\n        const fx = x0 + (length / 2) * Math.cos(angleRad);\r\n        const fy = y0 + (length / 2) * Math.sin(angleRad);\r\n        const offset = 2.5;\r\n        const fx_offset = fx + offset * -Math.sin(angleRad);\r\n        const fy_offset = fy + offset * Math.cos(angleRad);\r\n\r\n        x = this.toPixels(fx_offset, \"ft\");\r\n        y = this.toPixels(fy_offset, \"ft\");\r\n        a = angleDeg;\r\n      }\r\n\r\n      Object.assign(posData, {\r\n        associatedElementNumber: wallIndex! + 1,\r\n        associatedElementType: \"wall\",\r\n      });\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"otherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      wallData.otherElements.push({ ...posData, newAdded: true });\r\n    } else if (posType === \"floor\") {\r\n      (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      this.floorData.otherElements.push({ ...posData, newAdded: true });\r\n    }\r\n\r\n    const rectGroup = this.drawOtherElementsWithLabel(\r\n      this.canvas,\r\n      x,\r\n      y,\r\n      a,\r\n      w,\r\n      h,\r\n      posData,\r\n    );\r\n\r\n    // make active\r\n    try {\r\n      this.canvas.setActiveObject(rectGroup);\r\n      this.canvas.requestRenderAll();\r\n    } catch {}\r\n\r\n    this.subscribeToOtherElementsChanges();\r\n    this.updateOtherElementsCoordinates();\r\n  }\r\n\r\n  findEmptyCenterSpot(\r\n    objectWidthPx: number,\r\n    objectHeightPx: number,\r\n    tempOccupied: {\r\n      x: number;\r\n      y: number;\r\n      width: number;\r\n      height: number;\r\n    }[] = [],\r\n  ) {\r\n    const objects = this.canvas.getObjects();\r\n    const CENTER_OFFSET_X = -300;\r\n    const CENTER_OFFSET_Y = 0;\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const centerX = bounds.left + bounds.width / 2 + CENTER_OFFSET_X;\r\n\r\n    const centerY = bounds.top + bounds.height / 2 + CENTER_OFFSET_Y;\r\n\r\n    // 2. Spiral search parameters\r\n    const step = 20;\r\n    const maxRadius = Math.max(bounds.width, bounds.height);\r\n\r\n    for (let radius = 0; radius < maxRadius; radius += step) {\r\n      for (let angle = 0; angle < 360; angle += 30) {\r\n        const rad = (angle * Math.PI) / 180;\r\n\r\n        // 🔧 FIX: center → top-left\r\n        const x = centerX + radius * Math.cos(rad) - objectWidthPx / 2;\r\n        const y = centerY + radius * Math.sin(rad) - objectHeightPx / 2;\r\n\r\n        const testRect = {\r\n          left: x,\r\n          top: y,\r\n          width: objectWidthPx,\r\n          height: objectHeightPx,\r\n        };\r\n\r\n        // 3. Check collision with existing canvas objects\r\n        const canvasCollision = objects.some((obj) => {\r\n          const rect = obj.getBoundingRect();\r\n          return !(\r\n            rect.left > testRect.left + testRect.width ||\r\n            rect.left + rect.width < testRect.left ||\r\n            rect.top > testRect.top + testRect.height ||\r\n            rect.top + rect.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (canvasCollision) continue;\r\n\r\n        // 4. Check collision with temp placed fixtures (CAD batch)\r\n        const tempCollision = tempOccupied.some((o) => {\r\n          return !(\r\n            o.x > testRect.left + testRect.width ||\r\n            o.x + o.width < testRect.left ||\r\n            o.y > testRect.top + testRect.height ||\r\n            o.y + o.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (tempCollision) continue;\r\n\r\n        return { x, y };\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  async cancelEdit() {\r\n    this.highlightedFixtureFormId = null;\r\n    await this.getStoreFixtures(this.planoData._id);\r\n  }\r\n\r\n  listenToDeleteKey() {\r\n    document.addEventListener(\"keydown\", (e) => {\r\n      if (e.key === \"Delete\" && this.layoutForm.enabled) {\r\n        const active = this.canvas?.getActiveObject() as any;\r\n\r\n        if (active && (active as any).objType === \"entrance\") {\r\n          this.deleteEntrance();\r\n        }\r\n\r\n        if (active && (active as any).objType === \"wall\") {\r\n          if (active?.data?.elementNumber) {\r\n            this.deleteWall(active?.data?.elementNumber);\r\n          }\r\n        }\r\n\r\n        if (active && (active as any).objType === \"fixture\") {\r\n          if (active?.fixtureType) {\r\n            this.deleteFixture(\r\n              active?.fixtureType,\r\n              active?.fixtureIndex - 1,\r\n              active?.wallIndex - 1,\r\n            );\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  deleteEntrance() {\r\n    const active = this.canvas.getActiveObject() as any;\r\n\r\n    if (active && active.objType === \"entrance\") {\r\n      const i = this.floorData.layoutPolygon.findIndex(\r\n        (el: any) =>\r\n          el.elementType === \"entrance\" &&\r\n          el.elementNumber === active.data.elementNumber,\r\n      );\r\n\r\n      if (i >= 0) {\r\n        this.floorData.layoutPolygon.splice(i, 1);\r\n        this.renderFloor(true);\r\n      }\r\n\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  async deleteWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (ele: any) =>\r\n        ele.elementType === \"wall\" && ele.elementNumber === eleNumber,\r\n    );\r\n    if (wall.fixtures.length || wall.otherElements.length)\r\n      if (!(await this.confirmDeleteWall())) return;\r\n\r\n    const i = this.floorData.layoutPolygon.findIndex(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n\r\n    this.floorData.layoutPolygon.splice(i, 1);\r\n    this.updateWallElementNumber();\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateWallElementNumber() {\r\n    const onlyWalls = this.floorData.layoutPolygon?.filter(\r\n      (el: any) => el.elementType === \"wall\",\r\n    );\r\n\r\n    onlyWalls?.forEach((item: any, index: number) => {\r\n      item.elementNumber = index + 1;\r\n    });\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  fromPixels(pixels: number, unit: string, dpi = 2.8): number {\r\n    let value: number;\r\n\r\n    // pixels = pixels >= this.wallThickness ? pixels - this.wallThickness : this.wallThickness;\r\n\r\n    if (unit === \"mm\") {\r\n      value = (pixels / dpi) * 25.4;\r\n    } else if (unit === \"ft\") {\r\n      value = pixels / (12 * dpi);\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(value.toFixed(4));\r\n  }\r\n\r\n  async confirmSave(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(LayoutEditConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = \"Save as draft\";\r\n      modelRef.componentInstance.description =\r\n        \"Are you sure you want to move this back to Draft? This will keep the planogram in Draft and make it ready for allocation once approved.\";\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async confirmDeleteWall(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(DeleteConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n\r\n      modelRef.componentInstance.title = \"Delete wall\";\r\n      modelRef.componentInstance.description =\r\n        \"Are you sure you want to delete this wall along with its associated fixtures and elements?\";\r\n\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  updateFixtureCoordinates(fixtures?: any) {\r\n    const fixturesFromCanvas =\r\n      fixtures ??\r\n      this.canvas\r\n        .getObjects()\r\n        .filter((obj) => (obj as any).fixtureId)\r\n        .map((obj) => ({\r\n          id: (obj as any).fixtureId,\r\n          x: obj.left,\r\n          y: obj.top,\r\n          angle: obj?.angle ?? 0,\r\n        }));\r\n    const posMap = new Map();\r\n\r\n    for (const fixture of fixturesFromCanvas) {\r\n      posMap.set(fixture.id, {\r\n        x: this.fromPixels(fixture.x, \"ft\"),\r\n        y: this.fromPixels(fixture.y, \"ft\"),\r\n        angle: fixture.angle,\r\n      });\r\n    }\r\n\r\n    this.floorData.centerFixture.forEach((cf: any) => {\r\n      const latestFixturePos = posMap.get(cf._id);\r\n      if (latestFixturePos) {\r\n        cf.relativePosition.x = latestFixturePos.x;\r\n        cf.relativePosition.y = latestFixturePos.y;\r\n        cf.relativePosition.angle = latestFixturePos.angle;\r\n      }\r\n    });\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.fixtures?.forEach((wf: any) => {\r\n        const latestFixturePos = posMap.get(wf._id);\r\n        if (latestFixturePos) {\r\n          wf.relativePosition.x = latestFixturePos.x;\r\n          wf.relativePosition.y = latestFixturePos.y;\r\n          wf.relativePosition.angle = latestFixturePos.angle;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateOtherElementsCoordinates() {\r\n    const othersFromCanvas = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"others\")\r\n      .map((obj) => ({\r\n        id: (obj as any).data?._id,\r\n        label: (obj as any).data?.fixtureName,\r\n        x: obj.left,\r\n        y: obj.top,\r\n        angle: obj?.angle ?? 0,\r\n        width: this.fromPixels(obj.getScaledWidth() - 2, \"ft\"),\r\n        height: this.fromPixels(obj.getScaledHeight() - 2, \"ft\"),\r\n      }));\r\n\r\n    const posMap = new Map<\r\n      string,\r\n      { x: number; y: number; angle: number; h: number; w: number }\r\n    >();\r\n    for (const other of othersFromCanvas) {\r\n      if (other.id) {\r\n        posMap.set(other.id, {\r\n          x: this.fromPixels(other.x, \"ft\"),\r\n          y: this.fromPixels(other.y, \"ft\"),\r\n          angle: other.angle,\r\n          h: other.height,\r\n          w: other.width,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (Array.isArray(this.floorData.otherElements)) {\r\n      this.floorData.otherElements.forEach((el: any) => {\r\n        const latestOthersPos = posMap.get(el._id);\r\n        if (latestOthersPos) {\r\n          el.relativePosition.x = latestOthersPos.x;\r\n          el.relativePosition.y = latestOthersPos.y;\r\n          el.relativePosition.angle = latestOthersPos.angle;\r\n          el.fixtureStaticLength.value = latestOthersPos.h;\r\n          el.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.otherElements?.forEach((wf: any) => {\r\n        const latestOthersPos = posMap.get(wf._id);\r\n        if (latestOthersPos) {\r\n          wf.relativePosition.x = latestOthersPos.x;\r\n          wf.relativePosition.y = latestOthersPos.y;\r\n          wf.relativePosition.angle = latestOthersPos.angle;\r\n          wf.fixtureStaticLength.value = latestOthersPos.h;\r\n          wf.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateWallCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"wall\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth() - 0.27, \"ft\"),\r\n          height: this.fromPixels(obj.getScaledHeight() - 0.27, \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const wall of data) {\r\n      posMap.set(\r\n        `${wall.elementData.elementType}${wall.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === wall.elementData.elementType &&\r\n            obj.elementData.elementNumber === wall.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const wallPos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (wallPos) {\r\n        w.relativePosition.x = wallPos.left;\r\n        w.relativePosition.y = wallPos.top;\r\n        w.angle = wallPos.angle;\r\n        w.distance = wallPos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  updateEntranceCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"entrance\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const entrance of data) {\r\n      posMap.set(\r\n        `${entrance.elementData.elementType}${entrance.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === entrance.elementData.elementType &&\r\n            obj.elementData.elementNumber ===\r\n              entrance.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const entrancePos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (entrancePos) {\r\n        w.relativePosition.x = entrancePos.left;\r\n        w.relativePosition.y = entrancePos.top;\r\n        w.angle = entrancePos.angle;\r\n        w.distance = entrancePos.width;\r\n      }\r\n    });\r\n\r\n    // Update dissection lines whenever entrance coordinates change\r\n    this.updateDissectionLines();\r\n  }\r\n\r\n  async updateLayout(editMode: boolean = false) {\r\n    // if (\r\n    //   editMode &&\r\n    //   this.getStatus === \"allocationPending\" &&\r\n    //   updateStatus === \"draft\"\r\n    // ) {\r\n    //   if (!(await this.confirmSave())) {\r\n    //     this.layoutForm.disable({ emitEvent: false });\r\n    //     this.renderFloor(false);\r\n    //     return;\r\n    //   }\r\n    // }\r\n\r\n    this.floorData.layoutPolygon.forEach((element: any) => {\r\n      element.fixtures = element.fixtures.filter(\r\n        (fixture: any) => !fixture?.ghost && fixture.fixtureName !== \"space\",\r\n      );\r\n    });\r\n    this.floorData.centerFixture = this.floorData.centerFixture\r\n      .filter((fixture: any) => !fixture?.ghost)\r\n      .map((fixture: any) => {\r\n        const { associatedElementType, associatedElementNumber, ...rest } =\r\n          fixture;\r\n        return rest;\r\n      });\r\n    this.reorderFixture(this.floorData);\r\n\r\n    const payload = {\r\n      floorId: this.floorData._id,\r\n      data: { ...this.floorData },\r\n      editMode: editMode,\r\n    };\r\n\r\n    this.isSavingLayout = true;\r\n    this.apiService.updateStorePlano(payload).subscribe({\r\n      next: (res) => {\r\n        this.createForm();\r\n        this.getStoreFixtures(this.planoData._id);\r\n        this.isSavingLayout = false;\r\n        this.layoutHasUnsavedChanges = false;\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to update layout\");\r\n        this.isSavingLayout = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  onClickEdit() {\r\n    this.togglePanel(\"right\", true);\r\n    this.togglePanel(\"left\", false);\r\n\r\n    this.createForm();\r\n    this.layoutForm.enable({ emitEvent: false });\r\n    this.highlightedFixtureFormId = null;\r\n\r\n    this.renderFloor();\r\n  }\r\n\r\n  // Returns true if the layout has pending changes the user must save before\r\n  // they can edit an individual fixture. Set by all layout mutation handlers\r\n  // (add / delete / move / template change), cleared on successful save.\r\n  private hasUnsavedLayoutChanges(): boolean {\r\n    if (this.layoutHasUnsavedChanges) return true;\r\n    const wallFixtures = (this.floorData?.layoutPolygon ?? []).flatMap(\r\n      (el: any) => el?.fixtures ?? [],\r\n    );\r\n    const floorFixtures = this.floorData?.centerFixture ?? [];\r\n    return [...wallFixtures, ...floorFixtures].some(\r\n      (f: any) => f?.unsavedChanges,\r\n    );\r\n  }\r\n\r\n  get getProgressValue() {\r\n    if (this.getStatus === \"allocationPending\") {\r\n      return 25;\r\n    } else {\r\n      return 0;\r\n    }\r\n  }\r\n\r\n  get getStatusText() {\r\n    if (this.getStatus === \"allocationPending\") {\r\n      return \"Allocation pending\";\r\n    } else {\r\n      return \"Draft\";\r\n    }\r\n  }\r\n\r\n  get getStatus() {\r\n    return this.floorData?.status ?? \"draft\";\r\n  }\r\n\r\n  getElementNumber(group: any): number | null {\r\n    return group.get(\"elementNumber\")?.value ?? null;\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    if (this.layoutForm.enabled) return;\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n\r\n    this.canvas?.getObjects()?.forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        this.canvas.remove(obj);\r\n      }\r\n    });\r\n\r\n    this.activeHighlight = null;\r\n    this.canvas?.requestRenderAll();\r\n  }\r\n\r\n  keepHighlightOnTop = () => {\r\n    if (!this.activeHighlight) return;\r\n    const objs = this.canvas.getObjects();\r\n    this.canvas.moveObjectTo(this.activeHighlight, objs.length - 1);\r\n  };\r\n\r\n  // In edit mode, when a fixture is clicked on the canvas, open the matching\r\n  // accordion item in the left panel, scroll it into view and highlight the\r\n  // fixture row so the user can locate it in the form quickly.\r\n  highlightFixtureInAccordion(fixtureData: any): void {\r\n    if (!fixtureData || this.layoutForm.disabled) return;\r\n\r\n    let accordionItemId: string;\r\n\r\n    if (fixtureData.fixtureType === \"wall\") {\r\n      const formIdx = this.getFormWalls.controls.findIndex(\r\n        (c) =>\r\n          c.get(\"elementNumber\")?.value === fixtureData.associatedElementNumber,\r\n      );\r\n      if (formIdx < 0) {\r\n        this.highlightedFixtureFormId = null;\r\n        return;\r\n      }\r\n      accordionItemId = `accordion-wall-${formIdx}`;\r\n    } else if (fixtureData.fixtureType === \"floor\") {\r\n      accordionItemId = \"accordion-floor\";\r\n    } else {\r\n      return;\r\n    }\r\n\r\n    this.highlightedFixtureFormId = fixtureData._id ?? null;\r\n\r\n    if (this.isLeftPanelCollapsed) {\r\n      this.togglePanel(\"left\", false);\r\n    }\r\n\r\n    this.bodyAccordion?.expand(accordionItemId);\r\n\r\n    setTimeout(() => {\r\n      const el = document.getElementById(accordionItemId);\r\n      el?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n    }, 350);\r\n  }\r\n\r\n  async onClickApproveLayout() {\r\n    if (this.allFixtureInstances.length <= 0) {\r\n      this.toastService.getErrorToast(\r\n        \"No fixtures found. Add fixtures to proceed\",\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    try {\r\n      await this.modalService.open(this.approveLayoutModalRef, {\r\n        centered: true,\r\n        backdrop: \"static\",\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  async onClickRunAllocation() {\r\n    if (this.allFixtureInstances.length <= 0) {\r\n      this.toastService.getErrorToast(\r\n        \"No fixtures found. Add fixtures to proceed\",\r\n      );\r\n\r\n      return;\r\n    }\r\n\r\n    if (this.hasInvalidFixtures) {\r\n      this.toastService.getErrorToast(\r\n        \"Some fixtures have invalid headers or library mismatches. Please fix all red fixtures before running allocation.\",\r\n      );\r\n      return;\r\n    }\r\n\r\n    if (this.isAllocationRun) {\r\n      if (this.hasUnallocatedZoneFixtures) {\r\n        this.toastService.getErrorToast(\r\n          \"Some fixtures have a zone without any allocation. Please fix all red fixtures before completing allocation.\",\r\n        );\r\n        return;\r\n      }\r\n      try {\r\n        await this.modalService.open(this.completeAllocationModalRef, {\r\n          centered: true,\r\n          backdrop: \"static\",\r\n        }).result;\r\n      } catch (err: any) {}\r\n    } else {\r\n      try {\r\n        await this.modalService.open(this.applyLogicsModalRef, {\r\n          centered: true,\r\n          backdrop: \"static\",\r\n        }).result;\r\n      } catch (err: any) {}\r\n    }\r\n  }\r\n\r\n  async onClickRevertAllocation() {\r\n    try {\r\n      await this.modalService.open(this.revertAllocationModalRef, {\r\n        centered: true,\r\n        backdrop: \"static\",\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  revertAllocation() {\r\n    if (!this.floorDataBeforeAllocation) {\r\n      this.toastService.getErrorToast(\"No previous state found to revert\");\r\n      return;\r\n    }\r\n\r\n    this.floorData.layoutPolygon = JSON.parse(\r\n      JSON.stringify(this.floorDataBeforeAllocation.layoutPolygon),\r\n    );\r\n    this.floorData.centerFixture = JSON.parse(\r\n      JSON.stringify(this.floorDataBeforeAllocation.centerFixture),\r\n    );\r\n    this.floorData.otherElements = JSON.parse(\r\n      JSON.stringify(this.floorDataBeforeAllocation.otherElements),\r\n    );\r\n    this.floorData.status = this.floorDataBeforeAllocation.status;\r\n\r\n    this.isAllocationRun = false;\r\n    this.floorDataBeforeAllocation = null;\r\n\r\n    this.extractAllFixtures(this.floorData);\r\n    this.validateZoneAllocations();\r\n    this.disableEdit = false;\r\n\r\n    this.selectedFixture = null;\r\n    this.selectedFixtureData = null;\r\n\r\n    this.togglePanel(\"left\", false);\r\n    this.togglePanel(\"right\", false);\r\n    this.renderFloor(false);\r\n\r\n    this.toastService.getSuccessToast(\"Allocation reverted successfully\");\r\n  }\r\n\r\n  async completeAllocation() {\r\n    this.isButtonLoading = true;\r\n\r\n    try {\r\n      const floorId = this.floorData._id;\r\n      await firstValueFrom(\r\n        this.apiService.updateStorePlano({\r\n          floorId,\r\n          onboarding: true,\r\n          data: {\r\n            ...this.floorData,\r\n            // isPlanoApproved: true,\r\n            status: \"completed\",\r\n          },\r\n        }),\r\n      );\r\n\r\n      const storeName = this.floorData?.storeName || this.planoData?.storeName;\r\n      this.apiService.createAndSubmitLayoutTask(storeName, this.clientId).subscribe({\r\n        error: () => this.toastService.getErrorToast(\"Failed to submit layout changes.\"),\r\n      });\r\n\r\n      this.toastService.getSuccessToast(\"Allocation completed successfully\");\r\n      this.router.navigateByUrl(\r\n        `manage/planogram/manage-planogram?planoId=${this.floorData.planoId}&floorId=${this.floorData._id}`,\r\n      );\r\n      this.modalService.dismissAll();\r\n    } catch (error) {\r\n      console.error(\"completeAllocation failed:\", error);\r\n      this.toastService.getErrorToast(\"Failed to complete allocation\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  async runAllocation() {\r\n    try {\r\n      this.isButtonLoading = true;\r\n\r\n      this.floorDataBeforeAllocation = {\r\n        layoutPolygon: JSON.parse(JSON.stringify(this.floorData.layoutPolygon)),\r\n        centerFixture: JSON.parse(JSON.stringify(this.floorData.centerFixture)),\r\n        otherElements: JSON.parse(JSON.stringify(this.floorData.otherElements)),\r\n        status: this.floorData.status,\r\n      };\r\n\r\n      this.reorderFixtureNumberByDissection();\r\n\r\n      const storeName = this.floorData?.storeName || this.planoData?.storeName;\r\n      if (!storeName) {\r\n        this.toastService.getErrorToast(\"Store name is required\");\r\n        this.modalService.dismissAll();\r\n        return;\r\n      }\r\n\r\n      const payload = {\r\n        data: {\r\n          storeName: storeName,\r\n          clientId: this.clientId,\r\n          layoutPolygon: this.floorData.layoutPolygon || [],\r\n          centerFixture: this.floorData.centerFixture || [],\r\n          otherElements: this.floorData.otherElements || [],\r\n          status: this.floorData.status || \"draft\",\r\n        },\r\n        storeName: storeName, // Also add at root level as fallback\r\n        clientId: this.clientId,\r\n        type: \"ivm\",\r\n        initial: true,\r\n        sort: false,\r\n      };\r\n\r\n      // Prefer the Looks-driven allocation when an Active Look Plano\r\n      // Collection exists for this client; the backend returns 404 with a\r\n      // \"No active Look Plano Collection\" message when none is configured,\r\n      // in which case we fall back to the legacy spreadsheet-driven flow.\r\n      let response: any;\r\n      let usedLooks = false;\r\n      try {\r\n        response = await firstValueFrom(\r\n          this.apiService.runLooksAllocation(payload),\r\n        );\r\n        usedLooks = true;\r\n      } catch (looksErr: any) {\r\n        const status = looksErr?.status ?? looksErr?.error?.status;\r\n        const msg =\r\n          looksErr?.error?.message ||\r\n          looksErr?.error?.error ||\r\n          looksErr?.message ||\r\n          \"\";\r\n        const noActiveCollection =\r\n          status === 404 || /no active look plano collection/i.test(msg);\r\n        if (!noActiveCollection) throw looksErr;\r\n        response = await firstValueFrom(\r\n          this.apiService.runAlocation(payload),\r\n        );\r\n      }\r\n\r\n      if (response && response.data) {\r\n        this.floorData.layoutPolygon =\r\n          response.data.layoutPolygon || this.floorData.layoutPolygon;\r\n        this.floorData.centerFixture =\r\n          response.data.centerFixture || this.floorData.centerFixture;\r\n        this.floorData.otherElements =\r\n          response.data.otherElements || this.floorData.otherElements;\r\n        this.floorData.status = response.data.status || this.floorData.status;\r\n\r\n        this.isAllocationRun = true;\r\n        this.disableEdit = true;\r\n\r\n        this.extractAllFixtures(this.floorData);\r\n        this.validateZoneAllocations();\r\n        this.selectedFixtureData = null;\r\n        this.renderFloor(false);\r\n\r\n        this.togglePanel(\"left\", true);\r\n        this.togglePanel(\"right\", false);\r\n\r\n        if (usedLooks) {\r\n          const stats = response.data.looksAllocation || {};\r\n          const name = stats.looksCollectionName\r\n            ? ` (${stats.looksCollectionName})`\r\n            : \"\";\r\n          this.toastService.getSuccessToast(\r\n            `Looks allocation applied${name}: ${stats.matched ?? 0} matched, ${stats.unmatched ?? 0} unmatched`,\r\n          );\r\n        } else {\r\n          this.toastService.getSuccessToast(\r\n            \"Allocation logic applied successfully\",\r\n          );\r\n        }\r\n      }\r\n\r\n      this.modalService.dismissAll();\r\n      this.isButtonLoading = false;\r\n    } catch (error) {\r\n      console.log(\"@@ ~ applyIVMLogic [ERR]:\", error);\r\n      this.toastService.getErrorToast(\"Failed to apply allocation logic\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  async approveLayout() {\r\n    this.isButtonLoading = true;\r\n\r\n    try {\r\n      const floorId = this.floorData._id;\r\n      await firstValueFrom(\r\n        this.apiService.updateStorePlano({\r\n          floorId,\r\n          data: { ...this.floorData, status: \"allocationPending\" },\r\n        }),\r\n      );\r\n\r\n      this.floorData.isPlanoApproved = true;\r\n      this.floorData.status = \"allocationPending\";\r\n\r\n      this.toastService.getSuccessToast(\"Layout approved successfully\");\r\n      this.layoutForm?.disable({ emitEvent: false });\r\n      this.renderFloor(false);\r\n      this.modalService.dismissAll();\r\n\r\n      if (!this.isRunAllocationAllowed) {\r\n        this.router.navigateByUrl(\r\n          `/manage/planogram/manage-planograms/onboard`,\r\n        );\r\n      }\r\n    } catch (error) {\r\n      console.error(\"approveLayout failed:\", error);\r\n      this.toastService.getErrorToast(\"Failed to approve layout\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  reorderFixtureNumberByDissection() {\r\n    const floorData = this.floorData;\r\n    if (!floorData) return;\r\n\r\n    const wallFixtures: any[] = [];\r\n    const floorFixtures: any[] = [];\r\n\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType !== \"wall\") return;\r\n      element.fixtures.forEach((fixture: any) => {\r\n        if (!fixture?.ghost) wallFixtures.push(fixture);\r\n      });\r\n    });\r\n\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      if (!fixture?.ghost) floorFixtures.push(fixture);\r\n    });\r\n\r\n    const dissectionReference = this.getEntranceDissectionReference(floorData);\r\n    const orderedWallFixtures = this.sortFixturesByDissectionPriority(\r\n      wallFixtures,\r\n      dissectionReference,\r\n    );\r\n    const orderedFloorFixtures = this.sortFixturesByDissectionPriority(\r\n      floorFixtures,\r\n      dissectionReference,\r\n    );\r\n\r\n    let fixtureNumber = 1;\r\n    [...orderedWallFixtures, ...orderedFloorFixtures].forEach(\r\n      (fixture: any) => {\r\n        fixture.fixtureNumber = fixtureNumber++;\r\n      },\r\n    );\r\n\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  private getEntranceDissectionReference(floorData: any): {\r\n    origin: { x: number; y: number };\r\n    direction: { x: number; y: number };\r\n  } | null {\r\n    const entrances =\r\n      floorData?.layoutPolygon?.filter(\r\n        (element: any) => element?.elementType === \"entrance\",\r\n      ) ?? [];\r\n\r\n    if (!entrances.length) return null;\r\n\r\n    const primaryEntrance = [...entrances].sort(\r\n      (a: any, b: any) =>\r\n        (Number(a?.elementNumber) || 0) - (Number(b?.elementNumber) || 0),\r\n    )[0];\r\n\r\n    const originUnit = primaryEntrance?.relativePosition?.unit || \"ft\";\r\n    const origin = {\r\n      x: this.toPixels(primaryEntrance?.relativePosition?.x || 0, originUnit),\r\n      y: this.toPixels(primaryEntrance?.relativePosition?.y || 0, originUnit),\r\n    };\r\n\r\n    const angleDeg = floorData?.cadLayout\r\n      ? 0\r\n      : Number(\r\n          primaryEntrance?.angle ??\r\n            primaryEntrance?.relativePosition?.angle ??\r\n            0,\r\n        );\r\n    const angleRad = (angleDeg * Math.PI) / 180;\r\n\r\n    const direction = {\r\n      x: Math.cos(angleRad),\r\n      y: Math.sin(angleRad),\r\n    };\r\n\r\n    return { origin, direction };\r\n  }\r\n\r\n  private sortFixturesByDissectionPriority(\r\n    fixtures: any[],\r\n    dissectionReference: {\r\n      origin: { x: number; y: number };\r\n      direction: { x: number; y: number };\r\n    } | null,\r\n  ): any[] {\r\n    if (!fixtures?.length) return [];\r\n\r\n    if (!dissectionReference) {\r\n      return [...fixtures].sort((a: any, b: any) => {\r\n        const elementDelta =\r\n          (Number(a?.associatedElementNumber) || Number.MAX_SAFE_INTEGER) -\r\n          (Number(b?.associatedElementNumber) || Number.MAX_SAFE_INTEGER);\r\n        if (elementDelta !== 0) return elementDelta;\r\n\r\n        return (\r\n          (Number(a?.associatedElementFixtureNumber) ||\r\n            Number.MAX_SAFE_INTEGER) -\r\n          (Number(b?.associatedElementFixtureNumber) || Number.MAX_SAFE_INTEGER)\r\n        );\r\n      });\r\n    }\r\n\r\n    const { origin, direction } = dissectionReference;\r\n    const sideRank = (side: number) => (side < 0 ? 0 : side > 0 ? 1 : 2);\r\n    const projectionTolerance = 24; // px\r\n\r\n    const positioned = fixtures.map((fixture: any, index: number) => {\r\n      const fixturePoint = this.getFixtureAnchorPoint(fixture);\r\n      const relativeX = fixturePoint.x - origin.x;\r\n      const relativeY = fixturePoint.y - origin.y;\r\n      const cross = direction.x * relativeY - direction.y * relativeX;\r\n      const dot = direction.x * relativeX + direction.y * relativeY;\r\n      const side = Math.abs(cross) < 1e-4 ? 0 : cross > 0 ? 1 : -1;\r\n\r\n      return {\r\n        fixture,\r\n        index,\r\n        side,\r\n        projection: dot,\r\n        distanceFromLine: Math.abs(cross),\r\n      };\r\n    });\r\n\r\n    positioned.sort((a, b) => {\r\n      const sideDelta = sideRank(a.side) - sideRank(b.side);\r\n      if (sideDelta !== 0) return sideDelta;\r\n\r\n      const projectionDelta = a.projection - b.projection;\r\n      if (Math.abs(projectionDelta) > projectionTolerance)\r\n        return projectionDelta;\r\n\r\n      const lineDistanceDelta = b.distanceFromLine - a.distanceFromLine;\r\n      if (Math.abs(lineDistanceDelta) > 1e-4) return lineDistanceDelta;\r\n\r\n      const elementDelta =\r\n        (Number(a.fixture?.associatedElementNumber) ||\r\n          Number.MAX_SAFE_INTEGER) -\r\n        (Number(b.fixture?.associatedElementNumber) || Number.MAX_SAFE_INTEGER);\r\n      if (elementDelta !== 0) return elementDelta;\r\n\r\n      const fixtureDelta =\r\n        (Number(a.fixture?.associatedElementFixtureNumber) ||\r\n          Number.MAX_SAFE_INTEGER) -\r\n        (Number(b.fixture?.associatedElementFixtureNumber) ||\r\n          Number.MAX_SAFE_INTEGER);\r\n      if (fixtureDelta !== 0) return fixtureDelta;\r\n\r\n      return a.index - b.index;\r\n    });\r\n\r\n    return positioned.map((item) => item.fixture);\r\n  }\r\n\r\n  private getFixtureAnchorPoint(fixture: any): { x: number; y: number } {\r\n    const positionUnit = fixture?.relativePosition?.unit || \"ft\";\r\n    const widthUnit = fixture?.fixtureStaticWidth?.unit || \"ft\";\r\n    const lengthUnit = fixture?.fixtureStaticLength?.unit || \"ft\";\r\n\r\n    const x = this.toPixels(fixture?.relativePosition?.x || 0, positionUnit);\r\n    const y = this.toPixels(fixture?.relativePosition?.y || 0, positionUnit);\r\n    const width = this.toPixels(\r\n      fixture?.fixtureStaticWidth?.value || 0,\r\n      widthUnit,\r\n    );\r\n    const height = this.toPixels(\r\n      fixture?.fixtureStaticLength?.value || 0,\r\n      lengthUnit,\r\n    );\r\n\r\n    return {\r\n      x: x + width / 2,\r\n      y: y + height / 2,\r\n    };\r\n  }\r\n\r\n  private drawEntranceDissectionLine(\r\n    canvas: fabric.Canvas,\r\n    arrowGroup: fabric.Group,\r\n    arrowWidth: number,\r\n    arrowHeight: number,\r\n    angle: number,\r\n  ) {\r\n    // Get the arrow path from the group\r\n    const objects = arrowGroup.getObjects();\r\n    const arrowPath = objects.find((obj) => obj.type === \"path\") as fabric.Path;\r\n\r\n    if (!arrowPath) return;\r\n\r\n    // Get the group's bounding box to find the center\r\n    const groupBounds = arrowGroup.getBoundingRect();\r\n\r\n    // The path's position within the group\r\n    const pathLeft = arrowPath.left || 0;\r\n\r\n    // Calculate tip X: rightmost point of the path\r\n    const tipInGroupX = pathLeft + arrowWidth;\r\n\r\n    const groupCenter = arrowGroup.getCenterPoint();\r\n    const invMatrix = fabric.util.invertTransform(\r\n      arrowGroup.calcTransformMatrix(),\r\n    );\r\n    const groupCenterInGroup = fabric.util.transformPoint(\r\n      groupCenter,\r\n      invMatrix,\r\n    );\r\n\r\n    // Use the group's vertical center for Y\r\n    const tipInGroupY = groupCenterInGroup.y;\r\n\r\n    // Transform from group coordinates to canvas coordinates\r\n    const tipPoint = new fabric.Point(tipInGroupX, tipInGroupY);\r\n    const transformedPoint = fabric.util.transformPoint(\r\n      tipPoint,\r\n      arrowGroup.calcTransformMatrix(),\r\n    );\r\n    const tipX = transformedPoint.x;\r\n    const tipY = transformedPoint.y;\r\n\r\n    // Get store bounds\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    // Calculate direction vector parallel to the entrance (in the direction the arrow points)\r\n    const rad = (angle * Math.PI) / 180;\r\n    const directionX = Math.cos(rad);\r\n    const directionY = Math.sin(rad);\r\n\r\n    // Calculate intersection points with store boundaries using line-rectangle intersection\r\n    const intersections: Array<{ x: number; y: number }> = [];\r\n\r\n    // Check intersection with each boundary edge\r\n    const edges = [\r\n      {\r\n        x1: bounds.left,\r\n        y1: bounds.top,\r\n        x2: bounds.left + bounds.width,\r\n        y2: bounds.top,\r\n      }, // Top\r\n      {\r\n        x1: bounds.left + bounds.width,\r\n        y1: bounds.top,\r\n        x2: bounds.left + bounds.width,\r\n        y2: bounds.top + bounds.height,\r\n      }, // Right\r\n      {\r\n        x1: bounds.left + bounds.width,\r\n        y1: bounds.top + bounds.height,\r\n        x2: bounds.left,\r\n        y2: bounds.top + bounds.height,\r\n      }, // Bottom\r\n      {\r\n        x1: bounds.left,\r\n        y1: bounds.top + bounds.height,\r\n        x2: bounds.left,\r\n        y2: bounds.top,\r\n      }, // Left\r\n    ];\r\n\r\n    // Extend line in both directions to find intersections\r\n    const maxDistance = Math.max(bounds.width, bounds.height) * 2;\r\n    for (const edge of edges) {\r\n      const intersection = this.lineIntersection(\r\n        tipX,\r\n        tipY,\r\n        tipX + directionX * maxDistance,\r\n        tipY + directionY * maxDistance,\r\n        edge.x1,\r\n        edge.y1,\r\n        edge.x2,\r\n        edge.y2,\r\n      );\r\n      if (intersection) {\r\n        intersections.push(intersection);\r\n      }\r\n\r\n      const intersectionBack = this.lineIntersection(\r\n        tipX,\r\n        tipY,\r\n        tipX - directionX * maxDistance,\r\n        tipY - directionY * maxDistance,\r\n        edge.x1,\r\n        edge.y1,\r\n        edge.x2,\r\n        edge.y2,\r\n      );\r\n      if (intersectionBack) {\r\n        intersections.push(intersectionBack);\r\n      }\r\n    }\r\n\r\n    if (intersections.length >= 2) {\r\n      // Find the two points that are farthest apart (to draw the full line across the store)\r\n      let maxDist = 0;\r\n      let point1 = intersections[0];\r\n      let point2 = intersections[1];\r\n\r\n      for (let i = 0; i < intersections.length; i++) {\r\n        for (let j = i + 1; j < intersections.length; j++) {\r\n          const dist = Math.sqrt(\r\n            Math.pow(intersections[i].x - intersections[j].x, 2) +\r\n              Math.pow(intersections[i].y - intersections[j].y, 2),\r\n          );\r\n          if (dist > maxDist) {\r\n            maxDist = dist;\r\n            point1 = intersections[i];\r\n            point2 = intersections[j];\r\n          }\r\n        }\r\n      }\r\n\r\n      // Draw the line\r\n      const line = new fabric.Line([point1.x, point1.y, point2.x, point2.y], {\r\n        stroke: \"transparent\",\r\n        strokeWidth: 1,\r\n        selectable: false,\r\n        evented: false,\r\n      }) as fabric.Line & { isDissectionLine?: boolean };\r\n\r\n      line.isDissectionLine = true;\r\n\r\n      canvas.add(line);\r\n      canvas.sendObjectToBack(line);\r\n    }\r\n  }\r\n\r\n  private lineIntersection(\r\n    x1: number,\r\n    y1: number,\r\n    x2: number,\r\n    y2: number,\r\n    x3: number,\r\n    y3: number,\r\n    x4: number,\r\n    y4: number,\r\n  ): { x: number; y: number } | null {\r\n    const denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\r\n    if (Math.abs(denom) < 1e-10) return null; // Lines are parallel\r\n\r\n    const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denom;\r\n    const u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denom;\r\n\r\n    // Check if intersection is within both line segments\r\n    if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\r\n      return {\r\n        x: x1 + t * (x2 - x1),\r\n        y: y1 + t * (y2 - y1),\r\n      };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private removeDissectionLines() {\r\n    if (!this.canvas) return;\r\n\r\n    const objects = this.canvas.getObjects();\r\n    const dissectionLines = objects.filter(\r\n      (obj: any) => obj.isDissectionLine === true,\r\n    );\r\n\r\n    dissectionLines.forEach((line) => {\r\n      this.canvas?.remove(line);\r\n    });\r\n\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  private updateDissectionLines() {\r\n    if (!this.canvas) return;\r\n\r\n    this.removeDissectionLines();\r\n\r\n    const entranceObjects = this.canvas\r\n      .getObjects()\r\n      .filter((obj: any) => obj.objType === \"entrance\") as fabric.Group[];\r\n\r\n    entranceObjects.forEach((entranceGroup) => {\r\n      const elementData = (entranceGroup as any).data;\r\n      if (!elementData) return;\r\n\r\n      const width = entranceGroup.getScaledWidth() || 80;\r\n      const height = entranceGroup.getScaledHeight() || 75;\r\n      const angle = entranceGroup.angle || 0;\r\n\r\n      this.drawEntranceDissectionLine(\r\n        this.canvas,\r\n        entranceGroup,\r\n        width,\r\n        height,\r\n        angle,\r\n      );\r\n    });\r\n\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  openSourceCad() {\r\n    const storeName = this.floorData?.storeName ?? this.planoData?.storeName;\r\n    this.cadSource.open(storeName, this.floorData?.cadFiles);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"onboard-plano\">\r\n    <!-- Loading State -->\r\n    <div *ngIf=\"isPageLoading\" class=\"row\">\r\n        <div class=\"col-12 m-0\">\r\n            <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n        </div>\r\n        <div class=\"col-3\">\r\n            <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n        </div>\r\n        <div class=\"col-6\">\r\n            <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n        </div>\r\n        <div class=\"col-3\">\r\n            <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- Content -->\r\n    <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n        <!-- Header Accordion -->\r\n        <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n            <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n                <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n                    <div class=\"d-flex gap-4 align-items-center\">\r\n                        <div style=\"margin-left:5px;\" *ngIf=\"planoData?.storeName\">\r\n                            <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n                        </div>\r\n                        <lib-reactive-select *ngIf=\"floorsList.length\" [formControl]=\"selectedFloorId\"\r\n                            [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorsList\">\r\n                        </lib-reactive-select>\r\n                    </div>\r\n\r\n                    <div class=\"d-flex align-items-center gap-4\">\r\n                        <div *ngIf=\"!editFixture\" class=\"updateClass\"\r\n                            [ngbTooltip]=\"floorData?.updatedByName ? 'Updated by ' + floorData.updatedByName : null\">\r\n                            Last Update: {{ floorData?.lastUpdateIso | date:'d MMM yyyy, hh:mm a' }}\r\n                        </div>\r\n\r\n<!-- Source CAD button temporarily disabled\r\n                        <button *ngIf=\"cadSource.hasSource(floorData?.cadFiles)\" type=\"button\"\r\n                            class=\"btn btn-outline text-nowrap d-flex align-items-center gap-2\"\r\n                            ngbTooltip=\"View the source CAD drawing\" (click)=\"openSourceCad()\">\r\n                            <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                              <path d=\"M9.5 1.5H4a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5l-3.5-3.5Z\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>\r\n                              <path d=\"M9.5 1.5V5H13M6 8.5l2 2 2-2M8 10.5V7\" stroke=\"#344054\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                            </svg>\r\n                            Source CAD\r\n                        </button>\r\n-->\r\n\r\n\r\n                        <div class=\"d-flex gap-4 align-items-center\">\r\n                            <!-- Edit Fixture Mode -->\r\n                            <ng-container *ngIf=\"editFixture\">\r\n                                <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n                                    (click)=\"onFixturePageCancel()\">\r\n                                    Cancel\r\n                                </button>\r\n                                <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n                                    Save & Close\r\n                                </button>\r\n                            </ng-container>\r\n                            <button ngbAccordionButton></button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n\r\n                <div ngbAccordionCollapse>\r\n                    <div ngbAccordionBody>\r\n                        <div id=\"header\" class=\"row mx-0 gap-3\">\r\n                            <!-- Plano Completion -->\r\n                            <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                                <h3 class=\"d-flex align-items-center gap-2\">\r\n                                    Plano Completion %\r\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                        fill=\"none\" ngbTooltip=\"% of overall planogram completion\">\r\n                                        <g clip-path=\"url(#clip0_1517_129805)\">\r\n                                            <path\r\n                                                d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                                                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                stroke-linejoin=\"round\" />\r\n                                        </g>\r\n                                        <defs>\r\n                                            <clipPath id=\"clip0_1517_129805\">\r\n                                                <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                            </clipPath>\r\n                                        </defs>\r\n                                    </svg>\r\n                                </h3>\r\n                                <div class=\"row align-items-center mt-2\">\r\n                                    <div class=\"col-9\">\r\n                                        <div class=\"progress\" style=\"height: 4px\">\r\n                                            <div class=\"progress-bar\" [ngClass]=\"\r\n                          [25, 50].includes(getProgressValue) ? 'bg-warning' : 'bg-success'\" role=\"progressbar\"\r\n                                                [style]=\"'width:' + getProgressValue + '%'\"\r\n                                                [attr.aria-valuenow]=\"getProgressValue\" aria-valuemin=\"0\"\r\n                                                aria-valuemax=\"100\">\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"col-3\">{{ getProgressValue }}%</div>\r\n                                </div>\r\n                            </div>\r\n\r\n                            <!-- Layout -->\r\n                            <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                                <h3><b>{{floorData?.floorNumber}}/{{ planoData?.floors?.length }}</b> Layout</h3>\r\n                                <div class=\"indicator mt-2\"\r\n                                    [ngClass]=\"getStatus === 'allocationPending' ? 'completed' : 'draft'\">\r\n                                    {{ getStatus === 'allocationPending' ? 'Completed' : 'Draft' }}\r\n                                </div>\r\n                            </div>\r\n\r\n                            <!-- Fixtures -->\r\n                            <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                                <h3><b>{{ allFixtureInstances.length }}</b> Fixtures</h3>\r\n                                <div class=\"indicator mt-2\" [ngClass]=\"getStatus\">\r\n                                    {{ getStatusText }}\r\n                                </div>\r\n                            </div>\r\n\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Body -->\r\n        <div id=\"body\" class=\"row\">\r\n            <!-- Left Column -->\r\n            <div\r\n                [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture  }\">\r\n                <div class=\"s-card\">\r\n                    <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n                        <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n                            <!-- Walls Section -->\r\n                            <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n                                <ng-container formArrayName=\"walls\">\r\n                                    <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n                                        <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\"\r\n                                            class=\"mb-5\">\r\n                                            <div class=\"d-flex\" ngbAccordionHeader>\r\n                                                <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                                                    <div class=\"d-flex align-items-center\">\r\n                                                        <span class=\"me-2 wall-label\">\r\n                                                            {{ group.get(\"elementType\")?.value | titlecase }}\r\n                                                            {{ group.get(\"elementNumber\")?.value }}\r\n                                                        </span>\r\n\r\n                                                        @if(layoutForm.enabled){\r\n                                                            <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n                                                                (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n                                                                    height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                                                                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                                                        d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n                                                                        fill=\"#475467\" stroke=\"#475467\"\r\n                                                                        stroke-width=\"0.00064\" />\r\n                                                                </svg>\r\n                                                            </span>\r\n                                                            <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n                                                                (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n                                                                    height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                                                                    <g clip-path=\"url(#clip0_62_8)\">\r\n                                                                        <path\r\n                                                                            d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n                                                                            fill=\"#475467\" />\r\n                                                                    </g>\r\n                                                                    <defs>\r\n                                                                        <clipPath id=\"clip0_62_8\">\r\n                                                                            <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                                                        </clipPath>\r\n                                                                    </defs>\r\n                                                                </svg>\r\n                                                            </span>\r\n                                                            <span class=\"me-1\"\r\n                                                                ngbTooltip=\"Remove this wall and its fixtures.\"\r\n                                                                (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n                                                                    height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                                                                    <g clip-path=\"url(#clip0_63_25)\">\r\n                                                                        <path\r\n                                                                            d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n                                                                            fill=\"#F32B2B\" />\r\n                                                                    </g>\r\n                                                                    <defs>\r\n                                                                        <clipPath id=\"clip0_63_25\">\r\n                                                                            <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                                                        </clipPath>\r\n                                                                    </defs>\r\n                                                                </svg>\r\n                                                            </span>\r\n                                                        }\r\n                                                    </div>\r\n                                                    <div class=\"divider\"></div>\r\n                                                </button>\r\n                                            </div>\r\n\r\n                                            <div ngbAccordionCollapse>\r\n                                                <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                                                    <ng-template>\r\n                                                        <div style=\"min-height: 50px\" dndDropzone\r\n                                                            (dndDrop)=\"onDrop($event, i)\">\r\n                                                            <!-- Fixtures -->\r\n                                                            <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n                                                                <div formArrayName=\"fixtures\">\r\n                                                                    <ng-container\r\n                                                                        *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n                                                                        <div dndDropzone\r\n                                                                            (dndDrop)=\"onDrop($event, i, j)\"\r\n                                                                            [formGroupName]=\"j\"\r\n                                                                            [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\"\r\n                                                                            [dndEffectAllowed]=\"'all'\"\r\n                                                                            class=\"row g-0 mb-5 fixture-row\"\r\n                                                                            [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n                                                                            [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n                                                                            <div class=\"col-1\">\r\n                                                                                <div\r\n                                                                                    class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                                                                    <svg dndDragImageRef\r\n                                                                                        [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n                                                                                        width=\"25px\" viewBox=\"0 0 16 16\"\r\n                                                                                        xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                                                        <path\r\n                                                                                            d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                                                                            fill=\"grey\" />\r\n                                                                                    </svg>\r\n                                                                                </div>\r\n                                                                            </div>\r\n\r\n                                                                            <div class=\"col-10\">\r\n                                                                                <lib-reactive-select\r\n                                                                                    formControlName=\"fixtureConfigId\"\r\n                                                                                    [idField]=\"'_id'\"\r\n                                                                                    [nameField]=\"'name'\"\r\n                                                                                    [data]=\"fixtureTemplates\"\r\n                                                                                    [label]=\"'Fixture ' + (j + 1)\"\r\n                                                                                    [subTextField]=\"'subtext'\"\r\n                                                                                    [search]=\"true\">\r\n                                                                                </lib-reactive-select>\r\n                                                                            </div>\r\n\r\n                                                                            <div class=\"col-1\">\r\n                                                                                <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                                                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                                                                    <svg (click)=\"deleteFixture('wall', j, i)\"\r\n                                                                                        style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                                                                        xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                                                        width=\"10\" height=\"10\"\r\n                                                                                        viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                                                                        <path d=\"M9 1L1 9M1 1L9 9\"\r\n                                                                                            stroke=\"#344054\"\r\n                                                                                            stroke-width=\"2\"\r\n                                                                                            stroke-linecap=\"round\"\r\n                                                                                            stroke-linejoin=\"round\" />\r\n                                                                                    </svg>\r\n                                                                                </div>\r\n                                                                            </div>\r\n                                                                        </div>\r\n                                                                    </ng-container>\r\n                                                                </div>\r\n                                                            </ng-container>\r\n\r\n                                                            <div class=\"d-flex justify-content-end\">\r\n                                                                <a class=\"link-btn\"\r\n                                                                    [class.disabled-click]=\"layoutForm.disabled\"\r\n                                                                    (click)=\"addNewFixture('wall', i)\">\r\n                                                                    Add fixture\r\n                                                                </a>\r\n                                                            </div>\r\n\r\n                                                            <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                                                            <!-- Other Elements -->\r\n                                                            <ng-container\r\n                                                                *ngIf=\"getWallOtherElements(i).controls.length\">\r\n                                                                <div formArrayName=\"otherElements\">\r\n                                                                    <ng-container\r\n                                                                        *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n                                                                        <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                                                            <div class=\"col-11\">\r\n                                                                                <label class=\"form-label mb-1\">Element\r\n                                                                                    {{ j + 1 }}</label>\r\n\r\n                                                                                <!-- Dropdown bound to 'type' -->\r\n                                                                                <lib-reactive-select [idField]=\"'value'\"\r\n                                                                                    [nameField]=\"'label'\"\r\n                                                                                    [data]=\"otherElementList\"\r\n                                                                                    [id]=\"'elementLabel' + j\"\r\n                                                                                    formControlName=\"type\">\r\n                                                                                </lib-reactive-select>\r\n\r\n                                                                                <!-- Show custom text input only when 'Others' is selected -->\r\n                                                                                <input\r\n                                                                                    *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n                                                                                    type=\"text\"\r\n                                                                                    class=\"form-control mt-2\"\r\n                                                                                    formControlName=\"customName\"\r\n                                                                                    placeholder=\"Enter custom element name\" />\r\n                                                                            </div>\r\n\r\n                                                                            <div class=\"col-1\">\r\n                                                                                <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                                                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                                                                    <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n                                                                                        style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                                                                        xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                                                        width=\"10\" height=\"10\"\r\n                                                                                        viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                                                                        <path d=\"M9 1L1 9M1 1L9 9\"\r\n                                                                                            stroke=\"#344054\"\r\n                                                                                            stroke-width=\"2\"\r\n                                                                                            stroke-linecap=\"round\"\r\n                                                                                            stroke-linejoin=\"round\" />\r\n                                                                                    </svg>\r\n                                                                                </div>\r\n                                                                            </div>\r\n                                                                        </div>\r\n                                                                    </ng-container>\r\n                                                                </div>\r\n                                                            </ng-container>\r\n\r\n                                                            <div class=\"d-flex justify-content-end\">\r\n                                                                <a class=\"link-btn\"\r\n                                                                    [class.disabled-click]=\"layoutForm.disabled\"\r\n                                                                    (click)=\"addNewOtherElements('wall', i)\">\r\n                                                                    Add element\r\n                                                                </a>\r\n                                                            </div>\r\n                                                        </div>\r\n                                                    </ng-template>\r\n                                                </div>\r\n                                            </div>\r\n                                        </div>\r\n                                    </ng-container>\r\n                                </ng-container>\r\n                            </ng-container>\r\n\r\n                            <ng-template #addWallAction>\r\n                                <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                    class=\"btn btn-secondary w-100 p-2\">\r\n                                    Insert new wall\r\n                                </button>\r\n                            </ng-template>\r\n\r\n                            <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                            <!-- Floor Section -->\r\n                            <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n                                <div class=\"d-flex\" ngbAccordionHeader>\r\n                                    <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                                        <span class=\"me-2 wall-label\">Floor</span>\r\n                                        <div class=\"divider\"></div>\r\n                                    </button>\r\n                                </div>\r\n\r\n                                <div ngbAccordionCollapse>\r\n                                    <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                                        <ng-template>\r\n                                            <div style=\"min-height: 50px\" dndDropzone\r\n                                                (dndDrop)=\"onDrop($event, 'floor')\">\r\n                                                <!-- Floor Fixtures -->\r\n                                                <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n                                                    <div formArrayName=\"floorFixtures\">\r\n                                                        <ng-container\r\n                                                            *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n                                                            <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\"\r\n                                                                [formGroupName]=\"j\"\r\n                                                                [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\"\r\n                                                                [dndEffectAllowed]=\"'all'\"\r\n                                                                [dndDisableDragIf]=\"layoutForm.disabled\"\r\n                                                                class=\"row g-0 mb-5 fixture-row\"\r\n                                                                [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n                                                                <div class=\"col-1\">\r\n                                                                    <div\r\n                                                                        class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                                                        <svg dndDragImageRef\r\n                                                                            style=\"cursor: move; opacity: 0.5\"\r\n                                                                            width=\"25px\" viewBox=\"0 0 16 16\"\r\n                                                                            xmlns=\"http://www.w3.org/2000/svg\">\r\n                                                                            <path\r\n                                                                                d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                                                                fill=\"grey\" />\r\n                                                                        </svg>\r\n                                                                    </div>\r\n                                                                </div>\r\n\r\n                                                                <div class=\"col-10\">\r\n                                                                    <lib-reactive-select\r\n                                                                        formControlName=\"fixtureConfigId\"\r\n                                                                        [idField]=\"'_id'\" [nameField]=\"'name'\"\r\n                                                                        [data]=\"fixtureTemplates\"\r\n                                                                        [label]=\"'Fixture ' + (j + 1)\" [search]=\"true\"\r\n                                                                        [subTextField]=\"'subtext'\">\r\n                                                                    </lib-reactive-select>\r\n                                                                </div>\r\n\r\n                                                                <div class=\"col-1\">\r\n                                                                    <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                                                        [class.disabled-click]=\"layoutForm.disabled\">\r\n                                                                        <svg (click)=\"deleteFixture('floor', j)\"\r\n                                                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                                                            xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                                            width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n                                                                            fill=\"none\">\r\n                                                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n                                                                                stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                                                stroke-linejoin=\"round\" />\r\n                                                                        </svg>\r\n                                                                    </div>\r\n                                                                </div>\r\n                                                            </div>\r\n                                                        </ng-container>\r\n                                                    </div>\r\n                                                </ng-container>\r\n\r\n                                                <div class=\"d-flex justify-content-end\">\r\n                                                    <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                                        (click)=\"addNewFixture('floor')\">\r\n                                                        Add fixture\r\n                                                    </a>\r\n                                                </div>\r\n\r\n                                                <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                                                <!-- Floor Other Elements -->\r\n                                                <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n                                                    <div formArrayName=\"floorOtherElements\">\r\n                                                        <ng-container\r\n                                                            *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n                                                            <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                                                <div class=\"col-11\">\r\n                                                                    <label class=\"form-label mb-1\">Element\r\n                                                                        {{ j + 1 }}</label>\r\n\r\n                                                                    <!-- Dropdown for type -->\r\n                                                                    <lib-reactive-select [idField]=\"'value'\"\r\n                                                                        [nameField]=\"'label'\" [data]=\"otherElementList\"\r\n                                                                        [id]=\"'floorElementLabel' + j\"\r\n                                                                        formControlName=\"type\">\r\n                                                                    </lib-reactive-select>\r\n\r\n                                                                    <!-- Conditional input for custom name -->\r\n                                                                    <input\r\n                                                                        *ngIf=\"(fixture.get('type')?.value) === 'Others'\"\r\n                                                                        type=\"text\" class=\"form-control mt-2\"\r\n                                                                        formControlName=\"customName\"\r\n                                                                        placeholder=\"Enter custom element name\" />\r\n                                                                </div>\r\n\r\n                                                                <div class=\"col-1\">\r\n                                                                    <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                                                        [class.disabled-click]=\"layoutForm.disabled\">\r\n                                                                        <svg (click)=\"removeOtherElement('floor', j)\"\r\n                                                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                                                            xmlns=\"http://www.w3.org/2000/svg\"\r\n                                                                            width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"\r\n                                                                            fill=\"none\">\r\n                                                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n                                                                                stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                                                                stroke-linejoin=\"round\" />\r\n                                                                        </svg>\r\n                                                                    </div>\r\n                                                                </div>\r\n                                                            </div>\r\n                                                        </ng-container>\r\n                                                    </div>\r\n                                                </ng-container>\r\n\r\n                                                <div class=\"d-flex justify-content-end\">\r\n                                                    <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                                        (click)=\"addNewOtherElements('floor')\">\r\n                                                        Add element\r\n                                                    </a>\r\n                                                </div>\r\n                                            </div>\r\n                                        </ng-template>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </form>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Center Column -->\r\n            <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n                <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n                    <!-- Canvas View -->\r\n                    <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n\r\n                    <div class=\"position-absolute d-flex align-items-center justify-content-end gap-2\"\r\n                        style=\"top: 24px; right: 26px;width: calc(100% - 50px);\">\r\n                        <!-- Entrance Button -->\r\n                        <div *ngIf=\"layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\"\r\n                            [disableTooltip]=\"getEntrances?.length < 2\" class=\"me-auto\">\r\n                            <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n                                class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm \"\r\n                                [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n                                Add Entrance\r\n                            </button>\r\n                        </div>\r\n\r\n                        <!-- Cancel edit -->\r\n                        @if(layoutForm.enabled){\r\n                            @if(getStatus === 'allocationPending'){\r\n                                <button type=\"button\" class=\"btn btn-outline bg-white shadow-sm\" (click)=\"cancelEdit()\">\r\n                                    Cancel\r\n                                </button>\r\n                            }@else {\r\n                                <button type=\"button\" class=\"btn btn-text\" (click)=\"cancelEdit()\">\r\n                                    Cancel\r\n                                </button>\r\n                            }\r\n                        }\r\n\r\n                        <!-- Save -->\r\n                        @if(layoutForm.enabled){\r\n                            @if(getStatus === 'draft'){\r\n                                <button type=\"button\"\r\n                                    class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n                                    style=\"min-width: 130px;\"\r\n                                    [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n                                    <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n                                    Save as Draft\r\n                                </button>\r\n                            }@else{\r\n                                <button type=\"button\"\r\n                                    style=\"padding: 8px 20px !important;min-width: 90px;\"\r\n                                    class=\"btn btn-primary text-nowrap d-flex align-items-center gap-2 justify-content-center\"\r\n                                    [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n                                    <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\r\n                                    Save\r\n                                </button>\r\n                            }\r\n                        }\r\n\r\n                        <!-- Compact button (CAD layouts only, view mode) — one-shot:\r\n                             clicking compacts the layout and drops the user into edit\r\n                             mode so the change is revertable via Cancel and persistable\r\n                             via Save / Submit. -->\r\n                        @if(canShowCompactToggle && layoutForm.disabled){\r\n                            <button type=\"button\"\r\n                                class=\"btn btn-outline shadow-sm bg-white d-flex align-items-center gap-2 justify-content-center\"\r\n                                (click)=\"compactLayout()\"\r\n                                ngbTooltip=\"Compact layout.\"\r\n                                container=\"body\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"\r\n                                    fill=\"none\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                    stroke-linejoin=\"round\">\r\n                                    <polyline points=\"4 14 10 14 10 20\"></polyline>\r\n                                    <polyline points=\"20 10 14 10 14 4\"></polyline>\r\n                                    <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line>\r\n                                    <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>\r\n                                </svg>\r\n                            </button>\r\n                        }\r\n\r\n                        <!-- Edit Button -->\r\n                        @if(isEditLayoutAllowed){\r\n                            <button type=\"button\"\r\n                                class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n                                (click)=\"onClickEdit()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <g clip-path=\"url(#clip0_1322_5325)\">\r\n                                        <path\r\n                                            d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                                            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n                                            stroke-linejoin=\"round\" />\r\n                                    </g>\r\n                                    <defs>\r\n                                        <clipPath id=\"clip0_1322_5325\">\r\n                                            <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                                        </clipPath>\r\n                                    </defs>\r\n                                </svg>\r\n                                Edit\r\n                            </button>\r\n                        }\r\n\r\n                        <!-- Cancel Button (From allocation) -->\r\n                        <button *ngIf=\"layoutForm.disabled && isAllocationRun\" type=\"button\"\r\n                            class=\"btn btn-outline bg-white shadow-sm\" (click)=\"onClickRevertAllocation() \">\r\n                            Cancel\r\n                        </button>\r\n\r\n\r\n                        <!-- Run allocation / Complete -->\r\n                        @if(isRunAllocationAllowed && layoutForm.disabled && getStatus === 'allocationPending'){\r\n                            <span\r\n                                [ngbTooltip]=\"!isAllocationRun ? invalidFixturesTooltip : unallocatedZonesTooltip\"\r\n                                container=\"body\">\r\n                                <button type=\"button\" style=\"padding: 8px 20px !important;\"\r\n                                    class=\"btn btn-primary text-nowrap\"\r\n                                    [disabled]=\"(!isAllocationRun && hasInvalidFixtures) || (isAllocationRun && hasUnallocatedZoneFixtures)\"\r\n                                    (click)=\"onClickRunAllocation()\">\r\n                                    {{ isAllocationRun ? 'Complete Allocation' : 'Run Allocation' }}\r\n                                </button>\r\n                            </span>\r\n                        }\r\n\r\n                        <button *ngIf=\"getStatus === 'draft'\" type=\"button\" style=\"padding: 8px 20px !important\"\r\n                            class=\"btn btn-primary text-nowrap\" (click)=\"onClickApproveLayout()\">\r\n                            Submit for merch allocation\r\n                        </button>\r\n\r\n                        <!-- Rotate Button -->\r\n                        <button type=\"button\" *ngIf=\"layoutForm.disabled\" class=\"btn btn-outline bg-white shadow-sm\"\r\n                            (click)=\"rotateCanvas(canvas,90)\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\"\r\n                                fill=\"none\">\r\n                                <path\r\n                                    d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                                    fill=\"#1D2939\" />\r\n                                <path\r\n                                    d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                                    stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                            </svg>\r\n                        </button>\r\n\r\n                        <!-- Download Button -->\r\n                        <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n                            (click)=\"downloadCanvas()\">\r\n                            <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\"\r\n                                xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n                                <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n                                <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n                                    stroke=\"#CCCCCC\" stroke-width=\"0.384\"></g>\r\n                                <g id=\"SVGRepo_iconCarrier\">\r\n                                    <path\r\n                                        d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                                        fill=\"#1D2939\"></path>\r\n                                    <path\r\n                                        d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                                        fill=\"#1D2939\"></path>\r\n                                </g>\r\n                            </svg>\r\n                        </button>\r\n                    </div>\r\n\r\n                </div>\r\n\r\n                <!-- Panel Collapse Handlers -->\r\n                <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n                    <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path\r\n                            d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path\r\n                            d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </div>\r\n\r\n                <div class=\"collapse-handler right\" (click)=\"togglePanel('right')\">\r\n                    <svg *ngIf=\"isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path\r\n                            d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                    <svg *ngIf=\"!isRightPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n                        viewBox=\"0 0 18 18\" fill=\"none\">\r\n                        <path\r\n                            d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n                            stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Edit Fixture Body -->\r\n            <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n                <div id=\"edit-body\" class=\"row\">\r\n                    <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n                        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n                            <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n                                [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\"\r\n                                role=\"tab\">\r\n                                Basic details\r\n                            </a>\r\n                        </li>\r\n                        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n                            <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n                                [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\"\r\n                                role=\"tab\">\r\n                                Products\r\n                            </a>\r\n                        </li>\r\n                        <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n                            <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n                                [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                                Visual Merchandise\r\n                            </a>\r\n                        </li>\r\n                    </ul>\r\n\r\n                    <div class=\"col\">\r\n                        <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n                            <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n                                [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\"\r\n                                [libraryCategories]=\"libraryCategories\"\r\n                                [libraryByCategory]=\"libraryByCategory\"\r\n                                [allowCategoryAndWidthEdit]=\"true\">\r\n                            </lib-instance-basic-details>\r\n                        </ng-container>\r\n\r\n                        <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n                            <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n                                [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n                            </lib-instance-products>\r\n                        </ng-container>\r\n\r\n                        <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n                            <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n                                [isSubmitted]=\"submitFixture\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n                            </lib-instance-vms>\r\n                        </ng-container>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <div [ngClass]=\"{ 'collapsed-col': isRightPanelCollapsed, 'col-3': !isRightPanelCollapsed }\"\r\n                [style]=\"{'min-width': isRightPanelCollapsed ? '0' :  isAllocationRun ?'680px' : '464px' }\">\r\n                <ng-container *ngTemplateOutlet=\"fixturePreviewCol\"></ng-container>\r\n            </div>\r\n\r\n        </div>\r\n\r\n    </div>\r\n</section>\r\n\r\n<ng-template #fixturePreviewCol>\r\n    <div class=\"s-card\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n        <onboard-fixture [ngClass]=\"{ 'd-none': isRightPanelCollapsed}\"\r\n            (onClose)=\"togglePanel('right'); selectedFixtureData = null; removeHighlight();\"\r\n            [fixtureData]=\"selectedFixtureData\" [isAllocationRun]=\"isAllocationRun\"\r\n            [allFixtures]=\"allFixtureInstances\"></onboard-fixture>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n    <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer w-100 p-4 rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke mt-0 animate title\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n    <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n        <div class=\"shimmer rounded\">\r\n            <div class=\"wrapper\">\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n                <br />\r\n                <div class=\"stroke animate title\"></div>\r\n                <div class=\"stroke animate link\"></div>\r\n                <div class=\"stroke animate description\"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n    <div class=\"modal-body\">\r\n        <div class=\"d-flex justify-content-start mb-4\">\r\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n                <path\r\n                    d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n                    fill=\"#009BF3\" />\r\n            </svg>\r\n\r\n        </div>\r\n        <div>\r\n            <h2 class=\"mb-3\">Run Allocation Logic</h2>\r\n            <p>This will map all fixtures and apply allocations based on the business-defined logic, then move them to\r\n                the verification section. Are you sure you want to continue?</p>\r\n        </div>\r\n        <div class=\"d-flex justify-content-end gap-3\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n                [disabled]=\"isButtonLoading\">Cancel</button>\r\n            <button type=\"button\" class=\"btn btn-primary\" (click)=\"runAllocation()\" [disabled]=\"isButtonLoading\">\r\n                <span *ngIf=\"!isButtonLoading\"> Run allocation Logic</span>\r\n                <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n                    <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n                </svg>\r\n            </button>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n    <div class=\"modal-body\">\r\n        <div>\r\n            <h2 class=\"mb-3\">Approve & Submit</h2>\r\n            <p>\r\n                This will complete the layout and make it ready for allocation. Ensure that all fixture counts and\r\n                placements are as per the plan.\r\n            </p>\r\n        </div>\r\n        @if(hasInvalidFixtures) {\r\n            <div class=\"d-flex align-items-start gap-2 p-3 mb-3 rounded\"\r\n                style=\"background-color: #FFFAEB; border: 1px solid #FEC84B;\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    style=\"flex-shrink: 0; margin-top: 1px;\">\r\n                    <path\r\n                        d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n                        stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                </svg>\r\n                <p class=\"mb-0\" style=\"font-size: 13px; color: #92400E;\">\r\n                    @if(hasInvalidHeaderFixtures) {\r\n                        <strong>{{invalidHeaderFixtureCount}} fixture{{invalidHeaderFixtureCount === 1 ? '' : 's'}}\r\n                            {{invalidHeaderFixtureCount === 1 ? 'has' : 'have'}} an unrecognized header.</strong><br/>\r\n                    }\r\n                    @if(hasInvalidLibraryFixtures) {\r\n                        <strong>{{invalidLibraryFixtureCount}} fixture{{invalidLibraryFixtureCount === 1 ? '' : 's'}}\r\n                            {{invalidLibraryFixtureCount === 1 ? 'does' : 'do'}} not match any library entry.</strong><br/>\r\n                    }\r\n                    These are highlighted in red on the layout and must be corrected before the allocation rule can run.\r\n                </p>\r\n            </div>\r\n        }\r\n        <div class=\"d-flex justify-content-end gap-3\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n                [disabled]=\"isButtonLoading\">Cancel</button>\r\n            <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\" [disabled]=\"isButtonLoading\">\r\n                <span *ngIf=\"!isButtonLoading\">Submit</span>\r\n                <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n                    <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n                </svg>\r\n            </button>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #revertAllocationModal let-modal>\r\n    <div class=\"modal-body\">\r\n        <div class=\"d-flex justify-content-start mb-4\">\r\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#FEF3C7\" />\r\n                <path\r\n                    d=\"M20 13.3333V20M20 26.6667H20.0167M28.3333 20C28.3333 24.6024 24.6024 28.3333 20 28.3333C15.3976 28.3333 11.6667 24.6024 11.6667 20C11.6667 15.3976 15.3976 11.6667 20 11.6667C24.6024 11.6667 28.3333 15.3976 28.3333 20Z\"\r\n                    stroke=\"#F59E0B\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n        </div>\r\n        <div>\r\n            <h2 class=\"mb-3\">Revert Allocation</h2>\r\n            <p>Are you sure you want to revert the allocation? This will restore the state before running allocation.\r\n            </p>\r\n        </div>\r\n        <div class=\"d-flex justify-content-end gap-3\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n                [disabled]=\"isButtonLoading\">Cancel</button>\r\n            <button type=\"button\" class=\"btn btn-primary\" (click)=\"revertAllocation(); modal.close()\"\r\n                [disabled]=\"isButtonLoading\">\r\n                <span *ngIf=\"!isButtonLoading\">Revert</span>\r\n                <svg style=\"width: 141px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n                    <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n                </svg>\r\n            </button>\r\n        </div>\r\n    </div>\r\n</ng-template>\r\n\r\n<ng-template #completeAllocationModal let-modal>\r\n    <div class=\"modal-body\">\r\n        <div class=\"d-flex justify-content-start mb-4\">\r\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                <rect width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\" />\r\n                <path\r\n                    d=\"M20.833 21.6665C18.033 21.6665 17.1164 22.7915 16.8164 23.5332C17.708 23.9165 18.333 24.7998 18.333 25.8332C18.333 26.4962 18.0696 27.1321 17.6008 27.6009C17.1319 28.0698 16.4961 28.3332 15.833 28.3332C15.17 28.3332 14.5341 28.0698 14.0653 27.6009C13.5964 27.1321 13.333 26.4962 13.333 25.8332C13.333 24.7415 14.0247 23.8165 14.9997 23.4748V16.5248C14.5114 16.3535 14.0885 16.0344 13.7899 15.6117C13.4912 15.1891 13.3315 14.684 13.333 14.1665C13.333 13.5035 13.5964 12.8676 14.0653 12.3987C14.5341 11.9299 15.17 11.6665 15.833 11.6665C16.4961 11.6665 17.1319 11.9299 17.6008 12.3987C18.0696 12.8676 18.333 13.5035 18.333 14.1665C18.333 15.2582 17.6414 16.1832 16.6664 16.5248V20.9332C17.3997 20.3915 18.4664 19.9998 19.9997 19.9998C22.2247 19.9998 22.9664 18.8832 23.208 18.1415C22.7521 17.9516 22.3625 17.6311 22.0882 17.2204C21.8139 16.8097 21.6671 16.3271 21.6664 15.8332C21.6664 15.1701 21.9297 14.5342 22.3986 14.0654C22.8674 13.5966 23.5033 13.3332 24.1664 13.3332C24.8294 13.3332 25.4653 13.5966 25.9341 14.0654C26.403 14.5342 26.6664 15.1701 26.6664 15.8332C26.6664 16.9498 25.933 17.9165 24.9247 18.2165C24.708 19.4082 23.8997 21.6665 20.833 21.6665ZM15.833 24.9998C15.612 24.9998 15.4 25.0876 15.2438 25.2439C15.0875 25.4002 14.9997 25.6122 14.9997 25.8332C14.9997 26.0542 15.0875 26.2661 15.2438 26.4224C15.4 26.5787 15.612 26.6665 15.833 26.6665C16.054 26.6665 16.266 26.5787 16.4223 26.4224C16.5786 26.2661 16.6664 26.0542 16.6664 25.8332C16.6664 25.6122 16.5786 25.4002 16.4223 25.2439C16.266 25.0876 16.054 24.9998 15.833 24.9998ZM15.833 13.3332C15.612 13.3332 15.4 13.421 15.2438 13.5772C15.0875 13.7335 14.9997 13.9455 14.9997 14.1665C14.9997 14.3875 15.0875 14.5995 15.2438 14.7558C15.4 14.912 15.612 14.9998 15.833 14.9998C16.054 14.9998 16.266 14.912 16.4223 14.7558C16.5786 14.5995 16.6664 14.3875 16.6664 14.1665C16.6664 13.9455 16.5786 13.7335 16.4223 13.5772C16.266 13.421 16.054 13.3332 15.833 13.3332ZM24.1664 14.9998C23.9453 14.9998 23.7334 15.0876 23.5771 15.2439C23.4208 15.4002 23.333 15.6122 23.333 15.8332C23.333 16.0542 23.4208 16.2661 23.5771 16.4224C23.7334 16.5787 23.9453 16.6665 24.1664 16.6665C24.3874 16.6665 24.5993 16.5787 24.7556 16.4224C24.9119 16.2661 24.9997 16.0542 24.9997 15.8332C24.9997 15.6122 24.9119 15.4002 24.7556 15.2439C24.5993 15.0876 24.3874 14.9998 24.1664 14.9998Z\"\r\n                    fill=\"#009BF3\" />\r\n            </svg>\r\n        </div>\r\n        <div>\r\n            <h2 class=\"mb-3\">Save and complete allocation</h2>\r\n            <p>You are about to complete the merch allocation process. This will make the store ready for fixture\r\n                verification and move it to the verification stage. Are you sure you want to proceed?</p>\r\n        </div>\r\n        <div class=\"d-flex justify-content-end gap-3\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\"\r\n                [disabled]=\"isButtonLoading\">Cancel</button>\r\n            <button type=\"button\" class=\"btn btn-primary\" (click)=\"completeAllocation();\" [disabled]=\"isButtonLoading\">\r\n                <span *ngIf=\"!isButtonLoading\">Complete allocation</span>\r\n                <svg style=\"width: 107px;\" *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n                    <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n                </svg>\r\n            </button>\r\n        </div>\r\n    </div>\r\n</ng-template>","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\n\r\nimport * as fabric from \"fabric\";\r\n\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\n\r\nimport { TitleCasePipe } from \"@angular/common\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"cad-render\",\r\n  templateUrl: \"./cad-render.component.html\",\r\n  styleUrl: \"./cad-render.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class CadRenderComponent implements AfterViewInit, OnDestroy, OnInit {\r\n  @ViewChild(\"canvas\") canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    this.resizeCanvas();\r\n  }\r\n\r\n  clientId: string;\r\n\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  layoutBounds: any;\r\n\r\n  floorData: any;\r\n  rawCADDetails: any;\r\n\r\n  includeFixtures: boolean = true;\r\n  isAutoAlignMode: boolean = true;\r\n\r\n  destroy$ = new Subject();\r\n\r\n  constructor(\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private toastService: ToastService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        // await this.getVmsList();\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.initCanvas();\r\n  }\r\n\r\n  get wallCount() {\r\n    if (!this.floorData?.layoutPolygon) {\r\n      return 0;\r\n    }\r\n\r\n    const wL = this.floorData?.layoutPolygon?.filter(\r\n      (e: any) => e?.elementType === \"wall\",\r\n    );\r\n    return wL?.length ?? 0;\r\n  }\r\n\r\n  get wFixturesCount() {\r\n    return [\r\n      ...(this.floorData?.layoutPolygon?.flatMap(\r\n        (e: any) => e?.fixtures ?? [],\r\n      ) ?? []),\r\n    ].length;\r\n  }\r\n\r\n  get cFixturesCount() {\r\n    return [...(this.floorData?.centerFixture ?? [])].length;\r\n  }\r\n\r\n  private initCanvas(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasRef.nativeElement);\r\n\r\n    this.setupZoomHandlers();\r\n    this.resizeCanvas();\r\n  }\r\n\r\n  private resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 8,\r\n      height: container.clientHeight - 75,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  fromPixels(pixels: number, unit: string, dpi = 2.8): number {\r\n    let value: number;\r\n\r\n    // pixels = pixels >= this.wallThickness ? pixels - this.wallThickness : this.wallThickness;\r\n\r\n    if (unit === \"mm\") {\r\n      value = (pixels / dpi) * 25.4;\r\n    } else if (unit === \"ft\") {\r\n      value = pixels / (12 * dpi);\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(value.toFixed(4));\r\n  }\r\n\r\n  onClickRenderPlano() {\r\n    const rawJson = JSON.parse(this.rawCADDetails);\r\n    console.log(\"@@ ~ rawJson:\", rawJson);\r\n\r\n    this.floorData = this.processRawCADDetails(rawJson);\r\n\r\n    console.log(\"@@ ~ floorData:\", this.floorData);\r\n\r\n    this.drawInitialContent();\r\n  }\r\n\r\n  processRawCADDetails(rawJson: any) {\r\n    try {\r\n      let floor;\r\n\r\n      if (!rawJson?.data?.layoutPolygon) {\r\n        this.toastService.getErrorToast(\"layoutPolygon not found in CAD data\");\r\n        return null;\r\n      }\r\n\r\n      floor = {\r\n        layoutPolygon: transformWallData(rawJson.data.layoutPolygon),\r\n        storeName: \"CAD Store\",\r\n        storeId: \"CAD Store\",\r\n        floorName: \"Floor 1\",\r\n        floorNumber: 1,\r\n        planoProgress: 0,\r\n        isEdited: false,\r\n        cadLayout: true,\r\n        isPlanoApproved: false,\r\n        status: \"draft\",\r\n        centerFixture: rawJson.data?.centerFixture?.map((f: any) =>\r\n          transformFixtureData(f),\r\n        ),\r\n      };\r\n\r\n      return floor;\r\n    } catch (error) {\r\n      console.log(\"@@ ~ processRawCADDetails [ERR]:\", error);\r\n      return null;\r\n    }\r\n\r\n    function transformWallData(cadRes: any) {\r\n      return cadRes.map((w: any) => {\r\n        return {\r\n          elementType: w?.elementType ?? \"wall\",\r\n          distance: w?.distance ?? 16,\r\n          elementNumber: w?.elementNumber ?? 0,\r\n          unit: w?.unit ?? \"ft\",\r\n          direction: w?.direction ?? \"right\",\r\n          angle: w?.angle ?? 0,\r\n          relativePosition: w?.relativePosition,\r\n          fixtures: w.fixtures?.map((f: any) => transformFixtureData(f)),\r\n        };\r\n      });\r\n    }\r\n\r\n    function transformFixtureData(data: any) {\r\n      const f = data;\r\n\r\n      function normalizeCadText(value: any) {\r\n        if (typeof value !== \"string\") return value;\r\n        return value.replace(/^\\\\[^;]+;/, \"\").trim();\r\n      }\r\n\r\n      return {\r\n        fixtureName: normalizeCadText(f?.header?.label ?? \"\"),\r\n        relativePosition: f?.relativePosition,\r\n        fixtureType: f?.associatedElementType,\r\n        header: {\r\n          ...f?.header,\r\n          label: normalizeCadText(f?.header?.label ?? \"\"),\r\n        },\r\n        footer: f?.footer,\r\n        fixtureWidth: f?.fixtureWidth,\r\n        fixtureLength: f?.fixtureLength,\r\n        fixtureNumber: f?.fixtureNumber,\r\n        templateGroupName: f?.templateGroupName ?? f?.header?.label,\r\n        fixtureCategory: f?.fixtureCategory,\r\n        fixtureCapacity: f?.fixtureCapacity,\r\n        associatedElementNumber: data?.wallNumber,\r\n        associatedElementFixtureNumber: data.fixtureNumber,\r\n        associatedElementType:\r\n          f?.associatedElementType === \"wall\" ? \"wall\" : undefined,\r\n        productBrandName: Array.isArray(f?.productBrandName)\r\n          ? f?.productBrandName?.map(normalizeCadText)\r\n          : normalizeCadText(f?.productBrandName),\r\n        shelfConfig: f?.shelfConfig ?? [],\r\n        fixtureHeight: {\r\n          value: 0,\r\n          unit: \"mm\",\r\n        },\r\n        fixtureStaticLength: {\r\n          value: 1524,\r\n          unit: \"mm\",\r\n        },\r\n        fixtureStaticWidth: {\r\n          value: 1220,\r\n          unit: \"mm\",\r\n        },\r\n        productResolutionLevel: \"L3\",\r\n        isBodyEnabled: true,\r\n        isMerchEdited: false,\r\n        isVmEdited: false,\r\n      };\r\n    }\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    if (!this.floorData) return;\r\n\r\n    this.canvas.clear();\r\n    this.reorderFixture(this.floorData);\r\n    await this.drawLayoutElements();\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  reorderFixture(floorData: any) {\r\n    // Walls\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\") {\r\n        let wallAssociatedIndex = 1;\r\n\r\n        element.fixtures.forEach((fixture: any) => {\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = element.elementNumber;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            // fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    // Center floor fixtures\r\n    let floorAssociatedIndex = 1;\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        // fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9; // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    const extraTopPaddingPx = 24;\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] =\r\n      canvasH / 2 -\r\n      (bounds.top + bounds.height / 2) * targetZoom +\r\n      extraTopPaddingPx; // center Y + extra top padding\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        let width = this.toPixels(element.distance, element.unit);\r\n        if (width < height) width = this.wallThickness + 1;\r\n        await this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n    }\r\n\r\n    // For cad layouts only.\r\n    this.layoutBounds = this.getFullLayoutBounds();\r\n\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n      if (element.elementType !== \"wall\") continue;\r\n\r\n      const fixtureGroups: fabric.Group[] = [];\r\n\r\n      for (let j = 0; j < element?.fixtures?.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        const fixtureHeight = this.toPixels(\r\n          fixture.fixtureStaticLength.value,\r\n          fixture.fixtureStaticLength.unit,\r\n        );\r\n        const fixtureWidth = this.toPixels(\r\n          fixture.fixtureStaticWidth.value,\r\n          fixture.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        let x = this.toPixels(\r\n          fixture.relativePosition.x,\r\n          fixture.relativePosition.unit,\r\n        );\r\n        let y = this.toPixels(\r\n          fixture.relativePosition.y,\r\n          fixture.relativePosition.unit,\r\n        );\r\n\r\n        // override the fixture position for initial cad layouts.\r\n        if (this.floorData?.cadLayout && this.isAutoAlignMode) {\r\n          const baseX = this.toPixels(\r\n            element.relativePosition.x,\r\n            element.relativePosition.unit,\r\n          );\r\n\r\n          const baseY = this.toPixels(\r\n            element.relativePosition.y,\r\n            element.relativePosition.unit,\r\n          );\r\n          const startBuffer = 40;\r\n          const spacing = 136;\r\n          const offset = startBuffer + spacing * j;\r\n\r\n          const angleRad = fabric.util.degreesToRadians(element.angle);\r\n\r\n          const dirX = Math.cos(angleRad);\r\n          const dirY = Math.sin(angleRad);\r\n\r\n          const normalOffset = this.wallThickness;\r\n\r\n          const normX = Math.cos(angleRad + Math.PI / 2) * normalOffset;\r\n          const normY = Math.sin(angleRad + Math.PI / 2) * normalOffset;\r\n\r\n          x = baseX + dirX * offset + normX;\r\n          y = baseY + dirY * offset + normY;\r\n        }\r\n\r\n        const fixtureObj = await this.drawFixture(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          fixtureHeight,\r\n          fixtureWidth,\r\n          fixture,\r\n        );\r\n        fixtureGroups.push(fixtureObj as fabric.Group);\r\n      }\r\n\r\n      for (let j = 0; j < element?.otherElements?.length; j++) {\r\n        const otherElement = element.otherElements[j];\r\n        const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n        const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n        const a = otherElement.relativePosition.angle;\r\n        const h = this.toPixels(\r\n          otherElement.fixtureStaticLength.value,\r\n          otherElement.fixtureStaticLength.unit,\r\n        );\r\n        const w = this.toPixels(\r\n          otherElement.fixtureStaticWidth.value,\r\n          otherElement.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        this.drawOtherElementsWithLabel(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          a,\r\n          w,\r\n          h,\r\n          otherElement,\r\n        );\r\n      }\r\n    }\r\n\r\n    //If CAD layout\r\n    if (\r\n      this.floorData?.cadLayout &&\r\n      this.floorData?.centerFixture?.length &&\r\n      this.isAutoAlignMode\r\n    ) {\r\n      const fixtures = this.floorData.centerFixture;\r\n\r\n      const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n      const occupiedRects = this.getOccupiedRects();\r\n\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtures[0].fixtureStaticWidth.value,\r\n        fixtures[0].fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtures[0].fixtureStaticLength.value,\r\n        fixtures[0].fixtureStaticLength.unit,\r\n      );\r\n\r\n      const total = fixtures.length;\r\n\r\n      const maxRows = 2;\r\n      const rows = Math.min(maxRows, total);\r\n      const columns = Math.ceil(total / rows);\r\n\r\n      const gridWidth = columns * fixtureWidthPx;\r\n      const gridHeight = rows * fixtureHeightPx;\r\n\r\n      const bounds = this.getFullLayoutBounds();\r\n      const centerX = bounds.left + bounds.width / 2;\r\n      const centerY = bounds.top + bounds.height / 2;\r\n\r\n      const isInsidePolygon = (x: number, y: number) => {\r\n        return (\r\n          this.isPointInsidePolygon({ x, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x: x + gridWidth, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x, y: y + gridHeight }, layoutPolygon) &&\r\n          this.isPointInsidePolygon(\r\n            { x: x + gridWidth, y: y + gridHeight },\r\n            layoutPolygon,\r\n          )\r\n        );\r\n      };\r\n\r\n      const overlapsOccupied = (x: number, y: number) => {\r\n        const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n        for (const occ of occupiedRects) {\r\n          if (this.rectsOverlap(gridRect, occ)) {\r\n            return true;\r\n          }\r\n        }\r\n\r\n        return false;\r\n      };\r\n\r\n      const findBestPosition = (mode: \"strict\" | \"relaxed\") => {\r\n        let bestScore = -Infinity;\r\n        let bestPos: { x: number; y: number } | null = null;\r\n\r\n        const step = fixtureWidthPx / 2;\r\n\r\n        for (\r\n          let y = bounds.top;\r\n          y <= bounds.top + bounds.height - gridHeight;\r\n          y += step\r\n        ) {\r\n          for (\r\n            let x = bounds.left;\r\n            x <= bounds.left + bounds.width - gridWidth;\r\n            x += step\r\n          ) {\r\n            if (!isInsidePolygon(x, y)) continue;\r\n\r\n            if (mode === \"strict\" && overlapsOccupied(x, y)) continue;\r\n\r\n            const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n            const emptyMargin = this.computeEmptyMargin(\r\n              gridRect,\r\n              bounds,\r\n              occupiedRects,\r\n            );\r\n\r\n            const dx = centerX - (x + gridWidth / 2);\r\n            const dy = centerY - (y + gridHeight / 2);\r\n            const centerPenalty = dx * dx + dy * dy;\r\n\r\n            const score = emptyMargin * 1000 - centerPenalty * 0.001;\r\n\r\n            if (score > bestScore) {\r\n              bestScore = score;\r\n              bestPos = { x, y };\r\n            }\r\n          }\r\n        }\r\n\r\n        return bestPos;\r\n      };\r\n\r\n      let bestPos = findBestPosition(\"strict\");\r\n\r\n      if (!bestPos) {\r\n        console.warn(\"Strict placement failed. Trying relaxed mode...\");\r\n        bestPos = findBestPosition(\"relaxed\");\r\n      }\r\n\r\n      if (!bestPos) {\r\n        console.warn(\"Relaxed placement failed. Falling back to center.\");\r\n        bestPos = {\r\n          x: centerX - gridWidth / 2,\r\n          y: centerY - gridHeight / 2,\r\n        };\r\n      }\r\n\r\n      fixtures.forEach((fixture: any, index: number) => {\r\n        // N-shape traversal: col fills left-to-right, each column fills bottom row first then top row\r\n        const col = Math.floor(index / 2);\r\n        const row = index % 2 === 0 ? 1 : 0;\r\n\r\n        const x = bestPos!.x + col * fixtureWidthPx;\r\n        const y = bestPos!.y + row * fixtureHeightPx;\r\n\r\n        fixture.relativePosition.x = this.fromPixels(x, \"ft\");\r\n        fixture.relativePosition.y = this.fromPixels(y, \"ft\");\r\n      });\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawOtherElementsWithLabel(this.canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private buildLayoutPolygonFromWalls() {\r\n    return this.floorData.layoutPolygon\r\n      .filter((w: any) => w.elementType === \"wall\")\r\n      .map((w: any) => ({\r\n        x: this.toPixels(w.relativePosition.x, \"ft\"),\r\n        y: this.toPixels(w.relativePosition.y, \"ft\"),\r\n      }));\r\n  }\r\n\r\n  private isPointInsidePolygon(\r\n    point: { x: number; y: number },\r\n    polygon: { x: number; y: number }[],\r\n  ): boolean {\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x,\r\n        yi = polygon[i].y;\r\n      const xj = polygon[j].x,\r\n        yj = polygon[j].y;\r\n\r\n      const intersect =\r\n        yi > point.y !== yj > point.y &&\r\n        point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n  private getOccupiedRects(): { x: number; y: number; w: number; h: number }[] {\r\n    return this.canvas.getObjects().map((obj) => {\r\n      const r = obj.getBoundingRect();\r\n      return {\r\n        x: r.left,\r\n        y: r.top,\r\n        w: r.width,\r\n        h: r.height,\r\n      };\r\n    });\r\n  }\r\n\r\n  private rectsOverlap(\r\n    a: { x: number; y: number; w: number; h: number },\r\n    b: { x: number; y: number; w: number; h: number },\r\n  ): boolean {\r\n    return !(\r\n      a.x + a.w <= b.x ||\r\n      a.x >= b.x + b.w ||\r\n      a.y + a.h <= b.y ||\r\n      a.y >= b.y + b.h\r\n    );\r\n  }\r\n\r\n  private computeEmptyMargin(\r\n    gridRect: { x: number; y: number; w: number; h: number },\r\n    bounds: { left: number; top: number; width: number; height: number },\r\n    occupiedRects: { x: number; y: number; w: number; h: number }[],\r\n  ): number {\r\n    let minMargin = Infinity;\r\n\r\n    // distance to layout bounds\r\n    minMargin = Math.min(\r\n      minMargin,\r\n      gridRect.x - bounds.left,\r\n      bounds.left + bounds.width - (gridRect.x + gridRect.w),\r\n      gridRect.y - bounds.top,\r\n      bounds.top + bounds.height - (gridRect.y + gridRect.h),\r\n    );\r\n\r\n    // distance to other objects\r\n    for (const occ of occupiedRects) {\r\n      // horizontal gap\r\n      if (occ.y < gridRect.y + gridRect.h && occ.y + occ.h > gridRect.y) {\r\n        if (occ.x + occ.w <= gridRect.x) {\r\n          minMargin = Math.min(minMargin, gridRect.x - (occ.x + occ.w));\r\n        } else if (occ.x >= gridRect.x + gridRect.w) {\r\n          minMargin = Math.min(minMargin, occ.x - (gridRect.x + gridRect.w));\r\n        }\r\n      }\r\n\r\n      // vertical gap\r\n      if (occ.x < gridRect.x + gridRect.w && occ.x + occ.w > gridRect.x) {\r\n        if (occ.y + occ.h <= gridRect.y) {\r\n          minMargin = Math.min(minMargin, gridRect.y - (occ.y + occ.h));\r\n        } else if (occ.y >= gridRect.y + gridRect.h) {\r\n          minMargin = Math.min(minMargin, occ.y - (gridRect.y + gridRect.h));\r\n        }\r\n      }\r\n    }\r\n\r\n    return minMargin;\r\n  }\r\n\r\n  private getWallByNumber(elementNumber: number): any | undefined {\r\n    return this.floorData?.layoutPolygon?.find(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === elementNumber,\r\n    );\r\n  }\r\n\r\n  drawFixtureRowLabel(text: string, x: number, y: number) {\r\n    const label = new fabric.Text(text, {\r\n      left: x,\r\n      top: y,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#333\",\r\n      originX: \"left\",\r\n      originY: \"bottom\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(label);\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    let modCenterX = x;\r\n    let modCenterY = y;\r\n    let angle = elementData.angle;\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: modCenterX,\r\n      top: modCenterY,\r\n      hasControls: true,\r\n      lockScalingX: isVertical,\r\n      lockScalingY: !isVertical,\r\n      selectable: false,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n           L ${topX + topWidth - radius} ${topY} \r\n           Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n           L ${topX + topWidth} ${topY + innerBoxHeight} \r\n           L ${topX} ${topY + innerBoxHeight} \r\n           L ${topX} ${topY + radius} \r\n           Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topFieldText =\r\n      (fixtureData.fixtureType === \"wall\"\r\n        ? `Wall-${fixtureData.associatedElementNumber} - `\r\n        : \"Floor - \") +\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`;\r\n\r\n    const topText = new fabric.Textbox(topFieldText, {\r\n      left: topX + topWidth / 2,\r\n      top: topY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n       L ${topX + topWidth} ${secondBoxY} \r\n       L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n       Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n         topX + topWidth - radius\r\n       } ${secondBoxY + innerBoxHeight} \r\n       L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n       Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n         secondBoxY + innerBoxHeight - radius\r\n       } \r\n       L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n           L ${midX + midWidth - radius} ${firstBoxY} \r\n           Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n             firstBoxY + radius\r\n           } \r\n           L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n           L ${midX} ${firstBoxY + boxHeight} \r\n           L ${midX} ${firstBoxY + radius} \r\n           Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        if (\r\n          startIndex > fixtureData?.shelfConfig.length ||\r\n          endIndex > fixtureData?.shelfConfig.length\r\n        )\r\n          continue;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n           L ${midX + midWidth} ${lastBoxY} \r\n           L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n           Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n             midX + midWidth - radius\r\n           } ${lastBoxY + boxHeight} \r\n           L ${midX + radius} ${lastBoxY + boxHeight} \r\n           Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n             lastBoxY + boxHeight - radius\r\n           } \r\n           L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${\r\n        getFixtureProductCapacity(fixtureData?.shelfConfig)\r\n      } . VM - ${fixtureData?.vmConfig?.length ?? 0}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    let angle = fixtureData?.relativePosition?.angle;\r\n\r\n    if (this.floorData.cadLayout && fixtureData.fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(\r\n        fixtureData.associatedElementNumber,\r\n      );\r\n      const angleDeg = wallData?.angle || 0;\r\n      angle = angleDeg;\r\n    }\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: false,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        angle: angle,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      console.log(\"@@ ~ target:\", target);\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n    const angle = elementData.angle;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"cad-render\">\r\n    <lib-tool-page-header\r\n      title=\"Check CAD Output\"\r\n      description=\"Paste CAD data and preview the parsed layout.\"\r\n    ></lib-tool-page-header>\r\n    <div class=\"app-layout\">\r\n\r\n        <!-- LEFT TOOLBAR -->\r\n        <div class=\"sidebar\">\r\n            <div class=\"p-3\">\r\n                <textarea class=\"form-control\" [(ngModel)]=\"rawCADDetails\" placeholder=\"Paste the CAD extracted data\"\r\n                    rows=\"25\"></textarea>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- RIGHT CANVAS PANEL -->\r\n        <div class=\"canvas-wrapper\" #canvasContainer>\r\n\r\n            <!-- Toolbar -->\r\n            <div class=\"toolbar\">\r\n\r\n                <div class=\"form-check form-switch\">\r\n                    <input [checked]=\"isAutoAlignMode\" [(ngModel)]=\"isAutoAlignMode\"\r\n                        [ngModelOptions]=\"{ standalone: true }\" style=\"cursor: pointer\" class=\"form-check-input\"\r\n                        type=\"checkbox\" [disabled]=\"!floorData\" />\r\n                    <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n                        Auto Position Fixtures\r\n                    </label>\r\n                </div>\r\n\r\n                <!-- <div class=\"d-flex gap-2\">\r\n                    <input type=\"checkbox\" class=\"form-check\" name=\"includeBG\" id=\"includeBG\"\r\n                        [(ngModel)]=\"includeFixtures\" [ngModelOptions]=\"{ standalone: true }\" [disabled]=\"!floorData\">\r\n                    <label for=\"includeBG\">Include Fixtures</label>\r\n                </div> -->\r\n\r\n                <button class=\"btn btn-primary\" type=\"button\" (click)=\"onClickRenderPlano()\">\r\n                    Render\r\n                </button>\r\n\r\n                <div class=\"ms-auto d-flex align-items-center gap-3\">\r\n                    <h4 class=\"m-0\"> {{wallCount}} - Walls |</h4>\r\n                    <h4 class=\"m-0\"> {{wFixturesCount}} - Wall Fixtures |</h4>\r\n                    <h4 class=\"m-0\"> {{cFixturesCount}} - Center Fixtures</h4>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Canvas -->\r\n            <div class=\"canvas-area\">\r\n                <canvas #canvas></canvas>\r\n            </div>\r\n\r\n        </div>\r\n\r\n\r\n    </div>\r\n</section>","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\n@Component({\r\n  selector: 'lib-allow-edit',\r\n  templateUrl: './allow-edit.component.html',\r\n  styleUrl: './allow-edit.component.scss',\r\n})\r\nexport class AllowEditComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  taskType: 'fixture' | 'zoneVerification' = 'fixture';\r\n  storeOptions: StoreOption[] = [];\r\n  initialStores: StoreOption[] = [];\r\n  selectedStores: StoreOption[] = [];\r\n  fixtureWise: boolean = false;\r\n  fixtureNumbers: number[] = [];\r\n  selectedFixtures: Set<number> = new Set();\r\n  isLoading: boolean = false;\r\n  isSubmitting: boolean = false;\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged()\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\r\n      if (res?.data) {\r\n        this.storeOptions = res.data;\r\n      }\r\n    });\r\n  }\r\n\r\n  onTaskTypeChange() {\r\n    this.selectedStores = [];\r\n    this.initialStores = [];\r\n    this.fixtureWise = false;\r\n    this.fixtureNumbers = [];\r\n    this.selectedFixtures.clear();\r\n    this.message = '';\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    this.selectedStores = stores;\r\n    this.fixtureNumbers = [];\r\n    this.selectedFixtures.clear();\r\n    if (this.selectedStores.length !== 1) {\r\n      this.fixtureWise = false;\r\n    } else if (this.fixtureWise) {\r\n      this.loadFixtures();\r\n    }\r\n  }\r\n\r\n  onFixtureWiseChange() {\r\n    this.fixtureNumbers = [];\r\n    this.selectedFixtures.clear();\r\n    if (this.fixtureWise && this.selectedStores.length === 1) {\r\n      this.loadFixtures();\r\n    }\r\n  }\r\n\r\n  loadFixtures() {\r\n    if (this.selectedStores.length !== 1) return;\r\n    let storeName = this.selectedStores[0].label;\r\n    this.isLoading = true;\r\n    this.sbs.getFixtureNumbersByStore(storeName, this.clientId, this.taskType).subscribe({\r\n      next: (res: any) => {\r\n        this.fixtureNumbers = res?.data || [];\r\n        this.isLoading = false;\r\n      },\r\n      error: () => {\r\n        this.fixtureNumbers = [];\r\n        this.isLoading = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  toggleFixture(num: number) {\r\n    if (this.selectedFixtures.has(num)) {\r\n      this.selectedFixtures.delete(num);\r\n    } else {\r\n      this.selectedFixtures.add(num);\r\n    }\r\n  }\r\n\r\n  isFixtureSelected(num: number): boolean {\r\n    return this.selectedFixtures.has(num);\r\n  }\r\n\r\n  selectAllFixtures() {\r\n    if (this.selectedFixtures.size === this.fixtureNumbers.length) {\r\n      this.selectedFixtures.clear();\r\n    } else {\r\n      this.fixtureNumbers.forEach((n) => this.selectedFixtures.add(n));\r\n    }\r\n  }\r\n\r\n  get isAllSelected(): boolean {\r\n    return this.fixtureNumbers.length > 0 && this.selectedFixtures.size === this.fixtureNumbers.length;\r\n  }\r\n\r\n  onSubmit() {\r\n    if (this.selectedStores.length === 0) {\r\n      this.showMessage('Please select at least one store.', 'error');\r\n      return;\r\n    }\r\n    if (this.fixtureWise && this.selectedFixtures.size === 0) {\r\n      this.showMessage('Please select at least one fixture.', 'error');\r\n      return;\r\n    }\r\n\r\n    let payload: {\r\n      storeNames: string[];\r\n      clientId: string;\r\n      taskType: 'fixture' | 'zoneVerification';\r\n      fixtureNumbers?: number[];\r\n    } = {\r\n      storeNames: this.selectedStores.map((s) => s.label),\r\n      clientId: this.clientId,\r\n      taskType: this.taskType,\r\n    };\r\n    if (this.fixtureWise) {\r\n      payload.fixtureNumbers = Array.from(this.selectedFixtures);\r\n    }\r\n\r\n    this.isSubmitting = true;\r\n    this.sbs.allowEditWithoutRemovingResponse(payload).subscribe({\r\n      next: (res: any) => {\r\n        let count = res?.data?.modifiedCount || 0;\r\n        this.showMessage(`Updated ${count} record(s) successfully.`, 'success');\r\n        this.isSubmitting = false;\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(err?.error?.message || 'Something went wrong.', 'error');\r\n        this.isSubmitting = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"allow-edit p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Allow Edit\"\r\n    description=\"Re-enable editing on a published task without losing existing responses.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n\r\n    <!-- Task Type -->\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label d-block\">Task Type</label>\r\n      <div class=\"d-flex gap-3\">\r\n        <div class=\"form-check\">\r\n          <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeFixture\"\r\n            name=\"taskType\" value=\"fixture\"\r\n            [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n          <label class=\"form-check-label\" for=\"taskTypeFixture\">Fixture Verification</label>\r\n        </div>\r\n        <div class=\"form-check\">\r\n          <input type=\"radio\" class=\"form-check-input\" id=\"taskTypeZone\"\r\n            name=\"taskType\" value=\"zoneVerification\"\r\n            [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n          <label class=\"form-check-label\" for=\"taskTypeZone\">Zone Verification</label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Store Select -->\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label\">Store</label>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        (selectedChange)=\"onStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <!-- Fixture Wise Checkbox -->\r\n    <div class=\"mb-3 d-flex align-items-center gap-2\">\r\n      <input type=\"checkbox\" class=\"form-check-input\" id=\"fixtureWise\"\r\n        [(ngModel)]=\"fixtureWise\" (change)=\"onFixtureWiseChange()\"\r\n        [disabled]=\"selectedStores.length !== 1\">\r\n      <label class=\"form-check-label\" for=\"fixtureWise\">Fixture Wise</label>\r\n      @if (selectedStores.length > 1) {\r\n        <span class=\"text-muted small\">(Select only one store to enable)</span>\r\n      }\r\n    </div>\r\n\r\n    <!-- Fixture Selection -->\r\n    @if (fixtureWise && selectedStores.length === 1) {\r\n      <div class=\"mb-3\">\r\n        @if (isLoading) {\r\n          <div class=\"text-muted\">Loading fixtures...</div>\r\n        } @else if (fixtureNumbers.length === 0) {\r\n          <div class=\"text-muted\">No fixtures found for this store.</div>\r\n        } @else {\r\n          <label class=\"form-label\">Select Fixtures</label>\r\n          <div class=\"fixture-list\">\r\n            <div class=\"fixture-item\" (click)=\"selectAllFixtures()\">\r\n              <input type=\"checkbox\" class=\"form-check-input\"\r\n                [checked]=\"isAllSelected\" readonly>\r\n              <span class=\"fw-semibold\">Select All</span>\r\n            </div>\r\n            @for (num of fixtureNumbers; track num) {\r\n              <div class=\"fixture-item\" (click)=\"toggleFixture(num)\">\r\n                <input type=\"checkbox\" class=\"form-check-input\"\r\n                  [checked]=\"isFixtureSelected(num)\" readonly>\r\n                <span>Fixture {{ num }}</span>\r\n              </div>\r\n            }\r\n          </div>\r\n        }\r\n      </div>\r\n    }\r\n\r\n    <!-- Submit -->\r\n    <button class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n      [disabled]=\"isSubmitting || selectedStores.length === 0 || (fixtureWise && (selectedStores.length > 1 || selectedFixtures.size === 0))\">\r\n      {{ isSubmitting ? 'Unlocking...' : 'Unlock Edit' }}\r\n    </button>\r\n\r\n    <!-- Message -->\r\n    @if (message) {\r\n      <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\n@Component({\r\n  selector: 'lib-delete-task',\r\n  templateUrl: './delete-task.component.html',\r\n  styleUrl: './delete-task.component.scss',\r\n})\r\nexport class DeleteTaskComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  taskType: 'fixture' | 'zoneVerification' = 'fixture';\r\n  storeOptions: StoreOption[] = [];\r\n  initialStores: StoreOption[] = [];\r\n  selectedStores: StoreOption[] = [];\r\n  isSubmitting: boolean = false;\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged()\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\r\n      if (res?.data) {\r\n        this.storeOptions = res.data;\r\n      }\r\n    });\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    this.selectedStores = stores;\r\n  }\r\n\r\n  onTaskTypeChange() {\r\n    this.message = '';\r\n  }\r\n\r\n  onSubmit() {\r\n    if (this.selectedStores.length === 0) {\r\n      this.showMessage('Please select at least one store.', 'error');\r\n      return;\r\n    }\r\n\r\n    let payload = {\r\n      storeNames: this.selectedStores.map((s) => s.label),\r\n      taskType: this.taskType,\r\n    };\r\n\r\n    this.isSubmitting = true;\r\n    this.sbs.deleteTaskForStores(payload).subscribe({\r\n      next: (res: any) => {\r\n        let count = res?.data?.deletedCount || 0;\r\n        this.showMessage(`Deleted ${count} task(s) successfully.`, 'success');\r\n        this.isSubmitting = false;\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(err?.error?.message || 'Something went wrong.', 'error');\r\n        this.isSubmitting = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"delete-task p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Delete Task\"\r\n    description=\"Remove a task and its responses.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\" style=\"max-width: 600px;\">\r\n\r\n    <!-- Task Type -->\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label d-block\">Task Type</label>\r\n      <div class=\"d-flex gap-3\">\r\n        <div class=\"form-check\">\r\n          <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeFixture\"\r\n            name=\"deleteTaskType\" value=\"fixture\"\r\n            [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n          <label class=\"form-check-label\" for=\"deleteTaskTypeFixture\">Fixture Verification</label>\r\n        </div>\r\n        <div class=\"form-check\">\r\n          <input type=\"radio\" class=\"form-check-input\" id=\"deleteTaskTypeZone\"\r\n            name=\"deleteTaskType\" value=\"zoneVerification\"\r\n            [(ngModel)]=\"taskType\" (change)=\"onTaskTypeChange()\">\r\n          <label class=\"form-check-label\" for=\"deleteTaskTypeZone\">Zone Verification</label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Store Select -->\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label\">Store</label>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        (selectedChange)=\"onStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <!-- Submit -->\r\n    <button class=\"btn btn-danger\" (click)=\"onSubmit()\"\r\n      [disabled]=\"isSubmitting || selectedStores.length === 0\">\r\n      {{ isSubmitting ? 'Deleting...' : 'Delete Task' }}\r\n    </button>\r\n\r\n    <!-- Message -->\r\n    @if (message) {\r\n      <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  filter,\n  Subject,\n  takeUntil,\n} from \"rxjs\";\nimport { GlobalStateService } from \"tango-app-ui-global\";\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\nimport { DeleteConfirmationComponent } from \"../../popups/delete-confirmation/delete-confirmation.component\";\n\ninterface StoreOption {\n  storeId: string;\n  storeName: string;\n}\n\ninterface FloorOption {\n  _id: string;\n  floorNumber: number;\n  floorName: string;\n  displayName: string;\n}\n\ninterface FloorImpact {\n  floor: {\n    _id: string;\n    floorNumber: number;\n    floorName: string;\n    status: string;\n    isPlanoApproved?: boolean;\n    verificationStatus?: boolean;\n    merchRolloutStatus?: boolean;\n    vmRolloutStatus?: boolean;\n    planoProgress?: number;\n  };\n  planogram: {\n    _id: string;\n    storeName: string;\n    storeId: string;\n    status?: string;\n    layoutName?: string;\n  };\n  totalFloors: number;\n  isLastFloor: boolean;\n  willDeletePlanogram: boolean;\n  cascade: {\n    storefixtures: number;\n    fixtureshelves: number;\n    planotaskcompliances: number;\n    processedtasks: number;\n    planoglobalcomments: number;\n    planorevisions: number;\n  };\n}\n\n@Component({\n  selector: \"lib-delete-floor\",\n  templateUrl: \"./delete-floor.component.html\",\n  styleUrl: \"./delete-floor.component.scss\",\n})\nexport class DeleteFloorComponent implements OnInit, OnDestroy {\n  clientId: string;\n\n  storeOptions: StoreOption[] = [];\n  selectedStoreId: string | null = null;\n  selectedStoreName: string | null = null;\n  isLoadingStores: boolean = false;\n\n  floors: FloorOption[] = [];\n  selectedFloorId: string | null = null;\n  isLoadingFloors: boolean = false;\n\n  impact: FloorImpact | null = null;\n  isLoadingImpact: boolean = false;\n\n  isSubmitting: boolean = false;\n  message: string = \"\";\n  messageType: \"success\" | \"error\" = \"success\";\n\n  private readonly destroy$ = new Subject<void>();\n\n  constructor(\n    private sbs: StoreBuilderService,\n    private gs: GlobalStateService,\n    private modalService: NgbModal,\n  ) {}\n\n  ngOnInit(): void {\n    this.gs.dataRangeValue\n      .pipe(\n        takeUntil(this.destroy$),\n        debounceTime(200),\n        filter((data) => !!data),\n        distinctUntilChanged(),\n      )\n      .subscribe((data: any) => {\n        if (data?.client) {\n          this.clientId = data.client;\n        } else {\n          const headerData = JSON.parse(\n            localStorage.getItem(\"header-filters\") as string,\n          );\n          this.clientId = headerData?.client;\n        }\n        this.resetAll();\n        this.loadStores();\n      });\n  }\n\n  loadStores() {\n    if (!this.clientId) return;\n    this.isLoadingStores = true;\n    this.sbs.getAllStores(this.clientId).subscribe({\n      next: (res: any) => {\n        this.storeOptions = (res?.data || []).map((s: any) => ({\n          storeId: s.storeId,\n          storeName: s.storeName,\n        }));\n        this.isLoadingStores = false;\n      },\n      error: (err: any) => {\n        this.showMessage(\n          err?.error?.message || \"Failed to load stores.\",\n          \"error\",\n        );\n        this.isLoadingStores = false;\n      },\n    });\n  }\n\n  onStoreSelected(storeId: string | null) {\n    this.selectedStoreId = storeId;\n    const store = this.storeOptions.find((s) => s.storeId === storeId);\n    this.selectedStoreName = store?.storeName ?? null;\n    this.resetFloorState();\n    if (this.selectedStoreId) {\n      this.loadFloors();\n    }\n  }\n\n  private resetFloorState() {\n    this.floors = [];\n    this.selectedFloorId = null;\n    this.impact = null;\n  }\n\n  private resetAll() {\n    this.storeOptions = [];\n    this.selectedStoreId = null;\n    this.selectedStoreName = null;\n    this.resetFloorState();\n  }\n\n  loadFloors() {\n    if (!this.selectedStoreId) return;\n    this.isLoadingFloors = true;\n    this.sbs.getStoreFloorsList(this.selectedStoreId).subscribe({\n      next: (res: any) => {\n        const raw: any[] = res?.data || [];\n        this.floors = raw\n          .map((f) => ({\n            _id: f._id,\n            floorNumber: f.floorNumber,\n            floorName: f.floorName,\n            displayName: `Floor ${f.floorNumber} — ${f.floorName}`,\n          }))\n          .sort((a, b) => a.floorNumber - b.floorNumber);\n        this.isLoadingFloors = false;\n      },\n      error: (err: any) => {\n        this.showMessage(\n          err?.error?.message || \"Failed to load floors.\",\n          \"error\",\n        );\n        this.isLoadingFloors = false;\n      },\n    });\n  }\n\n  onFloorSelected(floorId: string | null) {\n    this.selectedFloorId = floorId;\n    this.impact = null;\n    if (floorId) {\n      this.loadImpact(floorId);\n    }\n  }\n\n  private loadImpact(floorId: string) {\n    this.isLoadingImpact = true;\n    this.sbs.getFloorDeleteImpact({ floorId }).subscribe({\n      next: (res: any) => {\n        this.impact = res?.data || null;\n        this.isLoadingImpact = false;\n      },\n      error: (err: any) => {\n        this.showMessage(\n          err?.error?.message || \"Failed to load floor details.\",\n          \"error\",\n        );\n        this.isLoadingImpact = false;\n      },\n    });\n  }\n\n  formatStatus(status: string | undefined | null): string {\n    if (!status) return \"--\";\n    const map: Record<string, string> = {\n      draft: \"Draft\",\n      allocationPending: \"Allocation Pending\",\n      completed: \"Completed\",\n    };\n    return map[status] || status;\n  }\n\n  formatBool(v: boolean | undefined): string {\n    return v ? \"Yes\" : \"No\";\n  }\n\n  get totalCascadeRows(): number {\n    if (!this.impact) return 0;\n    const c = this.impact.cascade;\n    return (\n      c.storefixtures +\n      c.fixtureshelves +\n      c.planotaskcompliances +\n      c.processedtasks +\n      c.planoglobalcomments +\n      c.planorevisions\n    );\n  }\n\n  get canSubmit(): boolean {\n    return (\n      !!this.selectedFloorId &&\n      !!this.impact &&\n      !this.isSubmitting &&\n      !this.isLoadingImpact\n    );\n  }\n\n  async onSubmit() {\n    if (!this.canSubmit || !this.impact) return;\n\n    const isLast = this.impact.isLastFloor;\n    const floor = this.impact.floor;\n    const plano = this.impact.planogram;\n    const c = this.impact.cascade;\n\n    const summary: string[] = [];\n    summary.push(`Store: ${plano.storeName ?? \"--\"}`);\n    summary.push(\n      `Floor ${floor.floorNumber} — ${floor.floorName} [${this.formatStatus(floor.status)}]`,\n    );\n    summary.push(\n      `Cascade: ${c.storefixtures} fixtures, ${c.fixtureshelves} shelves, ${c.planotaskcompliances} compliance, ${c.processedtasks} task(s), ${c.planoglobalcomments} comment(s), ${c.planorevisions} revision(s)`,\n    );\n    if (isLast) {\n      summary.push(\n        \"This is the ONLY floor in this planogram. Deleting it will REMOVE THE ENTIRE PLANOGRAM. The store entry itself will not be touched.\",\n      );\n    }\n    summary.push(\"This action cannot be undone.\");\n\n    const firstTitle = isLast\n      ? \"Delete planogram entirely?\"\n      : \"Delete this floor?\";\n    const confirmed = await this.confirm(firstTitle, summary.join(\"\\n\"));\n    if (!confirmed) return;\n\n    if (isLast) {\n      const doubleConfirmed = await this.confirm(\n        \"Final confirmation\",\n        `You are about to permanently delete the planogram for \"${plano.storeName}\". This wipes the floor and the planogram metadata. The store is preserved. Proceed?`,\n      );\n      if (!doubleConfirmed) return;\n    }\n\n    this.isSubmitting = true;\n    this.sbs\n      .deleteFloorCascade({\n        floorId: this.selectedFloorId!,\n        confirmLastFloor: isLast,\n      })\n      .subscribe({\n        next: (res: any) => {\n          const data = res?.data || {};\n          const parts: string[] = [];\n          if (data.planogramDeleted) {\n            parts.push(\"Planogram removed entirely\");\n          } else {\n            parts.push(\"Floor deleted\");\n            if (data.renumberedFloors?.length) {\n              parts.push(\n                `${data.renumberedFloors.length} sibling floor(s) renumbered`,\n              );\n            }\n          }\n          const dc = data.deletedCounts || {};\n          parts.push(\n            `Cleaned: ${dc.storefixtures || 0} fixtures, ${dc.fixtureshelves || 0} shelves, ${dc.planotaskcompliances || 0} compliance, ${dc.processedtasks || 0} task(s), ${dc.planoglobalcomments || 0} comment(s), ${dc.planorevisions || 0} revision(s)`,\n          );\n          this.showMessage(parts.join(\". \"), \"success\");\n          this.isSubmitting = false;\n          this.resetFloorState();\n          if (this.selectedStoreId) {\n            this.loadFloors();\n          }\n        },\n        error: (err: any) => {\n          this.showMessage(\n            err?.error?.message || \"Failed to delete floor.\",\n            \"error\",\n          );\n          this.isSubmitting = false;\n        },\n      });\n  }\n\n  private async confirm(title: string, description: string): Promise<boolean> {\n    try {\n      const ref = this.modalService.open(DeleteConfirmationComponent, {\n        centered: true,\n      });\n      ref.componentInstance.title = title;\n      ref.componentInstance.description = description;\n      ref.componentInstance.confirmLabel = \"Delete\";\n      ref.componentInstance.confirmClass = \"btn-danger\";\n      const result = await ref.result;\n      return result === \"ok\";\n    } catch {\n      return false;\n    }\n  }\n\n  showMessage(msg: string, type: \"success\" | \"error\") {\n    this.message = msg;\n    this.messageType = type;\n    setTimeout(() => (this.message = \"\"), 6000);\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n}\n","<section class=\"delete-floor p-3\">\n  <lib-tool-page-header\n    title=\"Delete Floor\"\n    description=\"Removes a floor and every row that references it — fixtures, shelves, task compliance, processed tasks, comments, and revisions. If this is the only floor, the entire planogram is removed. The store entry is never touched.\"\n  ></lib-tool-page-header>\n  <div class=\"card p-4\" style=\"max-width: 720px;\">\n\n    <!-- Store -->\n    <div class=\"mb-3\">\n      <lib-reactive-select\n        label=\"Store\"\n        [idField]=\"'storeId'\"\n        [nameField]=\"'storeName'\"\n        [data]=\"storeOptions\"\n        [search]=\"true\"\n        [ngModel]=\"selectedStoreId\"\n        (ngModelChange)=\"onStoreSelected($event)\">\n      </lib-reactive-select>\n      <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n    </div>\n\n    <!-- Floor -->\n    <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n      <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n        <div class=\"text-muted small\">Loading floors...</div>\n      </ng-container>\n      <ng-template #floorPicker>\n        <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n          <lib-reactive-select\n            label=\"Floor\"\n            [idField]=\"'_id'\"\n            [nameField]=\"'displayName'\"\n            [data]=\"floors\"\n            [search]=\"true\"\n            [ngModel]=\"selectedFloorId\"\n            (ngModelChange)=\"onFloorSelected($event)\">\n          </lib-reactive-select>\n        </ng-container>\n        <ng-template #noFloors>\n          <div class=\"text-muted small\">No floors found for this store.</div>\n        </ng-template>\n      </ng-template>\n    </div>\n\n    <!-- Status + cascade preview -->\n    <ng-container *ngIf=\"selectedFloorId\">\n      <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\n        <div class=\"text-muted small\">Loading floor details...</div>\n      </ng-container>\n      <ng-template #impactBlock>\n        <ng-container *ngIf=\"impact\">\n          <div class=\"mb-3 p-3 rounded info-block\">\n            <div class=\"row gx-3 gy-2 small\">\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">Floor status</span>\n                <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\n              </div>\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">Planogram status</span>\n                <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\n              </div>\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">Plano approved</span>\n                <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\n              </div>\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">Verification done</span>\n                <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\n              </div>\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">Merch rollout done</span>\n                <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\n              </div>\n              <div class=\"col-6\">\n                <span class=\"text-muted d-block\">VM rollout done</span>\n                <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\n              </div>\n              <div class=\"col-12\">\n                <span class=\"text-muted d-block\">Total floors in this planogram</span>\n                <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"mb-3 p-3 rounded cascade-block\">\n            <div class=\"fw-semibold mb-2\">Will delete</div>\n            <ul class=\"small mb-0 ps-3\">\n              <li>1 floor (storelayouts)</li>\n              <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\n              <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\n              <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\n              <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\n              <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\n              <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\n            </ul>\n            <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\n          </div>\n\n          <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\n            <strong>This is the only floor in this planogram.</strong>\n            Deleting it will also remove the planogram entry — the plano will\n            disappear completely. The store record itself will NOT be deleted.\n          </div>\n        </ng-container>\n      </ng-template>\n    </ng-container>\n\n    <!-- Submit -->\n    <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n      {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\n    </button>\n\n    <div class=\"mt-3 alert\" *ngIf=\"message\"\n      [class.alert-success]=\"messageType === 'success'\"\n      [class.alert-danger]=\"messageType === 'error'\"\n      style=\"white-space: pre-line;\">\n      {{ message }}\n    </div>\n  </div>\n</section>\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\ninterface FixtureDetail {\r\n  _id: string;\r\n  fixtureNumber: number;\r\n  fixtureName: string;\r\n  fixtureCategory: string;\r\n  fixtureWidthValue: number;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-update-fixture-type',\r\n  templateUrl: './update-fixture-type.component.html',\r\n  styleUrl: './update-fixture-type.component.scss',\r\n})\r\nexport class UpdateFixtureTypeComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  storeOptions: StoreOption[] = [];\r\n  filteredStores: StoreOption[] = [];\r\n  selectedStoreName: string = '';\r\n  storeSearch: string = '';\r\n  showStoreDropdown: boolean = false;\r\n  fixtures: FixtureDetail[] = [];\r\n  selectedFixture: FixtureDetail | null = null;\r\n  fixtureName: string = '';\r\n  fixtureCategory: string = '';\r\n  fixtureWidthValue: number = 0;\r\n  isLoadingFixtures: boolean = false;\r\n  isSubmitting: boolean = false;\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged()\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\r\n      if (res?.data) {\r\n        this.storeOptions = res.data;\r\n      }\r\n    });\r\n  }\r\n\r\n  onStoreSearch() {\r\n    let search = this.storeSearch.toLowerCase().trim();\r\n    if (search.length > 0) {\r\n      this.filteredStores = this.storeOptions.filter(\r\n        (s) => s.label.toLowerCase().includes(search)\r\n      );\r\n      this.showStoreDropdown = true;\r\n    } else {\r\n      this.filteredStores = [];\r\n      this.showStoreDropdown = false;\r\n    }\r\n  }\r\n\r\n  selectStore(store: StoreOption) {\r\n    this.selectedStoreName = store.label;\r\n    this.storeSearch = store.label;\r\n    this.showStoreDropdown = false;\r\n    this.filteredStores = [];\r\n    this.fixtures = [];\r\n    this.selectedFixture = null;\r\n    this.loadFixtures();\r\n  }\r\n\r\n  clearStore() {\r\n    this.selectedStoreName = '';\r\n    this.storeSearch = '';\r\n    this.fixtures = [];\r\n    this.selectedFixture = null;\r\n  }\r\n\r\n  loadFixtures() {\r\n    if (!this.selectedStoreName) return;\r\n    this.isLoadingFixtures = true;\r\n    this.sbs.getFixtureDetailsByStore(this.selectedStoreName, this.clientId).subscribe({\r\n      next: (res: any) => {\r\n        this.fixtures = res?.data || [];\r\n        this.isLoadingFixtures = false;\r\n      },\r\n      error: () => {\r\n        this.fixtures = [];\r\n        this.isLoadingFixtures = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  onFixtureSelect(fixture: FixtureDetail) {\r\n    this.selectedFixture = fixture;\r\n    this.fixtureName = fixture.fixtureName;\r\n    this.fixtureCategory = fixture.fixtureCategory;\r\n    this.fixtureWidthValue = fixture.fixtureWidthValue;\r\n    this.message = '';\r\n  }\r\n\r\n  onSubmit() {\r\n    if (!this.selectedFixture) return;\r\n\r\n    let payload = {\r\n      fixtureId: this.selectedFixture._id,\r\n      fixtureName: this.fixtureName,\r\n      fixtureCategory: this.fixtureCategory,\r\n      fixtureWidthValue: this.fixtureWidthValue,\r\n    };\r\n\r\n    this.isSubmitting = true;\r\n    this.sbs.updateFixtureType(payload).subscribe({\r\n      next: () => {\r\n        this.selectedFixture!.fixtureName = this.fixtureName;\r\n        this.selectedFixture!.fixtureCategory = this.fixtureCategory;\r\n        this.selectedFixture!.fixtureWidthValue = this.fixtureWidthValue;\r\n        this.showMessage('Fixture updated successfully.', 'success');\r\n        this.isSubmitting = false;\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(err?.error?.message || 'Something went wrong.', 'error');\r\n        this.isSubmitting = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"update-fixture-type p-3\">\r\n  <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n    <h5 class=\"mb-3\">Update Fixture Type</h5>\r\n\r\n    <!-- Store Select -->\r\n    <div class=\"mb-3 position-relative\">\r\n      <label class=\"form-label\">Store</label>\r\n      <input type=\"text\" class=\"form-control\" [(ngModel)]=\"storeSearch\"\r\n        (input)=\"onStoreSearch()\" (focus)=\"onStoreSearch()\"\r\n        placeholder=\"Search store name...\" autocomplete=\"off\">\r\n      @if (selectedStoreName) {\r\n        <div class=\"selected-store mt-1\">\r\n          <span class=\"badge bg-light text-dark border px-2 py-1\">\r\n            {{ selectedStoreName }}\r\n            <span class=\"ms-1\" style=\"cursor:pointer;\" (click)=\"clearStore()\">&times;</span>\r\n          </span>\r\n        </div>\r\n      }\r\n      @if (showStoreDropdown && filteredStores.length > 0) {\r\n        <div class=\"store-dropdown\">\r\n          @for (store of filteredStores; track store.id) {\r\n            <div class=\"store-dropdown-item\" (click)=\"selectStore(store)\">\r\n              {{ store.label }}\r\n            </div>\r\n          }\r\n        </div>\r\n      }\r\n    </div>\r\n\r\n    <!-- Fixture List -->\r\n    @if (selectedStoreName) {\r\n      <div class=\"mb-3\">\r\n        @if (isLoadingFixtures) {\r\n          <div class=\"text-muted\">Loading fixtures...</div>\r\n        } @else if (fixtures.length === 0) {\r\n          <div class=\"text-muted\">No fixtures found for this store.</div>\r\n        } @else {\r\n          <label class=\"form-label\">Select Fixture</label>\r\n          <div class=\"fixture-list\">\r\n            @for (f of fixtures; track f._id) {\r\n              <div class=\"fixture-item\" [class.active]=\"selectedFixture?._id === f._id\"\r\n                (click)=\"onFixtureSelect(f)\">\r\n                <span class=\"fw-semibold\">Fixture {{ f.fixtureNumber }}</span>\r\n                <span class=\"text-muted small ms-2\">{{ f.fixtureCategory || '—' }}</span>\r\n              </div>\r\n            }\r\n          </div>\r\n        }\r\n      </div>\r\n    }\r\n\r\n    <!-- Edit Fields -->\r\n    @if (selectedFixture) {\r\n      <div class=\"edit-section mb-3\">\r\n        <h6 class=\"mb-3\">Fixture {{ selectedFixture.fixtureNumber }}</h6>\r\n\r\n        <div class=\"mb-3\">\r\n          <label class=\"form-label\">Fixture Name</label>\r\n          <input type=\"text\" class=\"form-control\" [(ngModel)]=\"fixtureName\"\r\n            placeholder=\"Enter fixture name\">\r\n        </div>\r\n\r\n        <div class=\"mb-3\">\r\n          <label class=\"form-label\">Fixture Category</label>\r\n          <input type=\"text\" class=\"form-control\" [(ngModel)]=\"fixtureCategory\"\r\n            placeholder=\"Enter fixture category\">\r\n        </div>\r\n\r\n        <div class=\"mb-3\">\r\n          <label class=\"form-label\">Fixture Width (value)</label>\r\n          <input type=\"number\" class=\"form-control\" [(ngModel)]=\"fixtureWidthValue\"\r\n            placeholder=\"Enter width value\">\r\n        </div>\r\n\r\n        <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"isSubmitting\">\r\n          {{ isSubmitting ? 'Updating...' : 'Update' }}\r\n        </button>\r\n      </div>\r\n    }\r\n\r\n    <!-- Message -->\r\n    @if (message) {\r\n      <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\ninterface FieldDef {\r\n  key: string;\r\n  label: string;\r\n  type: 'string' | 'number' | 'arrayOfStrings';\r\n  filterable: boolean;\r\n  output: boolean;\r\n}\r\n\r\ninterface OperatorDef {\r\n  key: string;\r\n  label: string;\r\n}\r\n\r\ninterface FilterRow {\r\n  field: string;\r\n  operator: string;\r\n  value: string;\r\n}\r\n\r\ninterface ColumnSelection {\r\n  key: string;\r\n  label: string;\r\n  selected: boolean;\r\n}\r\n\r\ninterface QueryResult {\r\n  columns: string[];\r\n  rows: Record<string, any>[];\r\n  totalRows: number;\r\n}\r\n\r\ninterface VmPlacementResult {\r\n  columns: string[];\r\n  rows: Record<string, any>[];\r\n  totalRows: number;\r\n  matchedVmCount: number;\r\n}\r\n\r\nconst OUTPUT_COLUMN_ORDER: { key: string; label: string }[] = [\r\n  { key: 'storeName', label: 'Store Name' },\r\n  { key: 'fixtureCategory', label: 'Fixture Category' },\r\n  { key: 'fixtureWidth', label: 'Fixture Width' },\r\n  { key: 'fixtureNumber', label: 'Fixture Number' },\r\n  { key: 'fixtureName', label: 'Fixture Name' },\r\n  { key: 'fixtureType', label: 'Fixture Type' },\r\n  { key: 'headerLabel', label: 'Header Label' },\r\n  { key: 'templateGroupName', label: 'Template Group Name' },\r\n  { key: 'wallNumber', label: 'Wall Number' },\r\n  { key: 'wallFixtureNumber', label: 'Wall Fixture Number' },\r\n  { key: 'vmNames', label: 'VM Names' },\r\n  { key: 'vmCount', label: 'VM Count' },\r\n  { key: 'productPids', label: 'Product PIDs' },\r\n  { key: 'position', label: 'Position' },\r\n  { key: 'positionLabel', label: 'Position Label' },\r\n  { key: 'standardCapacity', label: 'Standard Capacity' },\r\n];\r\n\r\n@Component({\r\n  selector: 'lib-plano-data-export',\r\n  templateUrl: './plano-data-export.component.html',\r\n  styleUrl: './plano-data-export.component.scss',\r\n})\r\nexport class PlanoDataExportComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  storeOptions: StoreOption[] = [];\r\n  initialStores: StoreOption[] = [];\r\n  selectedStores: StoreOption[] = [];\r\n\r\n  fields: FieldDef[] = [];\r\n  operatorsByType: Record<string, OperatorDef[]> = {};\r\n  isLoadingSchema: boolean = false;\r\n\r\n  filters: FilterRow[] = [];\r\n  filterCombinator: 'AND' | 'OR' = 'AND';\r\n\r\n  selectionMode: 'all' | 'firstN' = 'firstN';\r\n  limitPerStore: number = 1;\r\n\r\n  outputColumns: ColumnSelection[] = [];\r\n\r\n  includeNotFoundRows: boolean = true;\r\n\r\n  isRunning: boolean = false;\r\n  result: QueryResult | null = null;\r\n  resultColumns: { key: string; label: string }[] = [];\r\n\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  paginationSizes: number[] = [25, 50, 100, 200];\r\n  pageSize: number = 50;\r\n  currentPage: number = 1;\r\n\r\n  // VM Placement Export by VM Name\r\n  vmSelectedStores: StoreOption[] = [];\r\n  vmInitialStores: StoreOption[] = [];\r\n  vmNameRegex: string = '';\r\n  isVmRunning: boolean = false;\r\n  vmResult: VmPlacementResult | null = null;\r\n  vmResultColumns: string[] = [];\r\n  vmPageSize: number = 50;\r\n  vmCurrentPage: number = 1;\r\n  vmMessage: string = '';\r\n  vmMessageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged(),\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n\r\n    this.loadSchema();\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\r\n      if (res?.data) {\r\n        this.storeOptions = res.data;\r\n      }\r\n    });\r\n  }\r\n\r\n  loadSchema() {\r\n    this.isLoadingSchema = true;\r\n    this.sbs.getPlanoDataSchema().subscribe({\r\n      next: (res: any) => {\r\n        this.fields = res?.data?.fields || [];\r\n        this.operatorsByType = res?.data?.operatorsByType || {};\r\n\r\n        let outputFields = this.fields.filter((f) => f.output);\r\n        let byKey = new Map(outputFields.map((f) => [f.key, f]));\r\n\r\n        let ordered: { key: string; label: string }[] = [];\r\n        for (let entry of OUTPUT_COLUMN_ORDER) {\r\n          let f = byKey.get(entry.key);\r\n          ordered.push({\r\n            key: entry.key,\r\n            label: f?.label || entry.label,\r\n          });\r\n          byKey.delete(entry.key);\r\n        }\r\n        for (let f of byKey.values()) ordered.push({ key: f.key, label: f.label });\r\n\r\n        this.outputColumns = ordered.map((f) => ({\r\n          key: f.key,\r\n          label: f.label,\r\n          selected: this.defaultSelected(f.key),\r\n        }));\r\n        this.isLoadingSchema = false;\r\n      },\r\n      error: () => {\r\n        this.fields = [];\r\n        this.operatorsByType = {};\r\n        this.outputColumns = [];\r\n        this.isLoadingSchema = false;\r\n        this.showMessage('Failed to load query schema.', 'error');\r\n      },\r\n    });\r\n  }\r\n\r\n  private defaultSelected(key: string): boolean {\r\n    return [\r\n      'storeName',\r\n      'fixtureCategory',\r\n      'fixtureWidth',\r\n      'fixtureNumber',\r\n      'fixtureType',\r\n      'headerLabel',\r\n      'wallNumber',\r\n      'wallFixtureNumber',\r\n      'vmNames',\r\n      'positionLabel',\r\n      'standardCapacity',\r\n    ].includes(key);\r\n  }\r\n\r\n  get filterableFields(): FieldDef[] {\r\n    return this.fields.filter((f) => f.filterable);\r\n  }\r\n\r\n  operatorsForField(fieldKey: string): OperatorDef[] {\r\n    let f = this.fields.find((x) => x.key === fieldKey);\r\n    if (!f) return [];\r\n    return this.operatorsByType[f.type] || [];\r\n  }\r\n\r\n  isValueDisabledFor(operator: string): boolean {\r\n    return operator === 'exists' || operator === 'notExists';\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    this.selectedStores = stores;\r\n  }\r\n\r\n  addFilter() {\r\n    let firstField = this.filterableFields[0];\r\n    if (!firstField) return;\r\n    let firstOp = this.operatorsByType[firstField.type]?.[0];\r\n    this.filters.push({\r\n      field: firstField.key,\r\n      operator: firstOp?.key || 'equals',\r\n      value: '',\r\n    });\r\n  }\r\n\r\n  removeFilter(idx: number) {\r\n    this.filters.splice(idx, 1);\r\n  }\r\n\r\n  onFilterFieldChange(idx: number) {\r\n    let row = this.filters[idx];\r\n    let allowed = this.operatorsForField(row.field);\r\n    if (!allowed.find((op) => op.key === row.operator)) {\r\n      row.operator = allowed[0]?.key || 'equals';\r\n    }\r\n  }\r\n\r\n  selectAllColumns() {\r\n    this.outputColumns.forEach((c) => (c.selected = true));\r\n  }\r\n\r\n  clearAllColumns() {\r\n    this.outputColumns.forEach((c) => (c.selected = false));\r\n  }\r\n\r\n  get selectedColumns(): ColumnSelection[] {\r\n    return this.outputColumns.filter((c) => c.selected);\r\n  }\r\n\r\n  get totalRows(): number {\r\n    return this.result?.rows.length || 0;\r\n  }\r\n\r\n  get pagedRows(): Record<string, any>[] {\r\n    if (!this.result) return [];\r\n    let start = (this.currentPage - 1) * this.pageSize;\r\n    return this.result.rows.slice(start, start + this.pageSize);\r\n  }\r\n\r\n  get pageStart(): number {\r\n    if (!this.totalRows) return 0;\r\n    return (this.currentPage - 1) * this.pageSize + 1;\r\n  }\r\n\r\n  get pageEnd(): number {\r\n    return Math.min(this.currentPage * this.pageSize, this.totalRows);\r\n  }\r\n\r\n  onPageChange(page: number) {\r\n    this.currentPage = Number(page) || 1;\r\n  }\r\n\r\n  onPageSizeChange(size: number) {\r\n    this.pageSize = Number(size) || 50;\r\n    this.currentPage = 1;\r\n  }\r\n\r\n  onRun() {\r\n    if (this.selectedStores.length === 0) {\r\n      this.showMessage('Please select at least one store.', 'error');\r\n      return;\r\n    }\r\n    if (this.selectedColumns.length === 0) {\r\n      this.showMessage('Please select at least one output column.', 'error');\r\n      return;\r\n    }\r\n    if (this.selectionMode === 'firstN') {\r\n      let n = Number(this.limitPerStore);\r\n      if (!Number.isFinite(n) || n < 1) {\r\n        this.showMessage(\r\n          'Number of fixtures per store must be a positive integer.',\r\n          'error',\r\n        );\r\n        return;\r\n      }\r\n    }\r\n\r\n    let columnsSnapshot = this.selectedColumns.map((c) => ({\r\n      key: c.key,\r\n      label: c.label,\r\n    }));\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      storeNames: this.selectedStores.map((s) => s.label),\r\n      filters: this.filters\r\n        .filter((f) => f.field && f.operator)\r\n        .map((f) => ({\r\n          field: f.field,\r\n          operator: f.operator,\r\n          value: this.isValueDisabledFor(f.operator) ? '' : f.value,\r\n        })),\r\n      filterCombinator: this.filterCombinator,\r\n      selectionMode: this.selectionMode,\r\n      limitPerStore:\r\n        this.selectionMode === 'firstN' ? Number(this.limitPerStore) : undefined,\r\n      columns: columnsSnapshot,\r\n      includeNotFoundRows: this.includeNotFoundRows,\r\n    };\r\n\r\n    this.isRunning = true;\r\n    this.result = null;\r\n    this.resultColumns = columnsSnapshot;\r\n    this.currentPage = 1;\r\n    this.sbs.runPlanoDataQuery(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.result = res?.data || null;\r\n        this.isRunning = false;\r\n        this.currentPage = 1;\r\n        if (this.result) {\r\n          this.showMessage(`Found ${this.result.totalRows} row(s).`, 'success');\r\n        }\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(\r\n          err?.error?.message || 'Failed to run query.',\r\n          'error',\r\n        );\r\n        this.isRunning = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  onExport() {\r\n    if (!this.result || !this.result.rows.length) {\r\n      this.showMessage('No data to export. Run the query first.', 'error');\r\n      return;\r\n    }\r\n    let cleaned = this.result.rows.map((r) => {\r\n      let copy: Record<string, any> = {};\r\n      for (let col of this.resultColumns) copy[col.label] = r[col.label] ?? '';\r\n      return copy;\r\n    });\r\n    let fileName = `plano_data_export_${Date.now()}`;\r\n    this.sbs.exportAsExcelFile(cleaned, fileName);\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  // ---------- VM Placement Export ----------\r\n\r\n  onVmStoresSelected(stores: StoreOption[]) {\r\n    this.vmSelectedStores = stores;\r\n  }\r\n\r\n  get vmTotalRows(): number {\r\n    return this.vmResult?.rows.length || 0;\r\n  }\r\n\r\n  get vmPagedRows(): Record<string, any>[] {\r\n    if (!this.vmResult) return [];\r\n    let start = (this.vmCurrentPage - 1) * this.vmPageSize;\r\n    return this.vmResult.rows.slice(start, start + this.vmPageSize);\r\n  }\r\n\r\n  get vmPageStart(): number {\r\n    if (!this.vmTotalRows) return 0;\r\n    return (this.vmCurrentPage - 1) * this.vmPageSize + 1;\r\n  }\r\n\r\n  get vmPageEnd(): number {\r\n    return Math.min(this.vmCurrentPage * this.vmPageSize, this.vmTotalRows);\r\n  }\r\n\r\n  onVmPageChange(page: number) {\r\n    this.vmCurrentPage = Number(page) || 1;\r\n  }\r\n\r\n  onVmPageSizeChange(size: number) {\r\n    this.vmPageSize = Number(size) || 50;\r\n    this.vmCurrentPage = 1;\r\n  }\r\n\r\n  onVmRun() {\r\n    if (this.vmSelectedStores.length === 0) {\r\n      this.showVmMessage('Please select at least one store.', 'error');\r\n      return;\r\n    }\r\n    if (!this.vmNameRegex || !this.vmNameRegex.trim()) {\r\n      this.showVmMessage('Please enter a VM name (regex).', 'error');\r\n      return;\r\n    }\r\n\r\n    let payload = {\r\n      clientId: this.clientId,\r\n      storeNames: this.vmSelectedStores.map((s) => s.label),\r\n      vmName: this.vmNameRegex.trim(),\r\n    };\r\n\r\n    this.isVmRunning = true;\r\n    this.vmResult = null;\r\n    this.vmCurrentPage = 1;\r\n    this.sbs.runVmPlacementQuery(payload).subscribe({\r\n      next: (res: any) => {\r\n        this.vmResult = res?.data || null;\r\n        this.vmResultColumns = this.vmResult?.columns || [];\r\n        this.isVmRunning = false;\r\n        this.vmCurrentPage = 1;\r\n        if (this.vmResult) {\r\n          this.showVmMessage(\r\n            `Matched ${this.vmResult.matchedVmCount} VM(s); found ${this.vmResult.totalRows} placement row(s).`,\r\n            'success',\r\n          );\r\n        }\r\n      },\r\n      error: (err: any) => {\r\n        this.showVmMessage(\r\n          err?.error?.message || 'Failed to run VM placement query.',\r\n          'error',\r\n        );\r\n        this.isVmRunning = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  onVmExport() {\r\n    if (!this.vmResult || !this.vmResult.rows.length) {\r\n      this.showVmMessage('No data to export. Run the query first.', 'error');\r\n      return;\r\n    }\r\n    let cleaned = this.vmResult.rows.map((r) => {\r\n      let copy: Record<string, any> = {};\r\n      for (let col of this.vmResultColumns) copy[col] = r[col] ?? '';\r\n      return copy;\r\n    });\r\n    let safeName = (this.vmNameRegex || 'vm')\r\n      .trim()\r\n      .replace(/[^a-z0-9]+/gi, '_')\r\n      .toLowerCase();\r\n    let fileName = `vm_placement_${safeName}_${Date.now()}`;\r\n    this.sbs.exportAsExcelFile(cleaned, fileName);\r\n  }\r\n\r\n  showVmMessage(msg: string, type: 'success' | 'error') {\r\n    this.vmMessage = msg;\r\n    this.vmMessageType = type;\r\n    setTimeout(() => (this.vmMessage = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"plano-data-export p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Data Export\"\r\n    description=\"Build a query against planogram fixtures, preview results, and export as Excel.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4 mb-3\">\r\n\r\n    @if (isLoadingSchema) {\r\n      <div class=\"text-muted small\">Loading query schema...</div>\r\n    }\r\n\r\n    <!-- Stores -->\r\n    <div class=\"block mb-3\">\r\n      <div class=\"block-title\">Stores</div>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        (selectedChange)=\"onStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <!-- Match Criteria -->\r\n    <div class=\"block mb-3\">\r\n      <div class=\"d-flex align-items-center justify-content-between mb-2\">\r\n        <div class=\"block-title mb-0\">Match Criteria</div>\r\n        <div class=\"d-flex align-items-center gap-3\">\r\n          <div class=\"form-check form-check-inline mb-0\">\r\n            <input class=\"form-check-input\" type=\"radio\" id=\"combAnd\"\r\n              name=\"combinator\" value=\"AND\" [(ngModel)]=\"filterCombinator\">\r\n            <label class=\"form-check-label\" for=\"combAnd\">Match all (AND)</label>\r\n          </div>\r\n          <div class=\"form-check form-check-inline mb-0\">\r\n            <input class=\"form-check-input\" type=\"radio\" id=\"combOr\"\r\n              name=\"combinator\" value=\"OR\" [(ngModel)]=\"filterCombinator\">\r\n            <label class=\"form-check-label\" for=\"combOr\">Match any (OR)</label>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      @if (!filters.length) {\r\n        <div class=\"text-muted small mb-2\">\r\n          No criteria — query will return every fixture for the selected stores.\r\n        </div>\r\n      }\r\n\r\n      @for (row of filters; track $index) {\r\n        <div class=\"filter-row d-flex gap-2 mb-2 align-items-center\">\r\n          <select class=\"form-select form-select-sm filter-field\"\r\n            [(ngModel)]=\"row.field\"\r\n            (change)=\"onFilterFieldChange($index)\">\r\n            @for (f of filterableFields; track f.key) {\r\n              <option [value]=\"f.key\">{{ f.label }}</option>\r\n            }\r\n          </select>\r\n\r\n          <select class=\"form-select form-select-sm filter-op\"\r\n            [(ngModel)]=\"row.operator\">\r\n            @for (op of operatorsForField(row.field); track op.key) {\r\n              <option [value]=\"op.key\">{{ op.label }}</option>\r\n            }\r\n          </select>\r\n\r\n          <input\r\n            class=\"form-control form-control-sm filter-value\"\r\n            [placeholder]=\"isValueDisabledFor(row.operator) ? '—' : 'value'\"\r\n            [disabled]=\"isValueDisabledFor(row.operator)\"\r\n            [(ngModel)]=\"row.value\">\r\n\r\n          <button class=\"btn btn-sm btn-outline-danger\" (click)=\"removeFilter($index)\"\r\n            title=\"Remove\">×</button>\r\n        </div>\r\n      }\r\n\r\n      <button class=\"btn btn-sm btn-outline-primary\" (click)=\"addFilter()\"\r\n        [disabled]=\"!filterableFields.length\">\r\n        + Add Criterion\r\n      </button>\r\n    </div>\r\n\r\n    <!-- Selection Mode -->\r\n    <div class=\"block mb-3\">\r\n      <div class=\"block-title\">Fixture Selection</div>\r\n      <div class=\"d-flex flex-wrap align-items-center gap-3\">\r\n        <div class=\"form-check mb-0\">\r\n          <input class=\"form-check-input\" type=\"radio\" id=\"selAll\"\r\n            name=\"selectionMode\" value=\"all\" [(ngModel)]=\"selectionMode\">\r\n          <label class=\"form-check-label\" for=\"selAll\">All matching fixtures</label>\r\n        </div>\r\n        <div class=\"form-check mb-0\">\r\n          <input class=\"form-check-input\" type=\"radio\" id=\"selFirstN\"\r\n            name=\"selectionMode\" value=\"firstN\" [(ngModel)]=\"selectionMode\">\r\n          <label class=\"form-check-label\" for=\"selFirstN\">First</label>\r\n        </div>\r\n        <input\r\n          type=\"number\"\r\n          min=\"1\"\r\n          class=\"form-control form-control-sm count-input\"\r\n          [(ngModel)]=\"limitPerStore\"\r\n          [disabled]=\"selectionMode !== 'firstN'\">\r\n        <span class=\"text-muted small\">matching from entrance, per store</span>\r\n      </div>\r\n\r\n      <div class=\"form-check mt-2\">\r\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"incNotFound\"\r\n          [(ngModel)]=\"includeNotFoundRows\">\r\n        <label class=\"form-check-label\" for=\"incNotFound\">\r\n          Include empty rows for stores with no matches\r\n        </label>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Output Columns -->\r\n    <div class=\"block mb-3\">\r\n      <div class=\"d-flex align-items-center justify-content-between mb-2\">\r\n        <div class=\"block-title mb-0\">Output Columns</div>\r\n        <div class=\"d-flex gap-2\">\r\n          <button class=\"btn btn-sm btn-link p-0\" (click)=\"selectAllColumns()\">\r\n            Select all\r\n          </button>\r\n          <button class=\"btn btn-sm btn-link p-0\" (click)=\"clearAllColumns()\">\r\n            Clear\r\n          </button>\r\n        </div>\r\n      </div>\r\n      <div class=\"column-grid\">\r\n        @for (col of outputColumns; track col.key) {\r\n          <label class=\"column-item\">\r\n            <input type=\"checkbox\" class=\"form-check-input me-2\"\r\n              [(ngModel)]=\"col.selected\">\r\n            {{ col.label }}\r\n          </label>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Action Buttons -->\r\n    <div class=\"d-flex gap-2\">\r\n      <button\r\n        class=\"btn btn-primary\"\r\n        (click)=\"onRun()\"\r\n        [disabled]=\"isRunning || isLoadingSchema || selectedStores.length === 0\">\r\n        {{ isRunning ? 'Running...' : 'Run Query' }}\r\n      </button>\r\n      <button\r\n        class=\"btn btn-success\"\r\n        (click)=\"onExport()\"\r\n        [disabled]=\"!result || !result.rows.length\">\r\n        Export to Excel\r\n      </button>\r\n    </div>\r\n\r\n    @if (message) {\r\n      <div\r\n        class=\"mt-3 alert\"\r\n        [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n\r\n  <!-- VM Placement Export by VM Name -->\r\n  <div class=\"card p-4 mb-3\">\r\n    <h5 class=\"mb-1\">VM Placement Export by VM Name</h5>\r\n    <p class=\"text-muted small mb-3\">\r\n      Find every fixture (in the selected stores) that contains any VM whose\r\n      <code>vmName</code> matches the regex, and export one row per VM placement\r\n      with fixture details and shelf/zone coordinates.\r\n    </p>\r\n\r\n    <div class=\"block mb-3\">\r\n      <div class=\"block-title\">Stores</div>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"vmInitialStores\"\r\n        (selectedChange)=\"onVmStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <div class=\"block mb-3\">\r\n      <div class=\"block-title\">VM Name (regex)</div>\r\n      <input\r\n        class=\"form-control form-control-sm\"\r\n        placeholder=\"e.g. Zodiac, ^Hiphop, Leatherite\"\r\n        [(ngModel)]=\"vmNameRegex\">\r\n      <small class=\"text-muted\">Case-insensitive. Matched against the <code>planoVmDetails.vmName</code> field.</small>\r\n    </div>\r\n\r\n    <div class=\"d-flex gap-2\">\r\n      <button\r\n        class=\"btn btn-primary\"\r\n        (click)=\"onVmRun()\"\r\n        [disabled]=\"isVmRunning || vmSelectedStores.length === 0 || !vmNameRegex.trim()\">\r\n        {{ isVmRunning ? 'Running...' : 'Run Query' }}\r\n      </button>\r\n      <button\r\n        class=\"btn btn-success\"\r\n        (click)=\"onVmExport()\"\r\n        [disabled]=\"!vmResult || !vmResult.rows.length\">\r\n        Export to Excel\r\n      </button>\r\n    </div>\r\n\r\n    @if (vmMessage) {\r\n      <div\r\n        class=\"mt-3 alert\"\r\n        [class.alert-success]=\"vmMessageType === 'success'\"\r\n        [class.alert-danger]=\"vmMessageType === 'error'\">\r\n        {{ vmMessage }}\r\n      </div>\r\n    }\r\n  </div>\r\n\r\n  @if (vmResult) {\r\n    <div class=\"card p-4 mb-3\">\r\n      <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n        <div>\r\n          <h6 class=\"mb-0\">VM Placement Results</h6>\r\n          <small class=\"text-muted\">\r\n            {{ vmTotalRows }} row(s)\r\n            @if (vmTotalRows) {\r\n              · showing {{ vmPageStart }}–{{ vmPageEnd }}\r\n            }\r\n          </small>\r\n        </div>\r\n      </div>\r\n\r\n      @if (!vmResult.rows.length) {\r\n        <div class=\"text-muted\">No VM placements found for the given stores and vmName.</div>\r\n      } @else {\r\n        <div class=\"table-responsive\">\r\n          <table class=\"table table-sm table-bordered\">\r\n            <thead>\r\n              <tr>\r\n                @for (col of vmResultColumns; track col) {\r\n                  <th>{{ col }}</th>\r\n                }\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              @for (row of vmPagedRows; track $index) {\r\n                <tr>\r\n                  @for (col of vmResultColumns; track col) {\r\n                    <td\r\n                      [ngbTooltip]=\"row[col]?.toString() ? row[col] : null\"\r\n                      container=\"body\"\r\n                      placement=\"top\"\r\n                      [openDelay]=\"300\">\r\n                      {{ row[col] }}\r\n                    </td>\r\n                  }\r\n                </tr>\r\n              }\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n\r\n        <lib-pagination\r\n          [itemsPerPage]=\"vmPageSize\"\r\n          [currentPage]=\"vmCurrentPage\"\r\n          [totalItems]=\"vmTotalRows\"\r\n          [pageSize]=\"vmPageSize\"\r\n          [paginationSizes]=\"paginationSizes\"\r\n          [directionLinks]=\"true\"\r\n          (pageChange)=\"onVmPageChange($event)\"\r\n          (pageSizeChange)=\"onVmPageSizeChange($event)\">\r\n        </lib-pagination>\r\n      }\r\n    </div>\r\n  }\r\n\r\n  <!-- Result Preview -->\r\n  @if (result) {\r\n    <div class=\"card p-4\">\r\n      <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n        <div>\r\n          <h6 class=\"mb-0\">Results</h6>\r\n          <small class=\"text-muted\">\r\n            {{ totalRows }} row(s)\r\n            @if (totalRows) {\r\n              · showing {{ pageStart }}–{{ pageEnd }}\r\n            }\r\n          </small>\r\n        </div>\r\n      </div>\r\n\r\n      @if (!result.rows.length) {\r\n        <div class=\"text-muted\">No data found for the given query.</div>\r\n      } @else {\r\n        <div class=\"table-responsive\">\r\n          <table class=\"table table-sm table-bordered\">\r\n            <thead>\r\n              <tr>\r\n                @for (col of resultColumns; track col.key) {\r\n                  <th>{{ col.label }}</th>\r\n                }\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              @for (row of pagedRows; track $index) {\r\n                <tr [class.row-not-found]=\"row['__notFound']\">\r\n                  @for (col of resultColumns; track col.key) {\r\n                    <td\r\n                      [ngbTooltip]=\"row[col.label]?.toString() ? row[col.label] : null\"\r\n                      container=\"body\"\r\n                      placement=\"top\"\r\n                      [openDelay]=\"300\">\r\n                      {{ row[col.label] }}\r\n                    </td>\r\n                  }\r\n                </tr>\r\n              }\r\n            </tbody>\r\n          </table>\r\n        </div>\r\n\r\n        <lib-pagination\r\n          [itemsPerPage]=\"pageSize\"\r\n          [currentPage]=\"currentPage\"\r\n          [totalItems]=\"totalRows\"\r\n          [pageSize]=\"pageSize\"\r\n          [paginationSizes]=\"paginationSizes\"\r\n          [directionLinks]=\"true\"\r\n          (pageChange)=\"onPageChange($event)\"\r\n          (pageSizeChange)=\"onPageSizeChange($event)\">\r\n        </lib-pagination>\r\n      }\r\n    </div>\r\n  }\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport {\r\n  Subject,\r\n  takeUntil,\r\n  debounceTime,\r\n  filter,\r\n  distinctUntilChanged,\r\n  timer,\r\n  of,\r\n  EMPTY,\r\n  switchMap,\r\n  catchError,\r\n} from 'rxjs';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\ntype ExportKind = 'mbq' | 'order';\r\ntype JobStatus = 'running' | 'succeeded' | 'failed';\r\n\r\ninterface ExportJob {\r\n  jobId: string;\r\n  kind: ExportKind;\r\n  status: JobStatus;\r\n  startedAt?: string;\r\n  completedAt?: string | null;\r\n  downloadUrl?: string | null;\r\n  error?: string | null;\r\n  rowCount?: number | null;\r\n  storeCount?: number | null;\r\n}\r\n\r\ninterface BusyInfo {\r\n  jobId: string;\r\n  kind: ExportKind;\r\n  startedAt?: string;\r\n  storeCount?: number;\r\n}\r\n\r\nconst POLL_INITIAL_DELAY_MS = 15000;\r\nconst POLL_INTERVAL_MS = 10000;\r\nconst POLL_TIMEOUT_MS = 30 * 60 * 1000;\r\n\r\n@Component({\r\n  selector: 'lib-store-exports',\r\n  templateUrl: './store-exports.component.html',\r\n  styleUrl: './store-exports.component.scss',\r\n})\r\nexport class StoreExportsComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  storeOptions: StoreOption[] = [];\r\n  initialStores: StoreOption[] = [];\r\n  selectedStores: StoreOption[] = [];\r\n  selectedRevisionStores: StoreOption[] = [];\r\n  revisionName: string = '';\r\n\r\n  starting: ExportKind | null = null;\r\n  activeJob: ExportJob | null = null;\r\n  busyInfo: BusyInfo | null = null;\r\n\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private readonly stopPoll$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    // Store options come from planograms and don't depend on the client/date filter,\r\n    // so load them immediately. Previously loadStores() only ran inside the\r\n    // dataRangeValue subscription, so the list stayed empty (no dropdown, no\r\n    // type-to-match) whenever that observable didn't emit on this page.\r\n    this.loadStores();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged(),\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          const headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs\r\n      .getStoreOrClusterList({ searchMode: 'store' })\r\n      .subscribe((res: any) => {\r\n        if (res?.data) this.storeOptions = res.data;\r\n      });\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    this.selectedStores = stores;\r\n  }\r\n\r\n  onRevisionStoresSelected(stores: StoreOption[]) {\r\n    this.selectedRevisionStores = stores;\r\n  }\r\n\r\n  get totalSelectedStores(): number {\r\n    return this.selectedStores.length + this.selectedRevisionStores.length;\r\n  }\r\n\r\n  onExportMbq() {\r\n    this.runExport('mbq');\r\n  }\r\n\r\n  onExportOrderSheet() {\r\n    this.runExport('order');\r\n  }\r\n\r\n  get isWorking(): boolean {\r\n    return this.starting !== null || this.activeJob?.status === 'running';\r\n  }\r\n\r\n  kindLabel(kind: ExportKind | undefined | null): string {\r\n    return kind === 'mbq' ? 'MBQ' : kind === 'order' ? 'Order Sheet' : 'Export';\r\n  }\r\n\r\n  startedAgo(iso?: string | null): string {\r\n    if (!iso) return '';\r\n    const ms = Date.now() - new Date(iso).getTime();\r\n    if (ms < 60_000) return `${Math.max(0, Math.floor(ms / 1000))}s ago`;\r\n    if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m ago`;\r\n    return `${Math.floor(ms / 3_600_000)}h ago`;\r\n  }\r\n\r\n  dismissResult() {\r\n    this.activeJob = null;\r\n    this.busyInfo = null;\r\n  }\r\n\r\n  private runExport(kind: ExportKind) {\r\n    if (this.isWorking) return;\r\n\r\n    const liveStores = this.selectedStores.map((s) => s.label);\r\n    const revisionStores = this.selectedRevisionStores.map((s) => s.label);\r\n    const revisionName = this.revisionName.trim();\r\n\r\n    if (liveStores.length === 0 && revisionStores.length === 0) {\r\n      this.showMessage('Please select at least one store.', 'error');\r\n      return;\r\n    }\r\n    if (revisionStores.length > 0 && !revisionName) {\r\n      this.showMessage('Enter a revision name for the revision stores.', 'error');\r\n      return;\r\n    }\r\n\r\n    const payload: any = { storeName: liveStores };\r\n    if (revisionStores.length > 0) {\r\n      payload.revisionStores = revisionStores;\r\n      payload.revisionName = revisionName;\r\n    }\r\n    const totalStores = liveStores.length + revisionStores.length;\r\n    this.busyInfo = null;\r\n    this.activeJob = null;\r\n    this.starting = kind;\r\n    this.message = '';\r\n\r\n    const submit$ =\r\n      kind === 'mbq'\r\n        ? this.sbs.exportMBQSheetAsync(payload)\r\n        : this.sbs.exportPlanoOrderSheetAsync(payload);\r\n\r\n    submit$.subscribe({\r\n      next: (resp: any) => {\r\n        this.starting = null;\r\n        const body = resp?.body ?? resp;\r\n        const jobId = body?.data?.jobId;\r\n        if (!jobId) {\r\n          this.showMessage(\r\n            `Failed to start ${this.kindLabel(kind)} export — server did not return a jobId.`,\r\n            'error',\r\n          );\r\n          return;\r\n        }\r\n        this.activeJob = {\r\n          jobId,\r\n          kind,\r\n          status: 'running',\r\n          startedAt: new Date().toISOString(),\r\n          storeCount: totalStores,\r\n        };\r\n        this.startPolling(jobId);\r\n      },\r\n      error: (err: any) => {\r\n        this.starting = null;\r\n        const status = err?.status;\r\n        const respBody = err?.error;\r\n        if (status === 409 && respBody?.data?.jobId) {\r\n          this.busyInfo = {\r\n            jobId: respBody.data.jobId,\r\n            kind: respBody.data.kind,\r\n            startedAt: respBody.data.startedAt,\r\n            storeCount: respBody.data.storeCount,\r\n          };\r\n        } else {\r\n          const errMsg =\r\n            (typeof respBody?.error === 'string' && respBody.error) ||\r\n            respBody?.error?.message ||\r\n            respBody?.message ||\r\n            err?.message ||\r\n            `Failed to start ${this.kindLabel(kind)} export.`;\r\n          this.showMessage(errMsg, 'error');\r\n        }\r\n      },\r\n    });\r\n  }\r\n\r\n  private startPolling(jobId: string) {\r\n    this.stopPoll$.next();\r\n    const pollStarted = Date.now();\r\n    timer(POLL_INITIAL_DELAY_MS, POLL_INTERVAL_MS)\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        takeUntil(this.stopPoll$),\r\n        switchMap(() =>\r\n          this.sbs.getPlanoExportJob(jobId).pipe(\r\n            catchError(() => {\r\n              if (Date.now() - pollStarted > POLL_TIMEOUT_MS) {\r\n                this.handlePollTimeout();\r\n                return EMPTY;\r\n              }\r\n              return of(null);\r\n            }),\r\n          ),\r\n        ),\r\n      )\r\n      .subscribe((res: any) => {\r\n        if (!res) return;\r\n        const job = res?.data;\r\n        if (!job) return;\r\n        this.activeJob = {\r\n          jobId: job.jobId,\r\n          kind: job.kind,\r\n          status: job.status,\r\n          startedAt: job.startedAt,\r\n          completedAt: job.completedAt,\r\n          downloadUrl: job.downloadUrl,\r\n          error: job.error,\r\n          rowCount: job.rowCount,\r\n          storeCount: job.storeCount,\r\n        };\r\n        if (job.status === 'succeeded') {\r\n          this.stopPoll$.next();\r\n          this.showMessage(\r\n            `${this.kindLabel(job.kind)} export is ready.`,\r\n            'success',\r\n          );\r\n          return;\r\n        }\r\n        if (job.status === 'failed') {\r\n          this.stopPoll$.next();\r\n          this.showMessage(\r\n            `${this.kindLabel(job.kind)} export failed: ${\r\n              job.error || 'Unknown error'\r\n            }`,\r\n            'error',\r\n          );\r\n          return;\r\n        }\r\n        if (\r\n          job.status === 'running' &&\r\n          Date.now() - pollStarted > POLL_TIMEOUT_MS\r\n        ) {\r\n          this.handlePollTimeout();\r\n        }\r\n      });\r\n  }\r\n\r\n  private handlePollTimeout() {\r\n    this.stopPoll$.next();\r\n    if (this.activeJob) {\r\n      this.activeJob = {\r\n        ...this.activeJob,\r\n        status: 'failed',\r\n        error: 'Timed out waiting for export to complete.',\r\n      };\r\n    }\r\n    this.showMessage(\r\n      'Timed out waiting for export to complete. The job may still be running on the server — refresh later.',\r\n      'error',\r\n    );\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 6000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.stopPoll$.next();\r\n    this.stopPoll$.complete();\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"store-exports p-3\">\r\n  <lib-tool-page-header\r\n    title=\"MBQ & Order\"\r\n    description=\"Generate per-store fixture exports. Select one or more stores, then choose an export. Large exports run in the background and are saved to S3 — a download link appears here when ready.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\" style=\"max-width: 700px;\">\r\n\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label\">Stores — Manage Planogram (live)</label>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        (selectedChange)=\"onStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label\">Stores — from a Revision</label>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        (selectedChange)=\"onRevisionStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <div class=\"mb-3\">\r\n      <label class=\"form-label\">Revision name</label>\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control\"\r\n        [(ngModel)]=\"revisionName\"\r\n        name=\"revisionName\"\r\n        autocomplete=\"off\"\r\n        placeholder=\"e.g. Q1-2026 Layout\"\r\n        [disabled]=\"isWorking\" />\r\n      <div class=\"form-text\">\r\n        Applies to the “from a Revision” stores above — each is exported from its revision with this exact name (stores without it are skipped). Live stores use current data; both sets are combined into one export.\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"d-flex gap-2 flex-wrap\">\r\n      <button\r\n        class=\"btn btn-primary\"\r\n        (click)=\"onExportMbq()\"\r\n        [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n        @if (starting === 'mbq') {\r\n          Starting MBQ...\r\n        } @else if (activeJob?.status === 'running' && activeJob?.kind === 'mbq') {\r\n          Running MBQ...\r\n        } @else {\r\n          Export MBQ\r\n        }\r\n      </button>\r\n\r\n      <button\r\n        class=\"btn btn-success\"\r\n        (click)=\"onExportOrderSheet()\"\r\n        [disabled]=\"isWorking || totalSelectedStores === 0\">\r\n        @if (starting === 'order') {\r\n          Starting Order Sheet...\r\n        } @else if (activeJob?.status === 'running' && activeJob?.kind === 'order') {\r\n          Running Order Sheet...\r\n        } @else {\r\n          Export Order Sheet\r\n        }\r\n      </button>\r\n    </div>\r\n\r\n    @if (busyInfo) {\r\n      <div class=\"mt-3 alert alert-warning\">\r\n        Another {{ kindLabel(busyInfo.kind) }} export is currently running@if (busyInfo.storeCount) { ({{ busyInfo.storeCount }} store{{ busyInfo.storeCount === 1 ? '' : 's' }}) }@if (busyInfo.startedAt) {, started {{ startedAgo(busyInfo.startedAt) }}}. Please wait until it finishes before starting a new export.\r\n      </div>\r\n    }\r\n\r\n    @if (activeJob) {\r\n      <div\r\n        class=\"mt-3 alert\"\r\n        [class.alert-info]=\"activeJob.status === 'running'\"\r\n        [class.alert-success]=\"activeJob.status === 'succeeded'\"\r\n        [class.alert-danger]=\"activeJob.status === 'failed'\">\r\n        @if (activeJob.status === 'running') {\r\n          <div>\r\n            {{ kindLabel(activeJob.kind) }} export is processing@if (activeJob.storeCount) { ({{ activeJob.storeCount }} store{{ activeJob.storeCount === 1 ? '' : 's' }}) }. Started {{ startedAgo(activeJob.startedAt) }}. Keep this page open — a download link will appear when it finishes.\r\n          </div>\r\n        } @else if (activeJob.status === 'succeeded' && activeJob.downloadUrl) {\r\n          <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n            <span>\r\n              {{ kindLabel(activeJob.kind) }} export ready@if (activeJob.rowCount) { — {{ activeJob.rowCount }} row{{ activeJob.rowCount === 1 ? '' : 's' }} }.\r\n            </span>\r\n            <div class=\"d-flex gap-2\">\r\n              <a [href]=\"activeJob.downloadUrl\" class=\"btn btn-sm btn-success\" target=\"_blank\" rel=\"noopener\">Download</a>\r\n              <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n            </div>\r\n          </div>\r\n        } @else if (activeJob.status === 'failed') {\r\n          <div class=\"d-flex align-items-center justify-content-between gap-2 flex-wrap\">\r\n            <span>{{ kindLabel(activeJob.kind) }} export failed: {{ activeJob.error || 'Unknown error' }}</span>\r\n            <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"dismissResult()\">Dismiss</button>\r\n          </div>\r\n        }\r\n      </div>\r\n    }\r\n\r\n    @if (message) {\r\n      <div\r\n        class=\"mt-3 alert\"\r\n        [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\r\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\r\n\r\ninterface FixtureRow {\r\n  _id: string;\r\n  floorId: string;\r\n  fixtureNumber: number | null;\r\n  associatedElementFixtureNumber: number | null;\r\n  associatedElementNumber: number | null;\r\n  fixtureType: string;\r\n  fixtureName: string;\r\n  headerLabel: string;\r\n  editFixtureNumber: number | null;\r\n  editAssociatedElementFixtureNumber: number | null;\r\n  isSaving: boolean;\r\n}\r\n\r\ninterface FloorGroup {\r\n  floorId: string;\r\n  fixtures: FixtureRow[];\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-modify-fixture-numbers',\r\n  templateUrl: './modify-fixture-numbers.component.html',\r\n  styleUrl: './modify-fixture-numbers.component.scss',\r\n})\r\nexport class ModifyFixtureNumbersComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n  storeOptions: StoreOption[] = [];\r\n  initialStores: StoreOption[] = [];\r\n  selectedStoreName: string = '';\r\n\r\n  floorGroups: FloorGroup[] = [];\r\n  isLoadingFixtures: boolean = false;\r\n  isReordering: boolean = false;\r\n\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged()\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\r\n      if (res?.data) {\r\n        this.storeOptions = res.data;\r\n      }\r\n    });\r\n  }\r\n\r\n  onStoresSelected(stores: StoreOption[]) {\r\n    let store = stores[0];\r\n    let newName = store ? store.label : '';\r\n    if (newName === this.selectedStoreName) return;\r\n\r\n    this.selectedStoreName = newName;\r\n    this.floorGroups = [];\r\n    if (this.selectedStoreName) {\r\n      this.loadFixtures();\r\n    }\r\n  }\r\n\r\n  loadFixtures() {\r\n    if (!this.selectedStoreName) return;\r\n    this.isLoadingFixtures = true;\r\n    this.sbs.getStoreFixturesForReorder(this.selectedStoreName, this.clientId).subscribe({\r\n      next: (res: any) => {\r\n        let fixtures: FixtureRow[] = (res?.data || []).map((f: any) => ({\r\n          ...f,\r\n          editFixtureNumber: f.fixtureNumber,\r\n          editAssociatedElementFixtureNumber: f.associatedElementFixtureNumber,\r\n          isSaving: false,\r\n        }));\r\n        this.floorGroups = this.groupByFloor(fixtures);\r\n        this.isLoadingFixtures = false;\r\n      },\r\n      error: () => {\r\n        this.floorGroups = [];\r\n        this.isLoadingFixtures = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  groupByFloor(fixtures: FixtureRow[]): FloorGroup[] {\r\n    let map = new Map<string, FixtureRow[]>();\r\n    for (let f of fixtures) {\r\n      let key = String(f.floorId);\r\n      if (!map.has(key)) {\r\n        map.set(key, []);\r\n      }\r\n      map.get(key)!.push(f);\r\n    }\r\n    return Array.from(map.entries()).map(([floorId, items]) => ({ floorId, fixtures: items }));\r\n  }\r\n\r\n  onAutoReorder() {\r\n    if (!this.selectedStoreName || this.isReordering) return;\r\n\r\n    this.isReordering = true;\r\n    this.sbs.reorderStoreFixtureNumbers({\r\n      storeName: this.selectedStoreName,\r\n      clientId: this.clientId,\r\n    }).subscribe({\r\n      next: (res: any) => {\r\n        let info = res?.data || {};\r\n        this.showMessage(\r\n          `Reordered ${info.fixturesUpdated ?? 0} fixtures across ${info.floorsProcessed ?? 0} floor(s).`,\r\n          'success'\r\n        );\r\n        this.isReordering = false;\r\n        this.loadFixtures();\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(err?.error?.message || 'Failed to reorder fixtures.', 'error');\r\n        this.isReordering = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  onSaveFixture(fixture: FixtureRow) {\r\n    if (fixture.isSaving) return;\r\n\r\n    let payload: any = { fixtureId: fixture._id };\r\n    let changed = false;\r\n\r\n    if (fixture.editFixtureNumber !== fixture.fixtureNumber) {\r\n      payload.fixtureNumber = fixture.editFixtureNumber;\r\n      changed = true;\r\n    }\r\n    if (fixture.editAssociatedElementFixtureNumber !== fixture.associatedElementFixtureNumber) {\r\n      payload.associatedElementFixtureNumber = fixture.editAssociatedElementFixtureNumber;\r\n      changed = true;\r\n    }\r\n\r\n    if (!changed) {\r\n      this.showMessage('No changes to save.', 'error');\r\n      return;\r\n    }\r\n\r\n    fixture.isSaving = true;\r\n    this.sbs.updateFixtureNumberManual(payload).subscribe({\r\n      next: () => {\r\n        fixture.fixtureNumber = fixture.editFixtureNumber;\r\n        fixture.associatedElementFixtureNumber = fixture.editAssociatedElementFixtureNumber;\r\n        fixture.isSaving = false;\r\n        this.showMessage('Fixture updated successfully.', 'success');\r\n      },\r\n      error: (err: any) => {\r\n        fixture.isSaving = false;\r\n        this.showMessage(err?.error?.message || 'Failed to update fixture.', 'error');\r\n      },\r\n    });\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"modify-fixture-numbers p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Modify Fixture Numbers\"\r\n    description=\"Renumber fixtures in a planogram.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\">\r\n\r\n    <!-- Store Select -->\r\n    <div class=\"mb-3\" style=\"max-width: 600px;\">\r\n      <label class=\"form-label\">Store</label>\r\n      <lib-store-select\r\n        [options]=\"storeOptions\"\r\n        [initialSelected]=\"initialStores\"\r\n        [singleSelect]=\"true\"\r\n        (selectedChange)=\"onStoresSelected($event)\">\r\n      </lib-store-select>\r\n    </div>\r\n\r\n    <!-- Auto Reorder -->\r\n    @if (selectedStoreName) {\r\n      <div class=\"mb-3 d-flex align-items-center gap-3\">\r\n        <button class=\"btn btn-primary\" (click)=\"onAutoReorder()\" [disabled]=\"isReordering\">\r\n          {{ isReordering ? 'Reordering...' : 'Auto Reorder Fixture Numbers' }}\r\n        </button>\r\n        <small class=\"text-muted\">\r\n          Reorders fixtureNumber per floor by associatedElementNumber, then associatedElementFixtureNumber.\r\n        </small>\r\n      </div>\r\n    }\r\n\r\n    <!-- Fixture List -->\r\n    @if (selectedStoreName) {\r\n      @if (isLoadingFixtures) {\r\n        <div class=\"text-muted\">Loading fixtures...</div>\r\n      } @else if (floorGroups.length === 0) {\r\n        <div class=\"text-muted\">No fixtures found for this store.</div>\r\n      } @else {\r\n        @for (group of floorGroups; track group.floorId) {\r\n          <div class=\"floor-group mb-4\">\r\n            <h6 class=\"floor-heading\">Floor: <span class=\"text-muted small\">{{ group.floorId }}</span></h6>\r\n            <div class=\"table-responsive\">\r\n              <table class=\"table table-sm align-middle fixture-table\">\r\n                <thead>\r\n                  <tr>\r\n                    <th>Header Label</th>\r\n                    <th>Fixture Type</th>\r\n                    <th>Element #</th>\r\n                    <th style=\"width: 140px;\">Fixture #</th>\r\n                    <th style=\"width: 180px;\">Element Fixture #</th>\r\n                    <th style=\"width: 110px;\">Action</th>\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  @for (f of group.fixtures; track f._id) {\r\n                    <tr>\r\n                      <td>{{ f.headerLabel || '—' }}</td>\r\n                      <td>{{ f.fixtureType || '—' }}</td>\r\n                      <td>{{ f.associatedElementNumber ?? '—' }}</td>\r\n                      <td>\r\n                        <input type=\"number\" class=\"form-control form-control-sm\"\r\n                          [(ngModel)]=\"f.editFixtureNumber\">\r\n                      </td>\r\n                      <td>\r\n                        <input type=\"number\" class=\"form-control form-control-sm\"\r\n                          [(ngModel)]=\"f.editAssociatedElementFixtureNumber\">\r\n                      </td>\r\n                      <td>\r\n                        <button class=\"btn btn-sm btn-success\" (click)=\"onSaveFixture(f)\"\r\n                          [disabled]=\"f.isSaving\">\r\n                          {{ f.isSaving ? 'Saving...' : 'Save' }}\r\n                        </button>\r\n                      </td>\r\n                    </tr>\r\n                  }\r\n                </tbody>\r\n              </table>\r\n            </div>\r\n          </div>\r\n        }\r\n      }\r\n    }\r\n\r\n    <!-- Message -->\r\n    @if (message) {\r\n      <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { StoreBuilderService } from '../../../services/store-builder.service';\nimport { GlobalStateService } from 'tango-app-ui-global';\nimport { Subject, takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs';\nimport { StoreOption } from '../../collection-update-ai/components/store-select/store-select.component';\n\ninterface ConformanceFixture {\n  _id: string;\n  floorId: string;\n  fixtureNumber: number | null;\n  fixtureCategory: string;\n  width: number | string;\n  headerLabel: string;\n  selected: boolean;\n}\n\ntype Reason =\n  | 'ok'\n  | 'shelf-count-mismatch'\n  | 'zone-mismatch'\n  | 'type-mismatch'\n  | 'no-library'\n  | 'ambiguous'\n  | 'no-shelves';\n\ninterface AuditRow {\n  fixtureId: string;\n  fixtureNumber: number | null;\n  header: string;\n  category: string;\n  width: number | string;\n  curShelfCount: number;\n  libShelfCount: number | null;\n  currentZones: string;\n  libZones: string;\n  currentTypes: string;\n  libTypes: string;\n  reason: Reason;\n  fixable: boolean;\n  selected: boolean;\n}\n\ninterface ApplyResult {\n  fixtureId: string;\n  fixtureNumber: number | null;\n  status: 'fixed' | 'already-conform' | 'skipped' | 'failed';\n  shelvesFrom?: number;\n  shelvesTo?: number;\n  complianceSynced?: number;\n  reason?: string;\n  error?: string;\n}\n\n@Component({\n  selector: 'lib-fixture-conformance',\n  templateUrl: './fixture-conformance.component.html',\n  styleUrl: './fixture-conformance.component.scss',\n})\nexport class FixtureConformanceComponent implements OnInit, OnDestroy {\n  clientId: string = '';\n\n  storeOptions: StoreOption[] = [];\n  selectedStoreName: string = '';\n\n  fixtures: ConformanceFixture[] = [];\n  isLoadingFixtures = false;\n\n  auditRows: AuditRow[] = [];\n  hasAudited = false;\n  isAuditing = false;\n\n  applyResults: ApplyResult[] = [];\n  isApplying = false;\n\n  message = '';\n  messageType: 'success' | 'error' = 'success';\n\n  private readonly destroy$ = new Subject<void>();\n\n  constructor(\n    private sbs: StoreBuilderService,\n    private gs: GlobalStateService,\n  ) {}\n\n  ngOnInit(): void {\n    this.gs.dataRangeValue\n      .pipe(\n        takeUntil(this.destroy$),\n        debounceTime(200),\n        filter((data) => !!data),\n        distinctUntilChanged(),\n      )\n      .subscribe((data: any) => {\n        if (data?.client) {\n          this.clientId = data.client;\n        } else {\n          const headerData = JSON.parse(\n            localStorage.getItem('header-filters') as string,\n          );\n          this.clientId = headerData?.client;\n        }\n        this.loadStores();\n      });\n  }\n\n  loadStores() {\n    this.sbs.getStoreOrClusterList({ searchMode: 'store' }).subscribe((res: any) => {\n      if (res?.data) {\n        this.storeOptions = res.data;\n      }\n    });\n  }\n\n  onStoresSelected(stores: StoreOption[]) {\n    const store = stores[0];\n    const newName = store ? store.label : '';\n    if (newName === this.selectedStoreName) return;\n\n    this.selectedStoreName = newName;\n    this.resetAudit();\n    this.fixtures = [];\n    if (this.selectedStoreName) {\n      this.loadFixtures();\n    }\n  }\n\n  loadFixtures() {\n    if (!this.selectedStoreName) return;\n    this.isLoadingFixtures = true;\n    this.sbs.listFixturesForConformance(this.selectedStoreName, this.clientId).subscribe({\n      next: (res: any) => {\n        this.fixtures = (res?.data || []).map((f: any) => ({\n          ...f,\n          selected: false,\n        }));\n        this.isLoadingFixtures = false;\n      },\n      error: () => {\n        this.fixtures = [];\n        this.isLoadingFixtures = false;\n      },\n    });\n  }\n\n  // ---- Fixture selection ----\n  get selectedFixtureIds(): string[] {\n    return this.fixtures.filter((f) => f.selected).map((f) => f._id);\n  }\n\n  get allFixturesSelected(): boolean {\n    return this.fixtures.length > 0 && this.fixtures.every((f) => f.selected);\n  }\n\n  toggleAllFixtures(checked: boolean) {\n    this.fixtures.forEach((f) => (f.selected = checked));\n  }\n\n  // ---- Audit ----\n  onAudit() {\n    const ids = this.selectedFixtureIds;\n    if (!ids.length || this.isAuditing) return;\n\n    this.isAuditing = true;\n    this.resetAudit();\n    this.sbs.auditFixtureConformance({ clientId: this.clientId, fixtureIds: ids }).subscribe({\n      next: (res: any) => {\n        const rows: AuditRow[] = (res?.data?.rows || []).map((r: any) => ({\n          ...r,\n          // Pre-select the fixable rows so apply targets them by default.\n          selected: !!r.fixable,\n        }));\n        this.auditRows = rows;\n        this.hasAudited = true;\n        this.isAuditing = false;\n      },\n      error: (err: any) => {\n        this.isAuditing = false;\n        this.showMessage(err?.error?.message || 'Failed to audit fixtures.', 'error');\n      },\n    });\n  }\n\n  resetAudit() {\n    this.auditRows = [];\n    this.applyResults = [];\n    this.hasAudited = false;\n  }\n\n  // ---- Audit-row selection (only fixable rows are selectable) ----\n  get selectedAuditIds(): string[] {\n    return this.auditRows.filter((r) => r.fixable && r.selected).map((r) => r.fixtureId);\n  }\n\n  get fixableRows(): AuditRow[] {\n    return this.auditRows.filter((r) => r.fixable);\n  }\n\n  get allFixableSelected(): boolean {\n    const fixable = this.fixableRows;\n    return fixable.length > 0 && fixable.every((r) => r.selected);\n  }\n\n  toggleAllFixable(checked: boolean) {\n    this.auditRows.forEach((r) => {\n      if (r.fixable) r.selected = checked;\n    });\n  }\n\n  // ---- Apply ----\n  onApplyFix() {\n    const ids = this.selectedAuditIds;\n    if (!ids.length || this.isApplying) return;\n\n    this.isApplying = true;\n    this.sbs\n      .applyFixtureConformance({ clientId: this.clientId, fixtureIds: ids, syncCompliance: true })\n      .subscribe({\n        next: (res: any) => {\n          this.applyResults = res?.data?.results || [];\n          const s = res?.data?.summary || {};\n          this.showMessage(\n            `Applied: ${s.fixturesChanged ?? 0} fixture(s) updated, ${s.complianceSynced ?? 0} compliance row(s) synced${s.skipped ? `, ${s.skipped} skipped` : ''}.`,\n            'success',\n          );\n          this.isApplying = false;\n          // Re-audit so the table reflects the new (conformed) state.\n          this.onAudit();\n        },\n        error: (err: any) => {\n          this.isApplying = false;\n          this.showMessage(err?.error?.message || 'Failed to apply fixes.', 'error');\n        },\n      });\n  }\n\n  reasonLabel(reason: Reason): string {\n    switch (reason) {\n      case 'ok': return 'Conforms';\n      case 'shelf-count-mismatch': return 'Shelf count mismatch';\n      case 'zone-mismatch': return 'Zone mismatch';\n      case 'type-mismatch': return 'Shelf type mismatch';\n      case 'no-library': return 'No library match';\n      case 'ambiguous': return 'Ambiguous library';\n      case 'no-shelves': return 'No shelves';\n      default: return reason;\n    }\n  }\n\n  reasonClass(reason: Reason): string {\n    switch (reason) {\n      case 'ok': return 'badge-ok';\n      case 'shelf-count-mismatch':\n      case 'zone-mismatch':\n      case 'type-mismatch': return 'badge-warn';\n      case 'no-library':\n      case 'ambiguous':\n      case 'no-shelves': return 'badge-muted';\n      default: return 'badge-muted';\n    }\n  }\n\n  showMessage(msg: string, type: 'success' | 'error') {\n    this.message = msg;\n    this.messageType = type;\n    setTimeout(() => (this.message = ''), 6000);\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n}\n","<section class=\"fixture-conformance p-3\">\n  <lib-tool-page-header\n    title=\"Sync Fixtures to Library\"\n    description=\"Check a store's fixtures against the library, then sync shelf count and zones for the ones that don't match.\"\n  ></lib-tool-page-header>\n\n  <div class=\"card p-4\">\n    <!-- Store Select -->\n    <div class=\"mb-3\" style=\"max-width: 600px;\">\n      <label class=\"form-label\">Store</label>\n      <lib-store-select\n        [options]=\"storeOptions\"\n        [singleSelect]=\"true\"\n        (selectedChange)=\"onStoresSelected($event)\">\n      </lib-store-select>\n    </div>\n\n    <!-- Fixture List -->\n    @if (selectedStoreName) {\n      @if (isLoadingFixtures) {\n        <div class=\"text-muted\">Loading fixtures...</div>\n      } @else if (fixtures.length === 0) {\n        <div class=\"text-muted\">No fixtures found for this store.</div>\n      } @else {\n        <div class=\"d-flex align-items-center justify-content-between mb-2\">\n          <h6 class=\"section-heading mb-0\">\n            Fixtures\n            <span class=\"text-muted small\">({{ selectedFixtureIds.length }} of {{ fixtures.length }} selected)</span>\n          </h6>\n          <button\n            class=\"btn btn-primary btn-sm\"\n            (click)=\"onAudit()\"\n            [disabled]=\"selectedFixtureIds.length === 0 || isAuditing\">\n            {{ isAuditing ? 'Auditing...' : 'Audit Selected' }}\n          </button>\n        </div>\n\n        <div class=\"table-responsive mb-2\">\n          <table class=\"table table-sm align-middle fc-table\">\n            <thead>\n              <tr>\n                <th style=\"width: 42px;\">\n                  <input type=\"checkbox\"\n                    [checked]=\"allFixturesSelected\"\n                    (change)=\"toggleAllFixtures($any($event.target).checked)\">\n                </th>\n                <th style=\"width: 90px;\">Fixture #</th>\n                <th>Header</th>\n                <th>Fixture ID</th>\n                <th>Category</th>\n                <th style=\"width: 90px;\">Width</th>\n              </tr>\n            </thead>\n            <tbody>\n              @for (f of fixtures; track f._id) {\n                <tr (click)=\"f.selected = !f.selected\" class=\"selectable-row\">\n                  <td (click)=\"$event.stopPropagation()\">\n                    <input type=\"checkbox\" [(ngModel)]=\"f.selected\">\n                  </td>\n                  <td>{{ f.fixtureNumber ?? '—' }}</td>\n                  <td>{{ f.headerLabel || '—' }}</td>\n                  <td class=\"fixture-id\">{{ f._id }}</td>\n                  <td>{{ f.fixtureCategory || '—' }}</td>\n                  <td>{{ f.width || '—' }}</td>\n                </tr>\n              }\n            </tbody>\n          </table>\n        </div>\n      }\n    }\n\n    <!-- Audit Results -->\n    @if (hasAudited) {\n      <hr class=\"my-4\" />\n      <div class=\"d-flex align-items-center justify-content-between mb-2\">\n        <h6 class=\"section-heading mb-0\">\n          Audit Result\n          <span class=\"text-muted small\">({{ fixableRows.length }} fixable, {{ selectedAuditIds.length }} selected)</span>\n        </h6>\n        <button\n          class=\"btn btn-success btn-sm\"\n          (click)=\"onApplyFix()\"\n          [disabled]=\"selectedAuditIds.length === 0 || isApplying\">\n          {{ isApplying ? 'Applying...' : 'Apply Fix' }}\n        </button>\n      </div>\n\n      @if (auditRows.length === 0) {\n        <div class=\"text-muted\">No results.</div>\n      } @else {\n        <div class=\"table-responsive\">\n          <table class=\"table table-sm align-middle fc-table\">\n            <thead>\n              <tr>\n                <th style=\"width: 42px;\">\n                  <input type=\"checkbox\"\n                    [checked]=\"allFixableSelected\"\n                    [disabled]=\"fixableRows.length === 0\"\n                    (change)=\"toggleAllFixable($any($event.target).checked)\">\n                </th>\n                <th style=\"width: 90px;\">Fixture #</th>\n                <th>Header</th>\n                <th>Category</th>\n                <th style=\"width: 70px;\">Width</th>\n                <th style=\"width: 110px;\">Shelves</th>\n                <th>Current Zones</th>\n                <th>Library Zones</th>\n                <th>Current Types</th>\n                <th>Library Types</th>\n                <th style=\"width: 160px;\">Status</th>\n              </tr>\n            </thead>\n            <tbody>\n              @for (r of auditRows; track r.fixtureId) {\n                <tr [class.row-fixable]=\"r.fixable\">\n                  <td>\n                    <input type=\"checkbox\" [(ngModel)]=\"r.selected\" [disabled]=\"!r.fixable\">\n                  </td>\n                  <td>{{ r.fixtureNumber ?? '—' }}</td>\n                  <td>{{ r.header || '—' }}</td>\n                  <td>{{ r.category || '—' }}</td>\n                  <td>{{ r.width || '—' }}</td>\n                  <td>\n                    @if (r.libShelfCount != null) {\n                      <span [class.text-danger]=\"r.curShelfCount !== r.libShelfCount\">\n                        {{ r.curShelfCount }} → {{ r.libShelfCount }}\n                      </span>\n                    } @else {\n                      {{ r.curShelfCount }}\n                    }\n                  </td>\n                  <td class=\"zones\">{{ r.currentZones || '—' }}</td>\n                  <td class=\"zones\">{{ r.libZones || '—' }}</td>\n                  <td class=\"zones\" [class.text-danger]=\"r.reason === 'type-mismatch'\">{{ r.currentTypes || '—' }}</td>\n                  <td class=\"zones\">{{ r.libTypes || '—' }}</td>\n                  <td>\n                    <span class=\"status-badge\" [ngClass]=\"reasonClass(r.reason)\">\n                      {{ reasonLabel(r.reason) }}\n                    </span>\n                  </td>\n                </tr>\n              }\n            </tbody>\n          </table>\n        </div>\n      }\n    }\n\n    <!-- Apply summary per fixture -->\n    @if (applyResults.length > 0) {\n      <hr class=\"my-4\" />\n      <h6 class=\"section-heading mb-2\">Apply Summary</h6>\n      <div class=\"table-responsive\">\n        <table class=\"table table-sm align-middle fc-table\">\n          <thead>\n            <tr>\n              <th style=\"width: 90px;\">Fixture #</th>\n              <th style=\"width: 140px;\">Status</th>\n              <th>Shelves</th>\n              <th>Compliance Synced</th>\n              <th>Note</th>\n            </tr>\n          </thead>\n          <tbody>\n            @for (ar of applyResults; track ar.fixtureId) {\n              <tr>\n                <td>{{ ar.fixtureNumber ?? '—' }}</td>\n                <td>\n                  <span class=\"status-badge\"\n                    [class.badge-ok]=\"ar.status === 'fixed' || ar.status === 'already-conform'\"\n                    [class.badge-warn]=\"ar.status === 'skipped'\"\n                    [class.badge-danger]=\"ar.status === 'failed'\">\n                    {{ ar.status }}\n                  </span>\n                </td>\n                <td>\n                  @if (ar.shelvesFrom != null) {\n                    {{ ar.shelvesFrom }} → {{ ar.shelvesTo }}\n                  } @else { — }\n                </td>\n                <td>{{ ar.complianceSynced ?? 0 }}</td>\n                <td class=\"text-muted small\">{{ ar.error || ar.reason || '' }}</td>\n              </tr>\n            }\n          </tbody>\n        </table>\n      </div>\n    }\n\n    <!-- Message -->\n    @if (message) {\n      <div class=\"mt-3 alert\" [class.alert-success]=\"messageType === 'success'\"\n        [class.alert-danger]=\"messageType === 'error'\">\n        {{ message }}\n      </div>\n    }\n  </div>\n</section>\n","import {\r\n  ChangeDetectionStrategy,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  OnDestroy,\r\n  OnInit,\r\n} from '@angular/core';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport {\r\n  catchError,\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  finalize,\r\n  map,\r\n  Observable,\r\n  of,\r\n  shareReplay,\r\n  Subject,\r\n  switchMap,\r\n  takeUntil,\r\n  tap,\r\n} from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { DeleteConfirmationComponent } from '../../popups/delete-confirmation/delete-confirmation.component';\r\n\r\ninterface StoreItem {\r\n  id: string;\r\n  label: string;\r\n}\r\n\r\ninterface FixtureItem {\r\n  _id: string;\r\n  fixtureNumber: number;\r\n  fixtureName: string;\r\n  fixtureCategory: string;\r\n  fixtureWidthValue: number;\r\n  associatedElementType: string;\r\n  associatedElementFixtureNumber: number | null;\r\n  displayName: string;\r\n}\r\n\r\ninterface TemplateItem {\r\n  _id: string;\r\n  fixtureName: string;\r\n  displayName: string;\r\n  subtext: string;\r\n}\r\n\r\ninterface SwapRow {\r\n  rowId: number;\r\n  fixtureId: string | null;\r\n  templateId: string | null;\r\n  fixture: FixtureItem | null;\r\n  template: TemplateItem | null;\r\n  fixtureOptions: FixtureItem[];\r\n  wallPosition: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-swap-template',\r\n  templateUrl: './swap-template.component.html',\r\n  styleUrl: './swap-template.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SwapTemplateComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  storeOptions: StoreItem[] = [];\r\n  selectedStoreId: string | null = null;\r\n  selectedStore: StoreItem | null = null;\r\n\r\n  fixtures: FixtureItem[] = [];\r\n  templates: TemplateItem[] = [];\r\n  rows: SwapRow[] = [];\r\n\r\n  isLoadingFixtures = false;\r\n  isSubmitting = false;\r\n\r\n  canAddRow = false;\r\n  canSubmit = false;\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n  private readonly storeSelected$ = new Subject<StoreItem>();\r\n  private templatesCache$: Observable<TemplateItem[]> | null = null;\r\n  private cachedTemplatesClientId: string | null = null;\r\n  private rowIdSeq = 0;\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private modalService: NgbModal,\r\n    private toast: ToastService,\r\n    private cdr: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        map((data: any) => {\r\n          if (data?.client) return data.client as string;\r\n          const headerData = JSON.parse(\r\n            localStorage.getItem('header-filters') as string,\r\n          );\r\n          return headerData?.client as string | undefined;\r\n        }),\r\n        filter((id): id is string => !!id),\r\n        distinctUntilChanged(),\r\n      )\r\n      .subscribe((clientId) => {\r\n        this.clientId = clientId;\r\n        this.templatesCache$ = null;\r\n        this.cachedTemplatesClientId = null;\r\n        this.resetSelection();\r\n        this.loadStores();\r\n        this.prefetchTemplates();\r\n      });\r\n\r\n    this.storeSelected$\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        tap((store) => {\r\n          this.selectedStore = store;\r\n          this.selectedStoreId = store.id;\r\n          this.fixtures = [];\r\n          this.rows = [];\r\n          this.recomputeFlags();\r\n          this.isLoadingFixtures = true;\r\n          this.cdr.markForCheck();\r\n        }),\r\n        switchMap((store) =>\r\n          this.sbs\r\n            .getFixtureDetailsByStore(store.label, this.clientId)\r\n            .pipe(\r\n              catchError(() => of({ data: [] })),\r\n              finalize(() => {\r\n                this.isLoadingFixtures = false;\r\n                this.cdr.markForCheck();\r\n              }),\r\n            ),\r\n        ),\r\n      )\r\n      .subscribe((res: any) => {\r\n        const fixtureData: any[] = res?.data || [];\r\n        this.fixtures = fixtureData.map((f) => ({\r\n          _id: f._id,\r\n          fixtureNumber: f.fixtureNumber,\r\n          fixtureName: f.fixtureName || '',\r\n          fixtureCategory: f.fixtureCategory || '',\r\n          fixtureWidthValue: f.fixtureWidthValue ?? 0,\r\n          associatedElementType: f.associatedElementType || '',\r\n          associatedElementFixtureNumber:\r\n            f.associatedElementFixtureNumber ?? null,\r\n          displayName: `Fixture ${f.fixtureNumber}`,\r\n        }));\r\n        this.rows = this.fixtures.length ? [this.makeEmptyRow()] : [];\r\n        this.recomputeFlags();\r\n        this.cdr.markForCheck();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs\r\n      .getStoreOrClusterList({ searchMode: 'store' })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.storeOptions = res?.data || [];\r\n          this.cdr.markForCheck();\r\n        },\r\n        error: () => {\r\n          this.storeOptions = [];\r\n          this.cdr.markForCheck();\r\n        },\r\n      });\r\n  }\r\n\r\n  private prefetchTemplates() {\r\n    this.getCachedTemplates()\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (templates) => {\r\n          this.templates = templates;\r\n          this.cdr.markForCheck();\r\n        },\r\n        error: () => {\r\n          this.templates = [];\r\n          this.cdr.markForCheck();\r\n        },\r\n      });\r\n  }\r\n\r\n  private getCachedTemplates(): Observable<TemplateItem[]> {\r\n    if (\r\n      this.templatesCache$ &&\r\n      this.cachedTemplatesClientId === this.clientId\r\n    ) {\r\n      return this.templatesCache$;\r\n    }\r\n    this.cachedTemplatesClientId = this.clientId;\r\n    this.templatesCache$ = this.sbs\r\n      .getAllTemplates({ clientId: this.clientId })\r\n      .pipe(\r\n        map((res: any) => {\r\n          const tplData: any[] = res?.data || [];\r\n          return tplData.map((t) => ({\r\n            _id: t._id,\r\n            fixtureName: t.fixtureName,\r\n            displayName: t.fixtureName?.includes('-ft')\r\n              ? t.fixtureName\r\n              : `${t.fixtureName} - ${t.fixtureWidth?.value ?? ''} ${\r\n                  t.fixtureWidth?.unit ?? ''\r\n                }`,\r\n            subtext: (t.productBrandName || []).join(', '),\r\n          }));\r\n        }),\r\n        shareReplay({ bufferSize: 1, refCount: false }),\r\n      );\r\n    return this.templatesCache$;\r\n  }\r\n\r\n  onStoreSelected(storeId: string | null) {\r\n    if (!storeId || storeId === this.selectedStore?.id) return;\r\n    const store = this.storeOptions.find((s) => s.id === storeId);\r\n    if (!store) return;\r\n    this.storeSelected$.next(store);\r\n  }\r\n\r\n  private makeEmptyRow(): SwapRow {\r\n    const row: SwapRow = {\r\n      rowId: ++this.rowIdSeq,\r\n      fixtureId: null,\r\n      templateId: null,\r\n      fixture: null,\r\n      template: null,\r\n      fixtureOptions: [],\r\n      wallPosition: '',\r\n    };\r\n    row.fixtureOptions = this.computeFixtureOptions(row);\r\n    return row;\r\n  }\r\n\r\n  private computeFixtureOptions(excludeRow: SwapRow | null): FixtureItem[] {\r\n    const usedIds = new Set(\r\n      this.rows\r\n        .filter((r) => r !== excludeRow && r?.fixture)\r\n        .map((r) => r.fixture!._id),\r\n    );\r\n    return this.fixtures.filter((f) => !usedIds.has(f._id));\r\n  }\r\n\r\n  private refreshAllFixtureOptions() {\r\n    this.rows.forEach((r) => {\r\n      r.fixtureOptions = this.computeFixtureOptions(r);\r\n    });\r\n  }\r\n\r\n  private computeWallPosition(fixture: FixtureItem | null): string {\r\n    if (!fixture) return '';\r\n    if (\r\n      fixture.associatedElementType === 'wall' &&\r\n      fixture.associatedElementFixtureNumber != null\r\n    ) {\r\n      return `Wall ${fixture.associatedElementFixtureNumber}`;\r\n    }\r\n    if (fixture.associatedElementType === 'floor') return 'Floor';\r\n    return fixture.associatedElementType\r\n      ? fixture.associatedElementType.charAt(0).toUpperCase() +\r\n          fixture.associatedElementType.slice(1)\r\n      : '—';\r\n  }\r\n\r\n  private recomputeFlags() {\r\n    const last = this.rows[this.rows.length - 1];\r\n    this.canAddRow =\r\n      this.rows.length > 0 &&\r\n      this.rows.length < this.fixtures.length &&\r\n      !!last?.fixture &&\r\n      !!last?.template;\r\n\r\n    this.canSubmit =\r\n      !!this.selectedStore &&\r\n      this.rows.length > 0 &&\r\n      this.rows.every((r) => !!r.fixture && !!r.template);\r\n  }\r\n\r\n  onRowFixtureChange(row: SwapRow, fixtureId: string | null) {\r\n    row.fixtureId = fixtureId;\r\n    row.fixture = fixtureId\r\n      ? this.fixtures.find((f) => f._id === fixtureId) || null\r\n      : null;\r\n    row.wallPosition = this.computeWallPosition(row.fixture);\r\n    this.refreshAllFixtureOptions();\r\n    this.recomputeFlags();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  onRowTemplateChange(row: SwapRow, templateId: string | null) {\r\n    row.templateId = templateId;\r\n    row.template = templateId\r\n      ? this.templates.find((t) => t._id === templateId) || null\r\n      : null;\r\n    this.recomputeFlags();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  addRow() {\r\n    if (!this.canAddRow) return;\r\n    this.rows.push(this.makeEmptyRow());\r\n    this.recomputeFlags();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  removeRow(index: number) {\r\n    if (this.rows.length === 1) {\r\n      this.rows[0] = this.makeEmptyRow();\r\n    } else {\r\n      this.rows.splice(index, 1);\r\n    }\r\n    this.refreshAllFixtureOptions();\r\n    this.recomputeFlags();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  onCancel() {\r\n    this.resetSelection();\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  private resetSelection() {\r\n    this.selectedStore = null;\r\n    this.selectedStoreId = null;\r\n    this.fixtures = [];\r\n    this.rows = [];\r\n    this.isLoadingFixtures = false;\r\n    this.recomputeFlags();\r\n  }\r\n\r\n  async onSubmit() {\r\n    if (!this.canSubmit || !this.selectedStore || this.isSubmitting) return;\r\n\r\n    const storeName = this.selectedStore.label;\r\n    const payload = {\r\n      data: this.rows.map((r) => ({\r\n        storeName,\r\n        fixtureId: r.fixture!._id,\r\n        fixtureNumber: r.fixture!.fixtureNumber,\r\n        templateId: r.template!._id,\r\n        templateName: r.template!.fixtureName,\r\n      })),\r\n    };\r\n\r\n    const confirmed = await this.confirmSwap(payload.data.length);\r\n    if (!confirmed) return;\r\n\r\n    this.isSubmitting = true;\r\n    this.cdr.markForCheck();\r\n    this.sbs\r\n      .swapFixtureTemplate(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          const successCount = res?.data?.successCount ?? 0;\r\n          const errorCount = res?.data?.errorCount ?? 0;\r\n          const errors = res?.data?.errors || [];\r\n          if (errorCount === 0) {\r\n            this.toast.getSuccessToast(\r\n              `Swapped ${successCount} fixture template(s) successfully.`,\r\n            );\r\n            this.onCancel();\r\n          } else if (successCount > 0) {\r\n            this.toast.getWarningToast(\r\n              `Partial: ${successCount} succeeded, ${errorCount} failed. ${this.summarizeErrors(errors)}`,\r\n            );\r\n          } else {\r\n            this.toast.getErrorToast(\r\n              `All ${errorCount} swap(s) failed. ${this.summarizeErrors(errors)}`,\r\n            );\r\n          }\r\n          this.isSubmitting = false;\r\n          this.cdr.markForCheck();\r\n        },\r\n        error: (err: any) => {\r\n          this.toast.getErrorToast(\r\n            err?.error?.message || 'Failed to swap fixture template.',\r\n          );\r\n          this.isSubmitting = false;\r\n          this.cdr.markForCheck();\r\n        },\r\n      });\r\n  }\r\n\r\n  private summarizeErrors(\r\n    errors: { fixtureNumber: number; error: string }[],\r\n  ): string {\r\n    if (!errors?.length) return '';\r\n    const first = errors\r\n      .slice(0, 2)\r\n      .map((e) => `#${e.fixtureNumber}: ${e.error}`)\r\n      .join('; ');\r\n    return errors.length > 2 ? `${first}; …` : first;\r\n  }\r\n\r\n  private async confirmSwap(count: number): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(DeleteConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      modelRef.componentInstance.title = 'Confirm template swap';\r\n      modelRef.componentInstance.description = `This will overwrite ${count} fixture(s) with the chosen templates and delete their existing shelves. This action cannot be undone. Continue?`;\r\n      const result = await modelRef.result;\r\n      return result === 'ok';\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  trackByRow = (_: number, row: SwapRow) => row.rowId;\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    this.storeSelected$.complete();\r\n  }\r\n}\r\n","<section class=\"swap-template p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Template Swap\"\r\n    description=\"Replace one fixture template with another in a planogram.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\" style=\"max-width: 900px;\">\r\n\r\n    <!-- Store Select -->\r\n    <div class=\"mb-3\">\r\n      <lib-reactive-select\r\n        label=\"Store\"\r\n        [idField]=\"'id'\"\r\n        [nameField]=\"'label'\"\r\n        [data]=\"storeOptions\"\r\n        [search]=\"true\"\r\n        [ngModel]=\"selectedStoreId\"\r\n        (ngModelChange)=\"onStoreSelected($event)\">\r\n      </lib-reactive-select>\r\n    </div>\r\n\r\n    <ng-container *ngIf=\"selectedStore\">\r\n      <ng-container *ngIf=\"isLoadingFixtures; else loaded\">\r\n        <div class=\"text-muted mb-3\">Loading fixtures…</div>\r\n      </ng-container>\r\n\r\n      <ng-template #loaded>\r\n        <ng-container *ngIf=\"fixtures.length; else noFixtures\">\r\n          <!-- Swap Rows -->\r\n          <div class=\"swap-rows\">\r\n            <div *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\"\r\n              class=\"swap-row mb-3\">\r\n              <div class=\"row g-2 align-items-start\">\r\n                <!-- Plano Fixture -->\r\n                <div class=\"col-5\">\r\n                  <lib-reactive-select\r\n                    label=\"Plano Fixture\"\r\n                    [idField]=\"'_id'\"\r\n                    [nameField]=\"'displayName'\"\r\n                    [data]=\"row.fixtureOptions\"\r\n                    [search]=\"true\"\r\n                    [ngModel]=\"row.fixtureId\"\r\n                    (ngModelChange)=\"onRowFixtureChange(row, $event)\">\r\n                  </lib-reactive-select>\r\n\r\n                  <div *ngIf=\"row.fixture\" class=\"fixture-info mt-2\">\r\n                    <div>\r\n                      <span class=\"label\">Name:</span>\r\n                      {{ row.fixture.fixtureName || '—' }}\r\n                    </div>\r\n                    <div>\r\n                      <span class=\"label\">Position:</span>\r\n                      {{ row.wallPosition }}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n                <!-- Arrow -->\r\n                <div class=\"col-1 d-flex justify-content-center\"\r\n                  style=\"padding-top: 30px;\">\r\n                  <span class=\"arrow\">→</span>\r\n                </div>\r\n\r\n                <!-- Swapping Template -->\r\n                <div class=\"col-5\">\r\n                  <lib-reactive-select\r\n                    label=\"Swapping Template\"\r\n                    [idField]=\"'_id'\"\r\n                    [nameField]=\"'displayName'\"\r\n                    [subTextField]=\"'subtext'\"\r\n                    [data]=\"templates\"\r\n                    [search]=\"true\"\r\n                    [ngModel]=\"row.templateId\"\r\n                    (ngModelChange)=\"onRowTemplateChange(row, $event)\">\r\n                  </lib-reactive-select>\r\n                </div>\r\n\r\n                <!-- Remove Row -->\r\n                <div class=\"col-1 d-flex justify-content-end\"\r\n                  style=\"padding-top: 30px;\">\r\n                  <button type=\"button\" class=\"btn btn-link p-0 remove-btn\"\r\n                    (click)=\"removeRow(i)\" title=\"Remove row\"\r\n                    [disabled]=\"rows.length === 1 && !row.fixture && !row.template\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n                      viewBox=\"0 0 10 10\" fill=\"none\">\r\n                      <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\"\r\n                        stroke-width=\"2\" stroke-linecap=\"round\"\r\n                        stroke-linejoin=\"round\" />\r\n                    </svg>\r\n                  </button>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- Add Row -->\r\n          <div class=\"mb-3\">\r\n            <button type=\"button\" class=\"btn btn-link p-0 add-btn\"\r\n              (click)=\"addRow()\" [disabled]=\"!canAddRow\">\r\n              + Add another swap\r\n            </button>\r\n          </div>\r\n\r\n          <!-- Actions -->\r\n          <div class=\"d-flex gap-2 mt-4\">\r\n            <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\"\r\n              [disabled]=\"isSubmitting\">\r\n              Cancel\r\n            </button>\r\n            <button type=\"button\" class=\"btn btn-primary\" (click)=\"onSubmit()\"\r\n              [disabled]=\"!canSubmit || isSubmitting\">\r\n              {{ isSubmitting ? 'Submitting…' : 'Submit' }}\r\n            </button>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <ng-template #noFixtures>\r\n          <div class=\"text-muted\">No fixtures found for this store.</div>\r\n        </ng-template>\r\n      </ng-template>\r\n    </ng-container>\r\n  </div>\r\n</section>\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport {\r\n  debounceTime,\r\n  distinctUntilChanged,\r\n  filter,\r\n  Subject,\r\n  takeUntil,\r\n} from \"rxjs\";\r\nimport { GlobalStateService } from \"tango-app-ui-global\";\r\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\r\nimport { DeleteConfirmationComponent } from \"../../popups/delete-confirmation/delete-confirmation.component\";\r\n\r\ninterface StoreOption {\r\n  id: string;\r\n  label: string;\r\n}\r\n\r\ninterface FloorOption {\r\n  _id: string;\r\n  floorNumber: number;\r\n  floorName: string;\r\n  status: BucketStatus;\r\n  isPlanoApproved?: boolean;\r\n  displayName: string;\r\n}\r\n\r\ntype BucketStatus = \"draft\" | \"allocationPending\" | \"completed\";\r\n\r\ninterface StatusOption {\r\n  value: BucketStatus;\r\n  label: string;\r\n  bucket: string;\r\n}\r\n\r\nconst STATUS_OPTIONS: StatusOption[] = [\r\n  { value: \"draft\", label: \"Draft\", bucket: \"Onboarding\" },\r\n  {\r\n    value: \"allocationPending\",\r\n    label: \"Allocation Pending\",\r\n    bucket: \"Onboarding\",\r\n  },\r\n  { value: \"completed\", label: \"Completed\", bucket: \"ManagePlano\" },\r\n];\r\n\r\n@Component({\r\n  selector: \"lib-move-bucket\",\r\n  templateUrl: \"./move-bucket.component.html\",\r\n  styleUrl: \"./move-bucket.component.scss\",\r\n})\r\nexport class MoveBucketComponent implements OnInit, OnDestroy {\r\n  clientId: string;\r\n\r\n  storeOptions: StoreOption[] = [];\r\n  selectedStoreId: string | null = null;\r\n  selectedStoreLabel: string | null = null;\r\n\r\n  floors: FloorOption[] = [];\r\n  selectedFloorId: string | null = null;\r\n  isLoadingFloors: boolean = false;\r\n\r\n  statusOptions = STATUS_OPTIONS;\r\n  targetStatus: BucketStatus | null = null;\r\n  currentStatus: BucketStatus | null = null;\r\n\r\n  clearLayoutTasks: boolean = false;\r\n  clearFixtureTasks: boolean = false;\r\n  clearZoneTasks: boolean = false;\r\n\r\n  isSubmitting: boolean = false;\r\n  message: string = \"\";\r\n  messageType: \"success\" | \"error\" = \"success\";\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private sbs: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private modalService: NgbModal,\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue\r\n      .pipe(\r\n        takeUntil(this.destroy$),\r\n        debounceTime(200),\r\n        filter((data) => !!data),\r\n        distinctUntilChanged(),\r\n      )\r\n      .subscribe((data: any) => {\r\n        if (data?.client) {\r\n          this.clientId = data.client;\r\n        } else {\r\n          const headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n        this.loadStores();\r\n      });\r\n  }\r\n\r\n  loadStores() {\r\n    this.sbs\r\n      .getStoreOrClusterList({ searchMode: \"store\" })\r\n      .subscribe((res: any) => {\r\n        this.storeOptions = res?.data || [];\r\n      });\r\n  }\r\n\r\n  onStoreSelected(storeId: string | null) {\r\n    this.selectedStoreId = storeId;\r\n    const store = this.storeOptions.find((s) => s.id === storeId);\r\n    this.selectedStoreLabel = store?.label ?? null;\r\n    this.resetFloorState();\r\n    if (this.selectedStoreLabel) {\r\n      this.loadFloors();\r\n    }\r\n  }\r\n\r\n  private resetFloorState() {\r\n    this.floors = [];\r\n    this.selectedFloorId = null;\r\n    this.currentStatus = null;\r\n    this.targetStatus = null;\r\n    this.clearLayoutTasks = false;\r\n    this.clearFixtureTasks = false;\r\n    this.clearZoneTasks = false;\r\n  }\r\n\r\n  loadFloors() {\r\n    if (!this.selectedStoreLabel) return;\r\n    this.isLoadingFloors = true;\r\n    this.sbs\r\n      .getFloorsWithStatus(this.selectedStoreLabel, this.clientId)\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          const raw: any[] = res?.data?.floors || [];\r\n          this.floors = raw\r\n            .map((f) => ({\r\n              _id: f._id,\r\n              floorNumber: f.floorNumber,\r\n              floorName: f.floorName,\r\n              status: f.status,\r\n              isPlanoApproved: f.isPlanoApproved,\r\n              displayName: `Floor ${f.floorNumber} — ${f.floorName} [${this.getStatusLabel(f.status)}]`,\r\n            }))\r\n            .sort((a, b) => a.floorNumber - b.floorNumber);\r\n          if (this.floors.length === 1) {\r\n            this.onFloorSelected(this.floors[0]._id);\r\n          }\r\n          this.isLoadingFloors = false;\r\n        },\r\n        error: (err: any) => {\r\n          this.showMessage(\r\n            err?.error?.message || \"Failed to load floors.\",\r\n            \"error\",\r\n          );\r\n          this.isLoadingFloors = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  onFloorSelected(floorId: string | null) {\r\n    this.selectedFloorId = floorId;\r\n    const floor = this.floors.find((f) => f._id === floorId);\r\n    if (floor) {\r\n      this.currentStatus = floor.status;\r\n      this.targetStatus = floor.status;\r\n    } else {\r\n      this.currentStatus = null;\r\n      this.targetStatus = null;\r\n    }\r\n  }\r\n\r\n  onTargetStatusSelected(value: BucketStatus | null) {\r\n    this.targetStatus = value;\r\n  }\r\n\r\n  get statusChanged(): boolean {\r\n    return !!this.targetStatus && this.targetStatus !== this.currentStatus;\r\n  }\r\n\r\n  get canSubmit(): boolean {\r\n    if (this.isSubmitting) return false;\r\n    if (!this.selectedFloorId || !this.targetStatus) return false;\r\n    const anyClear =\r\n      this.clearLayoutTasks || this.clearFixtureTasks || this.clearZoneTasks;\r\n    return this.statusChanged || anyClear;\r\n  }\r\n\r\n  getStatusLabel(status: BucketStatus | null | undefined): string {\r\n    if (!status) return \"--\";\r\n    return STATUS_OPTIONS.find((s) => s.value === status)?.label || status;\r\n  }\r\n\r\n  getBucketLabel(status: BucketStatus | null | undefined): string {\r\n    if (!status) return \"--\";\r\n    return STATUS_OPTIONS.find((s) => s.value === status)?.bucket || \"--\";\r\n  }\r\n\r\n  async onSubmit() {\r\n    if (!this.canSubmit) return;\r\n\r\n    const floor = this.floors.find((f) => f._id === this.selectedFloorId);\r\n    const floorLabel = floor\r\n      ? `Floor ${floor.floorNumber} (${floor.floorName})`\r\n      : \"selected floor\";\r\n\r\n    const clearSummary: string[] = [];\r\n    if (this.clearLayoutTasks) clearSummary.push(\"Layout\");\r\n    if (this.clearFixtureTasks) clearSummary.push(\"Fixture\");\r\n    if (this.clearZoneTasks) clearSummary.push(\"Zone\");\r\n\r\n    const lines: string[] = [];\r\n    lines.push(`Store: ${this.selectedStoreLabel ?? \"--\"}`);\r\n    lines.push(floorLabel);\r\n    if (this.statusChanged) {\r\n      lines.push(\r\n        `Status: ${this.getStatusLabel(this.currentStatus)} → ${this.getStatusLabel(this.targetStatus)}`,\r\n      );\r\n    }\r\n    if (clearSummary.length) {\r\n      lines.push(`Clear tasks: ${clearSummary.join(\", \")}`);\r\n    }\r\n    lines.push(\"This action cannot be undone. Continue?\");\r\n\r\n    const confirmed = await this.confirm(\r\n      \"Confirm bucket update\",\r\n      lines.join(\"\\n\"),\r\n    );\r\n    if (!confirmed) return;\r\n\r\n    const payload = {\r\n      floorId: this.selectedFloorId!,\r\n      targetStatus: this.targetStatus!,\r\n      clearLayoutTasks: this.clearLayoutTasks,\r\n      clearFixtureTasks: this.clearFixtureTasks,\r\n      clearZoneTasks: this.clearZoneTasks,\r\n    };\r\n\r\n    this.isSubmitting = true;\r\n    this.sbs.moveStoreBucket(payload).subscribe({\r\n      next: (res: any) => {\r\n        const data = res?.data || {};\r\n        const deleted = data?.deletedCounts || {};\r\n        const parts: string[] = [];\r\n        if (data?.prevStatus && data?.nextStatus) {\r\n          parts.push(\r\n            `Moved ${this.getStatusLabel(data.prevStatus)} → ${this.getStatusLabel(data.nextStatus)}`,\r\n          );\r\n        }\r\n        if (deleted.processedTasks || deleted.planoTaskCompliances) {\r\n          parts.push(\r\n            `Cleared ${deleted.processedTasks || 0} task(s), ${deleted.planoTaskCompliances || 0} compliance row(s)`,\r\n          );\r\n        }\r\n        this.showMessage(\r\n          parts.join(\". \") || \"Updated successfully\",\r\n          \"success\",\r\n        );\r\n        this.isSubmitting = false;\r\n        this.loadFloors();\r\n      },\r\n      error: (err: any) => {\r\n        this.showMessage(err?.error?.message || \"Failed to update.\", \"error\");\r\n        this.isSubmitting = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  private async confirm(title: string, description: string): Promise<boolean> {\r\n    try {\r\n      const ref = this.modalService.open(DeleteConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      ref.componentInstance.title = title;\r\n      ref.componentInstance.description = description;\r\n      ref.componentInstance.confirmLabel = \"Update\";\r\n      ref.componentInstance.confirmClass = \"btn-primary\";\r\n      const result = await ref.result;\r\n      return result === \"ok\";\r\n    } catch {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  showMessage(msg: string, type: \"success\" | \"error\") {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = \"\"), 6000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"move-bucket p-3\">\r\n  <lib-tool-page-header\r\n    title=\"Move Store Bucket\"\r\n    description=\"Move a floor between Onboarding (Draft / Allocation Pending) and ManagePlano (Completed) without losing store data.\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\" style=\"max-width: 640px;\">\r\n\r\n    <!-- Store -->\r\n    <div class=\"mb-3\">\r\n      <lib-reactive-select\r\n        label=\"Store\"\r\n        [idField]=\"'id'\"\r\n        [nameField]=\"'label'\"\r\n        [data]=\"storeOptions\"\r\n        [search]=\"true\"\r\n        [ngModel]=\"selectedStoreId\"\r\n        (ngModelChange)=\"onStoreSelected($event)\">\r\n      </lib-reactive-select>\r\n    </div>\r\n\r\n    <!-- Floor -->\r\n    <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\r\n      <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\r\n        <div class=\"text-muted small\">Loading floors...</div>\r\n      </ng-container>\r\n      <ng-template #floorPicker>\r\n        <ng-container *ngIf=\"floors.length > 0; else noFloors\">\r\n          <lib-reactive-select\r\n            label=\"Floor\"\r\n            [idField]=\"'_id'\"\r\n            [nameField]=\"'displayName'\"\r\n            [data]=\"floors\"\r\n            [search]=\"true\"\r\n            [ngModel]=\"selectedFloorId\"\r\n            (ngModelChange)=\"onFloorSelected($event)\">\r\n          </lib-reactive-select>\r\n        </ng-container>\r\n        <ng-template #noFloors>\r\n          <div class=\"text-muted small\">No floors found for this store.</div>\r\n        </ng-template>\r\n      </ng-template>\r\n    </div>\r\n\r\n    <!-- Current bucket info + target status -->\r\n    <ng-container *ngIf=\"selectedFloorId && currentStatus\">\r\n      <div class=\"mb-3 p-3 rounded current-info\">\r\n        <div class=\"d-flex justify-content-between small\">\r\n          <span class=\"text-muted\">Current bucket</span>\r\n          <span class=\"fw-semibold\">{{ getBucketLabel(currentStatus) }}</span>\r\n        </div>\r\n        <div class=\"d-flex justify-content-between small mt-1\">\r\n          <span class=\"text-muted\">Current status</span>\r\n          <span class=\"fw-semibold\">{{ getStatusLabel(currentStatus) }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"mb-3\">\r\n        <lib-reactive-select\r\n          label=\"Move to status\"\r\n          [idField]=\"'value'\"\r\n          [nameField]=\"'label'\"\r\n          [subTextField]=\"'bucket'\"\r\n          [data]=\"statusOptions\"\r\n          [ngModel]=\"targetStatus\"\r\n          (ngModelChange)=\"onTargetStatusSelected($event)\">\r\n        </lib-reactive-select>\r\n        <div class=\"form-text text-warning\" *ngIf=\"statusChanged\">\r\n          isPlanoApproved will be set to\r\n          <strong>{{ targetStatus === 'draft' ? 'false' : 'true' }}</strong>,\r\n          planoProgress will be set to\r\n          <strong>{{ targetStatus === 'completed' ? 25 : 0 }}</strong>.\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Task cleanup checkboxes -->\r\n      <div class=\"mb-3\">\r\n        <label class=\"form-label\">Clear tasks &amp; compliance rows (optional)</label>\r\n        <div class=\"d-flex flex-column gap-2\">\r\n          <div class=\"form-check\">\r\n            <input class=\"form-check-input\" type=\"checkbox\" id=\"clrLayout\"\r\n              [(ngModel)]=\"clearLayoutTasks\">\r\n            <label class=\"form-check-label\" for=\"clrLayout\">\r\n              Layout tasks\r\n              <span class=\"text-muted small\">(planoType: layout, layoutFixture)</span>\r\n            </label>\r\n          </div>\r\n          <div class=\"form-check\">\r\n            <input class=\"form-check-input\" type=\"checkbox\" id=\"clrFixture\"\r\n              [(ngModel)]=\"clearFixtureTasks\">\r\n            <label class=\"form-check-label\" for=\"clrFixture\">\r\n              Fixture tasks\r\n              <span class=\"text-muted small\">(planoType: fixture, vm)</span>\r\n            </label>\r\n          </div>\r\n          <div class=\"form-check\">\r\n            <input class=\"form-check-input\" type=\"checkbox\" id=\"clrZone\"\r\n              [(ngModel)]=\"clearZoneTasks\">\r\n            <label class=\"form-check-label\" for=\"clrZone\">\r\n              Zone tasks\r\n              <span class=\"text-muted small\">(planoType: zoneVerification)</span>\r\n            </label>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n\r\n    <!-- Submit -->\r\n    <button class=\"btn btn-primary\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\r\n      {{ isSubmitting ? 'Updating...' : 'Update' }}\r\n    </button>\r\n\r\n    <div class=\"mt-3 alert\" *ngIf=\"message\"\r\n      [class.alert-success]=\"messageType === 'success'\"\r\n      [class.alert-danger]=\"messageType === 'error'\"\r\n      style=\"white-space: pre-line;\">\r\n      {{ message }}\r\n    </div>\r\n  </div>\r\n</section>\r\n","import { Component, OnDestroy } from '@angular/core';\r\nimport { Subject, finalize } from 'rxjs';\r\nimport * as FileSaver from 'file-saver';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\n\r\ninterface CadFile {\r\n  name: string;\r\n  key: string;\r\n  uploadedAt: string;\r\n  size: number;\r\n  url: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-cad-files',\r\n  templateUrl: './cad-files.component.html',\r\n  styleUrl: './cad-files.component.scss',\r\n})\r\nexport class CadFilesComponent implements OnDestroy {\r\n  storeName: string = '';\r\n\r\n  files: CadFile[] = [];\r\n  hasSearched: boolean = false;\r\n\r\n  isLoading: boolean = false;\r\n  downloadingKey: string | null = null;\r\n\r\n  message: string = '';\r\n  messageType: 'success' | 'error' = 'success';\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(private sbs: StoreBuilderService) {}\r\n\r\n  onFetch() {\r\n    let storeName = (this.storeName || '').trim();\r\n    if (!storeName) {\r\n      this.showMessage('Please enter a store name.', 'error');\r\n      return;\r\n    }\r\n\r\n    this.isLoading = true;\r\n    this.hasSearched = true;\r\n    this.files = [];\r\n    this.message = '';\r\n\r\n    this.sbs\r\n      .getCadFiles(storeName)\r\n      .pipe(finalize(() => (this.isLoading = false)))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          this.files = res?.data?.files || [];\r\n        },\r\n        error: (err: any) => {\r\n          this.showMessage(\r\n            err?.error?.error?.errMsg ||\r\n              err?.error?.error ||\r\n              err?.error?.message ||\r\n              'Failed to fetch files.',\r\n            'error',\r\n          );\r\n        },\r\n      });\r\n  }\r\n\r\n  async onDownload(file: CadFile) {\r\n    if (!file.url) {\r\n      this.showMessage('Download URL is not available for this file.', 'error');\r\n      return;\r\n    }\r\n\r\n    this.downloadingKey = file.key;\r\n    try {\r\n      const response = await fetch(file.url);\r\n      if (!response.ok) {\r\n        throw new Error(`HTTP ${response.status}`);\r\n      }\r\n      const blob = await response.blob();\r\n      FileSaver.saveAs(blob, file.name);\r\n    } catch {\r\n      this.showMessage(`Failed to download ${file.name}.`, 'error');\r\n    } finally {\r\n      this.downloadingKey = null;\r\n    }\r\n  }\r\n\r\n  formatSize(bytes: number): string {\r\n    if (bytes == null || isNaN(bytes)) return '-';\r\n    return (bytes / (1024 * 1024)).toFixed(2) + ' MB';\r\n  }\r\n\r\n  showMessage(msg: string, type: 'success' | 'error') {\r\n    this.message = msg;\r\n    this.messageType = type;\r\n    setTimeout(() => (this.message = ''), 5000);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"cad-files p-3\">\r\n  <lib-tool-page-header\r\n    title=\"CAD &amp; Kissflow Files\"\r\n    description=\"Enter a store name to list the uploaded CAD and Kissflow files (sorted).\"\r\n  ></lib-tool-page-header>\r\n  <div class=\"card p-4\">\r\n\r\n    <div class=\"d-flex gap-2 align-items-end mb-3 flex-wrap\">\r\n      <div class=\"flex-grow-1\" style=\"min-width: 260px; max-width: 420px;\">\r\n        <label class=\"form-label\">Store Name</label>\r\n        <input\r\n          type=\"text\"\r\n          class=\"form-control\"\r\n          placeholder=\"Enter store name\"\r\n          [(ngModel)]=\"storeName\"\r\n          (keyup.enter)=\"onFetch()\"\r\n          [disabled]=\"isLoading\" />\r\n      </div>\r\n\r\n      <button\r\n        class=\"btn btn-primary\"\r\n        (click)=\"onFetch()\"\r\n        [disabled]=\"isLoading || !storeName.trim()\">\r\n        {{ isLoading ? 'Fetching...' : 'Fetch Files' }}\r\n      </button>\r\n    </div>\r\n\r\n    @if (message) {\r\n      <div\r\n        class=\"alert\"\r\n        [class.alert-success]=\"messageType === 'success'\"\r\n        [class.alert-danger]=\"messageType === 'error'\">\r\n        {{ message }}\r\n      </div>\r\n    }\r\n\r\n    @if (isLoading) {\r\n      <div class=\"text-muted\">Loading files...</div>\r\n    } @else if (hasSearched && files.length === 0) {\r\n      <div class=\"text-muted\">No files found for this store.</div>\r\n    } @else if (files.length > 0) {\r\n      <div class=\"table-responsive\">\r\n        <table class=\"table table-sm align-middle\">\r\n          <thead>\r\n            <tr>\r\n              <th>Name</th>\r\n              <th>Key</th>\r\n              <th>Uploaded At</th>\r\n              <th>Size</th>\r\n              <th class=\"text-end\">Action</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            @for (file of files; track file.key) {\r\n              <tr>\r\n                <td>{{ file.name }}</td>\r\n                <td class=\"text-muted small text-break\">{{ file.key }}</td>\r\n                <td>{{ file.uploadedAt | date: 'medium' }}</td>\r\n                <td>{{ formatSize(file.size) }}</td>\r\n                <td class=\"text-end\">\r\n                  <button\r\n                    class=\"btn btn-sm btn-outline-primary\"\r\n                    (click)=\"onDownload(file)\"\r\n                    [disabled]=\"downloadingKey === file.key\">\r\n                    {{ downloadingKey === file.key ? 'Downloading...' : 'Download' }}\r\n                  </button>\r\n                </td>\r\n              </tr>\r\n            }\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    }\r\n  </div>\r\n</section>\r\n","import { Component, OnDestroy, OnInit } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  filter,\n  Subject,\n  takeUntil,\n} from \"rxjs\";\n\nimport { GlobalStateService } from \"tango-app-ui-global\";\nimport { ToastService } from \"tango-app-ui-shared\";\n\nimport { StoreBuilderService } from \"../../../services/store-builder.service\";\n\ninterface StoreTouchupOption {\n  id: string; // planoId\n  label: string; // storeName\n  storeId?: string;\n}\n\n/**\n * Layout Touchup — internal tool selector.\n *\n * Two-step selector (Store → Floor). On \"Open Editor\", navigates to the\n * existing manage-planogram route with `touchup=1` query param. The existing\n * ManageStorePlanoComponent detects this and switches to touchup behaviour:\n *   - status-affecting buttons (publish / assign / redo / revoke) hidden\n *   - Save calls /managePlano/updateLayoutTouchup (no task cascade)\n *\n * No canvas rendering or fixture editor lives here — the existing edit-plano\n * surface IS the editor, so the visual is identical to the verification flow.\n */\n@Component({\n  selector: \"lib-layout-touchup\",\n  templateUrl: \"./layout-touchup.component.html\",\n  styleUrl: \"./layout-touchup.component.scss\",\n})\nexport class LayoutTouchupComponent implements OnInit, OnDestroy {\n  private destroy$ = new Subject<void>();\n\n  clientId: string;\n  storeOptions: StoreTouchupOption[] = [];\n  selectedStore: StoreTouchupOption | null = null;\n  floorOptions: { id: string; label: string }[] = [];\n  selectedFloorId: string = \"\";\n  isLoadingStores = false;\n  isLoadingFloor = false;\n\n  constructor(\n    private apiService: StoreBuilderService,\n    private gs: GlobalStateService,\n    private toast: ToastService,\n    private router: Router\n  ) {}\n\n  ngOnInit(): void {\n    this.gs.dataRangeValue\n      .pipe(\n        takeUntil(this.destroy$),\n        debounceTime(200),\n        filter((d) => !!d),\n        distinctUntilChanged()\n      )\n      .subscribe((data: any) => {\n        this.clientId =\n          data?.client ??\n          JSON.parse(localStorage.getItem(\"header-filters\") as string)?.client;\n        this.loadStores();\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  loadStores() {\n    this.isLoadingStores = true;\n    this.apiService\n      .getStoresForTouchup()\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (res: any) => {\n          // BE returns active stores with exactly one plano; `id` is planoId.\n          this.storeOptions = res?.data ?? [];\n          this.isLoadingStores = false;\n        },\n        error: () => {\n          this.toast.getErrorToast(\"Failed to load stores\");\n          this.isLoadingStores = false;\n        },\n      });\n  }\n\n  onStoreChange(planoId: string | null) {\n    const opt = this.storeOptions.find((s) => s.id === planoId);\n    this.selectedStore = opt ?? null;\n    this.floorOptions = [];\n    this.selectedFloorId = \"\";\n    if (!opt) return;\n    this.loadFloorsForPlano(opt.id);\n  }\n\n  loadFloorsForPlano(planoId: string) {\n    this.isLoadingFloor = true;\n    this.apiService\n      .getStoreFixtures({ id: [planoId], treeView: true })\n      .pipe(takeUntil(this.destroy$))\n      .subscribe({\n        next: (res: any) => {\n          const plano = res?.data?.[0];\n          if (!plano?.floors?.length) {\n            this.toast.getErrorToast(\"No floors found for this plano\");\n            this.isLoadingFloor = false;\n            return;\n          }\n          this.floorOptions = plano.floors.map((f: any) => ({\n            id: f._id,\n            label: `Floor ${f.floorNum}`,\n          }));\n          if (this.floorOptions.length === 1) {\n            this.selectedFloorId = this.floorOptions[0].id;\n          }\n          this.isLoadingFloor = false;\n        },\n        error: () => {\n          this.toast.getErrorToast(\"Failed to load floors\");\n          this.isLoadingFloor = false;\n        },\n      });\n  }\n\n  openEditor() {\n    if (!this.selectedStore?.id || !this.selectedFloorId) {\n      this.toast.getErrorToast(\"Pick a store and floor first\");\n      return;\n    }\n    // Navigate to the dedicated TouchupEditorComponent route (full clone of\n    // manage-planogram with verification UI stripped + save rerouted to\n    // /managePlano/updateLayoutTouchup). Same query-param contract as the\n    // verification flow uses for planoId / floorId.\n    this.router.navigate([\"/manage/planogram/layout-touchup-editor\"], {\n      queryParams: {\n        planoId: this.selectedStore.id,\n        floorId: this.selectedFloorId,\n      },\n    });\n  }\n}\n","<div class=\"touchup-selector\">\n  <lib-tool-page-header\n    title=\"Layout Touchup\"\n    description=\"Reposition or resize existing walls, fixtures, entrances and other elements, or tweak individual fixture details — without invalidating any verification responses.\"\n  ></lib-tool-page-header>\n\n  <div class=\"row g-3\">\n    <div class=\"col-md-6\">\n      <lib-reactive-select\n        label=\"Store\"\n        [idField]=\"'id'\"\n        [nameField]=\"'label'\"\n        [data]=\"storeOptions\"\n        [search]=\"true\"\n        [ngModel]=\"selectedStore?.id\"\n        (ngModelChange)=\"onStoreChange($event)\">\n      </lib-reactive-select>\n      <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n      <div class=\"text-muted small mt-1\" *ngIf=\"!isLoadingStores\">\n        Active stores with a planogram only.\n      </div>\n    </div>\n\n    <div class=\"col-md-6\" *ngIf=\"selectedStore\">\n      <ng-container *ngIf=\"isLoadingFloor; else floorPicker\">\n        <div class=\"text-muted small\">Loading floors...</div>\n      </ng-container>\n      <ng-template #floorPicker>\n        <lib-reactive-select\n          label=\"Floor\"\n          [idField]=\"'id'\"\n          [nameField]=\"'label'\"\n          [data]=\"floorOptions\"\n          [search]=\"false\"\n          [ngModel]=\"selectedFloorId\"\n          (ngModelChange)=\"selectedFloorId = $event\">\n        </lib-reactive-select>\n      </ng-template>\n    </div>\n  </div>\n\n  <div class=\"mt-4 d-flex justify-content-end\">\n    <button\n      type=\"button\"\n      class=\"btn btn-primary\"\n      [disabled]=\"!selectedFloorId || isLoadingFloor\"\n      (click)=\"openEditor()\">\n      Open Editor\n    </button>\n  </div>\n</div>\n","import {\r\n  AfterViewInit,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  OnDestroy,\r\n  OnInit,\r\n  TemplateRef,\r\n  ViewChild,\r\n} from \"@angular/core\";\r\n\r\nimport { Location, TitleCasePipe } from \"@angular/common\";\r\n\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  Validators,\r\n} from \"@angular/forms\";\r\n\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\nimport {\r\n  Subject,\r\n  Subscription,\r\n  debounceTime,\r\n  firstValueFrom,\r\n  fromEvent,\r\n  takeUntil,\r\n} from \"rxjs\";\r\n\r\nimport { NgbAccordionDirective, NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport * as fabric from \"fabric\";\r\n\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\n\r\nimport { StoreBuilderService } from \"../../../../services/store-builder.service\";\r\nimport { LayoutEditConfirmationComponent } from \"../../../popups/layout-edit-confirmation/layout-edit-confirmation.component\";\r\nimport { PublishTaskPopupComponent } from \"../../../manage-store-plano/popups/publishtask-popup/publishtask-popup.component\";\r\nimport { StoreTaskRevokeComponent } from \"../../../manage-store-plano/popups/store-task-revoke/store-task-revoke.component\";\r\nimport { DeleteConfirmationComponent } from \"../../../popups/delete-confirmation/delete-confirmation.component\";\r\nimport { DropdownIF } from \"../../../../interfaces/plano-general.interface\";\r\nimport { PublishPlanoModalComponent } from \"../../../popups/publish-plano-modal/publish-plano-modal.component\";\r\nimport { ScheduleTaskPopupComponent } from \"../../../manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component\";\r\nimport dayjs from \"dayjs\";\r\nimport { getFixtureCanvasLabel } from \"../../../../functions/plano.function\";\r\n\r\ntype BoundFixtureGroup = {\r\n  fixtureGroup: fabric.Group;\r\n  offsetX: number;\r\n  offsetY: number;\r\n  _tempOldTop?: number;\r\n  _tempOldLeft?: number;\r\n};\r\n\r\n/**\r\n * Layout Touchup Editor — full clone of ManageStorePlanoComponent for the\r\n * internal Layout Touchup tool flow.\r\n *\r\n * Identical canvas rendering, fixture editor (uses the same 3 standalone tab\r\n * components from TangoStoreBuilderModule with `revertOnEdit=false` so per-\r\n * fixture saves don't cascade), and form patching logic — verification /\r\n * task / publish / assign UI is removed from the template so users can't\r\n * accidentally mutate task state.\r\n *\r\n * Top \"Save\" calls /managePlano/updateLayoutTouchup which on the backend:\r\n *   - rejects any add/remove of walls / fixtures / entrances / otherElements\r\n *   - upserts geometry + fixture detail fields ONLY\r\n *   - never touches processedTask / planoTaskCompliance / planoCompliance\r\n *   - never flips floor status (verificationStatus, isPlanoApproved, etc.)\r\n *\r\n * Maintenance note: keep this file in approximate sync with\r\n * manage-store-plano.component.ts for canvas-rendering bug fixes. The two are\r\n * intentionally independent so the verification flow is never destabilized by\r\n * touchup changes (and vice versa).\r\n */\r\n@Component({\r\n  selector: \"lib-touchup-editor\",\r\n  templateUrl: \"./touchup-editor.component.html\",\r\n  styleUrl: \"./touchup-editor.component.scss\",\r\n  providers: [TitleCasePipe],\r\n})\r\nexport class TouchupEditorComponent\r\n  implements AfterViewInit, OnDestroy, OnInit\r\n{\r\n  @ViewChild(\"baseCanvas\")\r\n  canvasRef!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n  @ViewChild(\"noStoreVideo\") noStoreVideoModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"applyLogics\") applyLogicsModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"approveLayoutModal\") approveLayoutModalRef!: TemplateRef<any>;\r\n  @ViewChild(\"bodyAccordion\") bodyAccordion?: NgbAccordionDirective;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n\r\n  destroy$ = new Subject();\r\n\r\n  clientId: string;\r\n\r\n  canvas!: fabric.Canvas;\r\n  zoomLevel: number = 1;\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.toPixels(1524, \"mm\");\r\n  wallBindings = new Map<fabric.Group, BoundFixtureGroup[]>();\r\n\r\n  layoutForm: FormGroup;\r\n  selectedFloorId = new FormControl(\"\");\r\n  floorsList: DropdownIF[][] = [];\r\n  fixtureConfigSubscriptions: Subscription[] = [];\r\n  fixtureTemplateIdSubscriptions: Subscription[] = [];\r\n  otherElementsSubscriptions: Subscription[] = [];\r\n\r\n  planoData: any;\r\n\r\n  floorData: any;\r\n  readonly originalFloorData: any; // used to rollback to original layout state on click cancel while editing.\r\n\r\n  cdnUrl: string;\r\n  fixtureTemplates: any[] = [];\r\n  allFixtures: any[] = []; // all fixtures including the master templates for tree view\r\n  allFixtureInstances: any[] = []; // only the layout fixtures instances.\r\n  storeFeedback: any;\r\n  zoneFeedback: any;\r\n  selectedZoneFeedback: any;\r\n\r\n  // CL detection: header.label null/missing or 'CL' (legacy mobile clients), OR the\r\n  // newer answers[0].templateGroupName snapshot === 'CL' (mobile writes this alongside\r\n  // the other fixture-snapshot fields in answers[0] for zone submissions, catching\r\n  // brand-labeled CL fixtures). Older zone rows without templateGroupName still fall\r\n  // back to the header-label check.\r\n  private isClComplianceRow(row: any): boolean {\r\n    const ans = row?.answers?.[0];\r\n    const label = ans?.header?.label;\r\n    if (label == null || label === \"CL\") return true;\r\n    return ans?.templateGroupName === \"CL\";\r\n  }\r\n\r\n  get zonePendingCount(): number {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (!task) return 0;\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    let pending = 0;\r\n    for (const row of rows) {\r\n      const ans = row?.answers?.[0];\r\n      if (!ans) continue;\r\n      if (this.isClComplianceRow(row)) continue;\r\n      const hasResponse =\r\n        Array.isArray(ans?.shelfConfig) && ans.shelfConfig.length > 0;\r\n      if (hasResponse && !ans?.userAction) pending++;\r\n    }\r\n    return pending;\r\n  }\r\n\r\n  get zoneRedoCount(): number {\r\n    // Iterate compliance rows directly so a redo flag is detected even if the floor\r\n    // data isn't refreshed yet. CL skip uses isClComplianceRow (header label OR row's\r\n    // templateGroupName snapshot) — same rule as the BE rollup.\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    let count = 0;\r\n    for (const row of rows) {\r\n      const ans = row?.answers?.[0];\r\n      if (!ans) continue;\r\n      if (this.isClComplianceRow(row)) continue;\r\n      if (ans.userAction === \"redo\") count++;\r\n    }\r\n    return count;\r\n  }\r\n\r\n  // Redo can be published once every non-CL fixture has been actioned AND at least one is redo.\r\n  // Also requires the task to still be in 'submit' state — once redo is published, the task\r\n  // reopens (status='open') and the button must hide until mobile resubmits.\r\n  get zoneRedoStatus(): boolean {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (task?.checklistStatus !== \"submit\") return false;\r\n    return this.zonePendingCount === 0 && this.zoneRedoCount > 0;\r\n  }\r\n\r\n  get zoneTaskStyle(): { name: string; class: string } {\r\n    const task = this.zoneFeedback?.zoneVerificationTask;\r\n    if (!task) return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n    const status = task.checklistStatus;\r\n    // Collapse 'open' and 'inprogress' into a single \"Task Assigned\" state,\r\n    // matching the verification table's column convention.\r\n    if (status === \"open\" || status === \"inprogress\") {\r\n      // After a redo is published, the task reopens with redoStatus=true.\r\n      if (task.redoStatus === true) {\r\n        return { name: \"Redo\", class: \"taskAssigned\" };\r\n      }\r\n      return { name: \"Task Assigned\", class: \"taskAssigned\" };\r\n    }\r\n    // status === 'submit'\r\n    // Match fixture verification's wording: when there are pending redos to publish,\r\n    // fixture's getStatus() returns \"Yet to Assign\" — same convention used here.\r\n    if (this.zoneRedoStatus) {\r\n      return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n    }\r\n    if (this.zonePendingCount === 0) {\r\n      return { name: \"Approved\", class: \"completed\" };\r\n    }\r\n    return { name: \"Review Pending\", class: \"reviewPending\" };\r\n  }\r\n\r\n  // Top \"Publish\" button visibility: appears once layout+fixture+vm are Approved,\r\n  // regardless of zone state. Supports legacy stores (no zone task) by enabling\r\n  // immediately, and gates active zone tasks via topPublishDisabled below.\r\n  get showTopPublish(): boolean {\r\n    return (\r\n      this.taskStyle.layout.name === \"Approved\" &&\r\n      this.taskStyle.fixture.name === \"Approved\" &&\r\n      this.taskStyle.vm.name === \"Approved\"\r\n    );\r\n  }\r\n\r\n  // Top \"Publish\" button disabled when a zone task exists and isn't Approved yet.\r\n  // Keeps the disabledPublish signal from BE (taskInfo.disabled / editing) intact.\r\n  get topPublishDisabled(): boolean {\r\n    const zoneTaskExists = !!this.zoneFeedback?.zoneVerificationTask;\r\n    const zoneApproved =\r\n      !zoneTaskExists || this.zoneTaskStyle.name === \"Approved\";\r\n    return this.disabledPublish || !zoneApproved;\r\n  }\r\n\r\n  // Layout Touchup mode never invalidates downstream verification rows, so the\r\n  // per-fixture tab components must always send `revertOnEdit: false` to the\r\n  // BE. The corresponding ManageStorePlanoComponent getter returns true based\r\n  // on task state; we hardcode false here.\r\n  readonly shouldRevertOnEdit: boolean = false;\r\n\r\n  // Layout Touchup forbids structural changes (add/remove walls / fixtures /\r\n  // entrances / other elements) — the BE updateLayoutTouchup endpoint also\r\n  // hard-rejects count mismatches. Used by the template to hide every \"Add\r\n  // fixture\", \"Add element\", \"Add Entrance\", wall-delete, fixture-X, and\r\n  // other-element-X control. Position / rotate / resize of existing items\r\n  // remain enabled.\r\n  readonly canMutateStructure: boolean = false;\r\n\r\n  // True while the \"Sync zone response\" call is in flight. Used by the\r\n  // template to disable the button + show a spinner.\r\n  isSyncingZoneResponse: boolean = false;\r\n\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  selectedFixtureFeedback: any;\r\n  editFixture: boolean = false;\r\n  editFixtureSection: \"basic-details\" | \"products\" | \"vms\" = \"basic-details\";\r\n  activeFeedbackTab: \"fixture\" | \"zone\" = \"fixture\";\r\n  editFromTab: \"fixture\" | \"zone\" = \"fixture\";\r\n  submitFixture = false;\r\n\r\n  highlightedFixtureFormId: string | null = null;\r\n\r\n  storeMetrics = {\r\n    floorCount: 0,\r\n    fixtureCount: 0,\r\n    vmCount: 0,\r\n  };\r\n\r\n  isPageLoading: boolean = true;\r\n  isRightPanelCollapsed: boolean = true;\r\n  isLeftPanelCollapsed: boolean = true;\r\n  selectedView: \"tree\" | \"detail\" = \"detail\";\r\n\r\n  publishingState:\r\n    | \"layout\"\r\n    | \"layout-redo\"\r\n    | \"fixture\"\r\n    | \"fixture-redo\"\r\n    | \"vm\"\r\n    | \"vm-redo\"\r\n    | \"complete\"\r\n    | \"\" = \"\";\r\n  disabledPublish: boolean = false;\r\n  disableEdit: boolean = true;\r\n  isSavingLayout: boolean = false;\r\n\r\n  // Flipped to true by any layout-level mutation (add / delete / move / template\r\n  // change). Reset to false on successful save. Gates the per-fixture edit icon\r\n  // so the user must save layout changes first.\r\n  layoutHasUnsavedChanges: boolean = false;\r\n  taskInfo: any;\r\n  taskStyle = {\r\n    layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n  };\r\n\r\n  otherElementList: DropdownIF[] = [\r\n    { label: \"POS Counter\", value: \"POS Counter\" },\r\n    { label: \"Discussion Table\", value: \"Discussion Table\" },\r\n    { label: \"Mirror\", value: \"Mirror\" },\r\n    { label: \"Others\", value: \"Others\" },\r\n  ];\r\n  storeList: any = [];\r\n  selectedStoreName: any;\r\n\r\n  // vmList: VmLibraryList[] = [];\r\n  // isUserInteractedWithCanvas: boolean = false;\r\n\r\n  private activeHighlight: fabric.Rect | null = null;\r\n  private cancelHighlightBlink = false;\r\n\r\n  isButtonLoading = false;\r\n  isStoreTourLoading = false;\r\n\r\n  layoutBounds: any;\r\n  showLayout: boolean = false;\r\n  clCount: number = 0;\r\n  wallCount: number = 0;\r\n  toggle: boolean = true;\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private route: ActivatedRoute,\r\n    private fb: FormBuilder,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private toastService: ToastService,\r\n    private modalService: NgbModal,\r\n    private pageInfo: PageInfoService,\r\n    private location: Location,\r\n    private router: Router,\r\n    private cd: ChangeDetectorRef,\r\n  ) {\r\n    this.createForm();\r\n\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.setPageData();\r\n\r\n    this.gs.dataRangeValue\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(async (data) => {\r\n        if (data?.client) {\r\n          this.clientId = data?.client;\r\n        } else {\r\n          let headerData = JSON.parse(\r\n            localStorage.getItem(\"header-filters\") as string,\r\n          );\r\n          this.clientId = headerData?.client;\r\n        }\r\n\r\n        // await this.getVmsList();\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.route.queryParams\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((params) => {\r\n        if (params?.planoId) {\r\n          this.getStoreFixtures(params?.planoId);\r\n          this.getStoreList(params?.planoId);\r\n          if (params?.floorId) {\r\n            this.floorData = { _id: params?.floorId };\r\n          }\r\n        }\r\n      });\r\n\r\n    this.selectedFloorId.valueChanges.subscribe(async (id) => {\r\n      const clickedFloor = this.planoData?.floors?.find(\r\n        (f: any) => f._id === id,\r\n      );\r\n\r\n      if ([\"draft\", \"allocationPending\"].includes(clickedFloor.status)) {\r\n        this.router.navigateByUrl(\r\n          `manage/planogram/onboard-planogram?planoId=${clickedFloor.planoId}&floorId=${clickedFloor._id}`,\r\n        );\r\n      } else {\r\n        this.floorData = null;\r\n        this.createForm();\r\n        // Keep the form disabled during the floor-switch loading window so the\r\n        // template's edit-mode buttons (Save / Cancel / Add Entrance) don't flash.\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        this.removeHighlight();\r\n        this.isLeftPanelCollapsed = true;\r\n        this.isRightPanelCollapsed = true;\r\n\r\n        // Reset per-floor selection state so stale references from the previous\r\n        // floor don't bleed into the new floor's render and feedback panels.\r\n        this.selectedFixture = null;\r\n        this.selectedFixtureFeedback = null;\r\n        this.selectedZoneFeedback = null;\r\n        this.allFixtureInstances = [];\r\n        this.allFixtures = [];\r\n        this.wallCount = this.clCount = 0;\r\n\r\n        this.floorData = clickedFloor;\r\n        this.extractAllFixtures(this.floorData);\r\n\r\n        try {\r\n          await Promise.all([\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id),\r\n            this.getStoreFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n              {},\r\n            ),\r\n            this.getZoneVerificationFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n            ),\r\n          ]);\r\n        } catch {}\r\n\r\n        this.renderFloor();\r\n        this.layoutForm.disable({ emitEvent: false });\r\n        const newParams = new URLSearchParams(window.location.search);\r\n        newParams.set(\"planoId\", this.floorData.planoId);\r\n        newParams.set(\"floorId\", this.floorData._id);\r\n\r\n        this.location.replaceState(\r\n          window.location.pathname,\r\n          newParams.toString(),\r\n        );\r\n        this.selectedFloorId.setValue(this.floorData._id, { emitEvent: false });\r\n      }\r\n    });\r\n\r\n    this.canvas = new fabric.Canvas(this.canvasRef?.nativeElement, {\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n    });\r\n\r\n    fromEvent(this.canvas as any, \"object:modified\")\r\n      .pipe(debounceTime(100))\r\n      .subscribe(async (e: any) => {\r\n        const movedObj: any = e.target;\r\n\r\n        if (!movedObj) return;\r\n\r\n        if (this.layoutForm?.enabled) {\r\n          this.layoutHasUnsavedChanges = true;\r\n        }\r\n\r\n        if (movedObj?.type === \"activeSelection\") {\r\n          this.applyGroupTransform(movedObj);\r\n        }\r\n\r\n        const action = e.transform?.action;\r\n\r\n        const isResize =\r\n          action === \"scale\" || action === \"scaleX\" || action === \"scaleY\";\r\n\r\n        if (isResize) {\r\n          const type = movedObj?.objType ?? \"group\";\r\n\r\n          const updatedConfig = {\r\n            x: movedObj.left,\r\n            y: movedObj.top,\r\n            width: movedObj.getScaledWidth(),\r\n            height: movedObj.getScaledHeight(),\r\n            angle: movedObj.angle,\r\n            elementData: movedObj.data,\r\n          };\r\n\r\n          switch (type) {\r\n            case \"wall\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.angle = updatedConfig.angle;\r\n\r\n              const newWall = await this.drawWall(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                this.wallThickness,\r\n                updatedConfig.width - 0.27,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newWall as any).objType = \"wall\";\r\n              (newWall as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newWall);\r\n              break;\r\n            }\r\n\r\n            case \"others\": {\r\n              this.canvas.remove(movedObj);\r\n              updatedConfig.elementData.relativePosition.angle =\r\n                updatedConfig.angle;\r\n\r\n              const newOther = this.drawOtherElementsWithLabel(\r\n                this.canvas,\r\n                updatedConfig.x,\r\n                updatedConfig.y,\r\n                updatedConfig.angle,\r\n                updatedConfig.width - 2,\r\n                updatedConfig.height - 2,\r\n                updatedConfig.elementData,\r\n              );\r\n\r\n              (newOther as any).objType = \"others\";\r\n              (newOther as any).data = updatedConfig.elementData;\r\n\r\n              this.canvas.setActiveObject(newOther);\r\n              break;\r\n            }\r\n\r\n            case \"entrance\": {\r\n              break;\r\n            }\r\n\r\n            case \"fixture\": {\r\n              break;\r\n            }\r\n\r\n            default:\r\n              break;\r\n          }\r\n\r\n          this.canvas.requestRenderAll();\r\n        }\r\n\r\n        this.updateWallCoordinates();\r\n        this.updateFixtureCoordinates();\r\n        this.updateOtherElementsCoordinates();\r\n        this.updateEntranceCoordinates();\r\n      });\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    this.listenToDeleteKey();\r\n    this.togglePanel(\"left\", true);\r\n  }\r\n\r\n  async updateAllPositions() {\r\n    this.updateWallCoordinates();\r\n    this.updateFixtureCoordinates();\r\n    this.updateOtherElementsCoordinates();\r\n    this.updateEntranceCoordinates();\r\n\r\n    this.floorData.cadLayout = false;\r\n  }\r\n\r\n  applyGroupTransform(selection: fabric.ActiveSelection) {\r\n    const matrix = selection.calcTransformMatrix();\r\n\r\n    selection.getObjects().forEach((obj: any) => {\r\n      const objMatrix = obj.calcTransformMatrix();\r\n      const finalMatrix = fabric.util.multiplyTransformMatrices(\r\n        matrix,\r\n        objMatrix,\r\n      );\r\n\r\n      const point = new fabric.Point(0, 0).transform(finalMatrix);\r\n\r\n      obj.set({\r\n        left: point.x,\r\n        top: point.y,\r\n        angle: selection.angle + (obj.angle ?? 0),\r\n      });\r\n\r\n      obj.setCoords();\r\n    });\r\n\r\n    // Ungroup after applying transform\r\n    this.canvas.discardActiveObject();\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        // this.isUserInteractedWithCanvas = true;\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle(\"Layout Touchup Editor\");\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: \"Plano-tools\",\r\n        path: \"/manage/planogram/plano-tools\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: \"\",\r\n        path: \"\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ]);\r\n  }\r\n\r\n  onFixtureSave() {\r\n    this.submitFixture = true;\r\n    // this.selectedFixtureData.taskType = this.publishingState;\r\n    setTimeout(() => {\r\n      this.submitFixture = false;\r\n    }, 100);\r\n  }\r\n\r\n  async onFixturePageCancel() {\r\n    // this.submitFixture = false;\r\n    this.selectedFixtureData = null;\r\n    this.editFixtureSection = \"basic-details\";\r\n    this.editFixture = false;\r\n    this.editFromTab = \"fixture\";\r\n    // this.layoutForm.disable({ emitEvent: false });\r\n    await this.renderFloor(false);\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  onFixtureSubmit(event: any) {\r\n    if (!event && !this.selectedFixtureData) return;\r\n\r\n    if (event?.shelf && this.selectedFixtureData?.shelfConfig) {\r\n      event.shelf = event.shelf.map((shelf: any, index: any) => {\r\n        let findShelf = this.selectedFixtureData.shelfConfig.find(\r\n          (ele: any) => ele.shelfNumber == index + 1,\r\n        );\r\n        if (findShelf) {\r\n          shelf = { ...findShelf, ...shelf };\r\n        } else {\r\n          let details =\r\n            this.selectedFixtureData.shelfConfig[\r\n              this.selectedFixtureData.shelfConfig.length - 1\r\n            ];\r\n          details.shelfNumber = index + 1;\r\n          shelf = { ...details, ...shelf };\r\n        }\r\n        return shelf;\r\n      });\r\n\r\n      this.selectedFixtureData[\"shelfConfig\"] = event?.shelf;\r\n      this.selectedFixtureData[\"description\"] = event?.description ?? \"\";\r\n      this.selectedFixtureData[\"templateGroupName\"] =\r\n        event?.templateGroupName ?? \"\";\r\n      this.selectedFixtureData.header.label = event?.headerLabel ?? \"\";\r\n      this.selectedFixtureData.footer.label = event?.footerLabel ?? \"\";\r\n    } else if (event?.section) {\r\n      event.section.forEach((sec: any) => {\r\n        let number = sec?.shelves?.map((ele: any) =>\r\n          parseInt(ele.split(\" \")[1]),\r\n        );\r\n        this.selectedFixtureData?.shelfConfig.forEach((shelf: any) => {\r\n          if (number.includes(shelf.shelfNumber)) {\r\n            shelf.zone = sec.zone;\r\n            shelf.productBrandName = sec.productBrandName;\r\n            shelf.productCategory = sec.productCategory;\r\n          }\r\n        });\r\n      });\r\n    } else if (event?.vmConfig && this.selectedFixtureData?.vmConfig) {\r\n      this.selectedFixtureData[\"vmConfig\"] = event?.vmConfig;\r\n    } else {\r\n      if (event) {\r\n        // this.getVmsList();\r\n        this.createForm();\r\n        this.selectedFixtureData = null;\r\n        this.editFixtureSection = \"basic-details\";\r\n        this.editFixture = false;\r\n        if (this.editFromTab === \"zone\") {\r\n          this.persistZoneEditAccepted();\r\n          this.editFromTab = \"fixture\";\r\n        }\r\n        this.getStoreFixtures(this.planoData?._id);\r\n      }\r\n    }\r\n  }\r\n\r\n  togglePanel(side: \"left\" | \"right\", action?: boolean) {\r\n    if (side === \"left\") {\r\n      this.isLeftPanelCollapsed = action ?? !this.isLeftPanelCollapsed;\r\n      if (!this.isLeftPanelCollapsed) this.isRightPanelCollapsed = true;\r\n    } else {\r\n      this.isRightPanelCollapsed = action ?? !this.isRightPanelCollapsed;\r\n      if (!this.isRightPanelCollapsed) this.isLeftPanelCollapsed = true;\r\n\r\n      if (!this.selectedFixtureFeedback) {\r\n        this.onChangeFixtureOnFeedbackPanel({});\r\n      }\r\n    }\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 400);\r\n  }\r\n\r\n  onFeedbackTabChange(tab: \"fixture\" | \"zone\") {\r\n    if (this.activeFeedbackTab === tab) return;\r\n    this.activeFeedbackTab = tab;\r\n\r\n    // Panel min-width animates over 300ms (see [class^=\"col\"] transition).\r\n    // Resize per frame so the canvas tracks the container width as it animates,\r\n    // then fit the layout once the transition settles.\r\n    const duration = 350;\r\n    const start = performance.now();\r\n    const step = () => {\r\n      this.resizeCanvas();\r\n      if (performance.now() - start < duration) {\r\n        requestAnimationFrame(step);\r\n      } else {\r\n        this.fitCanvasToLayoutAnimated();\r\n      }\r\n    };\r\n    requestAnimationFrame(step);\r\n  }\r\n\r\n  getZoneVerificationFeedback(planoId: string, floorId: string) {\r\n    return new Promise((resolve) => {\r\n      this.apiService\r\n        .getZoneVerificationFeedback({ planoId, floorId })\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            this.zoneFeedback = res?.data ?? null;\r\n            if (this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId) {\r\n              this.selectZoneFeedback(\r\n                this.selectedFixtureFeedback.fixtureFeedback.fixtureId,\r\n              );\r\n            }\r\n            this.calculatePublishingState();\r\n            resolve(true);\r\n          },\r\n          error: () => {\r\n            this.zoneFeedback = null;\r\n            this.calculatePublishingState();\r\n            resolve(true);\r\n          },\r\n        });\r\n    });\r\n  }\r\n\r\n  selectZoneFeedback(fixtureId: string) {\r\n    const rows: any[] = this.zoneFeedback?.zoneVerificationData ?? [];\r\n    this.selectedZoneFeedback =\r\n      rows.find((row: any) => row?.fixtureId?.toString?.() === fixtureId) ??\r\n      null;\r\n  }\r\n\r\n  getStoreFeedback(\r\n    planoId: string,\r\n    floorId: string,\r\n    filter: any,\r\n    checkPublishState: boolean = true,\r\n  ) {\r\n    return new Promise((resolve, reject) => {\r\n      let data: any = {\r\n        planoId: planoId,\r\n        floorId: floorId,\r\n      };\r\n      if (filter) {\r\n        data = { ...data, ...filter };\r\n      }\r\n\r\n      this.apiService.getStoreFeedback(data).subscribe({\r\n        next: async (res: any) => {\r\n          this.storeFeedback = res.data;\r\n          if (res.data?.layoutData?.length) {\r\n            await this.processLayoutFeedback(res.data.layoutData);\r\n          } else {\r\n            await this.processLayoutFeedback([]);\r\n          }\r\n\r\n          if (res.data?.fixtureData?.length) {\r\n            if (\r\n              res.data?.fixtureData.length &&\r\n              !res.data?.fixtureData?.[0]?.fixtureId\r\n            ) {\r\n              this.showLayout = true;\r\n            }\r\n            this.processFixtureFeedback(res.data.fixtureData);\r\n          } else {\r\n            this.processFixtureFeedback([]);\r\n          }\r\n\r\n          if (res.data?.VmData?.length) {\r\n            this.processVmFeedback(res.data.VmData);\r\n          } else {\r\n            this.processVmFeedback([]);\r\n          }\r\n\r\n          if (checkPublishState) {\r\n            // this.calculatePublishingState()\r\n          }\r\n\r\n          if (this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId) {\r\n            this.onChangeFixtureOnFeedbackPanel({\r\n              currentFixture:\r\n                this.selectedFixtureFeedback.fixtureFeedback.fixtureId,\r\n            });\r\n          }\r\n          resolve(true);\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to fetch store feedback\");\r\n          reject();\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  calculatePublishingState() {\r\n    let disableEdit = false;\r\n    for (let i = 0; i < this.floorData.layoutPolygon.length; i++) {\r\n      const element = this.floorData.layoutPolygon[i];\r\n      for (let j = 0; j < element.fixtures.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        if (fixture.issue) {\r\n          disableEdit = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.floorData?.centerFixture) {\r\n      for (let i = 0; i < this.floorData.centerFixture.length; i++) {\r\n        const fixture = this.floorData.centerFixture[i];\r\n\r\n        if (fixture.issue) {\r\n          disableEdit = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (disableEdit) {\r\n      this.disableEdit = true;\r\n    } else {\r\n      this.disableEdit = false;\r\n    }\r\n\r\n    let layoutData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"layout\",\r\n    );\r\n    let fixtureData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"fixture\",\r\n    );\r\n    let vmData = this.taskInfo?.taskDetails?.find(\r\n      (ele: any) => ele.type == \"fixture\",\r\n    );\r\n    const zoneTaskExists = !!this.zoneFeedback?.zoneVerificationTask;\r\n    const zoneApproved =\r\n      !zoneTaskExists || this.zoneTaskStyle.name == \"Approved\";\r\n\r\n    const allNonZoneApproved =\r\n      this.taskStyle.layout.name == \"Approved\" &&\r\n      this.taskStyle.fixture.name == \"Approved\" &&\r\n      this.taskStyle.vm.name == \"Approved\";\r\n\r\n    if (allNonZoneApproved && zoneApproved) {\r\n      this.publishingState = \"complete\";\r\n    } else if (allNonZoneApproved && !zoneApproved) {\r\n      // Only zone review is blocking — no publish action to take here.\r\n      this.publishingState = \"\";\r\n    } else if (this.taskStyle.fixture.name == \"Approved\") {\r\n      this.publishingState = \"vm\";\r\n      if (\r\n        vmData &&\r\n        ((vmData.status == \"submit\" && vmData.feedbackStatus == \"disagree\") ||\r\n          vmData?.redoStatus)\r\n      ) {\r\n        this.publishingState = \"vm-redo\";\r\n      }\r\n    } else {\r\n      this.publishingState = \"fixture\";\r\n      if (\r\n        fixtureData &&\r\n        ((fixtureData.status == \"submit\" &&\r\n          fixtureData.feedbackStatus == \"disagree\") ||\r\n          fixtureData?.redoStatus)\r\n      ) {\r\n        this.publishingState = !this.floorData.isEdited\r\n          ? \"fixture-redo\"\r\n          : \"fixture\";\r\n      }\r\n    }\r\n\r\n  }\r\n\r\n  async getTemplate(fixtureConfigId: string) {\r\n    return await firstValueFrom(\r\n      this.apiService.getFixtureTemplate(fixtureConfigId),\r\n    );\r\n  }\r\n\r\n  async processLayoutFeedback(storeFeedback: any[]) {\r\n    const layoutFeedback = storeFeedback.find(\r\n      (feedback) => feedback.type === \"layout\",\r\n    );\r\n\r\n    const wallElements = this.floorData.layoutPolygon.filter(\r\n      (element: any) => element.elementType === \"wall\",\r\n    );\r\n\r\n    if (layoutFeedback) {\r\n      const issues = layoutFeedback?.answers?.[0]?.issues;\r\n\r\n      if (issues) {\r\n        for (let i = 0; i < issues.length; i++) {\r\n          const issue = issues[i];\r\n\r\n          if (issue.issueType === \"extraFixture\") {\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              const template: any = await this.getTemplate(\r\n                fixture.fixtureConfigId,\r\n              );\r\n\r\n              if (!template) {\r\n                return;\r\n              }\r\n\r\n              const fixtureId = `new-${crypto.randomUUID()}`;\r\n\r\n              const ghostFixture = {\r\n                ...template?.data,\r\n                fixtureConfigId: template?.data?._id,\r\n                _id: fixtureId,\r\n                relativePosition: { x: 0, y: 0, unit: \"ft\" },\r\n                shelfConfig: fixture.shelfConfig,\r\n                ghost: true,\r\n                issue: true,\r\n                issueData: fixture,\r\n                taskType: \"layout\",\r\n              };\r\n\r\n              // const fixtureGroup = this.patchFixture({ fixtureName: ghostFixture.fixtureName, fixtureConfigId: ghostFixture.fixtureConfigId, _id: ghostFixture._id });\r\n\r\n              if (fixture.associatedElementType === \"wall\") {\r\n                let wallIndex: number;\r\n\r\n                const assocWallNum = fixture.associatedElementNumber;\r\n                if (assocWallNum >= wallElements.length) {\r\n                  wallIndex = wallElements.length;\r\n                } else if (assocWallNum <= 0) {\r\n                  wallIndex = 0;\r\n                } else {\r\n                  wallIndex = assocWallNum;\r\n                }\r\n\r\n                const elementFixtures: any = wallElements.find(\r\n                  (element: any) =>\r\n                    element.elementType === \"wall\" &&\r\n                    element.elementNumber === wallIndex,\r\n                ).fixtures;\r\n                const assocFixtureNum = fixture.associatedElementFixtureNumber;\r\n\r\n                if (assocFixtureNum > elementFixtures.length) {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.push(ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).push(fixtureGroup);\r\n                } else if (assocFixtureNum <= 0) {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.unshift(ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).insert(0, fixtureGroup);\r\n                } else {\r\n                  this.floorData.layoutPolygon\r\n                    .find(\r\n                      (element: any) =>\r\n                        element.elementType === \"wall\" &&\r\n                        element.elementNumber === wallIndex,\r\n                    )\r\n                    .fixtures.splice(assocFixtureNum - 1, 0, ghostFixture);\r\n                  // this.getFormFixtures(wallIndex! - 1).insert(assocFixtureNum - 1, fixtureGroup);\r\n                }\r\n              } else if (fixture.associatedElementType === \"floor\") {\r\n                const assocFixtureNum = fixture.associatedElementFixtureNumber;\r\n\r\n                if (assocFixtureNum > this.floorData.centerFixture.length) {\r\n                  this.floorData.centerFixture.push(ghostFixture);\r\n                  // this.getFormFloorFixtures.push(fixtureGroup);\r\n                } else if (assocFixtureNum <= 0) {\r\n                  this.floorData.centerFixture.unshift(ghostFixture);\r\n                  // this.getFormFloorFixtures.insert(0, fixtureGroup);\r\n                } else {\r\n                  this.floorData.centerFixture.splice(\r\n                    assocFixtureNum - 1,\r\n                    0,\r\n                    ghostFixture,\r\n                  );\r\n                  // this.getFormFloorFixtures.insert(assocFixtureNum - 1, fixtureGroup);\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          if (\r\n            issue.issueType === \"fixtureMissing\" ||\r\n            issue.issueType === \"fixtureMismatch\"\r\n          ) {\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"layout\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"layout\",\r\n                };\r\n              }\r\n            }\r\n\r\n            // }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  processFixtureFeedback(storeFeedback: any[]) {\r\n    const fixtureFeedback = storeFeedback.filter(\r\n      (feedback) => feedback.type === \"fixture\",\r\n    );\r\n\r\n    let findFixtureTask = this.taskInfo?.taskDetails?.find(\r\n      (task: any) => task.type == \"fixture\",\r\n    );\r\n\r\n    for (const feedback of fixtureFeedback ?? []) {\r\n      const aiData = feedback?.fixtureAIData;\r\n      if (!aiData) continue;\r\n\r\n      const fixture = this.allFixtureInstances.find(\r\n        (f: any) => f._id === aiData.fixtureId,\r\n      );\r\n      if (!fixture) continue;\r\n\r\n      feedback.FixtureData = structuredClone(fixture);\r\n\r\n      const status =\r\n        (findFixtureTask?.status === \"submit\" || findFixtureTask?.redoStatus) &&\r\n        feedback?.answers?.[0]?.status\r\n          ? feedback.answers[0].status\r\n          : \"\";\r\n\r\n      Object.assign(fixture, {\r\n        issue: false,\r\n        issueData: aiData,\r\n        taskType: \"fixture\",\r\n        status,\r\n        breach: findFixtureTask?.breach,\r\n        taskStatus: findFixtureTask?.status,\r\n      });\r\n    }\r\n  }\r\n\r\n  processVmFeedback(storeFeedback: any[]) {\r\n    const fixtureFeedback = storeFeedback.filter(\r\n      (feedback) => feedback.type === \"vm\",\r\n    );\r\n\r\n    if (fixtureFeedback.length) {\r\n      for (let i = 0; i < fixtureFeedback.length; i++) {\r\n        const issues = fixtureFeedback?.[i]?.answers?.[0]?.issues;\r\n\r\n        if (issues?.length) {\r\n          for (let j = 0; j < issues.length; j++) {\r\n            const issue = issues[j];\r\n\r\n            const fixtures = issue.Details.filter(\r\n              (fixture: any) => fixture.status === \"pending\",\r\n            );\r\n\r\n            for (let j = 0; j < fixtures.length; j++) {\r\n              const fixture = fixtures[j];\r\n\r\n              // if (fixture.associatedElementType === 'wall') {\r\n              const targetFixtureId = fixture.fixtureId;\r\n\r\n              for (const wallElement of this.floorData.layoutPolygon) {\r\n                if (\r\n                  wallElement.elementType !== \"wall\" ||\r\n                  !Array.isArray(wallElement.fixtures)\r\n                )\r\n                  continue;\r\n\r\n                const fixtureIndex = wallElement.fixtures.findIndex(\r\n                  (f: any) => f._id === targetFixtureId,\r\n                );\r\n\r\n                if (fixtureIndex !== -1) {\r\n                  wallElement.fixtures[fixtureIndex] = {\r\n                    ...wallElement.fixtures[fixtureIndex],\r\n                    issue: true,\r\n                    issueData: issues,\r\n                    taskType: \"vm\",\r\n                  };\r\n\r\n                  break;\r\n                }\r\n              }\r\n              // }\r\n              // else if (fixture.associatedElementType === 'floor') {\r\n              // const targetFixtureId = fixture.fixtureId;\r\n\r\n              const centerFixtures = this.floorData.centerFixture;\r\n\r\n              const fixtureIndex = centerFixtures.findIndex(\r\n                (f: any) => f._id === targetFixtureId,\r\n              );\r\n\r\n              if (fixtureIndex !== -1) {\r\n                centerFixtures[fixtureIndex] = {\r\n                  ...centerFixtures[fixtureIndex],\r\n                  issue: true,\r\n                  issueData: issues,\r\n                  taskType: \"vm\",\r\n                };\r\n              }\r\n            }\r\n          }\r\n          // }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  transferArrayItem<T = any>(\r\n    currentArray: T[],\r\n    targetArray: T[],\r\n    currentIndex: number,\r\n    targetIndex: number,\r\n  ): void {\r\n    const from = Math.max(0, Math.min(currentArray.length - 1, currentIndex));\r\n    const to = Math.max(0, Math.min(targetArray.length, targetIndex));\r\n\r\n    if (currentArray.length) {\r\n      targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);\r\n    }\r\n  }\r\n\r\n  reorderFixture(floorData: any) {\r\n    // Walls\r\n    floorData.layoutPolygon.forEach((element: any) => {\r\n      if (element.elementType === \"wall\") {\r\n        let wallAssociatedIndex = 1;\r\n\r\n        element.fixtures.forEach((fixture: any) => {\r\n          fixture.associatedElementType = \"wall\";\r\n          fixture.associatedElementNumber = element.elementNumber;\r\n          fixture.fixtureType = \"wall\";\r\n\r\n          if (!fixture.ghost) {\r\n            // fixture.fixtureNumber = fixtureNumber++;\r\n            fixture.associatedElementFixtureNumber = wallAssociatedIndex++;\r\n          } else {\r\n            fixture.fixtureNumber = null;\r\n            fixture.associatedElementFixtureNumber = null;\r\n          }\r\n        });\r\n      }\r\n    });\r\n\r\n    // Center floor fixtures\r\n    let floorAssociatedIndex = 1;\r\n    floorData.centerFixture.forEach((fixture: any) => {\r\n      fixture.fixtureType = \"floor\";\r\n\r\n      if (!fixture.ghost) {\r\n        // fixture.fixtureNumber = fixtureNumber++;\r\n        fixture.associatedElementFixtureNumber = floorAssociatedIndex++;\r\n      } else {\r\n        fixture.fixtureNumber = null;\r\n        fixture.associatedElementFixtureNumber = null;\r\n      }\r\n    });\r\n  }\r\n\r\n  getElementValue(group: any) {\r\n    return group.get(\"elementNumber\")?.value;\r\n  }\r\n\r\n  private getWallByNumber(elementNumber: number): any | undefined {\r\n    return this.floorData?.layoutPolygon?.find(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === elementNumber,\r\n    );\r\n  }\r\n\r\n  roundToTwo(num: number) {\r\n    return Math.round(num * 100) / 100;\r\n  }\r\n\r\n  async getStoreFixtures(storeId: string, enable: boolean = true) {\r\n    this.removeHighlight();\r\n    this.isPageLoading = true;\r\n    if (!this.fixtureTemplates.length) {\r\n      await this.getFixtureTemplates();\r\n    }\r\n    this.selectedFixture = null;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId], treeView: true })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: async (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            return;\r\n          }\r\n\r\n          this.planoData = structuredClone(res.data[0]);\r\n          if (this.floorData?._id) {\r\n            this.floorData = structuredClone(\r\n              res.data[0].floors.find(\r\n                (floor: any) => floor?._id === this.floorData?._id,\r\n              ),\r\n            );\r\n          } else {\r\n            this.floorData = structuredClone(res.data[0].floors[0]);\r\n          }\r\n\r\n          if ([\"draft\", \"allocationPending\"].includes(this.floorData.status)) {\r\n            this.router.navigateByUrl(\r\n              `manage/planogram/onboard-planogram?planoId=${this.floorData.planoId}&floorId=${this.floorData._id}`,\r\n            );\r\n          }\r\n\r\n          this.floorsList = this.planoData.floors.map((f: any) => ({\r\n            label: f.floorNum,\r\n            value: f._id,\r\n            // disabled: f.status === \"completed\",\r\n          }));\r\n\r\n          this.extractAllFixtures(this.floorData);\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n\r\n          this.storeMetrics.floorCount = this.planoData?.floors?.length;\r\n\r\n          this.disableEdit = false;\r\n          try {\r\n            await Promise.all([\r\n              this.taskDetails(this.floorData.planoId, this.floorData._id),\r\n              this.getStoreFeedback(\r\n                this.floorData.planoId,\r\n                this.floorData._id,\r\n                {},\r\n              ),\r\n              this.getZoneVerificationFeedback(\r\n                this.floorData.planoId,\r\n                this.floorData._id,\r\n              ),\r\n            ]);\r\n          } catch {}\r\n\r\n          this.renderFloor();\r\n\r\n          this.isPageLoading = false;\r\n          if (enable) {\r\n            this.layoutForm?.disable({ emitEvent: false });\r\n          }\r\n          // this.cd.detectChanges();\r\n        },\r\n        error: (err: any) => {\r\n          this.isPageLoading = false;\r\n          this.toastService.getErrorToast(\"Failed to fetch plano\");\r\n        },\r\n      });\r\n  }\r\n\r\n  extractAllFixtures(floorData: any) {\r\n    const extractedFixture = [\r\n      ...(floorData?.masterTemplates ?? []),\r\n      ...(floorData?.centerFixture ?? []),\r\n    ];\r\n\r\n    floorData?.layoutPolygon?.forEach((lp: any) => {\r\n      this.wallCount += lp.fixtures.length;\r\n      this.clCount += lp.fixtures.filter(\r\n        (ele: any) => ele.header.label == \"CL\",\r\n      )?.length;\r\n      extractedFixture.push(...(lp.fixtures ?? []));\r\n    });\r\n\r\n    this.allFixtures = extractedFixture;\r\n\r\n    this.allFixtureInstances = [\r\n      ...this.floorData!.layoutPolygon.flatMap((e: any) => e?.fixtures ?? []),\r\n      ...(this.floorData?.centerFixture ?? []),\r\n    ];\r\n  }\r\n\r\n  async renderFloor(update: boolean = true) {\r\n    this.storeMetrics.fixtureCount = this.floorData.fixtureCount;\r\n    this.storeMetrics.vmCount = this.floorData.vmCount;\r\n    this.drawInitialContent();\r\n    if (update) {\r\n      this.createForm();\r\n\r\n      this.floorData.layoutPolygon.forEach((wall: any) => {\r\n        if (wall.elementType === \"wall\") {\r\n          const wallItem = this.patchWallElements({\r\n            elementType: wall.elementType,\r\n            elementNumber: wall.elementNumber,\r\n          });\r\n\r\n          wall.fixtures.forEach((fixture: any) => {\r\n            if (fixture?.fixtureName === \"space\") return;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: fixture.fixtureName,\r\n              fixtureConfigId: fixture.fixtureConfigId,\r\n              _id: fixture._id,\r\n            });\r\n            (wallItem.get(\"fixtures\") as FormArray).push(fixtureGroup);\r\n          });\r\n\r\n          wall.otherElements?.forEach((ele: any) => {\r\n            const eleGroup = this.fb.group({\r\n              type: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? ele.fixtureName\r\n                  : \"Others\",\r\n              ],\r\n              customName: [\r\n                this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                  ? \"\"\r\n                  : ele.fixtureName,\r\n              ],\r\n            });\r\n            (wallItem.get(\"otherElements\") as FormArray).push(eleGroup);\r\n          });\r\n\r\n          this.getFormWalls.push(wallItem);\r\n        }\r\n      });\r\n\r\n      if (this.floorData?.centerFixture?.length) {\r\n        this.floorData?.centerFixture.forEach((fixture: any) => {\r\n          const fixtureGroup = this.patchFixture({\r\n            fixtureName: fixture.fixtureName,\r\n            fixtureConfigId: fixture.fixtureConfigId,\r\n            _id: fixture._id,\r\n          });\r\n          (this.layoutForm.get(\"floorFixtures\") as FormArray).push(\r\n            fixtureGroup,\r\n          );\r\n        });\r\n      }\r\n\r\n      if (this.floorData?.otherElements?.length) {\r\n        this.floorData?.otherElements?.forEach((ele: any) => {\r\n          const eleGroup = this.fb.group({\r\n            type: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? ele.fixtureName\r\n                : \"Others\",\r\n            ],\r\n            customName: [\r\n              this.otherElementList.some((o) => o.value === ele.fixtureName)\r\n                ? \"\"\r\n                : ele.fixtureName,\r\n            ],\r\n          });\r\n\r\n          (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n            eleGroup,\r\n          );\r\n        });\r\n      }\r\n    }\r\n\r\n    this.subscribeToFixtureConfigIdChanges();\r\n    this.subscribeToOtherElementsChanges();\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    this.canvas.clear();\r\n    this.reorderFixture(this.floorData);\r\n    await this.drawLayoutElements();\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.updateAllPositions();\r\n\r\n    if (\r\n      this.selectedFixtureFeedback?.fixtureFeedback?.fixtureId &&\r\n      !this.isRightPanelCollapsed &&\r\n      this.activeHighlight\r\n    ) {\r\n      this.canvas.add(this.activeHighlight);\r\n      this.keepHighlightOnTop();\r\n    }\r\n    // this.drawBg();\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 400) {\r\n    if (!this.canvas) return;\r\n\r\n    if (this.layoutForm.enabled) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Final zoom to fit (with padding)\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY) * 0.9; // padding 10%\r\n\r\n    // Desired viewport offset to center layout\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom; // center X\r\n    targetVpt[5] = canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom; // center Y\r\n\r\n    // Current viewport (starting point of animation)\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        // Interpolate matrix values\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        let width = this.toPixels(element.distance, element.unit);\r\n        if (width < height) width = this.wallThickness + 1;\r\n        await this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n    }\r\n\r\n    // For cad layouts only.\r\n    this.layoutBounds = this.getFullLayoutBounds();\r\n\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n      if (element.elementType !== \"wall\") continue;\r\n\r\n      const fixtureGroups: fabric.Group[] = [];\r\n\r\n      for (let j = 0; j < element?.fixtures?.length; j++) {\r\n        const fixture = element.fixtures[j];\r\n\r\n        const fixtureHeight = this.toPixels(\r\n          fixture.fixtureStaticLength.value,\r\n          fixture.fixtureStaticLength.unit,\r\n        );\r\n        const fixtureWidth = this.toPixels(\r\n          fixture.fixtureStaticWidth.value,\r\n          fixture.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        let x = this.toPixels(\r\n          fixture.relativePosition.x,\r\n          fixture.relativePosition.unit,\r\n        );\r\n        let y = this.toPixels(\r\n          fixture.relativePosition.y,\r\n          fixture.relativePosition.unit,\r\n        );\r\n\r\n        // override the fixture position for initial cad layouts.\r\n        if (this.floorData?.cadLayout) {\r\n          const baseX = this.toPixels(\r\n            element.relativePosition.x,\r\n            element.relativePosition.unit,\r\n          );\r\n\r\n          const baseY = this.toPixels(\r\n            element.relativePosition.y,\r\n            element.relativePosition.unit,\r\n          );\r\n          const startBuffer = 40;\r\n          const spacing = 136;\r\n          const offset = startBuffer + spacing * j;\r\n\r\n          const angleRad = fabric.util.degreesToRadians(element.angle);\r\n\r\n          const dirX = Math.cos(angleRad);\r\n          const dirY = Math.sin(angleRad);\r\n\r\n          const normalOffset = this.wallThickness;\r\n\r\n          const normX = Math.cos(angleRad + Math.PI / 2) * normalOffset;\r\n          const normY = Math.sin(angleRad + Math.PI / 2) * normalOffset;\r\n\r\n          x = baseX + dirX * offset + normX;\r\n          y = baseY + dirY * offset + normY;\r\n        }\r\n\r\n        const fixtureObj = await this.drawFixture(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          fixtureHeight,\r\n          fixtureWidth,\r\n          fixture,\r\n        );\r\n        fixtureGroups.push(fixtureObj as fabric.Group);\r\n      }\r\n\r\n      for (let j = 0; j < element?.otherElements?.length; j++) {\r\n        const otherElement = element.otherElements[j];\r\n        const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n        const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n        const a = otherElement.relativePosition.angle;\r\n        const h = this.toPixels(\r\n          otherElement.fixtureStaticLength.value,\r\n          otherElement.fixtureStaticLength.unit,\r\n        );\r\n        const w = this.toPixels(\r\n          otherElement.fixtureStaticWidth.value,\r\n          otherElement.fixtureStaticWidth.unit,\r\n        );\r\n\r\n        this.drawOtherElementsWithLabel(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          a,\r\n          w,\r\n          h,\r\n          otherElement,\r\n        );\r\n      }\r\n    }\r\n\r\n    if (this.floorData?.cadLayout && this.floorData?.centerFixture?.length) {\r\n      const fixtures = this.floorData.centerFixture;\r\n\r\n      // Layout polygon (your existing method)\r\n      const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n\r\n      // Occupied areas (ALL objects)\r\n      const occupiedRects = this.getOccupiedRects();\r\n\r\n      // Fixture size\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtures[0].fixtureStaticWidth.value,\r\n        fixtures[0].fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtures[0].fixtureStaticLength.value,\r\n        fixtures[0].fixtureStaticLength.unit,\r\n      );\r\n\r\n      // Grid shape (wide bias if you want)\r\n      const total = fixtures.length;\r\n      const maxRows = 2; // you can tweak\r\n      const rows = Math.min(maxRows, total);\r\n      const columns = Math.ceil(total / rows);\r\n\r\n      const gridWidth = columns * fixtureWidthPx;\r\n      const gridHeight = rows * fixtureHeightPx;\r\n\r\n      // Layout bounds\r\n      const bounds = this.getFullLayoutBounds();\r\n      const centerX = bounds.left + bounds.width / 2;\r\n      const centerY = bounds.top + bounds.height / 2;\r\n\r\n      // Check if grid fits\r\n      const gridFits = (x: number, y: number) => {\r\n        const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n        // Inside polygon\r\n        if (\r\n          !this.isPointInsidePolygon({ x, y }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon({ x: x + gridWidth, y }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon({ x, y: y + gridHeight }, layoutPolygon) ||\r\n          !this.isPointInsidePolygon(\r\n            { x: x + gridWidth, y: y + gridHeight },\r\n            layoutPolygon,\r\n          )\r\n        ) {\r\n          return false;\r\n        }\r\n\r\n        // No overlap\r\n        for (const occ of occupiedRects) {\r\n          if (this.rectsOverlap(gridRect, occ)) {\r\n            return false;\r\n          }\r\n        }\r\n\r\n        return true;\r\n      };\r\n\r\n      let bestScore = -Infinity;\r\n      let bestPos: { x: number; y: number } | null = null;\r\n\r\n      const step = fixtureWidthPx / 2;\r\n\r\n      for (\r\n        let y = bounds.top;\r\n        y <= bounds.top + bounds.height - gridHeight;\r\n        y += step\r\n      ) {\r\n        for (\r\n          let x = bounds.left;\r\n          x <= bounds.left + bounds.width - gridWidth;\r\n          x += step\r\n        ) {\r\n          if (!gridFits(x, y)) continue;\r\n\r\n          const gridRect = { x, y, w: gridWidth, h: gridHeight };\r\n\r\n          const emptyMargin = this.computeEmptyMargin(\r\n            gridRect,\r\n            bounds,\r\n            occupiedRects,\r\n          );\r\n\r\n          const dx = centerX - (x + gridWidth / 2);\r\n          const dy = centerY - (y + gridHeight / 2);\r\n          const centerPenalty = dx * dx + dy * dy;\r\n\r\n          // Biggest empty space wins, center is a soft stabilizer\r\n          const score = emptyMargin * 1000 - centerPenalty * 0.001;\r\n\r\n          if (score > bestScore) {\r\n            bestScore = score;\r\n            bestPos = { x, y };\r\n          }\r\n        }\r\n      }\r\n\r\n      if (!bestPos) {\r\n        console.warn(\"No valid center-fixture placement found\");\r\n        return;\r\n      }\r\n\r\n      // Assign positions\r\n      fixtures.forEach((fixture: any, index: number) => {\r\n        const row = Math.floor(index / columns);\r\n        const col = index % columns;\r\n\r\n        const x = bestPos!.x + col * fixtureWidthPx;\r\n        const y = bestPos!.y + row * fixtureHeightPx;\r\n\r\n        fixture.relativePosition.x = this.fromPixels(x, \"ft\");\r\n        fixture.relativePosition.y = this.fromPixels(y, \"ft\");\r\n      });\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const a = otherElement.relativePosition.angle;\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawOtherElementsWithLabel(this.canvas, x, y, a, w, h, otherElement);\r\n    }\r\n\r\n    return true;\r\n  }\r\n\r\n  private isPointInsidePolygon(\r\n    point: { x: number; y: number },\r\n    polygon: { x: number; y: number }[],\r\n  ): boolean {\r\n    let inside = false;\r\n\r\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n      const xi = polygon[i].x,\r\n        yi = polygon[i].y;\r\n      const xj = polygon[j].x,\r\n        yj = polygon[j].y;\r\n\r\n      const intersect =\r\n        yi > point.y !== yj > point.y &&\r\n        point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\r\n\r\n      if (intersect) inside = !inside;\r\n    }\r\n\r\n    return inside;\r\n  }\r\n\r\n  private getOccupiedRects(): { x: number; y: number; w: number; h: number }[] {\r\n    return this.canvas.getObjects().map((obj) => {\r\n      const r = obj.getBoundingRect();\r\n      return {\r\n        x: r.left,\r\n        y: r.top,\r\n        w: r.width,\r\n        h: r.height,\r\n      };\r\n    });\r\n  }\r\n\r\n  private rectsOverlap(\r\n    a: { x: number; y: number; w: number; h: number },\r\n    b: { x: number; y: number; w: number; h: number },\r\n  ): boolean {\r\n    return !(\r\n      a.x + a.w <= b.x ||\r\n      a.x >= b.x + b.w ||\r\n      a.y + a.h <= b.y ||\r\n      a.y >= b.y + b.h\r\n    );\r\n  }\r\n\r\n  private computeEmptyMargin(\r\n    gridRect: { x: number; y: number; w: number; h: number },\r\n    bounds: { left: number; top: number; width: number; height: number },\r\n    occupiedRects: { x: number; y: number; w: number; h: number }[],\r\n  ): number {\r\n    let minMargin = Infinity;\r\n\r\n    // distance to layout bounds\r\n    minMargin = Math.min(\r\n      minMargin,\r\n      gridRect.x - bounds.left,\r\n      bounds.left + bounds.width - (gridRect.x + gridRect.w),\r\n      gridRect.y - bounds.top,\r\n      bounds.top + bounds.height - (gridRect.y + gridRect.h),\r\n    );\r\n\r\n    // distance to other objects\r\n    for (const occ of occupiedRects) {\r\n      // horizontal gap\r\n      if (occ.y < gridRect.y + gridRect.h && occ.y + occ.h > gridRect.y) {\r\n        if (occ.x + occ.w <= gridRect.x) {\r\n          minMargin = Math.min(minMargin, gridRect.x - (occ.x + occ.w));\r\n        } else if (occ.x >= gridRect.x + gridRect.w) {\r\n          minMargin = Math.min(minMargin, occ.x - (gridRect.x + gridRect.w));\r\n        }\r\n      }\r\n\r\n      // vertical gap\r\n      if (occ.x < gridRect.x + gridRect.w && occ.x + occ.w > gridRect.x) {\r\n        if (occ.y + occ.h <= gridRect.y) {\r\n          minMargin = Math.min(minMargin, gridRect.y - (occ.y + occ.h));\r\n        } else if (occ.y >= gridRect.y + gridRect.h) {\r\n          minMargin = Math.min(minMargin, occ.y - (gridRect.y + gridRect.h));\r\n        }\r\n      }\r\n    }\r\n\r\n    return minMargin;\r\n  }\r\n\r\n  drawFixtureRowLabel(text: string, x: number, y: number) {\r\n    const label = new fabric.Text(text, {\r\n      left: x,\r\n      top: y,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"600\",\r\n      fill: \"#333\",\r\n      originX: \"left\",\r\n      originY: \"bottom\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(label);\r\n  }\r\n\r\n  async drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    let text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n      strokeUniform: true,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const lockSvgString = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <path d=\"M7 11V7C7 5.67392 7.52678 4.40215 8.46447 3.46447C9.40215 2.52678 10.6739 2 12 2C13.3261 2 14.5979 2.52678 15.5355 3.46447C16.4732 4.40215 17 5.67392 17 7V11M5 11H19C20.1046 11 21 11.8954 21 13V20C21 21.1046 20.1046 22 19 22H5C3.89543 22 3 21.1046 3 20V13C3 11.8954 3.89543 11 5 11Z\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(lockSvgString);\r\n\r\n    let lockSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    const wallCenterX = width / 2;\r\n    const wallCenterY = height / 2;\r\n\r\n    lockSvg.scaleToWidth(20);\r\n    lockSvg.scaleToHeight(20);\r\n\r\n    if (isVertical) {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: -90,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    } else {\r\n      lockSvg.set({\r\n        left: wallCenterX,\r\n        top: wallCenterY,\r\n        angle: 0,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n      });\r\n    }\r\n\r\n    lockSvg.set({\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    lockSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n      elementData.isLocked = !elementData?.isLocked;\r\n      this.renderFloor(false);\r\n    });\r\n\r\n    elements.push(lockSvg);\r\n\r\n    let modCenterX = x;\r\n    let modCenterY = y;\r\n    let angle = elementData.angle;\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: modCenterX,\r\n      top: modCenterY,\r\n      hasControls: true,\r\n      lockScalingX: isVertical,\r\n      lockScalingY: !isVertical,\r\n      selectable: this.layoutForm.enabled,\r\n      evented: true,\r\n      hoverCursor: \"pointer\",\r\n      angle: angle,\r\n      subTargetCheck: true,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n\r\n    // If newly added, focus it once\r\n    if ((elementData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (elementData as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    let fixtureColor: any;\r\n    if ([\"fixture\", \"fixture-redo\"].includes(this.publishingState)) {\r\n      fixtureColor = {\r\n        primary:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#a5a6a8\"\r\n            : fixtureData.status == \"agree\"\r\n              ? \"#6CE9A6\"\r\n              : \"#51C1FF\",\r\n        fill:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#f3f4f8\"\r\n            : fixtureData.status == \"agree\"\r\n              ? \"#6CE9A6\"\r\n              : \"#EAF8FF\",\r\n        vmFill:\r\n          fixtureData.status == \"\" && fixtureData.taskStatus == \"submit\"\r\n            ? \"#a5a6a8\"\r\n            : \"#6938EF\",\r\n      };\r\n    }\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n\r\n    // Resolve the angle the fixture group will render at. For first-render of a\r\n    // CAD-uploaded layout, the wall angle is the source of truth (otherwise we\r\n    // honor the fixture's own saved angle). When that angle lies in the\r\n    // upside-down range (90°, 270°), we flip the fixture body 180° in place so\r\n    // it renders canonical (header at top, storage at bottom). Trade-off: on\r\n    // flipped walls the storage box ends up visually touching the wall instead\r\n    // of the header. Mirrors the same logic in onboard-store-plano.\r\n    let angle = fixtureData?.relativePosition?.angle ?? 0;\r\n    if (this.floorData.cadLayout && fixtureData.fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(\r\n        fixtureData.associatedElementNumber,\r\n      );\r\n      angle = wallData?.angle ?? 0;\r\n    }\r\n    const normAngle = ((((angle as number) % 360) + 360) % 360);\r\n    const shouldFlipBody =\r\n      this.floorData.cadLayout &&\r\n      fixtureData.fixtureType === \"wall\" &&\r\n      normAngle > 90 &&\r\n      normAngle < 270;\r\n\r\n    // To rotate the body 180° while keeping the same on-canvas region, shift\r\n    // the anchor by R(originalAngle)·(width, height) — the canvas position of\r\n    // the un-rotated bbox's bottom-right corner relative to the anchor — and\r\n    // add 180° to the rotation. fabric still pivots around top-left.\r\n    let renderX = x;\r\n    let renderY = y;\r\n    let renderAngle = angle as number;\r\n    if (shouldFlipBody) {\r\n      const rad = ((angle as number) * Math.PI) / 180;\r\n      const cosA = Math.cos(rad);\r\n      const sinA = Math.sin(rad);\r\n      renderX = x + cosA * width - sinA * height;\r\n      renderY = y + sinA * width + cosA * height;\r\n      renderAngle = (angle as number) + 180;\r\n    }\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n        L ${topX + topWidth - radius} ${topY} \r\n        Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n        L ${topX + topWidth} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + innerBoxHeight} \r\n        L ${topX} ${topY + radius} \r\n        Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topFieldText =\r\n      (fixtureData.fixtureType === \"wall\"\r\n        ? `Wall-${fixtureData.associatedElementNumber} - `\r\n        : \"Floor - \") +\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData?.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      }`;\r\n\r\n    const topText = new fabric.Textbox(topFieldText, {\r\n      left: topX + topWidth / 2,\r\n      top: topY + innerBoxHeight / 2,\r\n      fontSize: 5,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      width: topWidth,\r\n      height: innerBoxHeight,\r\n      textAlign: \"center\",\r\n    });\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY} \r\n    L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n    Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n      topX + topWidth - radius\r\n    } ${secondBoxY + innerBoxHeight} \r\n    L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n    Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n      secondBoxY + innerBoxHeight - radius\r\n    } \r\n    L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: \"#344054\",\r\n        stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: fixtureColor?.primary ?? \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n        L ${midX + midWidth - radius} ${firstBoxY} \r\n        Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n          firstBoxY + radius\r\n        } \r\n        L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + boxHeight} \r\n        L ${midX} ${firstBoxY + radius} \r\n        Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      // Wrap text within fixture width and shrink to fit vertical space\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          stroke: fixtureColor?.primary\r\n            ? fixtureColor?.primary\r\n            : fixtureData.issue\r\n              ? \"#D92D20\"\r\n              : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        // L2: Single-line ellipsis against full shelf width\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            stroke: fixtureColor?.primary\r\n              ? fixtureColor?.primary\r\n              : fixtureData.issue\r\n                ? \"#D92D20\"\r\n                : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const finalFontSize = fontSize + 0.5;\r\n          const measureText = (str: string) => {\r\n            const t = new fabric.Text(str, {\r\n              fontSize: finalFontSize,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n            });\r\n            return t.width ?? 0;\r\n          };\r\n\r\n          if (measureText(text) > maxTextWidth) {\r\n            let truncated = text;\r\n            while (truncated.length > 1 && measureText(truncated + '...') > maxTextWidth) {\r\n              truncated = truncated.slice(0, -1);\r\n            }\r\n            const truncatedWidth = measureText(truncated + '...');\r\n            wrappedText = createTextbox(finalFontSize);\r\n            wrappedText.set({ text: truncated + '...', width: truncatedWidth });\r\n            wrappedText.initDimensions();\r\n          }\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const shelfCount = fixtureData?.shelfConfig?.length ?? 0;\r\n        let startPos = vm?.startYPosition;\r\n        let endPos = vm?.endYPosition;\r\n\r\n        if (!startPos && !endPos) {\r\n          if (vm?.xZone === \"stretch\" && vm?.yZone === \"stretch\") {\r\n            startPos = shelfCount;\r\n            endPos = shelfCount;\r\n          } else {\r\n            startPos = 1;\r\n            endPos = shelfCount;\r\n          }\r\n        }\r\n\r\n        const startIndex = startPos - 1;\r\n        const endIndex = endPos - 1;\r\n\r\n        if (startIndex > shelfCount || endIndex > shelfCount) continue;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: fixtureColor?.vmFill ?? \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY} \r\n        L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n        Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n          midX + midWidth - radius\r\n        } ${lastBoxY + boxHeight} \r\n        L ${midX + radius} ${lastBoxY + boxHeight} \r\n        Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n          lastBoxY + boxHeight - radius\r\n        } \r\n        L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureColor?.fill\r\n          ? fixtureColor?.fill\r\n          : fixtureData.issue\r\n            ? \"#FEE4E2\"\r\n            : \"#EAF8FF\",\r\n        stroke: fixtureColor?.primary\r\n          ? fixtureColor?.primary\r\n          : fixtureData.issue\r\n            ? \"#D92D20\"\r\n            : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${\r\n        fixtureData?.fixtureCapacity ?? 0\r\n      } . VM - ${fixtureData?.vmConfig?.length ?? 0}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        height: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const svgString = `\r\n      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n      <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"white\"/>\r\n      <path d=\"M14.9998 6.60001C15.1574 6.44243 15.3445 6.31742 15.5504 6.23214C15.7563 6.14685 15.977 6.10296 16.1998 6.10296C16.4227 6.10296 16.6434 6.14685 16.8492 6.23214C17.0551 6.31742 17.2422 6.44243 17.3998 6.60001C17.5574 6.7576 17.6824 6.94468 17.7677 7.15058C17.853 7.35648 17.8969 7.57715 17.8969 7.80001C17.8969 8.02288 17.853 8.24355 17.7677 8.44945C17.6824 8.65535 17.5574 8.84243 17.3998 9.00001L9.29982 17.1L5.99982 18L6.89982 14.7L14.9998 6.60001Z\" stroke=\"#1D2939\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>`;\r\n\r\n    let loadedSVG: any = await fabric.loadSVGFromString(svgString);\r\n\r\n    let editSvg = fabric.util.groupSVGElements(\r\n      loadedSVG.objects,\r\n      loadedSVG.options,\r\n    );\r\n\r\n    editSvg.set({\r\n      scaleX: 1,\r\n      scaleY: 1,\r\n      left: x + width - 30,\r\n      top: y + 14,\r\n      visible: false,\r\n      selectable: false,\r\n      evented: true, // allow events\r\n      hoverCursor: \"pointer\",\r\n    });\r\n\r\n    editSvg.on(\"mousedown\", (opt) => {\r\n      if (opt && opt.e && opt.e.stopPropagation) {\r\n        opt.e.stopPropagation();\r\n      }\r\n      if (this.layoutForm.disabled) return;\r\n\r\n      if (this.hasUnsavedLayoutChanges()) {\r\n        this.toastService.getErrorToast(\r\n          \"Save your layout changes before editing the fixture\",\r\n        );\r\n        return;\r\n      }\r\n\r\n      this.selectedFixture = {\r\n        fixtureType: fixtureData.fixtureType,\r\n        wallIndex: fixtureData.associatedElementNumber,\r\n        fixtureIndex: fixtureData.associatedElementFixtureNumber,\r\n        fixtureId: fixtureData._id,\r\n      };\r\n\r\n      if (this.selectedFixture.fixtureType === \"wall\") {\r\n        const wall = this.floorData.layoutPolygon.find(\r\n          (wall: any) => wall.elementNumber === this.selectedFixture.wallIndex,\r\n        );\r\n\r\n        const fixture = wall.fixtures.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n        const fixture = this.floorData.centerFixture.find(\r\n          (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n        );\r\n        this.selectedFixtureData = structuredClone(fixture);\r\n      }\r\n      delete this?.selectedFixtureData?.taskType;\r\n      this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n      this.editFixture = true;\r\n    });\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n        editSvg,\r\n      ],\r\n      {\r\n        left: renderX,\r\n        top: renderY,\r\n        evented: true,\r\n        hoverCursor: \"pointer\",\r\n        selectable: this.layoutForm.enabled,\r\n        lockScalingX: true,\r\n        lockScalingY: true,\r\n        subTargetCheck: true,\r\n        angle: renderAngle,\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n      vmConfig: [];\r\n      objType: string;\r\n    };\r\n\r\n    if (\r\n      !fixtureData?.issue &&\r\n      !fixtureData?.unsavedChanges &&\r\n      this.layoutForm.enabled\r\n    ) {\r\n      fixtureGroup.on(\"mouseover\", function () {\r\n        editSvg.set(\"visible\", true);\r\n        canvas.renderAll();\r\n      });\r\n      fixtureGroup.on(\"mouseout\", function () {\r\n        editSvg.set(\"visible\", false);\r\n        canvas.renderAll();\r\n      });\r\n    }\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      if (this.layoutForm.disabled) {\r\n        this.togglePanel(\"right\", false);\r\n      } else {\r\n        this.highlightFixtureInAccordion(fixtureData);\r\n      }\r\n\r\n      this.highlightFixture(target);\r\n      this.selectFixtureOnCanvasClick(target, true);\r\n      this.selectedFixture.fixtureData = fixtureData;\r\n    });\r\n\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n    fixtureGroup.vmConfig = fixtureData.vmConfig;\r\n    fixtureGroup.objType = \"fixture\";\r\n\r\n    // this.canvas.on(\"object:moving\", (e) => {\r\n    //   const target = e.target as any;\r\n    //   if (!target || target.objType !== \"fixture\") return;\r\n\r\n    //   const angleDeg = target.angle || 0;\r\n    //   const angle = (angleDeg * Math.PI) / 180;\r\n    //   if (!target._lastLeft) {\r\n    //     target._lastLeft = target.left;\r\n    //     target._lastTop = target.top;\r\n    //   }\r\n    //   const dx = target.left - target._lastLeft;\r\n    //   const dy = target.top - target._lastTop;\r\n    //   const projected = dx * Math.cos(angle) + dy * Math.sin(angle);\r\n    //   target.left = target._lastLeft + projected * Math.cos(angle);\r\n    //   target.top = target._lastTop + projected * Math.sin(angle);\r\n    //   target._lastLeft = target.left;\r\n    //   target._lastTop = target.top;\r\n    // });\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    // If newly added, focus it once\r\n    if ((fixtureData as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(fixtureGroup);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (fixtureData as any).newAdded;\r\n    }\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n    const angle = this.floorData?.cadLayout ? 0 : elementData.angle;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: this.layoutForm.enabled,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  drawOtherElementsWithLabel(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    a: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: a,\r\n      selectable: this.layoutForm.enabled,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    if ((element as any)?.newAdded) {\r\n      try {\r\n        this.canvas.setActiveObject(group);\r\n        this.canvas.requestRenderAll();\r\n      } catch {}\r\n      delete (element as any).newAdded;\r\n    }\r\n\r\n    return group;\r\n  }\r\n\r\n  drawBg() {\r\n    const wall1 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 1 && e.elementType === \"wall\",\r\n    );\r\n    const wall2 = this.floorData.layoutPolygon.find(\r\n      (e: any) => e.elementNumber === 2 && e.elementType === \"wall\",\r\n    );\r\n    const width = this.toPixels(wall1.distance, wall1.unit);\r\n    const height = this.toPixels(wall2.distance, wall2.unit);\r\n\r\n    const bg = new fabric.Rect({\r\n      left: this.wallThickness,\r\n      top: this.wallThickness,\r\n      width: width,\r\n      height: height,\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    this.canvas.add(bg);\r\n    this.canvas.remove(bg);\r\n    this.canvas.insertAt(0, bg);\r\n    this.canvas.renderAll();\r\n  }\r\n\r\n  // getFixtureMetaToRender(fixture: any, wallData: any) {\r\n\r\n  //   return {\r\n  //     x,\r\n  //     y,\r\n  //     fixtureHeight,\r\n  //     fixtureWidth,\r\n  //   };\r\n  // }\r\n\r\n  subscribeToFixtureConfigIdChanges() {\r\n    this.fixtureConfigSubscriptions.forEach((sub) => sub.unsubscribe());\r\n    this.fixtureConfigSubscriptions = [];\r\n\r\n    this.getFormWalls.controls.forEach((control, i) => {\r\n      const wallGroup = control as FormGroup;\r\n      const fixturesArray = wallGroup.get(\"fixtures\") as FormArray;\r\n\r\n      fixturesArray.controls.forEach((fixtureControl, j) => {\r\n        const fixtureGroup = fixtureControl as FormGroup;\r\n        const sub = fixtureGroup\r\n          .get(\"fixtureConfigId\")\r\n          ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n          .subscribe((newValue) => {\r\n            this.changeFixtureTemplate(newValue, \"wall\", j, i);\r\n          });\r\n\r\n        if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n      });\r\n    });\r\n\r\n    this.getFormFloorFixtures.controls.forEach((fixtureControl, k) => {\r\n      const fixtureGroup = fixtureControl as FormGroup;\r\n      const sub = fixtureGroup\r\n        .get(\"fixtureConfigId\")\r\n        ?.valueChanges.pipe(takeUntil(this.destroy$))\r\n        .subscribe((newValue) => {\r\n          this.changeFixtureTemplate(newValue, \"floor\", k);\r\n        });\r\n\r\n      if (sub) this.fixtureConfigSubscriptions.push(sub);\r\n    });\r\n  }\r\n\r\n  subscribeToOtherElementsChanges() {\r\n    this.otherElementsSubscriptions.forEach((sub) => sub?.unsubscribe());\r\n    this.otherElementsSubscriptions = [];\r\n\r\n    // Wall-level otherElements label subscriptions\r\n    this.getFormWalls.controls.forEach((control) => {\r\n      const wallGroup = control as FormGroup;\r\n      const otherArray = wallGroup.get(\"otherElements\") as FormArray;\r\n\r\n      otherArray.controls.forEach((ctrl, otherIdx) => {\r\n        const elementGroup = ctrl as FormGroup;\r\n        const typeControl = elementGroup.get(\"type\") as FormControl;\r\n        const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n\r\n        const wallMeta = this.floorData.layoutPolygon.find(\r\n          (el: any) =>\r\n            el.elementType === wallGroup.get(\"elementType\")?.value &&\r\n            el.elementNumber === wallGroup.get(\"elementNumber\")?.value,\r\n        );\r\n        const elementRef = wallMeta?.otherElements?.[otherIdx];\r\n        if (!elementRef) return;\r\n\r\n        // when type changes (dropdown)\r\n        const subType = typeControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((selected: string) => {\r\n            // if user picks \"Others\", prefer customName if present, otherwise set fixtureName to \"Others\"\r\n            elementRef.fixtureName =\r\n              selected === \"Others\"\r\n                ? customNameControl?.value || \"Others\"\r\n                : selected;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          });\r\n\r\n        // when customName changes (text input visible only when type === 'Others')\r\n        const subCustom = customNameControl.valueChanges\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe((custom: string) => {\r\n            if (typeControl.value === \"Others\") {\r\n              elementRef.fixtureName = custom;\r\n              this.updateCanvasOtherElementLabel(elementRef);\r\n            }\r\n          });\r\n\r\n        this.otherElementsSubscriptions.push(subType, subCustom);\r\n      });\r\n    });\r\n\r\n    // Floor-level otherElements label subscriptions\r\n    this.getFormFloorOtherElements.controls.forEach((ctrl, idx) => {\r\n      const elementGroup = ctrl as FormGroup;\r\n      const typeControl = elementGroup.get(\"type\") as FormControl;\r\n      const customNameControl = elementGroup.get(\"customName\") as FormControl;\r\n      const elementRef = this.floorData?.otherElements?.[idx];\r\n      if (!elementRef) return;\r\n\r\n      const subType = typeControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((selected: string) => {\r\n          elementRef.fixtureName =\r\n            selected === \"Others\"\r\n              ? customNameControl?.value || \"Others\"\r\n              : selected;\r\n          this.updateCanvasOtherElementLabel(elementRef);\r\n        });\r\n\r\n      const subCustom = customNameControl.valueChanges\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe((custom: string) => {\r\n          if (typeControl.value === \"Others\") {\r\n            elementRef.fixtureName = custom;\r\n            this.updateCanvasOtherElementLabel(elementRef);\r\n          }\r\n        });\r\n\r\n      this.otherElementsSubscriptions.push(subType, subCustom);\r\n    });\r\n  }\r\n\r\n  updateCanvasOtherElementLabel(elementRef: any) {\r\n    if (!this.canvas) return;\r\n    const group = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj?.objType === \"others\" && obj?.data._id === elementRef._id,\r\n      ) as any;\r\n\r\n    if (!group) return;\r\n    group.data = elementRef;\r\n\r\n    const textObj = (group.getObjects() || []).find(\r\n      (o: any) => o?.type === \"text\" || o?.type === \"textbox\",\r\n    ) as fabric.Text | fabric.Textbox | undefined;\r\n\r\n    if (textObj) {\r\n      (textObj as any).set({ text: elementRef.fixtureName });\r\n      this.canvas.requestRenderAll();\r\n    }\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  selectFixtureOnCanvasClick(target: any, collapseTaskInfo: boolean = false) {\r\n    if (target) {\r\n      this.selectedFixture = {\r\n        fixtureType: target.fixtureType,\r\n        wallIndex: target.wallIndex,\r\n        fixtureIndex: target.fixtureIndex,\r\n        fixtureId: target.fixtureId,\r\n        issue: target.issue,\r\n        issueData: target.issueData,\r\n        vmConfig: target.vmConfig,\r\n      };\r\n\r\n      this.selectFixtureFeedback(\r\n        this.selectedFixture.fixtureId,\r\n        collapseTaskInfo,\r\n      );\r\n    }\r\n  }\r\n\r\n  selectFixtureFeedback(fixtureId: string, collapseTaskInfo: boolean = false) {\r\n    const currentFixtureFeedback = this.storeFeedback.fixtureData.find(\r\n      (fb: any) => fb.fixtureId === fixtureId,\r\n    );\r\n\r\n    const rawFixture = structuredClone(\r\n      this.allFixtureInstances.find((fi: any) => fi._id === fixtureId),\r\n    );\r\n\r\n    if (currentFixtureFeedback) {\r\n      this.selectedFixtureFeedback = {\r\n        globalComments: this.storeFeedback.fixtureComment,\r\n        fixtureFeedback: {\r\n          ...currentFixtureFeedback,\r\n          FixtureData: rawFixture,\r\n        },\r\n        taskInfoToggle: collapseTaskInfo,\r\n      };\r\n    } else {\r\n      this.selectedFixtureFeedback = {\r\n        globalComments: [],\r\n        fixtureFeedback: {\r\n          fixtureId: fixtureId,\r\n          FixtureData: rawFixture,\r\n          fixtureAIData: null,\r\n        },\r\n        taskInfoToggle: collapseTaskInfo,\r\n      };\r\n    }\r\n\r\n    this.selectZoneFeedback(fixtureId);\r\n  }\r\n\r\n  async getFixtureTemplates(): Promise<void> {\r\n    const payload = {\r\n      clientId: this.clientId,\r\n    };\r\n\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getAllTemplates(payload),\r\n      );\r\n      const data = res?.data;\r\n\r\n      if (data) {\r\n        this.fixtureTemplates = data.map((t: any) => {\r\n          return {\r\n            _id: t._id,\r\n            name: t.fixtureName.includes(\"-ft\")\r\n              ? t.fixtureName\r\n              : `${t.fixtureName} - ${t.fixtureWidth.value} ${t.fixtureWidth.unit}`,\r\n            subtext: `${t.productBrandName?.join(\", \")}`,\r\n          };\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Error fetching fixture templates:\", error);\r\n    }\r\n  }\r\n\r\n  createForm() {\r\n    this.layoutForm = this.fb.group({\r\n      walls: this.fb.array([]),\r\n      floorFixtures: this.fb.array([]),\r\n      floorOtherElements: this.fb.array([]),\r\n    });\r\n  }\r\n\r\n  get getFormWalls() {\r\n    return this.layoutForm.get(\"walls\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorFixtures() {\r\n    return this.layoutForm.get(\"floorFixtures\") as FormArray;\r\n  }\r\n\r\n  get getFormFloorOtherElements() {\r\n    return this.layoutForm.get(\"floorOtherElements\") as FormArray;\r\n  }\r\n\r\n  get getEntrances() {\r\n    return this.floorData?.layoutPolygon?.filter(\r\n      (ele: any) => ele.elementType === \"entrance\",\r\n    );\r\n  }\r\n\r\n  get showFixturePreview() {\r\n    return (\r\n      this.publishingState === \"fixture\" &&\r\n      !this.disabledPublish &&\r\n      !this.editFixture\r\n    );\r\n  }\r\n\r\n  getWallOtherElements(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"otherElements\") as FormArray;\r\n  }\r\n\r\n  getFormFixtures(wallIndex: number) {\r\n    return (this.layoutForm.get(\"walls\") as FormArray)\r\n      .at(wallIndex)\r\n      .get(\"fixtures\") as FormArray;\r\n  }\r\n\r\n  patchWallElements({ elementType, elementNumber }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      elementType: [elementType ? elementType : \"\", [Validators.required]],\r\n      elementNumber: [elementNumber ? elementNumber : 0, [Validators.required]],\r\n      fixtures: this.fb.array([]),\r\n      otherElements: this.fb.array([]),\r\n    });\r\n    return item;\r\n  }\r\n\r\n  patchFixture({ fixtureName, fixtureConfigId, _id }: Record<string, any>) {\r\n    const item = this.fb.group({\r\n      fixtureName: [fixtureName ? fixtureName : \"\", [Validators.required]],\r\n      fixtureConfigId: [\r\n        fixtureConfigId ? fixtureConfigId : \"\",\r\n        [Validators.required],\r\n      ],\r\n      _id: [_id ? _id : \"\", [Validators.required]],\r\n    });\r\n    return item;\r\n  }\r\n\r\n  addWallSpace(wallIndex: number, operation: \"increment\" | \"decrement\") {\r\n    if (this.layoutForm.disabled) return;\r\n    const clickedWallNumber = wallIndex + 1;\r\n    const mmToFeet = 305;\r\n    const fixtureHeight = 1524 / mmToFeet; // ~5 ft (horizontal increment)\r\n    const fixtureWidth = 1220 / mmToFeet; // ~4 ft (vertical increment)\r\n\r\n    const layout = this.floorData.layoutPolygon;\r\n\r\n    const getWall = (num: number) =>\r\n      layout.find(\r\n        (el: any) => el.elementType === \"wall\" && el.elementNumber === num,\r\n      );\r\n\r\n    const amount = operation === \"increment\" ? 1 : -1;\r\n\r\n    const w1 = getWall(1);\r\n    const w2 = getWall(2);\r\n    const w3 = getWall(3);\r\n    const w4 = getWall(4);\r\n    const w5 = getWall(5);\r\n    const entrance = layout.find((el: any) => el.elementType === \"entrance\");\r\n\r\n    // ----------------------------------------------\r\n    // Horizontal growth  (Wall-1 / Wall-3)\r\n    // ----------------------------------------------\r\n    if (clickedWallNumber === 1 || clickedWallNumber === 3) {\r\n      if (w1) w1.distance += amount * fixtureWidth;\r\n      if (w3) w3.distance += amount * fixtureWidth;\r\n\r\n      if (w2) {\r\n        w2.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.x =\r\n            (fx.relativePosition.x || 0) + amount * fixtureWidth;\r\n        });\r\n      }\r\n    }\r\n\r\n    // ----------------------------------------------\r\n    // Vertical growth  (Wall-2 / Wall-4 / Wall-5)\r\n    // ----------------------------------------------\r\n    if (\r\n      clickedWallNumber === 2 ||\r\n      clickedWallNumber === 4 ||\r\n      clickedWallNumber === 5\r\n    ) {\r\n      if (w2) w2.distance += amount * fixtureHeight;\r\n\r\n      if (w3) {\r\n        w3.fixtures.forEach((fx: any) => {\r\n          fx.relativePosition.y =\r\n            (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n        });\r\n      }\r\n\r\n      const entranceY = entrance?.distance || 0;\r\n      const existingW4 = w4?.distance || 0;\r\n      const existingW5 = w5?.distance || 0;\r\n\r\n      // Grow wall-4 if we clicked wall-4 OR wall-2\r\n      if ((clickedWallNumber === 4 || clickedWallNumber === 2) && w4) {\r\n        w4.distance = this.roundToTwo(existingW4 + amount * fixtureHeight);\r\n      }\r\n\r\n      // Grow wall-5 if we clicked wall-5 OR wall-2\r\n      if ((clickedWallNumber === 5 || clickedWallNumber === 2) && w5) {\r\n        w5.distance = this.roundToTwo(existingW5 + amount * fixtureHeight);\r\n\r\n        if (w4) {\r\n          w4.fixtures.forEach((fx: any) => {\r\n            fx.relativePosition.y =\r\n              (fx.relativePosition.y || 0) + amount * fixtureHeight;\r\n          });\r\n        }\r\n      }\r\n\r\n      // Prevent overflow: shrink back if total > w2 size\r\n      const totalUsed = entranceY + (w4?.distance || 0) + (w5?.distance || 0);\r\n      if (totalUsed > w2!.distance) {\r\n        if (w5) {\r\n          w5.distance = this.roundToTwo(\r\n            w5.distance - (totalUsed - w2!.distance),\r\n          );\r\n        }\r\n      }\r\n    }\r\n\r\n    this.renderFloor(false);\r\n  }\r\n\r\n  deleteFixture(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      this.getFormFixtures(wallIndex!).removeAt(fixtureIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.fixtures)) {\r\n        wall.fixtures.splice(fixtureIndex, 1);\r\n      }\r\n    } else if (fixtureType === \"floor\") {\r\n      this.getFormFloorFixtures.removeAt(fixtureIndex);\r\n\r\n      if (Array.isArray(this.floorData.centerFixture)) {\r\n        this.floorData.centerFixture.splice(fixtureIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  // Returns true if the layout has pending changes the user must save before\r\n  // they can edit an individual fixture. Set by all layout mutation handlers\r\n  // (add / delete / move / template change), cleared on successful save.\r\n  private hasUnsavedLayoutChanges(): boolean {\r\n    if (this.layoutHasUnsavedChanges) return true;\r\n    const wallFixtures = (this.floorData?.layoutPolygon ?? []).flatMap(\r\n      (el: any) => el?.fixtures ?? [],\r\n    );\r\n    const floorFixtures = this.floorData?.centerFixture ?? [];\r\n    return [...wallFixtures, ...floorFixtures].some(\r\n      (f: any) => f?.unsavedChanges,\r\n    );\r\n  }\r\n\r\n  removeOtherElement(\r\n    elementType: \"wall\" | \"floor\",\r\n    elementIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    if (elementType === \"wall\") {\r\n      this.getWallOtherElements(wallIndex!).removeAt(elementIndex);\r\n\r\n      const wall = this.getWallByNumber(wallIndex! + 1);\r\n      if (wall && Array.isArray(wall.otherElements)) {\r\n        wall.otherElements.splice(elementIndex, 1);\r\n      }\r\n    } else if (elementType === \"floor\") {\r\n      this.getFormFloorOtherElements.removeAt(elementIndex);\r\n\r\n      if (Array.isArray(this.floorData.otherElements)) {\r\n        this.floorData.otherElements.splice(elementIndex, 1);\r\n      }\r\n    }\r\n\r\n    this.layoutHasUnsavedChanges = true;\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n  }\r\n\r\n  changeFixtureTemplate(\r\n    configId: string,\r\n    fixtureType: \"wall\" | \"floor\",\r\n    fixtureIndex: number,\r\n    wallIndex?: number,\r\n  ) {\r\n    this.apiService\r\n      .getFixtureTemplate(configId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (fixtureType === \"wall\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            this.getFormFixtures(wallIndex!).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            const wallRef = this.getWallByNumber(wallIndex! + 1)!;\r\n            wallRef.fixtures[fixtureIndex] = {\r\n              ...wallRef.fixtures[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          } else if (fixtureType === \"floor\") {\r\n            const templateData = res.data;\r\n            const fixtureId = `new-${crypto.randomUUID()}`;\r\n            const fixtureGroup = this.patchFixture({\r\n              fixtureName: templateData.fixtureName,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            });\r\n            (this.layoutForm.get(\"floorFixtures\") as FormArray).setControl(\r\n              fixtureIndex,\r\n              fixtureGroup,\r\n            );\r\n            const fixtureData = {\r\n              ...templateData,\r\n              fixtureConfigId: templateData._id,\r\n              _id: fixtureId,\r\n            };\r\n            this.floorData.centerFixture[fixtureIndex] = {\r\n              ...this.floorData.centerFixture[fixtureIndex],\r\n              ...fixtureData,\r\n              unsavedChanges: true,\r\n            };\r\n            this.layoutHasUnsavedChanges = true;\r\n          }\r\n\r\n          this.renderFloor(false);\r\n          this.publishingState = \"layout\";\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to fetch templates\");\r\n        },\r\n      });\r\n  }\r\n\r\n  onDrop(\r\n    event: any,\r\n    destinationWallIndex: number | \"floor\",\r\n    destinationFixtureIndex?: number,\r\n  ) {\r\n    const data = event.data;\r\n\r\n    if (this.layoutForm.disabled) return;\r\n    const isSourceFloor = data.wallIndex === \"floor\";\r\n    const isDestinationFloor = destinationWallIndex === \"floor\";\r\n\r\n    const sourceFormArray: FormArray = isSourceFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(data.wallIndex);\r\n\r\n    const destinationFormArray: FormArray = isDestinationFloor\r\n      ? this.getFormFloorFixtures\r\n      : this.getFormFixtures(destinationWallIndex as number);\r\n\r\n    const sourceWallMeta = isSourceFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls.at(data.wallIndex).get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const destinationWallMeta = isDestinationFloor\r\n      ? this.floorData.centerFixture\r\n      : (this.getWallByNumber(\r\n          this.getFormWalls\r\n            .at(destinationWallIndex as number)\r\n            .get(\"elementNumber\")?.value,\r\n        )?.fixtures ?? []);\r\n\r\n    const sFixtureIndex = sourceWallMeta.findIndex(\r\n      (fixture: any) =>\r\n        fixture._id ===\r\n        sourceFormArray.at(data.fixtureIndex)?.get(\"_id\")?.value,\r\n    );\r\n\r\n    const dFixtureIndex =\r\n      destinationFixtureIndex !== undefined\r\n        ? destinationWallMeta.findIndex(\r\n            (fixture: any) =>\r\n              fixture._id ===\r\n              destinationFormArray.at(destinationFixtureIndex)?.get(\"_id\")\r\n                ?.value,\r\n          )\r\n        : destinationFormArray.length;\r\n\r\n    const sPosition = {\r\n      fixtureNumber: sourceWallMeta[sFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n    const dPosition = {\r\n      fixtureNumber: destinationWallMeta[dFixtureIndex].fixtureNumber,\r\n      associatedElementFixtureNumber:\r\n        destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber,\r\n    };\r\n\r\n    if (sourceWallMeta === destinationWallMeta) {\r\n      destinationWallMeta[dFixtureIndex].fixtureNumber =\r\n        sPosition.fixtureNumber;\r\n      destinationWallMeta[dFixtureIndex].associatedElementFixtureNumber =\r\n        sPosition.associatedElementFixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    } else {\r\n      sourceWallMeta[sFixtureIndex].fixtureNumber = dPosition.fixtureNumber;\r\n      sourceWallMeta[sFixtureIndex].associatedElementFixtureNumber =\r\n        dPosition.associatedElementFixtureNumber;\r\n    }\r\n\r\n    this.transferArrayItem(\r\n      sourceFormArray.controls,\r\n      destinationFormArray.controls,\r\n      data.fixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.transferArrayItem(\r\n      sourceWallMeta,\r\n      destinationWallMeta,\r\n      sFixtureIndex,\r\n      dFixtureIndex,\r\n    );\r\n\r\n    this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 2,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  // downloadCanvas() {\r\n  //   if (!this.canvas) return;\r\n\r\n  //   const originalViewport = [\r\n  //     ...this.canvas.viewportTransform!,\r\n  //   ] as fabric.TMat2D;\r\n  //   this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n  //   const bounds = this.getFullLayoutBounds();\r\n\r\n  //   const bg = this.createExportLayoutBackground();\r\n  //   this.canvas.insertAt(0, bg);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const dataURL = this.canvas.toDataURL({\r\n  //     format: \"png\",\r\n  //     left: bounds.left,\r\n  //     top: bounds.top,\r\n  //     width: bounds.width,\r\n  //     height: bounds.height,\r\n  //     multiplier: 2,\r\n  //   });\r\n\r\n  //   this.canvas.remove(bg);\r\n  //   this.canvas.setViewportTransform(originalViewport);\r\n  //   this.canvas.renderAll();\r\n\r\n  //   const link = document.createElement(\"a\");\r\n  //   link.href = dataURL;\r\n  //   link.download = `${this.planoData.storeName}_${this.floorData.floorName}.png`;\r\n  //   link.click();\r\n  // }\r\n\r\n  private createExportLayoutBackground() {\r\n    const points = this.buildLayoutPolygonFromWalls();\r\n\r\n    return new fabric.Polygon(points, {\r\n      fill: \"#eaecf0\",\r\n      selectable: false,\r\n      evented: false,\r\n      objectCaching: false,\r\n    });\r\n  }\r\n\r\n  private buildLayoutPolygonFromWalls() {\r\n    return this.floorData.layoutPolygon\r\n      .filter((w: any) => w.elementType === \"wall\")\r\n      .map((w: any) => ({\r\n        x: this.toPixels(w.relativePosition.x, \"ft\"),\r\n        y: this.toPixels(w.relativePosition.y, \"ft\"),\r\n      }));\r\n  }\r\n\r\n  async handleFeedbackAction(userAction: any) {\r\n    if (userAction?.taskType === \"zoneVerification\") {\r\n      return this.handleZoneFeedbackAction(userAction);\r\n    }\r\n\r\n    this.editFromTab = \"fixture\";\r\n\r\n    try {\r\n      let targetFixture: any = {\r\n        ...(this.floorData.layoutPolygon\r\n          .flatMap((p: any) => p.fixtures)\r\n          .concat(this.floorData.centerFixture)\r\n          .find((f: any) => f._id === this.selectedFixture.fixtureId) || null),\r\n        userAction: userAction.action,\r\n      };\r\n\r\n      this.selectedFixtureData = { ...targetFixture };\r\n\r\n      // editWithAi / editWithPlano — open the edit panel, no API calls\r\n      if (\r\n        userAction.action === \"editWithAi\" ||\r\n        userAction.action === \"editWithPlano\"\r\n      ) {\r\n        if (userAction.action === \"editWithAi\") {\r\n          targetFixture = this.mergeAiFixtureData(targetFixture, userAction.fixtureData);\r\n        }\r\n\r\n        this.selectedFixtureData = {\r\n          ...targetFixture,\r\n          taskType: \"fixture\",\r\n        };\r\n\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n\r\n        this.editFixture = true;\r\n        setTimeout(() => {\r\n          this.editFixtureSection = userAction?.tab ?? \"basic-details\";\r\n          this.cd.detectChanges();\r\n        }, 100);\r\n\r\n        return;\r\n      }\r\n\r\n      const answerId = userAction.feedback?.answers?.[0]?._id;\r\n      if (!answerId) return;\r\n\r\n      // acceptAi / keepPlano — merge fixture data and save\r\n      if (userAction.action === \"acceptAi\") {\r\n        targetFixture = this.mergeAiFixtureData(targetFixture, userAction.fixtureData);\r\n      }\r\n\r\n      if (userAction.action === \"keepPlano\") {\r\n        const currentLabel = targetFixture.header?.label;\r\n        targetFixture = {\r\n          ...targetFixture,\r\n          ...userAction.fixtureData,\r\n          header: {\r\n            ...targetFixture.header,\r\n            ...userAction.fixtureData?.header,\r\n          },\r\n        };\r\n        if (!targetFixture.header?.label?.trim()) {\r\n          targetFixture.header.label = currentLabel;\r\n        }\r\n      }\r\n\r\n      // Step 1: Update fixture data (skip for redo — only status update needed)\r\n      if (userAction.action !== \"redo\") {\r\n        await firstValueFrom(\r\n          this.apiService.updateStoreFixture({\r\n            fixtureId: this.selectedFixture.fixtureId,\r\n            data: targetFixture,\r\n            taskType: \"fixture\",\r\n          }),\r\n        );\r\n      }\r\n\r\n      // Step 2: Update compliance status\r\n      const feedback = userAction.feedback;\r\n      const payload = {\r\n        _id: feedback._id,\r\n        answerId: answerId,\r\n        type: userAction.type,\r\n        userAction: userAction.action,\r\n        comments: userAction.remarks,\r\n        taskType: userAction.taskType,\r\n        planoId: userAction.planoId,\r\n        floorId: userAction.floorId,\r\n      };\r\n\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.updateFixtureComplianceStatus(payload),\r\n      );\r\n\r\n      if (!res && userAction.type != \"agree\") {\r\n        return;\r\n      }\r\n\r\n      // Step 3: Refresh\r\n      this.createForm();\r\n      await this.getStoreFixtures(this.planoData._id);\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\"Failed to execute user action\");\r\n    }\r\n  }\r\n\r\n  private mergeAiFixtureData(targetFixture: any, fixtureData: any): any {\r\n    const currentLabel = targetFixture.header?.label;\r\n\r\n    const merged = {\r\n      ...targetFixture,\r\n      ...fixtureData,\r\n      header: {\r\n        ...targetFixture.header,\r\n        ...fixtureData?.header,\r\n      },\r\n    };\r\n\r\n    const aiLabel = fixtureData?.header?.label?.trim();\r\n    if (!aiLabel || aiLabel.toLowerCase().includes(\"header not identified\")) {\r\n      merged.header.label = currentLabel;\r\n    }\r\n\r\n    return merged;\r\n  }\r\n\r\n  private replaceFixtureInFloorData(fixtureId: string, mergedFixture: any) {\r\n    if (!this.floorData) return;\r\n    const replaceInArray = (arr: any[] | undefined) => {\r\n      if (!Array.isArray(arr)) return false;\r\n      const idx = arr.findIndex((f: any) => f?._id === fixtureId);\r\n      if (idx >= 0) {\r\n        arr[idx] = { ...arr[idx], ...mergedFixture, _id: arr[idx]._id };\r\n        return true;\r\n      }\r\n      return false;\r\n    };\r\n\r\n    if (Array.isArray(this.floorData.layoutPolygon)) {\r\n      for (const lp of this.floorData.layoutPolygon) {\r\n        if (replaceInArray(lp?.fixtures)) return;\r\n      }\r\n    }\r\n    replaceInArray(this.floorData.centerFixture);\r\n  }\r\n\r\n  private buildLocalActionComment(\r\n    responsetype: string,\r\n    comment: string | null | undefined,\r\n  ): any {\r\n    let userData: any = {};\r\n    try {\r\n      const raw = localStorage.getItem(\"user-info\");\r\n      if (raw) userData = JSON.parse(raw);\r\n    } catch {\r\n      userData = {};\r\n    }\r\n    return {\r\n      userId: userData?._id,\r\n      userName: userData?.userName,\r\n      role: userData?.role,\r\n      responsetype,\r\n      comment: comment ?? null,\r\n      timeStamp: new Date(),\r\n    };\r\n  }\r\n\r\n  // Zone-verification merge: overlay only header.label, templateGroupName, and per-zone\r\n  // productBrandName from the response onto the existing template.\r\n  private mergeZoneFixtureData(targetFixture: any, responseFixture: any): any {\r\n    const merged = structuredClone(targetFixture);\r\n\r\n    const responseLabel = responseFixture?.header?.label?.trim();\r\n    if (responseLabel) {\r\n      merged.header = { ...(merged.header ?? {}), label: responseLabel };\r\n    }\r\n\r\n    const responseTemplateGroupName = responseFixture?.templateGroupName?.trim();\r\n    if (responseTemplateGroupName) {\r\n      merged.templateGroupName = responseTemplateGroupName;\r\n    }\r\n\r\n    const zoneToBrand = new Map<string, string[]>();\r\n    (responseFixture?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      const brand = shelf?.productBrandName;\r\n      if (!zone || !Array.isArray(brand) || brand.length === 0) return;\r\n      if (!zoneToBrand.has(zone)) {\r\n        zoneToBrand.set(zone, brand);\r\n      }\r\n    });\r\n\r\n    (merged.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const brand = shelf?.zone ? zoneToBrand.get(shelf.zone) : null;\r\n      if (brand) {\r\n        shelf.productBrandName = [...brand];\r\n      }\r\n    });\r\n\r\n    return merged;\r\n  }\r\n\r\n  async handleZoneFeedbackAction(userAction: any) {\r\n    try {\r\n      const fixtureId = this.selectedFixture?.fixtureId;\r\n      if (!fixtureId) return;\r\n\r\n      const fixtureIndex = this.allFixtureInstances.findIndex(\r\n        (f: any) => f._id === fixtureId,\r\n      );\r\n      if (fixtureIndex < 0) return;\r\n\r\n      const baseFixture = structuredClone(\r\n        this.allFixtureInstances[fixtureIndex],\r\n      );\r\n\r\n      // editWithResponse: open the edit panel pre-populated with merged data\r\n      if (userAction.action === \"editWithResponse\") {\r\n        this.editFromTab = \"zone\";\r\n        const merged = this.mergeZoneFixtureData(\r\n          baseFixture,\r\n          userAction.fixtureData,\r\n        );\r\n        this.selectedFixtureData = {\r\n          ...merged,\r\n          userAction: userAction.action,\r\n          taskType: \"zoneVerification\",\r\n        };\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n        this.editFixture = true;\r\n        setTimeout(() => {\r\n          this.editFixtureSection = \"basic-details\";\r\n          this.cd.detectChanges();\r\n        }, 100);\r\n        return;\r\n      }\r\n\r\n      const answerId = userAction.feedback?.answers?.[0]?._id;\r\n      const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n      if (!answerId || !taskId) return;\r\n\r\n      // redo: don't touch the planoFixture — only record the rejection on the compliance doc\r\n      // so the redo round can re-collect this fixture's response from mobile.\r\n      if (userAction.action === \"redo\") {\r\n        await firstValueFrom(\r\n          this.apiService.updateZoneVerificationStatus({\r\n            _id: userAction.feedback._id,\r\n            answerId,\r\n            taskId,\r\n            type: userAction.type,\r\n            userAction: userAction.action,\r\n            comments: userAction.remarks,\r\n          }),\r\n        );\r\n\r\n        const zoneRowsRedo = this.zoneFeedback?.zoneVerificationData ?? [];\r\n        const zoneRowRedo = zoneRowsRedo.find(\r\n          (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n        );\r\n        if (zoneRowRedo?.answers?.[0]) {\r\n          zoneRowRedo.answers[0].userAction = userAction.action;\r\n          zoneRowRedo.answers[0].status = userAction.type;\r\n          const ans = zoneRowRedo.answers[0];\r\n          ans.comments = ans.comments ?? [];\r\n          ans.comments.push(\r\n            this.buildLocalActionComment(userAction.type, userAction.remarks),\r\n          );\r\n        }\r\n        this.selectFixtureFeedback(fixtureId);\r\n        return;\r\n      }\r\n\r\n      // keepPlano / acceptResponse / editAccepted: build merged fixture and persist\r\n      let mergedFixture = baseFixture;\r\n      if (\r\n        userAction.action === \"acceptResponse\" ||\r\n        userAction.action === \"editAccepted\"\r\n      ) {\r\n        mergedFixture = this.mergeZoneFixtureData(\r\n          baseFixture,\r\n          userAction.fixtureData,\r\n        );\r\n      }\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateStoreFixture({\r\n          fixtureId,\r\n          data: mergedFixture,\r\n          taskType: \"zoneVerification\",\r\n        }),\r\n      );\r\n\r\n      const modifiedAnswer =\r\n        userAction.action === \"editAccepted\"\r\n          ? this.buildZoneModifiedAnswer(userAction.fixtureData)\r\n          : null;\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateZoneVerificationStatus({\r\n          _id: userAction.feedback._id,\r\n          answerId,\r\n          taskId,\r\n          type: userAction.type,\r\n          userAction: userAction.action,\r\n          comments: userAction.remarks,\r\n          ...(modifiedAnswer ? { modifiedAnswer } : {}),\r\n        }),\r\n      );\r\n\r\n      // Local state update — keep UI in sync without re-fetching.\r\n      this.allFixtureInstances[fixtureIndex] = mergedFixture;\r\n      this.replaceFixtureInFloorData(fixtureId, mergedFixture);\r\n      this.renderFloor(false);\r\n\r\n      const zoneRows = this.zoneFeedback?.zoneVerificationData ?? [];\r\n      const zoneRow = zoneRows.find(\r\n        (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n      );\r\n      if (zoneRow?.answers?.[0]) {\r\n        zoneRow.answers[0].userAction = userAction.action;\r\n        zoneRow.answers[0].status = userAction.type;\r\n        const ans = zoneRow.answers[0];\r\n        ans.comments = ans.comments ?? [];\r\n        ans.comments.push(\r\n          this.buildLocalActionComment(userAction.type, userAction.remarks),\r\n        );\r\n\r\n        if (modifiedAnswer) {\r\n          // Apply the same overlay the backend will apply on next read, so the\r\n          // panel reflects the edits without waiting for a refetch.\r\n          ans.header = {\r\n            ...(ans.header ?? {}),\r\n            label: modifiedAnswer.header.label,\r\n          };\r\n          (ans.shelfConfig ?? []).forEach((shelf: any) => {\r\n            const brands =\r\n              shelf?.zone && modifiedAnswer.shelfBrandsByZone[shelf.zone];\r\n            if (brands) shelf.productBrandName = [...brands];\r\n          });\r\n          ans.modifiedAnswer = modifiedAnswer;\r\n        }\r\n      }\r\n\r\n      this.calculatePublishingState();\r\n      this.selectFixtureFeedback(fixtureId);\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\"Failed to execute zone action\");\r\n    }\r\n  }\r\n\r\n  private buildZoneModifiedAnswer(fixtureData: any): {\r\n    header: { label: string };\r\n    shelfBrandsByZone: Record<string, string[]>;\r\n  } {\r\n    const shelfBrandsByZone: Record<string, string[]> = {};\r\n    (fixtureData?.shelfConfig ?? []).forEach((shelf: any) => {\r\n      const zone = shelf?.zone;\r\n      if (!zone || shelfBrandsByZone[zone]) return;\r\n      shelfBrandsByZone[zone] = Array.isArray(shelf?.productBrandName)\r\n        ? [...shelf.productBrandName]\r\n        : [];\r\n    });\r\n    return {\r\n      header: { label: fixtureData?.header?.label ?? \"\" },\r\n      shelfBrandsByZone,\r\n    };\r\n  }\r\n\r\n  private async persistZoneEditAccepted() {\r\n    try {\r\n      const fixtureId = this.selectedFixture?.fixtureId;\r\n      if (!fixtureId) return;\r\n      const zoneRows = this.zoneFeedback?.zoneVerificationData ?? [];\r\n      const zoneRow = zoneRows.find(\r\n        (r: any) => r?.fixtureId?.toString?.() === fixtureId,\r\n      );\r\n      const answerId = zoneRow?.answers?.[0]?._id;\r\n      const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n      if (!answerId || !taskId) return;\r\n\r\n      await firstValueFrom(\r\n        this.apiService.updateZoneVerificationStatus({\r\n          _id: zoneRow._id,\r\n          answerId,\r\n          taskId,\r\n          type: \"agree\",\r\n          userAction: \"editAccepted\",\r\n          comments: null,\r\n        }),\r\n      );\r\n\r\n      if (zoneRow?.answers?.[0]) {\r\n        zoneRow.answers[0].userAction = \"editAccepted\";\r\n        zoneRow.answers[0].status = \"agree\";\r\n        const ans = zoneRow.answers[0];\r\n        ans.comments = ans.comments ?? [];\r\n        ans.comments.push(this.buildLocalActionComment(\"agree\", null));\r\n      }\r\n    } catch (error) {\r\n      this.toastService.getErrorToast(\r\n        \"Failed to record zone edit acceptance\",\r\n      );\r\n    }\r\n  }\r\n\r\n  rotateWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n    if (wall.angle + 90 < 360) {\r\n      wall.angle += 90;\r\n    } else {\r\n      wall.angle = 0;\r\n    }\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewWall(eleNumber: number) {\r\n    const getWallEndPoint = (wall: any) => {\r\n      const angleRad = (wall.angle * Math.PI) / 180;\r\n      const length = wall.distance;\r\n\r\n      return {\r\n        x: wall.relativePosition.x + length * Math.cos(angleRad),\r\n        y: wall.relativePosition.y + length * Math.sin(angleRad),\r\n        unit: wall.relativePosition.unit,\r\n      };\r\n    };\r\n\r\n    const index = this.floorData.layoutPolygon.findIndex(\r\n      (w: any) => w.elementType === \"wall\" && w.elementNumber === eleNumber,\r\n    );\r\n\r\n    if (index === -1 && eleNumber !== 0) return;\r\n\r\n    let startPosition;\r\n\r\n    if (eleNumber === 0) {\r\n      startPosition = {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n    } else {\r\n      const prevWall = this.floorData.layoutPolygon[index];\r\n      startPosition = getWallEndPoint(prevWall);\r\n    }\r\n\r\n    const baseWall =\r\n      eleNumber === 0\r\n        ? { angle: 0, direction: \"right\", unit: \"ft\" }\r\n        : this.floorData.layoutPolygon[index];\r\n\r\n    const newWall = {\r\n      elementType: \"wall\",\r\n      distance: 15,\r\n      unit: baseWall.unit,\r\n      direction: baseWall.direction,\r\n      angle: baseWall.angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: startPosition,\r\n      fixtures: [],\r\n      otherElements: [],\r\n      newAdded: true,\r\n    };\r\n\r\n    this.floorData.layoutPolygon.splice(\r\n      eleNumber === 0 ? 0 : index + 1,\r\n      0,\r\n      newWall,\r\n    );\r\n\r\n    this.updateWallElementNumber();\r\n    this.updateWallCoordinates();\r\n    this.renderFloor(true);\r\n  }\r\n\r\n  addNewEntrance() {\r\n    const layoutPolygon = this.floorData?.layoutPolygon ?? [];\r\n    const eleNumber =\r\n      layoutPolygon.filter((ele: any) => ele.elementType === \"entrance\")\r\n        ?.length ?? 0;\r\n\r\n    const gapPx = 24;\r\n    const defaultEntranceWidthPx = 80;\r\n\r\n    let xFt = 0;\r\n    let yFt = 0;\r\n    let angle = 0;\r\n    let isPositionResolved = false;\r\n\r\n    // 1) If entrance(s) already exist, place next to the latest one.\r\n    const existingEntranceObjects = (this.canvas?.getObjects() ?? [])\r\n      .filter((obj: any) => obj?.objType === \"entrance\")\r\n      .sort(\r\n        (a: any, b: any) =>\r\n          Number(a?.data?.elementNumber || 0) -\r\n          Number(b?.data?.elementNumber || 0),\r\n      );\r\n\r\n    const latestEntranceObj = existingEntranceObjects.at(-1) as any;\r\n\r\n    if (latestEntranceObj) {\r\n      const leftPx = latestEntranceObj.left ?? 0;\r\n      const topPx = latestEntranceObj.top ?? 0;\r\n      const widthPx =\r\n        latestEntranceObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n      const anchorAngle = Number(latestEntranceObj.angle || 0);\r\n      const angleRad = (anchorAngle * Math.PI) / 180;\r\n      const stepPx = widthPx + gapPx;\r\n\r\n      xFt = this.fromPixels(leftPx + stepPx * Math.cos(angleRad), \"ft\");\r\n      yFt = this.fromPixels(topPx + stepPx * Math.sin(angleRad), \"ft\");\r\n      angle = anchorAngle;\r\n      isPositionResolved = true;\r\n    }\r\n\r\n    if (!isPositionResolved) {\r\n      const existingEntrances = layoutPolygon\r\n        .filter((ele: any) => ele.elementType === \"entrance\")\r\n        .sort(\r\n          (a: any, b: any) =>\r\n            Number(a?.elementNumber || 0) - Number(b?.elementNumber || 0),\r\n        );\r\n\r\n      const latestEntrance = existingEntrances.at(-1);\r\n      if (latestEntrance) {\r\n        const anchorAngle = Number(latestEntrance?.angle || 0);\r\n        const angleRad = (anchorAngle * Math.PI) / 180;\r\n        const stepFt =\r\n          Number(\r\n            latestEntrance?.distance ||\r\n              this.fromPixels(defaultEntranceWidthPx, \"ft\"),\r\n          ) + this.fromPixels(gapPx, \"ft\");\r\n\r\n        xFt =\r\n          Number(latestEntrance?.relativePosition?.x || 0) +\r\n          stepFt * Math.cos(angleRad);\r\n        yFt =\r\n          Number(latestEntrance?.relativePosition?.y || 0) +\r\n          stepFt * Math.sin(angleRad);\r\n        angle = anchorAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 2) If no entrance, place next to wall-1.\r\n    if (!isPositionResolved) {\r\n      const wall1 = layoutPolygon.find(\r\n        (ele: any) =>\r\n          ele.elementType === \"wall\" && Number(ele.elementNumber) === 1,\r\n      );\r\n\r\n      if (wall1) {\r\n        const wallAngle = Number(wall1?.angle || 0);\r\n        const wallAngleRad = (wallAngle * Math.PI) / 180;\r\n        const alongWallFt = Math.min(Number(wall1?.distance || 0) / 2, 4);\r\n        const sideOffsetFt = 1.5;\r\n        const wallX = Number(wall1?.relativePosition?.x || 0);\r\n        const wallY = Number(wall1?.relativePosition?.y || 0);\r\n\r\n        xFt =\r\n          wallX +\r\n          alongWallFt * Math.cos(wallAngleRad) +\r\n          sideOffsetFt * -Math.sin(wallAngleRad);\r\n        yFt =\r\n          wallY +\r\n          alongWallFt * Math.sin(wallAngleRad) +\r\n          sideOffsetFt * Math.cos(wallAngleRad);\r\n        angle = wallAngle;\r\n        isPositionResolved = true;\r\n      }\r\n    }\r\n\r\n    // 3) If no wall (e.g. layoutPolygon is empty), place next to any canvas object.\r\n    if (!isPositionResolved) {\r\n      const anchorObj = (this.canvas?.getObjects() ?? []).find((obj: any) => {\r\n        return !!obj?.objType && obj?.isDissectionLine !== true;\r\n      }) as any;\r\n\r\n      if (anchorObj) {\r\n        const leftPx = anchorObj.left ?? 0;\r\n        const topPx = anchorObj.top ?? 0;\r\n        const widthPx = anchorObj.getScaledWidth?.() || defaultEntranceWidthPx;\r\n\r\n        xFt = this.fromPixels(leftPx + widthPx + gapPx, \"ft\");\r\n        yFt = this.fromPixels(topPx, \"ft\");\r\n        angle = Number(anchorObj?.angle || 0);\r\n      }\r\n    }\r\n\r\n    const newEntrance = {\r\n      elementType: \"entrance\",\r\n      distance: 6,\r\n      unit: \"ft\",\r\n      direction: \"up\",\r\n      angle,\r\n      elementNumber: eleNumber + 1,\r\n      relativePosition: {\r\n        x: xFt,\r\n        y: yFt,\r\n        unit: \"ft\",\r\n      },\r\n      fixtures: [],\r\n      otherElements: [],\r\n    };\r\n\r\n    this.floorData.layoutPolygon.push(newEntrance);\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n    this.updateEntranceCoordinates();\r\n  }\r\n\r\n  private isAddingFixture = false;\r\n\r\n  async addNewFixture(fixtureType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n    // Re-entry guard: getTemplate awaits an HTTP call, and a double-fired click\r\n    // (or rapid second click) would race past the await with the same\r\n    // existingFixtures snapshot, computing the same placement and pushing two\r\n    // fixtures at identical coordinates.\r\n    if (this.isAddingFixture) return;\r\n    this.isAddingFixture = true;\r\n    try {\r\n      await this.addNewFixtureInternal(fixtureType, wallIndex);\r\n    } finally {\r\n      this.isAddingFixture = false;\r\n    }\r\n  }\r\n\r\n  private async addNewFixtureInternal(\r\n    fixtureType: \"wall\" | \"floor\",\r\n    wallIndex?: number,\r\n  ) {\r\n    const template: any = await this.getTemplate(this.fixtureTemplates[0]._id);\r\n    const templateData = template.data;\r\n    const fixtureId = `new-${crypto.randomUUID()}`;\r\n    const fixtureGroup = this.patchFixture({\r\n      fixtureName: templateData.fixtureName,\r\n      fixtureConfigId: templateData._id,\r\n      _id: fixtureId,\r\n    });\r\n\r\n    const fixtureData = {\r\n      ...templateData,\r\n      fixtureConfigId: templateData._id,\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      _id: fixtureId,\r\n      unsavedChanges: true,\r\n      newAdded: true,\r\n    };\r\n    this.layoutHasUnsavedChanges = true;\r\n\r\n    if (fixtureType === \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n\r\n      const w = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n      const wp = this.fromPixels(w, \"ft\");\r\n\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n        const cosA = Math.cos(angleRad);\r\n        const sinA = Math.sin(angleRad);\r\n\r\n        // Project all existing fixtures onto the wall axis to get occupied ranges (in ft).\r\n        // Projection recovers t correctly even with the 1ft perpendicular offset applied\r\n        // during placement: (−sinA·cosA + cosA·sinA) cancels to 0.\r\n        const existingFixtures = (wallData.fixtures || []).filter(\r\n          (f: any) => f.fixtureName !== \"space\",\r\n        );\r\n\r\n        const occupied: Array<[number, number]> = existingFixtures.map(\r\n          (f: any) => {\r\n            const fWidth = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticWidth.value,\r\n                f.fixtureStaticWidth.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n            const fHeight = this.fromPixels(\r\n              this.toPixels(\r\n                f.fixtureStaticLength.value,\r\n                f.fixtureStaticLength.unit,\r\n              ),\r\n              \"ft\",\r\n            );\r\n\r\n            // CAD-uploaded fixtures on inverted walls (wall angle ∈ (90°, 270°))\r\n            // have their saved (x, y) shifted by R(wallAngle)·(w, h) to keep the\r\n            // canonical visual after a 180° body flip — see drawFixture. To\r\n            // recover the wall-axis position the gap-finder needs, unshift any\r\n            // fixture whose saved angle differs from the wall angle by ~180°.\r\n            const fAngle = (f.relativePosition.angle ?? 0) as number;\r\n            const angleDiff =\r\n              ((((fAngle - angleDeg) % 360) + 360) % 360);\r\n            const isFlipped = Math.abs(angleDiff - 180) < 1;\r\n\r\n            let projX = f.relativePosition.x;\r\n            let projY = f.relativePosition.y;\r\n            if (isFlipped) {\r\n              projX -= cosA * fWidth - sinA * fHeight;\r\n              projY -= sinA * fWidth + cosA * fHeight;\r\n            }\r\n\r\n            const tStart = (projX - x0) * cosA + (projY - y0) * sinA;\r\n            return [Math.max(0, tStart), Math.max(0, tStart) + fWidth] as [\r\n              number,\r\n              number,\r\n            ];\r\n          },\r\n        );\r\n\r\n        occupied.sort((a, b) => a[0] - b[0]);\r\n\r\n        // Walk from wall start; find first gap that fits the new fixture.\r\n        // EPSILON absorbs floating-point drift from repeated unit round-trips.\r\n        const EPSILON = 0.001;\r\n        let placementT: number | null = null;\r\n        let cursor = 0;\r\n\r\n        for (const [rangeStart, rangeEnd] of occupied) {\r\n          if (rangeStart - cursor >= wp - EPSILON) {\r\n            placementT = cursor;\r\n            break;\r\n          }\r\n          cursor = Math.max(cursor, rangeEnd);\r\n        }\r\n\r\n        // No gap found → place after last fixture.\r\n        // Overflow beyond wall length is intentional per requirements.\r\n        if (placementT === null) {\r\n          placementT = cursor;\r\n        }\r\n\r\n        const fx = x0 + placementT * cosA;\r\n        const fy = y0 + placementT * sinA;\r\n        const offset = 0.9;\r\n        const fx_offset = fx + offset * -sinA;\r\n        const fy_offset = fy + offset * cosA;\r\n\r\n        fixtureData.relativePosition.x = fx_offset;\r\n        fixtureData.relativePosition.y = fy_offset;\r\n        fixtureData.relativePosition.angle = angleDeg;\r\n\r\n        // If the wall angle puts the fixture in the upside-down range, bake\r\n        // the same 180° body flip drawFixture applies during CAD first-render\r\n        // (shift anchor by R(wallAngle)·(w, h) and rotate +180°). drawFixture's\r\n        // own flip path is gated on cadLayout=true, so for fixtures added\r\n        // post-CAD via the side panel we have to bake the flip here — it\r\n        // makes the new fixture land canonical instead of upside-down.\r\n        const normWallAngle = (((angleDeg % 360) + 360) % 360);\r\n        if (normWallAngle > 90 && normWallAngle < 270) {\r\n          const widthFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticWidth.value,\r\n              fixtureData.fixtureStaticWidth.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          const heightFt = this.fromPixels(\r\n            this.toPixels(\r\n              fixtureData.fixtureStaticLength.value,\r\n              fixtureData.fixtureStaticLength.unit,\r\n            ),\r\n            \"ft\",\r\n          );\r\n          fixtureData.relativePosition.x =\r\n            fx_offset + cosA * widthFt - sinA * heightFt;\r\n          fixtureData.relativePosition.y =\r\n            fy_offset + sinA * widthFt + cosA * heightFt;\r\n          fixtureData.relativePosition.angle = angleDeg + 180;\r\n        }\r\n      }\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"fixtures\") as FormArray).push(\r\n        fixtureGroup,\r\n      );\r\n      this.getWallByNumber(wallIndex! + 1)?.fixtures.push(fixtureData);\r\n    } else if (fixtureType === \"floor\") {\r\n      const fixtureWidthPx = this.toPixels(\r\n        fixtureData.fixtureStaticWidth.value,\r\n        fixtureData.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      const fixtureHeightPx = this.toPixels(\r\n        fixtureData.fixtureStaticLength.value,\r\n        fixtureData.fixtureStaticLength.unit,\r\n      );\r\n\r\n      // N-shape grid placement: col fills left-to-right, each column fills bottom row (row=1) first then top row (row=0)\r\n      const newIndex = this.floorData.centerFixture.length;\r\n      const newCol = Math.floor(newIndex / 2);\r\n      const newRow = newIndex % 2 === 0 ? 1 : 0;\r\n\r\n      let gridOriginX: number;\r\n      let gridOriginY: number;\r\n\r\n      if (this.floorData.centerFixture.length > 0) {\r\n        // Recover grid origin from fixture at index 0 (always placed at row=1, col=0)\r\n        const f0 = this.floorData.centerFixture[0];\r\n        const f0x = this.toPixels(\r\n          f0.relativePosition.x,\r\n          f0.relativePosition.unit,\r\n        );\r\n        const f0y = this.toPixels(\r\n          f0.relativePosition.y,\r\n          f0.relativePosition.unit,\r\n        );\r\n        // f0 is at row=1 → gridOriginY = f0y - 1 * fixtureHeightPx; col=0 → gridOriginX = f0x\r\n        gridOriginX = f0x;\r\n        gridOriginY = f0y - fixtureHeightPx;\r\n      } else {\r\n        // No existing center fixtures — find best grid origin via polygon scan (same as drawLayoutElements)\r\n        const layoutPolygon = this.buildLayoutPolygonFromWalls();\r\n        const occupiedRects = this.getOccupiedRects();\r\n        const bounds = this.getFullLayoutBounds();\r\n\r\n        // Reserve space for 2 rows and 1 column as the starting grid footprint\r\n        const gridW = fixtureWidthPx;\r\n        const gridH = 2 * fixtureHeightPx;\r\n\r\n        const centerX = bounds.left + bounds.width / 2;\r\n        const centerY = bounds.top + bounds.height / 2;\r\n\r\n        const fitsInPolygon = (x: number, y: number) =>\r\n          this.isPointInsidePolygon({ x, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x: x + gridW, y }, layoutPolygon) &&\r\n          this.isPointInsidePolygon({ x, y: y + gridH }, layoutPolygon) &&\r\n          this.isPointInsidePolygon(\r\n            { x: x + gridW, y: y + gridH },\r\n            layoutPolygon,\r\n          );\r\n\r\n        const overlapsOccupied = (x: number, y: number) =>\r\n          occupiedRects.some((occ) =>\r\n            this.rectsOverlap({ x, y, w: gridW, h: gridH }, occ),\r\n          );\r\n\r\n        const scanForBestOrigin = (skipOverlap: boolean) => {\r\n          let bestScore = -Infinity;\r\n          let bestPos: { x: number; y: number } | null = null;\r\n          const step = fixtureWidthPx / 2;\r\n\r\n          for (\r\n            let y = bounds.top;\r\n            y <= bounds.top + bounds.height - gridH;\r\n            y += step\r\n          ) {\r\n            for (\r\n              let x = bounds.left;\r\n              x <= bounds.left + bounds.width - gridW;\r\n              x += step\r\n            ) {\r\n              if (!fitsInPolygon(x, y)) continue;\r\n              if (!skipOverlap && overlapsOccupied(x, y)) continue;\r\n\r\n              const gridRect = { x, y, w: gridW, h: gridH };\r\n              const emptyMargin = this.computeEmptyMargin(\r\n                gridRect,\r\n                bounds,\r\n                occupiedRects,\r\n              );\r\n              const dx = centerX - (x + gridW / 2);\r\n              const dy = centerY - (y + gridH / 2);\r\n              const score = emptyMargin * 1000 - (dx * dx + dy * dy) * 0.001;\r\n\r\n              if (score > bestScore) {\r\n                bestScore = score;\r\n                bestPos = { x, y };\r\n              }\r\n            }\r\n          }\r\n          return bestPos;\r\n        };\r\n\r\n        const bestPos = scanForBestOrigin(false) ??\r\n          scanForBestOrigin(true) ?? {\r\n            x: centerX - gridW / 2,\r\n            y: centerY - gridH / 2,\r\n          };\r\n\r\n        gridOriginX = bestPos.x;\r\n        gridOriginY = bestPos.y;\r\n      }\r\n\r\n      const x = gridOriginX + newCol * fixtureWidthPx;\r\n      const y = gridOriginY + newRow * fixtureHeightPx;\r\n\r\n      fixtureData.relativePosition.x = this.fromPixels(x, \"ft\");\r\n      fixtureData.relativePosition.y = this.fromPixels(y, \"ft\");\r\n\r\n      (this.layoutForm.get(\"floorFixtures\") as FormArray).push(fixtureGroup);\r\n      this.floorData.centerFixture.push(fixtureData);\r\n    }\r\n\r\n    await this.renderFloor(false);\r\n    this.publishingState = \"layout\";\r\n    this.updateFixtureCoordinates();\r\n  }\r\n\r\n  addNewOtherElements(posType: \"wall\" | \"floor\", wallIndex?: number) {\r\n    if (this.layoutForm.disabled) return;\r\n\r\n    const posData = {\r\n      _id: `new-${crypto.randomUUID()}`,\r\n      fixtureName: `POS Counter`,\r\n      fixtureType: \"other\",\r\n      relativePosition: { x: 0, y: 0, angle: 0, unit: \"ft\" },\r\n      fixtureStaticLength: {\r\n        value: 3,\r\n        unit: \"ft\",\r\n      },\r\n      fixtureStaticWidth: {\r\n        value: 5,\r\n        unit: \"ft\",\r\n      },\r\n    };\r\n\r\n    let x = posData.relativePosition.x;\r\n    let y = posData.relativePosition.y;\r\n    let a = posData.relativePosition.angle;\r\n\r\n    const h = this.toPixels(\r\n      posData.fixtureStaticLength.value,\r\n      posData.fixtureStaticLength.unit,\r\n    );\r\n    const w = this.toPixels(\r\n      posData.fixtureStaticWidth.value,\r\n      posData.fixtureStaticWidth.unit,\r\n    );\r\n\r\n    const newOtherGroup = this.fb.group({\r\n      type: [posData.fixtureName || \"POS Counter\"], // default selected label\r\n      customName: [\"\"],\r\n    });\r\n\r\n    if (posType == \"wall\") {\r\n      const wallData = this.getWallByNumber(wallIndex! + 1);\r\n      if (wallData) {\r\n        const x0 = wallData.relativePosition.x;\r\n        const y0 = wallData.relativePosition.y;\r\n        const length = wallData.distance;\r\n        const angleDeg = wallData.angle || 0;\r\n        const angleRad = (angleDeg * Math.PI) / 180;\r\n\r\n        const fx = x0 + (length / 2) * Math.cos(angleRad);\r\n        const fy = y0 + (length / 2) * Math.sin(angleRad);\r\n        const offset = 2.5;\r\n        const fx_offset = fx + offset * -Math.sin(angleRad);\r\n        const fy_offset = fy + offset * Math.cos(angleRad);\r\n\r\n        x = this.toPixels(fx_offset, \"ft\");\r\n        y = this.toPixels(fy_offset, \"ft\");\r\n        a = angleDeg;\r\n      }\r\n\r\n      Object.assign(posData, {\r\n        associatedElementNumber: wallIndex! + 1,\r\n        associatedElementType: \"wall\",\r\n      });\r\n\r\n      (this.getFormWalls.at(wallIndex!).get(\"otherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      wallData.otherElements.push({ ...posData, newAdded: true });\r\n    } else if (posType === \"floor\") {\r\n      (this.layoutForm.get(\"floorOtherElements\") as FormArray).push(\r\n        newOtherGroup,\r\n      );\r\n      this.floorData.otherElements.push({ ...posData, newAdded: true });\r\n    }\r\n\r\n    const rectGroup = this.drawOtherElementsWithLabel(\r\n      this.canvas,\r\n      x,\r\n      y,\r\n      a,\r\n      w,\r\n      h,\r\n      posData,\r\n    );\r\n\r\n    // make active\r\n    try {\r\n      this.canvas.setActiveObject(rectGroup);\r\n      this.canvas.requestRenderAll();\r\n    } catch {}\r\n\r\n    this.subscribeToOtherElementsChanges();\r\n    this.updateOtherElementsCoordinates();\r\n  }\r\n\r\n  findEmptyCenterSpot(\r\n    objectWidthPx: number,\r\n    objectHeightPx: number,\r\n    tempOccupied: {\r\n      x: number;\r\n      y: number;\r\n      width: number;\r\n      height: number;\r\n    }[] = [],\r\n  ) {\r\n    const objects = this.canvas.getObjects();\r\n    const CENTER_OFFSET_X = -300;\r\n    const CENTER_OFFSET_Y = 0;\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const centerX = bounds.left + bounds.width / 2 + CENTER_OFFSET_X;\r\n\r\n    const centerY = bounds.top + bounds.height / 2 + CENTER_OFFSET_Y;\r\n\r\n    // 2. Spiral search parameters\r\n    const step = 20;\r\n    const maxRadius = Math.max(bounds.width, bounds.height);\r\n\r\n    for (let radius = 0; radius < maxRadius; radius += step) {\r\n      for (let angle = 0; angle < 360; angle += 30) {\r\n        const rad = (angle * Math.PI) / 180;\r\n\r\n        // 🔧 FIX: center → top-left\r\n        const x = centerX + radius * Math.cos(rad) - objectWidthPx / 2;\r\n        const y = centerY + radius * Math.sin(rad) - objectHeightPx / 2;\r\n\r\n        const testRect = {\r\n          left: x,\r\n          top: y,\r\n          width: objectWidthPx,\r\n          height: objectHeightPx,\r\n        };\r\n\r\n        // 3. Check collision with existing canvas objects\r\n        const canvasCollision = objects.some((obj) => {\r\n          const rect = obj.getBoundingRect();\r\n          return !(\r\n            rect.left > testRect.left + testRect.width ||\r\n            rect.left + rect.width < testRect.left ||\r\n            rect.top > testRect.top + testRect.height ||\r\n            rect.top + rect.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (canvasCollision) continue;\r\n\r\n        // 4. Check collision with temp placed fixtures (CAD batch)\r\n        const tempCollision = tempOccupied.some((o) => {\r\n          return !(\r\n            o.x > testRect.left + testRect.width ||\r\n            o.x + o.width < testRect.left ||\r\n            o.y > testRect.top + testRect.height ||\r\n            o.y + o.height < testRect.top\r\n          );\r\n        });\r\n\r\n        if (tempCollision) continue;\r\n\r\n        return { x, y };\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  async cancelEdit() {\r\n    this.highlightedFixtureFormId = null;\r\n    await this.getStoreFixtures(this.planoData._id);\r\n  }\r\n\r\n  listenToDeleteKey() {\r\n    // Layout Touchup forbids structural mutation, so we don't attach the\r\n    // global keydown listener at all. Skipping the addEventListener (rather\r\n    // than just no-op'ing inside the callback) avoids any side-effects from\r\n    // a dangling document-level listener after navigation.\r\n    if (!this.canMutateStructure) return;\r\n\r\n    document.addEventListener(\"keydown\", (e) => {\r\n      if (e.key === \"Delete\" && this.layoutForm.enabled) {\r\n        const active = this.canvas?.getActiveObject() as any;\r\n\r\n        if (active && (active as any).objType === \"entrance\") {\r\n          this.deleteEntrance();\r\n        }\r\n\r\n        if (active && (active as any).objType === \"wall\") {\r\n          if (active?.data?.elementNumber) {\r\n            this.deleteWall(active?.data?.elementNumber);\r\n          }\r\n        }\r\n\r\n        if (active && (active as any).objType === \"fixture\") {\r\n          if (active?.fixtureType) {\r\n            this.deleteFixture(\r\n              active?.fixtureType,\r\n              active?.fixtureIndex - 1,\r\n              active?.wallIndex - 1,\r\n            );\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  deleteEntrance() {\r\n    const active = this.canvas.getActiveObject() as any;\r\n\r\n    if (active && active.objType === \"entrance\") {\r\n      const i = this.floorData.layoutPolygon.findIndex(\r\n        (el: any) =>\r\n          el.elementType === \"entrance\" &&\r\n          el.elementNumber === active.data.elementNumber,\r\n      );\r\n\r\n      if (i >= 0) {\r\n        this.floorData.layoutPolygon.splice(i, 1);\r\n        this.renderFloor(true);\r\n      }\r\n\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  async deleteWall(eleNumber: number) {\r\n    const wall = this.floorData.layoutPolygon.find(\r\n      (ele: any) =>\r\n        ele.elementType === \"wall\" && ele.elementNumber === eleNumber,\r\n    );\r\n    if (wall.fixtures.length || wall.otherElements.length)\r\n      if (!(await this.confirmDeleteWall())) return;\r\n\r\n    const i = this.floorData.layoutPolygon.findIndex(\r\n      (el: any) => el.elementType === \"wall\" && el.elementNumber === eleNumber,\r\n    );\r\n\r\n    this.floorData.layoutPolygon.splice(i, 1);\r\n    this.updateWallElementNumber();\r\n    this.renderFloor(true);\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateWallElementNumber() {\r\n    const onlyWalls = this.floorData.layoutPolygon?.filter(\r\n      (el: any) => el.elementType === \"wall\",\r\n    );\r\n\r\n    onlyWalls?.forEach((item: any, index: number) => {\r\n      item.elementNumber = index + 1;\r\n    });\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(4));\r\n  }\r\n\r\n  fromPixels(pixels: number, unit: string, dpi = 2.8): number {\r\n    let value: number;\r\n\r\n    // pixels = pixels >= this.wallThickness ? pixels - this.wallThickness : this.wallThickness;\r\n\r\n    if (unit === \"mm\") {\r\n      value = (pixels / dpi) * 25.4;\r\n    } else if (unit === \"ft\") {\r\n      value = pixels / (12 * dpi);\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(value.toFixed(4));\r\n  }\r\n\r\n  async confirmEdit(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(LayoutEditConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  async confirmDeleteWall(): Promise<boolean> {\r\n    try {\r\n      const modelRef = this.modalService.open(DeleteConfirmationComponent, {\r\n        centered: true,\r\n      });\r\n\r\n      modelRef.componentInstance.title = \"Delete wall\";\r\n      modelRef.componentInstance.description =\r\n        \"Are you sure you want to delete this wall along with its associated fixtures and elements?\";\r\n\r\n      return await modelRef.result.then<boolean>((result) => result === \"ok\");\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  updateFixtureCoordinates(fixtures?: any) {\r\n    const fixturesFromCanvas =\r\n      fixtures ??\r\n      this.canvas\r\n        .getObjects()\r\n        .filter((obj) => (obj as any).fixtureId)\r\n        .map((obj) => ({\r\n          id: (obj as any).fixtureId,\r\n          x: obj.left,\r\n          y: obj.top,\r\n          angle: obj?.angle ?? 0,\r\n        }));\r\n    const posMap = new Map();\r\n\r\n    for (const fixture of fixturesFromCanvas) {\r\n      posMap.set(fixture.id, {\r\n        x: this.fromPixels(fixture.x, \"ft\"),\r\n        y: this.fromPixels(fixture.y, \"ft\"),\r\n        angle: fixture.angle,\r\n      });\r\n    }\r\n\r\n    this.floorData.centerFixture.forEach((cf: any) => {\r\n      const latestFixturePos = posMap.get(cf._id);\r\n      if (latestFixturePos) {\r\n        cf.relativePosition.x = latestFixturePos.x;\r\n        cf.relativePosition.y = latestFixturePos.y;\r\n        cf.relativePosition.angle = latestFixturePos.angle;\r\n      }\r\n    });\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.fixtures?.forEach((wf: any) => {\r\n        const latestFixturePos = posMap.get(wf._id);\r\n        if (latestFixturePos) {\r\n          wf.relativePosition.x = latestFixturePos.x;\r\n          wf.relativePosition.y = latestFixturePos.y;\r\n          wf.relativePosition.angle = latestFixturePos.angle;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateOtherElementsCoordinates() {\r\n    const othersFromCanvas = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"others\")\r\n      .map((obj) => ({\r\n        id: (obj as any).data?._id,\r\n        label: (obj as any).data?.fixtureName,\r\n        x: obj.left,\r\n        y: obj.top,\r\n        angle: obj?.angle ?? 0,\r\n        width: this.fromPixels(obj.getScaledWidth() - 2, \"ft\"),\r\n        height: this.fromPixels(obj.getScaledHeight() - 2, \"ft\"),\r\n      }));\r\n\r\n    const posMap = new Map<\r\n      string,\r\n      { x: number; y: number; angle: number; h: number; w: number }\r\n    >();\r\n    for (const other of othersFromCanvas) {\r\n      if (other.id) {\r\n        posMap.set(other.id, {\r\n          x: this.fromPixels(other.x, \"ft\"),\r\n          y: this.fromPixels(other.y, \"ft\"),\r\n          angle: other.angle,\r\n          h: other.height,\r\n          w: other.width,\r\n        });\r\n      }\r\n    }\r\n\r\n    if (Array.isArray(this.floorData.otherElements)) {\r\n      this.floorData.otherElements.forEach((el: any) => {\r\n        const latestOthersPos = posMap.get(el._id);\r\n        if (latestOthersPos) {\r\n          el.relativePosition.x = latestOthersPos.x;\r\n          el.relativePosition.y = latestOthersPos.y;\r\n          el.relativePosition.angle = latestOthersPos.angle;\r\n          el.fixtureStaticLength.value = latestOthersPos.h;\r\n          el.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      w?.otherElements?.forEach((wf: any) => {\r\n        const latestOthersPos = posMap.get(wf._id);\r\n        if (latestOthersPos) {\r\n          wf.relativePosition.x = latestOthersPos.x;\r\n          wf.relativePosition.y = latestOthersPos.y;\r\n          wf.relativePosition.angle = latestOthersPos.angle;\r\n          wf.fixtureStaticLength.value = latestOthersPos.h;\r\n          wf.fixtureStaticWidth.value = latestOthersPos.w;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  updateWallCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"wall\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth() - 0.27, \"ft\"),\r\n          height: this.fromPixels(obj.getScaledHeight() - 0.27, \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const wall of data) {\r\n      posMap.set(\r\n        `${wall.elementData.elementType}${wall.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === wall.elementData.elementType &&\r\n            obj.elementData.elementNumber === wall.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const wallPos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (wallPos) {\r\n        w.relativePosition.x = wallPos.left;\r\n        w.relativePosition.y = wallPos.top;\r\n        w.angle = wallPos.angle;\r\n        w.distance = wallPos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  updateEntranceCoordinates() {\r\n    const data = this.canvas\r\n      .getObjects()\r\n      .filter((obj) => (obj as any).objType === \"entrance\")\r\n      .map((obj) => {\r\n        return {\r\n          top: this.fromPixels(obj.top, \"ft\"),\r\n          left: this.fromPixels(obj.left, \"ft\"),\r\n          width: this.fromPixels(obj.getScaledWidth(), \"ft\"),\r\n          angle: obj.angle,\r\n          elementData: (obj as any).data,\r\n        };\r\n      });\r\n\r\n    const posMap = new Map();\r\n\r\n    for (const entrance of data) {\r\n      posMap.set(\r\n        `${entrance.elementData.elementType}${entrance.elementData.elementNumber}`,\r\n        data.find(\r\n          (obj) =>\r\n            obj.elementData.elementType === entrance.elementData.elementType &&\r\n            obj.elementData.elementNumber ===\r\n              entrance.elementData.elementNumber,\r\n        ),\r\n      );\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((w: any) => {\r\n      const entrancePos = posMap.get(`${w.elementType}${w.elementNumber}`);\r\n      if (entrancePos) {\r\n        w.relativePosition.x = entrancePos.left;\r\n        w.relativePosition.y = entrancePos.top;\r\n        w.angle = entrancePos.angle;\r\n        w.distance = entrancePos.width;\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Touchup save — calls /managePlano/updateLayoutTouchup which never wipes\r\n   * task rows or flips floor status. Shows a touchup-specific confirm dialog\r\n   * (the original verification flow's confirmEdit warns about resetting\r\n   * progress — not applicable here).\r\n   *\r\n   * editMode arg is kept for template parity with manage-store-plano's Save\r\n   * button, but is ignored — every touchup save behaves the same way.\r\n   */\r\n  async updateLayout(_editMode: boolean = false) {\r\n    const confirmRef = this.modalService.open(LayoutEditConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    confirmRef.componentInstance.title = \"Save Layout Touchup\";\r\n    confirmRef.componentInstance.description =\r\n      \"Saving will update layout positions and fixture details without affecting any verification responses (Layout / Fixture / Zone task statuses are preserved). Continue?\";\r\n\r\n    let confirmed: string;\r\n    try {\r\n      confirmed = await confirmRef.result;\r\n    } catch {\r\n      this.layoutForm.disable({ emitEvent: false });\r\n      this.renderFloor(false);\r\n      return;\r\n    }\r\n    if (confirmed !== \"ok\") {\r\n      this.layoutForm.disable({ emitEvent: false });\r\n      this.renderFloor(false);\r\n      return;\r\n    }\r\n\r\n    this.floorData.layoutPolygon.forEach((element: any) => {\r\n      element.fixtures = (element.fixtures || []).filter(\r\n        (fixture: any) => !fixture?.ghost && fixture.fixtureName !== \"space\",\r\n      );\r\n    });\r\n    this.floorData.centerFixture = (this.floorData.centerFixture || [])\r\n      .filter((fixture: any) => !fixture?.ghost)\r\n      .map((fixture: any) => {\r\n        const { associatedElementType, associatedElementNumber, ...rest } =\r\n          fixture;\r\n        return rest;\r\n      });\r\n    this.reorderFixture(this.floorData);\r\n\r\n    const payload = {\r\n      planoId: this.floorData.planoId,\r\n      floorId: this.floorData._id,\r\n      data: this.floorData,\r\n    };\r\n\r\n    this.isSavingLayout = true;\r\n    this.apiService.updateLayoutTouchup(payload).subscribe({\r\n      next: () => {\r\n        this.toastService.getSuccessToast(\"Layout touchup saved\");\r\n        this.createForm();\r\n        this.getStoreFixtures(this.planoData._id);\r\n        this.isSavingLayout = false;\r\n        this.layoutHasUnsavedChanges = false;\r\n      },\r\n      error: (err: any) => {\r\n        const msg =\r\n          err?.error?.message ?? err?.error ?? \"Failed to save layout touchup\";\r\n        this.toastService.getErrorToast(msg);\r\n        this.isSavingLayout = false;\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Layout Touchup — Sync zone response.\r\n   *\r\n   * For each zone-verification compliance row on this floor, rewrites\r\n   * `answers[0].shelfConfig` to match the fixture's current shelves: shelf\r\n   * count + per-shelf zone come from the fixture, user-submitted\r\n   * productBrandName / productCategory are preserved (zone-normalized for\r\n   * newly added shelves). See /managePlano/syncZoneResponseFromFixtures on\r\n   * the BE.\r\n   *\r\n   * Only available in non-edit mode (gated in template via *ngIf=\"!layoutForm.enabled\").\r\n   */\r\n  async syncZoneResponse() {\r\n    if (!this.floorData?._id || !this.floorData?.planoId) return;\r\n    if (this.isSyncingZoneResponse) return;\r\n\r\n    const confirmRef = this.modalService.open(LayoutEditConfirmationComponent, {\r\n      centered: true,\r\n    });\r\n    confirmRef.componentInstance.title = \"Sync Zone Response\";\r\n    confirmRef.componentInstance.description =\r\n      \"This will overwrite mobile-submitted zone responses on this floor with the current fixture state. Per-shelf product brand/category picks will be preserved (newly added shelves inherit picks from sibling shelves in the same zone). Continue?\";\r\n\r\n    let confirmed: string;\r\n    try {\r\n      confirmed = await confirmRef.result;\r\n    } catch {\r\n      return;\r\n    }\r\n    if (confirmed !== \"ok\") return;\r\n\r\n    this.isSyncingZoneResponse = true;\r\n    this.apiService\r\n      .syncZoneResponseFromFixtures({\r\n        planoId: this.floorData.planoId,\r\n        floorId: this.floorData._id,\r\n      })\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          const msg =\r\n            res?.data?.message ?? \"Zone responses synced from fixtures\";\r\n          this.toastService.getSuccessToast(msg);\r\n          this.isSyncingZoneResponse = false;\r\n        },\r\n        error: (err: any) => {\r\n          const msg =\r\n            err?.error?.message ?? err?.error ?? \"Failed to sync zone response\";\r\n          this.toastService.getErrorToast(msg);\r\n          this.isSyncingZoneResponse = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  async assignTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n    };\r\n\r\n    if (this.publishingState === \"layout\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"layout-redo\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.layoutData[\r\n          this.storeFeedback.layoutData.length - 1\r\n        ].taskId;\r\n    } else if (this.publishingState === \"fixture\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"fixture-redo\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.fixtureData[\r\n          this.storeFeedback.fixtureData.length - 1\r\n        ].taskId;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.redo = true;\r\n      payload.taskId =\r\n        this.storeFeedback.VmData[this.storeFeedback.VmData.length - 1].taskId;\r\n    }\r\n\r\n    let result;\r\n\r\n    if (this.publishingState === \"fixture\") {\r\n      const modalRef = this.modalService.open(ScheduleTaskPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        scrollable: true,\r\n        backdrop: \"static\",\r\n        windowClass: \"schedule-task-modal\",\r\n      });\r\n      modalRef.componentInstance.type = this.publishingState;\r\n      modalRef.componentInstance.storeName = this.planoData?.storeName;\r\n      modalRef.componentInstance.fixtures = this.allFixtureInstances;\r\n\r\n      result = await modalRef.result;\r\n\r\n      if (result?.scheduledDate) {\r\n        payload.scheduledDate = result.scheduledDate;\r\n      }\r\n    } else {\r\n      const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n        centered: true,\r\n        size: \"md\",\r\n        scrollable: true,\r\n        backdrop: \"static\",\r\n        windowClass: \"custom-height-modal\",\r\n      });\r\n      modalRef.componentInstance.type = this.publishingState;\r\n      modalRef.componentInstance.inputData = payload;\r\n      result = await modalRef.result;\r\n    }\r\n\r\n    if (result.status === \"submit\") {\r\n      let taskType = this.publishingState;\r\n      if (this.publishingState === \"vm-redo\") {\r\n        taskType = \"vm\";\r\n      }\r\n      if (this.publishingState === \"fixture-redo\") {\r\n        taskType = \"fixture\";\r\n      }\r\n      if (this.publishingState === \"layout-redo\") {\r\n        taskType = \"layout\";\r\n      }\r\n      if (result?.comments && result?.comments != \"\") {\r\n        let commentPayload = {\r\n          floorId: this.floorData._id,\r\n          planoId: this.floorData.planoId,\r\n          taskType: taskType,\r\n          comment: result.comments,\r\n        };\r\n        this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n          next: (res: any) => {},\r\n        });\r\n      }\r\n\r\n      this.apiService.createTask(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.showLayout = false;\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n            this.getStoreFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n              {},\r\n            );\r\n            this.toastService.getSuccessToast(res?.data?.message);\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to publish task\");\r\n        },\r\n      });\r\n    }\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] revoke — mirrors the fixture revoke flow but targets the zone task.\r\n  // Uses the existing StoreTaskRevokeComponent + revokeTask BE endpoint with type 'zoneVerification'.\r\n  revokeZoneTask() {\r\n    const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n    if (!taskId) return;\r\n\r\n    const payload: any = {\r\n      redo: this.zoneFeedback?.zoneVerificationTask?.redoStatus === true,\r\n      checkListName: \"Zone Verification\",\r\n      type: \"zoneVerification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n      taskId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(StoreTaskRevokeComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = payload.redo ? \"zone-redo\" : \"zone\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    modalRef.result.then((result) => {\r\n      if (result?.status !== \"submit\") return;\r\n\r\n      if (result.comments) {\r\n        this.apiService\r\n          .updateGlobalComment({\r\n            floorId: this.floorData._id,\r\n            planoId: this.floorData.planoId,\r\n            taskType: \"zoneVerification\",\r\n            comment: result.comments,\r\n          })\r\n          .subscribe({ next: () => {} });\r\n      }\r\n\r\n      this.apiService.revokeTask(payload).subscribe({\r\n        next: (res: any) => {\r\n          if (res?.status === \"success\") {\r\n            this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n            this.getZoneVerificationFeedback(\r\n              this.floorData.planoId,\r\n              this.floorData._id,\r\n            );\r\n            this.toastService.getSuccessToast(res?.message);\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to revoke zone task\");\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] initial publish — assigns a zone verification task to the store.\r\n  // Mirrors the fixture initial publish flow. Reuses PublishTaskPopupComponent with type 'zone'.\r\n  async publishZoneVerification() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"Zone Verification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = \"zone\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    let result: any;\r\n    try {\r\n      result = await modalRef.result;\r\n    } catch {\r\n      return;\r\n    }\r\n    if (result?.status !== \"submit\") return;\r\n\r\n    // Create the task first so we have the new taskId to attach to the global\r\n    // comment — otherwise the comment would be saved with taskId: undefined and\r\n    // would never be picked up by the zone task's commentLookup join.\r\n    this.apiService.createTask(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          const newTaskId = res?.data?.taskId;\r\n          if (result?.comments) {\r\n            this.apiService\r\n              .updateGlobalComment({\r\n                floorId: this.floorData._id,\r\n                planoId: this.floorData.planoId,\r\n                taskType: \"zoneVerification\",\r\n                taskId: newTaskId,\r\n                comment: result.comments,\r\n              })\r\n              .subscribe({ next: () => {} });\r\n          }\r\n\r\n          this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n          this.getZoneVerificationFeedback(\r\n            this.floorData.planoId,\r\n            this.floorData._id,\r\n          );\r\n          this.toastService.getSuccessToast(res?.data?.message);\r\n        }\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to publish zone verification\");\r\n      },\r\n    });\r\n  }\r\n\r\n  // [ZONE-VERIFICATION] redo publish — independent of the layout/fixture/vm chain.\r\n  // Reuses PublishTaskPopupComponent with a new 'zone-redo' type.\r\n  async publishZoneRedo() {\r\n    const taskId = this.zoneFeedback?.zoneVerificationTask?._id;\r\n    if (!taskId) return;\r\n\r\n    const payload: any = {\r\n      redo: true,\r\n      checkListName: \"Zone Verification\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      taskId,\r\n    };\r\n\r\n    const modalRef = this.modalService.open(PublishTaskPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n    modalRef.componentInstance.type = \"zone-redo\";\r\n    modalRef.componentInstance.inputData = payload;\r\n\r\n    let result: any;\r\n    try {\r\n      result = await modalRef.result;\r\n    } catch {\r\n      return;\r\n    }\r\n    if (result?.status !== \"submit\") return;\r\n\r\n    if (result?.comments) {\r\n      this.apiService\r\n        .updateGlobalComment({\r\n          floorId: this.floorData._id,\r\n          planoId: this.floorData.planoId,\r\n          taskType: \"zoneVerification\",\r\n          taskId,\r\n          comment: result.comments,\r\n        })\r\n        .subscribe({ next: () => {} });\r\n    }\r\n\r\n    this.apiService.createTask(payload).subscribe({\r\n      next: (res: any) => {\r\n        if (res?.status === \"success\") {\r\n          this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n          this.getZoneVerificationFeedback(\r\n            this.floorData.planoId,\r\n            this.floorData._id,\r\n          );\r\n          this.toastService.getSuccessToast(res?.data?.message);\r\n        }\r\n      },\r\n      error: () => {\r\n        this.toastService.getErrorToast(\"Failed to publish zone redo\");\r\n      },\r\n    });\r\n  }\r\n\r\n  onClickEdit() {\r\n    // Layout Touchup bypasses task-state gates by design — the tool exists to\r\n    // edit irrespective of verification status. Only the initial-load guard\r\n    // (cleared once getStoreFixtures resolves) is honoured.\r\n    if (this.disableEdit) {\r\n      return;\r\n    }\r\n    // if (this.taskStyle.fixture.name !== \"Approved\") {\r\n      this.togglePanel(\"right\", true);\r\n      this.togglePanel(\"left\", false);\r\n\r\n      this.disabledPublish = true;\r\n      this.createForm();\r\n      this.layoutForm.enable({ emitEvent: false });\r\n      this.highlightedFixtureFormId = null;\r\n      this.renderFloor();\r\n    // } else {\r\n    //   this.router.navigateByUrl(\r\n    //     `manage/planogram/manage-rollout?planoId=${this.floorData.planoId}&floorId=${this.floorData._id}`,\r\n    //   );\r\n    // }\r\n  }\r\n\r\n  taskDetails(planoId: any, floorId: any) {\r\n    return new Promise((resolve, reject) => {\r\n      this.taskInfo = {};\r\n      this.taskStyle = {\r\n        layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n        fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n        vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n      };\r\n      this.apiService.getTaskInfo({ planoId, floorId }).subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.disabledPublish = res?.data?.disabled || false;\r\n            this.taskInfo = res?.data;\r\n            this.taskInfo?.taskDetails?.forEach((ele: any) => {\r\n              if (ele.type == \"layout\") {\r\n                this.taskStyle.layout = this.getStatus(\"layout\");\r\n              }\r\n              if (ele.type == \"fixture\") {\r\n                this.taskStyle.fixture = this.getStatus(\"fixture\");\r\n              }\r\n              if (ele.type == \"fixture\") {\r\n                this.taskStyle.vm = this.taskStyle.fixture;\r\n              }\r\n            });\r\n            this.calculatePublishingState();\r\n          }\r\n          resolve(true);\r\n        },\r\n        error: () => {\r\n          this.toastService.getErrorToast(\"Failed to get task details\");\r\n          reject();\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  getStatus(type: any) {\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (data) {\r\n      if (\r\n        data.status == \"submit\" &&\r\n        (data.feedbackStatus == \"complete\" || !data?.feedbackStatus)\r\n      ) {\r\n        return { name: \"Approved\", class: \"completed\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"pending\") {\r\n        return { name: \"Review Pending\", class: \"reviewPending\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"disagree\") {\r\n        return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n      } else {\r\n        if (data.redoStatus && !data.breach) {\r\n          return { name: \"Redo\", class: \"taskAssigned\" };\r\n        } else if (data.breach) {\r\n          return { name: \"Flagged\", class: \"flagged\" };\r\n        }\r\n        if (\r\n          data?.date &&\r\n          dayjs(data.date, \"YYYY-MM-DD\").isAfter(dayjs(), \"day\")\r\n        ) {\r\n          return {\r\n            name: `Task scheduled: ${dayjs(data.date).format(\"DD MMMM, YYYY\")}`,\r\n            class: \"taskAssigned\",\r\n          };\r\n        } else {\r\n          return { name: \"Task Assigned\", class: \"taskAssigned\" };\r\n        }\r\n      }\r\n    }\r\n    return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n  }\r\n\r\n  getElementNumber(group: any): number | null {\r\n    return group.get(\"elementNumber\")?.value ?? null;\r\n  }\r\n\r\n  highlightFixture(group: any, blink: boolean = false) {\r\n    if (this.layoutForm.enabled) return;\r\n    this.removeHighlight();\r\n    this.cancelHighlightBlink = false;\r\n\r\n    const center = group.getCenterPoint();\r\n\r\n    const realWidth = group.width! * group.scaleX!;\r\n    const realHeight = group.height! * group.scaleY!;\r\n\r\n    const rect = new fabric.Rect({\r\n      left: center.x,\r\n      top: center.y,\r\n      width: realWidth + 8, // consistent padding\r\n      height: realHeight + 8,\r\n      rx: 5,\r\n      ry: 5,\r\n      stroke: \"#00aaff\",\r\n      strokeWidth: 3,\r\n      fill: \"transparent\",\r\n      selectable: false,\r\n      evented: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: group.angle || 0,\r\n      opacity: blink ? 0 : 1,\r\n    });\r\n\r\n    (rect as any).data = { type: \"fixture-highlight\" };\r\n\r\n    this.canvas.add(rect);\r\n    this.canvas.moveObjectTo(rect, this.canvas.getObjects().length - 1);\r\n    this.canvas.requestRenderAll();\r\n\r\n    this.activeHighlight = rect;\r\n\r\n    // --- No blinking needed ---\r\n    if (!blink) return;\r\n\r\n    let cycles = 0;\r\n\r\n    const blinkOnce = () => {\r\n      if (this.cancelHighlightBlink) {\r\n        this.removeHighlight();\r\n        return;\r\n      }\r\n\r\n      rect.animate(\r\n        { opacity: 1 },\r\n        {\r\n          duration: 200,\r\n          onChange: () => this.canvas.requestRenderAll(),\r\n          onComplete: () => {\r\n            if (this.cancelHighlightBlink) {\r\n              this.removeHighlight();\r\n              return;\r\n            }\r\n\r\n            rect.animate(\r\n              { opacity: 0 },\r\n              {\r\n                duration: 200,\r\n                onChange: () => this.canvas.requestRenderAll(),\r\n                onComplete: () => {\r\n                  if (this.cancelHighlightBlink) {\r\n                    this.removeHighlight();\r\n                    return;\r\n                  }\r\n\r\n                  cycles++;\r\n                  if (cycles < 20) {\r\n                    blinkOnce();\r\n                  } else {\r\n                    if (!this.cancelHighlightBlink) {\r\n                      rect.set({ opacity: 1 });\r\n                      this.canvas.requestRenderAll();\r\n                    }\r\n                  }\r\n                },\r\n              },\r\n            );\r\n          },\r\n        },\r\n      );\r\n    };\r\n\r\n    blinkOnce();\r\n  }\r\n\r\n  removeHighlight() {\r\n    this.cancelHighlightBlink = true;\r\n\r\n    this.canvas?.getObjects()?.forEach((obj) => {\r\n      if ((obj as any).data?.type === \"fixture-highlight\") {\r\n        this.canvas.remove(obj);\r\n      }\r\n    });\r\n\r\n    this.activeHighlight = null;\r\n    this.canvas?.requestRenderAll();\r\n  }\r\n\r\n  keepHighlightOnTop = () => {\r\n    if (!this.activeHighlight) return;\r\n    const objs = this.canvas.getObjects();\r\n    this.canvas.moveObjectTo(this.activeHighlight, objs.length - 1);\r\n  };\r\n\r\n  // In edit mode, when a fixture is clicked on the canvas, open the matching\r\n  // accordion item in the left panel, scroll it into view and highlight the\r\n  // fixture row so the user can locate it in the form quickly.\r\n  highlightFixtureInAccordion(fixtureData: any): void {\r\n    if (!fixtureData || this.layoutForm.disabled) return;\r\n\r\n    let accordionItemId: string;\r\n\r\n    if (fixtureData.fixtureType === \"wall\") {\r\n      const formIdx = this.getFormWalls.controls.findIndex(\r\n        (c) =>\r\n          c.get(\"elementNumber\")?.value === fixtureData.associatedElementNumber,\r\n      );\r\n      if (formIdx < 0) {\r\n        this.highlightedFixtureFormId = null;\r\n        return;\r\n      }\r\n      accordionItemId = `accordion-wall-${formIdx}`;\r\n    } else if (fixtureData.fixtureType === \"floor\") {\r\n      accordionItemId = \"accordion-floor\";\r\n    } else {\r\n      return;\r\n    }\r\n\r\n    this.highlightedFixtureFormId = fixtureData._id ?? null;\r\n\r\n    if (this.isLeftPanelCollapsed) {\r\n      this.togglePanel(\"left\", false);\r\n    }\r\n\r\n    this.bodyAccordion?.expand(accordionItemId);\r\n\r\n    setTimeout(() => {\r\n      const el = document.getElementById(accordionItemId);\r\n      el?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n    }, 350);\r\n  }\r\n\r\n  onChangeFixtureOnFeedbackPanel(\r\n    {\r\n      currentFixture,\r\n      action,\r\n    }: {\r\n      currentFixture?: string;\r\n      action?: \"next\" | \"previous\";\r\n    },\r\n    collapseTaskInfo: boolean = false,\r\n  ) {\r\n    let indexToSelect = currentFixture\r\n      ? this.allFixtureInstances.findIndex((f: any) => f._id === currentFixture)\r\n      : 0;\r\n\r\n    if (action === \"next\") {\r\n      if (indexToSelect == this.allFixtureInstances.length - 1) {\r\n        indexToSelect = 0;\r\n      } else {\r\n        indexToSelect++;\r\n      }\r\n    } else if (action === \"previous\") {\r\n      if (indexToSelect == 0) {\r\n        indexToSelect = this.allFixtureInstances.length - 1;\r\n      } else {\r\n        indexToSelect--;\r\n      }\r\n    } else if (!currentFixture && !action) {\r\n      indexToSelect = 0;\r\n    }\r\n\r\n    const fixtureIdToSelect = this.allFixtureInstances[indexToSelect]?._id;\r\n\r\n    const actionFixture = this.canvas\r\n      .getObjects()\r\n      .find(\r\n        (obj: any) =>\r\n          obj.objType === \"fixture\" && obj.fixtureId === fixtureIdToSelect,\r\n      ) as fabric.Group | undefined;\r\n\r\n    if (!actionFixture) return;\r\n\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n\r\n    this.highlightFixture(actionFixture);\r\n    this.selectFixtureOnCanvasClick(actionFixture, collapseTaskInfo);\r\n  }\r\n\r\n  revokeTask() {\r\n    const payload: any = {\r\n      redo: false,\r\n      checkListName: \"\",\r\n      store: this.planoData.storeName,\r\n      clientId: this.planoData.clientId,\r\n      floorId: this.floorData._id,\r\n      planoId: this.floorData.planoId,\r\n    };\r\n\r\n    if (this.publishingState === \"layout\") {\r\n      payload.type = \"layout\";\r\n      // this.updateLayout()\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"layout-redo\") {\r\n      payload.checkListName = \"Layout Verification\";\r\n      payload.type = \"layout\";\r\n      payload.redo = true;\r\n    } else if (this.publishingState === \"fixture\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.type = \"fixture\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"fixture-redo\") {\r\n      payload.checkListName = \"Fixture Verification\";\r\n      payload.type = \"fixture\";\r\n      payload.redo = true;\r\n    } else if (this.publishingState === \"vm\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.type = \"vm\";\r\n      payload.redo = false;\r\n    } else if (this.publishingState === \"vm-redo\") {\r\n      payload.checkListName = \"VM Verification\";\r\n      payload.type = \"vm\";\r\n      payload.redo = true;\r\n    }\r\n    payload.taskId = this.taskInfo?.taskDetails.find(\r\n      (ele: any) => ele.type == payload.type,\r\n    )?.taskId;\r\n\r\n    const modalRef = this.modalService.open(StoreTaskRevokeComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\", // <-- Add a custom class here\r\n    });\r\n    modalRef.componentInstance.type = this.publishingState;\r\n    modalRef.componentInstance.inputData = payload;\r\n    modalRef.result.then((result) => {\r\n      if (result.status === \"submit\") {\r\n        let taskType = this.publishingState;\r\n        if (this.publishingState === \"vm-redo\") {\r\n          taskType = \"vm\";\r\n        }\r\n        if (this.publishingState === \"fixture-redo\") {\r\n          taskType = \"fixture\";\r\n        }\r\n        if (this.publishingState === \"layout-redo\") {\r\n          taskType = \"layout\";\r\n        }\r\n        if (result.comments && result.comments != \"\") {\r\n          let commentPayload = {\r\n            floorId: this.floorData._id,\r\n            planoId: this.floorData.planoId,\r\n            taskType: taskType,\r\n            comment: result.comments,\r\n          };\r\n          this.apiService.updateGlobalComment(commentPayload).subscribe({\r\n            next: (res: any) => {},\r\n          });\r\n        }\r\n        this.apiService.revokeTask(payload).subscribe({\r\n          next: (res: any) => {\r\n            if (res?.status === \"success\") {\r\n              this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n              this.toastService.getSuccessToast(res?.message);\r\n            }\r\n          },\r\n          error: () => {\r\n            this.toastService.getErrorToast(\"Failed to publish task\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  publish() {\r\n    const modalRef = this.modalService.open(PublishPlanoModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\",\r\n    });\r\n\r\n    modalRef.result.then((res: any) => {\r\n      if (res) {\r\n        const publishAsDraft = res.publishAsDraft;\r\n        let data = structuredClone(this.planoData);\r\n        data.floorId = this.floorData._id;\r\n        data.floorData = this.floorData;\r\n        delete data.floors;\r\n        delete data.floorData.masterTemplates;\r\n        data.revisionName = res.revisionName;\r\n        data.isActive = !publishAsDraft;\r\n        this.apiService.publish(data).subscribe({\r\n          next: (apiRes: any) => {\r\n            if (apiRes && apiRes.code == 200) {\r\n              if (!publishAsDraft) {\r\n                this.floorData.verificationStatus = true;\r\n              }\r\n              this.toastService.getSuccessToast(apiRes?.message);\r\n            }\r\n          },\r\n          error: (err: any) => {\r\n            console.log(err);\r\n            this.toastService.getErrorToast(\"Failed to publish plano\");\r\n          },\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  async goToStoreTourPage() {\r\n    if (this.isStoreTourLoading) return;\r\n    this.isStoreTourLoading = true;\r\n    try {\r\n      const res: any = await firstValueFrom(\r\n        this.apiService.getPlanoStoreVideoParams({\r\n          storeId: this.planoData.storeId,\r\n        }),\r\n      );\r\n\r\n      if (res?.data) {\r\n        let params = res?.data;\r\n        const urlTree = this.router.createUrlTree([\"/manage/trax/gallery\"], {\r\n          queryParams: params,\r\n        });\r\n        const url = this.router.serializeUrl(urlTree);\r\n        window.open(url, \"_blank\");\r\n      } else {\r\n        this.openNoVideoFoundModal();\r\n        return;\r\n      }\r\n    } catch (error) {\r\n      this.openNoVideoFoundModal();\r\n      console.log(\"@@ ~ goToStoreTourPage [ERR]:\", error);\r\n    } finally {\r\n      this.isStoreTourLoading = false;\r\n    }\r\n  }\r\n\r\n  async openNoVideoFoundModal() {\r\n    try {\r\n      await this.modalService.open(this.noStoreVideoModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  goToStoreCameraPage() {\r\n    const urlTree = this.router.createUrlTree([\"/manage/stores/cameras\"], {\r\n      queryParams: {\r\n        storeId: this.planoData.storeId,\r\n      },\r\n    });\r\n\r\n    const url = this.router.serializeUrl(urlTree);\r\n    window.open(url, \"_blank\");\r\n  }\r\n\r\n  getStoreList(planoId?: string) {\r\n    this.apiService\r\n      .getPlanoStoreList(this.clientId)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            this.storeList = res.data;\r\n            this.storeList = this.storeList.map((ele: any) => {\r\n              return { ...ele, storeName: ele.storeName.toUpperCase() };\r\n            });\r\n            if (planoId) {\r\n              this.selectedStoreName = this.storeList.find(\r\n                (ele: any) => ele.planoId.toString() == planoId.toString(),\r\n              );\r\n            }\r\n          }\r\n        },\r\n      });\r\n  }\r\n\r\n  async onSelected(event: any) {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    const newParams = new URLSearchParams(window.location.search);\r\n    newParams.set(\"planoId\", event.planoId);\r\n    newParams.set(\"floorId\", event.floorId);\r\n\r\n    this.location.replaceState(window.location.pathname, newParams.toString());\r\n    this.isRightPanelCollapsed = true;\r\n    this.isLeftPanelCollapsed = true;\r\n    this.wallCount = this.clCount = 0;\r\n    this.showLayout = false;\r\n    await this.getStoreFixtures(event._id);\r\n  }\r\n\r\n  async applyPIDLogics() {}\r\n\r\n  async onClickApplyLogics() {\r\n    try {\r\n      await this.modalService.open(this.applyLogicsModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  async onClickApproveLayout() {\r\n    try {\r\n      await this.modalService.open(this.approveLayoutModalRef, {\r\n        centered: true,\r\n      }).result;\r\n    } catch (err: any) {}\r\n  }\r\n\r\n  async approveLayout() {\r\n    this.isButtonLoading = true;\r\n\r\n    try {\r\n      const floorId = this.floorData._id;\r\n\r\n      const publishData = {\r\n        ...structuredClone(this.planoData),\r\n        floorId,\r\n        floorData: {\r\n          ...this.floorData,\r\n          masterTemplates: undefined,\r\n        },\r\n        floors: undefined,\r\n      };\r\n      await Promise.all([\r\n        firstValueFrom(\r\n          this.apiService.updateStorePlano({\r\n            floorId,\r\n            data: this.floorData,\r\n          }),\r\n        ),\r\n        firstValueFrom(this.apiService.publish(publishData)),\r\n        firstValueFrom(this.apiService.approvePlanoLayout(floorId)),\r\n      ]);\r\n\r\n      this.toastService.getSuccessToast(\"Layout approved successfully\");\r\n      this.modalService.dismissAll();\r\n    } catch (error) {\r\n      console.error(\"approveLayout failed:\", error);\r\n      this.toastService.getErrorToast(\"Failed to approve layout\");\r\n    } finally {\r\n      this.isButtonLoading = false;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section id=\"manage-plano\">\r\n  <!-- Loading State -->\r\n  <div *ngIf=\"isPageLoading\" class=\"row\">\r\n    <div class=\"col-12 m-0\">\r\n      <ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container>\r\n    </div>\r\n    <div class=\"col-3\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n    <div class=\"col-6\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n    <div class=\"col-3\">\r\n      <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Content -->\r\n  <div [ngClass]=\"{ 'd-none': isPageLoading }\">\r\n    <!-- Header Accordion -->\r\n    <div id=\"header\" ngbAccordion #accordion=\"ngbAccordion\" class=\"my-4\">\r\n      <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n        <div ngbAccordionHeader class=\"d-flex justify-content-between align-items-center px-6 py-3\">\r\n          <div class=\"d-flex gap-4 align-items-center\">\r\n            <div class=\"d-flex align-items-center\">\r\n              <div style=\"margin-left:5px;margin-right:5px\" *ngIf=\"planoData?.storeName\">\r\n                <h2 class='title'>{{planoData?.storeName}} - Plano</h2>\r\n              </div>\r\n              <!-- Layout Touchup: store picker + floor picker omitted. The\r\n                   parent LayoutTouchupComponent does that selection step; the\r\n                   editor is dedicated to one (planoId, floorId) at a time. -->\r\n            </div>\r\n            <!-- Layout Touchup: \"View store tour\" + \"View camera\" actions\r\n                 omitted — operational/CCTV affordances are not relevant to a\r\n                 geometry touch-up flow. -->\r\n          </div>\r\n\r\n          <div class=\"d-flex align-items-center gap-4\">\r\n            <div *ngIf=\"!editFixture\" class=\"updateClass\"\r\n                [ngbTooltip]=\"floorData?.updatedByName ? 'Updated by ' + floorData.updatedByName : null\">\r\n                Last Update: {{ floorData?.lastUpdateIso | date:'d MMM yyyy, hh:mm a' }}\r\n            </div>\r\n\r\n            <!-- Sync Zone Response — pushes the floor's current fixture shelfConfig\r\n                 (zone + count) into the corresponding planoTaskCompliance.answers[0]\r\n                 rows on the BE, preserving user-picked productBrandName / productCategory.\r\n                 Only available in non-edit mode so the source state is the saved fixture. -->\r\n            <button *ngIf=\"!editFixture && !layoutForm.enabled\"\r\n                    type=\"button\"\r\n                    class=\"btn btn-outline text-nowrap d-flex align-items-center gap-2\"\r\n                    [disabled]=\"isSyncingZoneResponse\"\r\n                    (click)=\"syncZoneResponse()\">\r\n              <span *ngIf=\"isSyncingZoneResponse\" class=\"spinner-border spinner-border-sm\"\r\n                    role=\"status\" aria-hidden=\"true\"></span>\r\n              Sync zone response\r\n            </button>\r\n\r\n            <div class=\"d-flex gap-4 align-items-center\">\r\n              <!-- Edit Fixture Mode -->\r\n              <ng-container *ngIf=\"editFixture\">\r\n                <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onFixturePageCancel()\">\r\n                  Cancel\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onFixtureSave()\">\r\n                  Save & Close\r\n                </button>\r\n              </ng-container>\r\n\r\n              <!-- Layout Touchup: Top Publish + per-task action buttons +\r\n                   accordion toggle are intentionally omitted. Touchup saves\r\n                   never alter verification status, and the status cards\r\n                   accordion body is omitted, so a toggle would do nothing. -->\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Layout Touchup: status cards (Plano Completion / Layout / Fixtures /\r\n             Visual Merchandise / Zone Verification) are intentionally omitted.\r\n             The whole point of the tool is to edit without affecting these. -->\r\n        <div ngbAccordionCollapse *ngIf=\"false\">\r\n          <div ngbAccordionBody>\r\n            <ng-template>\r\n            <div id=\"header\" class=\"row mx-0 gap-3\">\r\n              <!-- Plano Completion -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <h3 class=\"d-flex align-items-center gap-2\">\r\n                  Plano Completion %\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n                    ngbTooltip=\"% of overall planogram completion\">\r\n                    <g clip-path=\"url(#clip0_1517_129805)\">\r\n                      <path\r\n                        d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                        stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </g>\r\n                    <defs>\r\n                      <clipPath id=\"clip0_1517_129805\">\r\n                        <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                      </clipPath>\r\n                    </defs>\r\n                  </svg>\r\n                </h3>\r\n                <div class=\"row align-items-center mt-2\">\r\n                  <div class=\"col-9\">\r\n                    <div class=\"progress\" style=\"height: 4px\">\r\n                      <div class=\"progress-bar\" [ngClass]=\"\r\n                          taskInfo?.planoProgress <= 50\r\n                            ? 'bg-warning'\r\n                            : taskInfo?.planoProgress === 75\r\n                            ? 'bg-primary'\r\n                            : 'bg-success'\r\n                        \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n                        [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Layout -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3><b>{{ storeMetrics.floorCount }}</b> Layout</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.layout.name }}\r\n                    </div>\r\n                  </div>\r\n                  <!-- Layout actions disabled for now — no layout-related actions are needed.\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'layout' || publishingState === 'layout-redo') && taskStyle.layout.class !== 'taskAssigned' && taskStyle.layout.class !== 'completed' && taskStyle.fixture.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'layout-redo' ? 'Publish Layout Redo' : 'Publish Layout Verification' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.layout.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594lay)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594lay\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                  -->\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Fixtures -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3><b>{{ storeMetrics.fixtureCount }}</b> Fixtures</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.fixture.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'fixture' || publishingState === 'fixture-redo') && taskStyle.fixture.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'fixture-redo' ? 'Publish Redo' : 'Publish Task' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.fixture.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594fix)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594fix\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Visual Merchandise -->\r\n              <!--\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex flex-column gap-2\">\r\n                  <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n                    <h3 class=\"m-0\"><b>{{ storeMetrics.vmCount }}</b> Visual Merchandise</h3>\r\n                    <div class=\"indicator\" [ngClass]=\"taskStyle.vm.class\">\r\n                      <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <path\r\n                            d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                            stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                      {{ taskStyle.vm.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && (publishingState === 'vm' || publishingState === 'vm-redo') && taskStyle.vm.class !== 'taskAssigned'\"\r\n                    type=\"button\" class=\"card-publish-btn\" (click)=\"assignTask()\" [disabled]=\"disabledPublish\">\r\n                    {{ publishingState === 'vm-redo' ? 'Publish Redo' : 'Publish' }}\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && taskStyle.vm.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594vm)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594vm\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n              -->\r\n\r\n              <!-- Zone Verification -->\r\n              <div style=\"cursor: unset;\" class=\"col filter-tab\">\r\n                <div class=\"d-flex align-items-start justify-content-between gap-2\">\r\n                  <div class=\"flex-grow-1\">\r\n                    <h3>Zone Verification</h3>\r\n                    <div class=\"indicator mt-2\" [ngClass]=\"zoneTaskStyle.class\">\r\n                      <span class=\"me-2\" [hidden]=\"zoneTaskStyle.name !== 'Redo'\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                          <g clip-path=\"url(#clip0_4984_27569)\">\r\n                            <path\r\n                              d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                              stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </g>\r\n                          <defs>\r\n                            <clipPath id=\"clip0_4984_27569\">\r\n                              <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                            </clipPath>\r\n                          </defs>\r\n                        </svg>\r\n                      </span>\r\n                      {{ zoneTaskStyle.name }}\r\n                    </div>\r\n                  </div>\r\n                  <button *ngIf=\"!editFixture && !zoneFeedback?.zoneVerificationTask\" type=\"button\"\r\n                    class=\"card-publish-btn\" (click)=\"publishZoneVerification()\">\r\n                    Publish Task\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && zoneRedoStatus\" type=\"button\"\r\n                    class=\"card-publish-btn\" (click)=\"publishZoneRedo()\">\r\n                    Publish Redo\r\n                  </button>\r\n                  <button *ngIf=\"!editFixture && zoneTaskStyle.class === 'taskAssigned'\" type=\"button\"\r\n                    class=\"card-revoke-btn\" (click)=\"revokeZoneTask()\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                      <g clip-path=\"url(#clip0_640_5594z)\">\r\n                        <path\r\n                          d=\"M6.66669 10.0013H13.3334M18.3334 10.0013C18.3334 14.6037 14.6024 18.3346 10 18.3346C5.39765 18.3346 1.66669 14.6037 1.66669 10.0013C1.66669 5.39893 5.39765 1.66797 10 1.66797C14.6024 1.66797 18.3334 5.39893 18.3334 10.0013Z\"\r\n                          stroke=\"#B42318\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </g>\r\n                      <defs>\r\n                        <clipPath id=\"clip0_640_5594z\">\r\n                          <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                        </clipPath>\r\n                      </defs>\r\n                    </svg>\r\n                    Revoke\r\n                  </button>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Body -->\r\n    <div id=\"body\" class=\"row\">\r\n      <!-- Left Column -->\r\n      <div [ngClass]=\"{ 'collapsed-col': isLeftPanelCollapsed, 'col-3': !isLeftPanelCollapsed,'d-none': editFixture  }\">\r\n        <div class=\"s-card\">\r\n          <form [ngClass]=\"{ 'd-none': isLeftPanelCollapsed }\" [formGroup]=\"layoutForm\">\r\n            <div ngbAccordion #bodyAccordion=\"ngbAccordion\">\r\n              <!-- Walls Section -->\r\n              <ng-container *ngIf=\"getFormWalls.controls.length; else addWallAction\">\r\n                <ng-container formArrayName=\"walls\">\r\n                  <ng-container *ngFor=\"let group of getFormWalls.controls; let i = index\">\r\n                    <div [formGroupName]=\"i\" [ngbAccordionItem]=\"'accordion-wall-' + i\" class=\"mb-5\">\r\n                      <div class=\"d-flex\" ngbAccordionHeader>\r\n                        <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                          <div class=\"d-flex align-items-center\">\r\n                            <span class=\"me-2 wall-label\">\r\n                              {{ group.get(\"elementType\")?.value | titlecase }} {{ group.get(\"elementNumber\")?.value }}\r\n                            </span>\r\n\r\n                            @if(layoutForm.enabled){\r\n                              <span class=\"me-1\" ngbTooltip=\"Rotate this wall.\"\r\n                                (click)=\"rotateWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n                                    d=\"M3.73735 8.25011C4.12193 8.24362 4.44377 8.52776 4.49338 8.89998L4.4999 8.98735L4.50262 9.15516C4.58434 11.5741 6.57243 13.5 9 13.5C9.14022 13.5 9.27951 13.4936 9.41756 13.4809L9.21967 13.2803C8.92678 12.9874 8.92678 12.5126 9.21967 12.2197C9.51257 11.9268 9.98744 11.9268 10.2803 12.2197L11.7803 13.7197C12.0732 14.0126 12.0732 14.4874 11.7803 14.7803L10.2803 16.2803C9.98744 16.5732 9.51257 16.5732 9.21967 16.2803C8.92678 15.9874 8.92678 15.5126 9.21967 15.2197L9.45837 14.9827C9.30646 14.9942 9.15359 15 9 15C5.82653 15 3.21665 12.5321 3.0125 9.38289L3.00315 9.19314L3.00011 9.01265C2.99312 8.59849 3.3232 8.25709 3.73735 8.25011ZM8.78033 1.71967C9.0507 1.99003 9.07149 2.41546 8.84272 2.70967L8.78033 2.78033L8.54187 3.01726C8.69371 3.00578 8.8465 3 9 3C12.3137 3 15 5.68629 15 9C15 9.41421 14.6642 9.75 14.25 9.75C13.8358 9.75 13.5 9.41421 13.5 9C13.5 6.51472 11.4853 4.5 9 4.5C8.8597 4.5 8.72034 4.5064 8.58221 4.51909L8.78033 4.71967C9.07323 5.01256 9.07323 5.48744 8.78033 5.78033C8.50997 6.05069 8.08455 6.07149 7.79033 5.84272L7.71967 5.78033L6.21967 4.28033C5.94931 4.00997 5.92851 3.58454 6.15728 3.29033L6.21967 3.21967L7.71967 1.71967C8.01257 1.42678 8.48744 1.42678 8.78033 1.71967Z\"\r\n                                    fill=\"#475467\" stroke=\"#475467\" stroke-width=\"0.00064\" />\r\n                                </svg>\r\n                              </span>\r\n                              <span class=\"me-1\" ngbTooltip=\"Insert new wall below.\"\r\n                                (click)=\"addNewWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <g clip-path=\"url(#clip0_62_8)\">\r\n                                    <path\r\n                                      d=\"M9 9.75C11.0707 9.75 12.75 11.4293 12.75 13.5C12.75 15.5708 11.0707 17.25 9 17.25C6.92925 17.25 5.25 15.5708 5.25 13.5C5.25 11.4293 6.92925 9.75 9 9.75ZM9.75 11.25H8.25V12.7493L6.75 12.75V14.25L8.25 14.2493V15.75H9.75V14.2493L11.25 14.25V12.75L9.75 12.7493V11.25ZM15 2.25C15.414 2.25 15.75 2.586 15.75 3V7.5C15.75 7.914 15.414 8.25 15 8.25H3C2.586 8.25 2.25 7.914 2.25 7.5V3C2.25 2.586 2.586 2.25 3 2.25H15ZM3.75 3.75V6.75H14.25V3.75H3.75Z\"\r\n                                      fill=\"#475467\" />\r\n                                  </g>\r\n                                  <defs>\r\n                                    <clipPath id=\"clip0_62_8\">\r\n                                      <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                    </clipPath>\r\n                                  </defs>\r\n                                </svg>\r\n                              </span>\r\n                              <span *ngIf=\"canMutateStructure\" class=\"me-1\" ngbTooltip=\"Remove this wall and its fixtures.\"\r\n                                (click)=\"deleteWall(getElementNumber(group)!); $event.stopPropagation()\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n                                  fill=\"none\">\r\n                                  <g clip-path=\"url(#clip0_63_25)\">\r\n                                    <path\r\n                                      d=\"M10.7094 1.5C11.3551 1.5 11.9283 1.91314 12.1324 2.52565L12.5406 3.75H15C15.4142 3.75 15.75 4.08579 15.75 4.5C15.75 4.9142 15.4142 5.24999 15 5.25L14.9981 5.30344L14.3476 14.4103C14.2635 15.5878 13.2838 16.5 12.1034 16.5H5.89668C4.71624 16.5 3.7365 15.5878 3.6524 14.4103L3.00191 5.30344C3.00062 5.28551 2.99998 5.26769 2.99997 5.25C2.58577 5.24999 2.25 4.9142 2.25 4.5C2.25 4.08579 2.58579 3.75 3 3.75H5.45943L5.86754 2.52565C6.07172 1.91314 6.64493 1.5 7.29057 1.5H10.7094ZM13.4981 5.25H4.50191L5.14858 14.3034C5.17662 14.696 5.5032 15 5.89668 15H12.1034C12.4968 15 12.8234 14.696 12.8514 14.3034L13.4981 5.25ZM7.5 7.5C7.88464 7.5 8.20163 7.78952 8.24495 8.16253L8.25 8.25V12C8.25 12.4142 7.91422 12.75 7.5 12.75C7.11537 12.75 6.79837 12.4605 6.75505 12.0875L6.75 12V8.25C6.75 7.83578 7.08578 7.5 7.5 7.5ZM10.5 7.5C10.9142 7.5 11.25 7.83578 11.25 8.25V12C11.25 12.4142 10.9142 12.75 10.5 12.75C10.0858 12.75 9.75 12.4142 9.75 12V8.25C9.75 7.83578 10.0858 7.5 10.5 7.5ZM10.7094 3H7.29057L7.04057 3.75H10.9595L10.7094 3Z\"\r\n                                      fill=\"#F32B2B\" />\r\n                                  </g>\r\n                                  <defs>\r\n                                    <clipPath id=\"clip0_63_25\">\r\n                                      <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n                                    </clipPath>\r\n                                  </defs>\r\n                                </svg>\r\n                              </span>\r\n                            }\r\n                          </div>\r\n                          <div class=\"divider\"></div>\r\n                        </button>\r\n                      </div>\r\n\r\n                      <div ngbAccordionCollapse>\r\n                        <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                          <ng-template>\r\n                            <div style=\"min-height: 50px\" dndDropzone (dndDrop)=\"onDrop($event, i)\">\r\n                              <!-- Fixtures -->\r\n                              <ng-container *ngIf=\"getFormFixtures(i).controls.length\">\r\n                                <div formArrayName=\"fixtures\">\r\n                                  <ng-container *ngFor=\"let fixture of getFormFixtures(i).controls; let j = index\">\r\n                                    <div dndDropzone (dndDrop)=\"onDrop($event, i, j)\" [formGroupName]=\"j\"\r\n                                      [dndDraggable]=\"{ wallIndex: i, fixtureIndex: j }\" [dndEffectAllowed]=\"'all'\"\r\n                                      class=\"row g-0 mb-5 fixture-row\"\r\n                                      [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\"\r\n                                      [dndDisableDragIf]=\"layoutForm.disabled\">\r\n\r\n                                      <div class=\"col-1\">\r\n                                        <div class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                          <svg dndDragImageRef\r\n                                            [style]=\"{ cursor: layoutForm.disabled ? 'default' : 'move', opacity: '0.5' }\"\r\n                                            width=\"25px\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                            <path\r\n                                              d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                              fill=\"grey\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n\r\n                                      <div class=\"col-10\">\r\n                                        <lib-reactive-select formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n                                          [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n                                          [subTextField]=\"'subtext'\" [search]=\"true\">\r\n                                        </lib-reactive-select>\r\n                                      </div>\r\n\r\n                                      <div class=\"col-1\" *ngIf=\"canMutateStructure\">\r\n                                        <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                          [class.disabled-click]=\"layoutForm.disabled\">\r\n                                          <svg (click)=\"deleteFixture('wall', j, i)\"\r\n                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\"\r\n                                            viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </ng-container>\r\n                                </div>\r\n                              </ng-container>\r\n\r\n                              <div *ngIf=\"canMutateStructure\" class=\"d-flex justify-content-end\">\r\n                                <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                  (click)=\"addNewFixture('wall', i)\">\r\n                                  Add fixture\r\n                                </a>\r\n                              </div>\r\n\r\n                              <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                              <!-- Other Elements -->\r\n                              <ng-container *ngIf=\"getWallOtherElements(i).controls.length\">\r\n                                <div formArrayName=\"otherElements\">\r\n                                  <ng-container *ngFor=\"let fixture of getWallOtherElements(i).controls; let j = index\">\r\n                                    <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                      <div class=\"col-11\">\r\n                                        <label class=\"form-label mb-1\">Element {{ j + 1 }}</label>\r\n\r\n                                        <!-- Dropdown bound to 'type' -->\r\n                                        <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                                          [data]=\"otherElementList\" [id]=\"'elementLabel' + j\" formControlName=\"type\">\r\n                                        </lib-reactive-select>\r\n\r\n                                        <!-- Show custom text input only when 'Others' is selected -->\r\n                                        <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n                                          class=\"form-control mt-2\" formControlName=\"customName\"\r\n                                          placeholder=\"Enter custom element name\" />\r\n                                      </div>\r\n\r\n                                      <div class=\"col-1\" *ngIf=\"canMutateStructure\">\r\n                                        <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                          [class.disabled-click]=\"layoutForm.disabled\">\r\n                                          <svg (click)=\"removeOtherElement('wall', j, i)\"\r\n                                            style=\"cursor: pointer; margin-bottom: 18px\"\r\n                                            xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\"\r\n                                            viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                            <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                              stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                          </svg>\r\n                                        </div>\r\n                                      </div>\r\n                                    </div>\r\n                                  </ng-container>\r\n                                </div>\r\n                              </ng-container>\r\n\r\n                              <div *ngIf=\"canMutateStructure\" class=\"d-flex justify-content-end\">\r\n                                <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                                  (click)=\"addNewOtherElements('wall', i)\">\r\n                                  Add element\r\n                                </a>\r\n                              </div>\r\n                            </div>\r\n                          </ng-template>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                  </ng-container>\r\n                </ng-container>\r\n              </ng-container>\r\n\r\n              <ng-template #addWallAction>\r\n                <button (click)=\"addNewWall(0)\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                  class=\"btn btn-secondary w-100 p-2\">\r\n                  Insert new wall\r\n                </button>\r\n              </ng-template>\r\n\r\n              <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n              <!-- Floor Section -->\r\n              <div [ngbAccordionItem]=\"'accordion-floor'\" class=\"mb-5\">\r\n                <div class=\"d-flex\" ngbAccordionHeader>\r\n                  <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n                    <span class=\"me-2 wall-label\">Floor</span>\r\n                    <div class=\"divider\"></div>\r\n                  </button>\r\n                </div>\r\n\r\n                <div ngbAccordionCollapse>\r\n                  <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n                    <ng-template>\r\n                      <div style=\"min-height: 50px\" dndDropzone (dndDrop)=\"onDrop($event, 'floor')\">\r\n                        <!-- Floor Fixtures -->\r\n                        <ng-container *ngIf=\"getFormFloorFixtures.controls.length\">\r\n                          <div formArrayName=\"floorFixtures\">\r\n                            <ng-container *ngFor=\"let fixture of getFormFloorFixtures.controls; let j = index\">\r\n                              <div dndDropzone (dndDrop)=\"onDrop($event, 'floor', j)\" [formGroupName]=\"j\"\r\n                                [dndDraggable]=\"{ wallIndex: 'floor', fixtureIndex: j }\" [dndEffectAllowed]=\"'all'\"\r\n                                [dndDisableDragIf]=\"layoutForm.disabled\"\r\n                                class=\"row g-0 mb-5 fixture-row\"\r\n                                [class.highlighted-fixture]=\"layoutForm.enabled && highlightedFixtureFormId && fixture.get('_id')?.value === highlightedFixtureFormId\">\r\n\r\n                                <div class=\"col-1\">\r\n                                  <div class=\"d-flex align-items-center justify-content-center h-100\">\r\n                                    <svg dndDragImageRef style=\"cursor: move; opacity: 0.5\" width=\"25px\"\r\n                                      viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                                      <path\r\n                                        d=\"m 4.496094 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m -6 6 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 6 0 c -0.832032 0 -1.5 0.671875 -1.5 1.5 s 0.667968 1.5 1.5 1.5 c 0.828125 0 1.5 -0.671875 1.5 -1.5 s -0.671875 -1.5 -1.5 -1.5 z m 0 0\"\r\n                                        fill=\"grey\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n\r\n                                <div class=\"col-10\">\r\n                                  <lib-reactive-select formControlName=\"fixtureConfigId\" [idField]=\"'_id'\"\r\n                                    [nameField]=\"'name'\" [data]=\"fixtureTemplates\" [label]=\"'Fixture ' + (j + 1)\"\r\n                                    [search]=\"true\" [subTextField]=\"'subtext'\">\r\n                                  </lib-reactive-select>\r\n                                </div>\r\n\r\n                                <div class=\"col-1\" *ngIf=\"canMutateStructure\">\r\n                                  <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                    <svg (click)=\"deleteFixture('floor', j)\"\r\n                                      style=\"cursor: pointer; margin-bottom: 18px\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                      width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                      <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                        stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </ng-container>\r\n                          </div>\r\n                        </ng-container>\r\n\r\n                        <div *ngIf=\"canMutateStructure\" class=\"d-flex justify-content-end\">\r\n                          <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                            (click)=\"addNewFixture('floor')\">\r\n                            Add fixture\r\n                          </a>\r\n                        </div>\r\n\r\n                        <hr style=\"border-top: 1px dashed #000000;\" />\r\n\r\n                        <!-- Floor Other Elements -->\r\n                        <ng-container *ngIf=\"getFormFloorOtherElements.controls.length\">\r\n                          <div formArrayName=\"floorOtherElements\">\r\n                            <ng-container *ngFor=\"let fixture of getFormFloorOtherElements.controls; let j = index\">\r\n                              <div [formGroupName]=\"j\" class=\"row g-0 mb-5\">\r\n                                <div class=\"col-11\">\r\n                                  <label class=\"form-label mb-1\">Element {{ j + 1 }}</label>\r\n\r\n                                  <!-- Dropdown for type -->\r\n                                  <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\"\r\n                                    [data]=\"otherElementList\" [id]=\"'floorElementLabel' + j\" formControlName=\"type\">\r\n                                  </lib-reactive-select>\r\n\r\n                                  <!-- Conditional input for custom name -->\r\n                                  <input *ngIf=\"(fixture.get('type')?.value) === 'Others'\" type=\"text\"\r\n                                    class=\"form-control mt-2\" formControlName=\"customName\"\r\n                                    placeholder=\"Enter custom element name\" />\r\n                                </div>\r\n\r\n                                <div class=\"col-1\" *ngIf=\"canMutateStructure\">\r\n                                  <div class=\"d-flex align-items-end justify-content-center h-100\"\r\n                                    [class.disabled-click]=\"layoutForm.disabled\">\r\n                                    <svg (click)=\"removeOtherElement('floor', j)\"\r\n                                      style=\"cursor: pointer; margin-bottom: 18px\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                      width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\r\n                                      <path d=\"M9 1L1 9M1 1L9 9\" stroke=\"#344054\" stroke-width=\"2\"\r\n                                        stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                                    </svg>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </ng-container>\r\n                          </div>\r\n                        </ng-container>\r\n\r\n                        <div *ngIf=\"canMutateStructure\" class=\"d-flex justify-content-end\">\r\n                          <a class=\"link-btn\" [class.disabled-click]=\"layoutForm.disabled\"\r\n                            (click)=\"addNewOtherElements('floor')\">\r\n                            Add element\r\n                          </a>\r\n                        </div>\r\n                      </div>\r\n                    </ng-template>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </form>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Center Column -->\r\n      <div class=\"col overflow-hidden position-relative\" [ngClass]=\"{ 'd-none': editFixture }\">\r\n        <div id=\"canvas-card\" class=\"c-card position-relative\" #canvasContainer>\r\n          <!-- Canvas View -->\r\n          <div>\r\n            <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n          </div>\r\n\r\n          <!-- Layout Touchup: Detail/Tree view toggle + Tree View pane are\r\n               intentionally omitted. The tool operates purely on the canvas\r\n               so the user is never looking at a list-shaped representation. -->\r\n\r\n          <!-- PID Allocation -->\r\n          <!-- <div *ngIf=\"layoutForm.disabled\" style=\"top: 24px; left: 234px\"\r\n            class=\"position-absolute\">\r\n            <button type=\"button\" style=\"padding: 9px 19px !important;\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              [disabled]=\"getEntrances?.length >= 2\" (click)=\"onClickApplyLogics()\">\r\n              Apply Logics\r\n            </button>\r\n          </div> -->\r\n\r\n          <!-- Entrance Button — only when structure mutation is allowed. -->\r\n          <div *ngIf=\"canMutateStructure && layoutForm.enabled\" ngbTooltip=\"You can add up to two entrances.\" style=\"top: 24px; left: 234px\"\r\n            class=\"position-absolute\" [disableTooltip]=\"getEntrances?.length < 2\">\r\n            <button type=\"button\" style=\"padding: 9px 19px !important;\"\r\n              class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              [disabled]=\"getEntrances?.length >= 2\" (click)=\"addNewEntrance()\">\r\n              Add Entrance\r\n            </button>\r\n          </div>\r\n\r\n          <div *ngIf=\"layoutForm.enabled\" style=\"top: 24px; right: 192px\" class=\"position-absolute\">\r\n            <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3 bg-white shadow-sm\"\r\n              (click)=\"cancelEdit()\">\r\n              Cancel\r\n            </button>\r\n          </div>\r\n\r\n\r\n          <!-- Edit Button — Layout Touchup ignores task-state gates because the\r\n               whole point of the tool is to edit irrespective of verification\r\n               status. Only the initial-load guard (disableEdit) is honoured. -->\r\n          <button *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n            [disabled]=\"disableEdit\"\r\n            style=\"top: 24px; right: 164px\" type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"onClickEdit()\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_1322_5325)\">\r\n                <path\r\n                  d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n                  stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_1322_5325\">\r\n                  <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n            Edit\r\n          </button>\r\n\r\n          <!-- Rotate Button -->\r\n          <button style=\"top: 24px; right: 94px\" type=\"button\" *ngIf=\"layoutForm.disabled && selectedView === 'detail'\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"rotateCanvas(canvas,90)\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n              <path\r\n                d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n                fill=\"#1D2939\" />\r\n              <path d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n                stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n          </button>\r\n\r\n          <!-- Submit Button -->\r\n          <button *ngIf=\"!layoutForm.disabled\"\r\n            style=\"top: 24px; right: 94px;padding: 9px 20px !important;min-width: 90px;justify-content: center;\"\r\n            type=\"button\" class=\"btn btn-primary d-flex align-items-center gap-2 position-absolute bg-white shadow-sm\"\r\n            [disabled]=\"isSavingLayout\" (click)=\"updateLayout(true)\">\r\n            <span *ngIf=\"isSavingLayout\" class=\"spinner-border spinner-border-sm\" role=\"status\"\r\n              aria-hidden=\"true\"></span>\r\n            Save\r\n          </button>\r\n\r\n          <!-- Download Button -->\r\n          <button *ngIf=\"selectedView === 'detail'\" style=\"top: 24px; right: 26px\" type=\"button\"\r\n            class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n            (click)=\"downloadCanvas()\">\r\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n              stroke=\"#000000\" stroke-width=\"0.24000000000000005\">\r\n              <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n              <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n                stroke-width=\"0.384\"></g>\r\n              <g id=\"SVGRepo_iconCarrier\">\r\n                <path\r\n                  d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                  fill=\"#1D2939\"></path>\r\n                <path\r\n                  d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                  fill=\"#1D2939\"></path>\r\n              </g>\r\n            </svg>\r\n          </button>\r\n        </div>\r\n\r\n        <!-- Panel Collapse Handlers -->\r\n        <div class=\"collapse-handler left\" (click)=\"togglePanel('left')\">\r\n          <svg *ngIf=\"!isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M8.27308 12.636L4.63672 8.99964L8.27308 5.36328M13.364 12.636L9.72763 8.99964L13.364 5.36328\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n          <svg *ngIf=\"isLeftPanelCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n            viewBox=\"0 0 18 18\" fill=\"none\">\r\n            <path d=\"M9.72692 5.36399L13.3633 9.00036L9.72692 12.6367M4.63601 5.36399L8.27237 9.00036L4.63601 12.6367\"\r\n              stroke=\"#101828\" stroke-width=\"1.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </div>\r\n\r\n        <!-- Layout Touchup: right-panel collapse handle removed — the right\r\n             feedback column is gone in this flow. -->\r\n      </div>\r\n\r\n      <!-- Edit Fixture Body -->\r\n      <div class=\"col\" [ngClass]=\"{ 'd-none': !editFixture }\">\r\n        <div id=\"edit-body\" class=\"row\">\r\n          <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'basic-details'\"\r\n                [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Basic details\r\n              </a>\r\n            </li>\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'products'\"\r\n                [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Products\r\n              </a>\r\n            </li>\r\n            <li class=\"nav-item cursor-pointer\" role=\"presentation\" *ngIf=\"editFromTab !== 'zone'\">\r\n              <a (click)=\"submitFixture = false; editFixtureSection = 'vms'\"\r\n                [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n                Visual Merchandise\r\n              </a>\r\n            </li>\r\n          </ul>\r\n\r\n          <div class=\"col\">\r\n            <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n              <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\"\r\n                [isSubmitted]=\"submitFixture\" [revertOnEdit]=\"shouldRevertOnEdit\"\r\n                [zoneEditMode]=\"editFromTab === 'zone'\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-basic-details>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n              <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n                [revertOnEdit]=\"shouldRevertOnEdit\" [zoneEditMode]=\"editFromTab === 'zone'\"\r\n                (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-products>\r\n            </ng-container>\r\n\r\n            <ng-container *ngIf=\"editFixtureSection === 'vms' && editFromTab !== 'zone'\">\r\n              <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"true\" [isSubmitted]=\"submitFixture\"\r\n                [revertOnEdit]=\"shouldRevertOnEdit\" (submitEvent)=\"onFixtureSubmit($event)\">\r\n              </lib-instance-vms>\r\n            </ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Layout Touchup: right \"feedback\" column (Fixture/Zone verification\r\n           tabs, store-response panel) intentionally omitted. The verification\r\n           context is owned by the manage-planogram flow; touchup only renders\r\n           the canvas + per-fixture edit body. -->\r\n    </div>\r\n\r\n  </div>\r\n</section>\r\n\r\n<!-- Templates -->\r\n<ng-template #feedbackCol>\r\n  <div class=\"s-card s-card--tabbed\" [ngStyle]=\"{'margin-top':editFixture ? '72px' : '0px'}\">\r\n    <!-- @if(showFixturePreview && !isRightPanelCollapsed){\r\n      <fixture-preview [fixtureData]=\"selectedFixture?.fixtureData\"></fixture-preview>\r\n    } -->\r\n\r\n    <ul class=\"nav nav-pills feedback-tabs\" role=\"tablist\"\r\n      [ngClass]=\"{ 'd-none': isRightPanelCollapsed && !editFixture }\">\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"onFeedbackTabChange('fixture')\" [ngClass]=\"activeFeedbackTab === 'fixture' ? 'active' : ''\"\r\n          class=\"nav-link\" role=\"tab\">\r\n          Fixture Verification\r\n        </a>\r\n      </li>\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"onFeedbackTabChange('zone')\" [ngClass]=\"activeFeedbackTab === 'zone' ? 'active' : ''\"\r\n          class=\"nav-link d-flex align-items-center gap-2\" role=\"tab\">\r\n          Zone Verification\r\n          <span *ngIf=\"zonePendingCount > 0\" class=\"badge feedback-tab-badge\">\r\n            {{ zonePendingCount }}\r\n          </span>\r\n        </a>\r\n      </li>\r\n    </ul>\r\n\r\n    <div class=\"feedback-tab-content\">\r\n      <ng-container *ngIf=\"activeFeedbackTab === 'fixture'\">\r\n        <div *ngIf=\"showLayout && !isRightPanelCollapsed\">\r\n          <div class=\"card-body\">\r\n\r\n            <!-- Title -->\r\n            <div class=\"storeTitle mb-3\">Store response</div>\r\n            <hr>\r\n\r\n            <!-- Section Header -->\r\n            <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n              <h5 class=\"subTitle fw-semibold mb-0\">Fixture verification</h5>\r\n              <i class=\"bi bi-chevron-up text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"!toggle\"></i>\r\n              <i class=\"bi bi-chevron-down text-muted cursor-pointer\" (click)=\"toggle = !toggle\" *ngIf=\"toggle\"></i>\r\n            </div>\r\n            <div class=\"smallText text-muted d-block mb-4\">\r\n              Assigned on: {{storeFeedback?.fixtureData?.[0]?.taskData?.createdAt | date:'dd MMM YYY, hh:mm:SS a'}}\r\n            </div>\r\n\r\n\r\n            <div *ngIf=\"toggle\" class=\"mt-10\">\r\n              <!-- Column Headings -->\r\n              <div class=\"row text-muted small fw-semibold mb-5\">\r\n                <div class=\"col-6\"></div>\r\n                <div class=\"col-3 text-center lightText\">Before</div>\r\n                <div class=\"col-3 text-center lightText\">After</div>\r\n              </div>\r\n\r\n              <!-- Wall Fixtures -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Wall Fixtures</div>\r\n                <div class=\"col-3 text-center\">\r\n                  {{wallCount - clCount}}\r\n                </div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"(wallCount - clCount) != storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-up\"\r\n                    *ngIf=\"(wallCount - clCount) < storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>\r\n                  <i class=\"bi bi-arrow-down\"\r\n                    *ngIf=\"(wallCount - clCount) > storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures\"></i>{{storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Euro Centre Fixtures -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Euro Centre Fixtures</div>\r\n                <div class=\"col-3 text-center\">{{floorData.centerFixture.length}}</div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"floorData.centerFixture.length != storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-down\"\r\n                    *ngIf=\"floorData.centerFixture.length > storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n                  <i class=\"bi bi-arrow-up\"\r\n                    *ngIf=\"floorData.centerFixture.length < storeFeedback.fixtureData[0]?.answers?.[0]?.floorFixtures\"></i>\r\n                  {{storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures}}\r\n                </div>\r\n              </div>\r\n\r\n              <!-- Contact Lenses -->\r\n              <div class=\"row align-items-center py-2 mb-5 wallText\">\r\n                <div class=\"col-6\">Contact Lenses</div>\r\n                <div class=\"col-3 text-center\">{{clCount}}</div>\r\n                <div class=\"col-3 text-center fw-semibold\"\r\n                  [ngClass]=\"clCount != storeFeedback.fixtureData[0].answers?.[0]?.cl ? 'text-danger' : ''\">\r\n                  <i class=\"bi bi-arrow-down\" *ngIf=\"clCount > storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n                  <i class=\"bi bi-arrow-up\" *ngIf=\"clCount < storeFeedback.fixtureData[0].answers?.[0]?.cl\"></i>\r\n                  {{storeFeedback.fixtureData[0].answers?.[0]?.cl}}\r\n                </div>\r\n              </div>\r\n\r\n              <hr>\r\n\r\n              <!-- Total Section -->\r\n              <div class=\"row align-items-center\">\r\n                <div class=\"col-6 fw-semibold totalText\">Total</div>\r\n                <div class=\"col-3 text-center totalText\">\r\n                  <div class=\"total-box\">{{floorData.fixtureCount}}</div>\r\n                </div>\r\n                <div class=\"col-3 text-center totalText\">\r\n                  <div class=\"total-box\"\r\n                    [ngClass]=\"floorData.fixtureCount !== (storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures) ? 'text-center' :''\">\r\n                    {{storeFeedback.fixtureData[0].answers?.[0]?.cl + storeFeedback.fixtureData[0].answers?.[0]?.floorFixtures + storeFeedback.fixtureData[0].answers?.[0]?.wallFixtures}}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              @if (storeFeedback.fixtureData[0]?.answers?.[0]?.comments.length) {\r\n                <div id=\"fixture-comments\" class=\"mt-10\">\r\n                  <h5 class=\"mb-2\">Comments</h5>\r\n\r\n                  <div class=\"log-block\"\r\n                    *ngFor=\"let c of storeFeedback.fixtureData[0]?.answers[0]?.comments;let i= index\">\r\n                    <!-- User avatar -->\r\n                    <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <rect width=\"32\" height=\"32\" rx=\"16\" fill=\"#EAF8FF\" />\r\n                      <path\r\n                        d=\"M22.6673 23.5V21.8333C22.6673 20.9493 22.3161 20.1014 21.691 19.4763C21.0659 18.8512 20.218 18.5 19.334 18.5H12.6673C11.7833 18.5 10.9354 18.8512 10.3103 19.4763C9.68517 20.1014 9.33398 20.9493 9.33398 21.8333V23.5M19.334 11.8333C19.334 13.6743 17.8416 15.1667 16.0007 15.1667C14.1597 15.1667 12.6673 13.6743 12.6673 11.8333C12.6673 9.99238 14.1597 8.5 16.0007 8.5C17.8416 8.5 19.334 9.99238 19.334 11.8333Z\"\r\n                        stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                    </svg>\r\n\r\n                    <div class=\"d-flex gap-1 flex-column\">\r\n\r\n                      <div class=\"d-flex gap-1 flex-column\">\r\n                        <h4>{{c?.userName}}</h4>\r\n                        <p>{{c?.timeStamp | date:'hh:mm:ss a - dd MMM yyyy'}}</p>\r\n                      </div>\r\n\r\n                      @if(c?.responsetype === 'comment'){\r\n                        <h5>{{c?.comment}}</h5>\r\n                      }\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              }\r\n            </div>\r\n\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Layout Touchup: verification-feedback + zone-verification-feedback\r\n             panels intentionally omitted. Those panels host accept-AI /\r\n             keep-plano / redo / zone-merge buttons that mutate task state,\r\n             which the touchup flow must never trigger. -->\r\n      </ng-container>\r\n      <ng-container *ngIf=\"activeFeedbackTab === 'zone'\">\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #headerSkeleton>\r\n  <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer w-100 p-4 rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke mt-0 animate title\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n  <div class=\"row loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #noStoreVideo let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">No Store Video Found</h2>\r\n      <p>The video will be available once a request is raised and the store submits a complete store video.</p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Close</button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #applyLogics let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">Apply IVM Logics</h2>\r\n      <p>This will analyze the current layout and apply the pre-defined fixture logics.</p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end gap-3\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"applyPIDLogics()\">Proceed</button>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #approveLayoutModal let-modal>\r\n  <div class=\"modal-body\">\r\n    <div>\r\n      <h2 class=\"mb-3\">Approve layout/plan</h2>\r\n      <p>\r\n        Are you sure you want to approve the layout? Please ensure it has been thoroughly reviewed before approving.\r\n      </p>\r\n    </div>\r\n    <div class=\"d-flex justify-content-end gap-3\">\r\n      <button type=\"button\" class=\"btn btn-outline\" (click)=\"modal.close()\">Cancel</button>\r\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"approveLayout()\">\r\n        <span *ngIf=\"!isButtonLoading\">Approve</span>\r\n        <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n          <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n        </svg>\r\n      </button>\r\n    </div>\r\n  </div>\r\n</ng-template>","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { filter, lastValueFrom, Subject, takeUntil } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { DeleteConfirmationComponent } from '../popups/delete-confirmation/delete-confirmation.component';\r\n\r\ninterface LookPlanoCollectionListItem {\r\n  _id: string;\r\n  name: string;\r\n  description?: string;\r\n  isActive?: boolean;\r\n  looksCount?: number;\r\n  createdAt?: string;\r\n  updatedAt?: string;\r\n  createdByName?: string;\r\n  updatedByName?: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-look-plano-collection',\r\n  templateUrl: './look-plano-collection.component.html',\r\n  styleUrl: './look-plano-collection.component.scss',\r\n})\r\nexport class LookPlanoCollectionComponent implements OnInit, OnDestroy {\r\n  clientId: string = '';\r\n  loading = false;\r\n  items: LookPlanoCollectionListItem[] = [];\r\n  totalItems = 0;\r\n\r\n  // Access control — only emails in planostaticdatas `allowedLookUsers` may\r\n  // use the Looks feature. accessChecked gates the initial render so we don't\r\n  // flash the list before the check resolves.\r\n  accessChecked = false;\r\n  allowed = false;\r\n\r\n  searchTerm = '';\r\n  limit = 10;\r\n  offset = 1;\r\n  paginationSizes = [10, 20, 30];\r\n\r\n  sortedColumn = 'createdAt';\r\n  sortOrder: number = -1;\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private router: Router,\r\n    private modal: NgbModal,\r\n    private gs: GlobalStateService,\r\n    private builderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n\r\n    // Gate the whole page on the allowlist before wiring any data loads.\r\n    await this.checkAccess();\r\n    if (!this.allowed) return;\r\n\r\n    this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe((data) => {\r\n      const headerFilters = JSON.parse(localStorage.getItem('header-filters') || '{}');\r\n      this.clientId = data?.client || headerFilters?.client;\r\n      console.log('[Looks list] clientId resolved =', this.clientId);\r\n      if (this.clientId) this.loadList();\r\n    });\r\n\r\n    // Defensive: reload when this URL is navigated to (covers route reuse / back-button)\r\n    this.router.events\r\n      .pipe(\r\n        filter((e): e is NavigationEnd => e instanceof NavigationEnd),\r\n        takeUntil(this.destroy$),\r\n      )\r\n      .subscribe((e) => {\r\n        if (e.urlAfterRedirects.endsWith('/manage/planogram/looks') && this.clientId) {\r\n          this.loadList();\r\n        }\r\n      });\r\n  }\r\n\r\n  /** Resolve whether the session user may access Looks. Never throws. */\r\n  private async checkAccess(): Promise<void> {\r\n    try {\r\n      const res: any = await lastValueFrom(this.builderService.getLookAccess());\r\n      this.allowed = !!res?.data?.allowed;\r\n    } catch (err) {\r\n      console.log('@@ ~ checkAccess [ERR]:', err);\r\n      this.allowed = false;\r\n    } finally {\r\n      this.accessChecked = true;\r\n    }\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle('Looks');\r\n    this.pageInfo.setBreadcrumbs([\r\n      {\r\n        title: 'Planogram',\r\n        path: '/manage/planogram/manage-planograms',\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      { title: '', path: '', isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  async loadList() {\r\n    this.loading = true;\r\n    try {\r\n      const payload = {\r\n        clientId: this.clientId,\r\n        limit: this.limit,\r\n        offset: this.offset,\r\n        searchValue: this.searchTerm || '',\r\n        sortColumnName: this.sortedColumn,\r\n        sortBy: this.sortOrder,\r\n      };\r\n      console.log('[Looks list] POST /lookPlanoCollection/getCollectionList payload:', payload);\r\n      const res: any = await lastValueFrom(this.builderService.getLookPlanoCollectionList(payload));\r\n      console.log('[Looks list] response:', res);\r\n      this.items = res?.data?.items || [];\r\n      this.totalItems = res?.data?.total || 0;\r\n      console.log('[Looks list] items.length =', this.items.length, 'total =', this.totalItems);\r\n    } catch (err) {\r\n      console.log('@@ ~ loadList [ERR]:', err);\r\n      this.toast.getErrorToast?.('Failed to load Looks');\r\n    } finally {\r\n      this.loading = false;\r\n    }\r\n  }\r\n\r\n  onSearch() {\r\n    this.offset = 1;\r\n    this.loadList();\r\n  }\r\n\r\n  onPageChange(page: number) {\r\n    this.offset = page;\r\n    this.loadList();\r\n  }\r\n\r\n  onPageSizeChange(size: number) {\r\n    this.limit = size;\r\n    this.offset = 1;\r\n    this.loadList();\r\n  }\r\n\r\n  createNew() {\r\n    this.router.navigate(['/manage/planogram/looks/new']);\r\n  }\r\n\r\n  edit(item: LookPlanoCollectionListItem) {\r\n    this.router.navigate(['/manage/planogram/looks', item._id]);\r\n  }\r\n\r\n  async duplicate(item: LookPlanoCollectionListItem) {\r\n    try {\r\n      await lastValueFrom(this.builderService.duplicateLookPlanoCollection(item._id));\r\n      this.toast.getSuccessToast?.('Look collection duplicated');\r\n      this.loadList();\r\n    } catch (err) {\r\n      console.log('@@ ~ duplicate [ERR]:', err);\r\n      this.toast.getErrorToast?.('Failed to duplicate');\r\n    }\r\n  }\r\n\r\n  async confirmDelete(item: LookPlanoCollectionListItem) {\r\n    const ref = this.modal.open(DeleteConfirmationComponent, { centered: true, backdrop: 'static' });\r\n    ref.componentInstance.title = 'Delete Look Collection';\r\n    ref.componentInstance.description = `Are you sure you want to delete \"${item.name}\"?`;\r\n    try {\r\n      const result = await ref.result;\r\n      if (result === 'ok') {\r\n        await lastValueFrom(this.builderService.deleteLookPlanoCollection(item._id));\r\n        this.toast.getSuccessToast?.('Look collection deleted');\r\n        this.loadList();\r\n      }\r\n    } catch (_) {\r\n      // user dismissed\r\n    }\r\n  }\r\n\r\n  trackById(_: number, item: LookPlanoCollectionListItem) {\r\n    return item._id;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n}\r\n","<section class=\"looks-wrapper\">\r\n  <!-- Checking access -->\r\n  <div *ngIf=\"!accessChecked\" class=\"row mx-0 my-5\">\r\n    <div class=\"card p-5 col-md-12 text-center text-muted py-10\">Checking access…</div>\r\n  </div>\r\n\r\n  <!-- Access denied -->\r\n  <div *ngIf=\"accessChecked && !allowed\" class=\"row mx-0 my-5\">\r\n    <div class=\"card p-5 col-md-12\">\r\n      <div class=\"access-denied text-center py-10\">\r\n        <div class=\"access-denied-icon mb-4\">\r\n          <i class=\"bi bi-shield-lock\"></i>\r\n        </div>\r\n        <h3 class=\"mb-2\">Access denied</h3>\r\n        <p class=\"text-muted mb-0\">\r\n          You don't have permission to access Looks. Contact your administrator\r\n          to be added to the allowed users list.\r\n        </p>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <div *ngIf=\"accessChecked && allowed\" class=\"row mx-0 my-5\">\r\n    <div class=\"card p-5 col-md-12\">\r\n      <div class=\"d-flex justify-content-between align-items-center mb-5\">\r\n        <div>\r\n          <h4>Looks</h4>\r\n          <span>{{ totalItems }} - Total Look Collections</span>\r\n        </div>\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n          <div style=\"position: relative\">\r\n            <input\r\n              type=\"text\"\r\n              [(ngModel)]=\"searchTerm\"\r\n              (change)=\"onSearch()\"\r\n              style=\"padding-left: 3rem; padding-right: 3rem\"\r\n              class=\"form-control\"\r\n              name=\"search\"\r\n              autocomplete=\"off\"\r\n              placeholder=\"Search by name\"\r\n            />\r\n            <span class=\"search-icon\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" stroke-width=\"2\" />\r\n                <line x1=\"13\" y1=\"13\" x2=\"16\" y2=\"16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\r\n              </svg>\r\n            </span>\r\n            <button *ngIf=\"searchTerm\" type=\"button\" aria-label=\"Clear\" (click)=\"searchTerm = ''; onSearch()\" class=\"clear-search\">\r\n              <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                <path d=\"M9 9L15 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <path d=\"M15 9L9 15\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\r\n                <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></circle>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n          <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"createNew()\">+ New Look Collection</button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Loading -->\r\n      <div *ngIf=\"loading\" class=\"text-center text-muted py-10\">Loading…</div>\r\n\r\n      <!-- Empty state -->\r\n      <div *ngIf=\"!loading && items.length === 0\" class=\"text-center text-muted py-10\">\r\n        <div class=\"mb-3\">No Look collections yet.</div>\r\n        <button type=\"button\" class=\"btn btn-primary\" (click)=\"createNew()\">Create your first Look collection</button>\r\n      </div>\r\n\r\n      <!-- Table -->\r\n      <div class=\"table-responsive\" *ngIf=\"!loading && items.length > 0\">\r\n        <table class=\"table table-row-dashed align-middle gs-0 gy-3\">\r\n          <thead>\r\n            <tr class=\"fw-bolder text-muted text-uppercase fs-7\">\r\n              <th>Name</th>\r\n              <th>Description</th>\r\n              <th class=\"text-end\">Looks</th>\r\n              <th>Created By</th>\r\n              <th>Created At</th>\r\n              <th class=\"text-end\">Action</th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <tr *ngFor=\"let item of items; trackBy: trackById\">\r\n              <td>\r\n                <a class=\"text-dark fw-bold text-hover-primary cursor-pointer\" (click)=\"edit(item)\">{{ item.name }}</a>\r\n                <span *ngIf=\"item.isActive\" class=\"badge badge-light-success ms-2 active-look-badge\">\r\n                  <span class=\"active-dot\"></span>Active\r\n                </span>\r\n              </td>\r\n              <td>{{ item.description || '—' }}</td>\r\n              <td class=\"text-end\">{{ item.looksCount || 0 }}</td>\r\n              <td>{{ item.createdByName || '—' }}</td>\r\n              <td>{{ item.createdAt | date: 'mediumDate' }}</td>\r\n              <td class=\"text-end\">\r\n                <button type=\"button\" class=\"btn btn-sm btn-light-primary me-2\" (click)=\"edit(item)\">Edit</button>\r\n                <button type=\"button\" class=\"btn btn-sm btn-light me-2\" (click)=\"duplicate(item)\">Duplicate</button>\r\n                <button type=\"button\" class=\"btn btn-sm btn-light-danger\" (click)=\"confirmDelete(item)\">Delete</button>\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  HostListener,\r\n  Input,\r\n  OnChanges,\r\n  OnDestroy,\r\n  SimpleChanges,\r\n  ViewChild,\r\n  forwardRef,\r\n} from '@angular/core';\r\nimport {\r\n  ControlValueAccessor,\r\n  FormsModule,\r\n  NG_VALUE_ACCESSOR,\r\n  ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\n@Component({\r\n  selector: 'lib-searchable-select',\r\n  templateUrl: './searchable-select.component.html',\r\n  styleUrl: './searchable-select.component.scss',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, ReactiveFormsModule],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => SearchableSelectComponent),\r\n      multi: true,\r\n    },\r\n  ],\r\n})\r\nexport class SearchableSelectComponent\r\n  implements ControlValueAccessor, OnChanges, OnDestroy {\r\n  // Only one dropdown is open at a time across the page.\r\n  static activeDropdown: SearchableSelectComponent | null = null;\r\n\r\n  @Input() items: any[] = [];\r\n  @Input() idField: string = 'value';\r\n  @Input() nameField: string = 'label';\r\n  @Input() searchField: string = '';\r\n  @Input() placeholder: string = 'Select';\r\n  @Input() multiple: boolean = false;\r\n  @Input() compact: boolean = false;\r\n\r\n  @ViewChild('trigger') triggerRef?: ElementRef<HTMLElement>;\r\n\r\n  selectedSingle: string = '';\r\n  selectedMulti: string[] = [];\r\n\r\n  open: boolean = false;\r\n  searchTerm: string = '';\r\n  filteredItems: any[] = [];\r\n  isDisabled: boolean = false;\r\n\r\n  // The panel renders with position:fixed so it escapes the overflow:auto\r\n  // clipping of the placements scroll container (it would otherwise be cut\r\n  // off / hidden inside the card for the bottom rows). These styles anchor\r\n  // it to the trigger and are recomputed on scroll/resize while open.\r\n  panelStyle: { [k: string]: string } = {};\r\n\r\n  // Approx panel height (search box + options max-height + padding) used to\r\n  // decide whether to drop down or flip up.\r\n  private static readonly PANEL_HEIGHT = 290;\r\n\r\n  private onChange: (v: any) => void = () => {};\r\n  private onTouched: () => void = () => {};\r\n\r\n  // Bound once so add/removeEventListener reference the same function.\r\n  private readonly reposition = (): void => {\r\n    if (this.open) {\r\n      this.updatePanelPosition();\r\n      this.cd.markForCheck();\r\n    }\r\n  };\r\n\r\n  constructor(\r\n    private elementRef: ElementRef,\r\n    private cd: ChangeDetectorRef,\r\n  ) {}\r\n\r\n  ngOnDestroy(): void {\r\n    this.detachViewportListeners();\r\n    if (SearchableSelectComponent.activeDropdown === this) {\r\n      SearchableSelectComponent.activeDropdown = null;\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['items'] || changes['searchField']) {\r\n      this.applyFilter();\r\n    }\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: MouseEvent): void {\r\n    if (!this.open) return;\r\n    if (!this.elementRef.nativeElement.contains(event.target)) {\r\n      this.closePanel();\r\n      this.cd.markForCheck();\r\n    }\r\n  }\r\n\r\n  // ControlValueAccessor\r\n  writeValue(value: any): void {\r\n    if (this.multiple) {\r\n      this.selectedMulti = Array.isArray(value) ? value.map(String) : [];\r\n    } else {\r\n      this.selectedSingle = value != null && value !== '' ? String(value) : '';\r\n    }\r\n  }\r\n  registerOnChange(fn: any): void { this.onChange = fn; }\r\n  registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n  setDisabledState?(isDisabled: boolean): void { this.isDisabled = isDisabled; }\r\n\r\n  toggleOpen(event?: MouseEvent): void {\r\n    if (this.isDisabled) return;\r\n    event?.stopPropagation();\r\n    if (this.open) {\r\n      this.closePanel();\r\n      return;\r\n    }\r\n    if (\r\n      SearchableSelectComponent.activeDropdown\r\n        && SearchableSelectComponent.activeDropdown !== this\r\n    ) {\r\n      SearchableSelectComponent.activeDropdown.closePanel();\r\n      SearchableSelectComponent.activeDropdown.cd.markForCheck();\r\n    }\r\n    this.open = true;\r\n    this.onTouched();\r\n    SearchableSelectComponent.activeDropdown = this;\r\n    this.applyFilter();\r\n    this.attachViewportListeners();\r\n    // Compute now (the trigger is always in the DOM) so the panel renders\r\n    // pre-positioned with no first-frame flash, then recompute next tick in\r\n    // case layout shifted when the panel mounted.\r\n    this.updatePanelPosition();\r\n    setTimeout(() => {\r\n      this.updatePanelPosition();\r\n      this.cd.markForCheck();\r\n    });\r\n  }\r\n\r\n  /** Close the panel and release the scroll/resize listeners. */\r\n  private closePanel(): void {\r\n    this.open = false;\r\n    this.detachViewportListeners();\r\n    if (SearchableSelectComponent.activeDropdown === this) {\r\n      SearchableSelectComponent.activeDropdown = null;\r\n    }\r\n  }\r\n\r\n  private attachViewportListeners(): void {\r\n    // Capture phase so scrolls on any ancestor (e.g. the placements\r\n    // overflow:auto container) are caught — scroll events don't bubble.\r\n    window.addEventListener('scroll', this.reposition, true);\r\n    window.addEventListener('resize', this.reposition);\r\n  }\r\n\r\n  private detachViewportListeners(): void {\r\n    window.removeEventListener('scroll', this.reposition, true);\r\n    window.removeEventListener('resize', this.reposition);\r\n  }\r\n\r\n  /** Anchor the fixed-position panel to the trigger, flipping above it when\r\n   *  there isn't enough room below. */\r\n  private updatePanelPosition(): void {\r\n    const trigger = this.triggerRef?.nativeElement;\r\n    if (!trigger) return;\r\n    const rect = trigger.getBoundingClientRect();\r\n    const viewportH = window.innerHeight;\r\n    const spaceBelow = viewportH - rect.bottom;\r\n    const spaceAbove = rect.top;\r\n    const dropUp =\r\n      spaceBelow < SearchableSelectComponent.PANEL_HEIGHT\r\n        && spaceAbove > spaceBelow;\r\n\r\n    const style: { [k: string]: string } = {\r\n      position: 'fixed',\r\n      left: `${Math.round(rect.left)}px`,\r\n      width: `${Math.round(rect.width)}px`,\r\n      'z-index': '2000',\r\n    };\r\n    if (dropUp) {\r\n      style['bottom'] = `${Math.round(viewportH - rect.top + 4)}px`;\r\n      // Cap the panel to the space above so it never runs off the top edge.\r\n      style['max-height'] = `${Math.max(160, Math.round(spaceAbove - 8))}px`;\r\n    } else {\r\n      style['top'] = `${Math.round(rect.bottom + 4)}px`;\r\n      style['max-height'] = `${Math.max(160, Math.round(spaceBelow - 8))}px`;\r\n    }\r\n    this.panelStyle = style;\r\n  }\r\n\r\n  applyFilter(): void {\r\n    const term = (this.searchTerm || '').trim().toLowerCase();\r\n    const field = this.searchField || this.nameField;\r\n    if (!term) {\r\n      this.filteredItems = (this.items || []).slice();\r\n      return;\r\n    }\r\n    this.filteredItems = (this.items || []).filter((it) => {\r\n      const v = String(it?.[field] ?? '').toLowerCase();\r\n      return v.includes(term);\r\n    });\r\n  }\r\n\r\n  onSearchChange(): void {\r\n    this.applyFilter();\r\n  }\r\n\r\n  isSelected(item: any): boolean {\r\n    const id = String(item?.[this.idField] ?? '');\r\n    return this.multiple\r\n      ? this.selectedMulti.includes(id)\r\n      : this.selectedSingle === id;\r\n  }\r\n\r\n  selectItem(item: any, event?: MouseEvent): void {\r\n    if (this.isDisabled) return;\r\n    event?.stopPropagation();\r\n    const id = String(item?.[this.idField] ?? '');\r\n    if (this.multiple) {\r\n      const idx = this.selectedMulti.indexOf(id);\r\n      if (idx >= 0) this.selectedMulti.splice(idx, 1);\r\n      else this.selectedMulti.push(id);\r\n      this.onChange([...this.selectedMulti]);\r\n    } else {\r\n      this.selectedSingle = id;\r\n      this.onChange(id);\r\n      this.closePanel();\r\n    }\r\n    this.onTouched();\r\n  }\r\n\r\n  removeChip(id: string, event: Event): void {\r\n    event.stopPropagation();\r\n    if (this.isDisabled) return;\r\n    const idx = this.selectedMulti.indexOf(id);\r\n    if (idx >= 0) {\r\n      this.selectedMulti.splice(idx, 1);\r\n      this.onChange([...this.selectedMulti]);\r\n      this.onTouched();\r\n    }\r\n  }\r\n\r\n  clearAll(event: Event): void {\r\n    event.stopPropagation();\r\n    if (this.isDisabled) return;\r\n    if (this.multiple) {\r\n      this.selectedMulti = [];\r\n      this.onChange([]);\r\n    } else {\r\n      this.selectedSingle = '';\r\n      this.onChange('');\r\n    }\r\n    this.onTouched();\r\n  }\r\n\r\n  getItemLabel(id: string): string {\r\n    const item = (this.items || []).find(\r\n      (it) => String(it?.[this.idField] ?? '') === id,\r\n    );\r\n    return item ? String(item[this.nameField] ?? id) : id;\r\n  }\r\n\r\n  get hasSelection(): boolean {\r\n    return this.multiple ? this.selectedMulti.length > 0 : this.selectedSingle !== '';\r\n  }\r\n\r\n  trackById = (_: number, item: any): string =>\r\n    String(item?.[this.idField] ?? _);\r\n}\r\n","<div class=\"ss-root\" [class.disabled]=\"isDisabled\" [class.compact]=\"compact\">\r\n  <div class=\"ss-trigger\" #trigger (click)=\"toggleOpen($event)\">\r\n    <ng-container *ngIf=\"multiple; else singleDisplay\">\r\n      <ng-container *ngIf=\"selectedMulti.length; else placeholderTpl\">\r\n        <span class=\"ss-chip\" *ngFor=\"let id of selectedMulti\">\r\n          <span class=\"ss-chip-label\">{{ getItemLabel(id) }}</span>\r\n          <button type=\"button\" class=\"ss-chip-x\"\r\n            (click)=\"removeChip(id, $event)\" tabindex=\"-1\">×</button>\r\n        </span>\r\n      </ng-container>\r\n    </ng-container>\r\n\r\n    <ng-template #singleDisplay>\r\n      <span *ngIf=\"selectedSingle; else placeholderTpl\" class=\"ss-selected\">\r\n        {{ getItemLabel(selectedSingle) }}\r\n      </span>\r\n    </ng-template>\r\n\r\n    <ng-template #placeholderTpl>\r\n      <span class=\"ss-placeholder\">{{ placeholder }}</span>\r\n    </ng-template>\r\n\r\n    <span class=\"ss-actions\">\r\n      <button *ngIf=\"hasSelection\" type=\"button\" class=\"ss-clear\"\r\n        (click)=\"clearAll($event)\" tabindex=\"-1\" aria-label=\"Clear\">×</button>\r\n      <span class=\"ss-arrow\" [class.open]=\"open\" aria-hidden=\"true\">▾</span>\r\n    </span>\r\n  </div>\r\n\r\n  <div class=\"ss-panel\" *ngIf=\"open\" [ngStyle]=\"panelStyle\" (click)=\"$event.stopPropagation()\">\r\n    <div class=\"ss-search\">\r\n      <input\r\n        type=\"text\"\r\n        class=\"form-control form-control-sm\"\r\n        placeholder=\"Search\"\r\n        autocomplete=\"off\"\r\n        [(ngModel)]=\"searchTerm\"\r\n        (ngModelChange)=\"onSearchChange()\" />\r\n    </div>\r\n    <div class=\"ss-options\">\r\n      <div *ngIf=\"filteredItems.length === 0\" class=\"ss-empty\">No results</div>\r\n      <div\r\n        *ngFor=\"let item of filteredItems; trackBy: trackById\"\r\n        class=\"ss-option\"\r\n        [class.selected]=\"isSelected(item)\"\r\n        (click)=\"selectItem(item, $event)\">\r\n        <input *ngIf=\"multiple\" type=\"checkbox\" [checked]=\"isSelected(item)\" tabindex=\"-1\" />\r\n        <span class=\"ss-option-label\">{{ item[nameField] }}</span>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, forwardRef, Input } from '@angular/core';\r\nimport {\r\n  ControlValueAccessor,\r\n  FormsModule,\r\n  NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\n\r\n/**\r\n * Free-text chips/tag input. The user types a value and presses Enter to turn\r\n * it into a chip; chips are removed with their × button (or Backspace on an\r\n * empty input). Binds to a reactive form control as a `string[]`.\r\n *\r\n * Unlike multiselect-chip-dropdown / searchable-select (which pick from a\r\n * predefined list), this accepts arbitrary text — there is no options list.\r\n */\r\n@Component({\r\n  selector: 'lib-chips-input',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './chips-input.component.html',\r\n  styleUrl: './chips-input.component.scss',\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => ChipsInputComponent),\r\n      multi: true,\r\n    },\r\n  ],\r\n})\r\nexport class ChipsInputComponent implements ControlValueAccessor {\r\n  @Input() placeholder = 'Type and press Enter';\r\n  /** Allow the same value to appear more than once. Off by default. */\r\n  @Input() allowDuplicates = false;\r\n\r\n  chips: string[] = [];\r\n  inputValue = '';\r\n  isDisabled = false;\r\n\r\n  private onChange: (value: string[]) => void = () => {};\r\n  private onTouched: () => void = () => {};\r\n\r\n  writeValue(value: string[]): void {\r\n    this.chips = Array.isArray(value) ? [...value] : [];\r\n  }\r\n  registerOnChange(fn: (value: string[]) => void): void {\r\n    this.onChange = fn;\r\n  }\r\n  registerOnTouched(fn: () => void): void {\r\n    this.onTouched = fn;\r\n  }\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.isDisabled = isDisabled;\r\n  }\r\n\r\n  /** Enter → commit the typed text as a new chip. */\r\n  onEnter(event: Event): void {\r\n    event.preventDefault();\r\n    this.addChip();\r\n  }\r\n\r\n  /** Commit any pending text when focus leaves, and mark the control touched. */\r\n  onBlur(): void {\r\n    this.addChip();\r\n    this.onTouched();\r\n  }\r\n\r\n  /** Backspace on an empty input removes the last chip (standard tag-input UX). */\r\n  onBackspace(): void {\r\n    if (this.isDisabled || this.inputValue || !this.chips.length) return;\r\n    this.chips = this.chips.slice(0, -1);\r\n    this.emit();\r\n  }\r\n\r\n  addChip(): void {\r\n    if (this.isDisabled) return;\r\n    const value = this.inputValue.trim();\r\n    if (!value) return;\r\n    const dup = this.chips.some((c) => c.toLowerCase() === value.toLowerCase());\r\n    if (!this.allowDuplicates && dup) {\r\n      this.inputValue = '';\r\n      return;\r\n    }\r\n    this.chips = [...this.chips, value];\r\n    this.inputValue = '';\r\n    this.emit();\r\n  }\r\n\r\n  removeChip(index: number): void {\r\n    if (this.isDisabled) return;\r\n    this.chips = this.chips.filter((_, i) => i !== index);\r\n    this.emit();\r\n  }\r\n\r\n  private emit(): void {\r\n    this.onChange(this.chips);\r\n    this.onTouched();\r\n  }\r\n}\r\n","<div class=\"chips-input\" [class.disabled]=\"isDisabled\" (click)=\"textInput.focus()\">\r\n  <span class=\"chip\" *ngFor=\"let chip of chips; let i = index\">\r\n    <span class=\"chip-label\">{{ chip }}</span>\r\n    <button\r\n      type=\"button\"\r\n      class=\"chip-x\"\r\n      [disabled]=\"isDisabled\"\r\n      (click)=\"$event.stopPropagation(); removeChip(i)\"\r\n    >&times;</button>\r\n  </span>\r\n  <input\r\n    #textInput\r\n    type=\"text\"\r\n    class=\"chip-text\"\r\n    [(ngModel)]=\"inputValue\"\r\n    [placeholder]=\"chips.length ? '' : placeholder\"\r\n    [disabled]=\"isDisabled\"\r\n    (keydown.enter)=\"onEnter($event)\"\r\n    (keydown.backspace)=\"onBackspace()\"\r\n    (blur)=\"onBlur()\"\r\n  />\r\n</div>\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { debounceTime, lastValueFrom, Subject, takeUntil } from 'rxjs';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { StoreBuilderService } from '../../services/store-builder.service';\r\nimport { PlanoDataService } from '../../services/plano-data.service';\r\n\r\n@Component({\r\n  selector: 'lib-look-plano-collection-form',\r\n  templateUrl: './look-plano-collection-form.component.html',\r\n  styleUrl: './look-plano-collection-form.component.scss',\r\n})\r\nexport class LookPlanoCollectionFormComponent implements OnInit, OnDestroy {\r\n  clientId = '';\r\n  collectionId: string | null = null;\r\n  isNew = true;\r\n  loading = false;\r\n  saving = false;\r\n\r\n  // Access control — mirrors the Looks list page. Only emails in\r\n  // planostaticdatas `allowedLookUsers` may open the form.\r\n  accessChecked = false;\r\n  allowed = false;\r\n\r\n  form!: FormGroup;\r\n  selectedLookIndex: number = -1;\r\n  selectedSlotIndex: number = -1;\r\n\r\n  // Display labels are Wall / Floor; the stored ids stay 'shelf' / 'eurocenter'\r\n  // so the library filter, slot defaults, and the backend slotType/fixtureType\r\n  // enums keep working unchanged ('shelf' → wall fixtures, 'eurocenter' → floor).\r\n  readonly fixtureTypeOptions = [\r\n    { id: 'shelf', name: 'Wall' },\r\n    { id: 'eurocenter', name: 'Floor' },\r\n  ];\r\n\r\n  fixtureLibraryItems: { id: string; name: string; fixtureType: string }[] = [];\r\n\r\n  // MBQ bucket / Brand / Fixture Header dropdown options, seeded from the\r\n  // sheet into planostaticdatas (type='lookComboOptions'). The form fields\r\n  // are searchable selects so the user picks a known value rather than typing.\r\n  // All three are flat lists of every distinct value present in the sheet —\r\n  // they are NOT cross-filtered, so e.g. the Brand dropdown always offers all\r\n  // brands regardless of which MBQ bucket the look uses.\r\n  mbqBucketItems: { value: string; label: string }[] = [];\r\n  brandItems: { value: string; label: string }[] = [];\r\n  fixtureHeaderItems: { value: string; label: string }[] = [];\r\n  // Raw payload from the comboOptions endpoint, kept so we can rebuild the\r\n  // option lists by merging it with the values already present on the loaded\r\n  // collection (so the dropdowns are never empty even if the endpoint is\r\n  // unavailable or hasn't loaded yet).\r\n  private comboRaw: {\r\n    mbqBuckets: string[];\r\n    brands: string[];\r\n    fixtureHeaders: string[];\r\n    combinations: { mbqBucket: string; brand: string; fixtureHeader: string }[];\r\n  } = { mbqBuckets: [], brands: [], fixtureHeaders: [], combinations: [] };\r\n\r\n  // Dropdowns inside placement rows.\r\n  vmTypeOptions: { value: string; label: string }[] = [];\r\n  vmArtworkOptions: { value: string; label: string; vmType?: string }[] = [];\r\n  productOptions: { value: string; label: string }[] = [];\r\n  /** Cached per-vmType artwork list — same reference returned each lookup so\r\n   *  lib-reactive-select doesn't reset state every CD cycle. */\r\n  private vmArtworkByType: Map<string, { value: string; label: string }[]> = new Map();\r\n  /** (vmName||vmType) and (vmName) → planovm _id, so a VM placement's artwork\r\n   *  name can be resolved to the _id the embedded VM editor matches against. */\r\n  private vmIdByNameType: Map<string, string> = new Map();\r\n  /**\r\n   * Cached filtered list bound to the \"Fixture libraries\" multiselect.\r\n   * Must NOT be a getter — the underlying multiselect re-clones its items on\r\n   * every ngOnChanges, which detaches click targets and breaks selection.\r\n   */\r\n  fixtureLibraryItemsForSlot: { id: string; name: string; fixtureType: string }[] = [];\r\n\r\n  // State for the per-slot Fixture Library Configuration card.\r\n  selectedLibraryIdInMap: string = '';\r\n  selectedLibraryDetails: any = null;\r\n  loadingLibraryDetails: boolean = false;\r\n  embeddedTab: 'products' | 'vms' = 'products';\r\n\r\n  // === Fixture Library Configuration card helpers ===\r\n\r\n  /** Slot's placements with kind = 'vm', exposed as dropdown items. */\r\n  get currentSlotVmItems(): { id: string; name: string }[] {\r\n    return this.placementsToItems('vm');\r\n  }\r\n\r\n  /** Slot's placements with kind = 'pid', exposed as dropdown items. */\r\n  get currentSlotPidItems(): { id: string; name: string }[] {\r\n    return this.placementsToItems('pid');\r\n  }\r\n\r\n  private placementsToItems(kind: 'vm' | 'pid'): { id: string; name: string }[] {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return [];\r\n    const arr = slot.get('placements') as FormArray | null;\r\n    if (!arr) return [];\r\n    return arr.controls\r\n        .map((c) => c.value)\r\n        .filter((p: any) => p?.kind === kind && p?.position)\r\n        .map((p: any) => ({\r\n          id: p.position,\r\n          name: p.rawValue ? `${p.position} — ${p.rawValue}` : p.position,\r\n        }));\r\n  }\r\n\r\n  /** Fixture-library options for the dropdown — filtered to the libraries\r\n   *  selected on the currently-active slot's multiselect. */\r\n  get selectedSlotLibrariesForDropdown(): { id: string; name: string }[] {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return [];\r\n    const refs: string[] = slot.get('fixtureLibraryRefs')?.value || [];\r\n    return this.fixtureLibraryItems.filter((item) => refs.includes(item.id));\r\n  }\r\n\r\n  /** The FormArray that stores per-(library, shelf) VM/PID values for the active slot. */\r\n  get selectedSlotLibraryConfigs(): FormArray | null {\r\n    const slot = this.selectedSlotGroup;\r\n    return slot ? (slot.get('libraryConfigurations') as FormArray) : null;\r\n  }\r\n\r\n  /** Form-array entries scoped to the currently-shown library in the config card. */\r\n  configEntriesForCurrentLibrary(): { control: FormGroup; arrayIndex: number }[] {\r\n    const configs = this.selectedSlotLibraryConfigs;\r\n    if (!configs || !this.selectedLibraryIdInMap) return [];\r\n    return configs.controls\r\n        .map((c, i) => ({ control: c as FormGroup, arrayIndex: i }))\r\n        .filter((x) => x.control.get('libraryRef')?.value === this.selectedLibraryIdInMap);\r\n  }\r\n\r\n  /** Reset card state whenever the active slot changes so we don't carry over\r\n   *  stale selections from a previously-viewed slot. */\r\n  private resetLibraryMap(): void {\r\n    this.selectedLibraryIdInMap = '';\r\n    this.selectedLibraryDetails = null;\r\n    this.refreshEmbeddedHostKeys();\r\n    // Clear the shared BehaviorSubject too so the embedded TemplateProducts /\r\n    // TemplateVms components, if they're still mounted, don't render stale\r\n    // data from the previous slot's library.\r\n    this.planoDataService.fixtureTemplateDetails.next(null);\r\n  }\r\n\r\n  /** When a slot is loaded, automatically pick the first library it has linked\r\n   *  so the embedded fixture-template editor opens straight to that library. */\r\n  private autoSelectFirstLibrary(): void {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return;\r\n    const refs: string[] = slot.get('fixtureLibraryRefs')?.value || [];\r\n    const firstId = refs.find((id) => !!id);\r\n    if (!firstId) return;\r\n    if (this.selectedLibraryIdInMap === firstId) return;\r\n    this.onLibraryMapSelect(firstId);\r\n  }\r\n\r\n  /** Read the slot's saved snapshot for a library, if any. */\r\n  private getLibrarySnapshot(libId: string): any | null {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return null;\r\n    const snaps: any[] = slot.get('librarySnapshots')?.value || [];\r\n    const entry = snaps.find((s) => s?.libraryRef === libId);\r\n    return entry?.snapshot || null;\r\n  }\r\n\r\n  /** Persist a snapshot into the slot's librarySnapshots FormControl. */\r\n  private captureLibrarySnapshot(libId: string, snapshot: any): void {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot || !libId) return;\r\n    const ctrl = slot.get('librarySnapshots');\r\n    if (!ctrl) return;\r\n    const current: any[] = Array.isArray(ctrl.value) ? [...ctrl.value] : [];\r\n    // Strip the ignoreUpdate flag before saving so we don't echo it back later.\r\n    const { ignoreUpdate: _ignored, ...clean } = snapshot || {};\r\n    const i = current.findIndex((s) => s?.libraryRef === libId);\r\n    if (i >= 0) {\r\n      current[i] = { libraryRef: libId, snapshot: clean };\r\n    } else {\r\n      current.push({ libraryRef: libId, snapshot: clean });\r\n    }\r\n    ctrl.setValue(current);\r\n  }\r\n\r\n  /**\r\n   * Initial vmConfig coords for a freshly-added VM entry, derived from the\r\n   * vmType and the target library's shelf layout. Mirrors the wall-layout\r\n   * rules in `runLooksAllocation` (onboard.controller.js:buildWallVmEntry)\r\n   * so what the form pre-positions matches what the backend allocator would\r\n   * place there.\r\n   *\r\n   *   Top Masking      -> first shelf,  stretch (top strip of fixture)\r\n   *   Mid 1 / Mid      -> first mid shelf, left\r\n   *   Mid 2            -> last mid shelf,  right\r\n   *   Mid 3            -> middle mid shelf (or last), stretch\r\n   *   Bottom Slanter   -> last shelf,    stretch (bottom strip)\r\n   *\r\n   * Anything else falls back to the previous neutral default (top, no zone)\r\n   * so behaviour doesn't change for unknown labels.\r\n   */\r\n  private initialVmLayout(vmType: string, shelfConfig: any[]):\r\n      { startYPosition: number; endYPosition: number; xZone: string; yZone: string } {\r\n    const norm = String(vmType ?? '').trim().toLowerCase();\r\n    const shelves = Array.isArray(shelfConfig)\r\n      ? shelfConfig.slice().sort(\r\n          (a, b) => (a?.shelfNumber || 0) - (b?.shelfNumber || 0),\r\n        )\r\n      : [];\r\n    const inZone = (z: string): any[] => {\r\n      const target = z.toLowerCase();\r\n      return shelves.filter(\r\n          (s) => String(s?.zone ?? '').trim().toLowerCase() === target,\r\n      );\r\n    };\r\n    const firstShelf = shelves[0]?.shelfNumber || 1;\r\n    const lastShelf = shelves[shelves.length - 1]?.shelfNumber || firstShelf;\r\n\r\n    if (norm === 'top masking' || norm === 'top') {\r\n      return { startYPosition: firstShelf, endYPosition: firstShelf, xZone: 'stretch', yZone: 'stretch' };\r\n    }\r\n    if (norm === 'mid 1' || norm === 'mid') {\r\n      const m = inZone('Mid');\r\n      const sn = m[0]?.shelfNumber || firstShelf;\r\n      return { startYPosition: sn, endYPosition: sn, xZone: 'left', yZone: 'stretch' };\r\n    }\r\n    if (norm === 'mid 2') {\r\n      const m = inZone('Mid');\r\n      const sn = m[m.length - 1]?.shelfNumber || firstShelf;\r\n      return { startYPosition: sn, endYPosition: sn, xZone: 'right', yZone: 'stretch' };\r\n    }\r\n    if (norm === 'mid 3') {\r\n      const m = inZone('Mid');\r\n      const target = m.length >= 3 ? m[Math.floor(m.length / 2)] : m[m.length - 1];\r\n      const sn = target?.shelfNumber || firstShelf;\r\n      return { startYPosition: sn, endYPosition: sn, xZone: 'stretch', yZone: 'stretch' };\r\n    }\r\n    if (norm === 'bottom slanter') {\r\n      return { startYPosition: lastShelf, endYPosition: lastShelf, xZone: 'stretch', yZone: 'stretch' };\r\n    }\r\n    return { startYPosition: 1, endYPosition: 1, xZone: '', yZone: '' };\r\n  }\r\n\r\n  /** Resolve a VM placement's artwork NAME (+ vmType) to its planovm _id. */\r\n  private resolveVmId(vmName: string, vmType: string): string {\r\n    const name = this.normVmType(vmName);\r\n    const type = this.normVmType(vmType);\r\n    return (\r\n      this.vmIdByNameType.get(`${name}||${type}`) ||\r\n      this.vmIdByNameType.get(name) ||\r\n      vmName\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Re-derive every assigned library's snapshot from the active slot's\r\n   * current placements. Driven by the \"Look and Visual Merchandising\r\n   * Placements\" list — so editing one placement updates ALL assigned\r\n   * libraries at once.\r\n   *\r\n   *  - PID placements: `position` (Top/Mid/Bottom) → shelf zone; the shelf's\r\n   *    productBrandName is OVERWRITTEN with the placement's product list.\r\n   *  - VM placements: `position` → vmType; the matching vmConfig entry's\r\n   *    artwork (vmId/vmName) is updated while the library keeps its own VM\r\n   *    positions. vmTypes not yet present are appended.\r\n   */\r\n  private async applyPlacementsToAssignedLibraries(): Promise<void> {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return;\r\n    const refs: string[] = (slot.get('fixtureLibraryRefs')?.value || [])\r\n        .filter((r: string) => !!r);\r\n    if (!refs.length) return;\r\n\r\n    const placements: any[] = (slot.get('placements') as FormArray | null)?.value || [];\r\n    const norm = (s: any): string => String(s ?? '').trim().toLowerCase();\r\n\r\n    // zone -> product list (PIDs); supports both rawValues[] and legacy rawValue.\r\n    const pidByZone = new Map<string, string[]>();\r\n    for (const p of placements) {\r\n      if (p?.kind !== 'pid' || !p?.position) continue;\r\n      const vals: string[] = Array.isArray(p.rawValues) && p.rawValues.length\r\n        ? p.rawValues.filter((v: string) => !!v)\r\n        : (p.rawValue ? [ String(p.rawValue) ] : []);\r\n      if (vals.length) pidByZone.set(norm(p.position), vals);\r\n    }\r\n\r\n    // vmType -> { vmId, vmName, label } (VMs)\r\n    const vmByType = new Map<string, { vmId: string; vmName: string; label: string }>();\r\n    for (const p of placements) {\r\n      if (p?.kind !== 'vm' || !p?.position || !p?.rawValue) continue;\r\n      const label = String(p.position);\r\n      vmByType.set(norm(label), {\r\n        vmId: this.resolveVmId(String(p.rawValue), label),\r\n        vmName: String(p.rawValue),\r\n        label,\r\n      });\r\n    }\r\n\r\n    // Nothing to apply — bail out before any fetch.\r\n    if (pidByZone.size === 0 && vmByType.size === 0) return;\r\n\r\n    // For any library that doesn't have a snapshot yet, fetch its details so\r\n    // we can use the doc as the base. Without this, applyPlacements silently\r\n    // skipped libraries the user hadn't viewed and only the currently-visible\r\n    // chip ever received updates.\r\n    const fetchedBases = new Map<string, any>();\r\n    await Promise.all(\r\n      refs.map(async (libId) => {\r\n        if (this.getLibrarySnapshot(libId)) return;\r\n        try {\r\n          const res: any = await lastValueFrom(\r\n              this.builderService.getFixtureLibraryDetails(libId),\r\n          );\r\n          if (res?.data) fetchedBases.set(libId, res.data);\r\n        } catch (err) {\r\n          console.log('@@ ~ applyPlacementsToAssignedLibraries [fetch ERR]:', err);\r\n        }\r\n      }),\r\n    );\r\n\r\n    for (const libId of refs) {\r\n      const target = this.getLibrarySnapshot(libId) || fetchedBases.get(libId);\r\n      if (!target) continue;\r\n\r\n      const shelves: any[] = Array.isArray(target.shelfConfig) ? target.shelfConfig : [];\r\n      const newShelfConfig = shelves.map((shelf: any) => {\r\n        const zone = norm(shelf?.zone || shelf?.label);\r\n        if (!zone || !pidByZone.has(zone)) return shelf;\r\n        return {\r\n          ...shelf,\r\n          zone: shelf?.zone || shelf?.label || '',\r\n          productBrandName: [ ...pidByZone.get(zone)! ],\r\n        };\r\n      });\r\n\r\n      const existingVms: any[] = Array.isArray(target.vmConfig) ? target.vmConfig : [];\r\n      const seen = new Set<string>();\r\n      const newVmConfig = existingVms.map((vm: any) => {\r\n        const key = norm(vm?.vmType);\r\n        seen.add(key);\r\n        const upd = vmByType.get(key);\r\n        return upd ? { ...vm, vmId: upd.vmId, vmName: upd.vmName } : vm;\r\n      });\r\n      for (const [ key, upd ] of vmByType) {\r\n        if (seen.has(key)) continue;\r\n        const layout = this.initialVmLayout(upd.label, newShelfConfig);\r\n        newVmConfig.push({\r\n          vmType: upd.label,\r\n          vmId: upd.vmId,\r\n          vmName: upd.vmName,\r\n          ...layout,\r\n          position: '',\r\n        });\r\n      }\r\n\r\n      this.captureLibrarySnapshot(libId, {\r\n        ...target,\r\n        shelfConfig: newShelfConfig,\r\n        vmConfig: newVmConfig,\r\n        productResolutionLevel: 'L3',\r\n      });\r\n    }\r\n\r\n    // Reflect the change in the currently-open embedded editor.\r\n    this.reloadDisplayedLibrary();\r\n  }\r\n\r\n  /**\r\n   * Remount the embedded editor for the active library so it picks up the\r\n   * snapshot we just rewrote. The embedded components guard against re-init\r\n   * while mounted, so we toggle the host key off then on to force a fresh\r\n   * ngOnInit with the updated data.\r\n   */\r\n  private reloadDisplayedLibrary(): void {\r\n    const libId = this.selectedLibraryIdInMap;\r\n    if (!libId) return;\r\n    const updated = this.getLibrarySnapshot(libId);\r\n    if (!updated) return;\r\n    this.selectedLibraryDetails = updated;\r\n    // Push the fresh snapshot, then bump the nonce so refreshEmbeddedHostKeys\r\n    // produces a NEW key — that's what actually forces the *ngFor to destroy\r\n    // the old embedded editor and mount a new one that re-reads the snapshot.\r\n    this.planoDataService.fixtureTemplateDetails.next({\r\n      ...updated,\r\n      productResolutionLevel: updated.productResolutionLevel || 'L3',\r\n    });\r\n    this.embeddedReloadNonce++;\r\n    this.refreshEmbeddedHostKeys();\r\n  }\r\n\r\n  async onLibraryMapSelect(libId: string): Promise<void> {\r\n    // Toggling the active chip off → clear immediately (no async work needed).\r\n    if (!libId) {\r\n      this.selectedLibraryIdInMap = '';\r\n      this.selectedLibraryDetails = null;\r\n      this.refreshEmbeddedHostKeys();\r\n      this.planoDataService.fixtureTemplateDetails.next(null);\r\n      return;\r\n    }\r\n\r\n    // Switching to a different chip: light the new chip up right away, but\r\n    // KEEP the previous library's embedded preview mounted while we fetch\r\n    // the new snapshot/details. Otherwise the card would collapse to its\r\n    // header height during the fetch and re-expand once new data lands —\r\n    // visible as a \"crunch\" the user reported.\r\n    this.selectedLibraryIdInMap = libId;\r\n    this.loadingLibraryDetails = true;\r\n\r\n    let newDetails: any = null;\r\n    try {\r\n      // If an auto-apply for this library is still running, wait for it so\r\n      // we don't beat it to the snapshot and render the un-filled library.\r\n      const pending = this.autoApplyInFlight.get(libId);\r\n      if (pending) {\r\n        try { await pending; } catch (_e) { /* ignore */ }\r\n      }\r\n      const saved = this.getLibrarySnapshot(libId);\r\n      if (saved) {\r\n        newDetails = saved;\r\n      } else {\r\n        const res: any = await lastValueFrom(\r\n          this.builderService.getFixtureLibraryDetails(libId),\r\n        );\r\n        newDetails = res?.data || null;\r\n      }\r\n    } catch (err) {\r\n      console.log('@@ ~ onLibraryMapSelect [ERR]:', err);\r\n      newDetails = null;\r\n    }\r\n\r\n    // Atomic swap — selectedLibraryDetails, BehaviorSubject, and the\r\n    // ngFor host key all flip in one synchronous block, so Angular destroys\r\n    // the old embedded component and mounts the new one in the same change\r\n    // detection cycle. No empty-state in between → no card-height crunch.\r\n    this.selectedLibraryDetails = newDetails;\r\n    if (newDetails) {\r\n      this.planoDataService.fixtureTemplateDetails.next({\r\n        ...newDetails,\r\n        productResolutionLevel: newDetails.productResolutionLevel || 'L3',\r\n      });\r\n    } else {\r\n      this.planoDataService.fixtureTemplateDetails.next(null);\r\n    }\r\n    this.refreshEmbeddedHostKeys();\r\n    this.loadingLibraryDetails = false;\r\n  }\r\n\r\n  /**\r\n   * Composite key tied to the currently-active (look, slot, library) triple.\r\n   * Stable property — recomputed only when the underlying selection changes\r\n   * (see refreshEmbeddedHostKeys()). Avoids returning a new array reference\r\n   * every CD cycle, which used to ripple into other multi-selects' inputs.\r\n   */\r\n  embeddedHostKey: string = '';\r\n  embeddedHostKeys: string[] = [];\r\n  // Bumped by reloadDisplayedLibrary() to force the embedded editor to remount\r\n  // even when look/slot/library are unchanged (a same-key round-trip via the\r\n  // *ngFor trackBy does NOT remount; a changed key does).\r\n  private embeddedReloadNonce = 0;\r\n\r\n  private refreshEmbeddedHostKeys(): void {\r\n    const key = `${this.selectedLookIndex}-${this.selectedSlotIndex}-${this.selectedLibraryIdInMap}-${this.embeddedReloadNonce}`;\r\n    if (key !== this.embeddedHostKey) {\r\n      this.embeddedHostKey = key;\r\n    }\r\n    const next = this.selectedLibraryDetails ? [this.embeddedHostKey] : [];\r\n    const current = this.embeddedHostKeys;\r\n    // Only assign a new array if the contents differ — otherwise the ngFor sees\r\n    // a \"new\" array each CD and trackBy still has to compare every entry.\r\n    if (next.length !== current.length || next[0] !== current[0]) {\r\n      this.embeddedHostKeys = next;\r\n    }\r\n  }\r\n\r\n  trackByEmbeddedKey(_: number, key: string): string {\r\n    return key;\r\n  }\r\n\r\n  /**\r\n   * The slot-type dropdown in the right pane only offers values that the\r\n   * parent Look has selected in its Fixture Type multiselect. If nothing is\r\n   * selected yet, fall back to showing all options so the user isn't blocked.\r\n   */\r\n  get availableSlotTypes(): { id: string; name: string }[] {\r\n    const lookGroup = this.selectedLookGroup;\r\n    if (!lookGroup) return this.fixtureTypeOptions;\r\n    const selected = lookGroup.get('fixtureType')?.value as string[] | null;\r\n    if (!Array.isArray(selected) || selected.length === 0) {\r\n      return this.fixtureTypeOptions;\r\n    }\r\n    return this.fixtureTypeOptions.filter((opt) => selected.includes(opt.id));\r\n  }\r\n\r\n  // 20 very mild pastels (all Tailwind-50 / 100 range) arranged so adjacent\r\n  // palette slots are on opposite sides of the colour wheel for distinguish-\r\n  // ability without any colour feeling saturated.\r\n  private static readonly BUCKET_PALETTE: readonly string[] = [\r\n    '#fef2f2', //  1 Blush          red-50\r\n    '#f0fdfa', //  2 Mint Whisper   teal-50    (opposite of red)\r\n    '#fff7ed', //  3 Apricot        orange-50\r\n    '#eef2ff', //  4 Iris           indigo-50  (opposite of orange)\r\n    '#fefce8', //  5 Butter         yellow-50\r\n    '#faf5ff', //  6 Lavender       purple-50  (opposite of yellow)\r\n    '#f0fdf4', //  7 Spring         green-50\r\n    '#fff1f2', //  8 Rose Petal     rose-50    (opposite of green)\r\n    '#ecfeff', //  9 Sky Tint       cyan-50\r\n    '#ffedd5', // 10 Peach          orange-100\r\n    '#eff6ff', // 11 Powder Blue    blue-50\r\n    '#f0f9ff', // 12 Sky            sky-50     (opposite of orange)\r\n    '#f5f3ff', // 13 Violet Mist    violet-50\r\n    '#f7fee7', // 14 Lime Whisper   lime-50    (opposite of violet)\r\n    '#fdf4ff', // 15 Lilac          fuchsia-50\r\n    '#ecfdf5', // 16 Mint           emerald-50\r\n    '#fdf2f8', // 17 Petal Pink     pink-50\r\n    '#fffbeb', // 18 Honey          amber-50\r\n    '#f1f5f9', // 19 Cloud          slate-100\r\n    '#f5f5f4', // 20 Linen          stone-100\r\n  ];\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private route: ActivatedRoute,\r\n    private router: Router,\r\n    private gs: GlobalStateService,\r\n    private builderService: StoreBuilderService,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n    private planoDataService: PlanoDataService,\r\n  ) {}\r\n\r\n  async ngOnInit(): Promise<void> {\r\n    this.setPageData();\r\n    this.initForm();\r\n\r\n    // Gate on the allowlist before wiring any data loads / subscriptions.\r\n    await this.checkAccess();\r\n    if (!this.allowed) return;\r\n\r\n    // Listen to the shared fixtureTemplateDetails — when the embedded\r\n    // TemplateProducts/TemplateVms components push edits back into the\r\n    // BehaviorSubject, persist a snapshot under the active slot + library.\r\n    this.planoDataService.fixtureTemplateDetails\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((data: any) => {\r\n        if (!data || !this.selectedLibraryIdInMap) return;\r\n        // Only capture user edits, not the initial load we pushed ourselves.\r\n        // The embedded components set `ignoreUpdate: true` when they push\r\n        // their form changes back; we use that as our signal.\r\n        if (!data.ignoreUpdate) return;\r\n        // Persist edits made directly in the embedded editor (e.g. VM\r\n        // positions, which stay editable in looksMode) to the active library.\r\n        // Cross-library propagation is driven by the slot's placements list\r\n        // instead (see applyPlacementsToAssignedLibraries).\r\n        this.captureLibrarySnapshot(this.selectedLibraryIdInMap, data);\r\n      });\r\n\r\n    this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe((data) => {\r\n      const headerFilters = JSON.parse(localStorage.getItem('header-filters') || '{}');\r\n      this.clientId = data?.client || headerFilters?.client;\r\n      if (this.clientId) {\r\n        this.loadFixtureLibraries();\r\n        this.loadPlacementDropdownData();\r\n        this.loadComboOptions();\r\n      }\r\n    });\r\n\r\n    this.route.params.pipe(takeUntil(this.destroy$)).subscribe(async (params) => {\r\n      const id = params['collectionId'];\r\n      this.collectionId = id && id !== 'new' ? id : null;\r\n      this.isNew = !this.collectionId;\r\n      if (this.collectionId) {\r\n        await this.loadDetails();\r\n      }\r\n    });\r\n\r\n    // Embedded TemplateProductsComponent / TemplateVmsComponent read these\r\n    // query params from the active route. Force them to edit-mode and pin\r\n    // the products view to the \"section\" level.\r\n    this.router.navigate([], {\r\n      relativeTo: this.route,\r\n      queryParams: { isEdit: 'true', level: 'section' },\r\n      queryParamsHandling: 'merge',\r\n      replaceUrl: true,\r\n    });\r\n  }\r\n\r\n  /** Resolve whether the session user may access Looks. Never throws. */\r\n  private async checkAccess(): Promise<void> {\r\n    try {\r\n      const res: any = await lastValueFrom(this.builderService.getLookAccess());\r\n      this.allowed = !!res?.data?.allowed;\r\n    } catch (err) {\r\n      console.log('@@ ~ checkAccess [ERR]:', err);\r\n      this.allowed = false;\r\n    } finally {\r\n      this.accessChecked = true;\r\n    }\r\n  }\r\n\r\n  setPageData() {\r\n    this.pageInfo.setTitle('Look Collection');\r\n    this.pageInfo.setBreadcrumbs([\r\n      { title: 'Planogram', path: '/manage/planogram/manage-planograms', isActive: false, isSeparator: false },\r\n      { title: '', path: '', isActive: false, isSeparator: true },\r\n      { title: 'Looks', path: '/manage/planogram/looks', isActive: false, isSeparator: false },\r\n      { title: '', path: '', isActive: false, isSeparator: true },\r\n    ]);\r\n  }\r\n\r\n  initForm() {\r\n    this.form = this.fb.group({\r\n      name: ['', Validators.required],\r\n      description: [''],\r\n      isActive: [false],\r\n      looks: this.fb.array([]),\r\n    });\r\n  }\r\n\r\n  get looks(): FormArray {\r\n    return this.form.get('looks') as FormArray;\r\n  }\r\n\r\n  fixtureSlots(lookIndex: number): FormArray {\r\n    return this.looks.at(lookIndex).get('fixtureSlots') as FormArray;\r\n  }\r\n\r\n  placements(lookIndex: number, slotIndex: number): FormArray {\r\n    return this.fixtureSlots(lookIndex).at(slotIndex).get('placements') as FormArray;\r\n  }\r\n\r\n  get selectedLookGroup(): FormGroup | null {\r\n    return this.selectedLookIndex >= 0 && this.selectedLookIndex < this.looks.length\r\n      ? (this.looks.at(this.selectedLookIndex) as FormGroup)\r\n      : null;\r\n  }\r\n\r\n  get selectedSlotsArray(): FormArray | null {\r\n    const look = this.selectedLookGroup;\r\n    return look ? (look.get('fixtureSlots') as FormArray) : null;\r\n  }\r\n\r\n  get selectedSlotGroup(): FormGroup | null {\r\n    const slots = this.selectedSlotsArray;\r\n    if (!slots) return null;\r\n    return this.selectedSlotIndex >= 0 && this.selectedSlotIndex < slots.length\r\n      ? (slots.at(this.selectedSlotIndex) as FormGroup)\r\n      : null;\r\n  }\r\n\r\n  get selectedPlacements(): FormArray | null {\r\n    const slot = this.selectedSlotGroup;\r\n    return slot ? (slot.get('placements') as FormArray) : null;\r\n  }\r\n\r\n  createLookGroup(seed: any = {}): FormGroup {\r\n    const seedSlots = Array.isArray(seed.fixtureSlots) && seed.fixtureSlots.length\r\n      ? seed.fixtureSlots\r\n      : Array.from({ length: Math.max(1, Number(seed.fixtureCount) || 1) }, (_, i) => ({ slotIndex: i + 1 }));\r\n    const slots = seedSlots.map((s: any, i: number) => this.createSlotGroup({ ...s, slotIndex: i + 1 }));\r\n\r\n    // Legacy data may have stored cadHeaderVariants at the slot level. If the\r\n    // incoming look doesn't have its own variants array, fold the union of\r\n    // slot-level variants into the look so editing in the new UI doesn't lose\r\n    // them.\r\n    const seedLookVariants = Array.isArray(seed.cadHeaderVariants)\r\n      ? seed.cadHeaderVariants\r\n      : Array.from(new Set(\r\n        (Array.isArray(seed.fixtureSlots) ? seed.fixtureSlots : [])\r\n          .flatMap((s: any) => Array.isArray(s?.cadHeaderVariants) ? s.cadHeaderVariants : []),\r\n      ));\r\n\r\n    const lookGroup = this.fb.group({\r\n      keyType: [seed.keyType || 'mbq'],\r\n      mbqBucket: [seed.mbqBucket || ''],\r\n      brandCategory: [seed.brandCategory || ''],\r\n      fixtureCount: [slots.length, [Validators.required, Validators.min(0)]],\r\n      fixtureType: [Array.isArray(seed.fixtureType) ? seed.fixtureType : []],\r\n      layoutVariant: [seed.layoutVariant || 'shelf'],\r\n      storeProto: [seed.storeProto || ''],\r\n      cadHeaderVariants: [seedLookVariants],\r\n      fixtureSlots: this.fb.array(slots),\r\n    });\r\n\r\n    // fixtureCount → slots length (user-edited count adjusts the slots array)\r\n    lookGroup.get('fixtureCount')!.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((next: number) => {\r\n        const target = Math.max(0, Math.min(30, Number(next) || 0));\r\n        const slotsArr = lookGroup.get('fixtureSlots') as FormArray;\r\n        while (slotsArr.length < target) {\r\n          slotsArr.push(this.createSlotGroup({ slotIndex: slotsArr.length + 1 }));\r\n        }\r\n        while (slotsArr.length > target) {\r\n          slotsArr.removeAt(slotsArr.length - 1);\r\n        }\r\n        this.renumberSlotsForGroup(lookGroup);\r\n        // Reconcile slot selection if it's now out of bounds\r\n        if (this.selectedLookIndex >= 0 && this.looks.at(this.selectedLookIndex) === lookGroup) {\r\n          if (slotsArr.length === 0) {\r\n            this.selectedSlotIndex = -1;\r\n          } else if (this.selectedSlotIndex >= slotsArr.length) {\r\n            this.selectedSlotIndex = slotsArr.length - 1;\r\n          } else if (this.selectedSlotIndex < 0) {\r\n            this.selectedSlotIndex = 0;\r\n          }\r\n        }\r\n      });\r\n\r\n    return lookGroup;\r\n  }\r\n\r\n  createSlotGroup(seed: any = {}): FormGroup {\r\n    const placements = (Array.isArray(seed.placements) ? seed.placements : [])\r\n      .map((p: any) => this.createPlacementGroup(p));\r\n    const libraryConfigs = (Array.isArray(seed.libraryConfigurations) ? seed.libraryConfigurations : [])\r\n      .map((c: any) => this.createLibraryConfigGroup(c));\r\n    return this.fb.group({\r\n      slotIndex: [seed.slotIndex ?? 1, Validators.required],\r\n      slotType: [seed.slotType || 'shelf'],\r\n      brand: [seed.brand || ''],\r\n      fixtureLevelZone: [seed.fixtureLevelZone || ''],\r\n      fixtureLibraryRef: [seed.fixtureLibraryRef || ''],\r\n      fixtureLibraryLabel: [seed.fixtureLibraryLabel || ''],\r\n      fixtureLibraryRefs: [Array.isArray(seed.fixtureLibraryRefs) ? seed.fixtureLibraryRefs : []],\r\n      placements: this.fb.array(placements),\r\n      libraryConfigurations: this.fb.array(libraryConfigs),\r\n      // Per-library snapshot of the embedded fixture-template editor state\r\n      // (shelfConfig + product/VM placements). Keyed by libraryRef.\r\n      librarySnapshots: [\r\n        Array.isArray(seed.librarySnapshots) ? seed.librarySnapshots : [],\r\n      ],\r\n    });\r\n  }\r\n\r\n  createLibraryConfigGroup(seed: any = {}): FormGroup {\r\n    return this.fb.group({\r\n      libraryRef: [seed.libraryRef || ''],\r\n      shelfNumber: [seed.shelfNumber ?? 1],\r\n      label: [seed.label || ''],\r\n      shelfType: [seed.shelfType || ''],\r\n      // VMs and PIDs picked from the slot's `placements` array (by position name).\r\n      vmRefs: [Array.isArray(seed.vmRefs) ? seed.vmRefs : []],\r\n      pidRefs: [Array.isArray(seed.pidRefs) ? seed.pidRefs : []],\r\n    });\r\n  }\r\n\r\n  createPlacementGroup(seed: any = {}): FormGroup {\r\n    // Backward-compat: legacy data stored a single string in `rawValue`. For\r\n    // PID placements we now use `rawValues` (array, multi-select). If the\r\n    // seed only has `rawValue`, migrate it to the array on first load.\r\n    const rawValuesSeed = Array.isArray(seed.rawValues)\r\n      ? seed.rawValues\r\n      : (seed.kind === 'pid' && seed.rawValue ? [String(seed.rawValue)] : []);\r\n    return this.fb.group({\r\n      position: [seed.position || ''],\r\n      kind: [seed.kind || 'pid'],\r\n      // For VM rows this holds the artwork id (single string). For PID rows\r\n      // it's left empty in favour of `rawValues`.\r\n      rawValue: [seed.kind === 'pid' ? '' : (seed.rawValue || '')],\r\n      rawValues: [rawValuesSeed],\r\n      vmRef: [seed.vmRef || ''],\r\n      skuCollectionRef: [seed.skuCollectionRef || ''],\r\n    });\r\n  }\r\n\r\n  addPlacement() {\r\n    if (!this.selectedPlacements) return;\r\n    this.selectedPlacements.push(this.createPlacementGroup());\r\n  }\r\n\r\n  removePlacement(index: number) {\r\n    if (!this.selectedPlacements) return;\r\n    this.selectedPlacements.removeAt(index);\r\n  }\r\n\r\n  private normVmType(t: any): string {\r\n    return String(t ?? '').trim().toLowerCase();\r\n  }\r\n\r\n  /** Stable per-vmType artwork list lookup. Returns the same array reference\r\n   *  for the same vmType across CD cycles so lib-reactive-select doesn't\r\n   *  re-init. Falls back to the full list when vmType is empty. */\r\n  vmArtworkOptionsFor(vmType: string): { value: string; label: string }[] {\r\n    const key = this.normVmType(vmType);\r\n    if (key && this.vmArtworkByType.has(key)) {\r\n      return this.vmArtworkByType.get(key)!;\r\n    }\r\n    return this.vmArtworkByType.get('') || [];\r\n  }\r\n\r\n  /** Populate the dropdown data used by Placement rows:\r\n   *  - VM Type list (`getVmTypesList`)\r\n   *  - VM Artwork list (`vmNameList`)\r\n   *  - Product / SKU collection list (flattened from brand → category mapping\r\n   *    that powers /manage/planogram/config). */\r\n  async loadPlacementDropdownData() {\r\n    if (!this.clientId) return;\r\n    try {\r\n      const [vmTypesRes, vmsRes, brandsRes, brandMetaRes] = await Promise.all([\r\n        lastValueFrom(this.builderService.getVmTypesList(this.clientId)),\r\n        lastValueFrom(this.builderService.getVMNameList(this.clientId)),\r\n        lastValueFrom(this.builderService.getBrandList(this.clientId)),\r\n        lastValueFrom(this.builderService.getBrandMetaData(this.clientId)),\r\n      ]);\r\n\r\n      const vmTypes: any[] = (vmTypesRes as any)?.data || [];\r\n      this.vmTypeOptions = vmTypes\r\n        .map((t: any) => {\r\n          const v = t?.vmType || t?.vmTypeName || t?.name || t?._id;\r\n          const l = t?.vmTypeName || t?.vmType || t?.name || v;\r\n          return v ? { value: String(v), label: String(l) } : null;\r\n        })\r\n        .filter((x): x is { value: string; label: string } => !!x);\r\n\r\n      const vms: any[] = (vmsRes as any)?.data || [];\r\n      this.vmArtworkOptions = vms\r\n        .map((v: any): { value: string; label: string; vmType?: string } | null => {\r\n          const id = v?.vmName || v?._id;\r\n          if (!id) return null;\r\n          return {\r\n            value: String(id),\r\n            label: String(v?.vmName || id),\r\n            vmType: v?.vmType ? String(v.vmType) : undefined,\r\n          };\r\n        })\r\n        .filter((x): x is { value: string; label: string; vmType?: string } => !!x);\r\n\r\n      // (vmName, vmType) → _id so we can turn a placement's artwork NAME into\r\n      // the planovm _id the embedded VM editor matches against.\r\n      this.vmIdByNameType = new Map();\r\n      for (const v of vms) {\r\n        if (!v?._id || !v?.vmName) continue;\r\n        const name = this.normVmType(v.vmName);\r\n        const type = this.normVmType(v.vmType);\r\n        this.vmIdByNameType.set(`${name}||${type}`, String(v._id));\r\n        if (!this.vmIdByNameType.has(name)) {\r\n          this.vmIdByNameType.set(name, String(v._id));\r\n        }\r\n      }\r\n\r\n      // Rebuild the (vmType → artworks) index now that the artwork list\r\n      // changed. Keys are normalised (trim + lower-case) so a mismatch in\r\n      // casing/whitespace between vmTypes and vms.vmType still matches.\r\n      this.vmArtworkByType = new Map();\r\n      const fullList = this.vmArtworkOptions.map((v) => ({ value: v.value, label: v.label }));\r\n      this.vmArtworkByType.set('', fullList);\r\n      for (const v of this.vmArtworkOptions) {\r\n        const key = this.normVmType(v.vmType);\r\n        if (!key) continue;\r\n        if (!this.vmArtworkByType.has(key)) this.vmArtworkByType.set(key, []);\r\n        this.vmArtworkByType.get(key)!.push({ value: v.value, label: v.label });\r\n      }\r\n      console.log(\r\n        '[Looks form] vmTypes:', this.vmTypeOptions.length,\r\n        'artworks:', this.vmArtworkOptions.length,\r\n        'artworksByType keys:', Array.from(this.vmArtworkByType.keys()),\r\n      );\r\n\r\n      // Source: every value the brand & product mapping page exposes.\r\n      //  - `getBrandList`     → per-brand `category[]` and `subCategory[]`\r\n      //  - `getBrandMetaData` → rows with `pidCat`, `category`, `tempGroup`\r\n      const brands: any[] = (brandsRes as any)?.data || [];\r\n      const brandMeta: any[] = (brandMetaRes as any)?.data || [];\r\n      const seenCats = new Set<string>();\r\n      const products: { value: string; label: string }[] = [];\r\n      const pushOne = (v: any) => {\r\n        const s = String(v ?? '').trim();\r\n        if (!s || seenCats.has(s)) return;\r\n        seenCats.add(s);\r\n        products.push({ value: s, label: s });\r\n      };\r\n      const pushArr = (arr: any) => {\r\n        if (!Array.isArray(arr)) return;\r\n        for (const v of arr) pushOne(v);\r\n      };\r\n      for (const b of brands) {\r\n        pushArr(b?.category);\r\n        pushArr(b?.subCategory);\r\n      }\r\n      for (const row of brandMeta) {\r\n        pushOne(row?.pidCat);\r\n        pushOne(row?.category);\r\n        pushOne(row?.tempGroup);\r\n      }\r\n      this.productOptions = products;\r\n      console.log(\r\n        '[Looks form] product/SKU options:',\r\n        this.productOptions.length,\r\n        'from',\r\n        brands.length,\r\n        'brands and',\r\n        brandMeta.length,\r\n        'brand-meta rows',\r\n      );\r\n    } catch (err) {\r\n      console.log('@@ ~ loadPlacementDropdownData [ERR]:', err);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Load the MBQ bucket / Brand / Fixture Header dropdown options seeded into\r\n   * planostaticdatas from the sheet, then rebuild the flat option lists\r\n   * (merging in any values already present on the loaded collection).\r\n   */\r\n  async loadComboOptions() {\r\n    if (!this.clientId) return;\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.builderService.getLookComboOptions(this.clientId),\r\n      );\r\n      const data = res?.data || {};\r\n      const toStrArr = (arr: any): string[] =>\r\n        (Array.isArray(arr) ? arr : [])\r\n            .map((v: any) => String(v ?? '').trim())\r\n            .filter((s: string) => !!s);\r\n      this.comboRaw = {\r\n        mbqBuckets: toStrArr(data.mbqBuckets),\r\n        brands: toStrArr(data.brands),\r\n        fixtureHeaders: toStrArr(data.fixtureHeaders),\r\n        combinations: (Array.isArray(data.combinations) ? data.combinations : [])\r\n            .map((c: any) => ({\r\n              mbqBucket: String(c?.mbqBucket ?? '').trim(),\r\n              brand: String(c?.brand ?? '').trim(),\r\n              fixtureHeader: String(c?.fixtureHeader ?? '').trim(),\r\n            })),\r\n      };\r\n    } catch (err) {\r\n      // Endpoint missing / not yet deployed — fall back to values derived\r\n      // from the loaded collection so the dropdowns still work.\r\n      console.log('@@ ~ loadComboOptions [ERR]:', err);\r\n    }\r\n    this.rebuildComboOptions();\r\n  }\r\n\r\n  /**\r\n   * Rebuild the MBQ bucket / Brand / Fixture Header option lists (and the\r\n   * cascading caches) by MERGING the seeded endpoint payload (comboRaw) with\r\n   * whatever values are already present on the currently-loaded looks. The\r\n   * merge guarantees the dropdowns are never empty for an existing collection\r\n   * even when the endpoint hasn't loaded, and that any value already saved on\r\n   * a look is always selectable.\r\n   */\r\n  private rebuildComboOptions(): void {\r\n    const buckets = new Set<string>(this.comboRaw.mbqBuckets);\r\n    const brands = new Set<string>(this.comboRaw.brands);\r\n    const headers = new Set<string>(this.comboRaw.fixtureHeaders);\r\n\r\n    // Seed combinations also feed the flat per-field lists.\r\n    for (const c of this.comboRaw.combinations) {\r\n      if (c.mbqBucket) buckets.add(c.mbqBucket);\r\n      if (c.brand) brands.add(c.brand);\r\n      if (c.fixtureHeader) headers.add(c.fixtureHeader);\r\n    }\r\n\r\n    // Merge in values already present on the loaded looks/slots so the\r\n    // dropdowns work even when the endpoint hasn't loaded.\r\n    for (const lookCtrl of this.looks.controls) {\r\n      const look = lookCtrl as FormGroup;\r\n      const bucket =\r\n        String(look.get('mbqBucket')?.value ?? '').trim()\r\n          || String(look.get('brandCategory')?.value ?? '').trim();\r\n      if (bucket) buckets.add(bucket);\r\n      const slots = look.get('fixtureSlots') as FormArray | null;\r\n      for (const slotCtrl of slots?.controls || []) {\r\n        const slot = slotCtrl as FormGroup;\r\n        const brand = String(slot.get('brand')?.value ?? '').trim();\r\n        const header = String(slot.get('fixtureLevelZone')?.value ?? '').trim();\r\n        if (brand) brands.add(brand);\r\n        if (header) headers.add(header);\r\n      }\r\n    }\r\n\r\n    const toItems = (set: Set<string>): { value: string; label: string }[] =>\r\n      [ ...set ].filter((s) => !!s).sort().map((s) => ({ value: s, label: s }));\r\n\r\n    this.mbqBucketItems = toItems(buckets);\r\n    this.brandItems = toItems(brands);\r\n    this.fixtureHeaderItems = toItems(headers);\r\n\r\n    console.log(\r\n      '[Looks form] combo options:',\r\n      this.mbqBucketItems.length, 'buckets,',\r\n      this.brandItems.length, 'brands,',\r\n      this.fixtureHeaderItems.length, 'headers',\r\n    );\r\n  }\r\n\r\n  async loadFixtureLibraries() {\r\n    if (!this.clientId) return;\r\n    try {\r\n      // Only list fixture templates available in India (country code 'IN').\r\n      const res: any = await lastValueFrom(\r\n        this.builderService.getFixtureLibNameList(this.clientId, 'non-draft', 'IN'),\r\n      );\r\n      // Response shape: { code, status, data: [{ id, fixtureName, fixtureType }] }.\r\n      const list: { id: string; fixtureName: string; fixtureType: string }[] =\r\n        Array.isArray(res?.data) ? res.data : [];\r\n      this.fixtureLibraryItems = list.map((l) => ({\r\n        id: l.id,\r\n        name: l.fixtureName,\r\n        fixtureType: (l.fixtureType || '').toString().toLowerCase().trim(),\r\n      }));\r\n      const typeTally: Record<string, number> = {};\r\n      for (const it of this.fixtureLibraryItems) {\r\n        const k = it.fixtureType || '(empty)';\r\n        typeTally[k] = (typeTally[k] || 0) + 1;\r\n      }\r\n      console.log(\r\n        '[Looks form] fixture libraries loaded:',\r\n        this.fixtureLibraryItems.length,\r\n        'fixtureType tally:',\r\n        typeTally,\r\n      );\r\n      this.recomputeFixtureLibraryItemsForSlot();\r\n    } catch (err) {\r\n      console.log('@@ ~ loadFixtureLibraries [ERR]:', err);\r\n      this.fixtureLibraryItems = [];\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Recompute the slot-type-filtered library list once. Stable reference\r\n   * so the multiselect doesn't tear down its click targets every CD cycle.\r\n   */\r\n  private recomputeFixtureLibraryItemsForSlot(): void {\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) {\r\n      this.fixtureLibraryItemsForSlot = this.fixtureLibraryItems.slice();\r\n      return;\r\n    }\r\n    const slotType = slot.get('slotType')?.value;\r\n    const target = slotType === 'eurocenter' ? 'floor' : 'wall';\r\n    this.fixtureLibraryItemsForSlot = this.fixtureLibraryItems.filter((item) => {\r\n      const t = item.fixtureType;\r\n      if (!t) return false;\r\n      if (target === 'wall') return t === 'wall' || t.includes('wall');\r\n      return t === 'floor' || t.includes('floor') || t.includes('euro') || t.includes('free');\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Subscriptions scoped to whichever slot is currently active. Cleared and\r\n   * rebuilt every time the active slot changes.\r\n   */\r\n  private slotSubs: any[] = [];\r\n\r\n  /** Pending auto-apply promises keyed by libId so chip clicks can await. */\r\n  private autoApplyInFlight = new Map<string, Promise<void>>();\r\n\r\n  /** Wire/refresh subscriptions that depend on the active slot:\r\n   *  - re-filter the library multiselect when slotType changes\r\n   *  - run auto-apply when a new library is added to fixtureLibraryRefs\r\n   */\r\n  private bindActiveSlotListeners(): void {\r\n    for (const s of this.slotSubs) s?.unsubscribe?.();\r\n    this.slotSubs = [];\r\n\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) {\r\n      this.fixtureLibraryItemsForSlot = this.fixtureLibraryItems.slice();\r\n      return;\r\n    }\r\n    this.recomputeFixtureLibraryItemsForSlot();\r\n\r\n    // Re-filter the Fixture Templates list when the Fixture Type changes, and\r\n    // RESET the current template selections: wall (shelf) and floor\r\n    // (eurocenter) library sets are disjoint, so anything selected for the old\r\n    // type is invalid for the new one. Clearing fixtureLibraryRefs cascades —\r\n    // the refsSub below clears the embedded preview, and we drop the stale\r\n    // per-library snapshots too.\r\n    let prevSlotType: string = String(slot.get('slotType')?.value ?? '');\r\n    const typeSub = slot.get('slotType')?.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((nextType: string) => {\r\n        const changed = String(nextType ?? '') !== prevSlotType;\r\n        prevSlotType = String(nextType ?? '');\r\n        this.recomputeFixtureLibraryItemsForSlot();\r\n        if (!changed) return;\r\n        const refsCtrl = slot.get('fixtureLibraryRefs');\r\n        if (refsCtrl && (refsCtrl.value || []).length) {\r\n          refsCtrl.setValue([]); // triggers refsSub -> clears active preview\r\n        }\r\n        const snapsCtrl = slot.get('librarySnapshots');\r\n        if (snapsCtrl && (snapsCtrl.value || []).length) {\r\n          snapsCtrl.setValue([], { emitEvent: false });\r\n        }\r\n        // Defensive: clear the legacy single-ref fields if they were set.\r\n        slot.get('fixtureLibraryRef')?.setValue('', { emitEvent: false });\r\n        slot.get('fixtureLibraryLabel')?.setValue('', { emitEvent: false });\r\n      });\r\n    if (typeSub) this.slotSubs.push(typeSub);\r\n\r\n    // Track previous refs so we can detect *new* additions and auto-apply\r\n    // the slot's PIDs to those new libraries.\r\n    let prevRefs: string[] = [...(slot.get('fixtureLibraryRefs')?.value || [])];\r\n    const refsSub = slot.get('fixtureLibraryRefs')?.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe((nextRefs: string[]) => {\r\n      const next = Array.isArray(nextRefs) ? nextRefs : [];\r\n      const added = next.filter((r) => !!r && !prevRefs.includes(r));\r\n      prevRefs = [...next];\r\n\r\n      // If the currently-previewed library was unselected, clear the\r\n      // embedded view so we don't show stale data.\r\n      if (\r\n        this.selectedLibraryIdInMap\r\n          && !next.includes(this.selectedLibraryIdInMap)\r\n      ) {\r\n        this.onLibraryMapSelect('');\r\n      }\r\n\r\n      for (const libId of added) {\r\n        const p = this.autoApplyPidsToLibrary(libId);\r\n        this.autoApplyInFlight.set(libId, p);\r\n        p.finally(() => {\r\n          if (this.autoApplyInFlight.get(libId) === p) {\r\n            this.autoApplyInFlight.delete(libId);\r\n          }\r\n        });\r\n      }\r\n\r\n      // If nothing is being previewed yet, auto-activate the first library\r\n      // the user just added so the embedded PID/VM editor opens immediately\r\n      // (especially relevant when adding the FIRST library to an empty\r\n      // multiselect — previously the chip strip showed it but the preview\r\n      // pane stayed blank until the user clicked the chip).\r\n      if (!this.selectedLibraryIdInMap) {\r\n        const firstActive = added.find((id) => !!id) || next.find((id) => !!id);\r\n        if (firstActive) this.onLibraryMapSelect(firstActive);\r\n      }\r\n      });\r\n    if (refsSub) this.slotSubs.push(refsSub);\r\n\r\n    // When any placement in the \"Look and Visual Merchandising Placements\"\r\n    // list changes, re-derive every assigned library's snapshot so the edit\r\n    // propagates to all of them. Debounced so rapid typing collapses into a\r\n    // single re-apply.\r\n    const placementsArr = slot.get('placements') as FormArray | null;\r\n    const placementsSub = placementsArr?.valueChanges\r\n      .pipe(debounceTime(400), takeUntil(this.destroy$))\r\n      .subscribe(() => this.applyPlacementsToAssignedLibraries());\r\n    if (placementsSub) this.slotSubs.push(placementsSub);\r\n  }\r\n\r\n  /**\r\n   * When a new library is added to the slot, walk its shelfConfig and for\r\n   * each shelf whose section currently has no brand, copy the rawValue of\r\n   * the slot's PID placement whose `position` matches the shelf's\r\n   * `zone`/`label`. Result is saved as the library's snapshot so the\r\n   * embedded fixture-template editor picks it up the next time the chip\r\n   * is opened.\r\n   */\r\n  private async autoApplyPidsToLibrary(libId: string): Promise<void> {\r\n    if (!libId) return;\r\n    const slot = this.selectedSlotGroup;\r\n    if (!slot) return;\r\n\r\n    const placementsArr = slot.get('placements') as FormArray | null;\r\n    const placements: any[] = placementsArr?.value || [];\r\n    const pidPlacements = placements.filter(\r\n      (p) => p?.kind === 'pid' && p?.position && p?.rawValue,\r\n    );\r\n\r\n    const norm = (s: any): string => String(s ?? '').trim().toLowerCase();\r\n\r\n    const placementMap = new Map<string, string>();\r\n    for (const p of pidPlacements) {\r\n      placementMap.set(norm(p.position), String(p.rawValue));\r\n    }\r\n\r\n    // Start from an existing snapshot if we already saved one for this slot\r\n    // + library; otherwise fetch the fresh library doc. The per-field guards\r\n    // below still ensure we never overwrite user-set brands or VMs.\r\n    let libData: any = this.getLibrarySnapshot(libId);\r\n    if (!libData) {\r\n      try {\r\n        const res: any = await lastValueFrom(\r\n          this.builderService.getFixtureLibraryDetails(libId),\r\n        );\r\n        libData = res?.data;\r\n      } catch (err) {\r\n        console.log('@@ ~ autoApplyPidsToLibrary [ERR]:', err);\r\n        return;\r\n      }\r\n    }\r\n    if (!libData) return;\r\n\r\n    const shelfConfig: any[] = Array.isArray(libData.shelfConfig) ? libData.shelfConfig : [];\r\n    let pidsApplied = false;\r\n    const newShelfConfig = shelfConfig.map((shelf: any) => {\r\n      if (Array.isArray(shelf?.productBrandName) && shelf.productBrandName.length > 0) {\r\n        return shelf;\r\n      }\r\n      const sourceLabel = shelf?.zone || shelf?.label || '';\r\n      const matchKey = norm(sourceLabel);\r\n      if (!matchKey) return shelf;\r\n      const match = placementMap.get(matchKey);\r\n      if (!match) return shelf;\r\n      pidsApplied = true;\r\n      // groupShelvesByZone() in TemplateProductsComponent SKIPS any shelf\r\n      // whose `zone` is empty, so we must set zone (using the shelf's label\r\n      // if it isn't already set) for the section to form.\r\n      return {\r\n        ...shelf,\r\n        zone: shelf?.zone || sourceLabel,\r\n        productBrandName: [match],\r\n      };\r\n    });\r\n\r\n    // --- VM auto-apply -----------------------------------------------------\r\n    // If the library has no VMs configured yet, copy each of the slot's VM\r\n    // placements over as a vmConfig entry. No position-based matching here —\r\n    // the placement's `rawValue` becomes the VM artwork and `position`\r\n    // becomes the VM type label.\r\n    const existingVms = Array.isArray(libData.vmConfig) ? libData.vmConfig : [];\r\n    let newVmConfig = existingVms;\r\n    let vmsApplied = false;\r\n    if (existingVms.length === 0) {\r\n      const vmPlacements = placements.filter(\r\n        (p) => p?.kind === 'vm' && p?.rawValue,\r\n      );\r\n      if (vmPlacements.length > 0) {\r\n        newVmConfig = vmPlacements.map((p) => {\r\n          const vmType = String(p?.position || '');\r\n          const layout = this.initialVmLayout(vmType, newShelfConfig);\r\n          return {\r\n            vmType,\r\n            vmId: String(p?.rawValue || ''),\r\n            vmName: String(p?.rawValue || ''),\r\n            ...layout,\r\n            position: '',\r\n          };\r\n        });\r\n        vmsApplied = true;\r\n      }\r\n    }\r\n\r\n    if (!pidsApplied && !vmsApplied) return;\r\n\r\n    // The embedded TemplateProductsComponent only reads section-level brand\r\n    // values when productResolutionLevel === 'L3'.\r\n    const updatedLib = {\r\n      ...libData,\r\n      shelfConfig: newShelfConfig,\r\n      vmConfig: newVmConfig,\r\n      productResolutionLevel: 'L3',\r\n    };\r\n    this.captureLibrarySnapshot(libId, updatedLib);\r\n  }\r\n\r\n  async loadDetails() {\r\n    if (!this.collectionId) return;\r\n    this.loading = true;\r\n    try {\r\n      const res: any = await lastValueFrom(\r\n        this.builderService.getLookPlanoCollectionDetails(this.collectionId),\r\n      );\r\n      const data = res?.data;\r\n      if (data) {\r\n        this.form.patchValue({\r\n          name: data.name || '',\r\n          description: data.description || '',\r\n          isActive: !!data.isActive,\r\n        });\r\n        this.looks.clear();\r\n        (data.looks || []).forEach((l: any) => this.looks.push(this.createLookGroup(l)));\r\n        this.selectedLookIndex = this.looks.length ? 0 : -1;\r\n        const slots = this.selectedLookIndex >= 0 ? this.fixtureSlots(this.selectedLookIndex) : null;\r\n        this.selectedSlotIndex = slots && slots.length ? 0 : -1;\r\n        this.resetLibraryMap();\r\n        this.bindActiveSlotListeners();\r\n        this.autoSelectFirstLibrary();\r\n        // Merge this collection's own values into the dropdown options so they\r\n        // show even if the comboOptions endpoint is unavailable.\r\n        this.rebuildComboOptions();\r\n      }\r\n    } catch (err) {\r\n      console.log('@@ ~ loadDetails [ERR]:', err);\r\n      this.toast.getErrorToast?.('Failed to load Look collection');\r\n    } finally {\r\n      this.loading = false;\r\n    }\r\n  }\r\n\r\n  addLook() {\r\n    const next = this.createLookGroup({ mbqBucket: '', fixtureCount: 1 });\r\n    this.looks.push(next);\r\n    this.selectedLookIndex = this.looks.length - 1;\r\n    this.selectedSlotIndex = this.fixtureSlots(this.selectedLookIndex).length ? 0 : -1;\r\n    this.bindActiveSlotListeners();\r\n  }\r\n\r\n  removeLook(index: number) {\r\n    this.looks.removeAt(index);\r\n    if (this.selectedLookIndex === index) {\r\n      this.selectedLookIndex = this.looks.length ? 0 : -1;\r\n      this.selectedSlotIndex = -1;\r\n    } else if (this.selectedLookIndex > index) {\r\n      this.selectedLookIndex -= 1;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clone the look at `index` (deep copy of its full nested value — slots,\r\n   * placements, cadHeaderVariants, librarySnapshots) and insert it right\r\n   * after the original, then select the copy. createLookGroup rebuilds the\r\n   * whole FormGroup tree from the JSON seed, so the clone shares no control\r\n   * references with the source.\r\n   */\r\n  duplicateLook(index: number) {\r\n    const src = this.looks.at(index) as FormGroup | null;\r\n    if (!src) return;\r\n    const seed = JSON.parse(JSON.stringify(src.getRawValue()));\r\n    const clone = this.createLookGroup(seed);\r\n    this.looks.insert(index + 1, clone);\r\n    this.selectLook(index + 1);\r\n  }\r\n\r\n  selectLook(index: number) {\r\n    this.selectedLookIndex = index;\r\n    const slots = this.fixtureSlots(index);\r\n    this.selectedSlotIndex = slots.length ? 0 : -1;\r\n    this.resetLibraryMap();\r\n    this.bindActiveSlotListeners();\r\n    this.autoSelectFirstLibrary();\r\n  }\r\n\r\n  addSlot() {\r\n    if (this.selectedLookIndex < 0) return;\r\n    const lookGroup = this.looks.at(this.selectedLookIndex) as FormGroup;\r\n    const slots = this.fixtureSlots(this.selectedLookIndex);\r\n    slots.push(this.createSlotGroup({ slotIndex: slots.length + 1 }));\r\n    lookGroup.get('fixtureCount')!.setValue(slots.length, { emitEvent: false });\r\n    this.selectedSlotIndex = slots.length - 1;\r\n    this.bindActiveSlotListeners();\r\n  }\r\n\r\n  removeSlot(slotIndex: number) {\r\n    if (this.selectedLookIndex < 0) return;\r\n    const lookGroup = this.looks.at(this.selectedLookIndex) as FormGroup;\r\n    const slots = this.fixtureSlots(this.selectedLookIndex);\r\n    slots.removeAt(slotIndex);\r\n    this.renumberSlotsForGroup(lookGroup);\r\n    lookGroup.get('fixtureCount')!.setValue(slots.length, { emitEvent: false });\r\n    if (this.selectedSlotIndex === slotIndex) {\r\n      this.selectedSlotIndex = slots.length ? Math.min(slotIndex, slots.length - 1) : -1;\r\n    } else if (this.selectedSlotIndex > slotIndex) {\r\n      this.selectedSlotIndex -= 1;\r\n    }\r\n  }\r\n\r\n  renumberSlotsForGroup(lookGroup: FormGroup) {\r\n    const slotsArr = lookGroup.get('fixtureSlots') as FormArray;\r\n    slotsArr.controls.forEach((slot, i) => {\r\n      (slot as FormGroup).get('slotIndex')?.setValue(i + 1, { emitEvent: false });\r\n    });\r\n  }\r\n\r\n  selectSlot(slotIndex: number) {\r\n    this.selectedSlotIndex = slotIndex;\r\n    this.resetLibraryMap();\r\n    this.bindActiveSlotListeners();\r\n    this.autoSelectFirstLibrary();\r\n  }\r\n\r\n  lookTitle(lookGroup: FormGroup): string {\r\n    const keyType = lookGroup.get('keyType')?.value;\r\n    const key = keyType === 'brandCategory'\r\n      ? lookGroup.get('brandCategory')?.value\r\n      : lookGroup.get('mbqBucket')?.value;\r\n    const count = lookGroup.get('fixtureCount')?.value;\r\n    return `${key || '(unnamed)'} — ${count || 0} fixtures`;\r\n  }\r\n\r\n  /**\r\n   * Short visual indicator for the slotType mix of a look — rendered as a\r\n   * coloured chip in the MBQ Bucket - Fixture Combinations list. Returns\r\n   * `null` for an empty look so the chip is hidden.\r\n   */\r\n  fixtureTypeBadge(lookGroup: FormGroup): { label: string; cls: string } | null {\r\n    const slots = lookGroup.get('fixtureSlots') as FormArray | null;\r\n    if (!slots || slots.length === 0) return null;\r\n    let hasShelf = false;\r\n    let hasEuro = false;\r\n    for (const c of slots.controls) {\r\n      const t = (c as FormGroup).get('slotType')?.value;\r\n      if (t === 'eurocenter') hasEuro = true;\r\n      else hasShelf = true;\r\n      if (hasShelf && hasEuro) break;\r\n    }\r\n    if (hasShelf && hasEuro) return { label: 'Wall + Floor', cls: 'badge-mixed' };\r\n    if (hasEuro) return { label: 'Floor', cls: 'badge-floor' };\r\n    return { label: 'Wall', cls: 'badge-wall' };\r\n  }\r\n\r\n  bucketKey(lookGroup: FormGroup): string {\r\n    const keyType = lookGroup.get('keyType')?.value;\r\n    const key = keyType === 'brandCategory'\r\n      ? lookGroup.get('brandCategory')?.value\r\n      : lookGroup.get('mbqBucket')?.value;\r\n    return (key || '').trim();\r\n  }\r\n\r\n  /**\r\n   * Assign a colour to each unique bucket key by **insertion order**, not by hash.\r\n   * The Nth distinct bucket (counted top-to-bottom through the looks array) gets\r\n   * `BUCKET_PALETTE[N]`. Only after all 20 palette slots are used does the assignment\r\n   * wrap around — so no colour is ever reused while < 20 distinct buckets exist.\r\n   *\r\n   * Recomputed on every call so live edits to the bucket name re-flow colours.\r\n   */\r\n  bucketColor(lookGroup: FormGroup): string {\r\n    const key = this.bucketKey(lookGroup);\r\n    if (!key) return '#f9fafb';\r\n    const palette = LookPlanoCollectionFormComponent.BUCKET_PALETTE;\r\n    let nextIndex = 0;\r\n    const assigned = new Map<string, string>();\r\n    for (const group of this.looks.controls) {\r\n      const k = this.bucketKey(group as FormGroup);\r\n      if (k && !assigned.has(k)) {\r\n        assigned.set(k, palette[nextIndex % palette.length]);\r\n        nextIndex += 1;\r\n      }\r\n      if (k === key) {\r\n        return assigned.get(k)!;\r\n      }\r\n    }\r\n    return '#f9fafb';\r\n  }\r\n\r\n  /**\r\n   * Reorder the looks FormArray so that the bucket with the **most** looks\r\n   * comes first and the one with the fewest comes last (alphabetical tie-break\r\n   * within the same count). Looks within the same bucket are sorted by\r\n   * ascending fixtureCount. Selection is preserved by reference, not by index.\r\n   */\r\n  private applySortedOrder(): void {\r\n    const groups = this.looks.controls as FormGroup[];\r\n    if (groups.length <= 1) return;\r\n\r\n    // Tally how many looks each bucket has so we can sort buckets by frequency.\r\n    const bucketCounts = new Map<string, number>();\r\n    for (const g of groups) {\r\n      const k = this.bucketKey(g);\r\n      if (!k) continue;\r\n      bucketCounts.set(k, (bucketCounts.get(k) || 0) + 1);\r\n    }\r\n\r\n    const sorted = [...groups].sort((a, b) => {\r\n      const aKey = this.bucketKey(a);\r\n      const bKey = this.bucketKey(b);\r\n      // Empty bucket keys go to the end so unfinished looks don't disrupt the groups\r\n      if (aKey && !bKey) return -1;\r\n      if (!aKey && bKey) return 1;\r\n\r\n      // Primary: bucket frequency, descending (most-populated bucket first)\r\n      const aCount = bucketCounts.get(aKey) || 0;\r\n      const bCount = bucketCounts.get(bKey) || 0;\r\n      if (aCount !== bCount) return bCount - aCount;\r\n\r\n      // Tie-break: alphabetical bucket name\r\n      if (aKey !== bKey) return aKey.localeCompare(bKey);\r\n\r\n      // Within the same bucket: ascending fixtureCount\r\n      const aFC = Number(a.get('fixtureCount')?.value) || 0;\r\n      const bFC = Number(b.get('fixtureCount')?.value) || 0;\r\n      return aFC - bFC;\r\n    });\r\n\r\n    const orderChanged = sorted.some((g, i) => g !== groups[i]);\r\n    if (!orderChanged) return;\r\n\r\n    const currentLook = this.selectedLookGroup;\r\n    const currentSlot = this.selectedSlotGroup;\r\n\r\n    this.looks.clear({ emitEvent: false });\r\n    sorted.forEach((g) => this.looks.push(g, { emitEvent: false }));\r\n\r\n    if (currentLook) {\r\n      const newLookIdx = sorted.indexOf(currentLook);\r\n      this.selectedLookIndex = newLookIdx;\r\n      if (this.selectedLookIndex >= 0 && currentSlot) {\r\n        const slotsArr = this.fixtureSlots(this.selectedLookIndex);\r\n        const newSlotIdx = slotsArr.controls.indexOf(currentSlot);\r\n        this.selectedSlotIndex = newSlotIdx;\r\n      }\r\n    }\r\n  }\r\n\r\n  async save() {\r\n    if (this.form.invalid) {\r\n      this.toast.getErrorToast?.('Please fill all required fields');\r\n      return;\r\n    }\r\n    this.saving = true;\r\n    try {\r\n      // Sort the looks before serialising so both the persisted payload\r\n      // and the on-screen list reflect grouping by MBQ bucket / brand category\r\n      // and ascending fixture count.\r\n      this.applySortedOrder();\r\n\r\n      const payload = {\r\n        ...this.form.value,\r\n        clientId: this.clientId,\r\n      };\r\n      if (this.isNew) {\r\n        const res: any = await lastValueFrom(this.builderService.createLookPlanoCollection(payload));\r\n        const newId = res?.data?._id;\r\n        this.toast.getSuccessToast?.('Look collection created');\r\n        if (newId) {\r\n          this.router.navigate(['/manage/planogram/looks', newId]);\r\n        } else {\r\n          this.router.navigate(['/manage/planogram/looks']);\r\n        }\r\n      } else {\r\n        await lastValueFrom(\r\n          this.builderService.updateLookPlanoCollection({ ...payload, collectionId: this.collectionId }),\r\n        );\r\n        this.toast.getSuccessToast?.('Look collection updated');\r\n      }\r\n    } catch (err) {\r\n      console.log('@@ ~ save [ERR]:', err);\r\n      this.toast.getErrorToast?.('Failed to save Look collection');\r\n    } finally {\r\n      this.saving = false;\r\n    }\r\n  }\r\n\r\n  cancel() {\r\n    this.router.navigate(['/manage/planogram/looks']);\r\n  }\r\n\r\n  trackByIndex(index: number) {\r\n    return index;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n    // Release the shared BehaviorSubject so other pages don't inherit a stale library.\r\n    this.planoDataService.fixtureTemplateDetails.next(null);\r\n  }\r\n}\r\n","<div *ngIf=\"!accessChecked\" class=\"card p-5 m-4 text-center text-muted\">Checking access…</div>\r\n\r\n<div *ngIf=\"accessChecked && !allowed\" class=\"card p-5 m-4\">\r\n  <div class=\"access-denied text-center py-10\">\r\n    <div class=\"access-denied-icon mb-4\"><i class=\"bi bi-shield-lock\"></i></div>\r\n    <h3 class=\"mb-2\">Access denied</h3>\r\n    <p class=\"text-muted mb-0\">\r\n      You don't have permission to access Looks. Contact your administrator\r\n      to be added to the allowed users list.\r\n    </p>\r\n  </div>\r\n</div>\r\n\r\n<section class=\"look-form\" *ngIf=\"accessChecked && allowed\">\r\n  <!-- Top bar (bound to the outer form) -->\r\n  <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n    <div class=\"row align-items-end\">\r\n      <div class=\"col-md-4\">\r\n        <label class=\"form-label fw-bold\">Name *</label>\r\n        <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n      </div>\r\n      <div class=\"col-md-5\">\r\n        <label class=\"form-label fw-bold\">Description</label>\r\n        <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n      </div>\r\n      <div class=\"col-md-1 text-center\">\r\n        <label class=\"form-label fw-bold d-block\">Active</label>\r\n        <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n      </div>\r\n      <div class=\"col-md-2 text-end\">\r\n        <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n        <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n          {{ saving ? 'Saving…' : 'Save' }}\r\n        </button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Three-pane editor -->\r\n  <div class=\"row mx-0 g-3\">\r\n    <!-- Left: Looks list (no form binding needed — just navigation) -->\r\n    <div class=\"col-md-3\">\r\n      <div class=\"card p-3 h-100\">\r\n        <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n          <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n          <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n        </div>\r\n        <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n        <div class=\"looks-tree\">\r\n          <div\r\n            *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n            class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n            [class.selected]=\"selectedLookIndex === i\"\r\n            [style.background-color]=\"bucketColor($any(look))\"\r\n            (click)=\"selectLook(i)\"\r\n          >\r\n            <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n              <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n              <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n              <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n                <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n              </ng-container>\r\n            </span>\r\n            <span class=\"look-row-actions\">\r\n              <button type=\"button\" class=\"row-action-btn duplicate\" title=\"Duplicate look\"\r\n                (click)=\"$event.stopPropagation(); duplicateLook(i)\">\r\n                <i class=\"bi bi-files\"></i>\r\n              </button>\r\n              <button type=\"button\" class=\"row-action-btn remove\" title=\"Remove look\"\r\n                (click)=\"$event.stopPropagation(); removeLook(i)\">\r\n                <i class=\"bi bi-trash3\"></i>\r\n              </button>\r\n            </span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Centre: selected Look metadata + slots -->\r\n    <div class=\"col-md-3\">\r\n      <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n        <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n          <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n          <div class=\"row g-2 mb-3\">\r\n            <div class=\"col-md-6\">\r\n              <label class=\"form-label small\">MBQ bucket</label>\r\n              <lib-searchable-select\r\n                [items]=\"mbqBucketItems\"\r\n                idField=\"value\"\r\n                nameField=\"label\"\r\n                placeholder=\"Select MBQ bucket\"\r\n                formControlName=\"mbqBucket\">\r\n              </lib-searchable-select>\r\n            </div>\r\n            <div class=\"col-md-6\">\r\n              <label class=\"form-label small\">Fixture count *</label>\r\n              <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n            </div>\r\n            <div class=\"col-md-12\">\r\n              <label class=\"form-label small\">CAD Header Varients</label>\r\n              <lib-chips-input\r\n                class=\"cad-header-variants-input\"\r\n                formControlName=\"cadHeaderVariants\"\r\n                placeholder=\"Type a variant and press Enter\">\r\n              </lib-chips-input>\r\n            </div>\r\n            <div class=\"col-md-12\">\r\n              <label class=\"form-label small\">Fixture Positions</label>\r\n              <multiselect-chip-dropdown\r\n                [items]=\"fixtureTypeOptions\"\r\n                idField=\"id\"\r\n                nameField=\"name\"\r\n                placeholder=\"Select fixture position\"\r\n                formControlName=\"fixtureType\">\r\n              </multiselect-chip-dropdown>\r\n            </div>\r\n          </div>\r\n\r\n          <hr />\r\n\r\n          <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n            <h6 class=\"m-0\">Fixtures</h6>\r\n            <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n          </div>\r\n          <div class=\"slots-list\">\r\n            <div\r\n              *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n              class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n              [class.selected]=\"selectedSlotIndex === s\"\r\n              (click)=\"selectSlot(s)\"\r\n            >\r\n              <div class=\"d-flex flex-column\">\r\n                <span class=\"fw-bold small\">\r\n                  Fixture {{ $any(slot).get('slotIndex')?.value }} — {{ $any(slot).get('slotType')?.value }}\r\n                </span>\r\n                <span class=\"text-muted small\">\r\n                  {{ $any(slot).get('brand')?.value || '(no brand)' }} ·\r\n                  {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n                </span>\r\n              </div>\r\n              <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">×</button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n      <ng-template #noLook>\r\n        <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n      </ng-template>\r\n    </div>\r\n\r\n    <!-- Right: selected slot — placements editor -->\r\n    <div class=\"col-md-6\">\r\n      <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n        <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n          <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n          <div class=\"row g-2 mb-3\">\r\n            <div class=\"col-md-12\">\r\n              <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n              <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n            </div>\r\n            <div class=\"col-md-6\">\r\n              <label class=\"form-label small\">Fixture Type</label>\r\n              <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n                <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n              </select>\r\n            </div>\r\n            <div class=\"col-md-6\">\r\n              <label class=\"form-label small\">Brand</label>\r\n              <lib-searchable-select\r\n                [items]=\"brandItems\"\r\n                idField=\"value\"\r\n                nameField=\"label\"\r\n                placeholder=\"Select brand\"\r\n                formControlName=\"brand\">\r\n              </lib-searchable-select>\r\n            </div>\r\n            <div class=\"col-md-12\">\r\n              <label class=\"form-label small\">Fixture Header</label>\r\n              <lib-searchable-select\r\n                [items]=\"fixtureHeaderItems\"\r\n                idField=\"value\"\r\n                nameField=\"label\"\r\n                placeholder=\"Select fixture header\"\r\n                formControlName=\"fixtureLevelZone\">\r\n              </lib-searchable-select>\r\n            </div>\r\n            <div class=\"col-md-12\">\r\n              <label class=\"form-label small\">Fixture Templates</label>\r\n              <multiselect-chip-dropdown\r\n                class=\"fixture-libraries-select\"\r\n                [items]=\"fixtureLibraryItemsForSlot\"\r\n                idField=\"id\"\r\n                nameField=\"name\"\r\n                [search]=\"true\"\r\n                searchField=\"name\"\r\n                placeholder=\"Select fixture templates\"\r\n                formControlName=\"fixtureLibraryRefs\">\r\n              </multiselect-chip-dropdown>\r\n              <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n                Showing floor fixtures (eurocenter slot).\r\n              </small>\r\n              <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n                Showing wall fixtures (shelf slot).\r\n              </small>\r\n            </div>\r\n          </div>\r\n\r\n          <hr />\r\n\r\n          <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n            <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n            <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n          </div>\r\n          <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n            No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n          </div>\r\n          <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n            <div\r\n              *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n              class=\"placement-row mb-2\"\r\n              [formGroupName]=\"pi\"\r\n            >\r\n              <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n                <div class=\"ph-field\">\r\n                  <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n                    <option value=\"pid\">Product Merchandising</option>\r\n                    <option value=\"vm\">Visual Merchandising</option>\r\n                  </select>\r\n                </div>\r\n\r\n                <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n                <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n                  <div class=\"ph-field\">\r\n                    <lib-searchable-select\r\n                      [items]=\"vmTypeOptions\"\r\n                      idField=\"value\"\r\n                      nameField=\"label\"\r\n                      placeholder=\"Visual Merchandising Type\"\r\n                      formControlName=\"position\">\r\n                    </lib-searchable-select>\r\n                  </div>\r\n                  <div class=\"ph-field\">\r\n                    <lib-searchable-select\r\n                      [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n                      idField=\"value\"\r\n                      nameField=\"label\"\r\n                      placeholder=\"Visual Merchandising Artwork\"\r\n                      formControlName=\"rawValue\">\r\n                    </lib-searchable-select>\r\n                  </div>\r\n                </ng-container>\r\n\r\n                <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n                <ng-template #pidInputs>\r\n                  <div class=\"ph-field\">\r\n                    <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n                      <option value=\"\">Position</option>\r\n                      <option value=\"Top\">Top</option>\r\n                      <option value=\"Mid\">Mid</option>\r\n                      <option value=\"Bottom\">Bottom</option>\r\n                    </select>\r\n                  </div>\r\n                  <div class=\"ph-field\">\r\n                    <lib-searchable-select\r\n                      [items]=\"productOptions\"\r\n                      idField=\"value\"\r\n                      nameField=\"label\"\r\n                      [multiple]=\"true\"\r\n                      placeholder=\"Product / SKU\"\r\n                      formControlName=\"rawValues\">\r\n                    </lib-searchable-select>\r\n                  </div>\r\n                </ng-template>\r\n\r\n                <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">×</button>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </ng-container>\r\n      <ng-template #noSlot>\r\n        <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n      </ng-template>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Per-slot Fixture Library Configuration card -->\r\n  <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n    <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n      <div class=\"mb-4\">\r\n        <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n        <div class=\"library-chips\">\r\n          <button\r\n            *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n            type=\"button\"\r\n            class=\"library-chip\"\r\n            [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n            (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n            {{ lib.name }}\r\n          </button>\r\n        </div>\r\n        <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n          No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n        </small>\r\n      </div>\r\n\r\n      <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details…</div>\r\n\r\n      <!--\r\n        Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n        a switch as a new item — that forces the embedded template-products\r\n        / template-vms components to remount and rerun their ngOnInit\r\n        (otherwise their `isPageLoading` guard skips the form rebuild).\r\n      -->\r\n      <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n        <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n          <li class=\"nav-item\">\r\n            <button type=\"button\" class=\"nav-link\"\r\n              [class.active]=\"embeddedTab === 'products'\"\r\n              (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n          </li>\r\n          <li class=\"nav-item\">\r\n            <button type=\"button\" class=\"nav-link\"\r\n              [class.active]=\"embeddedTab === 'vms'\"\r\n              (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n          </li>\r\n        </ul>\r\n\r\n        <div *ngIf=\"embeddedTab === 'products'\">\r\n          <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n        </div>\r\n        <div *ngIf=\"embeddedTab === 'vms'\">\r\n          <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n        </div>\r\n      </ng-container>\r\n    </div>\r\n  </ng-container>\r\n</section>\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router, UrlTree } from '@angular/router';\r\nimport { catchError, map, Observable, of } from 'rxjs';\r\nimport { StoreBuilderService } from '../services/store-builder.service';\r\n\r\n/**\r\n * Route guard for the Find & Replace pages. Allows navigation only when the\r\n * session user's email is in the planostaticdatas `allowedFindReplaceUsers`\r\n * allowlist (checked server-side via StoreBuilderService.getFindReplaceAccess).\r\n * Denied users — and any error resolving access — are redirected to the shared\r\n * Access-denied view. Same email-based mechanism the Looks feature uses.\r\n */\r\nexport const findReplaceAccessGuard: CanActivateFn = (): Observable<boolean | UrlTree> => {\r\n  const storeBuilderService = inject(StoreBuilderService);\r\n  const router = inject(Router);\r\n\r\n  const denied = (): UrlTree =>\r\n    router.createUrlTree(['/manage/planogram/access-denied'], {\r\n      queryParams: { feature: 'Find and Replace' },\r\n    });\r\n\r\n  return storeBuilderService.getFindReplaceAccess().pipe(\r\n    map((res: any) => (res?.data?.allowed ? true : denied())),\r\n    catchError(() => of(denied())),\r\n  );\r\n};\r\n","import { NgModule } from \"@angular/core\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\nimport { LayoutBuilderComponent } from \"./components/layout-builder/layout-builder.component\";\r\nimport { CreateLayoutComponent } from \"./components/create-layout/create-layout.component\";\r\nimport { LayoutSummaryComponent } from \"./components/layout-summary/layout-summary.component\";\r\nimport { StoreLayoutTableComponent } from \"./components/store-layout-table/store-layout-table.component\";\r\nimport { StoreBuilderComponent } from \"./components/store-builder/store-builder.component\";\r\nimport { CreateStoreComponent } from \"./components/create-store/create-store.component\";\r\nimport { LayoutElementsComponent } from \"./components/layout-elements/layout-elements.component\";\r\nimport { VisualizeVmDataComponent } from \"./components/visualize-vm-data/visualize-vm-data.component\";\r\nimport { ManageStorePlanoComponent } from \"./components/manage-store-plano/manage-store-plano.component\";\r\nimport { FixtureTemplateComponent } from \"./components/fixture-template/fixture-template.component\";\r\nimport { FixtureTemplateTableComponent } from \"./components/fixture-template-table/fixture-template-table.component\";\r\nimport { TemplateBasicDetailsComponent } from \"./components/fixture-template/template-basic-details/template-basic-details.component\";\r\nimport { TemplateVmsComponent } from \"./components/fixture-template/template-vms/template-vms.component\";\r\nimport { TemplateSummaryComponent } from \"./components/fixture-template/template-summary/template-summary.component\";\r\nimport { TemplateProductsComponent } from \"./components/fixture-template/template-products/template-products.component\";\r\nimport { PlanoLibraryComponent } from \"./components/plano-library/plano-library.component\";\r\nimport { FixtureLibraryComponent } from \"./components/plano-library/fixture-library/fixture-library.component\";\r\nimport { VmLibraryComponent } from \"./components/plano-library/vm-library/vm-library.component\";\r\nimport { ProductLibraryComponent } from \"./components/plano-library/product-library/product-library.component\";\r\nimport { PlanoConfigurationsComponent } from \"./components/plano-configurations/plano-configurations.component\";\r\nimport { CreateFixtureComponent } from \"./components/create-fixture/create-fixture.component\";\r\nimport { CreateVmComponent } from \"./components/create-vm/create-vm.component\";\r\nimport { CreateProductComponent } from \"./components/create-product/create-product.component\";\r\nimport { canDeactivateGuard } from \"./functions/exit.guard\";\r\nimport { PlanoRolloutTableComponent } from \"./components/manage-plano/rollout-table/rollout-table.component\";\r\nimport { PlanoVerificationTableComponent } from \"./components/manage-plano/verification-table/verification-table.component\";\r\nimport { ManagePlanoComponent } from \"./components/manage-plano/manage-plano.component\";\r\nimport { PlanoRolloutComponent } from \"./components/manage-store-plano/plano-rollout/plano-rollout.component\";\r\nimport { TemplateAssignStoresComponent } from \"./components/fixture-template/template-assign-stores/template-assign-stores.component\";\r\nimport { FindAndReplaceComponent } from \"./components/fixture-template-table/find-and-replace/find-and-replace.component\";\r\nimport { PlanoBuilderComponent } from \"./components/plano-tools/plano-builder/plano-builder.component\";\r\nimport { PlanoMigrateComponent } from \"./components/plano-tools/plano-migrate/plano-migrate.component\";\r\nimport { PlanoTableComponent } from \"./components/planogram/plano-table/plano-table.component\";\r\nimport { ToolsParentComponent } from \"./components/plano-tools/tools-parent/tools-parent.component\";\r\nimport { PlanoDetailsParentComponent } from \"./components/planogram/plano-details-parent/plano-details-parent.component\";\r\nimport { CollectionUpdateAiComponent } from \"./components/collection-update-ai/collection-update-ai.component\";\r\nimport { FindReplaceTableComponent } from \"./components/collection-update-ai/find-replace-table/find-replace-table.component\";\r\nimport { FindReplaceLayoutComponent } from \"./components/collection-update-ai/find-replace-layout/find-replace-layout.component\";\r\nimport { PrepareTemplateComponent } from \"./components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component\";\r\nimport { ReviewReplaceComponent } from \"./components/collection-update-ai/find-replace-layout/review-replace/review-replace.component\";\r\nimport { PlanoOnboardTableComponent } from \"./components/manage-plano/onboard-table/onboard-table.component\";\r\nimport { OnboardStorePlanoComponent } from \"./components/onboard-store-plano/onboard-store-plano.component\";\r\nimport { CadRenderComponent } from \"./components/plano-tools/cad-render/cad-render.component\";\r\nimport { AllowEditComponent } from \"./components/plano-tools/allow-edit/allow-edit.component\";\r\nimport { DeleteTaskComponent } from \"./components/plano-tools/delete-task/delete-task.component\";\r\nimport { DeleteFloorComponent } from \"./components/plano-tools/delete-floor/delete-floor.component\";\r\nimport { UpdateFixtureTypeComponent } from \"./components/plano-tools/update-fixture-type/update-fixture-type.component\";\r\nimport { PlanoDataExportComponent } from \"./components/plano-tools/plano-data-export/plano-data-export.component\";\r\nimport { StoreExportsComponent } from \"./components/plano-tools/store-exports/store-exports.component\";\r\nimport { ModifyFixtureNumbersComponent } from \"./components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component\";\r\nimport { FixtureConformanceComponent } from \"./components/plano-tools/fixture-conformance/fixture-conformance.component\";\r\nimport { SwapTemplateComponent } from \"./components/plano-tools/swap-template/swap-template.component\";\r\nimport { MoveBucketComponent } from \"./components/plano-tools/move-bucket/move-bucket.component\";\r\nimport { CadFilesComponent } from \"./components/plano-tools/cad-files/cad-files.component\";\r\nimport { LayoutTouchupComponent } from \"./components/plano-tools/layout-touchup/layout-touchup.component\";\r\nimport { TouchupEditorComponent } from \"./components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component\";\r\nimport { LookPlanoCollectionComponent } from \"./components/look-plano-collection/look-plano-collection.component\";\r\nimport { LookPlanoCollectionFormComponent } from \"./components/look-plano-collection-form/look-plano-collection-form.component\";\r\nimport { AccessDeniedComponent } from \"./components/access-denied/access-denied.component\";\r\nimport { findReplaceAccessGuard } from \"./functions/feature-access.guard\";\r\n\r\nconst routes: Routes = [\r\n  {\r\n    path: \"layout-builder\",\r\n    component: LayoutBuilderComponent,\r\n    children: [\r\n      {\r\n        path: \"create\",\r\n        component: CreateLayoutComponent,\r\n      },\r\n      {\r\n        path: \"summary\",\r\n        component: LayoutSummaryComponent,\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"layout-elements\",\r\n    component: LayoutElementsComponent,\r\n  },\r\n  {\r\n    path: \"visualize-vms\",\r\n    component: VisualizeVmDataComponent,\r\n  },\r\n  {\r\n    path: \"store-builder\",\r\n    component: StoreBuilderComponent,\r\n    children: [\r\n      {\r\n        path: \"create\",\r\n        component: CreateStoreComponent,\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"store-layout\",\r\n    component: StoreLayoutTableComponent,\r\n  },\r\n  {\r\n    path: \"manage-planograms\",\r\n    component: ManagePlanoComponent,\r\n    children: [\r\n      {\r\n        path: \"onboard\",\r\n        component: PlanoOnboardTableComponent,\r\n      },\r\n      {\r\n        path: \"verification\",\r\n        component: PlanoVerificationTableComponent,\r\n      },\r\n      {\r\n        path: \"rollout\",\r\n        component: PlanoRolloutTableComponent,\r\n      },\r\n      {\r\n        path: \"\",\r\n        redirectTo: \"verification\",\r\n        pathMatch: \"full\",\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"manage-planogram\",\r\n    component: ManageStorePlanoComponent,\r\n  },\r\n  {\r\n    path: \"onboard-planogram\",\r\n    component: OnboardStorePlanoComponent,\r\n  },\r\n  {\r\n    path: \"fixture-templates\",\r\n    component: FixtureTemplateTableComponent,\r\n  },\r\n  {\r\n    path: \"findAndReplace\",\r\n    component: FindAndReplaceComponent,\r\n    canActivate: [findReplaceAccessGuard],\r\n  },\r\n  {\r\n    path: \"fixture-template\",\r\n    component: FixtureTemplateComponent,\r\n    canDeactivate: [canDeactivateGuard],\r\n    children: [\r\n      {\r\n        path: \"basic-details\",\r\n        component: TemplateBasicDetailsComponent,\r\n      },\r\n      {\r\n        path: \"products\",\r\n        component: TemplateProductsComponent,\r\n      },\r\n      {\r\n        path: \"vms\",\r\n        component: TemplateVmsComponent,\r\n      },\r\n      {\r\n        path: \"summary\",\r\n        component: TemplateSummaryComponent,\r\n      },\r\n      {\r\n        path: \"assign-stores\",\r\n        component: TemplateAssignStoresComponent,\r\n      },\r\n      {\r\n        path: \"\",\r\n        redirectTo: \"basic-details\",\r\n        pathMatch: \"full\",\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"library\",\r\n    component: PlanoLibraryComponent,\r\n    children: [\r\n      {\r\n        path: \"fixtures\",\r\n        component: FixtureLibraryComponent,\r\n      },\r\n      {\r\n        path: \"vms\",\r\n        component: VmLibraryComponent,\r\n      },\r\n      {\r\n        path: \"products\",\r\n        component: ProductLibraryComponent,\r\n      },\r\n      {\r\n        path: \"\",\r\n        redirectTo: \"fixtures\",\r\n        pathMatch: \"full\",\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"create-library-fixture\",\r\n    component: CreateFixtureComponent,\r\n    canDeactivate: [canDeactivateGuard],\r\n  },\r\n  {\r\n    path: \"create-library-vm\",\r\n    component: CreateVmComponent,\r\n    canDeactivate: [canDeactivateGuard],\r\n  },\r\n  {\r\n    path: \"create-library-product\",\r\n    component: CreateProductComponent,\r\n    canDeactivate: [canDeactivateGuard],\r\n  },\r\n  {\r\n    path: \"config\",\r\n    component: PlanoConfigurationsComponent,\r\n  },\r\n  {\r\n    path: \"manage-rollout\",\r\n    component: PlanoRolloutComponent,\r\n  },\r\n  {\r\n    path: \"plano-tools\",\r\n    component: ToolsParentComponent,\r\n    pathMatch: \"full\",\r\n  },\r\n  { path: \"plano-tools/builder\", component: PlanoBuilderComponent },\r\n  { path: \"plano-tools/migrate\", component: PlanoMigrateComponent },\r\n  { path: \"plano-tools/cad-render\", component: CadRenderComponent },\r\n  { path: \"plano-tools/allow-edit\", component: AllowEditComponent },\r\n  { path: \"plano-tools/delete-task\", component: DeleteTaskComponent },\r\n  { path: \"plano-tools/delete-floor\", component: DeleteFloorComponent },\r\n  { path: \"plano-tools/update-fixture-type\", component: UpdateFixtureTypeComponent },\r\n  { path: \"plano-tools/modify-fixture-numbers\", component: ModifyFixtureNumbersComponent },\r\n  { path: \"plano-tools/fixture-conformance\", component: FixtureConformanceComponent },\r\n  { path: \"plano-tools/data-export\", component: PlanoDataExportComponent },\r\n  { path: \"plano-tools/store-exports\", component: StoreExportsComponent },\r\n  { path: \"plano-tools/swap-template\", component: SwapTemplateComponent },\r\n  { path: \"plano-tools/move-bucket\", component: MoveBucketComponent },\r\n  { path: \"plano-tools/cad-files\", component: CadFilesComponent },\r\n  { path: \"plano-tools/layout-touchup\", component: LayoutTouchupComponent },\r\n  {\r\n    // Touchup editor sits OUTSIDE the plano-tools children so it renders\r\n    // full-screen (no tools-parent toolbar above) — matches the\r\n    // manage-planogram route's visual scope.\r\n    path: \"layout-touchup-editor\",\r\n    component: TouchupEditorComponent,\r\n  },\r\n  {\r\n    path: \"store-planograms\",\r\n    component: PlanoTableComponent,\r\n  },\r\n  {\r\n    path: \"store-planogram\",\r\n    component: PlanoDetailsParentComponent,\r\n  },\r\n  {\r\n    path: \"find-replace-table\",\r\n    component: FindReplaceTableComponent,\r\n    canActivate: [findReplaceAccessGuard],\r\n  },\r\n  {\r\n    path: \"find-replace\",\r\n    component: FindReplaceLayoutComponent,\r\n    canActivate: [findReplaceAccessGuard],\r\n    children: [\r\n      {\r\n        path: \"prepare\",\r\n        component: PrepareTemplateComponent,\r\n      },\r\n      {\r\n        path: \"review\",\r\n        component: ReviewReplaceComponent,\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: \"collection-update-ai\",\r\n    component: CollectionUpdateAiComponent,\r\n    canActivate: [findReplaceAccessGuard],\r\n  },\r\n  {\r\n    path: \"looks\",\r\n    component: LookPlanoCollectionComponent,\r\n  },\r\n  {\r\n    path: \"looks/:collectionId\",\r\n    component: LookPlanoCollectionFormComponent,\r\n  },\r\n  {\r\n    path: \"access-denied\",\r\n    component: AccessDeniedComponent,\r\n  },\r\n];\r\n@NgModule({\r\n  imports: [RouterModule.forChild(routes)],\r\n  exports: [RouterModule],\r\n})\r\nexport class TangoStoreBuilderRoutingModule {}\r\n","import { Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, Renderer2,ChangeDetectorRef  } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n@Component({\r\n  selector: 'lib-custom-filter',\r\n  templateUrl: './custom-filter.component.html',\r\n  styleUrl: './custom-filter.component.scss'\r\n})\r\nexport class CustomFilterComponent implements OnInit{\r\n  @Input() dataObject: any[] = [];\r\n  @Output() appliedFilters = new EventEmitter()\r\n  Opendropdown: boolean = false;\r\n \r\n  showdropdown: any;\r\n  selectedValues: string[] = [];\r\n  searchTerms: string[] = [];\r\n  selectedValuesArray: any[] = [];\r\n  searchValue:any;\r\n  selectedItem:any;\r\n  dropDown: boolean = false;\r\n  dummyArray:any[] = [];\r\n  noFilter:boolean = false;\r\n  responseArray:any[] = []\r\n  productModule: any;\r\n  product: any;\r\n  selectedProductCount: string;\r\n  constructor(private elementRef: ElementRef,\r\n    private renderer: Renderer2,\r\n    private router: Router,\r\n  private cd:ChangeDetectorRef) {\r\n     }\r\n \r\n  @HostListener('document:click', ['$event'])\r\n  onClick (event: MouseEvent) {\r\n    const\r\n      target = event.target as HTMLElement;\r\n    if(!target.closest('.dropdown1')) {\r\n      this.Opendropdown = false;\r\n    }\r\n    if(!target.closest('.dropdown-content')){\r\n      this.dataObject.forEach((item: any, i: any) => {\r\n          item.isOpen = false;\r\n        }\r\n      );\r\n    }\r\n  }\r\n \r\n  ngOnInit() {\r\n    this.dataObject.forEach((item:any)=>{\r\n      let selectedList = item?.Issues.filter((data:any)=> data?.checked)\r\n      this.selectedValuesArray.push(selectedList)\r\n    })\r\n    this.dummyArray = JSON.parse(JSON.stringify(this.dataObject))\r\n    this.responseArray = JSON.parse(JSON.stringify(this.dataObject))\r\n  }\r\n \r\n  selectItem(event:any,index:any,subIndex:any){\r\n    this.selectedValuesArray[index] = this.dataObject[index].Issues[subIndex];\r\n  }\r\n\r\n  openDropdown(event:MouseEvent,index:any){\r\n    event.stopPropagation();\r\n    this.dataObject.forEach((item: any, i: any) => {\r\n      if (i !== index) {\r\n        item.isOpen = false; // Close other dropdowns\r\n      }\r\n    });\r\n    this.dataObject[index].isOpen = !this.dataObject[index].isOpen;\r\n  }\r\n \r\n \r\n  opendropdown(e:MouseEvent) {\r\n    e.stopPropagation();\r\n    this.Opendropdown = !this.Opendropdown;\r\n  }\r\n \r\n  Dropdown(value: any, index: number,event:MouseEvent) {\r\n    event.stopPropagation();\r\n    this.dataObject.forEach((item: any, i: any) => {\r\n      if (i !== index) {\r\n        item.isOpen = false; // Close other dropdowns\r\n      }\r\n    });\r\n    this.dataObject[index].isOpen = !this.dataObject[index].isOpen;\r\n  }\r\n \r\n  toggleCheckbox(event: any, issue: any, index: number, subIndex: number) {\r\n    if(!this.selectedValuesArray.length) {\r\n      this.dataObject.forEach((item:any)=>{\r\n        let selectedList = item?.Issues.filter((data:any)=> data?.checked)\r\n        this.selectedValuesArray.push(selectedList)\r\n      })\r\n    }\r\n    const currentIssues = this.dataObject[index].Issues;\r\n    this.selectedValuesArray[index] = this.selectedValuesArray[index];\r\n    const selectedValues = this.selectedValuesArray[index]; // Retrieve selected values array for the current dropdown index\r\n    if (issue === 'Select All') {\r\n      const checkedState = event.target.checked;\r\n      this.dataObject[index].Issues.forEach((item: any) => {\r\n        item.checked = checkedState;\r\n      });\r\n\r\n      if (checkedState) {\r\n        this.selectedValuesArray[index] = currentIssues.slice(); // Copy all items\r\n      } else {\r\n        this.selectedValuesArray[index] = []; // Deselect all items\r\n      }\r\n    } else {\r\n      this.dataObject[index].Issues[subIndex].checked = event.target.checked;\r\n      let checkedData = this.dataObject[index].Issues[subIndex];\r\n      \r\n      if(this.dataObject[index].Issues[subIndex].checked){\r\n        this.selectedValuesArray[index].push(checkedData)\r\n      }\r\n      else{\r\n        this.selectedValuesArray[index] = this.selectedValuesArray[index].filter((el:any)=>\r\n          el?.checked === true && el?.text != issue\r\n      )\r\n      }  \r\n\r\n    }\r\n\r\n    const selectAllId = `selectall${index}`;\r\n    const selectAllElement = document.getElementById(selectAllId) as HTMLInputElement;\r\n    if (selectAllElement) {\r\n      selectAllElement.checked = selectedValues.length === currentIssues.length;\r\n    }\r\n \r\n    // Update checkboxes based on selected values\r\n    currentIssues.forEach((item: string) => {\r\n      const isChecked = this.selectedValuesArray[index].includes(item);\r\n      const checkboxId = `option${item}`;\r\n      const checkboxElement = document.getElementById(checkboxId) as HTMLInputElement;\r\n      if (checkboxElement) {\r\n        checkboxElement.checked = isChecked;\r\n      }\r\n    });\r\n   \r\n  }\r\n  Reset() {\r\n    this.selectedValuesArray.forEach((item:any) => {\r\n      if(item?.length){item.forEach((data:any)=>{data.checked = false;})\r\n      }\r\n    })\r\n    this.selectedValuesArray = [];\r\n    this.Opendropdown = false;\r\n    this.responseArray.forEach((item:any,index:any)=>{\r\n      item.Issues = this.selectedValuesArray[index] ? this.selectedValuesArray[index] :[]\r\n   })\r\n   this.appliedFilters.emit(this.responseArray)\r\n  }\r\n  searchData(event:any,i:any){\r\n    const searchTerm = event.target.value.trim(); // Trim whitespace\r\n    const filteredIssues = this.dummyArray[i]?.Issues.filter((item:any) =>  {\r\n      let findChecked = this.selectedValuesArray[i]?.find((issue:any) => issue.text == item.text );\r\n      if(findChecked) {\r\n        item.checked = findChecked?.checked ? findChecked?.checked : false;\r\n      }\r\n      else {\r\n        item.checked = false;\r\n      }\r\n      return new RegExp(searchTerm,'i').test(item.text);\r\n    });\r\n    this.dataObject[i].Issues = filteredIssues;\r\n    if(filteredIssues.length){\r\n      this.noFilter = false;\r\n    }else{\r\n      this.noFilter = true;\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  Apply() {\r\n    this.Opendropdown = false;\r\n    this.responseArray.forEach((item:any,index:any)=>{\r\n      item.Issues = this.selectedValuesArray[index] ? this.selectedValuesArray[index] :[]\r\n   })\r\n   this.appliedFilters.emit(this.responseArray)\r\n  }\r\n}\r\n ","<div class=\"position-relative\">\r\n                   \r\n    <button type=\"button\" (click)=\"opendropdown($event)\"\r\n    class=\"btn btn-default bg-white mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\"><svg\r\n      class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\"\r\n            stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n    </svg>\r\n    <span class=\"ms-2\">Filter</span> </button>\r\n    <div class=\"card p-5 dropdown1 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" *ngIf=\"Opendropdown\">\r\n        <div class=\"dropdown-title d-flex justify-content-between\">Filter Options\r\n            <!-- <div class=\"text-end\"> -->\r\n                <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n                <button class=\"btn btn-primary w-25  btn-resize\" (click)=\"Apply()\">Apply</button>\r\n                <!-- </div> -->\r\n        </div>\r\n        <div class=\"w-100 border border-gray mt-3\"></div>\r\n        <div class=\"py-3\" *ngFor=\"let item of dataObject; let i = index\">\r\n            <div *ngIf=\"item.type !== 'single'\">\r\n                <div class=\"dropdown form-select position-relative d-flex justify-content-between cursor-pointer\" (click)=\"Dropdown(item.Description,i,$event)\">\r\n                    <!-- <span class=\"\">{{ selectedValuesArray[i]?.length !== null && selectedValuesArray[i]?.length !== undefined ? selectedValuesArray[i]?.length + ' ' + item.Description.split(' ').pop() + ' Selected' : item.Description }}</span> -->\r\n                     <span>{{item.Description}}</span> <span *ngIf=\"selectedValuesArray[i]?.length !== null && selectedValuesArray[i]?.length !== undefined && selectedValuesArray[i]?.length !== 0\" class=\"badge badge-light-default\">{{selectedValuesArray[i]?.length}}</span>\r\n                </div>\r\n                <div *ngIf=\"item.isOpen\" class=\"dropdown-content position-absolute w-100\">\r\n                    <div class=\"form-check d-flex align-items-center py-3 pt-3 ps-0\">\r\n                        <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" value=\"Select All\" id=\"selectall{{i}}\"  [checked]=\"selectedValuesArray[i]?.length === item.Issues.length\"\r\n                          (change)=\"toggleCheckbox($event,'Select All', i,0)\">\r\n                        <label class=\"form-check-label cursor-pointer px-2\" for=\"selectall{{i}}\">\r\n                            Select All\r\n                        </label>\r\n                    </div>\r\n         \r\n                    <div class=\"border border-gray mt-3 \"></div>\r\n         \r\n                    <div class=\"mt-3 d-flex align-items-center\">\r\n                        <span class=\"svg-icon svg-icon-1 position-absolute ms-3 mt-2\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n                                <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                                </svg>\r\n                                </span>\r\n                                <input type=\"text\" [(ngModel)]=\"dataObject[i].selectedValue\" (input)=\"searchData($event,i)\" [id]=\"i\" class=\"form-control searchinput ps-14 py-2 me-2 mt-2\"\r\n                                     placeholder=\"Search\" autocomplete=\"off\" />\r\n                    </div>\r\n         \r\n                    <div *ngFor=\"let issue of item.Issues;let j=index\"  class=\"form-check d-flex align-items-center py-3 pt-3 ps-0 mt-2 \">\r\n                        <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [value]=\"issue.text\" id=\"option{{issue.text}}\" [checked]=\"issue.checked\"\r\n                         (change)=\"toggleCheckbox($event,issue.text,i,j)\">\r\n                        <label class=\"form-check-label cursor-pointer px-2\" for=\"option{{issue.text}}\">\r\n                            {{ issue.text }}\r\n                        </label>\r\n                    </div>\r\n                    <div class=\"mt-5 d-flex justify-content-center\">\r\n                        <span class=\"form-check-label\" *ngIf=\"noFilter\"> No filters available</span>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div *ngIf=\"item.type === 'single'\" class=\"position-relative w-100\">\r\n                <button type=\"button\" (click)=\"openDropdown($event,i)\"\r\n                class=\"btn btn-default w-100 btn-outline btn-outline-default rounded-3 text-nowrap border-val d-flex justify-content-between\"> {{selectedValuesArray[i]?.text ? selectedValuesArray[i]?.text : item.Description}}\r\n                <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                    <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg></span>\r\n                </button>\r\n                <div *ngIf=\"item.isOpen\" class=\"card py-1 w-100 dropdown-single position-absolute z-1 top-50px end-0\">\r\n                        <ul *ngFor=\"let item of item.Issues; let j = index\" class=\"list-unstyled\">\r\n                        <li [ngClass]=\"selectedValuesArray[i]?.text === item.text ? 'active' : ''\" class=\"camera px-5 items fw-semibold cursor-pointer py-2\" (click)=\"selectItem($event,i,j)\">{{item.text}}</li>\r\n                        </ul>\r\n                </div>\r\n              </div>\r\n        </div>\r\n        <!-- <div role=\"group\" class=\"d-flex justify-content-between\">\r\n            <button class=\"btn btn-outline w-100 me-2\" (click)=\"Reset()\"> Reset </button>\r\n            <button class=\"btn btn-primary w-100 ms-2\" (click)=\"Apply()\">Apply</button>\r\n        </div> -->\r\n    </div>\r\n</div>","import { Component, OnInit, ChangeDetectorRef, ElementRef, ViewChild, Input, SimpleChanges, EventEmitter, Output, OnChanges, OnDestroy } from '@angular/core';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { StoreBuilderService } from '../../../services/store-builder.service';\r\nimport { SHELF_COLORS } from '../../../data/fixture-template.data';\r\nimport { timer } from 'rxjs';\r\nimport fixtureHeaderList from './fixtureHeader.json';\r\nimport { ConfirmationPopupComponent } from '../popups/confirmation-popup/confirmation-popup.component';\r\n\r\n@Component({\r\n  selector: \"app-manage-store-plano-feedback\",\r\n  templateUrl: \"./manage-store-plano-feedback.component.html\",\r\n  styleUrl: \"./manage-store-plano-feedback.component.scss\",\r\n})\r\nexport class ManageStorePlanoFeedbackComponent\r\n  implements OnChanges, OnDestroy, OnInit\r\n{\r\n  @ViewChild(\"bodyBlock\") bodyBlockRef!: ElementRef;\r\n  @ViewChild(\"accordion\", { static: false }) accordion: any;\r\n  fixtureHeaderList: any = fixtureHeaderList;\r\n  layoutFeedback: any = [];\r\n  vmFeedback: any = [];\r\n  openfixture: boolean = true;\r\n  openvm: boolean = true;\r\n  // shelfDetails: any = []\r\n  fixtureIndex: number = 0;\r\n  fixturetaskIndex: number = 0;\r\n  vmtaskIndex: number = 0;\r\n  approvedLayoutissues: number = 0;\r\n  pendingLayoutissues: number = 0;\r\n  pendingFixtureissues: number = 0;\r\n  approvedFixtureissues: number = 0;\r\n  totalFixtureissues: number = 0;\r\n  completedFixture: number = 0;\r\n  pendingVmissues: number = 0;\r\n  approvedVmissues: number = 0;\r\n  totalVmissues: number = 0;\r\n  completedVm: number = 0;\r\n  colorList: any = {};\r\n  vmConfig: any = [];\r\n  // sectionConfig: any = [];\r\n  // sectionKeys: any = []\r\n  shlefColor = SHELF_COLORS;\r\n  loading: boolean = true;\r\n  storeFixtureList: any = [];\r\n  private destroy$ = new Subject();\r\n  @Input() currentPlano: any;\r\n  @Input() storeFeedback: any;\r\n  @Input() selectedIssue: any;\r\n  @Output() isApproved = new EventEmitter<any>();\r\n  selectedFixture: any;\r\n  originalData: any;\r\n  cdnUrl: any;\r\n  currentPlanoDetails: any;\r\n  dataObject: any = [\r\n    // {\r\n    //   Description: \"Task\",\r\n    //   Issues: [\r\n    //     { text: \"Layout verification\", id: \"layout\" },\r\n    //     { text: \"Fixture verification\", id: \"fixture\" },\r\n    //     { text: \"Visual Merch verification\", id: \"vm\" },\r\n    //   ],\r\n    // },\r\n    {\r\n      Description: \"Status\",\r\n      Issues: [\r\n        // { text: \"Match\", id: \"complete\" },\r\n        // { text: \"Mismatch\", id: \"incomplete\" },\r\n        { text: \"Agree\", id: \"agree\" },\r\n        { text: \"Disagree, Redo\", id: \"disagree\" },\r\n        { text: \"Review pending\", id: \"pending\" },\r\n      ],\r\n    },\r\n    // {\r\n    //   Description: \"Approval Status\",\r\n    //   type: \"single\",\r\n    //   Issues: [\r\n    //     { text: \"Action Pending\", id: \"pending\" },\r\n    //     { text: \"Action Done\", id: \"agree\" },\r\n    //   ],\r\n    // },\r\n  ];\r\n  // aicdnUrl: string;\r\n  selectedImage: string;\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private cd: ChangeDetectorRef,\r\n    private modalService: NgbModal,\r\n    private gs: GlobalStateService\r\n  ) {}\r\n\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    if (changes[\"currentPlano\"]) {\r\n      this.currentPlanoDetails = changes[\"currentPlano\"].currentValue;\r\n    }\r\n    if (changes[\"storeFeedback\"]) {\r\n      if (changes[\"storeFeedback\"].currentValue) {\r\n        this.resetInitialValues();\r\n        this.originalData = JSON.parse(\r\n          JSON.stringify(changes[\"storeFeedback\"].currentValue)\r\n        );\r\n        let feedbackData = JSON.parse(\r\n          JSON.stringify(changes[\"storeFeedback\"].currentValue)\r\n        );\r\n\r\n        this.getplanoFeedback(feedbackData?.layoutData);\r\n        this.getStoreFixturesfeedback(feedbackData?.fixtureData);\r\n        this.getStoreVmfeedback(feedbackData?.VmData);\r\n        if (\r\n          feedbackData?.layoutData?.length === 0 &&\r\n          feedbackData?.fixtureData?.length === 0 &&\r\n          feedbackData?.VmData?.length === 0\r\n        ) {\r\n          this.loading = false;\r\n        }\r\n      }\r\n    }\r\n    if (changes[\"selectedIssue\"]) {\r\n      this.resetInitialValues();\r\n      this.selectedFixture = changes[\"selectedIssue\"].currentValue;\r\n      if (this.originalData?.layoutData) {\r\n        let newLayoutData = JSON.parse(\r\n          JSON.stringify(this.originalData?.layoutData)\r\n        );\r\n\r\n        newLayoutData.forEach((data: any) => {\r\n          data.answers.forEach((ele: any) => {\r\n            ele.issues.forEach((issue: any) => {\r\n              if (\r\n                this.selectedFixture?.fixtureId.includes(\"new\") &&\r\n                issue.issueType != \"extraFixture\"\r\n              ) {\r\n                issue.Details = [];\r\n              } else if (\r\n                issue.issueType != \"comments\" &&\r\n                issue.issueType != \"extraFixture\"\r\n              ) {\r\n                issue.Details = issue.Details.filter(\r\n                  (shelf: any) =>\r\n                    shelf.fixtureId === this.selectedFixture?.fixtureId\r\n                );\r\n              } else if (\r\n                this.selectedFixture?.fixtureId.includes(\"new\") &&\r\n                issue.issueType === \"extraFixture\"\r\n              ) {\r\n                issue.Details = issue.Details.filter(\r\n                  (data: any) =>\r\n                    data._id === this.selectedFixture?.issueData?._id\r\n                );\r\n              } else if (\r\n                !this.selectedFixture?.fixtureId.includes(\"new\") &&\r\n                issue.issueType === \"extraFixture\"\r\n              ) {\r\n                issue.Details = [];\r\n              }\r\n            });\r\n            ele.issues = ele.issues.filter(\r\n              (issue: any) => issue.Details.length > 0\r\n            );\r\n            let fixturecount = ele.issues.filter(\r\n              (ele: any) => ele.issueType != \"extraFixture\"\r\n            );\r\n            if (fixturecount.length > 0) {\r\n              ele.issues = ele.issues.filter(\r\n                (issue: any) => issue.issueType != \"extraFixture\"\r\n              );\r\n            }\r\n          });\r\n        });\r\n        newLayoutData = newLayoutData.filter((data: any) => {\r\n          return !(data.answers[0].issues.length === 0);\r\n        });\r\n        this.getplanoFeedback(newLayoutData);\r\n      }\r\n\r\n      let fixtureList = this.originalData?.fixtureData?.filter(\r\n        (data: any) => data.fixtureId === this.selectedFixture?.fixtureId\r\n      );\r\n      if (fixtureList && fixtureList?.length > 0) {\r\n        this.fixturetaskIndex = 0;\r\n\r\n        this.getStoreFixturesfeedback(fixtureList);\r\n      } else {\r\n        this.getStoreFixturesfeedback([]);\r\n      }\r\n      let vmList = this.originalData?.VmData?.filter(\r\n        (data: any) => data.fixtureId === this.selectedFixture?.fixtureId\r\n      );\r\n      if (vmList && vmList?.length > 0) {\r\n        this.vmtaskIndex = 0;\r\n        this.getStoreVmfeedback(vmList);\r\n      } else {\r\n        this.getStoreVmfeedback([]);\r\n      }\r\n    }\r\n  }\r\n  ngOnInit(): void {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => {\r\n      if (env) {\r\n        this.cdnUrl = env.planogramCDN;\r\n        // this.aicdnUrl = env.planogramAICDN;\r\n      }\r\n    });\r\n  }\r\n\r\n  resetInitialValues() {\r\n    this.approvedLayoutissues = 0;\r\n    this.pendingLayoutissues = 0;\r\n    this.pendingFixtureissues = 0;\r\n    this.approvedFixtureissues = 0;\r\n    this.totalFixtureissues = 0;\r\n    this.completedFixture = 0;\r\n    this.pendingVmissues = 0;\r\n    this.approvedVmissues = 0;\r\n    this.totalVmissues = 0;\r\n    this.completedVm = 0;\r\n  }\r\n  togglePanel(index: number) {\r\n    this.layoutFeedback.forEach((item: any, i: any) => {\r\n      item.collapsed = i !== index; // only selected panel stays open\r\n    });\r\n  }\r\n  updateStyle(data: any, i: any) {\r\n    return this.handleSection(data, i);\r\n  }\r\n  getStoreFixturesfeedback(fixtureData: any) {\r\n    if (fixtureData?.length > 0) {\r\n      this.layoutFeedback.forEach((data: any) => {\r\n        data.collapsed = true;\r\n      });\r\n      this.cd.detectChanges();\r\n      this.openfixture = false;\r\n    }\r\n\r\n    this.completedFixture = fixtureData?.filter(\r\n      (data: any) => data.status === \"complete\"\r\n    ).length;\r\n    fixtureData?.forEach((shelf: any, i: any) => {\r\n      if (\r\n        shelf?.FixtureData?.shelfConfig &&\r\n        shelf?.FixtureData?.shelfConfig?.length > 0\r\n      ) {\r\n        shelf.FixtureData.shelfConfigFormated = this.formatData(\r\n          shelf.FixtureData.shelfConfig\r\n        );\r\n        shelf.FixtureData.sectionConfig = this.storeData(\r\n          shelf.FixtureData.shelfConfig,\r\n          shelf?.FixtureData?.productResolutionLevel\r\n        );\r\n        if (shelf?.FixtureData?.productResolutionLevel == \"L1\") {\r\n          shelf.FixtureData.sectionConfig[0].productBrandName =\r\n            shelf?.FixtureData.productBrandName;\r\n        }\r\n        let zoneColor: any = {};\r\n        shelf.FixtureData.sectionConfig.forEach((ele: any) => {\r\n          zoneColor[ele.zone] = { color: ele.color };\r\n        });\r\n        shelf.FixtureData.zoneColor = zoneColor;\r\n        shelf.FixtureData.sectionKeys = Object.keys(\r\n          shelf.FixtureData.sectionConfig\r\n        );\r\n        shelf.FixtureData.shelfDetails = shelf.FixtureData.shelfConfig;\r\n        shelf?.answers?.forEach((ele: any) => {\r\n          ele.issues = ele?.issues.filter(\r\n            (issue: any) => issue.Details && issue.Details.length > 0\r\n          );\r\n          this.totalFixtureissues =\r\n            this.totalFixtureissues + ele?.issues?.length;\r\n\r\n          ele?.issues.forEach((issue: any) => {\r\n            if (\r\n              issue?.Details.filter((data: any) => data.status === \"pending\")\r\n                .length > 0\r\n            ) {\r\n              issue.collapsed = false;\r\n              this.pendingFixtureissues = this.pendingFixtureissues + 1;\r\n            } else {\r\n              issue.collapsed = true;\r\n\r\n              this.approvedFixtureissues = this.approvedFixtureissues + 1;\r\n            }\r\n            issue?.Details.forEach((newshelf: any) => {\r\n              if (newshelf?.shelfConfig && newshelf?.shelfConfig?.length > 0) {\r\n                newshelf.shelfConfigFormated = this.formatData(\r\n                  newshelf.shelfConfig\r\n                );\r\n                newshelf.sectionConfig = this.storeData(\r\n                  newshelf.shelfConfig,\r\n                  shelf?.FixtureData?.productResolutionLevel\r\n                );\r\n                if (shelf?.FixtureData?.productResolutionLevel == \"L1\") {\r\n                  newshelf.sectionConfig[0].productBrandName =\r\n                    shelf?.FixtureData.productBrandName;\r\n                }\r\n                newshelf.sectionKeys = Object.keys(newshelf.sectionConfig);\r\n                if (\r\n                  [\"productcategoryWrong\", \"brandWrong\"].includes(\r\n                    issue.issueType\r\n                  )\r\n                ) {\r\n                  shelf.FixtureData.shelfDetails.forEach((shelf: any) => {\r\n                    let shelfDetails = newshelf.shelfConfig.find(\r\n                      (newShelf: any) =>\r\n                        newShelf.shelfNumber == shelf.shelfNumber\r\n                    );\r\n                    if (!shelfDetails) {\r\n                      shelf.oldShelf = true;\r\n                      newshelf.shelfConfig.push(shelf);\r\n                    }\r\n                  });\r\n                  newshelf.shelfConfig.sort(\r\n                    (a: any, b: any) => a.shelfNumber - b.shelfNumber\r\n                  );\r\n                }\r\n                newshelf.shelfDetails = newshelf.shelfConfig;\r\n              }\r\n            });\r\n          });\r\n        });\r\n      }\r\n    });\r\n    this.storeFixtureList = fixtureData;\r\n  }\r\n  getStoreVmfeedback(VmData: any) {\r\n    if (VmData?.length > 0) {\r\n      this.openvm = false;\r\n      this.openfixture = true;\r\n    }\r\n    if (!this.openvm) {\r\n      setTimeout(() => {\r\n        this.accordion?.expand(\"details\"); // 'details' is the ID of the item\r\n      });\r\n    }\r\n    this.completedVm = VmData?.filter(\r\n      (data: any) => data.status === \"complete\"\r\n    ).length;\r\n    VmData?.forEach((shelf: any) => {\r\n      if (\r\n        shelf?.FixtureData?.shelfConfig &&\r\n        shelf?.FixtureData?.shelfConfig?.length > 0\r\n      ) {\r\n        shelf.FixtureData.shelfConfigFormated = this.formatData(\r\n          shelf.FixtureData.shelfConfig\r\n        );\r\n        shelf.FixtureData.sectionConfig = this.storeData(\r\n          shelf.FixtureData.shelfConfig\r\n        );\r\n        shelf.FixtureData.sectionKeys = Object.keys(\r\n          shelf.FixtureData.sectionConfig\r\n        );\r\n        shelf.FixtureData.shelfDetails = shelf.FixtureData.shelfConfig;\r\n        let vmConfig = shelf.FixtureData.vmConfig;\r\n        shelf?.answers.forEach((ele: any) => {\r\n          ele.issues = ele?.issues.filter(\r\n            (issue: any) => issue.Details && issue.Details.length > 0\r\n          );\r\n          this.totalVmissues = this.totalVmissues + ele?.issues?.length;\r\n\r\n          ele?.issues.forEach((issue: any) => {\r\n            if (\r\n              issue?.Details.filter((data: any) => data.status === \"pending\")\r\n                .length > 0\r\n            ) {\r\n              issue.collapsed = false;\r\n              this.pendingVmissues = this.pendingVmissues + 1;\r\n            } else {\r\n              issue.collapsed = true;\r\n              this.approvedVmissues = this.approvedVmissues + 1;\r\n            }\r\n            issue?.Details.forEach((newshelf: any) => {\r\n              newshelf.vmConfignew = JSON.parse(\r\n                JSON.stringify(newshelf.vmConfig)\r\n              );\r\n              if (newshelf?.shelfConfig && newshelf?.shelfConfig?.length > 0) {\r\n                newshelf.shelfConfigFormated = this.formatData(\r\n                  newshelf.shelfConfig\r\n                );\r\n                newshelf.sectionConfig = this.storeData(newshelf.shelfConfig);\r\n                newshelf.sectionKeys = Object.keys(newshelf.sectionConfig);\r\n                newshelf.shelfDetails = newshelf.shelfConfig;\r\n                newshelf.vmConfignew.forEach((vm: any) => {\r\n                  if (issue.issueType == \"VmMismatch\") {\r\n                    vm.startYPosition = vm.newstartYPosition;\r\n                    vm.endYPosition = vm.newendYPosition;\r\n                    vm.xZone = vm.newxZone.toLowerCase();\r\n                    vm.yZone = vm.newyZone.toLowerCase();\r\n                  }\r\n                  vm.newVm = true;\r\n                });\r\n                newshelf.vmConfignew.push(...vmConfig);\r\n              }\r\n            });\r\n          });\r\n        });\r\n      }\r\n    });\r\n    this.vmFeedback = VmData;\r\n    timer(3000).subscribe(() => {\r\n      this.loading = false;\r\n      this.cd.detectChanges();\r\n    });\r\n  }\r\n  nextFixture(fixtureIndex: number, totalData: any) {\r\n    if (totalData.length > fixtureIndex + 1) {\r\n      this.fixtureIndex = fixtureIndex + 1;\r\n    }\r\n  }\r\n  previousFixture(fixtureIndex: number, totalData: any) {\r\n    if (fixtureIndex > 0) {\r\n      this.fixtureIndex = fixtureIndex - 1;\r\n    }\r\n  }\r\n  nexttaskFixture(fixturetaskIndex: number, totalData: any) {\r\n    if (totalData.length > fixturetaskIndex + 1) {\r\n      this.fixturetaskIndex = fixturetaskIndex + 1;\r\n    }\r\n  }\r\n  previoustaskVm(vmtaskIndex: number, totalData: any) {\r\n    if (vmtaskIndex > 0) {\r\n      this.vmtaskIndex = vmtaskIndex - 1;\r\n    }\r\n  }\r\n  nexttaskVm(vmtaskIndex: number, totalData: any) {\r\n    if (totalData.length > vmtaskIndex + 1) {\r\n      this.vmtaskIndex = vmtaskIndex + 1;\r\n    }\r\n  }\r\n  previoustaskFixture(fixturetaskIndex: number, totalData: any) {\r\n    if (fixturetaskIndex > 0) {\r\n      this.fixturetaskIndex = fixturetaskIndex - 1;\r\n    }\r\n  }\r\n  getplanoFeedback(layoutData: any) {\r\n    layoutData?.forEach((data: any, i: any) => {\r\n      if (i === 0) {\r\n        data.collapsed = false;\r\n      } else {\r\n        data.collapsed = true;\r\n      }\r\n      data?.answers.forEach((ele: any) => {\r\n        ele.issues = ele?.issues.filter(\r\n          (issue: any) => issue.Details && issue.Details.length > 0\r\n        );\r\n        // this.pendingLayoutissues = ele?.issues.filter((data: any) => data.status === 'pending').length\r\n        // this.approvedLayoutissues = ele?.issues.filter((data: any) => data.status !== 'pending').length\r\n\r\n        ele?.issues.forEach((issue: any) => {\r\n          if (\r\n            issue?.Details.filter((data: any) => data.status === \"pending\")\r\n              .length > 0\r\n          ) {\r\n            this.pendingLayoutissues = this.pendingLayoutissues + 1;\r\n          } else {\r\n            this.approvedLayoutissues = this.approvedLayoutissues + 1;\r\n          }\r\n          issue?.Details.forEach((shelf: any) => {\r\n            if (shelf?.shelfConfig && shelf?.shelfConfig?.length > 0) {\r\n              shelf.shelfConfigFormated = this.formatData(shelf.shelfConfig);\r\n              shelf.sectionConfig = this.storeData(shelf.shelfConfig);\r\n              shelf.sectionKeys = Object.keys(shelf.sectionConfig);\r\n              let zoneColor: any = {};\r\n              shelf.sectionConfig.forEach((ele: any) => {\r\n                zoneColor[ele.zone] = { color: ele.color };\r\n              });\r\n              shelf.zoneColor = zoneColor;\r\n              shelf.shelfDetails = shelf.shelfConfig;\r\n            }\r\n          });\r\n        });\r\n      });\r\n    });\r\n\r\n    this.layoutFeedback = layoutData;\r\n\r\n    this.cd.detectChanges();\r\n  }\r\n  formatData(data: any) {\r\n    const groupedArray = Object.values(\r\n      data.reduce((acc: any, item: any) => {\r\n        const zone = item.zone || \"undefined\";\r\n        if (!acc[zone]) {\r\n          acc[zone] = { zone, items: [] };\r\n        }\r\n        acc[zone].items.push(item);\r\n        return acc;\r\n      }, {})\r\n    );\r\n    return groupedArray;\r\n  }\r\n  storeData(shelfData: any, level?: string) {\r\n    shelfData.sort((a: any, b: any) => a.shelfNumber - b.shelfNumber);\r\n    let count = 0;\r\n    let sectionConfig: any[] = [];\r\n    // startYPosition: ele.shelfNumber,\r\n    //         endYPosition: ele.shelfNumber,\r\n    //         ...ele,\r\n    //         color: this.shlefColor[count],\r\n    shelfData.forEach((shelf: any) => {\r\n      let getSection = sectionConfig.filter((ele) => ele.zone == shelf.zone);\r\n      if (!getSection.length || (!shelf.zone && level == \"L2\")) {\r\n        sectionConfig.push({\r\n          ...shelf,\r\n          startYPosition: shelf.shelfNumber,\r\n          endYPosition: shelf.shelfNumber,\r\n          color: this.shlefColor[count],\r\n        });\r\n        count++;\r\n      } else {\r\n        if (\r\n          getSection[getSection.length - 1].endYPosition + 1 ==\r\n          shelf.shelfNumber\r\n        ) {\r\n          getSection[getSection.length - 1].endYPosition = shelf.shelfNumber;\r\n          getSection[getSection.length - 1].productBrandName = [\r\n            ...getSection[getSection.length - 1].productBrandName,\r\n            ...shelf.productBrandName,\r\n          ];\r\n          getSection[getSection.length - 1].productBrandName = [\r\n            ...new Set(\r\n              getSection[getSection.length - 1].productBrandName.map(\r\n                (ele: any) => ele\r\n              )\r\n            ),\r\n          ];\r\n        } else {\r\n          sectionConfig.push({\r\n            ...shelf,\r\n            startYPosition: shelf.shelfNumber,\r\n            endYPosition: shelf.shelfNumber,\r\n            color: getSection[getSection.length - 1].color,\r\n          });\r\n        }\r\n      }\r\n    });\r\n\r\n    // this.handlevmPosition(sectionConfig);\r\n    // this.handleSection(sectionConfig);\r\n    this.cd.detectChanges();\r\n    return sectionConfig;\r\n  }\r\n\r\n  confirmation(\r\n    type: any,\r\n    _id: any,\r\n    answerId?: any,\r\n    issueId?: any,\r\n    DetailsId?: any,\r\n    taskType?: any,\r\n    issueType?: any,\r\n    data?:any\r\n  ) {\r\n\r\n    let payload = {\r\n      _id: _id,\r\n      answerId: answerId,\r\n      issueId: issueId,\r\n      DetailsId: DetailsId,\r\n      taskType: taskType,\r\n      issueType: issueType,\r\n      planoId: this.currentPlanoDetails?.planoId,\r\n      floorId: this.currentPlanoDetails?._id,\r\n    };\r\n    const modalRef = this.modalService.open(ConfirmationPopupComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      scrollable: true,\r\n      backdrop: \"static\",\r\n      windowClass: \"custom-height-modal\", // <-- Add a custom class here\r\n    });\r\n    modalRef.componentInstance.type = type;\r\n    modalRef.componentInstance.inputData = payload;\r\n    modalRef.result.then((result) => {\r\n      \r\n      if (result.status === \"submit\") {\r\n        result.fixtureAiDetails = data;\r\n        this.isApproved.emit(result);\r\n      }\r\n      if(result == 'edit') {\r\n        data.taskType = taskType;\r\n        result = {\r\n          message:'edit',\r\n          data:data\r\n        }\r\n        this.isApproved.emit(result);\r\n      }\r\n    });\r\n  }\r\n  reload() {\r\n    let result = {\r\n      reload: true,\r\n    };\r\n    this.isApproved.emit(result);\r\n  }\r\n  applyFilters(event: any) {\r\n    let result: any = {};\r\n    if (event?.length) {\r\n      event.forEach((element: any) => {\r\n        if (element.Description === \"Task\") {\r\n          result.filterByTask = element.Issues.map((val: any) => val?.id);\r\n        }\r\n        if (element.Description === \"Status\") {\r\n          result.filterByApprovalStatus = element.Issues.map((val: any) => val?.id);\r\n        }\r\n        if (element.Description === \"Approval Status\") {\r\n          result.filterByApprovalStatus = element.Issues.id\r\n            ? element.Issues.id\r\n            : \"\";\r\n        }\r\n      });\r\n      if (\r\n        result.filterByApprovalStatus?.length === 0 &&\r\n        result.filterByStatus?.length === 0 &&\r\n        result.filterByTask?.length === 0\r\n      ) {\r\n        result.reload = true;\r\n        this.isApproved.emit(result);\r\n        return;\r\n      }\r\n      this.isApproved.emit(result);\r\n    }\r\n  }\r\n\r\n  handlevmPosition(vmData: any, i: any) {\r\n    const viewPort = this.bodyBlockRef?.nativeElement as HTMLElement;\r\n    const bodyHeight = viewPort?.offsetHeight;\r\n    const bodyWidth = viewPort?.offsetWidth;\r\n    let style;\r\n    // this.vmConfig.forEach((e: any, i: any) => {\r\n    let startShelf = vmData?.startYPosition ?? 1;\r\n    let endShelf = vmData?.endYPosition ?? 1;\r\n    const vm = document.getElementById(\"vm\" + i);\r\n    if (!vm) return;\r\n\r\n    let width = 100;\r\n    let height = 100;\r\n    let x = 0;\r\n    let y = 0;\r\n\r\n    let yStart = 0;\r\n    for (let k = 0; k < startShelf - 1; k++) {\r\n      const shelf = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!shelf) return;\r\n\r\n      yStart += shelf.offsetHeight;\r\n    }\r\n\r\n    let placementHeight = 0;\r\n    for (let k = startShelf - 1; k < endShelf; k++) {\r\n      const s = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!s) return;\r\n      placementHeight += s.offsetHeight;\r\n    }\r\n\r\n    switch (vmData?.xZone) {\r\n      case \"left\":\r\n        x = 0;\r\n        width = 100;\r\n        break;\r\n      case \"right\":\r\n        width = 100;\r\n        x = bodyWidth - width;\r\n        break;\r\n      case \"middle\":\r\n        width = 100;\r\n        x = (bodyWidth - width) / 2;\r\n        break;\r\n      case \"stretch\":\r\n        width = bodyWidth;\r\n        x = 0;\r\n        break;\r\n    }\r\n\r\n    switch (vmData?.yZone) {\r\n      case \"top\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = yStart;\r\n        break;\r\n      case \"middle\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = (placementHeight - height) / 2 + yStart;\r\n        break;\r\n      case \"bottom\":\r\n        height = placementHeight < 100 ? placementHeight - 20 : 100;\r\n        y = placementHeight - height + yStart;\r\n        break;\r\n      case \"stretch\":\r\n        height = placementHeight;\r\n        y = yStart;\r\n        break;\r\n    }\r\n\r\n    if (vmData.newVm) {\r\n      style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px);z-index:2;`;\r\n    } else {\r\n      style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px);`;\r\n    }\r\n\r\n    return style;\r\n    // });\r\n  }\r\n  handleSection(sectionConfig: any, i: any) {\r\n    const viewPort = this.bodyBlockRef?.nativeElement as HTMLElement;\r\n    const bodyHeight = viewPort?.offsetHeight;\r\n    const bodyWidth = viewPort?.offsetWidth;\r\n\r\n    let style: any;\r\n    // Object.keys(sectionConfig).forEach((e: any, i: any) => {\r\n    let startShelf = sectionConfig?.startYPosition ?? 1;\r\n    let endShelf = sectionConfig?.endYPosition ?? sectionConfig.length;\r\n    const section = document.getElementById(\"section\" + i);\r\n    if (!section) return;\r\n\r\n    let width = 100;\r\n    let height = 50;\r\n    let x = 0;\r\n    let y = 0;\r\n\r\n    let yStart = 0;\r\n    for (let k = 0; k < startShelf - 1; k++) {\r\n      const shelf = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n      if (!shelf) return;\r\n\r\n      yStart += shelf.offsetHeight;\r\n    }\r\n\r\n    let placementHeight = 0;\r\n    for (let k = startShelf - 1; k < endShelf; k++) {\r\n      const s = document.getElementById(\"shelf\" + k) as HTMLElement;\r\n\r\n      if (!s) return;\r\n      placementHeight += s.offsetHeight;\r\n    }\r\n    x = 10;\r\n    height = placementHeight < 100 ? 48 : 50;\r\n    // height = 50;\r\n    y = (placementHeight - height) / 2 + yStart;\r\n\r\n    style = `width:${width}px;height:${height}px;transform:translate(${x}px, ${y}px)`;\r\n    // let vmDetails = document.getElementById(`vm-placeholder${i}`);\r\n    // if (vmDetails) {\r\n    //   vmDetails.style.border = `1px solid ${this.shlefColor[i].border}`;\r\n    // }\r\n    // style.push({zone:e,style:styleList})\r\n    // });\r\n    return style;\r\n  }\r\n\r\n  getStartPosition(shelfNumber: number, zone: any, shelfDetails: any) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.startYPosition == shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  getEndPosition(shelfNumber: number, zone: any, shelfDetails: any) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.endYPosition == shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n  getMidPosition(shelfNumber: number, zone: any, shelfDetails: any) {\r\n    shelfDetails = shelfDetails.find(\r\n      (ele: any) => ele.zone == zone && ele.endYPosition >= shelfNumber\r\n    );\r\n    if (shelfDetails) {\r\n      return true;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next(true);\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  getType(data:any) {\r\n    return data?.fixtureAIData?.vmConfig?.length\r\n      ? data?.fixtureAIData?.vmConfig\r\n          ?.map((ele: any) => ele.vmType)\r\n          .filter((name: string) => !!name)\r\n          ?.toString() ?? \"--\"\r\n      : \"--\";\r\n  }\r\n\r\n  getName(data:any) {\r\n    return data?.fixtureAIData?.vmConfig?.length\r\n      ? data?.fixtureAIData.vmConfig\r\n          .map((ele: any) => ele.vmName?.trim?.())\r\n          .filter((name: string) => !!name)\r\n          .join(\", \") || \"--\"\r\n      : \"--\";\r\n  }\r\n\r\n  compareType(data:any) {\r\n    let string1 = data?.fixtureAIData?.vmConfig?.length\r\n      ? data?.fixtureAIData?.vmConfig?.map((ele: any) => ele.vmType)?.toString()\r\n      : \"--\";\r\n    let string2 = this.selectedFixture?.vmConfig\r\n      ?.map((vm: any) => vm.vmType)\r\n      ?.toString();\r\n    const arrA = string1\r\n      ?.split(\",\")\r\n      ?.map((s: any) => s.trim())\r\n      ?.sort();\r\n    const arrB = string2\r\n      ?.split(\",\")\r\n      ?.map((s: any) => s.trim())\r\n      ?.sort();\r\n    return JSON.stringify(arrA) !== JSON.stringify(arrB) ? \"#b42318\" : \"\";\r\n  }\r\n\r\n  compareName(data:any) {\r\n    let string1 = data?.fixtureAIData?.vmConfig?.length\r\n      ? data?.fixtureAIData?.vmConfig\r\n          ?.map((ele: any) => ele.vmName)\r\n          ?.toString()\r\n      : \"--\";\r\n    let string2 = this.selectedFixture?.vmConfig\r\n      ?.map((vm: any) => vm.vmName)\r\n      ?.toString();\r\n    const arrA = string1\r\n      ?.split(\",\")\r\n      ?.map((s: any) => s.trim())\r\n      ?.sort();\r\n    const arrB = string2\r\n      ?.split(\",\")\r\n      ?.map((s: any) => s.trim())\r\n      ?.sort();\r\n    return JSON.stringify(arrA) !== JSON.stringify(arrB) ? \"#b42318\" : \"\";\r\n  }\r\n\r\n  openPopup(img: any) {\r\n    this.selectedImage = this.cdnUrl + img;\r\n  }\r\n\r\n  closePopup(event?: Event) {\r\n    if (event) event.stopPropagation(); // prevents click bubbling\r\n    this.selectedImage = \"\";\r\n  }\r\n\r\n  matchFixtureCategory(category: any,data:any) {\r\n    if(data?.header?.label && this.fixtureHeaderList[data?.header?.label]) {\r\n      return this.fixtureHeaderList[data?.header.label].includes(category)? \"\": \"#b42318\";\r\n    }\r\n    else {\r\n      return data?.header?.label == category ? \"\" : \"#b42318\";\r\n    }\r\n  }\r\n}\r\n\r\n","<section *ngIf=\"loading\">\r\n  <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n    <div class=\"shimmer\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<section *ngIf=\"!loading\">\r\n  <div class=\"d-flex justify-content-between border-bottom\">\r\n    <div>\r\n      <div class=\"storeResponse\">Store response</div>\r\n      <div class=\"normalText mb-5\">Click a fixture or view all</div>\r\n    </div>\r\n    <div class=\"mt-4\">\r\n      <button *ngIf=\"selectedFixture?.fixtureId\" (click)=\"reload()\"\r\n        class=\"btn btn-light text-primary border-0 px-3 py-2\" style=\"background-color: #eaf6ff; border-radius: 1rem;\">\r\n        Clear Filter\r\n      </button>\r\n      <lib-filters *ngIf=\"!selectedFixture?.fixtureId\" [dataObject]=\"dataObject\"\r\n        (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n    </div>\r\n  </div>\r\n  <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\" *ngIf=\"vmFeedback?.length>0\">\r\n    <ng-container>\r\n      <div ngbAccordionItem=\"details\" [collapsed]=\"openvm\" class=\"mb-5\">\r\n        <div class=\"d-flex\" ngbAccordionHeader>\r\n          <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n            <span class=\"me-2 layout-Lbel\">\r\n              <div>Vm verification assigned</div>\r\n              <div class=\"grayText\">{{vmFeedback[0]?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}</div>\r\n            </span>\r\n            <div class=\"divider\"></div>\r\n          </button>\r\n        </div>\r\n        <div ngbAccordionCollapse>\r\n          <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n            <ng-template>\r\n              <div *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"d-flex\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <div class=\"h-divider mt-3 ms-5\"></div>\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{vmFeedback[vmtaskIndex]?.taskData?.createdByName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{vmFeedback[vmtaskIndex]?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assigner\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"d-flex\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.taskData?.userName!==''\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <div class=\"h-divider mt-3 ms-5\"></div>\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{vmFeedback[vmtaskIndex]?.taskData?.userName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{vmFeedback[vmtaskIndex]?.taskData?.submitTime_string}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assignee\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex ms-3\" *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"badge badge-light-success p-3 me-4\" *ngIf=\"completedVm===vmFeedback.length\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Vm matched</span>\r\n                </div>\r\n                <div class=\"badge badge-light-danger p-3 me-4\" *ngIf=\"completedVm!==vmFeedback.length\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path\r\n                      d=\"M6 4V6M6 8H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z\"\r\n                      stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Vm mismatch</span>\r\n                </div>\r\n                <div class=\"badge badge-light-warning p-3\" *ngIf=\"pendingVmissues>0\">\r\n                  {{pendingVmissues}}/{{totalVmissues}} action pending\r\n                </div>\r\n                <div class=\"badge badge-light-success p-3\" *ngIf=\"approvedVmissues>0&&pendingVmissues===0\">\r\n                  {{approvedVmissues}}/{{totalVmissues}} action done\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex justify-content-between mt-5\">\r\n                <div class=\"cursor-pointer\" (click)=\"previoustaskVm(vmtaskIndex,vmFeedback)\">\r\n                  <svg *ngIf=\"vmtaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n                    fill=\"none\">\r\n                    <path d=\"M15 6L9 12L15 18\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                  <svg *ngIf=\"!vmtaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                    viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M15 6L9 12L15 18\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                </div>\r\n                <div class=\"layoutLabel\">\r\n                  {{ vmFeedback[vmtaskIndex]?.FixtureData?.fixtureName}} -\r\n                  {{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                  {{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                </div>\r\n                <div class=\"layoutLabel\">\r\n                  {{vmtaskIndex+1}}/{{vmFeedback.length}}\r\n                </div>\r\n                <div class=\"cursor-pointer\" (click)=\"nexttaskVm(vmtaskIndex,vmFeedback)\">\r\n                  <svg *ngIf=\"vmFeedback.length>vmtaskIndex+1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                    viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n\r\n                  <svg *ngIf=\"(vmFeedback.length)===(vmtaskIndex+1)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                    height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                </div>\r\n              </div>\r\n              <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"vmFeedback[vmtaskIndex]?.FixtureData?.fixtureName\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Fixture name:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">{{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureName}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"vmFeedback[vmtaskIndex]?.FixtureData?.fixtureCategory\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Fixture Type:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">{{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureCategory}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"vmFeedback[vmtaskIndex]?.FixtureData?.fixtureWidth?.value!==''\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Size (Width):</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                      {{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"vmFeedback[vmtaskIndex]?.FixtureData?.shelfConfig\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Total shelves:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{vmFeedback[vmtaskIndex]?.FixtureData?.shelfConfig?.length}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"vmFeedback[vmtaskIndex]?.FixtureData?.fixtureCapacity\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Total product capacity:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{vmFeedback[vmtaskIndex]?.FixtureData?.fixtureCapacity}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"mt-4\">\r\n                <div class=\"layoutLabel\">\r\n                  Planogram design\r\n                </div>\r\n                <div class=\"grayText\">\r\n                  Fixture designed by the planogram team\r\n                </div>\r\n                <div class=\"wall-viewport w-100 mt-5\">\r\n\r\n                  <div id=\"header-block\" class=\"header-block\">\r\n                    <p>\r\n                      {{vmFeedback[vmtaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                    </p>\r\n                  </div>\r\n                  <div #bodyBlock id=\"bodyBlock\" class=\"body-block w-100\">\r\n                    <ng-container *ngFor=\"let vm of vmFeedback[vmtaskIndex]?.FixtureData?.vmConfig;let i=index\">\r\n                      <div [id]=\"'vm' + i\" class=\"vm-block\" [style]=\"handlevmPosition(vm,i)\">\r\n                        <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\">\r\n                          <img [src]=\"vm?.imgSrc\" *ngIf=\"vm?.imgSrc\" />\r\n                          <span class=\"secStyle wordWrap\">{{vm?.vmName}}</span>\r\n                        </div>\r\n                      </div>\r\n                    </ng-container>\r\n                    <div *ngFor=\"let shelfData of vmFeedback[vmtaskIndex]?.FixtureData?.shelfDetails; let i = index\">\r\n                      <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\">\r\n                        <div class=\"badge\" [ngStyle]=\"{\r\n                            'background-color':'white',\r\n                            color:'white'}\">\r\n                          Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                        </div>\r\n\r\n                      </div>\r\n\r\n                    </div>\r\n                  </div>\r\n                  <!-- Footer block -->\r\n                  <div class=\"footer-block\">\r\n                    <p> {{vmFeedback[vmtaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\"\r\n                *ngFor=\"let issues of vmFeedback[vmtaskIndex]?.answers;let j = index\">\r\n                <ng-container>\r\n                  <div ngbAccordionItem=\"{{ 'newdetails-' + k }}\" [collapsed]=\"item.collapsed\" class=\"mb-5\"\r\n                    *ngFor=\"let item of issues.issues;let k = index\">\r\n                    <div class=\"d-flex \" ngbAccordionHeader>\r\n                      <button type=\"button\" ngbAccordionButton class=\"mainheading p-3 backgroundImg\">\r\n                        <span class=\"me-2 layout-Lbel\">\r\n\r\n                          <div><span *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'\"\r\n                              class=\"d-inline-block bg-warning rounded-circle mx-2\"\r\n                              style=\"width: 10px; height: 10px;\"></span>{{item?.question}}</div>\r\n                        </span>\r\n                        <div class=\"divider\"></div>\r\n                      </button>\r\n                    </div>\r\n                    <div ngbAccordionCollapse>\r\n                      <div ngbAccordionBody class=\"p-0\">\r\n                        <ng-template>\r\n\r\n                          <div class=\"d-flex justify-content-start mt-5\">\r\n\r\n                            <div *ngIf=\"item.issueType==='VmMissing'\">\r\n                              Total additional VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                            </div>\r\n                            <div *ngIf=\"item.issueType==='extraVm'\">\r\n                              Total additional VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                            </div>\r\n                            <div *ngIf=\"item.issueType==='VmMismatch'\">\r\n                              Total misplaced VMs: {{ item?.Details[fixtureIndex]?.vmConfig.length}}\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"backgroundImg mt-4 ps-3 py-2\"\r\n                            *ngFor=\"let vmData of item?.Details[fixtureIndex]?.vmConfig\">\r\n                            <div *ngIf=\"item.issueType==='VmMismatch'\">\r\n                              current\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.vmName\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">VM Name :</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.vmName}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.startYPosition\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Placement start :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">Shelf {{vmData?.startYPosition}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.endYPosition\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Placement End :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">Shelf {{vmData?.endYPosition}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.xZone\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Horizontal zone :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.xZone}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.yZone\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Vertical zone :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.yZone}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.position\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">position :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.position}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div *ngIf=\"item.issueType==='VmMismatch'\">\r\n                              New\r\n                            </div>\r\n\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.newstartYPosition\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Placement start :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">Shelf {{vmData?.newstartYPosition}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.newendYPosition\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Placement End :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">Shelf {{vmData?.newendYPosition}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.newxZone\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Horizontal zone :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.newxZone}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.newyZone\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">Vertical zone :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.newyZone}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"vmData?.newposition\">\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"layoutLabel\">position :</div>\r\n                              </div>\r\n                              <div class=\"col-md-6\">\r\n                                <div class=\"shelfText breakWord\">{{vmData?.newposition}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n\r\n\r\n                          </div>\r\n                          <div class=\"mt-4\" *ngIf=\"item?.Details[fixtureIndex]?.vmConfig?.length>0\">\r\n                            <div class=\"layoutLabel\">\r\n                              Store Response\r\n                            </div>\r\n                            <div class=\"grayText\">\r\n                              Fixture feedback by the store team\r\n                            </div>\r\n                            <div class=\"wall-viewport w-100 mt-5\">\r\n\r\n                              <div id=\"header-block\" class=\"header-block\">\r\n                                <p>\r\n                                  {{vmFeedback[vmtaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                                </p>\r\n                              </div>\r\n\r\n                              <div #bodyBlock id=\"bodyBlock\" class=\"body-block w-100\">\r\n                                <ng-container *ngFor=\"let vm of item?.Details[fixtureIndex]?.vmConfignew;let m=index\">\r\n                                  <div [id]=\"'vm' + m\" class=\"vm-block\" [style]=\"handlevmPosition(vm,m)\">\r\n                                    <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + m\"\r\n                                      [class]=\"vm.newVm ? 'redBorder' : ''\">\r\n                                      <img [src]=\"vm?.imgSrc\" *ngIf=\"vm?.imgSrc\" />\r\n                                      <span class=\"secStyle\">{{vm?.vmName}}</span>\r\n                                      <!-- <h3>{{ item?.Details[fixtureIndex]?.sectionConfig[section]?.zone}}</h3> -->\r\n                                    </div>\r\n                                  </div>\r\n                                </ng-container>\r\n\r\n\r\n                                <div *ngFor=\"let shelfData of item?.Details[fixtureIndex]?.shelfDetails; let i = index\">\r\n\r\n\r\n                                  <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\">\r\n                                    <div class=\"badge\" [ngStyle]=\"{\r\n                                              'background-color':'white',\r\n                                              color:'white'}\">\r\n                                      Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                                    </div>\r\n\r\n                                  </div>\r\n\r\n                                </div>\r\n                              </div>\r\n\r\n\r\n                              <div class=\"footer-block\">\r\n                                <p> {{vmFeedback[vmtaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                              </div>\r\n                            </div>\r\n                          </div>\r\n\r\n\r\n\r\n                          <div class=\"my-4\" *ngIf=\"item?.comments.length>0\">\r\n                            <div class=\"assignText\">Comments</div>\r\n                            <div class=\"d-flex mt-4\" *ngFor=\"let comment of item?.comments\">\r\n                              <div class=\"symbol symbol-35px symbol-circle\">\r\n                                <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                      d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                      stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                      stroke-linejoin=\"round\" />\r\n                                  </svg>\r\n                                </span>\r\n                              </div>\r\n\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\"assignText breakWord mt-2\">\r\n                                  {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\" breakWord mt-2\">\r\n                                  Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Agreed,\r\n                                    updated \"</span>\r\n                                  <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Disagree,\r\n                                    retained existing\"</span>\r\n                                </div>\r\n                                <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                                  Note: {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"my-4 w-100\"\r\n                            *ngIf=\"vmFeedback[vmtaskIndex].answers[0]?.image&&vmFeedback[vmtaskIndex].answers[0]?.image!==''\">\r\n                            <div class=\"assignText\">Store fixture</div>\r\n                            <img src=\"{{cdnUrl}}{{vmFeedback[vmtaskIndex].answers[0]?.image}}\" alt=\"image\"\r\n                              class=\"mt-4 w-100\" />\r\n                          </div>\r\n                          <div class=\"mt-5 row\"\r\n                            *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'&&selectedFixture?.fixtureId\">\r\n                            <div class=\"d-flex justify-content-end\">\r\n                              <div class=\"two-tone-btn me-3\"\r\n                                (click)=\"confirmation('agree',vmFeedback[vmtaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]._id,'vm',item.issueType)\">\r\n                                Agree\r\n                              </div>\r\n                              <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                                (click)=\"confirmation('disagree',vmFeedback[vmtaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]?._id,'vm',item.issueType)\">Disagree</button>\r\n                            </div>\r\n                          </div>\r\n\r\n\r\n                        </ng-template>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </ng-container>\r\n              </div>\r\n              <div *ngIf=\"vmFeedback[vmtaskIndex]?.answers[0]?.issues?.length===0\">\r\n\r\n                <div class=\"my-4 w-100\"\r\n                  *ngIf=\"vmFeedback[vmtaskIndex]?.answers[0]?.image&&vmFeedback[vmtaskIndex]?.answers[0]?.image!==''\">\r\n                  <div class=\"assignText\">Store fixture</div>\r\n                  <img src=\"{{cdnUrl}}{{vmFeedback[vmtaskIndex]?.answers[0]?.image}}\" alt=\"image\" class=\"mt-4 w-100\" />\r\n                </div>\r\n                <div class=\"my-4\" *ngIf=\"vmFeedback[vmtaskIndex]?.answers[0]?.comments.length>0\">\r\n                  <div class=\"assignText\">Comments</div>\r\n                  <div class=\"d-flex mt-4\" *ngFor=\"let comment of vmFeedback[vmtaskIndex]?.answers[0]?.comments\">\r\n                    <div class=\"symbol symbol-35px symbol-circle\">\r\n                      <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                          <path\r\n                            d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                    </div>\r\n\r\n                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                      <div class=\"\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{comment.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"assignText breakWord mt-2\">\r\n                        {{comment?.comment}}\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                      <div class=\"\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{comment.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                      </div>\r\n                      <div class=\" breakWord mt-2\">\r\n                        Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Agreed,\r\n                          updated\"</span>\r\n                        <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Disagree, retained\r\n                          existing\"</span>\r\n                      </div>\r\n                      <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                        Note: {{comment?.comment}}\r\n                      </div>\r\n                    </div>\r\n\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"my-4\" *ngIf=\"originalData.vmComment.length>0&& !selectedFixture?.fixtureId\">\r\n                <div class=\"assignText\">Comments</div>\r\n                <div class=\"d-flex mt-4\" *ngFor=\"let comment of originalData.vmComment\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                  </div>\r\n\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"\">\r\n                      <div class=\"layoutLabel\">\r\n                        {{comment.userName}}\r\n                      </div>\r\n                      <div class=\"grayText\">\r\n                        {{comment?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"breakWord mt-2\">\r\n                      {{comment?.comment}}\r\n                    </div>\r\n                  </div>\r\n\r\n\r\n                </div>\r\n              </div>\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n  </div>\r\n\r\n  <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\" *ngIf=\"storeFixtureList?.length>0\">\r\n    <ng-container>\r\n      <div ngbAccordionItem=\"detailsfixture\" [collapsed]=\"openfixture\" class=\"mb-5\">\r\n        <div class=\"d-flex\" ngbAccordionHeader>\r\n          <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n            <span class=\"me-2 layout-Lbel\">\r\n              <div>Fixture verification assigned</div>\r\n              <div class=\"grayText\">{{storeFixtureList[0]?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}</div>\r\n            </span>\r\n            <div class=\"divider\"></div>\r\n          </button>\r\n        </div>\r\n        <div ngbAccordionCollapse>\r\n          <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n            <ng-template>\r\n              <div *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"d-flex\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <div class=\"h-divider mt-3 ms-5\"></div>\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.taskData?.createdByName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assigner\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"d-flex\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.taskData?.userName!==''\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <!-- <div class=\"h-divider mt-3 ms-5\"></div> -->\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.taskData?.userName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.taskData?.submitTime_string}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assignee\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <!-- <div class=\"d-flex ms-3\" *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"badge badge-light-success p-3 me-4\" *ngIf=\"completedFixture===storeFixtureList.length\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Fixture matched</span>\r\n                </div>\r\n                <div class=\"badge badge-light-danger p-3 me-4\" *ngIf=\"completedFixture!==storeFixtureList.length\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path\r\n                      d=\"M6 4V6M6 8H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z\"\r\n                      stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Fixture mismatch</span>\r\n                </div>\r\n                <div class=\"badge badge-light-warning p-3\" *ngIf=\"pendingFixtureissues>0\">\r\n                  {{pendingFixtureissues}}/{{totalFixtureissues}} action pending\r\n                </div>\r\n                <div class=\"badge badge-light-success p-3\" *ngIf=\"approvedFixtureissues>0&&pendingFixtureissues===0\">\r\n                  {{approvedFixtureissues}}/{{totalFixtureissues}} action done\r\n                </div>\r\n              </div> -->\r\n              <div class=\"d-flex justify-content-between mt-5\">\r\n                <div class=\"cursor-pointer\" (click)=\"previoustaskFixture(fixturetaskIndex,storeFixtureList)\">\r\n                  <svg *ngIf=\"fixturetaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                    viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M15 6L9 12L15 18\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                  <svg *ngIf=\"!fixturetaskIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                    viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M15 6L9 12L15 18\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                </div>\r\n                <div class=\"layoutLabel\">\r\n                  {{ storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName}} - {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value}} {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                </div>\r\n                <div class=\"layoutLabel\">\r\n                  {{fixturetaskIndex+1}}/{{storeFixtureList.length}}\r\n                </div>\r\n                <div class=\"cursor-pointer\" (click)=\"nexttaskFixture(fixturetaskIndex,storeFixtureList)\">\r\n                  <svg *ngIf=\"storeFixtureList.length>fixturetaskIndex+1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n                    height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n\r\n                  <svg *ngIf=\"(storeFixtureList.length)===(fixturetaskIndex+1)\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                    width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                    <path d=\"M9 18L15 12L9 6\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg>\r\n                </div>\r\n              </div>\r\n              <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Fixture Name:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">{{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureName}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCategory\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Fixture Type:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCategory}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\"\r\n                  *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value!==''\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Size (Width):</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.value}}\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureWidth?.unit}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfConfig\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Total Shelves:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfConfig?.length}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"row mb-4 mt-2\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCapacity\">\r\n                  <div class=\"col-md-5\">\r\n                    <div class=\"layoutLabel\">Total Product Capacity:</div>\r\n                  </div>\r\n                  <div class=\"col-md-7\">\r\n                    <div class=\"shelfText breakWord\">\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCapacity}}\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"mt-4\">\r\n                <div class=\"layoutLabel\">\r\n                  Planogram design\r\n                </div>\r\n                <div class=\"grayText\">\r\n                  Fixture designed by the planogram team\r\n                </div>\r\n                <div class=\"wall-viewport w-100 mt-5\">\r\n\r\n                  <div id=\"header-block\" class=\"header-block\">\r\n                    <p>\r\n                      {{storeFixtureList[fixturetaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                    </p>\r\n                  </div>\r\n                  <div #bodyBlock id=\"bodyBlock\" class=\"body-block\">\r\n                    <ng-container\r\n                      *ngFor=\"let section of storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionKeys;let i=index\">\r\n                      <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                        [style]=\"updateStyle(storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section],i)\">\r\n                        <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                          [style]=\"'border:1px solid '+storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.border\">\r\n                          <div class=\"badge\"\r\n                            *ngIf=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone\"\r\n                            [ngStyle]=\"{\r\n                            'background-color':storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.textBg,\r\n                            color:storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.color?.text}\">\r\n                            {{ storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone}}\r\n                          </div>\r\n                          <ng-template #tooltip>\r\n                            <div>\r\n                              <span>{{storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                              </span>\r\n                            </div>\r\n                          </ng-template>\r\n                          <span class=\"secStyle wordWrap\" [ngbTooltip]=\"tooltip\">{{\r\n                            storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n                        </div>\r\n                      </div>\r\n                    </ng-container>\r\n                    <div\r\n                      *ngFor=\"let shelfData of storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfDetails; let i = index\">\r\n                      <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\"\r\n                        [ngStyle]=\"{'background-color':(shelfData?.zone || storeFixtureList[fixturetaskIndex]?.FixtureData?.productResolutionLevel === 'L1') ? storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.bg : shlefColor[i].bg}\">\r\n                        <div class=\"badge\"\r\n                          [ngStyle]=\"{\r\n                            'background-color':(shelfData?.zone || storeFixtureList[fixturetaskIndex]?.FixtureData?.productResolutionLevel === 'L1') ? storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.textBg : shlefColor[i].textBg,\r\n                            color:(shelfData?.zone || storeFixtureList[fixturetaskIndex]?.FixtureData?.productResolutionLevel === 'L1') ? storeFixtureList[fixturetaskIndex]?.FixtureData?.zoneColor[shelfData.zone]?.color?.text : shlefColor[i].text}\">\r\n                          Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                        </div>\r\n\r\n                      </div>\r\n\r\n                    </div>\r\n                  </div>\r\n\r\n                  <!-- Footer block -->\r\n                  <div class=\"footer-block\">\r\n                    <p> {{storeFixtureList[fixturetaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\"\r\n                *ngFor=\"let issues of storeFixtureList[fixturetaskIndex]?.answers;let j = index\">\r\n                <ng-container>\r\n                  <div ngbAccordionItem=\"{{ 'newdetails-' + k }}\" [collapsed]=\"item.collapsed\" class=\"mb-5\"\r\n                    *ngFor=\"let item of issues.issues;let k = index\">\r\n                    <div class=\"d-flex \" ngbAccordionHeader>\r\n                      <button type=\"button\" ngbAccordionButton class=\"mainheading p-3 backgroundImg\">\r\n                        <span class=\"me-2 layout-Lbel\">\r\n                          <div> <span *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'\"\r\n                              class=\"d-inline-block bg-warning rounded-circle mx-2\"\r\n                              style=\"width: 10px; height: 10px;\"></span>{{item?.question}}</div>\r\n                        </span>\r\n                        <div class=\"divider\"></div>\r\n                      </button>\r\n                    </div>\r\n                    <div ngbAccordionCollapse>\r\n                      <div ngbAccordionBody class=\"p-0\">\r\n                        <ng-template>\r\n\r\n                          <div class=\"d-flex justify-content-center mt-5\">\r\n\r\n                            <div class=\"layoutLabel\">\r\n                              {{ item?.Details[fixtureIndex]?.fixtureName}}\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                            <div class=\"row mb-4 mt-2\" *ngIf=\"item?.Details[fixtureIndex]?.fixtureCategory\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Fixture Type:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixtureCategory}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"item?.Details[fixtureIndex]?.fixturetemplateName\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Template:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixturetemplateName}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"item?.issueType==='sizeWrong'\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Size:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixtureWidth?.value}}\r\n                                  {{item?.Details[fixtureIndex]?.fixtureWidth?.unit}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div *ngIf=\"item?.issueType==='productcategoryWrong'\">\r\n                              <div *ngFor=\"let missing of item?.Details[fixtureIndex]?.missingData\">\r\n                                <div class=\"row mb-4\" *ngIf=\"missing?.zone\">\r\n                                  <div class=\"col-md-5\">\r\n                                    <div class=\"layoutLabel\">{{missing?.zone}}:</div>\r\n                                  </div>\r\n\r\n                                  <div class=\"col-md-7\" *ngFor=\"let category of missing?.productCategory\">\r\n                                    <div class=\"shelfText breakWord badge \">{{category}}\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div *ngIf=\"item?.issueType==='brandWrong'\">\r\n                              <div *ngFor=\"let missing of item?.Details[fixtureIndex]?.missingData\">\r\n                                <div class=\"row mb-4\" *ngIf=\"missing?.zone\">\r\n                                  <div class=\"col-md-5\">\r\n                                    <div class=\"layoutLabel\">{{missing?.zone}}:</div>\r\n                                  </div>\r\n                                  <div class=\"col-md-7\">\r\n                                    <div *ngFor=\"let brand of missing?.brand\" class=\"shelfText breakWord badge m-1\"\r\n                                      [ngStyle]=\"{\r\n                                              'border-radius': '13.843px',\r\n                                              'background': 'var(--Gray-100, #ebeef3)'}\">\r\n                                      {{brand}}\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n\r\n                              </div>\r\n                            </div>\r\n                            <div *ngIf=\"item?.issueType!=='brandWrong'&&item?.issueType!=='productcategoryWrong'\">\r\n\r\n                              <div *ngFor=\"let fixtureList of item?.Details[fixtureIndex]?.shelfConfigFormated\">\r\n\r\n\r\n                                <div class=\"row mb-4\">\r\n                                  <div class=\"col-md-3\">\r\n                                    <div class=\"layoutLabel text-capitalize\">{{fixtureList?.zone}}</div>\r\n                                  </div>\r\n                                  <div class=\"col-md-9 mt-5\">\r\n                                    <div class=\"divider\"></div>\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\"row\" *ngFor=\"let shlefdata of fixtureList?.items\">\r\n                                  <div class=\"col-md-5\">\r\n                                    <div class=\"layoutLabel text-capitalize\">{{shlefdata?.shelfType}}\r\n                                      {{shlefdata?.shelfNumber}}:</div>\r\n                                  </div>\r\n                                  <div class=\"col-md-7\">\r\n                                    <div class=\"shelfText\">\r\n                                      <div class=\"text-capitalize\">Capacity: <span\r\n                                          class=\"layoutLabel\">{{shlefdata?.productPerShelf}}</span></div>\r\n                                      <div class=\"mt-2\" *ngFor=\"let brands of shlefdata?.productBrandName\">\r\n                                        <span class=\"badge badge-secondary me-3 mb-2\">{{brands}}</span>\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n\r\n                              </div>\r\n                            </div>\r\n\r\n\r\n                          </div>\r\n                          <div class=\"mt-4\" *ngIf=\"item?.Details[fixtureIndex]?.sectionKeys?.length>0\">\r\n                            <div class=\"layoutLabel\">\r\n                              Store Response\r\n                            </div>\r\n                            <div class=\"grayText\">\r\n                              Planogram response by the store team\r\n                            </div>\r\n                            <div class=\"wall-viewport w-100 mt-5\"\r\n                              [style]=\"['Fixture type is wrong','Fixture size is wrong'].includes(item?.question) ? 'border:1px solid red' : ''\">\r\n\r\n                              <div id=\"header-block\" class=\"header-block\"\r\n                                style=\"border: 0.771px solid var(--Gray-400, #98A2B3);background: #F2F3F7;\">\r\n                                <p>\r\n                                  {{storeFixtureList[fixturetaskIndex]?.FixtureData?.header?.label ?? ''}}\r\n                                </p>\r\n                              </div>\r\n\r\n\r\n                              <div #bodyBlock id=\"bodyBlock\" class=\"body-block\">\r\n\r\n\r\n                                <ng-container *ngIf=\"['productcategoryWrong', 'brandWrong'].includes(item?.issueType)\">\r\n                                  <div\r\n                                    *ngFor=\"let section of storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionKeys;let i=index\">\r\n                                    <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                                      [style]=\"updateStyle(storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section],i)\">\r\n                                      <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                        style=\"border: 0.969px solid var(--Gray-300, #D0D5DD);\">\r\n                                        <span class=\"badge\" [ngStyle]=\"{\r\n                                          'border-radius': '13.843px',\r\n                                          'background': 'var(--Gray-100, #ebeef3)'}\">{{\r\n                                          storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.zone}}</span>\r\n                                        <ng-template #tooltip>\r\n                                          <div\r\n                                            [ngClass]=\"item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.length ?'danger' : ''\">\r\n                                            <span>{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.toString() ?? storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                                            </span>\r\n                                          </div>\r\n                                        </ng-template>\r\n                                        <span class=\"secStyle wordWrap\" [ngbTooltip]=\"tooltip\"\r\n                                          [ngClass]=\"item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.length ? 'danger' : ''\">{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.[0] ||\r\n                                          storeFixtureList[fixturetaskIndex]?.FixtureData?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n                                </ng-container>\r\n                                <ng-container *ngIf=\"!['productcategoryWrong', 'brandWrong'].includes(item?.issueType)\">\r\n                                  <div *ngFor=\"let section of item?.Details[fixtureIndex]?.sectionKeys;let i=index\">\r\n                                    <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                                      [style]=\"updateStyle(item?.Details[fixtureIndex]?.sectionConfig[section],i)\">\r\n                                      <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                        style=\"border: 0.969px solid var(--Gray-300, #D0D5DD);\">\r\n                                        <span class=\"badge\" [ngStyle]=\"{\r\n                                          'border-radius': '13.843px',\r\n                                          'background': 'var(--Gray-100, #ebeef3)'}\">{{\r\n                                          item?.Details[fixtureIndex]?.sectionConfig[section]?.zone}}</span>\r\n                                        <ng-template #tooltip>\r\n                                          <div>\r\n                                            <span>{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                                            </span>\r\n                                          </div>\r\n                                        </ng-template>\r\n                                        <span class=\"secStyle wordWrap\"\r\n                                          [ngbTooltip]=\"tooltip\">{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n\r\n                                      </div>\r\n                                    </div>\r\n                                  </div>\r\n                                </ng-container>\r\n\r\n                                <div *ngFor=\"let shelfData of item?.Details[fixtureIndex]?.shelfDetails; let i = index\">\r\n\r\n                                  <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\" [ngStyle]=\"{\r\n                                    'border-top':(getStartPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question))  ? '0.771px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                    'border-bottom':(getEndPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? ' 0.771px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                    'border-left':(getMidPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? ' 0.771px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                    'border-right':(getMidPosition(i+1,shelfData.zone,item?.Details[fixtureIndex]?.sectionConfig) && !['Fixture type is wrong','Fixture size is wrong'].includes(item?.question)) ? ' 0.771px solid red' : '0.771px solid var(--Gray-400, #98A2B3)',\r\n                                    background: 'var(--Gray-100, #f8f9fb)',}\">\r\n                                    <div class=\"badge\" [ngStyle]=\"{\r\n                                              'border-radius': '13.843px',\r\n                                              'background': 'var(--Gray-100, #ebeef3)'}\">\r\n                                      Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                                    </div>\r\n\r\n                                  </div>\r\n\r\n                                </div>\r\n                              </div>\r\n\r\n\r\n                              <div class=\"footer-block\">\r\n                                <p> {{storeFixtureList[fixturetaskIndex]?.FixtureData?.footer?.label ?? ''}}</p>\r\n                              </div>\r\n                            </div>\r\n\r\n                          </div>\r\n\r\n                          <div class=\"my-4\" *ngIf=\"item?.comments.length>0\">\r\n                            <div class=\"assignText\">Comments</div>\r\n                            <div class=\"d-flex mt-4\" *ngFor=\"let comment of item?.comments\">\r\n                              <div class=\"symbol symbol-35px symbol-circle\">\r\n                                <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                      d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                      stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                      stroke-linejoin=\"round\" />\r\n                                  </svg>\r\n                                </span>\r\n                              </div>\r\n\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\"assignText breakWord mt-2\">\r\n                                  {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\" breakWord mt-2\">\r\n                                  Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Agreed,\r\n                                    updated \"</span>\r\n                                  <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Disagree,\r\n                                    retained existing\"</span>\r\n                                </div>\r\n                                <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                                  Note: {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"my-4 w-100\"\r\n                            *ngIf=\"storeFixtureList[fixturetaskIndex]?.answers[0]?.image&&storeFixtureList[fixturetaskIndex]?.answers[0]?.image!==''\">\r\n                            <div class=\"assignText\">Store fixture</div>\r\n                            <img src=\"{{cdnUrl}}{{storeFixtureList[fixturetaskIndex]?.answers[0]?.image}}\" alt=\"image\"\r\n                              class=\"mt-4 w-100\" />\r\n                          </div>\r\n                          <div class=\"mt-5 row\"\r\n                            *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'&&selectedFixture?.fixtureId\">\r\n                            <div class=\"d-flex justify-content-end\">\r\n                              <div class=\"two-tone-btn me-3\"\r\n                                (click)=\"confirmation('agree',storeFixtureList[fixturetaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]._id,'fixture',item.issueType)\">\r\n                                Agree\r\n                              </div>\r\n                              <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                                (click)=\"confirmation('disagree',storeFixtureList[fixturetaskIndex]?._id,issues._id,item._id,item?.Details[fixtureIndex]?._id,'fixture',item.issueType)\">Disagree</button>\r\n                            </div>\r\n                          </div>\r\n\r\n\r\n                        </ng-template>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </ng-container>\r\n              </div>\r\n              <div *ngIf=\"storeFixtureList[fixturetaskIndex]?.answers[0]?.issues?.length===0\">\r\n                <div class=\"my-4 w-100\"\r\n                  *ngIf=\"storeFixtureList[fixturetaskIndex]?.answers[0]?.image&&storeFixtureList[fixturetaskIndex]?.answers[0]?.image!==''\">\r\n                  <div class=\"assignText\">\r\n                    <div class=\"layoutLabel\">\r\n                      Store Response\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      Fixture feedback by the store team\r\n                    </div>\r\n                  </div>\r\n                  <img\r\n                    src=\"{{cdnUrl}}{{storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureImage ? storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureImage : storeFixtureList[fixturetaskIndex]?.answers[0]?.image}}\"\r\n                    alt=\"image\" class=\"mt-4 w-100\" />\r\n                </div>\r\n\r\n                <div class=\"backgroundImg mt-4 ps-3 py-2\"\r\n                  *ngIf=\"storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCategory\">\r\n                  <div class=\"textHeading\">AI Output ✨</div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">Fixture Type:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\"\r\n                        [style.color]=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCategory?.toLowerCase() !== storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCategory?.toLowerCase() ? '#b42318': ''\">\r\n                        {{storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCategory ?? '--'}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">Fixture Header:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\"\r\n                        [style.color]=\"matchFixtureCategory(storeFixtureList[fixturetaskIndex]?.FixtureData?.header?.label,storeFixtureList[fixturetaskIndex]?.fixtureAIData)\">\r\n                        {{storeFixtureList[fixturetaskIndex]?.fixtureAIData?.header?.label ?? '--'}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">Total Shelves:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\"\r\n                        [style.color]=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.shelfConfig?.length !== storeFixtureList[fixturetaskIndex]?.fixtureAIData?.shelfConfig?.length ? '#b42318': ''\">\r\n                        {{storeFixtureList[fixturetaskIndex]?.fixtureAIData?.shelfConfig?.length ?? 0}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">Total Product Capacity:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\"\r\n                        [style.color]=\"storeFixtureList[fixturetaskIndex]?.FixtureData?.fixtureCapacity !== storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCapacity ? '#b42318': ''\">\r\n                        {{storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCapacity ?? 0}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">VM Type:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\" [style.color]=\"compareType(storeFixtureList[fixturetaskIndex])\">\r\n                        {{getType(storeFixtureList[fixturetaskIndex])}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-5\">\r\n                      <div class=\"aiLayoutLabel\">VM Name:</div>\r\n                    </div>\r\n                    <div class=\"col-md-7\">\r\n                      <div class=\"shelfText breakWord\" [style.color]=\"compareName(storeFixtureList[fixturetaskIndex])\">\r\n                        {{getName(storeFixtureList[fixturetaskIndex])}}\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"row mb-4 mt-2\">\r\n                    <div class=\"col-md-12\">\r\n                      <div class=\"aiLayoutLabel\">Visual Merchandise Image:</div>\r\n                    </div><br />\r\n                    <div class=\"row\">\r\n                      <div class=\"col-md-6 mt-5\"\r\n                        *ngFor=\"let vm of storeFixtureList[fixturetaskIndex]?.fixtureAIData?.vmConfig\"> <img\r\n                          src=\"{{cdnUrl}}{{vm.vmImage}}\" (click)=\"openPopup(vm.vmImage)\"\r\n                          style=\"width:120px;height:120px\" />\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n\r\n                <div class=\"popup\" *ngIf=\"selectedImage\" (click)=\"closePopup()\">\r\n                  <!-- <span class=\"close\" (click)=\"closePopup($event)\">&times;</span> -->\r\n                  <img [src]=\"selectedImage\" class=\"popup-img\" (click)=\"$event.stopPropagation()\" />\r\n                </div>\r\n\r\n                <div class=\"my-4\" *ngIf=\"storeFixtureList[fixturetaskIndex]?.answers[0]?.comments.length>0\">\r\n                  <div class=\"assignText\">Comments</div>\r\n                  <div class=\"d-flex mt-4\"\r\n                    *ngFor=\"let comment of storeFixtureList[fixturetaskIndex]?.answers[0]?.comments\">\r\n                    <div class=\"symbol symbol-35px symbol-circle\">\r\n                      <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                          <path\r\n                            d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                            stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                        </svg>\r\n                      </span>\r\n                    </div>\r\n\r\n                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                      <div class=\"\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{comment.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                      </div>\r\n                      <div class=\"assignText breakWord mt-2\">\r\n                        {{comment?.comment}}\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                      <div class=\"\">\r\n                        <div class=\"layoutLabel\">\r\n                          {{comment.userName}}\r\n                        </div>\r\n                        <div class=\"grayText\">\r\n                          {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                        </div>\r\n                      </div>\r\n                      <div class=\" breakWord mt-2\">\r\n                        Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Agreed, updated\r\n                          \"</span>\r\n                        <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Disagree, retained\r\n                          existing\"</span>\r\n                      </div>\r\n                      <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                        Note: {{comment?.comment}}\r\n                      </div>\r\n                    </div>\r\n\r\n                  </div>\r\n                </div>\r\n\r\n                <div class=\"mt-5 row\"\r\n                  *ngIf=\"storeFixtureList[fixturetaskIndex]?.approvalStatus==='pending' && selectedFixture?.fixtureId && !storeFixtureList[fixturetaskIndex]?.answers[0]?.status && storeFixtureList[fixturetaskIndex]?.fixtureAIData?.fixtureCategory\">\r\n                  <div class=\"d-flex justify-content-end\">\r\n                    <div class=\"two-tone-btn me-3\"\r\n                      (click)=\"confirmation('agree',storeFixtureList[fixturetaskIndex]?._id,storeFixtureList[fixturetaskIndex]?.answers[0]?._id,'','','fixture','',storeFixtureList[fixturetaskIndex]?.fixtureAIData)\">\r\n                      Agree</div>\r\n                    <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                      (click)=\"confirmation('disagree',storeFixtureList[fixturetaskIndex]?._id,storeFixtureList[fixturetaskIndex]?.answers[0]?._id,'','','fixture','',storeFixtureList[fixturetaskIndex]?.fixtureAIData)\">Disagree</button>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n\r\n              <div class=\"my-4\" *ngIf=\"originalData.fixtureComment.length>0&& !selectedFixture?.fixtureId\">\r\n                <div class=\"assignText\">Comments</div>\r\n                <div class=\"d-flex mt-4\" *ngFor=\"let comment of originalData.fixtureComment\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                  </div>\r\n\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"\">\r\n                      <div class=\"layoutLabel\">\r\n                        {{comment.userName}}\r\n                      </div>\r\n                      <div class=\"grayText\">\r\n                        {{comment?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                      </div>\r\n                    </div>\r\n                    <div class=\"breakWord mt-2\">\r\n                      {{comment?.comment}}\r\n                    </div>\r\n                  </div>\r\n\r\n\r\n                </div>\r\n              </div>\r\n\r\n\r\n\r\n\r\n            </ng-template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n  </div>\r\n\r\n  <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\" *ngIf=\"layoutFeedback.length>0\">\r\n    <ng-container>\r\n      <div ngbAccordionItem=\"{{ 'details-' + i }}\" [collapsed]=\"feedback.collapsed\" (headerClick)=\"togglePanel(i)\"\r\n        class=\"mb-5\" *ngFor=\"let feedback of layoutFeedback;let i = index\">\r\n        <div class=\"d-flex\" ngbAccordionHeader>\r\n          <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n            <span class=\"me-2 layout-Lbel\">\r\n              <div *ngIf=\"feedback?.taskType==='initial'\">Layout verification assigned</div>\r\n              <div *ngIf=\"feedback?.taskType==='redo'\">Layout verification re-assigned</div>\r\n              <div class=\"grayText\">{{feedback?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}</div>\r\n            </span>\r\n            <div class=\"divider\"></div>\r\n          </button>\r\n        </div>\r\n        <div ngbAccordionCollapse>\r\n          <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n            <ng-template>\r\n              <div *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"d-flex\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <div class=\"h-divider mt-3 ms-5\"></div>\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{feedback?.taskData?.createdByName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{feedback?.taskData?.createdAt |date: 'hh:mm:ss a - dd MMM yyyy'}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assigner\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n                <div class=\"d-flex\" *ngIf=\"feedback?.taskData?.userName!==''\">\r\n                  <div class=\"symbol symbol-35px symbol-circle\">\r\n                    <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                        <path\r\n                          d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                          stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                      </svg>\r\n                    </span>\r\n                    <div class=\"h-divider mt-3 ms-5\"></div>\r\n                  </div>\r\n                  <div class=\"ms-3\">\r\n                    <div class=\"layoutLabel\">\r\n                      {{feedback?.taskData?.userName}}\r\n                    </div>\r\n                    <div class=\"grayText\">\r\n                      {{feedback?.taskData?.submitTime_string}}\r\n                    </div>\r\n                    <div class=\"assignText\">\r\n                      Assignee\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"d-flex ms-3\" *ngIf=\"!selectedFixture?.fixtureId\">\r\n                <div class=\"badge badge-light-success p-3 me-4\" *ngIf=\"feedback?.status==='complete'\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#12B76A\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n                      stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Layout matched</span>\r\n                </div>\r\n                <div class=\"badge badge-light-danger p-3 me-4\" *ngIf=\"feedback?.status==='incomplete'\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                    <path\r\n                      d=\"M6 4V6M6 8H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z\"\r\n                      stroke=\"#F04438\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                  </svg><span class=\"ms-2\">Layout mismatch</span>\r\n                </div>\r\n                <div class=\"badge badge-light-warning p-3\"\r\n                  *ngIf=\"feedback?.status==='incomplete'&&pendingLayoutissues>0\">\r\n                  {{pendingLayoutissues}}/{{feedback?.answers[0]?.issues?.length}} action pending\r\n                </div>\r\n                <div class=\"badge badge-light-success p-3\"\r\n                  *ngIf=\"feedback?.status==='incomplete'&&approvedLayoutissues>0&&pendingLayoutissues===0\">\r\n                  {{approvedLayoutissues}}/{{feedback?.answers[0]?.issues?.length}} action done\r\n                </div>\r\n              </div>\r\n              <div ngbAccordion #accordion=\"ngbAccordion\" [closeOthers]=\"true\" class=\"mt-5\"\r\n                *ngFor=\"let issues of feedback.answers;let j = index\">\r\n                <ng-container *ngIf=\"issues?.issues?.length>0\">\r\n                  <div ngbAccordionItem=\"{{ 'newdetails-' + k }}\" [collapsed]=\"issues.collapsed\" class=\"mb-5\"\r\n                    *ngFor=\"let item of issues.issues;let k = index\">\r\n                    <div class=\"d-flex \" ngbAccordionHeader>\r\n                      <button type=\"button\" ngbAccordionButton class=\"mainheading p-3 backgroundImg\">\r\n                        <span class=\"me-2 layout-Lbel\">\r\n\r\n                          <div><span *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'\"\r\n                              class=\"d-inline-block bg-warning rounded-circle mx-2\"\r\n                              style=\"width: 10px; height: 10px;\"></span>{{item?.question}}</div>\r\n                        </span>\r\n                        <div class=\"divider\"></div>\r\n                      </button>\r\n                    </div>\r\n                    <div ngbAccordionCollapse>\r\n                      <div ngbAccordionBody class=\"p-0\">\r\n                        <ng-template>\r\n                          <!-- <div>{{item?.Details[fixtureIndex]?.fixtureName}}</div> -->\r\n                          <div class=\"d-flex justify-content-between mt-5\"\r\n                            *ngIf=\"item?.Details[fixtureIndex]?.fixtureName\">\r\n                            <div class=\"cursor-pointer\" (click)=\"previousFixture(fixtureIndex,item?.Details)\">\r\n                              <svg *ngIf=\"fixtureIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                                viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                <path d=\"M15 6L9 12L15 18\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                              <svg *ngIf=\"!fixtureIndex\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"\r\n                                viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                <path d=\"M15 6L9 12L15 18\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                            </div>\r\n                            <div class=\"layoutLabel\">\r\n                              {{ item?.Details[fixtureIndex]?.fixtureName}}\r\n                            </div>\r\n                            <div class=\"layoutLabel\">\r\n                              {{fixtureIndex+1}}/{{item?.Details.length}}\r\n                            </div>\r\n                            <div class=\"cursor-pointer\" (click)=\"nextFixture(fixtureIndex,item?.Details)\">\r\n                              <svg *ngIf=\"item?.Details.length>fixtureIndex+1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                <path d=\"M9 18L15 12L9 6\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n\r\n                              <svg *ngIf=\"(item?.Details.length)===(fixtureIndex+1)\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                                width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n                                <path d=\"M9 18L15 12L9 6\" stroke=\"#D0D5DD\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n                                  stroke-linejoin=\"round\" />\r\n                              </svg>\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"backgroundImg mt-4 ps-3 py-2\">\r\n                            <div class=\"row mb-4 mt-2\" *ngIf=\"item?.Details[fixtureIndex]?.fixtureCategory\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Fixture Type:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixtureCategory}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"item?.Details[fixtureIndex]?.fixtureTemplateName\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Template:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">{{item?.Details[fixtureIndex]?.fixtureTemplateName}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n\r\n                            <div *ngFor=\"let fixtureList of item?.Details[fixtureIndex]?.shelfConfigFormated\">\r\n\r\n\r\n                              <div class=\"row mb-4\">\r\n                                <div class=\"col-md-3\">\r\n                                  <div class=\"layoutLabel text-capitalize\">{{fixtureList?.zone}}</div>\r\n                                </div>\r\n                                <div class=\"col-md-9 mt-5\">\r\n                                  <div class=\"divider\"></div>\r\n                                </div>\r\n                              </div>\r\n                              <div class=\"row\" *ngFor=\"let shlefdata of fixtureList?.items\">\r\n                                <div class=\"col-md-5\">\r\n                                  <div class=\"layoutLabel text-capitalize\">{{shlefdata?.shelfType}}\r\n                                    {{shlefdata?.shelfNumber}}:</div>\r\n                                </div>\r\n                                <div class=\"col-md-7\">\r\n                                  <div class=\"shelfText\">\r\n                                    <div class=\"text-capitalize\">Capacity: <span\r\n                                        class=\"layoutLabel\">{{shlefdata?.productPerShelf}}</span></div>\r\n                                    <div class=\"mt-3\" *ngFor=\"let brands of shlefdata?.productBrandName\">\r\n                                      <span class=\"badge badge-secondary me-3 mb-2\">{{brands}}</span>\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n\r\n                            </div>\r\n                            <div class=\"row mb-4 mt-2\" *ngIf=\"item?.Details[fixtureIndex]?.associatedElementType\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Location:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">\r\n                                  {{item?.Details[fixtureIndex]?.associatedElementType}}\r\n                                  {{item?.Details[fixtureIndex]?.associatedElementNumber}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\" *ngIf=\"item?.Details[fixtureIndex]?.associatedElementFixtureNumber\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">Position:</div>\r\n                                <div class=\"layoutLabel\">(L to R)</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">\r\n                                  {{item?.Details[fixtureIndex]?.associatedElementFixtureNumber}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4 mt-2\" *ngIf=\"item?.Details[fixtureIndex]?.newassociatedElementType\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">New Location:</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">\r\n                                  {{item?.Details[fixtureIndex]?.newassociatedElementType}}{{item?.Details[fixtureIndex]?.newassociatedElementNumber}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"row mb-4\"\r\n                              *ngIf=\"item?.Details[fixtureIndex]?.newassociatedElementFixtureNumber\">\r\n                              <div class=\"col-md-5\">\r\n                                <div class=\"layoutLabel\">New Position:</div>\r\n                                <div class=\"layoutLabel\">(L to R)</div>\r\n                              </div>\r\n                              <div class=\"col-md-7\">\r\n                                <div class=\"shelfText breakWord\">\r\n                                  {{item?.Details[fixtureIndex]?.newassociatedElementFixtureNumber}}\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n\r\n                          </div>\r\n                          <div class=\"mt-4\" *ngIf=\"item?.Details[fixtureIndex]?.sectionKeys?.length>0\">\r\n                            <div *ngIf=\"item.issueType==='extraFixture'\">\r\n                              <div class=\"layoutLabel\">\r\n                                Store Fixture\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                Fixture feedback by the store team\r\n                              </div>\r\n                            </div>\r\n                            <div *ngIf=\"item.issueType!=='extraFixture'\">\r\n                              <div class=\"layoutLabel\">\r\n                                Planogram fixture\r\n                              </div>\r\n                              <div class=\"grayText\">\r\n                                Below fixture is in the planogram but not in store.\r\n                              </div>\r\n                            </div>\r\n                            <div class=\"wall-viewport w-100 mt-5\">\r\n                              <!-- Header block -->\r\n                              <div id=\"header-block\" class=\"header-block\">\r\n                                <p>\r\n                                  {{item?.Details[fixtureIndex]?.header?.label ?? ''}}\r\n                                </p>\r\n                              </div>\r\n\r\n                              <!-- Body block -->\r\n                              <div #bodyBlock id=\"bodyBlock\" class=\"body-block\">\r\n\r\n\r\n                                <ng-container\r\n                                  *ngFor=\"let section of item?.Details[fixtureIndex]?.sectionKeys;let i=index\">\r\n                                  <div [id]=\"'section' + i\" class=\"vm-block\"\r\n                                    [style]=\"updateStyle(item?.Details[fixtureIndex]?.sectionConfig[section],i)\">\r\n                                    <div class=\"vm-placeholder\" [id]=\"'vm-placeholder' + i\"\r\n                                      [style]=\"'border:1px solid '+ this.shlefColor[i].border\">\r\n                                      <div class=\"badge\" [ngStyle]=\"{\r\n                                        'background-color':item?.Details[fixtureIndex]?.sectionConfig[section]?.color?.textBg,\r\n                                         color:item?.Details[fixtureIndex]?.sectionConfig[section]?.color?.text\r\n                                        }\">{{\r\n                                        item?.Details[fixtureIndex]?.sectionConfig[section]?.zone}}</div>\r\n                                      <ng-template #tooltip>\r\n                                        <div>\r\n                                          <span>{{item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.toString()}}\r\n                                          </span>\r\n                                        </div>\r\n                                      </ng-template>\r\n                                      <span class=\"secStyle wordWrap\" [ngbTooltip]=\"tooltip\">{{\r\n                                        item?.Details[fixtureIndex]?.sectionConfig[section]?.productBrandName?.[0]}}</span>\r\n                                    </div>\r\n                                  </div>\r\n                                </ng-container>\r\n\r\n\r\n                                <div *ngFor=\"let shelfData of item?.Details[fixtureIndex]?.shelfDetails; let i = index\">\r\n                                  <!-- @if(item.shelfType ==='shelf'){ -->\r\n\r\n                                  <div [id]=\"'shelf' + i\" class=\"block shelf hide-scroll d-block text-end\"\r\n                                    [ngStyle]=\"{\r\n                                          'background-color':shelfData?.zone ? item?.Details[fixtureIndex]?.zoneColor[shelfData?.zone]?.color?.bg : shlefColor[i].bg}\">\r\n\r\n                                    <div class=\"badge\" [ngStyle]=\"{\r\n                                              'background-color':item?.Details[fixtureIndex]?.zoneColor[shelfData?.zone]?.color?.textBg,\r\n                                               color:item?.Details[fixtureIndex]?.zoneColor[shelfData?.zone]?.color?.text\r\n                                              }\">\r\n                                      Shelf Capacity : {{shelfData?.productPerShelf}}\r\n                                    </div>\r\n\r\n                                  </div>\r\n\r\n                                </div>\r\n                              </div>\r\n\r\n                              <!-- Footer block -->\r\n                              <div class=\"footer-block\">\r\n                                <p> {{item?.Details[fixtureIndex]?.footer?.label ?? ''}}</p>\r\n                              </div>\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"my-4 w-100\"\r\n                            *ngIf=\"item?.Details[fixtureIndex]?.image&&item?.Details[fixtureIndex]?.image!==''\">\r\n                            <div class=\"assignText\">Store fixture</div>\r\n                            <img src=\"{{cdnUrl}}{{item?.Details[fixtureIndex]?.image}}\" alt=\"image\"\r\n                              class=\"mt-4 w-100\" />\r\n                          </div>\r\n                          <div class=\"my-4\" *ngIf=\"item?.Details[fixtureIndex]?.comments.length>0\">\r\n                            <div class=\"assignText\">Comments</div>\r\n                            <div class=\"d-flex mt-4\" *ngFor=\"let comment of item?.Details[fixtureIndex]?.comments\">\r\n                              <div class=\"symbol symbol-35px symbol-circle\">\r\n                                <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                                  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                                    fill=\"none\">\r\n                                    <path\r\n                                      d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                                      stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n                                      stroke-linejoin=\"round\" />\r\n                                  </svg>\r\n                                </span>\r\n                              </div>\r\n\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype==='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\"breakWord mt-2\">\r\n                                  {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n                              <div class=\"ms-3\" *ngIf=\"comment?.responsetype!=='comment'\">\r\n                                <div class=\"\">\r\n                                  <div class=\"layoutLabel\">\r\n                                    {{comment.userName}}\r\n                                  </div>\r\n                                  <div class=\"grayText\">\r\n                                    {{comment?.timeStamp|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                                  </div>\r\n                                </div>\r\n                                <div class=\" breakWord mt-2\">\r\n                                  Marked as <span *ngIf=\"comment?.responsetype==='agree'\" class=\"assignText\">\"Agreed,\r\n                                    updated\"</span>\r\n                                  <span *ngIf=\"comment?.responsetype==='disagree'\" class=\"assignText\">\"Disagree,\r\n                                    retained existing\"</span>\r\n                                </div>\r\n                                <div class=\"breakWord mt-2\" *ngIf=\"comment?.comment!==''\">\r\n                                  Note: {{comment?.comment}}\r\n                                </div>\r\n                              </div>\r\n\r\n                            </div>\r\n                          </div>\r\n                          <div class=\"mt-5 row\"\r\n                            *ngIf=\"item?.Details[fixtureIndex]?.status==='pending'&&selectedFixture?.fixtureId||item?.Details[fixtureIndex]?.status==='pending'&&item.issueType==='others'\">\r\n                            <div class=\"d-flex justify-content-end\">\r\n                              <div class=\"two-tone-btn me-3\"\r\n                                (click)=\"confirmation('agree',feedback?._id,issues._id,item._id,item?.Details[fixtureIndex]._id,'layout',item.issueType)\">\r\n                                Agree\r\n                              </div>\r\n                              <button type=\"button\" class=\"btn btn-default btn-outline\"\r\n                                (click)=\"confirmation('disagree',feedback?._id,issues._id,item._id,item?.Details[fixtureIndex]?._id,'layout',item.issueType)\">Disagree</button>\r\n                            </div>\r\n                          </div>\r\n                        </ng-template>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </ng-container>\r\n                <ng-container *ngIf=\"!selectedFixture?.fixtureId\">\r\n                  <div class=\"my-4 w-100\" *ngIf=\"feedback?.answers[0]?.video&&feedback?.answers[0]?.video!==''\">\r\n                    <div class=\"assignText\">Store Video</div>\r\n                    <video controls src=\"{{cdnUrl}}{{feedback?.answers[0]?.video}}\" class=\"mt-4 w-100\"></video>\r\n                  </div>\r\n                  <div class=\"my-4\" *ngIf=\"originalData.layoutComment.length>0\">\r\n                    <div class=\"assignText\">Comments</div>\r\n                    <div class=\"d-flex mt-4\" *ngFor=\"let comment of originalData.layoutComment\">\r\n                      <div class=\"symbol symbol-35px symbol-circle\">\r\n                        <span class=\"symbol-label bg-light-primary text-primary me-2\">\r\n                          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n                            fill=\"none\">\r\n                            <path\r\n                              d=\"M16.6654 17.5V15.8333C16.6654 14.9493 16.3142 14.1014 15.6891 13.4763C15.0639 12.8512 14.2161 12.5 13.332 12.5H6.66536C5.78131 12.5 4.93346 12.8512 4.30834 13.4763C3.68322 14.1014 3.33203 14.9493 3.33203 15.8333V17.5M13.332 5.83333C13.332 7.67428 11.8396 9.16667 9.9987 9.16667C8.15775 9.16667 6.66536 7.67428 6.66536 5.83333C6.66536 3.99238 8.15775 2.5 9.9987 2.5C11.8396 2.5 13.332 3.99238 13.332 5.83333Z\"\r\n                              stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n                          </svg>\r\n                        </span>\r\n                      </div>\r\n\r\n                      <div class=\"ms-3\">\r\n                        <div class=\"\">\r\n                          <div class=\"layoutLabel\">\r\n                            {{comment.userName}}\r\n                          </div>\r\n                          <div class=\"grayText\">\r\n                            {{comment?.createdAt|date:'hh:mm:ss a - dd MMM yyyy'}}\r\n                          </div>\r\n                        </div>\r\n                        <div class=\"breakWord mt-2\">\r\n                          {{comment?.comment}}\r\n                        </div>\r\n                      </div>\r\n\r\n\r\n                    </div>\r\n                  </div>\r\n                </ng-container>\r\n              </div>\r\n            </ng-template>\r\n\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n    </ng-container>\r\n  </div>\r\n\r\n\r\n  <div class=\"mt-5\" *ngIf=\"layoutFeedback?.length===0&&storeFixtureList?.length===0&&vmFeedback?.length===0&&!loading\">\r\n    <div class=\"text-center\">\r\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\" viewBox=\"0 0 94 94\" fill=\"none\">\r\n        <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n        <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\" stroke-width=\"13.3333\" />\r\n        <path\r\n          d=\"M35.9502 48.1997C35.6489 48.2315 35.3422 48.2505 35.0312 48.2505C34.8617 48.2505 34.6944 48.2436 34.5293 48.2339V58.6069C34.5293 60.0349 35.7123 61.226 37.2002 61.2261H56.8047C58.2927 61.2261 59.4756 60.035 59.4756 58.6069V48.2349C59.3137 48.2441 59.1498 48.2505 58.9854 48.2505C58.6714 48.2505 58.3608 48.2325 58.0547 48.1997V55.9878H35.9502V48.1997ZM57.9316 32.7739H36.0732C35.8959 32.7739 35.7406 32.8667 35.6631 32.9878L35.6611 32.9897L32.1514 38.4731L32.0566 38.6206C30.8311 40.7404 32.0957 43.4674 34.4473 43.7769C34.6482 43.8013 34.8379 43.8159 35.0254 43.8159C36.2555 43.8159 37.3434 43.2872 38.1006 42.4653L39.0225 41.4644L39.9414 42.4683C40.6903 43.2863 41.777 43.8159 43.0146 43.8159C44.2467 43.8158 45.3386 43.2856 46.0869 42.4683L47.0088 41.4614L47.9307 42.4683C48.679 43.2857 49.7707 43.8159 51.0029 43.8159C52.2351 43.8159 53.3268 43.2857 54.0752 42.4683L54.9971 41.4614L55.9189 42.4683C56.6673 43.2857 57.76 43.8159 58.9922 43.8159C59.1736 43.8159 59.3687 43.8021 59.5684 43.7778H59.5674C61.9611 43.4573 63.2293 40.6078 61.8613 38.4731L61.8604 38.4741L58.3438 32.9907L58.3428 32.9878C58.2653 32.8665 58.1092 32.7739 57.9316 32.7739Z\"\r\n          stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n      </svg>\r\n    </div>\r\n    <div class=\"mt-3 text-center\">\r\n      <div class=\"fw-bold h3 mt-2\">No issue</div>\r\n      <div class=\"mt-4\">The store did not flag it as an issue.</div>\r\n    </div>\r\n  </div>\r\n</section>","import {\r\n  Component,\r\n  Input,\r\n  OnChanges,\r\n  OnInit,\r\n  SimpleChanges,\r\n} from \"@angular/core\";\r\n\r\n@Component({\r\n  selector: \"product-zone-locator\",\r\n  templateUrl: \"./product-zone-locator.component.html\",\r\n  styleUrl: \"./product-zone-locator.component.scss\",\r\n})\r\nexport class ProductZoneLocatorComponent implements OnChanges, OnInit {\r\n  @Input() targetProduct: any;\r\n  @Input() targetFixture: any;\r\n  \r\n  \r\n  data: any;\r\n  allBrands: any;\r\n  zoneCapacity: number = 0;\r\n  allProducts: any[] = [];\r\n  targetPID:any;\r\n\r\n  ngOnInit(): void {}\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    \r\n    \r\n    if (this.targetFixture && this.targetProduct) {\r\n\r\n      this.data = {\r\n        zone: this.targetProduct.zone,\r\n        shelves: this.targetFixture?.shelfConfig.filter(\r\n          (s: any) => s.zone === this.targetProduct.zone,\r\n        ),\r\n      };\r\n\r\n      this.data.shelves = this.data.shelves.map((s: any) => {\r\n        if (s.shelfType !== \"shelf\" && s.products?.length) {\r\n          s.distributedRows = this.distributeRoundRobin(s.products, s.trayRows);\r\n        }\r\n        return s;\r\n      });\r\n      \r\n      this.allProducts = (this.data?.shelves ?? []).flatMap(\r\n        (s: any) => s.products ?? [],\r\n      );\r\n\r\n      this.allBrands = [\r\n        ...new Set(this.data.shelves.flatMap((s: any) => s.productBrandName)),\r\n      ];\r\n      this.zoneCapacity = this.allProducts.length;\r\n      this.targetPID = this.allProducts[0]._id;\r\n    }\r\n  }\r\n\r\n  distributeRoundRobin(products: any, trayRows: number) {\r\n    const result: any = Array.from({ length: trayRows }, () => []);\r\n\r\n    products.forEach((product: any, index: number) => {\r\n      const trayIndex = index % trayRows;\r\n      result[trayIndex].push(product);\r\n    });\r\n\r\n    return result;\r\n  }\r\n}\r\n","<section id=\"product-zone-locator\" *ngIf=\"targetFixture\">\r\n    <div class=\"zone-details my-2\">\r\n        <div class=\"d-flex align-items-center gap-2\">\r\n            <div class=\"zone-info\">\r\n                <span class=\"badge draft mb-3\">\r\n                    {{ data?.zone }}\r\n                </span>\r\n                <h1>{{allBrands}}</h1>\r\n                <h4>Capacity {{zoneCapacity}}</h4>\r\n            </div>\r\n\r\n            <div class=\"shelves\">\r\n                <ng-container *ngFor=\"let s of data?.shelves; let i = index\">\r\n                    @if(s.shelfType ==='tray'){\r\n                        <div [id]=\"s.shelfType + (i + 1)\" class=\"block\">\r\n                            @if(s?.products?.length){\r\n                                <div *ngFor=\"let row of s.distributedRows\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of row\" class=\"product\" [class.error]=\"targetPID === p._id\">\r\n                                        @if(p.status != 'missing'){\r\n                                            <div class=\"product-img\">\r\n                                                <img *ngIf=\"p?.productImageUrl; else placeholder\"\r\n                                                    [src]=\"p?.productImageUrl\" alt=\"Product Image\" />\r\n                                                <ng-template #placeholder>\r\n                                                    <div></div>\r\n                                                </ng-template>\r\n                                            </div>\r\n                                            <div class=\"product-details\">\r\n                                                <span class=\"badge cluster\">\r\n                                                    {{ p.productId }}\r\n                                                </span>\r\n                                                <h6 class=\"ms-1\">{{p.productName}}</h6>\r\n                                                <p class=\"ms-1\">{{p.productType}}</p>\r\n                                            </div>\r\n                                        }\r\n                                    </div>\r\n                                </div>\r\n                            }@else{\r\n                                <div *ngFor=\"let row of [].constructor(s.trayRows)\" class=\"tray mb-3\">\r\n                                    <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                                </div>\r\n                            }\r\n                        </div>\r\n                    }@else {\r\n                        <div [id]=\"s.shelfType! + (i + 1)\" class=\"block shelf\">\r\n                            @if(s?.products?.length){\r\n                                <div *ngFor=\"let p of s.products\" class=\"product\"\r\n                                    [class.error]=\"targetPID === p._id\">\r\n\r\n                                    @if(p.status != 'missing'){\r\n                                        <div class=\"product-img\">\r\n                                            <img *ngIf=\"p?.productImageUrl; else placeholder\" [src]=\"p?.productImageUrl\"\r\n                                                alt=\"Product Image\" />\r\n                                            <ng-template #placeholder>\r\n                                                <div></div>\r\n                                            </ng-template>\r\n                                        </div>\r\n                                        <div class=\"product-details\">\r\n                                            <span class=\"badge cluster\">\r\n                                                {{ p.productId }}\r\n                                            </span>\r\n                                            <h6 class=\"ms-1\">{{p.productName}}</h6>\r\n                                            <p class=\"ms-1\">{{p.productType}}</p>\r\n                                        </div>\r\n                                    }\r\n                                </div>\r\n                            }@else {\r\n                                <div *ngFor=\"let p of [].constructor(s.productPerShelf)\" class=\"product\"></div>\r\n                            }\r\n                        </div>\r\n                    }\r\n                </ng-container>\r\n\r\n            </div>\r\n        </div>\r\n    </div>\r\n</section>","import { NgModule } from \"@angular/core\";\r\nimport { LayoutBuilderComponent } from \"./components/layout-builder/layout-builder.component\";\r\nimport { CreateLayoutComponent } from \"./components/create-layout/create-layout.component\";\r\nimport { LayoutSummaryComponent } from \"./components/layout-summary/layout-summary.component\";\r\nimport { TangoStoreBuilderRoutingModule } from \"./tango-store-builder-routing.module\";\r\nimport { StoreLayoutTableComponent } from \"./components/store-layout-table/store-layout-table.component\";\r\nimport { CommonSharedModule } from \"tango-app-ui-shared\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { ReactiveSelectComponent } from \"./components/reactive-select/reactive-select.component\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { CustomSelectComponent } from \"./components/custom-select/custom-select.component\";\r\nimport { StoreOffcanvasComponentComponent } from \"./components/store-offcanvas-component/store-offcanvas-component.component\";\r\nimport { AddFloorComponent } from \"./components/create-layout/popups/add-floor/add-floor.component\";\r\nimport { ClearAllStepsComponent } from \"./components/create-layout/popups/clear-all-steps/clear-all-steps.component\";\r\nimport { DeleteLayoutComponent } from \"./components/create-layout/popups/delete-layout/delete-layout.component\";\r\nimport { CompleteLayoutComponent } from \"./components/layout-summary/popups/complete-layout/complete-layout.component\";\r\nimport {\r\n  NgbAccordionModule,\r\n  NgbDropdownModule,\r\n  NgbTooltipModule,\r\n  NgbOffcanvasModule,\r\n} from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { StoreBuilderComponent } from \"./components/store-builder/store-builder.component\";\r\nimport { CreateStoreComponent } from \"./components/create-store/create-store.component\";\r\nimport { LayoutElementsComponent } from \"./components/layout-elements/layout-elements.component\";\r\nimport { ElementFormComponent } from \"./components/layout-elements/element-form/element-form.component\";\r\nimport { VisualizeVmDataComponent } from \"./components/visualize-vm-data/visualize-vm-data.component\";\r\nimport { ManageStorePlanoComponent } from \"./components/manage-store-plano/manage-store-plano.component\";\r\nimport { FixtureTemplateComponent } from \"./components/fixture-template/fixture-template.component\";\r\nimport { FixtureTemplateTableComponent } from \"./components/fixture-template-table/fixture-template-table.component\";\r\nimport { TemplateVmsComponent } from \"./components/fixture-template/template-vms/template-vms.component\";\r\nimport { TemplateSummaryComponent } from \"./components/fixture-template/template-summary/template-summary.component\";\r\nimport { PlanoLibraryComponent } from \"./components/plano-library/plano-library.component\";\r\nimport { FixtureLibraryComponent } from \"./components/plano-library/fixture-library/fixture-library.component\";\r\nimport { VmLibraryComponent } from \"./components/plano-library/vm-library/vm-library.component\";\r\nimport { ProductLibraryComponent } from \"./components/plano-library/product-library/product-library.component\";\r\nimport { CreateProductComponent } from \"./components/create-product/create-product.component\";\r\nimport { PlanoConfigurationsComponent } from \"./components/plano-configurations/plano-configurations.component\";\r\nimport { FixtureBulkUploadComponent } from \"./components/plano-library/fixture-library/popups/fixture-bulk-upload/fixture-bulk-upload.component\";\r\nimport { CreateFixtureModalComponent } from \"./components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component\";\r\nimport { BulkUploadFixtureTemplateComponent } from \"./components/fixture-template-table/popups/bulk-upload-fixture-template/bulk-upload-fixture-template.component\";\r\nimport { CreateFixtureTemplateComponent } from \"./components/fixture-template-table/popups/create-fixture-template/create-fixture-template.component\";\r\nimport { BulkUploadPlanogramComponent } from \"./components/manage-plano/popups/bulk-upload-planogram/bulk-upload-planogram.component\";\r\nimport { TimeAgoPipe } from \"./pipes/time-ago.pipe\";\r\nimport { AddVmTypeComponent } from \"./components/create-vm/popups/add-vm-type/add-vm-type.component\";\r\nimport { VMBulkUploadComponent } from \"./components/plano-library/vm-library/popups/vm-bulk-upload/vm-bulk-upload.component\";\r\nimport { DndModule } from \"ngx-drag-drop\";\r\nimport { CustomFilterComponent } from \"./components/plano-configurations/custom-filter/custom-filter.component\";\r\nimport { PopupsComponent } from \"./components/plano-configurations/popups/popups.component\";\r\nimport { ManageStorePlanoFeedbackComponent } from \"./components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component\";\r\nimport { DeleteConfirmationComponent } from \"./components/popups/delete-confirmation/delete-confirmation.component\";\r\nimport { CompleteConfirmationComponent } from \"./components/popups/complete-confirmation/complete-confirmation.component\";\r\nimport { ExitConfirmationComponent } from \"./components/popups/exit-confirmation/exit-confirmation.component\";\r\nimport { RevokeConfirmationComponent } from \"./components/popups/revoke-confirmation/revoke-confirmation.component\";\r\nimport { InstanceBasicDetailsComponent } from \"./components/manage-store-plano/template-basic-details/template-basic-details.component\";\r\nimport { InstanceProductsComponent } from \"./components/manage-store-plano/template-products/template-products.component\";\r\nimport { InstanceVmsComponent } from \"./components/manage-store-plano/template-vms/template-vms.component\";\r\nimport { PublishTaskPopupComponent } from \"./components/manage-store-plano/popups/publishtask-popup/publishtask-popup.component\";\r\nimport { CannotPerformComponent } from \"./components/popups/cannot-perform/cannot-perform.component\";\r\nimport { LayoutEditConfirmationComponent } from \"./components/popups/layout-edit-confirmation/layout-edit-confirmation.component\";\r\nimport { PlanoRolloutTableComponent } from \"./components/manage-plano/rollout-table/rollout-table.component\";\r\nimport { PlanoVerificationTableComponent } from \"./components/manage-plano/verification-table/verification-table.component\";\r\nimport { ManagePlanoComponent } from \"./components/manage-plano/manage-plano.component\";\r\nimport { PlanoRolloutComponent } from \"./components/manage-store-plano/plano-rollout/plano-rollout.component\";\r\nimport { PublishRolloutPopupComponent } from \"./components/manage-store-plano/popups/publish-rollout-popup/publish-rollout-popup.component\";\r\nimport { RolloutFeedbackComponent } from \"./components/manage-store-plano/rollout-feedback/rollout-feedback.component\";\r\nimport { TemplateAssignStoresComponent } from \"./components/fixture-template/template-assign-stores/template-assign-stores.component\";\r\nimport { PreviewModalComponent } from \"./components/fixture-template/template-assign-stores/preview-modal/preview-modal.component\";\r\nimport { FindAndReplaceComponent } from \"./components/fixture-template-table/find-and-replace/find-and-replace.component\";\r\nimport { CustomsingleSelectComponent } from \"./components/fixture-template-table/custom-select/custom-select.component\";\r\nimport { VariantPopupComponent } from \"./components/popups/variant-popup/variant-popup.component\";\r\nimport { PublishConfirmationComponent } from \"./components/popups/publish-confirmation/publish-confirmation.component\";\r\nimport { TemplateTreeComponent } from \"./components/fixture-template-tree/fixture-template-tree.component\";\r\nimport { StorePlanoTreeViewComponent } from \"./components/store-plano/store-plano-tree-view/store-plano-tree-view.component\";\r\nimport { StoreTaskRevokeComponent } from \"./components/manage-store-plano/popups/store-task-revoke/store-task-revoke.component\";\r\nimport { PlanoMigrateComponent } from \"./components/plano-tools/plano-migrate/plano-migrate.component\";\r\nimport { PlanoTableComponent } from \"./components/planogram/plano-table/plano-table.component\";\r\nimport { ToolsParentComponent } from \"./components/plano-tools/tools-parent/tools-parent.component\";\r\nimport { ToolPageHeaderComponent } from \"./components/plano-tools/tool-page-header/tool-page-header.component\";\r\nimport { MerchComplianceComponent } from \"./components/planogram/merch-compliance/merch-compliance.component\";\r\nimport { FixtureProductsComponent } from \"./components/planogram/merch-compliance/fixture-products/fixture-products.component\";\r\nimport { ZoneProductsComponent } from \"./components/planogram/merch-compliance/zone-products/zone-products.component\";\r\nimport { PlanoDetailsParentComponent } from \"./components/planogram/plano-details-parent/plano-details-parent.component\";\r\nimport { PlanoOverviewComponent } from \"./components/planogram/plano-overview/plano-overview.component\";\r\nimport { FixtureOverviewComponent } from \"./components/planogram/plano-overview/fixture-overview/fixture-overview.component\";\r\nimport { PlanoFilterComponent } from \"./components/planogram/plano-table/plano-filter/plano-filter.component\";\r\nimport { VerificationFeedbackComponent } from \"./components/manage-store-plano/verification-feedback/verification-feedback.component\";\r\nimport { FixtureComponent } from \"./components/manage-store-plano/verification-feedback/fixture/fixture.component\";\r\nimport { ActionConfirmPopupComponent } from \"./components/manage-store-plano/verification-feedback/action-confirm-popup/action-confirm-popup.component\";\r\nimport { FixtureOverviewPanelComponent } from \"./components/fixture-overview-panel/fixture-overview-panel.component\";\r\nimport { PlanoComparisonComponent } from \"./components/planogram/plano-overview/plano-comparison/plano-comparison.component\";\r\nimport { EditableFixtureComponent } from \"./components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component\";\r\nimport { ZoneVerificationFeedbackComponent } from \"./components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component\";\r\nimport { TemplateDetailsComponent } from \"./components/fixture-template/template-details/template-details.component\";\r\nimport { FindReplaceTableComponent } from \"./components/collection-update-ai/find-replace-table/find-replace-table.component\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { MatAutocompleteModule } from \"@angular/material/autocomplete\";\r\nimport { ProductLocatorComponent } from \"./components/planogram/merch-compliance/product-locator/product-locator.component\";\r\nimport { MisplacedProductFixtureComponent } from \"./components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component\";\r\nimport { ProductZoneLocatorComponent } from \"./components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component\";\r\nimport { PlanoAnalyticsComponent } from \"./components/planogram/plano-analytics/plano-analytics.component\";\r\nimport { DateRangePickerComponent } from \"./components/planogram/plano-analytics/date-range-picker/date-range-picker.component\";\r\nimport { NgxDaterangepickerMd } from \"ngx-daterangepicker-material\";\r\nimport { FixtureAnalyticsComponent } from \"./components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component\";\r\nimport { AnalyticsPopupComponent } from \"./components/planogram/plano-analytics/analytics-popup/analytics-popup.component\";\r\nimport { ZoneAnalyticsComponent } from \"./components/planogram/plano-analytics/zone-analytics/zone-analytics.component\";\r\nimport { PlanoOnboardTableComponent } from \"./components/manage-plano/onboard-table/onboard-table.component\";\r\nimport { OnboardStorePlanoComponent } from \"./components/onboard-store-plano/onboard-store-plano.component\";\r\nimport { OnboardFixtureComponent } from \"./components/onboard-store-plano/onboard-fixture/onboard-fixture.component\";\r\nimport { IvmLogicExplorerComponent } from \"./components/ivm-logic-explorer/ivm-logic-explorer.component\";\r\nimport { ConfirmationPopupComponent } from \"./components/manage-store-plano/popups/confirmation-popup/confirmation-popup.component\";\r\nimport { ScheduleTaskPopupComponent } from \"./components/manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component\";\r\nimport { DatePickerComponent } from \"./components/date-picker/date-picker.component\";\r\nimport { StoreSelectComponent } from \"./components/collection-update-ai/components/store-select/store-select.component\";\r\nimport { CadRenderComponent } from \"./components/plano-tools/cad-render/cad-render.component\";\r\nimport { AllowEditComponent } from \"./components/plano-tools/allow-edit/allow-edit.component\";\r\nimport { DeleteTaskComponent } from \"./components/plano-tools/delete-task/delete-task.component\";\r\nimport { DeleteFloorComponent } from \"./components/plano-tools/delete-floor/delete-floor.component\";\r\nimport { UpdateFixtureTypeComponent } from \"./components/plano-tools/update-fixture-type/update-fixture-type.component\";\r\nimport { PlanoDataExportComponent } from \"./components/plano-tools/plano-data-export/plano-data-export.component\";\r\nimport { StoreExportsComponent } from \"./components/plano-tools/store-exports/store-exports.component\";\r\nimport { ModifyFixtureNumbersComponent } from \"./components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component\";\r\nimport { FixtureConformanceComponent } from \"./components/plano-tools/fixture-conformance/fixture-conformance.component\";\r\nimport { SwapTemplateComponent } from \"./components/plano-tools/swap-template/swap-template.component\";\r\nimport { MoveBucketComponent } from \"./components/plano-tools/move-bucket/move-bucket.component\";\r\nimport { CadFilesComponent } from \"./components/plano-tools/cad-files/cad-files.component\";\r\nimport { LayoutTouchupComponent } from \"./components/plano-tools/layout-touchup/layout-touchup.component\";\r\nimport { TouchupEditorComponent } from \"./components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component\";\r\nimport { FixturePreviewComponent } from \"./components/fixture-preview/fixture-preview.component\";\r\nimport { PublishPlanoModalComponent } from \"./components/popups/publish-plano-modal/publish-plano-modal.component\";\r\nimport { SetCurrentPlanoModalComponent } from \"./components/popups/set-current-plano-modal/set-current-plano-modal.component\";\r\nimport { EditRevisionNameModalComponent } from \"./components/popups/edit-revision-name-modal/edit-revision-name-modal.component\";\r\nimport { ZoneEditableFixtureComponent } from \"./components/manage-store-plano/verification-feedback/zone-editable-fixture/zone-editable-fixture.component\";\r\nimport { MultiselectChipDropdownComponent } from \"./components/multiselect-chip-dropdown/multiselect-chip-dropdown.component\";\r\nimport { LookPlanoCollectionComponent } from \"./components/look-plano-collection/look-plano-collection.component\";\r\nimport { LookPlanoCollectionFormComponent } from \"./components/look-plano-collection-form/look-plano-collection-form.component\";\r\nimport { AccessDeniedComponent } from \"./components/access-denied/access-denied.component\";\r\nimport { TemplateProductsComponent } from \"./components/fixture-template/template-products/template-products.component\";\r\nimport { SearchableSelectComponent } from \"./components/searchable-select/searchable-select.component\";\r\nimport { ChipsInputComponent } from \"./components/chips-input/chips-input.component\";\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    LayoutBuilderComponent,\r\n    CreateLayoutComponent,\r\n    LayoutSummaryComponent,\r\n    StoreLayoutTableComponent,\r\n    CustomSelectComponent,\r\n    StoreOffcanvasComponentComponent,\r\n    AddFloorComponent,\r\n    ClearAllStepsComponent,\r\n    DeleteLayoutComponent,\r\n    CompleteLayoutComponent,\r\n    StoreBuilderComponent,\r\n    CreateStoreComponent,\r\n    LayoutElementsComponent,\r\n    ElementFormComponent,\r\n    VisualizeVmDataComponent,\r\n    ManageStorePlanoComponent,\r\n    OnboardStorePlanoComponent,\r\n    FixtureTemplateComponent,\r\n    FixtureTemplateTableComponent,\r\n    TemplateVmsComponent,\r\n    TemplateSummaryComponent,\r\n    PlanoLibraryComponent,\r\n    FixtureLibraryComponent,\r\n    VmLibraryComponent,\r\n    ProductLibraryComponent,\r\n    CreateProductComponent,\r\n    PlanoConfigurationsComponent,\r\n    FixtureBulkUploadComponent,\r\n    CreateFixtureModalComponent,\r\n    BulkUploadFixtureTemplateComponent,\r\n    CreateFixtureTemplateComponent,\r\n    BulkUploadPlanogramComponent,\r\n    AddVmTypeComponent,\r\n    VMBulkUploadComponent,\r\n    CustomFilterComponent,\r\n    PopupsComponent,\r\n    ManageStorePlanoFeedbackComponent,\r\n    ConfirmationPopupComponent,\r\n    PublishTaskPopupComponent,\r\n    DeleteConfirmationComponent,\r\n    CompleteConfirmationComponent,\r\n    ExitConfirmationComponent,\r\n    RevokeConfirmationComponent,\r\n    CannotPerformComponent,\r\n    LayoutEditConfirmationComponent,\r\n    PlanoRolloutTableComponent,\r\n    PlanoVerificationTableComponent,\r\n    PlanoOnboardTableComponent,\r\n    ManagePlanoComponent,\r\n    PlanoRolloutComponent,\r\n    PublishRolloutPopupComponent,\r\n    RolloutFeedbackComponent,\r\n    VerificationFeedbackComponent,\r\n    ZoneVerificationFeedbackComponent,\r\n    ZoneEditableFixtureComponent,\r\n    ActionConfirmPopupComponent,\r\n    TemplateAssignStoresComponent,\r\n    PreviewModalComponent,\r\n    FindAndReplaceComponent,\r\n    CustomsingleSelectComponent,\r\n    VariantPopupComponent,\r\n    PublishConfirmationComponent,\r\n    StoreTaskRevokeComponent,\r\n    PlanoMigrateComponent,\r\n    CadRenderComponent,\r\n    AllowEditComponent,\r\n    DeleteTaskComponent,\r\n    DeleteFloorComponent,\r\n    UpdateFixtureTypeComponent,\r\n    ModifyFixtureNumbersComponent,\r\n    FixtureConformanceComponent,\r\n    SwapTemplateComponent,\r\n    MoveBucketComponent,\r\n    CadFilesComponent,\r\n    LayoutTouchupComponent,\r\n    TouchupEditorComponent,\r\n    PlanoDataExportComponent,\r\n    StoreExportsComponent,\r\n    FixtureProductsComponent,\r\n    ZoneProductsComponent,\r\n    ZoneAnalyticsComponent,\r\n    ToolsParentComponent,\r\n    ToolPageHeaderComponent,\r\n    PlanoTableComponent,\r\n    PlanoDetailsParentComponent,\r\n    MerchComplianceComponent,\r\n    PlanoOverviewComponent,\r\n    FixtureOverviewComponent,\r\n    TemplateDetailsComponent,\r\n    ProductLocatorComponent,\r\n    MisplacedProductFixtureComponent,\r\n    ProductZoneLocatorComponent,\r\n    PlanoAnalyticsComponent,\r\n    DateRangePickerComponent,\r\n    FixtureAnalyticsComponent,\r\n    AnalyticsPopupComponent,\r\n    LookPlanoCollectionComponent,\r\n    LookPlanoCollectionFormComponent,\r\n    AccessDeniedComponent,\r\n  ],\r\n  // Note: SearchableSelectComponent is standalone, added below in `imports`.\r\n  imports: [\r\n    TangoStoreBuilderRoutingModule,\r\n    ReactiveSelectComponent,\r\n    CommonModule,\r\n    FormsModule,\r\n    CommonSharedModule,\r\n    ReactiveFormsModule,\r\n    DragDropModule,\r\n    NgbTooltipModule,\r\n    NgbAccordionModule,\r\n    TimeAgoPipe,\r\n    DndModule,\r\n    InstanceBasicDetailsComponent,\r\n    InstanceProductsComponent,\r\n    InstanceVmsComponent,\r\n    TemplateTreeComponent,\r\n    StorePlanoTreeViewComponent,\r\n    PlanoFilterComponent,\r\n    FixtureComponent,\r\n    MultiselectChipDropdownComponent,\r\n    NgbOffcanvasModule,\r\n    PlanoComparisonComponent,\r\n    FixtureOverviewPanelComponent,\r\n    EditableFixtureComponent,\r\n    FindReplaceTableComponent,\r\n    RouterModule,\r\n    // FileUploadComponent\r\n    MatAutocompleteModule,\r\n    NgxDaterangepickerMd,\r\n    OnboardFixtureComponent,\r\n    IvmLogicExplorerComponent,\r\n    ScheduleTaskPopupComponent,\r\n    DatePickerComponent,\r\n    FixturePreviewComponent,\r\n    StoreSelectComponent,\r\n    NgbDropdownModule,\r\n    PublishPlanoModalComponent,\r\n    SetCurrentPlanoModalComponent,\r\n    EditRevisionNameModalComponent,\r\n    TemplateProductsComponent,\r\n    SearchableSelectComponent,\r\n    ChipsInputComponent,\r\n],\r\n  exports: [\r\n  ],\r\n})\r\nexport class TangoStoreBuilderModule {}\r\n","import {\r\n  AfterViewInit,\r\n  Component,\r\n  ElementRef,\r\n  OnInit,\r\n  ViewChild,\r\n  OnDestroy,\r\n  HostListener,\r\n  ChangeDetectorRef,\r\n} from \"@angular/core\";\r\nimport { StoreBuilderService } from \"../../services/store-builder.service\";\r\nimport { Subject, takeUntil } from \"rxjs\";\r\nimport { FormControl } from \"@angular/forms\";\r\n\r\nimport * as fabric from \"fabric\";\r\nimport { GlobalStateService, PageInfoService } from \"tango-app-ui-global\";\r\nimport { DatePipe, TitleCasePipe } from \"@angular/common\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { NgbModal } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { ToastService } from \"tango-app-ui-shared\";\r\nimport { SetCurrentPlanoModalComponent } from \"../popups/set-current-plano-modal/set-current-plano-modal.component\";\r\nimport { EditRevisionNameModalComponent } from \"../popups/edit-revision-name-modal/edit-revision-name-modal.component\";\r\nimport { getFixtureCanvasLabel, getFixtureProductCapacity } from \"../../functions/plano.function\";\r\n\r\n@Component({\r\n  selector: \"app-store-plano\",\r\n  templateUrl: \"./store-plano.component.html\",\r\n  styleUrl: \"./store-plano.component.scss\",\r\n  providers: [TitleCasePipe, DatePipe],\r\n})\r\nexport class StorePlanoComponent implements OnInit, AfterViewInit, OnDestroy {\r\n  @ViewChild(\"baseCanvas\", { static: false })\r\n  canvasEl!: ElementRef<HTMLCanvasElement>;\r\n\r\n  @ViewChild(\"canvasContainer\") containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n  @HostListener(\"window:resize\")\r\n  onResize(): void {\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n    }, 300);\r\n  }\r\n  canvas!: fabric.Canvas;\r\n\r\n  clientId: string;\r\n\r\n  planoData: any;\r\n  floorData: any;\r\n\r\n  selectedFloorId = new FormControl(\"\");\r\n\r\n  cdnUrl: string;\r\n  storeMetrics = {\r\n    floorCount: 0,\r\n    fixtureCount: 0,\r\n    vmCount: 0,\r\n  };\r\n  zoomLevel: number = 1;\r\n  fixtureHeight = this.toPixels(1524, \"mm\");\r\n  fixtureWidth = this.toPixels(1220, \"mm\");\r\n  wallThickness = 30;\r\n  verticalMargin = (1.25 / 100) * this.fixtureHeight;\r\n\r\n  isPageLoading: boolean = true;\r\n  taskInfo: any;\r\n  selectedFixture: any;\r\n  selectedFixtureData: any;\r\n  editFixtureSection: \"basic-details\" | \"products\" | \"vms\" = \"basic-details\";\r\n  editFixture: boolean = false;\r\n  taskStyle = {\r\n    layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n  };\r\n\r\n  selectedView: \"tree\" | \"detail\" = \"detail\";\r\n  allFixtures: any[] = []; // used to render tree view.\r\n\r\n  storeId: string;\r\n  clientName: string;\r\n  enableCompare: boolean = false;\r\n  revisionPlanoList: any = [];\r\n  revisionSelectItems: any[] = [];\r\n  latestFloorData: any;\r\n  previousFloorData: any;\r\n  previousRenderKey: boolean = false;\r\n  latestRenderKey: boolean = false;\r\n  currentSelect: number;\r\n  previousSelect: number;\r\n  // vmList: any = [];\r\n\r\n  private readonly destroy$ = new Subject<void>();\r\n\r\n  constructor(\r\n    private apiService: StoreBuilderService,\r\n    private gs: GlobalStateService,\r\n    private titleCase: TitleCasePipe,\r\n    private datePipe: DatePipe,\r\n    private route: ActivatedRoute,\r\n    private toast: ToastService,\r\n    private pageInfo: PageInfoService,\r\n    private cd: ChangeDetectorRef,\r\n    private modalService: NgbModal,\r\n  ) {\r\n    this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((e) => {\r\n      if (e) this.cdnUrl = e.planogramCDN;\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe({\r\n      next: (data: any) => {\r\n        if (data) {\r\n          this.clientId = data?.client;\r\n          this.storeId = data?.store;\r\n          this.clientName = data.clientName;\r\n          this.setPageData(this.clientName, this.storeId);\r\n          this.getStoreFixtures(this.storeId);\r\n          // this.getVmsList();\r\n        }\r\n      },\r\n    });\r\n  }\r\n\r\n  setPageData(clientName: string, storeId: string) {\r\n    this.pageInfo.setTitle(\"Plano\");\r\n    this.pageInfo.setDescription(\r\n      \"View and share store planogram in detail and tree view\",\r\n    );\r\n    let breadcrumbs: any[] = [];\r\n    const commonBreadcrumbs = [\r\n      {\r\n        title: clientName,\r\n        path: \"/manage/stores\",\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: clientName,\r\n        path: \"/manage/stores\",\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n      {\r\n        title: storeId,\r\n        path: `/manage/stores/cameras?storeId=${storeId}`,\r\n        isActive: false,\r\n        isSeparator: false,\r\n      },\r\n      {\r\n        title: storeId,\r\n        path: `/manage/stores/cameras?storeId=${storeId}`,\r\n        isActive: false,\r\n        isSeparator: true,\r\n      },\r\n    ];\r\n\r\n    if (this.gs.userAccess.value?.userType === \"tango\") {\r\n      breadcrumbs = [\r\n        {\r\n          title: \"Manage\",\r\n          path: \"/manage/brands\",\r\n          isActive: false,\r\n          isSeparator: false,\r\n        },\r\n        {\r\n          title: \"Manage\",\r\n          path: \"/manage/brands\",\r\n          isActive: false,\r\n          isSeparator: true,\r\n        },\r\n        ...commonBreadcrumbs,\r\n      ];\r\n    } else if (this.gs.userAccess.value?.userType === \"client\") {\r\n      breadcrumbs = [\r\n        {\r\n          title: \"Manage\",\r\n          path: \"/manage/summary\",\r\n          isActive: false,\r\n          isSeparator: false,\r\n        },\r\n        {\r\n          title: \"Manage\",\r\n          path: \"/manage/summary\",\r\n          isActive: false,\r\n          isSeparator: true,\r\n        },\r\n        ...commonBreadcrumbs,\r\n      ];\r\n    }\r\n\r\n    this.pageInfo.setBreadcrumbs(breadcrumbs);\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.canvas = new fabric.Canvas(this.canvasEl?.nativeElement, {\r\n      selection: true,\r\n      selectionFullyContained: true,\r\n      perPixelTargetFind: true,\r\n      targetFindTolerance: 5,\r\n      width: 1000,\r\n      height: 700,\r\n    });\r\n\r\n    this.setupZoomHandlers();\r\n\r\n    const storeId = this.route.snapshot.queryParams[\"storeId\"];\r\n\r\n    if (storeId) {\r\n      // this.getStoreFixtures(storeId);\r\n\r\n      this.selectedFloorId.valueChanges.subscribe((id) => {\r\n        this.floorData = this.planoData?.floors?.find(\r\n          (floor: any) => floor._id === id,\r\n        );\r\n        this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n        this.renderFloor();\r\n      });\r\n    }\r\n  }\r\n\r\n  getStoreFixtures(storeId: string) {\r\n    this.planoData = null;\r\n    this.floorData = null;\r\n    this.isPageLoading = true;\r\n    this.apiService\r\n      .getStoreFixtures({ id: [storeId], treeView: true })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (!res?.data?.[0]?.floors?.length) {\r\n            this.isPageLoading = false;\r\n            return;\r\n          }\r\n\r\n          this.planoData = res.data[0];\r\n          this.floorData = res.data[0].floors[0];\r\n\r\n          this.extractAllFixtures(this.floorData);\r\n\r\n          this.taskDetails(this.floorData.planoId, this.floorData._id);\r\n          this.selectedFloorId.setValue(this.floorData._id, {\r\n            emitEvent: false,\r\n          });\r\n          this.storeMetrics.floorCount = this.planoData?.floors?.length;\r\n\r\n          this.renderFloor();\r\n\r\n          this.isPageLoading = false;\r\n        },\r\n        error: (err: any) => {\r\n          this.isPageLoading = false;\r\n        },\r\n      });\r\n  }\r\n\r\n  extractAllFixtures(floorData: any) {\r\n    const extractedFixture = [\r\n      ...(floorData?.masterTemplates ?? []),\r\n      ...(floorData?.centerFixture ?? []),\r\n    ];\r\n\r\n    floorData?.layoutPolygon?.forEach((lp: any) => {\r\n      extractedFixture.push(...(lp.fixtures ?? []));\r\n    });\r\n\r\n    this.allFixtures = extractedFixture;\r\n  }\r\n\r\n  setupZoomHandlers(): void {\r\n    this.canvas.on(\"mouse:wheel\", (opt: fabric.TEvent<WheelEvent>) => {\r\n      const e = opt.e;\r\n\r\n      if (e.ctrlKey || e.metaKey) {\r\n        const delta = e.deltaY;\r\n        let zoom = this.canvas.getZoom();\r\n        zoom *= 0.995 ** delta;\r\n\r\n        zoom = Math.max(0.05, Math.min(zoom, 5));\r\n\r\n        this.canvas.zoomToPoint(\r\n          {\r\n            x: e.offsetX,\r\n            y: e.offsetY,\r\n          } as fabric.Point,\r\n          zoom,\r\n        );\r\n\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n      }\r\n    });\r\n\r\n    let isDragging = false;\r\n    let lastPosX = 0;\r\n    let lastPosY = 0;\r\n\r\n    this.canvas.on(\"mouse:down\", (opt: any) => {\r\n      if (!opt.target) {\r\n        isDragging = true;\r\n        this.canvas.selection = false;\r\n        const e = opt.e;\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:move\", (opt: any) => {\r\n      if (isDragging && this.canvas.viewportTransform) {\r\n        const e = opt.e;\r\n        const vpt = this.canvas.viewportTransform;\r\n        vpt[4] += e.clientX - lastPosX;\r\n        vpt[5] += e.clientY - lastPosY;\r\n        this.canvas.requestRenderAll();\r\n        lastPosX = e.clientX;\r\n        lastPosY = e.clientY;\r\n      }\r\n    });\r\n\r\n    this.canvas.on(\"mouse:up\", () => {\r\n      isDragging = false;\r\n      this.canvas.selection = true;\r\n    });\r\n  }\r\n\r\n  resizeCanvas(): void {\r\n    const container = this.containerRef.nativeElement;\r\n    this.canvas.setDimensions({\r\n      width: container.clientWidth - 50,\r\n\r\n      height: container.clientHeight - 40,\r\n    });\r\n    this.canvas.requestRenderAll();\r\n  }\r\n\r\n  private fitCanvasToLayoutAnimated(duration = 300) {\r\n    if (!this.canvas) return;\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n    if (!bounds.width || !bounds.height) return;\r\n\r\n    const canvasW = this.canvas.getWidth();\r\n    const canvasH = this.canvas.getHeight();\r\n\r\n    // Compute zoom to fit\r\n    const scaleX = canvasW / bounds.width;\r\n    const scaleY = canvasH / bounds.height;\r\n    const targetZoom = Math.min(scaleX, scaleY);\r\n\r\n    const targetVpt = [\r\n      ...(this.canvas.viewportTransform || [1, 0, 0, 1, 0, 0]),\r\n    ] as fabric.TMat2D;\r\n\r\n    targetVpt[0] = targetZoom; // scaleX\r\n    targetVpt[3] = targetZoom; // scaleY\r\n\r\n    // Center X\r\n    targetVpt[4] = canvasW / 2 - (bounds.left + bounds.width / 2) * targetZoom;\r\n\r\n    // ----- FIXED: keep layout slightly up without stacking -----\r\n    const centeredY =\r\n      canvasH / 2 - (bounds.top + bounds.height / 2) * targetZoom;\r\n\r\n    const scaledHeight = bounds.height * targetZoom;\r\n    const emptySpaceY = canvasH - scaledHeight;\r\n\r\n    const shiftUp = emptySpaceY > 0 ? emptySpaceY * 0.25 : 0;\r\n\r\n    targetVpt[5] = centeredY - shiftUp;\r\n\r\n    // Animate\r\n    const startVpt = [...this.canvas.viewportTransform!] as fabric.TMat2D;\r\n\r\n    fabric.util.animate({\r\n      startValue: 0,\r\n      endValue: 1,\r\n      duration,\r\n      easing: fabric.util.ease.easeOutCubic,\r\n      onChange: (value: number) => {\r\n        const vpt = this.canvas.viewportTransform!;\r\n\r\n        vpt[0] = startVpt[0] + (targetVpt[0] - startVpt[0]) * value;\r\n        vpt[3] = startVpt[3] + (targetVpt[3] - startVpt[3]) * value;\r\n        vpt[4] = startVpt[4] + (targetVpt[4] - startVpt[4]) * value;\r\n        vpt[5] = startVpt[5] + (targetVpt[5] - startVpt[5]) * value;\r\n\r\n        this.canvas.requestRenderAll();\r\n      },\r\n    });\r\n  }\r\n\r\n  renderFloor() {\r\n    this.storeMetrics.fixtureCount = this.floorData.fixtureCount;\r\n    this.storeMetrics.vmCount = this.floorData.vmCount;\r\n    this.drawInitialContent();\r\n  }\r\n\r\n  async drawInitialContent(): Promise<void> {\r\n    this.canvas?.clear();\r\n    await this.drawLayoutElements();\r\n    setTimeout(() => {\r\n      this.resizeCanvas();\r\n      this.fitCanvasToLayoutAnimated();\r\n    }, 300);\r\n  }\r\n\r\n  async drawLayoutElements() {\r\n    for (let index = 0; index < this.floorData.layoutPolygon.length; index++) {\r\n      const element = this.floorData.layoutPolygon[index];\r\n\r\n      let wall;\r\n\r\n      element.relativePosition ??= {\r\n        x: 0,\r\n        y: 0,\r\n        unit: \"ft\",\r\n      };\r\n\r\n      const x = this.toPixels(element.relativePosition.x, element.unit);\r\n      const y = this.toPixels(element.relativePosition.y, element.unit);\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const height = this.wallThickness;\r\n        const width = this.toPixels(element.distance, element.unit);\r\n        wall = this.drawWall(this.canvas, x, y, height, width, element);\r\n      } else if (element.elementType === \"entrance\") {\r\n        const arrowWidth = 80;\r\n        const arrowHeight = 75;\r\n        const arrowBase = 40;\r\n        this.drawEntrance(\r\n          this.canvas,\r\n          x,\r\n          y,\r\n          arrowWidth,\r\n          arrowHeight,\r\n          arrowBase,\r\n          element,\r\n        );\r\n      }\r\n\r\n      if (element.elementType === \"wall\") {\r\n        const fixtureGroups: fabric.Group[] = [];\r\n        for (let j = 0; j < element?.fixtures?.length; j++) {\r\n          const fixture = element.fixtures[j];\r\n          const x = this.toPixels(\r\n            fixture.relativePosition.x,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const y = this.toPixels(\r\n            fixture.relativePosition.y,\r\n            fixture.relativePosition.unit,\r\n          );\r\n          const fixtureHeight = this.toPixels(\r\n            fixture.fixtureStaticLength.value,\r\n            fixture.fixtureStaticLength.unit,\r\n          );\r\n          const fixtureWidth = this.toPixels(\r\n            fixture.fixtureStaticWidth.value,\r\n            fixture.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          const fixtureObj = await this.drawFixture(\r\n            this.canvas,\r\n            x,\r\n            y,\r\n            fixtureHeight,\r\n            fixtureWidth,\r\n            fixture,\r\n          );\r\n          fixtureGroups.push(fixtureObj as fabric.Group);\r\n        }\r\n\r\n        if (element.isLocked && wall) {\r\n          this.canvas.remove(wall);\r\n          fixtureGroups.forEach((f) => this.canvas.remove(f));\r\n\r\n          const combinedGroup = new fabric.Group([wall, ...fixtureGroups], {\r\n            hasControls: true,\r\n            selectable: true,\r\n            subTargetCheck: true,\r\n          });\r\n\r\n          combinedGroup.set({ isLocked: true });\r\n          this.canvas.add(combinedGroup);\r\n        }\r\n\r\n        for (let j = 0; j < element?.otherElements?.length; j++) {\r\n          const otherElement = element.otherElements[j];\r\n          const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n          const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n          const h = this.toPixels(\r\n            otherElement.fixtureStaticLength.value,\r\n            otherElement.fixtureStaticLength.unit,\r\n          );\r\n          const w = this.toPixels(\r\n            otherElement.fixtureStaticWidth.value,\r\n            otherElement.fixtureStaticWidth.unit,\r\n          );\r\n\r\n          this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n        }\r\n      }\r\n    }\r\n\r\n    for (let i = 0; i < this.floorData?.centerFixture?.length; i++) {\r\n      const fixture = this.floorData.centerFixture[i];\r\n      const x = this.toPixels(\r\n        fixture.relativePosition.x,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const y = this.toPixels(\r\n        fixture.relativePosition.y,\r\n        fixture.relativePosition.unit,\r\n      );\r\n      const fixtureHeight = this.toPixels(\r\n        fixture.fixtureStaticLength.value,\r\n        fixture.fixtureStaticLength.unit,\r\n      );\r\n      const fixtureWidth = this.toPixels(\r\n        fixture.fixtureStaticWidth.value,\r\n        fixture.fixtureStaticWidth.unit,\r\n      );\r\n      await this.drawFixture(\r\n        this.canvas,\r\n        x,\r\n        y,\r\n        fixtureHeight,\r\n        fixtureWidth,\r\n        fixture,\r\n      );\r\n    }\r\n\r\n    for (let j = 0; j < this.floorData?.otherElements?.length; j++) {\r\n      const otherElement = this.floorData.otherElements[j];\r\n      const x = this.toPixels(otherElement.relativePosition.x, \"ft\");\r\n      const y = this.toPixels(otherElement.relativePosition.y, \"ft\");\r\n      const h = this.toPixels(\r\n        otherElement.fixtureStaticLength.value,\r\n        otherElement.fixtureStaticLength.unit,\r\n      );\r\n      const w = this.toPixels(\r\n        otherElement.fixtureStaticWidth.value,\r\n        otherElement.fixtureStaticWidth.unit,\r\n      );\r\n\r\n      this.drawLabeledRectangle(this.canvas, x, y, w, h, otherElement);\r\n    }\r\n  }\r\n\r\n  drawWall(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    elementData: any,\r\n  ) {\r\n    const radius = 5;\r\n    const fillColor = \"#F6FCFF\";\r\n    const strokeColor = \"#D0D5DD\";\r\n    const labelColor = \"#009BF3\";\r\n    const text = `${this.titleCase.transform(elementData.elementType)} ${\r\n      elementData.elementNumber\r\n    }`;\r\n\r\n    const wall = new fabric.Rect({\r\n      left: 0,\r\n      top: 0,\r\n      width,\r\n      height,\r\n      rx: radius,\r\n      ry: radius,\r\n      fill: fillColor,\r\n      stroke: strokeColor,\r\n      strokeWidth: 0.27,\r\n      selectable: false,\r\n    });\r\n\r\n    const centerX = width / 2;\r\n    const centerY = height / 2;\r\n    const isVertical = height > width;\r\n\r\n    const label = new fabric.FabricText(text, {\r\n      left: centerX,\r\n      top: centerY,\r\n      fontSize: 10,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: labelColor,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      angle: isVertical ? -90 : 0,\r\n      selectable: false,\r\n    });\r\n\r\n    const arrowHead = 5;\r\n    const elements: fabric.Object[] = [wall, label];\r\n\r\n    if (isVertical) {\r\n      const textWidth = label.width || 0;\r\n      const topArrowY = 5;\r\n      const topArrowEndY = centerY - textWidth / 2 - 5;\r\n\r\n      if (topArrowEndY > topArrowY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([centerX, topArrowY, centerX, topArrowEndY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: topArrowY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 0,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"bottom\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const bottomArrowStartY = centerY + textWidth / 2 + 5;\r\n      const bottomArrowEndY = height - 5;\r\n\r\n      if (bottomArrowEndY > bottomArrowStartY + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [centerX, bottomArrowStartY, centerX, bottomArrowEndY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: centerX,\r\n            top: bottomArrowEndY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 180,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"top\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    } else {\r\n      const textWidth = label.width || 0;\r\n      const leftArrowStartX = 5;\r\n      const leftArrowEndX = centerX - textWidth / 2 - 5;\r\n\r\n      if (leftArrowEndX > leftArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line([leftArrowStartX, centerY, leftArrowEndX, centerY], {\r\n            stroke: labelColor,\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n          }),\r\n          new fabric.Triangle({\r\n            left: leftArrowStartX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: -90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n\r\n      const rightArrowStartX = centerX + textWidth / 2 + 5;\r\n      const rightArrowEndX = width - 5;\r\n\r\n      if (rightArrowEndX > rightArrowStartX + arrowHead) {\r\n        elements.push(\r\n          new fabric.Line(\r\n            [rightArrowStartX, centerY, rightArrowEndX, centerY],\r\n            {\r\n              stroke: labelColor,\r\n              strokeWidth: 1,\r\n              selectable: false,\r\n            },\r\n          ),\r\n          new fabric.Triangle({\r\n            left: rightArrowEndX,\r\n            top: centerY,\r\n            width: arrowHead,\r\n            height: arrowHead,\r\n            angle: 90,\r\n            fill: labelColor,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            selectable: false,\r\n          }),\r\n        );\r\n      }\r\n    }\r\n\r\n    const group = new fabric.Group(elements, {\r\n      left: x,\r\n      top: y,\r\n      hasControls: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockRotation: true,\r\n      selectable: false,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  drawLabeledRectangle(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    element: any,\r\n  ): fabric.Group {\r\n    const rect = new fabric.Rect({\r\n      width,\r\n      height,\r\n      rx: 2,\r\n      ry: 2,\r\n      fill: \"#DAF1FF\",\r\n      stroke: \"#6BCAFF\",\r\n      strokeWidth: 2,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    });\r\n\r\n    const text = new fabric.Textbox(element.fixtureName, {\r\n      width: width - 8,\r\n      fontSize: 14,\r\n      fontFamily: \"Inter\",\r\n      fontWeight: \"500\",\r\n      fill: \"#101828\",\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      textAlign: \"center\",\r\n      editable: false,\r\n      splitByGrapheme: true,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n\r\n    if (textBounds.height > height - 8) {\r\n      const scale = (height - 8) / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([rect, text], {\r\n      left: x,\r\n      top: y,\r\n      angle: element.relativePosition.angle,\r\n      selectable: false,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = \"others\";\r\n    group.data = element;\r\n\r\n    canvas.add(group);\r\n\r\n    return group;\r\n  }\r\n\r\n  async drawFixture(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    height: number,\r\n    width: number,\r\n    fixtureData: any,\r\n  ) {\r\n    if (fixtureData.fixtureName === \"space\") return;\r\n    const actualShelves =\r\n      fixtureData.shelfConfig?.filter((s: any) => s.shelfType != \"vmonly\") ??\r\n      [];\r\n\r\n    const radius = 5;\r\n    const mainContainer = new fabric.Rect({\r\n      left: x,\r\n      top: y,\r\n      width: width,\r\n      height: height,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const topWidth = width / 1.05;\r\n    const topHeight = (15 / 100) * height;\r\n    const topX = x + (width - topWidth) / 2;\r\n    const topY = y + this.verticalMargin;\r\n\r\n    const topContainer = new fabric.Rect({\r\n      left: topX,\r\n      top: topY,\r\n      width: topWidth,\r\n      height: topHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const innerBoxHeight = topHeight / 2;\r\n    const innerTopBox = new fabric.Path(\r\n      `M ${topX + radius} ${topY} \r\n            L ${topX + topWidth - radius} ${topY} \r\n            Q ${topX + topWidth} ${topY} ${topX + topWidth} ${topY + radius} \r\n            L ${topX + topWidth} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + innerBoxHeight} \r\n            L ${topX} ${topY + radius} \r\n            Q ${topX} ${topY} ${topX + radius} ${topY} Z`,\r\n      {\r\n        stroke: \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"transparent\",\r\n      },\r\n    );\r\n\r\n    const topText = new fabric.Textbox(\r\n      `Fixture ${\r\n        fixtureData.associatedElementFixtureNumber\r\n          ? fixtureData.associatedElementFixtureNumber +\r\n            (fixtureData.fixtureNumber\r\n              ? \" - FX-\" + fixtureData.fixtureNumber\r\n              : \"\")\r\n          : \"new\"\r\n      } - ${fixtureData.fixtureCategory} - ${fixtureData.fixtureWidth.value} ${\r\n        fixtureData.fixtureWidth.unit\r\n      }`,\r\n      {\r\n        left: topX + topWidth / 2,\r\n        top: topY + innerBoxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: topWidth,\r\n        height: innerBoxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const secondBoxY = topY + innerBoxHeight;\r\n    const innerBottomBox = new fabric.Path(\r\n      `M ${topX} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY} \r\n            L ${topX + topWidth} ${secondBoxY + innerBoxHeight - radius} \r\n            Q ${topX + topWidth} ${secondBoxY + innerBoxHeight} ${\r\n              topX + topWidth - radius\r\n            } ${secondBoxY + innerBoxHeight} \r\n            L ${topX + radius} ${secondBoxY + innerBoxHeight} \r\n            Q ${topX} ${secondBoxY + innerBoxHeight} ${topX} ${\r\n              secondBoxY + innerBoxHeight - radius\r\n            } \r\n            L ${topX} ${secondBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#009BF3\" : \"#344054\",\r\n        stroke: fixtureData.issue ? \"#51C1FF\" : \"#667085\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    let fontSize = 5;\r\n    let bottomText;\r\n\r\n    const textContent = getFixtureCanvasLabel(fixtureData);\r\n    const createBottomText = (fs: any) =>\r\n      new fabric.Textbox(textContent, {\r\n        left: topX + topWidth / 2,\r\n        top: secondBoxY + innerBoxHeight / 2,\r\n        fontSize: fs,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#FFFFFF\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: topWidth,\r\n      });\r\n    do {\r\n      bottomText = createBottomText(fontSize);\r\n      fontSize -= 0.5;\r\n    } while (bottomText.height > innerBoxHeight && fontSize > 2);\r\n\r\n    const midWidth = width / 1.05;\r\n    const midHeight = (77 / 100) * height;\r\n    const midX = x + (width - midWidth) / 2;\r\n    const midY = topY + topHeight + this.verticalMargin;\r\n\r\n    const midContainer = new fabric.Rect({\r\n      left: midX,\r\n      top: midY,\r\n      width: midWidth,\r\n      height: midHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"#51C1FF\",\r\n      strokeWidth: 0.27,\r\n      fill: \"white\",\r\n    });\r\n\r\n    const shelfCount = fixtureData.shelfConfig?.length;\r\n    const boxHeight = midHeight / (shelfCount + 2);\r\n    const firstBoxY = midY;\r\n\r\n    const firstBox = new fabric.Path(\r\n      `M ${midX + radius} ${firstBoxY} \r\n            L ${midX + midWidth - radius} ${firstBoxY} \r\n            Q ${midX + midWidth} ${firstBoxY} ${midX + midWidth} ${\r\n              firstBoxY + radius\r\n            } \r\n            L ${midX + midWidth} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + boxHeight} \r\n            L ${midX} ${firstBoxY + radius} \r\n            Q ${midX} ${firstBoxY} ${midX + radius} ${firstBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        stroke: fixtureData.issue ? \"#DAF1FF\" : \"#EAECF0\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const firstBoxText = new fabric.Textbox(\r\n      `${fixtureData?.header?.label ? fixtureData.header.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: firstBoxY + boxHeight / 2,\r\n        fontSize: 7,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: fixtureData.issue ? \"#fff\" : \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: midWidth,\r\n        height: boxHeight,\r\n        textAlign: \"center\",\r\n      },\r\n    );\r\n\r\n    const shelves = [];\r\n    const shelfHeight = midHeight - 2 * boxHeight;\r\n\r\n    if (fixtureData.productResolutionLevel === \"L1\") {\r\n      const boxY = firstBoxY + boxHeight;\r\n\r\n      const shelf = new fabric.Rect({\r\n        left: midX,\r\n        top: boxY,\r\n        width: midWidth,\r\n        height: shelfHeight,\r\n        // stroke: '#51C1FF',\r\n        stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n        strokeWidth: 0.27,\r\n        fill: \"white\",\r\n      });\r\n\r\n      const text = fixtureData?.productBrandName?.join(\" + \") || \"\";\r\n\r\n      const maxTextWidth = midWidth * 0.9;\r\n      const maxTextHeight = shelfHeight * 0.8;\r\n      let fontSizeL1 = 6;\r\n\r\n      const createWrappedTextbox = (fs: number) =>\r\n        new fabric.Textbox(text, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + shelfHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: maxTextWidth,\r\n          fontSize: fs,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          textAlign: \"center\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n      let wrappedText = createWrappedTextbox(fontSizeL1);\r\n      while (wrappedText.height > maxTextHeight && fontSizeL1 > 2) {\r\n        fontSizeL1 -= 0.5;\r\n        wrappedText = createWrappedTextbox(fontSizeL1);\r\n      }\r\n\r\n      const padding = 2;\r\n      const background = new fabric.Rect({\r\n        left: midX + midWidth / 2,\r\n        top: boxY + shelfHeight / 2,\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        width: Math.min(maxTextWidth, wrappedText.width!) + padding,\r\n        height: wrappedText.getScaledHeight() + 2,\r\n        fill: \"rgba(255, 255, 255, 0.5)\",\r\n        selectable: false,\r\n        evented: false,\r\n        rx: 1,\r\n        ry: 1,\r\n      });\r\n\r\n      shelves.push(shelf, background, wrappedText);\r\n    } else if (fixtureData.productResolutionLevel === \"L2\") {\r\n      for (let i = 0; i < shelfCount; i++) {\r\n        const boxY = firstBoxY + boxHeight * (i + 1);\r\n\r\n        const shelf = new fabric.Rect({\r\n          left: midX,\r\n          top: boxY,\r\n          width: midWidth,\r\n          height: boxHeight,\r\n          // stroke: '#51C1FF',\r\n          stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n          strokeWidth: 0.27,\r\n          fill: \"white\",\r\n        });\r\n\r\n        shelves.push(shelf);\r\n\r\n        if (fixtureData.shelfConfig?.[i].shelfType === \"tray\") {\r\n          const trayRows = fixtureData.shelfConfig?.[i].trayRows || 1;\r\n          const rowSpacing = boxHeight / trayRows;\r\n\r\n          for (let r = 1; r < trayRows; r++) {\r\n            const lineY = boxY + r * rowSpacing;\r\n\r\n            const trayLine = new fabric.Line(\r\n              [midX, lineY, midX + midWidth, lineY],\r\n              {\r\n                stroke: \"#999\",\r\n                strokeWidth: 0.2,\r\n                selectable: false,\r\n                evented: false,\r\n              },\r\n            );\r\n\r\n            shelves.push(trayLine);\r\n          }\r\n        }\r\n\r\n        const text =\r\n          fixtureData.shelfConfig?.[i].productBrandName?.join(\" + \") || \"\";\r\n\r\n        const horizontalPadding = 6;\r\n        const maxTextWidth = Math.max(0, midWidth - horizontalPadding);\r\n        const maxTextHeight = boxHeight * 0.8;\r\n        const baseFontSize = 5;\r\n\r\n        const measure = (t: string) =>\r\n          new fabric.Text(t, {\r\n            fontSize: baseFontSize,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"500\",\r\n          });\r\n\r\n        let displayText = text;\r\n        let measured = measure(displayText);\r\n\r\n        if ((measured.width ?? 0) > maxTextWidth) {\r\n          const ellipsis = \"...\";\r\n          let leftIdx = 0;\r\n          let rightIdx = text.length;\r\n\r\n          while (leftIdx < rightIdx) {\r\n            const midIdx = Math.floor((leftIdx + rightIdx) / 2);\r\n            const candidate = text.slice(0, midIdx) + ellipsis;\r\n            measured = measure(candidate);\r\n            if ((measured.width ?? 0) > maxTextWidth) {\r\n              rightIdx = midIdx;\r\n            } else {\r\n              leftIdx = midIdx + 1;\r\n            }\r\n          }\r\n          displayText = text.slice(0, Math.max(0, leftIdx - 1)) + ellipsis;\r\n          measured = measure(displayText);\r\n        }\r\n\r\n        const background = new fabric.Rect({\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          width: midWidth,\r\n          height: Math.min(maxTextHeight, measured.height ?? 10) + 2,\r\n          fill: \"rgba(255, 255, 255, 0.5)\",\r\n          selectable: false,\r\n          evented: false,\r\n          rx: 1,\r\n          ry: 1,\r\n        });\r\n\r\n        const finalText = new fabric.Text(displayText, {\r\n          left: midX + midWidth / 2,\r\n          top: boxY + boxHeight / 2,\r\n          originX: \"center\",\r\n          originY: \"center\",\r\n          fontSize: baseFontSize,\r\n          fontFamily: \"Inter\",\r\n          fontWeight: \"500\",\r\n          fill: \"#333\",\r\n          selectable: false,\r\n          evented: false,\r\n        });\r\n\r\n        shelves.push(background, finalText);\r\n      }\r\n    } else if (fixtureData.productResolutionLevel === \"L3\") {\r\n      const sequentialGroups: { zone: string; shelves: any[] }[] = [];\r\n\r\n      let previousZone: string | null = null;\r\n\r\n      for (const shelf of fixtureData.shelfConfig) {\r\n        const zone = shelf.zone || \"Unknown\";\r\n        if (zone !== previousZone) {\r\n          sequentialGroups.push({ zone, shelves: [shelf] });\r\n          previousZone = zone;\r\n        } else {\r\n          sequentialGroups[sequentialGroups.length - 1].shelves.push(shelf);\r\n        }\r\n      }\r\n\r\n      let currentShelfIndex = 0;\r\n\r\n      for (const group of sequentialGroups) {\r\n        const { zone, shelves: shelvesInGroup } = group;\r\n\r\n        const groupStartIndex = currentShelfIndex;\r\n        const groupLength = shelvesInGroup.length;\r\n\r\n        const groupTopY = firstBoxY + boxHeight * (groupStartIndex + 1);\r\n        const groupBottomY = groupTopY + boxHeight * groupLength;\r\n\r\n        for (let j = 0; j < shelvesInGroup.length; j++) {\r\n          const shelfData = shelvesInGroup[j];\r\n          const boxY = firstBoxY + boxHeight * (currentShelfIndex + 1);\r\n\r\n          const shelfRect = new fabric.Rect({\r\n            left: midX,\r\n            top: boxY,\r\n            width: midWidth,\r\n            height: boxHeight,\r\n            // stroke: '#51C1FF',\r\n            stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n            strokeWidth: 0.27,\r\n            fill: \"white\",\r\n          });\r\n\r\n          shelves.push(shelfRect);\r\n\r\n          if (shelfData.shelfType === \"tray\") {\r\n            const trayRows = shelfData.trayRows || 0;\r\n            const productPerShelf = shelfData.productPerShelf || 0;\r\n\r\n            const rowSpacing = boxHeight / trayRows;\r\n            const columnSpacing = midWidth / productPerShelf;\r\n\r\n            for (let r = 1; r < trayRows; r++) {\r\n              const lineY = boxY + r * rowSpacing;\r\n\r\n              const trayLine = new fabric.Line(\r\n                [midX, lineY, midX + midWidth, lineY],\r\n                {\r\n                  stroke: fixtureData.issue ? \"#DAF1FF\" : \"#D0D5DD\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(trayLine);\r\n            }\r\n\r\n            for (let c = 1; c < productPerShelf; c++) {\r\n              const lineX = midX + c * columnSpacing;\r\n\r\n              const verticalLine = new fabric.Line(\r\n                [lineX, boxY, lineX, boxY + boxHeight],\r\n                {\r\n                  stroke: \"#999\",\r\n                  strokeWidth: 0.2,\r\n                  selectable: false,\r\n                  evented: false,\r\n                },\r\n              );\r\n\r\n              shelves.push(verticalLine);\r\n            }\r\n          }\r\n\r\n          currentShelfIndex++;\r\n        }\r\n\r\n        const groupBottomLine = new fabric.Line(\r\n          [midX, groupBottomY, midX + midWidth, groupBottomY],\r\n          {\r\n            // stroke: '#51C1FF',\r\n            stroke: fixtureData.issue ? \"#D92D20\" : \"#51C1FF\",\r\n            strokeWidth: 1,\r\n            selectable: false,\r\n            evented: false,\r\n          },\r\n        );\r\n\r\n        shelves.push(groupBottomLine);\r\n\r\n        if (fixtureData.fixtureType === \"wall\") {\r\n          const labelPadding = 2;\r\n          const labelText = new fabric.Textbox(zone, {\r\n            left: midX + midWidth - labelPadding,\r\n            top: groupBottomY,\r\n            fontSize: 5,\r\n            fontFamily: \"Inter\",\r\n            fontWeight: \"600\",\r\n            fill: \"#707070\",\r\n            originX: \"right\",\r\n            originY: \"bottom\",\r\n            width: midWidth / 2,\r\n            textAlign: \"right\",\r\n          });\r\n\r\n          shelves.push(labelText);\r\n        }\r\n\r\n        const groupCenterX = midX + midWidth / 2;\r\n        const groupCenterY = groupTopY + (groupBottomY - groupTopY) / 2;\r\n\r\n        const sectionBrands = new Set();\r\n\r\n        shelvesInGroup?.forEach((shelf) => {\r\n          shelf.productBrandName?.forEach((brand: string) => {\r\n            sectionBrands.add(brand);\r\n          });\r\n        });\r\n\r\n        if ([...sectionBrands].length) {\r\n          const text = [...sectionBrands].join(\" + \");\r\n          const padding = 2;\r\n          const maxTextWidth = midWidth;\r\n          const rectWidth = midWidth * 0.9;\r\n          const maxTextHeight = 20;\r\n\r\n          let fontSize = 6;\r\n          let wrappedText;\r\n\r\n          const createTextbox = (fs: any) => {\r\n            return new fabric.Textbox(text, {\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"400\",\r\n              width: maxTextWidth,\r\n              textAlign: \"center\",\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fill: \"#101828\",\r\n              selectable: false,\r\n              evented: false,\r\n              left: groupCenterX,\r\n              top: groupCenterY,\r\n            });\r\n          };\r\n\r\n          do {\r\n            wrappedText = createTextbox(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (wrappedText.height > maxTextHeight && fontSize > 2);\r\n\r\n          const rectHeight = wrappedText.getScaledHeight() + padding;\r\n\r\n          const groupCenterText = new fabric.Rect({\r\n            left: groupCenterX,\r\n            top: groupCenterY,\r\n            originX: \"center\",\r\n            originY: \"center\",\r\n            width: rectWidth,\r\n            height: rectHeight,\r\n            fill: \"rgba(255, 255, 255, 0.5)\",\r\n            selectable: false,\r\n            evented: false,\r\n            rx: 1,\r\n            ry: 1,\r\n          });\r\n\r\n          shelves.push(groupCenterText, wrappedText);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (fixtureData?.vmConfig?.length) {\r\n      for (let i = 0; i < fixtureData.vmConfig.length; i++) {\r\n        const vm = fixtureData.vmConfig[i];\r\n\r\n        const startIndex = vm.startYPosition - 1;\r\n        const endIndex = vm.endYPosition - 1;\r\n\r\n        const shelfTopY = firstBoxY + boxHeight * (startIndex + 1);\r\n        const shelfHeightSpan = boxHeight * (endIndex - startIndex + 1);\r\n\r\n        let vmHeightPx: number = shelfHeightSpan;\r\n        let y: number = shelfTopY;\r\n\r\n        if (vm.yZone && vm.yZone !== \"stretch\") {\r\n          vmHeightPx = shelfHeightSpan / 3;\r\n\r\n          switch (vm.yZone) {\r\n            case \"top\":\r\n              y = shelfTopY;\r\n              break;\r\n            case \"middle\":\r\n              y = shelfTopY + vmHeightPx;\r\n              break;\r\n            case \"bottom\":\r\n              y = shelfTopY + 2 * vmHeightPx;\r\n              break;\r\n            default:\r\n              y = shelfTopY;\r\n          }\r\n        }\r\n\r\n        let x = midX;\r\n        let width = midWidth;\r\n\r\n        if (!vm.xZone || vm.xZone === \"stretch\") {\r\n          width = midWidth;\r\n          x = midX;\r\n        } else {\r\n          const sectionWidth = midWidth / 3;\r\n          switch (vm.xZone) {\r\n            case \"left\":\r\n              width = sectionWidth;\r\n              x = midX;\r\n              break;\r\n            case \"middle\":\r\n              width = sectionWidth;\r\n              x = midX + sectionWidth;\r\n              break;\r\n            case \"right\":\r\n              width = sectionWidth;\r\n              x = midX + 2 * sectionWidth;\r\n              break;\r\n            default:\r\n              width = midWidth;\r\n              x = midX;\r\n          }\r\n        }\r\n\r\n        if (vm.vmImageUrl) {\r\n          try {\r\n            const vmImage: any = await fabric.FabricImage.fromURL(\r\n              `${this.cdnUrl}${vm.vmImageUrl}?v=${Date.now()}`,\r\n              {\r\n                crossOrigin: \"anonymous\",\r\n              },\r\n            );\r\n\r\n            vmImage.set({\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              scaleX: width / vmImage.width!,\r\n              scaleY: vmHeightPx / vmImage.height!,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n            shelves.push(vmImage);\r\n          } catch (err) {\r\n            console.error(`Error loading image for VM: ${vm.vmImageUrl}`, err);\r\n          }\r\n        } else {\r\n          const vmBox = new fabric.Rect({\r\n            left: x,\r\n            top: y,\r\n            width,\r\n            height: vmHeightPx,\r\n            fill: \"#6938EF\",\r\n            selectable: false,\r\n            evented: false,\r\n          });\r\n\r\n          let fontSize = 5;\r\n          let vmText;\r\n\r\n          const createVmText = (fs: number) =>\r\n            new fabric.Textbox(vm.vmName || \"\", {\r\n              left: x + width / 2,\r\n              top: y + vmHeightPx / 2,\r\n              originX: \"center\",\r\n              originY: \"center\",\r\n              fontSize: fs,\r\n              fontFamily: \"Inter\",\r\n              fontWeight: \"600\",\r\n              fill: \"white\",\r\n              textAlign: \"center\",\r\n              width: width,\r\n              selectable: false,\r\n              evented: false,\r\n            });\r\n\r\n          do {\r\n            vmText = createVmText(fontSize);\r\n            fontSize -= 0.5;\r\n          } while (vmText.height > vmHeightPx && fontSize > 2);\r\n\r\n          shelves.push(vmBox, vmText);\r\n        }\r\n      }\r\n    }\r\n\r\n    const lastBoxY = firstBoxY + boxHeight * (shelfCount + 1);\r\n    const lastBox = new fabric.Path(\r\n      `M ${midX} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY} \r\n            L ${midX + midWidth} ${lastBoxY + boxHeight - radius} \r\n            Q ${midX + midWidth} ${lastBoxY + boxHeight} ${\r\n              midX + midWidth - radius\r\n            } ${lastBoxY + boxHeight} \r\n            L ${midX + radius} ${lastBoxY + boxHeight} \r\n            Q ${midX} ${lastBoxY + boxHeight} ${midX} ${\r\n              lastBoxY + boxHeight - radius\r\n            } \r\n            L ${midX} ${lastBoxY} Z`,\r\n      {\r\n        fill: fixtureData.issue ? \"#FEE4E2\" : \"#EAF8FF\",\r\n        stroke: fixtureData.issue ? \"#D92D20\" : \"#6BCAFF\",\r\n        strokeWidth: 0.27,\r\n      },\r\n    );\r\n\r\n    const lastBoxText = new fabric.Textbox(\r\n      `${fixtureData?.footer?.label ? fixtureData.footer.label : \"\"}`,\r\n      {\r\n        left: midX + midWidth / 2,\r\n        top: lastBoxY + boxHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"600\",\r\n        fill: \"#101828\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: midWidth,\r\n        heigth: boxHeight,\r\n      },\r\n    );\r\n\r\n    const bottomWidth = width / 1.05;\r\n    const bottomHeight = (3 / 100) * height;\r\n    const bottomX = x + (width - bottomWidth) / 2;\r\n    const bottomY = midY + midHeight + this.verticalMargin;\r\n\r\n    const bottomContainer = new fabric.Rect({\r\n      left: bottomX,\r\n      top: bottomY,\r\n      width: bottomWidth,\r\n      height: bottomHeight,\r\n      rx: radius,\r\n      ry: radius,\r\n      stroke: \"transparent\",\r\n      fill: \"transparent\",\r\n    });\r\n\r\n    const bottomTextContent = new fabric.Textbox(\r\n      `Shelves - ${actualShelves.length} . Products -  ${getFixtureProductCapacity(fixtureData.shelfConfig)} . VM - ${fixtureData.vmConfig?.length}`,\r\n      {\r\n        left: bottomX + bottomWidth / 2,\r\n        top: bottomY + bottomHeight / 2,\r\n        fontSize: 5,\r\n        fontFamily: \"Inter\",\r\n        fontWeight: \"500\",\r\n        fill: \"#333\",\r\n        originX: \"center\",\r\n        originY: \"center\",\r\n        textAlign: \"center\",\r\n        width: bottomWidth,\r\n        heigth: bottomHeight,\r\n      },\r\n    );\r\n\r\n    const fixtureGroup = new fabric.Group(\r\n      [\r\n        mainContainer,\r\n        topContainer,\r\n        innerTopBox,\r\n        topText,\r\n        innerBottomBox,\r\n        bottomText,\r\n        midContainer,\r\n        firstBox,\r\n        firstBoxText,\r\n        ...shelves,\r\n        lastBox,\r\n        lastBoxText,\r\n        bottomContainer,\r\n        bottomTextContent,\r\n      ],\r\n      {\r\n        left: x,\r\n        top: y,\r\n        selectable: false,\r\n        evented: true,\r\n        angle: fixtureData.relativePosition?.angle ?? 0,\r\n        // hoverCursor: 'pointer'\r\n      },\r\n    ) as fabric.Group & {\r\n      wallIndex: number;\r\n      fixtureIndex: number;\r\n      fixtureId: string;\r\n      fixtureType: \"wall\" | \"floor\";\r\n      issue: boolean;\r\n      issueData: any;\r\n      taskType: string;\r\n    };\r\n\r\n    fixtureGroup.on(\"mousedown\", (event: any) => {\r\n      const target = event.target;\r\n      if (target) {\r\n        this.selectedFixture = {\r\n          fixtureType: target.fixtureType,\r\n          wallIndex: target.wallIndex,\r\n          fixtureIndex: target.fixtureIndex,\r\n          fixtureId: target.fixtureId,\r\n          issue: target.issue,\r\n          issueData: target.issueData,\r\n          taskType: target.taskType,\r\n        };\r\n\r\n        if (this.selectedFixture.fixtureType === \"wall\") {\r\n          const wall = this.floorData.layoutPolygon.find(\r\n            (wall: any) =>\r\n              wall.elementNumber === this.selectedFixture.wallIndex,\r\n          );\r\n          const fixture = wall.fixtures.find(\r\n            (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n          );\r\n          this.selectedFixtureData = fixture;\r\n        } else if (this.selectedFixture.fixtureType === \"floor\") {\r\n          const fixture = this.floorData.centerFixture.find(\r\n            (fixture: any) => fixture._id === this.selectedFixture.fixtureId,\r\n          );\r\n          this.selectedFixtureData = fixture;\r\n        }\r\n\r\n        this.selectedFixture.fixtureData = this.selectedFixtureData;\r\n\r\n        this.editFixture = true;\r\n      }\r\n    });\r\n\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.fixtureType = fixtureData.fixtureType;\r\n    fixtureGroup.wallIndex = fixtureData.associatedElementNumber;\r\n    fixtureGroup.fixtureIndex = fixtureData.associatedElementFixtureNumber;\r\n    fixtureGroup.fixtureId = fixtureData._id;\r\n    fixtureGroup.issue = fixtureData.issue;\r\n    fixtureGroup.issueData = fixtureData.issueData;\r\n    fixtureGroup.taskType = fixtureData.taskType;\r\n\r\n    canvas.add(fixtureGroup);\r\n\r\n    return fixtureGroup;\r\n  }\r\n\r\n  drawEntrance(\r\n    canvas: fabric.Canvas,\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    arrowWidth: number,\r\n    elementData: any,\r\n  ) {\r\n    const bodyWidth = width - arrowWidth;\r\n\r\n    const pathData = [\r\n      `M 0 0`,\r\n      `L ${bodyWidth} 0`,\r\n      `L ${bodyWidth} ${-height / 2}`,\r\n      `L ${width} ${height / 2}`,\r\n      `L ${bodyWidth} ${height + height / 2}`,\r\n      `L ${bodyWidth} ${height}`,\r\n      `L 0 ${height}`,\r\n      `Z`,\r\n    ].join(\" \");\r\n\r\n    const arrow = new fabric.Path(pathData, {\r\n      fill: \"#03A9F4\",\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const maxTextHeight = height - 6;\r\n    const text = new fabric.Text(\"Entrance\", {\r\n      fontFamily: \"Arial\",\r\n      fontWeight: \"bold\",\r\n      fill: \"white\",\r\n      angle: -90,\r\n      originX: \"center\",\r\n      originY: \"center\",\r\n      left: 15,\r\n      top: height / 2,\r\n      fontSize: 20,\r\n      selectable: false,\r\n      evented: false,\r\n    });\r\n\r\n    const textBounds = text.getBoundingRect();\r\n    if (textBounds.height > maxTextHeight) {\r\n      const scale = maxTextHeight / textBounds.height;\r\n      text.set(\"fontSize\", text.fontSize! * scale);\r\n    }\r\n\r\n    const group = new fabric.Group([arrow, text], {\r\n      left: x,\r\n      top: y,\r\n      selectable: false,\r\n      lockScalingX: true,\r\n      lockScalingY: true,\r\n      lockScalingFlip: true,\r\n      angle: elementData.angle,\r\n    }) as fabric.Group & {\r\n      objType: string;\r\n      data: any;\r\n    };\r\n\r\n    group.objType = elementData.elementType;\r\n    group.data = elementData;\r\n\r\n    canvas.add(group);\r\n  }\r\n\r\n  toggleView(view: \"tree\" | \"detail\") {\r\n    this.selectedView = view;\r\n\r\n    if (this.selectedView === \"detail\" && this.floorData) {\r\n      setTimeout(() => {\r\n        this.drawInitialContent();\r\n      }, 300);\r\n    }\r\n  }\r\n\r\n  toPixels(value: number, unit: string, dpi = 2.8) {\r\n    let pixels: number;\r\n\r\n    if (unit === \"mm\") {\r\n      pixels = (value / 25.4) * dpi;\r\n    } else if (unit === \"ft\") {\r\n      pixels = value * 12 * dpi;\r\n    } else {\r\n      throw new Error(\"Unsupported unit. Use 'mm' or 'ft'.\");\r\n    }\r\n\r\n    return Number(pixels.toFixed(2));\r\n  }\r\n\r\n  taskDetails(planoId: any, floorId: any) {\r\n    this.taskInfo = {};\r\n    this.taskStyle = {\r\n      layout: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n      fixture: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n      vm: { name: \"Yet To Assign\", class: \"yetToAssign\" },\r\n    };\r\n    this.apiService.getTaskInfo({ planoId, floorId }).subscribe({\r\n      next: (res: any) => {\r\n        if (res && res.code == 200) {\r\n          this.taskInfo = res?.data;\r\n          this.taskInfo?.taskDetails?.forEach((ele: any) => {\r\n            if (ele.type == \"layout\") {\r\n              this.taskStyle.layout = this.getStatus(\"layout\");\r\n            }\r\n            if (ele.type == \"fixture\") {\r\n              this.taskStyle.fixture = this.getStatus(\"fixture\");\r\n            }\r\n            if (ele.type == \"fixture\") {\r\n              this.taskStyle.vm = this.taskStyle.fixture;\r\n            }\r\n          });\r\n        }\r\n      },\r\n      error: () => {\r\n        this.toast.getErrorToast(\"Failed to get task details\");\r\n      },\r\n    });\r\n  }\r\n\r\n  getStatus(type: any) {\r\n    let data = this.taskInfo?.taskDetails?.find((ele: any) => ele.type == type);\r\n    if (data) {\r\n      if (\r\n        data.status == \"submit\" &&\r\n        (data.feedbackStatus == \"complete\" || !data?.feedbackStatus)\r\n      ) {\r\n        return { name: \"Approved\", class: \"completed\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"pending\") {\r\n        return { name: \"Review Pending\", class: \"reviewPending\" };\r\n      } else if (data.status == \"submit\" && data.feedbackStatus == \"disagree\") {\r\n        return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n      } else {\r\n        if (data.redoStatus && !data.breach) {\r\n          return { name: \"Redo\", class: \"taskAssigned\" };\r\n        } else if (data.breach) {\r\n          return { name: \"Flagged\", class: \"flagged\" };\r\n        }\r\n        return { name: \"Task Assigned\", class: \"taskAssigned\" };\r\n      }\r\n    }\r\n    return { name: \"Yet to Assign\", class: \"yetToAssign\" };\r\n  }\r\n\r\n  onClickBack() {\r\n    this.editFixture = false;\r\n    this.selectedFixture = null;\r\n    this.selectedFixtureData = null;\r\n    this.editFixtureSection = \"basic-details\";\r\n  }\r\n\r\n  onSelectFixtureInTree(fixture: any) {\r\n    if (fixture) {\r\n      this.selectedFixtureData = fixture;\r\n      this.editFixture = true;\r\n    }\r\n  }\r\n\r\n  private getFullLayoutBounds() {\r\n    const objects = this.canvas.getObjects();\r\n    if (!objects.length) return { left: 0, top: 0, width: 0, height: 0 };\r\n\r\n    let minX = Infinity,\r\n      minY = Infinity,\r\n      maxX = -Infinity,\r\n      maxY = -Infinity;\r\n\r\n    for (const obj of objects) {\r\n      const rect = obj.getBoundingRect();\r\n      minX = Math.min(minX, rect.left);\r\n      minY = Math.min(minY, rect.top);\r\n      maxX = Math.max(maxX, rect.left + rect.width);\r\n      maxY = Math.max(maxY, rect.top + rect.height);\r\n    }\r\n\r\n    return {\r\n      left: minX,\r\n      top: minY,\r\n      width: maxX - minX,\r\n      height: maxY - minY,\r\n    };\r\n  }\r\n\r\n  rotateCanvas(canvas: fabric.Canvas, angleDeg: number) {\r\n    if (!canvas) return;\r\n    const allObjects = canvas.getObjects();\r\n    if (!allObjects || allObjects.length === 0) return;\r\n\r\n    // Create an ActiveSelection containing all objects on the canvas\r\n    const selection = new fabric.ActiveSelection(allObjects as any, { canvas });\r\n    canvas.setActiveObject(selection);\r\n\r\n    // Rotate the ActiveSelection directly (works like a temporary group)\r\n    const active: any = canvas.getActiveObject();\r\n    if (!active) {\r\n      canvas.discardActiveObject();\r\n      canvas.requestRenderAll();\r\n      return;\r\n    }\r\n\r\n    const currentAngle = active.angle || 0;\r\n    active.rotate(currentAngle + angleDeg);\r\n    active.setCoords();\r\n\r\n    // Clear selection but keep rotated positions of child objects\r\n    canvas.discardActiveObject();\r\n    canvas.requestRenderAll();\r\n  }\r\n\r\n  downloadCanvas() {\r\n    if (!this.canvas) return;\r\n\r\n    const originalViewport = [\r\n      ...this.canvas.viewportTransform!,\r\n    ] as fabric.TMat2D;\r\n\r\n    this.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);\r\n\r\n    const bounds = this.getFullLayoutBounds();\r\n\r\n    const dataURL = this.canvas.toDataURL({\r\n      format: \"png\",\r\n      left: bounds.left,\r\n      top: bounds.top,\r\n      width: bounds.width,\r\n      height: bounds.height,\r\n      multiplier: 4,\r\n    });\r\n\r\n    this.canvas.setViewportTransform(originalViewport);\r\n\r\n    const link = document.createElement(\"a\");\r\n    link.href = dataURL;\r\n    link.download = `${this.planoData?.storeName}_${this.floorData.floorName}.png`;\r\n    link.click();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  getRevisionDetails(event: any) {\r\n    if (event.target.checked) {\r\n      this.isPageLoading = true;\r\n      this.apiService\r\n        .getRevisionList({\r\n          storeId: this.storeId,\r\n          planoId: this.floorData.planoId,\r\n          floorId: this.floorData._id,\r\n        })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: (res: any) => {\r\n            if (res && res.code == 200) {\r\n              this.isPageLoading = false;\r\n              this.revisionPlanoList = res.data;\r\n              this.buildRevisionSelectItems();\r\n              this.currentSelect = this.revisionPlanoList.length - 1;\r\n              this.previousSelect = this.revisionPlanoList.length - 2;\r\n              this.latestFloorData = res.data[this.currentSelect]?.floorData;\r\n              if (this.latestFloorData) {\r\n                this.latestFloorData[\"revisionId\"] =\r\n                  res.data[this.currentSelect]?._id;\r\n              }\r\n              this.previousFloorData = res.data[this.previousSelect]?.floorData;\r\n              if (this?.previousFloorData) {\r\n                this.previousFloorData[\"revisionId\"] =\r\n                  res.data[this.previousSelect]?._id;\r\n              }\r\n              console.log(this.latestFloorData, \"this.latestFloorData\");\r\n              this.previousRenderKey = true;\r\n              this.latestRenderKey = true;\r\n            }\r\n          },\r\n        });\r\n    } else if (this.floorData) {\r\n      setTimeout(() => {\r\n        this.drawInitialContent();\r\n      }, 300);\r\n    }\r\n  }\r\n\r\n  buildRevisionSelectItems() {\r\n    this.revisionSelectItems = this.revisionPlanoList.map((r: any, i: number) => ({\r\n      _index: i,\r\n      displayName: r.name || (this.updateIndex(i + 1) + ' Revision'),\r\n    }));\r\n  }\r\n\r\n  onRevisionChange(index: number, type: string) {\r\n    this.isPageLoading = true;\r\n    const revision = this.revisionPlanoList[index];\r\n    if (!revision) return;\r\n    if (type === 'previous') {\r\n      this.previousRenderKey = false;\r\n      this.previousFloorData = revision.floorData;\r\n      if (this.previousFloorData) {\r\n        this.previousFloorData.revisionId = revision._id;\r\n      }\r\n      this.previousRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.previousFloorData.floorChange = true;\r\n    } else {\r\n      this.latestRenderKey = false;\r\n      this.latestFloorData = revision.floorData;\r\n      if (this.latestFloorData) {\r\n        this.latestFloorData.revisionId = revision._id;\r\n      }\r\n      this.latestRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.latestFloorData.floorChange = true;\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  loadPlano(event: any, type: string) {\r\n    this.isPageLoading = true;\r\n    if (type == \"previous\") {\r\n      this.previousRenderKey = false;\r\n      this.previousFloorData =\r\n        this.revisionPlanoList[event.target.value]?.floorData;\r\n      if (this?.previousFloorData) {\r\n        this.previousFloorData[\"revisionId\"] =\r\n          this.revisionPlanoList[event.target.value]?._id;\r\n      }\r\n      this.previousRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.previousFloorData.floorChange = true;\r\n    } else {\r\n      this.latestRenderKey = false;\r\n      this.latestFloorData =\r\n        this.revisionPlanoList[event.target.value]?.floorData;\r\n      if (this.latestFloorData) {\r\n        this.latestFloorData[\"revisionId\"] =\r\n          this.revisionPlanoList[event.target.value]?._id;\r\n      }\r\n      this.latestRenderKey = true;\r\n      this.isPageLoading = false;\r\n      this.latestFloorData.floorChange = true;\r\n    }\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  updateIndex(index: number): string {\r\n    if (index.toString().endsWith(\"1\")) {\r\n      return index + \"st\";\r\n    } else if (index.toString().endsWith(\"2\")) {\r\n      return index + \"nd\";\r\n    } else if (index.toString().endsWith(\"3\")) {\r\n      return index + \"rd\";\r\n    } else {\r\n      return index + \"th\";\r\n    }\r\n  }\r\n\r\n  // Mirrors verification-table getStatus(data) so the popup reflects the same\r\n  // status the user sees on the Manage Planogram → Verification table row.\r\n  // Source: manage-plano/verification-table/verification-table.component.ts\r\n  private computeTableStatusLabel(data: any): string {\r\n    const pendingTask = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele?.status !== 'submit',\r\n    );\r\n\r\n    if (\r\n      !pendingTask &&\r\n      data?.taskDetails?.fixtureStatus === 'complete' &&\r\n      data?.taskDetails?.layoutStatus === 'complete'\r\n    ) {\r\n      return data?.layoutStatus?.includes(false) ? 'Ready to Publish' : 'Published';\r\n    }\r\n\r\n    if (this.showBreachForRow(data, 'fixture')) return 'Yet to Assign';\r\n    return this.getTaskTooltipForRow(data, 'fixture') || '';\r\n  }\r\n\r\n  private showBreachForRow(data: any, type: string): boolean {\r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type === type,\r\n    );\r\n    return !!(taskDetails && taskDetails?.status !== 'submit' && taskDetails?.breach);\r\n  }\r\n\r\n  private getTaskTooltipForRow(data: any, type: string): string {\r\n    const statusMap: any = {\r\n      layout: data?.taskDetails?.layoutStatus,\r\n      fixture: data?.taskDetails?.fixtureStatus,\r\n      vm: data?.taskDetails?.fixtureStatus,\r\n    };\r\n    if (type === 'vm') type = 'fixture';\r\n\r\n    const taskDetails = data?.planoTask?.[0]?.taskStatus?.find(\r\n      (ele: any) => ele.type === type,\r\n    );\r\n    const status = statusMap[type];\r\n\r\n    if (type === 'fixture') {\r\n      const taskInfo = data?.planoTask?.[0]?.taskStatus?.filter(\r\n        (ele: any) => ele.status && ele.type === 'fixture',\r\n      );\r\n      if (status === 'pending' && taskInfo?.some((task: any) => task.status === 'submit')) return 'Review Pending';\r\n      if (taskInfo?.length !== data?.layoutCount) return 'Yet to Assign';\r\n      if (taskInfo?.some((task: any) => this.isFutureTaskDate(task?.date))) return 'Task Scheduled';\r\n      if (taskInfo?.some((task: any) => ['open', 'inprogress'].includes(task?.status))) return 'Task Assigned';\r\n    }\r\n\r\n    if (!taskDetails || (taskDetails.status === 'submit' && status === 'disagree')) return 'Yet to Assign';\r\n    if (taskDetails.status !== 'submit') return 'Task Assigned';\r\n    if (status === 'complete') return 'Completed';\r\n    return '';\r\n  }\r\n\r\n  private isFutureTaskDate(dateValue: string): boolean {\r\n    if (!dateValue) return false;\r\n    const taskDate = new Date(dateValue);\r\n    if (isNaN(taskDate.getTime())) return false;\r\n    const today = new Date();\r\n    today.setHours(0, 0, 0, 0);\r\n    taskDate.setHours(0, 0, 0, 0);\r\n    return taskDate.getTime() > today.getTime();\r\n  }\r\n\r\n  openSetCurrentModal(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision) return;\r\n\r\n    const payload = {\r\n      clientId: this.clientId,\r\n      limit: 50,\r\n      offset: 1,\r\n      sortColumnName: '',\r\n      sortBy: 1,\r\n      filter: { country: [], city: [], layout: [], fixture: [], taskPending: 'all', status: [] },\r\n      searchValue: this.floorData?.storeName || '',\r\n    };\r\n\r\n    this.apiService\r\n      .getPlanoList(payload)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          let statusLabel = '';\r\n          if (res?.code === 200) {\r\n            const matchingRow = res?.data?.data?.find(\r\n              (r: any) => r._id === this.floorData.planoId,\r\n            );\r\n            if (matchingRow) {\r\n              statusLabel = this.computeTableStatusLabel(matchingRow);\r\n            }\r\n          }\r\n          this.doOpenSetCurrentModal(revision, revisionIndex, statusLabel);\r\n        },\r\n        error: () => this.doOpenSetCurrentModal(revision, revisionIndex, ''),\r\n      });\r\n  }\r\n\r\n  private doOpenSetCurrentModal(revision: any, revisionIndex: number, statusLabel: string) {\r\n    const modalRef = this.modalService.open(SetCurrentPlanoModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      backdrop: \"static\",\r\n    });\r\n    modalRef.componentInstance.revisionName =\r\n      revision.name || this.updateIndex(revisionIndex + 1) + \" Revision\";\r\n    modalRef.componentInstance.revisionIndex = revisionIndex + 1;\r\n    modalRef.componentInstance.publishedDate =\r\n      revision.createdAt || revision.floorData?.lastUpdate || \"\";\r\n    modalRef.componentInstance.storeStatus = statusLabel;\r\n\r\n    modalRef.result.then(\r\n      (res: any) => {\r\n        if (res) {\r\n          this.apiService\r\n            .setActiveRevision({\r\n              revisionId: revision._id,\r\n              planoId: this.floorData.planoId,\r\n              floorId: this.floorData._id,\r\n              sendVerificationTask: res.sendVerificationTask,\r\n            })\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe({\r\n              next: (apiRes: any) => {\r\n                if (apiRes && apiRes.code == 200) {\r\n                  this.revisionPlanoList.forEach((r: any) => {\r\n                    r.isActive = false;\r\n                    if (r.name === \"Current Plano\") r.name = \"\";\r\n                    r.isStaging = false;\r\n                  });\r\n                  revision.isActive = true;\r\n                  revision.name = \"Current Plano\";\r\n                  revision.isStaging = false;\r\n                  this.floorData.verificationStatus = true;\r\n                  this.toast.getSuccessToast(\r\n                    apiRes?.message || \"Revision set as current planogram\",\r\n                  );\r\n                  this.cd.detectChanges();\r\n                }\r\n              },\r\n              error: () => {\r\n                this.toast.getErrorToast(\r\n                  \"Failed to set revision as current\",\r\n                );\r\n              },\r\n            });\r\n        }\r\n      },\r\n      () => {},\r\n    );\r\n  }\r\n\r\n  toggleStagingFlag(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision || revision.isActive) return;\r\n\r\n    const newValue = !revision.isStaging;\r\n    this.apiService\r\n      .setStagingFlag({ revisionId: revision._id, isStaging: newValue })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          if (res && res.code == 200) {\r\n            revision.isStaging = newValue;\r\n            this.toast.getSuccessToast(\r\n              res?.message || (newValue ? \"Marked for staging\" : \"Unmarked from staging\"),\r\n            );\r\n            this.cd.detectChanges();\r\n          }\r\n        },\r\n        error: () => {\r\n          this.toast.getErrorToast(\"Failed to update staging flag\");\r\n        },\r\n      });\r\n  }\r\n\r\n  openEditNameModal(revisionIndex: number) {\r\n    const revision = this.revisionPlanoList[revisionIndex];\r\n    if (!revision) return;\r\n\r\n    const modalRef = this.modalService.open(EditRevisionNameModalComponent, {\r\n      centered: true,\r\n      size: \"md\",\r\n      backdrop: \"static\",\r\n    });\r\n    modalRef.componentInstance.currentName =\r\n      revision.name || this.updateIndex(revisionIndex + 1) + \" Revision\";\r\n\r\n    modalRef.result.then(\r\n      (res: any) => {\r\n        if (res) {\r\n          this.apiService\r\n            .updateRevisionName({\r\n              revisionId: revision._id,\r\n              name: res.name,\r\n            })\r\n            .pipe(takeUntil(this.destroy$))\r\n            .subscribe({\r\n              next: (apiRes: any) => {\r\n                if (apiRes && apiRes.code == 200) {\r\n                  revision.name = res.name;\r\n                  this.buildRevisionSelectItems();\r\n                  this.toast.getSuccessToast(\r\n                    apiRes?.message || \"Revision name updated\",\r\n                  );\r\n                  this.cd.detectChanges();\r\n                }\r\n              },\r\n              error: () => {\r\n                this.toast.getErrorToast(\r\n                  \"Failed to update revision name\",\r\n                );\r\n              },\r\n            });\r\n        }\r\n      },\r\n      () => {},\r\n    );\r\n  }\r\n\r\n  // async getVmsList() {\r\n  //   let payload = {\r\n  //     clientId: this.clientId,\r\n  //     limit: 10000,\r\n  //     offset: 0,\r\n  //     sortColumnName: \"\",\r\n  //     sortBy: 1,\r\n  //     searchValue: \"\",\r\n  //     filter: {\r\n  //       type: [],\r\n  //       status: [],\r\n  //       size: [],\r\n  //     },\r\n  //     export: false,\r\n  //     emptyDownload: false,\r\n  //   };\r\n\r\n  //   try {\r\n  //     const res: any = await lastValueFrom(\r\n  //       this.apiService.getVmLibraryList(payload),\r\n  //     );\r\n  //     if (res?.status === \"success\") {\r\n  //       this.vmList = res?.data?.data.map((item: any) => {\r\n  //         return {\r\n  //           id: item._id,\r\n  //           name: item.vmName,\r\n  //           displayName:\r\n  //             item.vmName + (item?.vmType ? ` ( ${item.vmType} ) ` : \"\"),\r\n  //           brand: item.vmBrand,\r\n  //           type: item.vmType,\r\n  //           width: item.vmWidth.value,\r\n  //           height: item.vmHeight.value,\r\n  //           placement: item.isDoubleSided,\r\n  //           noOfAssigned: item.templateCount,\r\n  //           status: item.status,\r\n  //           ...(item.vmImageUrl\r\n  //             ? { imgUrl: `${this.cdnUrl}${item.vmImageUrl}` }\r\n  //             : {}),\r\n  //         };\r\n  //       });\r\n  //     }\r\n  //   } catch (error) {\r\n  //     console.log(\"@@ ~ getVmsList [ERR]:\", error);\r\n  //   } finally {\r\n  //     this.isPageLoading = false;\r\n  //   }\r\n  // }\r\n}\r\n","<section [ngClass]=\"{ 'd-none': isPageLoading || editFixture }\" id=\"store-plano\">\r\n  <div id=\"header\" [ngClass]=\"{ 'd-none': !planoData }\">\r\n    <div class=\"d-flex justify-content-between\">\r\n      <div>\r\n        <h4 class=\"title\">\r\n          <a class=\"me-3\" router>{{ planoData?.storeName }}</a>\r\n          <!-- <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n            <path\r\n              d=\"M15 11.2894V16.2894C15 16.7314 14.8244 17.1553 14.5118 17.4679C14.1993 17.7805 13.7754 17.9561 13.3333 17.9561H4.16667C3.72464 17.9561 3.30072 17.7805 2.98816 17.4679C2.67559 17.1553 2.5 16.7314 2.5 16.2894V7.12272C2.5 6.68069 2.67559 6.25677 2.98816 5.94421C3.30072 5.63165 3.72464 5.45605 4.16667 5.45605H9.16667M12.5 2.95605H17.5M17.5 2.95605V7.95605M17.5 2.95605L8.33333 12.1227\"\r\n              stroke=\"#008EDF\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg> -->\r\n        </h4>\r\n        <p class=\"subtitle\">Last updated {{ planoData?.lastUpdate | date : \"medium\" }}</p>\r\n      </div>\r\n      <!-- <div class=\"d-flex justify-content-center align-items-center gap-3\">\r\n        <button type=\"button\" class=\"btn btn-outline\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n            <path\r\n              d=\"M15.7148 6.45605L9.71484 12.4561L15.7148 18.4561\"\r\n              stroke=\"#101828\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </button>\r\n        <p class=\"revision-text\">3/3 Revision: Layout assigned</p>\r\n        <button type=\"button\" class=\"btn btn-outline\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n            <path\r\n              d=\"M9.71484 18.4561L15.7148 12.4561L9.71484 6.45605\"\r\n              stroke=\"#101828\"\r\n              stroke-width=\"2\"\r\n              stroke-linecap=\"round\"\r\n              stroke-linejoin=\"round\"\r\n            />\r\n          </svg>\r\n        </button>\r\n      </div> -->\r\n    </div>\r\n    <lib-reactive-select style=\"width: fit-content\" *ngIf=\"planoData?.floors?.length\" [formControl]=\"selectedFloorId\"\r\n      [idField]=\"'_id'\" [nameField]=\"'floorName'\" [data]=\"planoData.floors\"></lib-reactive-select>\r\n  </div>\r\n\r\n  <div [ngClass]=\"{ 'd-none': !planoData }\" id=\"body\">\r\n    <div class=\"row mx-0 gap-3 mb-4 w-100\">\r\n      <div class=\"col filter-tab\">\r\n        <h3 class=\"d-flex align-items-center gap-2\">\r\n          Plano Completion %\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\"\r\n            ngbTooltip=\"% of overall planogram completion\">\r\n            <g clip-path=\"url(#clip0_1517_129805)\">\r\n              <path\r\n                d=\"M9 12V9M9 6H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\"\r\n                stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </g>\r\n            <defs>\r\n              <clipPath id=\"clip0_1517_129805\">\r\n                <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n              </clipPath>\r\n            </defs>\r\n          </svg>\r\n        </h3>\r\n        <div class=\"row align-items-center mt-2\">\r\n          <div class=\"col-9\">\r\n            <div class=\"progress\" style=\"height: 4px\">\r\n              <div class=\"progress-bar\" [ngClass]=\"\r\n                  taskInfo?.planoProgress <= 50 ? 'bg-warning' : taskInfo?.planoProgress === 75 ? 'bg-primary' : 'bg-success'\r\n                \" role=\"progressbar\" [style]=\"'width:' + taskInfo?.planoProgress + '%'\"\r\n                [attr.aria-valuenow]=\"taskInfo?.planoProgress\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\r\n            </div>\r\n          </div>\r\n          <div class=\"col-3\">{{ taskInfo?.planoProgress }}%</div>\r\n        </div>\r\n      </div>\r\n      <div class=\"col filter-tab\">\r\n        <h3>\r\n          <b>{{ storeMetrics.floorCount }}</b> Layout\r\n        </h3>\r\n        <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.layout.class\">\r\n          <span class=\"me-2\" [hidden]=\"taskStyle.layout.name !== 'Redo'\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_4984_27569)\">\r\n                <path\r\n                  d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                  stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_4984_27569\">\r\n                  <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n          </span>\r\n          <span [hidden]=\"taskStyle.layout.name !== 'Flagged'\" class=\"me-2\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <path\r\n                d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg> </span>{{ taskStyle.layout.name }}\r\n        </div>\r\n      </div>\r\n      <div class=\"col filter-tab\">\r\n        <h3>\r\n          <b>{{ storeMetrics.fixtureCount }}</b> Fixtures\r\n        </h3>\r\n        <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.fixture.class\">\r\n          <span class=\"me-2\" [hidden]=\"taskStyle.fixture.name !== 'Redo'\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_4984_27569)\">\r\n                <path\r\n                  d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                  stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_4984_27569\">\r\n                  <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n          </span>\r\n          <span [hidden]=\"taskStyle.fixture.name !== 'Flagged'\" class=\"me-2\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <path\r\n                d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n          </span>\r\n          {{ taskStyle.fixture.name }}\r\n        </div>\r\n      </div>\r\n      <div class=\"col filter-tab\">\r\n        <h3>\r\n          <b>{{ storeMetrics.vmCount }}</b> Visual Merchandise\r\n        </h3>\r\n        <div class=\"indicator mt-2\" [ngClass]=\"taskStyle.vm.class\">\r\n          <span class=\"me-2\" [hidden]=\"taskStyle.vm.name !== 'Redo'\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <g clip-path=\"url(#clip0_4984_27569)\">\r\n                <path\r\n                  d=\"M0.5 2.00077V5.00077M0.5 5.00077H3.5M0.5 5.00077L2.82 2.82077C3.35737 2.28313 4.02219 1.89037 4.7524 1.67916C5.48262 1.46794 6.25445 1.44515 6.99586 1.6129C7.73727 1.78065 8.4241 2.13349 8.99227 2.63848C9.56043 3.14347 9.99142 3.78416 10.245 4.50077M11.5 10.0008V7.00077M11.5 7.00077H8.5M11.5 7.00077L9.18 9.18077C8.64263 9.71841 7.97781 10.1112 7.2476 10.3224C6.51738 10.5336 5.74555 10.5564 5.00414 10.3886C4.26273 10.2209 3.5759 9.86805 3.00773 9.36306C2.43957 8.85807 2.00858 8.21738 1.755 7.50077\"\r\n                  stroke=\"#7A5AF8\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n              </g>\r\n              <defs>\r\n                <clipPath id=\"clip0_4984_27569\">\r\n                  <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n                </clipPath>\r\n              </defs>\r\n            </svg>\r\n          </span>\r\n          <span [hidden]=\"taskStyle.vm.name !== 'Flagged'\" class=\"me-2\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <path\r\n                d=\"M2 7.5C2 7.5 2.5 7 4 7C5.5 7 6.5 8 8 8C9.5 8 10 7.5 10 7.5V1.5C10 1.5 9.5 2 8 2C6.5 2 5.5 1 4 1C2.5 1 2 1.5 2 1.5V7.5ZM2 7.5V11\"\r\n                stroke=\"#B42318\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n            </svg>\r\n          </span>\r\n          {{ taskStyle.vm.name }}\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div id=\"segment-btn\" class=\"w-100 pb-5\">\r\n      <div class=\"w-100 d-flex justify-content-start gap-4\">\r\n        <!-- <button type=\"button\" routerLink=\"/manage/planogram/build-planogram\" class=\"btn btn-primary\">Build</button> -->\r\n        <ul class=\"nav nav-tabs custom-tabs d-flex\" style=\"width: 200px; margin: 0\">\r\n          <li class=\"nav-item flex-fill\">\r\n            <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'detail'\"\r\n              (click)=\"toggleView('detail')\">\r\n              Detail View\r\n            </button>\r\n          </li>\r\n          <li class=\"nav-item flex-fill\">\r\n            <button class=\"nav-link w-100 h-100\" [class.active]=\"selectedView === 'tree'\" (click)=\"toggleView('tree')\">\r\n              Tree View\r\n            </button>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n      <div class=\"form-check form-switch mt-10\" *ngIf=\"selectedView === 'detail'\">\r\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"planoCompare\" [(ngModel)]=\"enableCompare\"  (click)=\"getRevisionDetails($event)\">\r\n        <label class=\"form-check-label ms-2 compareLabel\" for=\"planoCompare\">Compare Planogram </label>\r\n      </div>\r\n    </div>\r\n    <div [ngClass]=\"{ 'd-none': selectedView === 'tree' }\">\r\n      <div id=\"canvas-card\" class=\"overflow-hidden position-relative overview-canvas\" #canvasContainer [hidden]=\"enableCompare\">\r\n        <canvas id=\"base-canvas\" #baseCanvas></canvas>\r\n  \r\n        <!-- Rotate Button -->\r\n        <button style=\"top: 24px; right: 94px\" type=\"button\"\r\n          class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n          (click)=\"rotateCanvas(canvas,90)\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n            <path\r\n              d=\"M6.36265 7.17887L7.17625 6.36287L5.90425 5.09207L5.08945 5.90567L6.36265 7.17887ZM15.671 6.36407L19.6379 10.3309L20.9099 9.05769L16.9442 5.09087L15.671 6.36407ZM19.6379 18.8257L18.8243 19.6393L20.0963 20.9101L20.9099 20.0977L19.6379 18.8257ZM10.3295 19.6393L6.36265 15.6725L5.09065 16.9457L9.05626 20.9113L10.3295 19.6393ZM18.8243 19.6393C17.6543 20.8081 16.8407 21.6193 16.1459 22.1497C15.4715 22.6645 15.0155 22.8289 14.5763 22.8289V24.6289C15.5675 24.6289 16.4027 24.2173 17.2367 23.5813C18.0503 22.9609 18.9635 22.0453 20.0963 20.9125L18.8243 19.6393ZM9.05626 20.9113C10.1891 22.0453 11.1023 22.9597 11.9159 23.5813C12.7499 24.2173 13.5851 24.6289 14.5763 24.6289V22.8289C14.1371 22.8289 13.6823 22.6645 13.0067 22.1497C12.3119 21.6193 11.4983 20.8081 10.3295 19.6393L9.05626 20.9113ZM19.6379 10.3309C20.8067 11.4997 21.6179 12.3133 22.1483 13.0081C22.6631 13.6837 22.8275 14.1385 22.8275 14.5777H24.6275C24.6275 13.5865 24.2159 12.7513 23.5799 11.9173C22.9595 11.1037 22.0427 10.1905 20.9099 9.05769L19.6379 10.3309ZM20.9099 20.0977C22.0439 18.9637 22.9583 18.0517 23.5799 17.2381C24.2159 16.4041 24.6275 15.5689 24.6275 14.5777H22.8275C22.8275 15.0169 22.6631 15.4729 22.1483 16.1473C21.6179 16.8421 20.8067 17.6557 19.6379 18.8257L20.9099 20.0977ZM7.17625 6.36287C8.34625 5.19407 9.15985 4.38167 9.85465 3.85127C10.529 3.33647 10.985 3.17327 11.4242 3.17327V1.37207C10.433 1.37207 9.59785 1.78367 8.76385 2.41967C7.94905 3.04127 7.03705 3.95567 5.90425 5.08847L7.17625 6.36287ZM16.9442 5.09087C15.8114 3.95687 14.8982 3.04127 14.0846 2.41967C13.2506 1.78367 12.4154 1.37207 11.4242 1.37207V3.17327C11.8634 3.17327 12.3182 3.33647 12.9938 3.85127C13.6886 4.38167 14.5022 5.19287 15.671 6.36167L16.9442 5.09087ZM5.08945 5.90327C3.95665 7.03607 3.04225 7.94807 2.42065 8.76287C1.78465 9.59687 1.37305 10.4321 1.37305 11.4233H3.17305C3.17305 10.9841 3.33745 10.5281 3.85225 9.85367C4.38265 9.15887 5.19385 8.34527 6.36265 7.17527L5.08945 5.90327ZM6.36265 15.6713C5.19385 14.5013 4.38265 13.6877 3.85225 12.9929C3.33745 12.3185 3.17305 11.8625 3.17305 11.4233H1.37305C1.37305 12.4145 1.78465 13.2497 2.42065 14.0837C3.04225 14.8973 3.95665 15.8105 5.08945 16.9433L6.36265 15.6713Z\"\r\n              fill=\"#1D2939\" />\r\n            <path d=\"M23.2 6.9832L25 8.2C25 4.582 22.4056 1.5796 19 1M2.8 19.0168L1 17.8C1 21.418 3.5944 24.4204 7 25\"\r\n              stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n          </svg>\r\n        </button>\r\n  \r\n        <!-- Download Button -->\r\n        <button style=\"top: 24px; right: 26px\" type=\"button\"\r\n          class=\"btn btn-outline d-flex align-items-center gap-3 position-absolute bg-white shadow-sm\"\r\n          (click)=\"downloadCanvas()\">\r\n          <svg width=\"22\" height=\"22\" viewBox=\"0 0 26 26\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" stroke=\"#000000\"\r\n            stroke-width=\"0.24000000000000005\">\r\n            <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\r\n            <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#CCCCCC\"\r\n              stroke-width=\"0.384\"></g>\r\n            <g id=\"SVGRepo_iconCarrier\">\r\n              <path\r\n                d=\"M12.5535 16.5061C12.4114 16.6615 12.2106 16.75 12 16.75C11.7894 16.75 11.5886 16.6615 11.4465 16.5061L7.44648 12.1311C7.16698 11.8254 7.18822 11.351 7.49392 11.0715C7.79963 10.792 8.27402 10.8132 8.55352 11.1189L11.25 14.0682V3C11.25 2.58579 11.5858 2.25 12 2.25C12.4142 2.25 12.75 2.58579 12.75 3V14.0682L15.4465 11.1189C15.726 10.8132 16.2004 10.792 16.5061 11.0715C16.8118 11.351 16.833 11.8254 16.5535 12.1311L12.5535 16.5061Z\"\r\n                fill=\"#1D2939\"></path>\r\n              <path\r\n                d=\"M3.75 15C3.75 14.5858 3.41422 14.25 3 14.25C2.58579 14.25 2.25 14.5858 2.25 15V15.0549C2.24998 16.4225 2.24996 17.5248 2.36652 18.3918C2.48754 19.2919 2.74643 20.0497 3.34835 20.6516C3.95027 21.2536 4.70814 21.5125 5.60825 21.6335C6.47522 21.75 7.57754 21.75 8.94513 21.75H15.0549C16.4225 21.75 17.5248 21.75 18.3918 21.6335C19.2919 21.5125 20.0497 21.2536 20.6517 20.6516C21.2536 20.0497 21.5125 19.2919 21.6335 18.3918C21.75 17.5248 21.75 16.4225 21.75 15.0549V15C21.75 14.5858 21.4142 14.25 21 14.25C20.5858 14.25 20.25 14.5858 20.25 15C20.25 16.4354 20.2484 17.4365 20.1469 18.1919C20.0482 18.9257 19.8678 19.3142 19.591 19.591C19.3142 19.8678 18.9257 20.0482 18.1919 20.1469C17.4365 20.2484 16.4354 20.25 15 20.25H9C7.56459 20.25 6.56347 20.2484 5.80812 20.1469C5.07435 20.0482 4.68577 19.8678 4.40901 19.591C4.13225 19.3142 3.9518 18.9257 3.85315 18.1919C3.75159 17.4365 3.75 16.4354 3.75 15Z\"\r\n                fill=\"#1D2939\"></path>\r\n            </g>\r\n          </svg>\r\n        </button>\r\n      </div>\r\n      <div class=\"row\" *ngIf=\"enableCompare\">\r\n        <div class=\"col-md-6\">\r\n            <div class=\"d-flex align-items-center revision-header\" *ngIf=\"previousFloorData\"\r\n                style=\"margin-top: 3%;margin-right: 3%;\">\r\n                <lib-reactive-select\r\n                    class=\"revision-select\"\r\n                    [idField]=\"'_index'\"\r\n                    [nameField]=\"'displayName'\"\r\n                    [data]=\"revisionSelectItems\"\r\n                    [(ngModel)]=\"previousSelect\"\r\n                    (ngModelChange)=\"onRevisionChange($event, 'previous')\">\r\n                </lib-reactive-select>\r\n                <span class=\"current-plano-badge ms-2\" *ngIf=\"revisionPlanoList[previousSelect]?.isActive\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#0086c9\"/>\r\n                        <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                    Current plano\r\n                </span>\r\n                <span class=\"staging-badge ms-2\" *ngIf=\"revisionPlanoList[previousSelect]?.isStaging && !revisionPlanoList[previousSelect]?.isActive\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#667085\"/>\r\n                        <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                    Staging\r\n                </span>\r\n                <div class=\"kebab-menu ms-auto\" ngbDropdown placement=\"bottom-end\">\r\n                    <button class=\"btn btn-link kebab-btn\" ngbDropdownToggle>\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <circle cx=\"10\" cy=\"4\" r=\"2\" fill=\"#344054\"/>\r\n                            <circle cx=\"10\" cy=\"10\" r=\"2\" fill=\"#344054\"/>\r\n                            <circle cx=\"10\" cy=\"16\" r=\"2\" fill=\"#344054\"/>\r\n                        </svg>\r\n                    </button>\r\n                    <div ngbDropdownMenu>\r\n                        <button ngbDropdownItem (click)=\"openSetCurrentModal(previousSelect)\" [disabled]=\"revisionPlanoList[previousSelect]?.isActive\">Set as Current Plano</button>\r\n                        <button ngbDropdownItem (click)=\"openEditNameModal(previousSelect)\">Edit revision name</button>\r\n                        <div class=\"dropdown-item form-check staging-check\"\r\n                             [class.disabled]=\"revisionPlanoList[previousSelect]?.isActive\"\r\n                             (click)=\"!revisionPlanoList[previousSelect]?.isActive && toggleStagingFlag(previousSelect)\">\r\n                            <input type=\"checkbox\" class=\"form-check-input\" id=\"stagingCheckPrev\"\r\n                                   [checked]=\"revisionPlanoList[previousSelect]?.isStaging\"\r\n                                   [disabled]=\"revisionPlanoList[previousSelect]?.isActive\"\r\n                                   (click)=\"$event.preventDefault()\">\r\n                            <label class=\"form-check-label\" for=\"stagingCheckPrev\">Mark for staging</label>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <lib-plano-comparison [floorData]=\"previousFloorData\"  *ngIf=\"previousRenderKey && previousFloorData\" ></lib-plano-comparison>\r\n            <div class=\"published-text\" *ngIf=\"previousFloorData\">\r\n                Published: {{previousFloorData?.createdAt || previousFloorData?.lastUpdate}}\r\n            </div>\r\n            <div *ngIf=\"!previousFloorData\" class=\"noDataContent\">\r\n              <div>\r\n                  <div class=\"text-center\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"315\" height=\"155\" viewBox=\"0 0 315 155\" fill=\"none\">\r\n                          <path d=\"M103.809 47.0198C89.5458 47.02 77.983 58.5826 77.9829 72.8459C77.9829 78.7619 73.9798 85.5061 68.0638 85.5061H45.2583C30.9948 85.5061 19.4312 97.0688 19.4312 111.332C19.4312 125.596 30.9948 137.158 45.2583 137.158H183.357C200.247 137.158 216.32 123.992 233.21 123.992H299.245C303.999 123.992 307.853 120.138 307.853 115.383C307.853 110.629 303.999 106.775 299.245 106.775H211.624C209.98 106.775 208.588 105.553 208.12 103.976C207.381 101.487 209.082 98.6721 211.678 98.6721H241.909C256.172 98.6719 267.735 87.1093 267.735 72.8459C267.735 58.5827 256.172 47.02 241.909 47.0198H103.809Z\" fill=\"#EAECF0\"/>\r\n                          <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\" transform=\"matrix(-1 0 0 1 246.602 48.8572)\" fill=\"#EAECF0\"/>\r\n                          <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\" transform=\"matrix(-1 0 0 1 56.2979 113.282)\" fill=\"#6BCAFF\"/>\r\n                          <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 244.965 68.8262)\" fill=\"#00A3FF\"/>\r\n                          <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 215.689 13.5271)\" fill=\"#00A3FF\"/>\r\n                          <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\" transform=\"matrix(-1 0 0 1 104.006 138.221)\" fill=\"#00A3FF\"/>\r\n                          <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\" fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3\"/>\r\n                          <mask id=\"path-8-inside-1_419_28888\" fill=\"white\">\r\n                          <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"/>\r\n                          </mask>\r\n                          <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" fill=\"#6BCAFF\"/>\r\n                          <path d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\" fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_419_28888)\"/>\r\n                          <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\" stroke-width=\"3.98436\" stroke-linecap=\"round\"/>\r\n                          <circle cx=\"218.205\" cy=\"70.1763\" r=\"3.29663\" fill=\"white\"/>\r\n                          <circle cx=\"111.787\" cy=\"55.1663\" r=\"2.52637\" fill=\"#99DAFF\"/>\r\n                          <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\"/>\r\n                          <path d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.931 123.894 194.055 127.161 191.5 128.636C188.945 130.111 185.679 129.236 184.204 126.681L164.465 92.4932C149.446 98.6552 131.813 92.92 123.471 78.4717C114.374 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.098 38.6209 151.481 34.7041 140.05 41.3037C128.62 47.9035 124.703 62.5204 131.302 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.38 76.0987 179.297 61.4826 172.698 50.0518Z\" fill=\"white\"/>\r\n                          <circle cx=\"153\" cy=\"57.0007\" r=\"23.8994\" transform=\"rotate(-30 153 57.0007)\" fill=\"#99DAFF\"/>\r\n                          <mask id=\"path-16-inside-2_419_28888\" fill=\"white\">\r\n                          <path d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\"/>\r\n                          </mask>\r\n                          <path d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\" stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_419_28888)\"/>\r\n                          <path d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.931 118.894 195.055 122.161 192.5 123.636C189.945 125.111 186.679 124.236 185.204 121.681L165.465 87.4932C150.446 93.6552 132.813 87.92 124.471 73.4717C115.374 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.098 33.6209 152.481 29.7041 141.05 36.3037C129.62 42.9035 125.703 57.5204 132.302 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.38 71.0987 180.297 56.4826 173.698 45.0518Z\" fill=\"#00A3FF\"/>\r\n                      </svg>\r\n                  </div>\r\n                  <div class=\"mainText text-center\">\r\n                      No Previous Revisions\r\n                  </div>\r\n                  <div class=\"subText\">\r\n                      There is no previous revisions available for this planogram\r\n                  </div>\r\n              </div>\r\n          </div>\r\n        </div>\r\n        <div class=\"col-md-6\">\r\n          <div *ngIf=\"!previousFloorData\" class=\"currentText\">\r\n              Current Plano\r\n          </div>\r\n            <div class=\"d-flex align-items-center revision-header\"\r\n                *ngIf=\"latestFloorData && previousFloorData\"\r\n                style=\"margin-top: 3%;margin-right: 3%;\">\r\n                <lib-reactive-select\r\n                    class=\"revision-select\"\r\n                    [idField]=\"'_index'\"\r\n                    [nameField]=\"'displayName'\"\r\n                    [data]=\"revisionSelectItems\"\r\n                    [(ngModel)]=\"currentSelect\"\r\n                    (ngModelChange)=\"onRevisionChange($event, 'latest')\">\r\n                </lib-reactive-select>\r\n                <span class=\"current-plano-badge ms-2\" *ngIf=\"revisionPlanoList[currentSelect]?.isActive\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#0086c9\"/>\r\n                        <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                    Current plano\r\n                </span>\r\n                <span class=\"staging-badge ms-2\" *ngIf=\"revisionPlanoList[currentSelect]?.isStaging && !revisionPlanoList[currentSelect]?.isActive\">\r\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n                        <circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#667085\"/>\r\n                        <path d=\"M3.5 6L5.2 7.7L8.5 4.3\" stroke=\"white\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n                    </svg>\r\n                    Staging\r\n                </span>\r\n                <div class=\"kebab-menu ms-auto\" ngbDropdown placement=\"bottom-end\">\r\n                    <button class=\"btn btn-link kebab-btn\" ngbDropdownToggle>\r\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n                            <circle cx=\"10\" cy=\"4\" r=\"2\" fill=\"#344054\"/>\r\n                            <circle cx=\"10\" cy=\"10\" r=\"2\" fill=\"#344054\"/>\r\n                            <circle cx=\"10\" cy=\"16\" r=\"2\" fill=\"#344054\"/>\r\n                        </svg>\r\n                    </button>\r\n                    <div ngbDropdownMenu>\r\n                        <button ngbDropdownItem (click)=\"openSetCurrentModal(currentSelect)\" [disabled]=\"revisionPlanoList[currentSelect]?.isActive\">Set as Current Plano</button>\r\n                        <button ngbDropdownItem (click)=\"openEditNameModal(currentSelect)\">Edit revision name</button>\r\n                        <div class=\"dropdown-item form-check staging-check\"\r\n                             [class.disabled]=\"revisionPlanoList[currentSelect]?.isActive\"\r\n                             (click)=\"!revisionPlanoList[currentSelect]?.isActive && toggleStagingFlag(currentSelect)\">\r\n                            <input type=\"checkbox\" class=\"form-check-input\" id=\"stagingCheckCurr\"\r\n                                   [checked]=\"revisionPlanoList[currentSelect]?.isStaging\"\r\n                                   [disabled]=\"revisionPlanoList[currentSelect]?.isActive\"\r\n                                   (click)=\"$event.preventDefault()\">\r\n                            <label class=\"form-check-label\" for=\"stagingCheckCurr\">Mark for staging</label>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <lib-plano-comparison [floorData]=\"latestFloorData\"  *ngIf=\"latestRenderKey && latestFloorData\" ></lib-plano-comparison>\r\n            <div class=\"published-text\" *ngIf=\"latestFloorData\">\r\n                Published: {{latestFloorData?.createdAt || latestFloorData?.lastUpdate}}\r\n            </div>\r\n            <div *ngIf=\"!latestFloorData\" class=\"noDataContent\">\r\n              <div>\r\n                  <div class=\"text-center\">\r\n                      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"315\" height=\"155\" viewBox=\"0 0 315 155\" fill=\"none\" >\r\n                          <path d=\"M103.809 47.0198C89.5458 47.02 77.983 58.5826 77.9829 72.8459C77.9829 78.7619 73.9798 85.5061 68.0638 85.5061H45.2583C30.9948 85.5061 19.4312 97.0688 19.4312 111.332C19.4312 125.596 30.9948 137.158 45.2583 137.158H183.357C200.247 137.158 216.32 123.992 233.21 123.992H299.245C303.999 123.992 307.853 120.138 307.853 115.383C307.853 110.629 303.999 106.775 299.245 106.775H211.624C209.98 106.775 208.588 105.553 208.12 103.976C207.381 101.487 209.082 98.6721 211.678 98.6721H241.909C256.172 98.6719 267.735 87.1093 267.735 72.8459C267.735 58.5827 256.172 47.02 241.909 47.0198H103.809Z\" fill=\"#EAECF0\"/>\r\n                          <rect width=\"240.694\" height=\"16.9956\" rx=\"8.4978\" transform=\"matrix(-1 0 0 1 246.602 48.8572)\" fill=\"#EAECF0\"/>\r\n                          <circle cx=\"5.42147\" cy=\"5.42147\" r=\"5.42147\" transform=\"matrix(-1 0 0 1 56.2979 113.282)\" fill=\"#6BCAFF\"/>\r\n                          <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 244.965 68.8262)\" fill=\"#00A3FF\"/>\r\n                          <circle cx=\"3.25288\" cy=\"3.25288\" r=\"3.25288\" transform=\"matrix(-1 0 0 1 215.689 13.5271)\" fill=\"#00A3FF\"/>\r\n                          <circle cx=\"2.16859\" cy=\"2.16859\" r=\"2.16859\" transform=\"matrix(-1 0 0 1 104.006 138.221)\" fill=\"#00A3FF\"/>\r\n                          <rect x=\"68.501\" y=\"44.1523\" width=\"166.999\" height=\"97.9371\" rx=\"15.1015\" fill=\"#6BCAFF\" stroke=\"#00A3FF\" stroke-width=\"3\"/>\r\n                          <mask id=\"path-8-inside-1_419_28888\" fill=\"white\">\r\n                          <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\"/>\r\n                          </mask>\r\n                          <path d=\"M93.1172 19C94.0625 19 94.9892 19.0828 95.8887 19.2422V116.784C94.9892 116.625 94.0625 116.542 93.1172 116.542H82.7744C74.0642 116.542 67.0031 123.603 67.0029 132.313V34.7715C67.0029 26.0612 74.0641 19 82.7744 19H93.1172Z\" fill=\"#6BCAFF\"/>\r\n                          <path d=\"M93.1172 19L93.1173 16H93.1172V19ZM95.8887 19.2422H98.8887V16.7271L96.4122 16.2882L95.8887 19.2422ZM95.8887 116.784L95.3651 119.738L98.8887 120.363V116.784H95.8887ZM93.1172 116.542L93.1173 113.542H93.1172V116.542ZM67.0029 132.313H64.0029L70.0029 132.314L67.0029 132.313ZM93.1172 19L93.1171 22C93.8872 22 94.6387 22.0674 95.3651 22.1961L95.8887 19.2422L96.4122 16.2882C95.3396 16.0981 94.2377 16 93.1173 16L93.1172 19ZM95.8887 19.2422H92.8887V116.784H95.8887H98.8887V19.2422H95.8887ZM95.8887 116.784L96.4122 113.83C95.3396 113.64 94.2377 113.542 93.1173 113.542L93.1172 116.542L93.1171 119.542C93.8872 119.542 94.6387 119.609 95.3651 119.738L95.8887 116.784ZM93.1172 116.542V113.542H82.7744V116.542V119.542H93.1172V116.542ZM82.7744 116.542V113.542C72.4073 113.542 64.0032 121.947 64.0029 132.313L67.0029 132.313L70.0029 132.314C70.0031 125.26 75.7212 119.542 82.7744 119.542V116.542ZM67.0029 132.313H70.0029V34.7715H67.0029H64.0029V132.313H67.0029ZM67.0029 34.7715H70.0029C70.0029 27.718 75.721 22 82.7744 22V19V16C72.4072 16 64.0029 24.4043 64.0029 34.7715H67.0029ZM82.7744 19V22H93.1172V19V16H82.7744V19Z\" fill=\"#00A3FF\" mask=\"url(#path-8-inside-1_419_28888)\"/>\r\n                          <line x1=\"76.9619\" y1=\"42.6523\" x2=\"76.9619\" y2=\"84.4881\" stroke=\"#99DAFF\" stroke-width=\"3.98436\" stroke-linecap=\"round\"/>\r\n                          <circle cx=\"218.205\" cy=\"70.1763\" r=\"3.29663\" fill=\"white\"/>\r\n                          <circle cx=\"111.787\" cy=\"55.1663\" r=\"2.52637\" fill=\"#99DAFF\"/>\r\n                          <circle cx=\"99.3845\" cy=\"124.986\" r=\"3.44505\" fill=\"white\"/>\r\n                          <path d=\"M135.529 33.4717C151.285 24.3749 171.432 29.7732 180.529 45.5293C188.56 59.4398 185.291 76.7707 173.573 86.9004L193.457 121.339C194.931 123.894 194.055 127.161 191.5 128.636C188.945 130.111 185.679 129.236 184.204 126.681L164.465 92.4932C149.446 98.6552 131.813 92.92 123.471 78.4717C114.374 62.7156 119.773 42.5685 135.529 33.4717ZM172.698 50.0518C166.098 38.6209 151.481 34.7041 140.05 41.3037C128.62 47.9035 124.703 62.5204 131.302 73.9512C137.902 85.3817 152.519 89.2977 163.95 82.6982C175.38 76.0987 179.297 61.4826 172.698 50.0518Z\" fill=\"white\"/>\r\n                          <circle cx=\"153\" cy=\"57.0007\" r=\"23.8994\" transform=\"rotate(-30 153 57.0007)\" fill=\"#99DAFF\"/>\r\n                          <mask id=\"path-16-inside-2_419_28888\" fill=\"white\">\r\n                          <path d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\"/>\r\n                          </mask>\r\n                          <path d=\"M153.384 40.9952C153.435 39.6997 152.422 38.5923 151.131 38.709C148.857 38.9146 146.635 39.5486 144.585 40.5849C141.834 41.9755 139.483 44.0445 137.755 46.5965C136.026 49.1485 134.976 52.0991 134.705 55.1696C134.503 57.4578 134.739 59.7563 135.391 61.9442C135.761 63.1867 137.165 63.7164 138.35 63.1886C139.534 62.6607 140.044 61.2741 139.73 60.016C139.37 58.573 139.251 57.0748 139.382 55.5825C139.583 53.3073 140.361 51.1209 141.642 49.2299C142.923 47.3389 144.665 45.8058 146.703 44.7754C148.04 44.0995 149.476 43.6546 150.95 43.4538C152.234 43.2787 153.333 42.2908 153.384 40.9952Z\" stroke=\"white\" stroke-width=\"6\" mask=\"url(#path-16-inside-2_419_28888)\"/>\r\n                          <path d=\"M136.529 28.4717C152.285 19.3749 172.432 24.7732 181.529 40.5293C189.56 54.4398 186.291 71.7707 174.573 81.9004L194.457 116.339C195.931 118.894 195.055 122.161 192.5 123.636C189.945 125.111 186.679 124.236 185.204 121.681L165.465 87.4932C150.446 93.6552 132.813 87.92 124.471 73.4717C115.374 57.7156 120.773 37.5685 136.529 28.4717ZM173.698 45.0518C167.098 33.6209 152.481 29.7041 141.05 36.3037C129.62 42.9035 125.703 57.5204 132.302 68.9512C138.902 80.3817 153.519 84.2977 164.95 77.6982C176.38 71.0987 180.297 56.4826 173.698 45.0518Z\" fill=\"#00A3FF\"/>\r\n                      </svg>\r\n                  </div>\r\n                  <div class=\"mainText text-center\">\r\n                      No Previous Revisions\r\n                  </div>\r\n                  <div class=\"subText\">\r\n                      There is no previous revisions available for this planogram\r\n                  </div>\r\n              </div>\r\n            </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div *ngIf=\"selectedView === 'tree'\" class=\"w-100\">\r\n      <store-plano-tree-view [allFixture]=\"allFixtures\"\r\n        (selectedInstance)=\"onSelectFixtureInTree($event)\"></store-plano-tree-view>\r\n    </div>\r\n  </div>\r\n\r\n  <div [ngClass]=\"{ 'd-none': planoData }\">\r\n    <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100 bg-white rounded py-10\">\r\n      <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n      <div class=\"nodatamaintext mt-3\">No data found</div>\r\n      <div class=\"nodatasubtext\">There is no planogram available for this store.</div>\r\n    </div>\r\n  </div>\r\n</section>\r\n\r\n<!-----------Edit fixture body----------->\r\n<section [ngClass]=\"{ 'd-none': !editFixture }\">\r\n  <div class=\"header\">\r\n    <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n      <button type=\"button\" class=\"btn btn-outline p-3\" (click)=\"onClickBack()\">\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n          <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n            stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n        </svg>\r\n      </button>\r\n      <h2 class=\"m-0\">{{ selectedFixtureData?.fixtureName }}</h2>\r\n      <div class=\"badge draft\">{{ selectedFixtureData?.status | titlecase }}</div>\r\n    </div>\r\n  </div>\r\n\r\n  <div id=\"edit-body\" class=\"row w-100\">\r\n    <ul class=\"mx-3 my-5 nav nav-pills\" role=\"tablist\">\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"editFixtureSection = 'basic-details'\"\r\n          [ngClass]=\"editFixtureSection === 'basic-details' ? 'active' : ''\" class=\"nav-link\" role=\"tab\">\r\n          Basic details\r\n        </a>\r\n      </li>\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"editFixtureSection = 'products'\" [ngClass]=\"editFixtureSection === 'products' ? 'active' : ''\"\r\n          class=\"nav-link\" role=\"tab\">\r\n          Products\r\n        </a>\r\n      </li>\r\n      <li class=\"nav-item cursor-pointer\" role=\"presentation\">\r\n        <a (click)=\"editFixtureSection = 'vms'\" [ngClass]=\"editFixtureSection === 'vms' ? 'active' : ''\"\r\n          class=\"nav-link\" role=\"tab\">\r\n          Visual Merchandise\r\n        </a>\r\n      </li>\r\n    </ul>\r\n\r\n    <ng-container *ngIf=\"editFixtureSection === 'basic-details'\">\r\n      <lib-instance-basic-details [fixtureData]=\"selectedFixtureData\" [editMode]=\"false\"></lib-instance-basic-details>\r\n    </ng-container>\r\n    <ng-container *ngIf=\"editFixtureSection === 'products'\">\r\n      <lib-instance-products [fixtureData]=\"selectedFixtureData\" [editMode]=\"false\"></lib-instance-products>\r\n    </ng-container>\r\n    <ng-container *ngIf=\"editFixtureSection === 'vms'\">\r\n      <lib-instance-vms [fixtureData]=\"selectedFixtureData\" [editMode]=\"false\"></lib-instance-vms>\r\n    </ng-container>\r\n  </div>\r\n</section>\r\n\r\n<section [ngClass]=\"{ 'd-none': !isPageLoading }\" id=\"store-plano-skeleton\">\r\n  <div class=\"row\">\r\n    <div class=\"col-12 m-0\"><ng-container *ngTemplateOutlet=\"headerSkeleton\"></ng-container></div>\r\n    <div class=\"col-12\"><ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container></div>\r\n  </div>\r\n</section>\r\n\r\n<ng-template #headerSkeleton>\r\n  <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer w-100 p-4 rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke mt-0 animate title\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>\r\n\r\n<ng-template #skeletonLoader>\r\n  <div class=\"row m-0 g-0 loader d-flex justify-content-center align-items-center overflow-hidden\">\r\n    <div class=\"shimmer w-100 rounded\">\r\n      <div class=\"wrapper\">\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n        <br />\r\n        <div class=\"stroke animate title\"></div>\r\n        <div class=\"stroke animate link\"></div>\r\n        <div class=\"stroke animate description\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</ng-template>","import { NgModule } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { StorePlanoComponent } from \"./components/store-plano/store-plano.component\";\r\nimport { ReactiveSelectComponent } from \"./components/reactive-select/reactive-select.component\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { NgbDropdownModule, NgbTooltipModule } from \"@ng-bootstrap/ng-bootstrap\";\r\nimport { InstanceBasicDetailsComponent } from \"./components/manage-store-plano/template-basic-details/template-basic-details.component\";\r\nimport { InstanceProductsComponent } from \"./components/manage-store-plano/template-products/template-products.component\";\r\nimport { InstanceVmsComponent } from \"./components/manage-store-plano/template-vms/template-vms.component\";\r\nimport { TimeAgoPipe } from \"./pipes/time-ago.pipe\";\r\nimport { TemplateTreeComponent } from \"./components/fixture-template-tree/fixture-template-tree.component\";\r\nimport { StorePlanoTreeViewComponent } from \"./components/store-plano/store-plano-tree-view/store-plano-tree-view.component\";\r\nimport { FixtureOverviewPanelComponent } from \"./components/fixture-overview-panel/fixture-overview-panel.component\";\r\nimport { PlanoComparisonComponent } from \"./components/planogram/plano-overview/plano-comparison/plano-comparison.component\";\r\n\r\nconst routes: Routes = [\r\n  {\r\n    path: \"\",\r\n    component: StorePlanoComponent,\r\n  },\r\n];\r\n\r\n@NgModule({\r\n  declarations: [StorePlanoComponent],\r\n  imports: [\r\n    RouterModule.forChild(routes),\r\n    CommonModule,\r\n    ReactiveSelectComponent,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    NgbTooltipModule,\r\n    NgbDropdownModule,\r\n    InstanceBasicDetailsComponent,\r\n    InstanceProductsComponent,\r\n    InstanceVmsComponent,\r\n    TemplateTreeComponent,\r\n    TimeAgoPipe,\r\n    StorePlanoTreeViewComponent,\r\n    PlanoComparisonComponent,\r\n    FixtureOverviewPanelComponent,\r\n  ],\r\n})\r\nexport class TangoStorePlanoModule {}\r\n","/*\r\n * Public API Surface of tango-store-builder\r\n */\r\n\r\nexport * from './lib/tango-store-builder.module';\r\nexport * from './lib/tango-store-plano.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i1.StoreBuilderService","i2.StoreBuilderService","i6","i8.CustomSelectComponent","i7.CustomSelectComponent","i4.StoreBuilderService","i5","i7","i3.StoreBuilderService","i4","i2.PlanoDataService","i5.StoreBuilderService","i4.FixtureComponent","i5.EditableFixtureComponent","i6.MultiselectChipDropdownComponent","i3.ZoneEditableFixtureComponent","i8.CadSourceService","i9.ReactiveSelectComponent","i11.InstanceBasicDetailsComponent","i12.InstanceProductsComponent","i13.InstanceVmsComponent","i14.StorePlanoTreeViewComponent","i15.CustomSelectComponent","i16.VerificationFeedbackComponent","i17.ZoneVerificationFeedbackComponent","i7.TimeAgoPipe","i4.ReactiveSelectComponent","distinctUntilChanged","i4.PlanoDataService","i8","i9.TemplateTreeComponent","i10.FindReplaceTableComponent","i11.TemplateDetailsComponent","i12.AccessDeniedComponent","filter","i3.PlanoDataService","i1.PlanoDataService","i8.AccessDeniedComponent","map","i8.PlanoFilterComponent","i9.FindReplaceTableComponent","i7.CadSourceService","i8.ReactiveSelectComponent","i9","i10.InstanceBasicDetailsComponent","i11.InstanceProductsComponent","i12.InstanceVmsComponent","i13.CustomSelectComponent","i14.RolloutFeedbackComponent","i8.CustomsingleSelectComponent","i5.ToolPageHeaderComponent","i3.MisplacedProductFixtureComponent","i4.ProductLocatorComponent","i3.FixtureProductsComponent","i6.ReactiveSelectComponent","i8.PlanoComparisonComponent","i9.FixtureOverviewComponent","i5.DateRangePickerComponent","i6.FixtureAnalyticsComponent","i5.CadSourceService","i9.CustomSelectComponent","i10.MerchComplianceComponent","i11.PlanoOverviewComponent","i12.PlanoAnalyticsComponent","i2.CollectionUpdateAiDataService","i1.CollectionUpdateAiDataService","i14.OnboardFixtureComponent","i4.StoreSelectComponent","i7.ToolPageHeaderComponent","i6.StoreSelectComponent","i5.StoreSelectComponent","i6.ToolPageHeaderComponent","i5.ReactiveSelectComponent","i8.ToolPageHeaderComponent","i3.ToolPageHeaderComponent","i6.PlanoDataService","i8.MultiselectChipDropdownComponent","i9.TemplateProductsComponent","i10.SearchableSelectComponent","i11.ChipsInputComponent","i12.TemplateVmsComponent","routes","i7.ReactiveSelectComponent","i9.InstanceBasicDetailsComponent","i10.InstanceProductsComponent","i11.InstanceVmsComponent","i12.StorePlanoTreeViewComponent","i13.PlanoComparisonComponent"],"mappings":"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E;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;AACxE,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAA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"}