tango-app-ui-store-builder 1.2.16 → 1.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/esm2022/lib/components/access-denied/access-denied.component.mjs +31 -0
  2. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -3
  4. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -3
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -3
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -3
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +25 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -3
  10. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +3 -3
  11. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +3 -3
  12. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +9 -3
  13. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +9 -3
  14. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +133 -21
  15. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +25 -9
  16. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +28 -5
  17. package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +4 -3
  18. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +5 -4
  19. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +6 -5
  20. package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +4 -3
  21. package/esm2022/lib/components/plano-tools/delete-task/delete-task.component.mjs +4 -3
  22. package/esm2022/lib/components/plano-tools/layout-touchup/layout-touchup.component.mjs +134 -0
  23. package/esm2022/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.mjs +5103 -0
  24. package/esm2022/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.mjs +4 -3
  25. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +4 -3
  26. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +4 -3
  27. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +6 -5
  28. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +4 -3
  29. package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +4 -3
  30. package/esm2022/lib/components/plano-tools/tool-page-header/tool-page-header.component.mjs +22 -0
  31. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +27 -8
  32. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -3
  33. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -3
  34. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -3
  35. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -3
  36. package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +1 -1
  37. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -3
  38. package/esm2022/lib/components/store-plano/store-plano.component.mjs +3 -3
  39. package/esm2022/lib/functions/feature-access.guard.mjs +20 -0
  40. package/esm2022/lib/functions/plano.function.mjs +22 -1
  41. package/esm2022/lib/services/store-builder.service.mjs +24 -3
  42. package/esm2022/lib/tango-store-builder-routing.module.mjs +35 -55
  43. package/esm2022/lib/tango-store-builder.module.mjs +14 -2
  44. package/fesm2022/tango-app-ui-store-builder.mjs +5863 -376
  45. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  46. package/lib/components/access-denied/access-denied.component.d.ts +18 -0
  47. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +6 -0
  48. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
  49. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  50. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +1 -0
  51. package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +1 -0
  52. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -0
  53. package/lib/components/plano-configurations/plano-configurations.component.d.ts +9 -1
  54. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +5 -1
  55. package/lib/components/plano-tools/layout-touchup/layout-touchup.component.d.ts +50 -0
  56. package/lib/components/plano-tools/layout-touchup/touchup-editor/touchup-editor.component.d.ts +331 -0
  57. package/lib/components/plano-tools/tool-page-header/tool-page-header.component.d.ts +8 -0
  58. package/lib/components/plano-tools/tools-parent/tools-parent.component.d.ts +4 -2
  59. package/lib/functions/feature-access.guard.d.ts +9 -0
  60. package/lib/functions/plano.function.d.ts +9 -0
  61. package/lib/services/store-builder.service.d.ts +16 -0
  62. package/lib/tango-store-builder.module.d.ts +62 -58
  63. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Shared "Access denied" panel for the email-gated features. Reused two ways:
6
+ * - Inline, with [feature] bound (e.g. inside the Find & Replace tab).
7
+ * - As a route component (the findReplaceAccessGuard redirect target), reading
8
+ * the feature name from the `feature` query param.
9
+ * Mirrors the access-denied markup used by the Looks page.
10
+ */
11
+ export declare class AccessDeniedComponent implements OnInit {
12
+ private route;
13
+ feature: string;
14
+ constructor(route: ActivatedRoute);
15
+ ngOnInit(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<AccessDeniedComponent, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<AccessDeniedComponent, "lib-access-denied", never, { "feature": { "alias": "feature"; "required": false; }; }, {}, never, never, false, never>;
18
+ }
@@ -22,6 +22,8 @@ export declare class FixtureTemplateTableComponent implements OnInit, OnDestroy
22
22
  viewMode: "list" | "grid" | "tree" | string;
23
23
  fixtureTemplateChildList: any;
24
24
  activeTab: string;
25
+ frAccessChecked: boolean;
26
+ frAllowed: boolean;
25
27
  sortedColumn: string;
26
28
  sortOrder: number;
27
29
  childSortedColumn: string;
@@ -54,6 +56,10 @@ export declare class FixtureTemplateTableComponent implements OnInit, OnDestroy
54
56
  ngOnInit(): void;
55
57
  getVmsList(): Promise<void>;
56
58
  setPageData(): void;
59
+ /** Resolve whether the session user may use Find & Replace. Never throws.
60
+ * Hides the tab when denied; the tab content falls back to an access-denied
61
+ * panel for anyone who deep-links to ?tab=find-replace. */
62
+ private checkFindReplaceAccess;
57
63
  getFixtureLibList(): void;
58
64
  getFixtureTemplatesList(): void;
59
65
  getBrandsList(): void;
@@ -54,13 +54,13 @@ export declare class PlanoRolloutTableComponent implements OnInit, OnDestroy {
54
54
  paginationSize(): number;
55
55
  onPageChange(pageOffset: number): void;
56
56
  onPageSizeChange(pageSize: number): void;
57
- getTaskStatus(data: any, type: string): "completed" | "yetToAssign" | "reviewPending" | "taskAssigned" | undefined;
58
- getTaskTooltip(data: any, type: string): "Review Pending" | "Yet to Assign" | "Task Assigned" | "Completed" | undefined;
57
+ getTaskStatus(data: any, type: string): "completed" | "yetToAssign" | "taskAssigned" | "reviewPending" | undefined;
58
+ getTaskTooltip(data: any, type: string): "Completed" | "Yet to Assign" | "Task Assigned" | "Review Pending" | undefined;
59
59
  showBreach(data: any, type: string): boolean;
60
60
  updateQueryParams(): void;
61
61
  ngOnDestroy(): void;
62
- getStatus(data: any): "Review Pending" | "Yet to Assign" | "Task Assigned" | "Ready to Publish" | "Published" | undefined;
63
- getStatusBadge(data: any): "yetToAssign" | "reviewPending" | "taskAssigned" | "primaryBadgeStyle" | "bg-success" | undefined;
62
+ getStatus(data: any): "Yet to Assign" | "Task Assigned" | "Review Pending" | "Ready to Publish" | "Published" | undefined;
63
+ getStatusBadge(data: any): "yetToAssign" | "taskAssigned" | "reviewPending" | "primaryBadgeStyle" | "bg-success" | undefined;
64
64
  onExport(): void;
65
65
  static ɵfac: i0.ɵɵFactoryDeclaration<PlanoRolloutTableComponent, never>;
66
66
  static ɵcmp: i0.ɵɵComponentDeclaration<PlanoRolloutTableComponent, "lib-plano-rollout-table", never, {}, {}, never, never, false, never>;
@@ -54,14 +54,14 @@ export declare class PlanoVerificationTableComponent implements OnInit, OnDestro
54
54
  onPageChange(pageOffset: number): void;
55
55
  onPageSizeChange(pageSize: number): void;
56
56
  planoFloorDetails(data: any): string | 1;
57
- getTaskStatus(data: any, type: string): "completed" | "yetToAssign" | "reviewPending" | "taskAssigned" | undefined;
58
- getTaskTooltip(data: any, type: string): "Review Pending" | "Yet to Assign" | "Task Assigned" | "Task Scheduled" | "Completed" | undefined;
59
- getZoneStatus(data: any): "completed" | "yetToAssign" | "reviewPending" | "taskAssigned" | "flag";
57
+ getTaskStatus(data: any, type: string): "completed" | "yetToAssign" | "taskAssigned" | "reviewPending" | undefined;
58
+ getTaskTooltip(data: any, type: string): "Completed" | "Yet to Assign" | "Task Assigned" | "Review Pending" | "Task Scheduled" | undefined;
59
+ getZoneStatus(data: any): "completed" | "yetToAssign" | "taskAssigned" | "reviewPending" | "flag";
60
60
  getZoneTooltip(data: any): any;
61
61
  getProgressValue(data: any): 100 | 50 | 25;
62
62
  showBreach(data: any, type: string): boolean;
63
- getStatus(data: any): "Review Pending" | "Yet to Assign" | "Task Assigned" | "Ready to Publish" | "Published" | "Task Scheduled" | "Completed" | undefined;
64
- getStatusBadge(data: any): "completed" | "yetToAssign" | "reviewPending" | "taskAssigned" | "primaryBadgeStyle" | "bg-success" | undefined;
63
+ getStatus(data: any): "Completed" | "Yet to Assign" | "Task Assigned" | "Review Pending" | "Ready to Publish" | "Published" | "Task Scheduled" | undefined;
64
+ getStatusBadge(data: any): "completed" | "yetToAssign" | "taskAssigned" | "reviewPending" | "primaryBadgeStyle" | "bg-success" | undefined;
65
65
  getSubmit(data: any): boolean;
66
66
  updateQueryParams(): void;
67
67
  ngOnDestroy(): void;
@@ -23,6 +23,7 @@ export declare class VerificationFeedbackComponent implements OnInit, OnChanges,
23
23
  currentFixtureIndex: number;
24
24
  planoFixture: any;
25
25
  aiFixture: any;
26
+ get planoFixtureCapacity(): number;
26
27
  selectedImageForPreview: string | null;
27
28
  imagePreviewZoom: number;
28
29
  imagePreviewPanX: number;
@@ -20,6 +20,7 @@ export declare class ZoneVerificationFeedbackComponent implements OnChanges {
20
20
  constructor(ngbModal: NgbModal);
21
21
  planoFixture: any;
22
22
  zoneFixture: any;
23
+ get planoFixtureCapacity(): number;
23
24
  currentFixtureIndex: number;
24
25
  selectedImageForPreview: string | null;
25
26
  imagePreviewZoom: number;
@@ -118,12 +118,20 @@ export declare class OnboardStorePlanoComponent implements AfterViewInit, OnDest
118
118
  private similarityRatio;
119
119
  private isLibraryMatch;
120
120
  validateFixtures(): void;
121
+ private readonly allocationExemptGroups;
122
+ private isAllocationExempt;
123
+ private hasBrandValue;
124
+ private hasZoneWithoutAllocation;
125
+ validateZoneAllocations(): void;
121
126
  get hasInvalidHeaderFixtures(): boolean;
122
127
  get invalidHeaderFixtureCount(): number;
123
128
  get hasInvalidLibraryFixtures(): boolean;
124
129
  get invalidLibraryFixtureCount(): number;
125
130
  get hasInvalidFixtures(): boolean;
126
131
  get invalidFixturesTooltip(): string;
132
+ get hasUnallocatedZoneFixtures(): boolean;
133
+ get unallocatedZoneFixtureCount(): number;
134
+ get unallocatedZonesTooltip(): string;
127
135
  get isEditLayoutAllowed(): boolean;
128
136
  renderFloor(update?: boolean): Promise<void>;
129
137
  drawInitialContent(): Promise<void>;
@@ -1,6 +1,7 @@
1
1
  import { ChangeDetectorRef, ElementRef, OnInit } from "@angular/core";
2
2
  import { AbstractControl, FormArray, FormBuilder, FormGroup } from "@angular/forms";
3
3
  import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
4
+ import { Router } from "@angular/router";
4
5
  import { GlobalStateService, PageInfoService } from "tango-app-ui-global";
5
6
  import { ToastService } from "tango-app-ui-shared";
6
7
  import { PlanoDataService } from "../../services/plano-data.service";
@@ -16,6 +17,7 @@ export declare class PlanoConfigurationsComponent implements OnInit {
16
17
  private modelService;
17
18
  private cd;
18
19
  private pageInfo;
20
+ private router;
19
21
  formRef: ElementRef;
20
22
  brandMetaRef: ElementRef;
21
23
  selectedTab: string;
@@ -29,7 +31,13 @@ export declare class PlanoConfigurationsComponent implements OnInit {
29
31
  brandMetaList: any[];
30
32
  isBrandMetaEdit: boolean;
31
33
  brandMetaSearch: string;
32
- constructor(fb: FormBuilder, dataService: PlanoDataService, gs: GlobalStateService, builderService: StoreBuilderService, toast: ToastService, modelService: NgbModal, cd: ChangeDetectorRef, pageInfo: PageInfoService);
34
+ constructor(fb: FormBuilder, dataService: PlanoDataService, gs: GlobalStateService, builderService: StoreBuilderService, toast: ToastService, modelService: NgbModal, cd: ChangeDetectorRef, pageInfo: PageInfoService, router: Router);
35
+ /**
36
+ * Hidden entry point to the internal plano-tools page.
37
+ * Triggered from an invisible 1×1 hit-area below the config side card —
38
+ * for ops/devs who know it's there. Not discoverable in the UI.
39
+ */
40
+ goToPlanoTools(): void;
33
41
  ngOnInit(): Promise<void>;
34
42
  setPageData(): void;
35
43
  loadBrandData(): Promise<void>;
@@ -40,11 +40,15 @@ export declare class FixtureLibraryComponent implements OnInit, OnDestroy {
40
40
  isFilterApplied: boolean;
41
41
  isPageLoading: boolean;
42
42
  isError: boolean;
43
+ accessChecked: boolean;
44
+ allowed: boolean;
43
45
  private readonly destroy$;
44
46
  private libSub?;
45
47
  constructor(ngbModal: NgbModal, router: Router, route: ActivatedRoute, storeBuilderService: StoreBuilderService, gs: GlobalStateService, toast: ToastService, pageInfo: PageInfoService);
46
- ngOnInit(): void;
48
+ ngOnInit(): Promise<void>;
47
49
  setPageData(): void;
50
+ /** Resolve whether the session user may access the Fixture Library. Never throws. */
51
+ private checkAccess;
48
52
  getFixturesList(): void;
49
53
  getFixtureSizesList(): void;
50
54
  downloadEmptyTemplate(): void;
@@ -0,0 +1,50 @@
1
+ import { OnDestroy, OnInit } from "@angular/core";
2
+ import { Router } from "@angular/router";
3
+ import { GlobalStateService } from "tango-app-ui-global";
4
+ import { ToastService } from "tango-app-ui-shared";
5
+ import { StoreBuilderService } from "../../../services/store-builder.service";
6
+ import * as i0 from "@angular/core";
7
+ interface StoreTouchupOption {
8
+ id: string;
9
+ label: string;
10
+ storeId?: string;
11
+ }
12
+ /**
13
+ * Layout Touchup — internal tool selector.
14
+ *
15
+ * Two-step selector (Store → Floor). On "Open Editor", navigates to the
16
+ * existing manage-planogram route with `touchup=1` query param. The existing
17
+ * ManageStorePlanoComponent detects this and switches to touchup behaviour:
18
+ * - status-affecting buttons (publish / assign / redo / revoke) hidden
19
+ * - Save calls /managePlano/updateLayoutTouchup (no task cascade)
20
+ *
21
+ * No canvas rendering or fixture editor lives here — the existing edit-plano
22
+ * surface IS the editor, so the visual is identical to the verification flow.
23
+ */
24
+ export declare class LayoutTouchupComponent implements OnInit, OnDestroy {
25
+ private apiService;
26
+ private gs;
27
+ private toast;
28
+ private router;
29
+ private destroy$;
30
+ clientId: string;
31
+ storeOptions: StoreTouchupOption[];
32
+ selectedStore: StoreTouchupOption | null;
33
+ floorOptions: {
34
+ id: string;
35
+ label: string;
36
+ }[];
37
+ selectedFloorId: string;
38
+ isLoadingStores: boolean;
39
+ isLoadingFloor: boolean;
40
+ constructor(apiService: StoreBuilderService, gs: GlobalStateService, toast: ToastService, router: Router);
41
+ ngOnInit(): void;
42
+ ngOnDestroy(): void;
43
+ loadStores(): void;
44
+ onStoreChange(planoId: string | null): void;
45
+ loadFloorsForPlano(planoId: string): void;
46
+ openEditor(): void;
47
+ static ɵfac: i0.ɵɵFactoryDeclaration<LayoutTouchupComponent, never>;
48
+ static ɵcmp: i0.ɵɵComponentDeclaration<LayoutTouchupComponent, "lib-layout-touchup", never, {}, {}, never, never, false, never>;
49
+ }
50
+ export {};
@@ -0,0 +1,331 @@
1
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, OnDestroy, OnInit, TemplateRef } from "@angular/core";
2
+ import { Location, TitleCasePipe } from "@angular/common";
3
+ import { FormArray, FormBuilder, FormControl, FormGroup } from "@angular/forms";
4
+ import { ActivatedRoute, Router } from "@angular/router";
5
+ import { Subject, Subscription } from "rxjs";
6
+ import { NgbAccordionDirective, NgbModal } from "@ng-bootstrap/ng-bootstrap";
7
+ import * as fabric from "fabric";
8
+ import { GlobalStateService, PageInfoService } from "tango-app-ui-global";
9
+ import { ToastService } from "tango-app-ui-shared";
10
+ import { StoreBuilderService } from "../../../../services/store-builder.service";
11
+ import { DropdownIF } from "../../../../interfaces/plano-general.interface";
12
+ import * as i0 from "@angular/core";
13
+ type BoundFixtureGroup = {
14
+ fixtureGroup: fabric.Group;
15
+ offsetX: number;
16
+ offsetY: number;
17
+ _tempOldTop?: number;
18
+ _tempOldLeft?: number;
19
+ };
20
+ /**
21
+ * Layout Touchup Editor — full clone of ManageStorePlanoComponent for the
22
+ * internal Layout Touchup tool flow.
23
+ *
24
+ * Identical canvas rendering, fixture editor (uses the same 3 standalone tab
25
+ * components from TangoStoreBuilderModule with `revertOnEdit=false` so per-
26
+ * fixture saves don't cascade), and form patching logic — verification /
27
+ * task / publish / assign UI is removed from the template so users can't
28
+ * accidentally mutate task state.
29
+ *
30
+ * Top "Save" calls /managePlano/updateLayoutTouchup which on the backend:
31
+ * - rejects any add/remove of walls / fixtures / entrances / otherElements
32
+ * - upserts geometry + fixture detail fields ONLY
33
+ * - never touches processedTask / planoTaskCompliance / planoCompliance
34
+ * - never flips floor status (verificationStatus, isPlanoApproved, etc.)
35
+ *
36
+ * Maintenance note: keep this file in approximate sync with
37
+ * manage-store-plano.component.ts for canvas-rendering bug fixes. The two are
38
+ * intentionally independent so the verification flow is never destabilized by
39
+ * touchup changes (and vice versa).
40
+ */
41
+ export declare class TouchupEditorComponent implements AfterViewInit, OnDestroy, OnInit {
42
+ private apiService;
43
+ private route;
44
+ private fb;
45
+ private gs;
46
+ private titleCase;
47
+ private toastService;
48
+ private modalService;
49
+ private pageInfo;
50
+ private location;
51
+ private router;
52
+ private cd;
53
+ canvasRef: ElementRef<HTMLCanvasElement>;
54
+ containerRef: ElementRef<HTMLDivElement>;
55
+ noStoreVideoModalRef: TemplateRef<any>;
56
+ applyLogicsModalRef: TemplateRef<any>;
57
+ approveLayoutModalRef: TemplateRef<any>;
58
+ bodyAccordion?: NgbAccordionDirective;
59
+ onResize(): void;
60
+ destroy$: Subject<unknown>;
61
+ clientId: string;
62
+ canvas: fabric.Canvas;
63
+ zoomLevel: number;
64
+ wallThickness: number;
65
+ verticalMargin: number;
66
+ wallBindings: Map<fabric.Group, BoundFixtureGroup[]>;
67
+ layoutForm: FormGroup;
68
+ selectedFloorId: FormControl<string | null>;
69
+ floorsList: DropdownIF[][];
70
+ fixtureConfigSubscriptions: Subscription[];
71
+ fixtureTemplateIdSubscriptions: Subscription[];
72
+ otherElementsSubscriptions: Subscription[];
73
+ planoData: any;
74
+ floorData: any;
75
+ readonly originalFloorData: any;
76
+ cdnUrl: string;
77
+ fixtureTemplates: any[];
78
+ allFixtures: any[];
79
+ allFixtureInstances: any[];
80
+ storeFeedback: any;
81
+ zoneFeedback: any;
82
+ selectedZoneFeedback: any;
83
+ private isClComplianceRow;
84
+ get zonePendingCount(): number;
85
+ get zoneRedoCount(): number;
86
+ get zoneRedoStatus(): boolean;
87
+ get zoneTaskStyle(): {
88
+ name: string;
89
+ class: string;
90
+ };
91
+ get showTopPublish(): boolean;
92
+ get topPublishDisabled(): boolean;
93
+ readonly shouldRevertOnEdit: boolean;
94
+ readonly canMutateStructure: boolean;
95
+ isSyncingZoneResponse: boolean;
96
+ selectedFixture: any;
97
+ selectedFixtureData: any;
98
+ selectedFixtureFeedback: any;
99
+ editFixture: boolean;
100
+ editFixtureSection: "basic-details" | "products" | "vms";
101
+ activeFeedbackTab: "fixture" | "zone";
102
+ editFromTab: "fixture" | "zone";
103
+ submitFixture: boolean;
104
+ highlightedFixtureFormId: string | null;
105
+ storeMetrics: {
106
+ floorCount: number;
107
+ fixtureCount: number;
108
+ vmCount: number;
109
+ };
110
+ isPageLoading: boolean;
111
+ isRightPanelCollapsed: boolean;
112
+ isLeftPanelCollapsed: boolean;
113
+ selectedView: "tree" | "detail";
114
+ publishingState: "layout" | "layout-redo" | "fixture" | "fixture-redo" | "vm" | "vm-redo" | "complete" | "";
115
+ disabledPublish: boolean;
116
+ disableEdit: boolean;
117
+ isSavingLayout: boolean;
118
+ layoutHasUnsavedChanges: boolean;
119
+ taskInfo: any;
120
+ taskStyle: {
121
+ layout: {
122
+ name: string;
123
+ class: string;
124
+ };
125
+ fixture: {
126
+ name: string;
127
+ class: string;
128
+ };
129
+ vm: {
130
+ name: string;
131
+ class: string;
132
+ };
133
+ };
134
+ otherElementList: DropdownIF[];
135
+ storeList: any;
136
+ selectedStoreName: any;
137
+ private activeHighlight;
138
+ private cancelHighlightBlink;
139
+ isButtonLoading: boolean;
140
+ isStoreTourLoading: boolean;
141
+ layoutBounds: any;
142
+ showLayout: boolean;
143
+ clCount: number;
144
+ wallCount: number;
145
+ toggle: boolean;
146
+ constructor(apiService: StoreBuilderService, route: ActivatedRoute, fb: FormBuilder, gs: GlobalStateService, titleCase: TitleCasePipe, toastService: ToastService, modalService: NgbModal, pageInfo: PageInfoService, location: Location, router: Router, cd: ChangeDetectorRef);
147
+ ngOnInit(): void;
148
+ ngAfterViewInit(): void;
149
+ updateAllPositions(): Promise<void>;
150
+ applyGroupTransform(selection: fabric.ActiveSelection): void;
151
+ resizeCanvas(): void;
152
+ setupZoomHandlers(): void;
153
+ setPageData(): void;
154
+ onFixtureSave(): void;
155
+ onFixturePageCancel(): Promise<void>;
156
+ onFixtureSubmit(event: any): void;
157
+ togglePanel(side: "left" | "right", action?: boolean): void;
158
+ onFeedbackTabChange(tab: "fixture" | "zone"): void;
159
+ getZoneVerificationFeedback(planoId: string, floorId: string): Promise<unknown>;
160
+ selectZoneFeedback(fixtureId: string): void;
161
+ getStoreFeedback(planoId: string, floorId: string, filter: any, checkPublishState?: boolean): Promise<unknown>;
162
+ calculatePublishingState(): void;
163
+ getTemplate(fixtureConfigId: string): Promise<Object>;
164
+ processLayoutFeedback(storeFeedback: any[]): Promise<void>;
165
+ processFixtureFeedback(storeFeedback: any[]): void;
166
+ processVmFeedback(storeFeedback: any[]): void;
167
+ transferArrayItem<T = any>(currentArray: T[], targetArray: T[], currentIndex: number, targetIndex: number): void;
168
+ reorderFixture(floorData: any): void;
169
+ getElementValue(group: any): any;
170
+ private getWallByNumber;
171
+ roundToTwo(num: number): number;
172
+ getStoreFixtures(storeId: string, enable?: boolean): Promise<void>;
173
+ extractAllFixtures(floorData: any): void;
174
+ renderFloor(update?: boolean): Promise<void>;
175
+ drawInitialContent(): Promise<void>;
176
+ private getFullLayoutBounds;
177
+ private fitCanvasToLayoutAnimated;
178
+ drawLayoutElements(): Promise<true | undefined>;
179
+ private isPointInsidePolygon;
180
+ private getOccupiedRects;
181
+ private rectsOverlap;
182
+ private computeEmptyMargin;
183
+ drawFixtureRowLabel(text: string, x: number, y: number): void;
184
+ drawWall(canvas: fabric.Canvas, x: number, y: number, height: number, width: number, elementData: any): Promise<fabric.Group & {
185
+ objType: string;
186
+ data: any;
187
+ }>;
188
+ drawFixture(canvas: fabric.Canvas, x: number, y: number, height: number, width: number, fixtureData: any): Promise<(fabric.Group & {
189
+ wallIndex: number;
190
+ fixtureIndex: number;
191
+ fixtureId: string;
192
+ fixtureType: "wall" | "floor";
193
+ issue: boolean;
194
+ issueData: any;
195
+ taskType: string;
196
+ vmConfig: [];
197
+ objType: string;
198
+ }) | undefined>;
199
+ drawEntrance(canvas: fabric.Canvas, x: number, y: number, width: number, height: number, arrowWidth: number, elementData: any): void;
200
+ drawOtherElementsWithLabel(canvas: fabric.Canvas, x: number, y: number, a: number, width: number, height: number, element: any): fabric.Group;
201
+ drawBg(): void;
202
+ subscribeToFixtureConfigIdChanges(): void;
203
+ subscribeToOtherElementsChanges(): void;
204
+ updateCanvasOtherElementLabel(elementRef: any): void;
205
+ rotateCanvas(canvas: fabric.Canvas, angleDeg: number): void;
206
+ selectFixtureOnCanvasClick(target: any, collapseTaskInfo?: boolean): void;
207
+ selectFixtureFeedback(fixtureId: string, collapseTaskInfo?: boolean): void;
208
+ getFixtureTemplates(): Promise<void>;
209
+ createForm(): void;
210
+ get getFormWalls(): FormArray<any>;
211
+ get getFormFloorFixtures(): FormArray<any>;
212
+ get getFormFloorOtherElements(): FormArray<any>;
213
+ get getEntrances(): any;
214
+ get showFixturePreview(): boolean;
215
+ getWallOtherElements(wallIndex: number): FormArray<any>;
216
+ getFormFixtures(wallIndex: number): FormArray<any>;
217
+ patchWallElements({ elementType, elementNumber }: Record<string, any>): FormGroup<{
218
+ elementType: FormControl<any>;
219
+ elementNumber: FormControl<any>;
220
+ fixtures: FormArray<FormControl<unknown>>;
221
+ otherElements: FormArray<FormControl<unknown>>;
222
+ }>;
223
+ patchFixture({ fixtureName, fixtureConfigId, _id }: Record<string, any>): FormGroup<{
224
+ fixtureName: FormControl<any>;
225
+ fixtureConfigId: FormControl<any>;
226
+ _id: FormControl<any>;
227
+ }>;
228
+ addWallSpace(wallIndex: number, operation: "increment" | "decrement"): void;
229
+ deleteFixture(fixtureType: "wall" | "floor", fixtureIndex: number, wallIndex?: number): void;
230
+ private hasUnsavedLayoutChanges;
231
+ removeOtherElement(elementType: "wall" | "floor", elementIndex: number, wallIndex?: number): void;
232
+ changeFixtureTemplate(configId: string, fixtureType: "wall" | "floor", fixtureIndex: number, wallIndex?: number): void;
233
+ onDrop(event: any, destinationWallIndex: number | "floor", destinationFixtureIndex?: number): void;
234
+ downloadCanvas(): void;
235
+ private createExportLayoutBackground;
236
+ private buildLayoutPolygonFromWalls;
237
+ handleFeedbackAction(userAction: any): Promise<void>;
238
+ private mergeAiFixtureData;
239
+ private replaceFixtureInFloorData;
240
+ private buildLocalActionComment;
241
+ private mergeZoneFixtureData;
242
+ handleZoneFeedbackAction(userAction: any): Promise<void>;
243
+ private buildZoneModifiedAnswer;
244
+ private persistZoneEditAccepted;
245
+ rotateWall(eleNumber: number): void;
246
+ addNewWall(eleNumber: number): void;
247
+ addNewEntrance(): void;
248
+ private isAddingFixture;
249
+ addNewFixture(fixtureType: "wall" | "floor", wallIndex?: number): Promise<void>;
250
+ private addNewFixtureInternal;
251
+ addNewOtherElements(posType: "wall" | "floor", wallIndex?: number): void;
252
+ findEmptyCenterSpot(objectWidthPx: number, objectHeightPx: number, tempOccupied?: {
253
+ x: number;
254
+ y: number;
255
+ width: number;
256
+ height: number;
257
+ }[]): {
258
+ x: number;
259
+ y: number;
260
+ } | null;
261
+ cancelEdit(): Promise<void>;
262
+ listenToDeleteKey(): void;
263
+ deleteEntrance(): void;
264
+ deleteWall(eleNumber: number): Promise<void>;
265
+ updateWallElementNumber(): void;
266
+ toPixels(value: number, unit: string, dpi?: number): number;
267
+ fromPixels(pixels: number, unit: string, dpi?: number): number;
268
+ confirmEdit(): Promise<boolean>;
269
+ confirmDeleteWall(): Promise<boolean>;
270
+ updateFixtureCoordinates(fixtures?: any): void;
271
+ updateOtherElementsCoordinates(): void;
272
+ updateWallCoordinates(): void;
273
+ updateEntranceCoordinates(): void;
274
+ /**
275
+ * Touchup save — calls /managePlano/updateLayoutTouchup which never wipes
276
+ * task rows or flips floor status. Shows a touchup-specific confirm dialog
277
+ * (the original verification flow's confirmEdit warns about resetting
278
+ * progress — not applicable here).
279
+ *
280
+ * editMode arg is kept for template parity with manage-store-plano's Save
281
+ * button, but is ignored — every touchup save behaves the same way.
282
+ */
283
+ updateLayout(_editMode?: boolean): Promise<void>;
284
+ /**
285
+ * Layout Touchup — Sync zone response.
286
+ *
287
+ * For each zone-verification compliance row on this floor, rewrites
288
+ * `answers[0].shelfConfig` to match the fixture's current shelves: shelf
289
+ * count + per-shelf zone come from the fixture, user-submitted
290
+ * productBrandName / productCategory are preserved (zone-normalized for
291
+ * newly added shelves). See /managePlano/syncZoneResponseFromFixtures on
292
+ * the BE.
293
+ *
294
+ * Only available in non-edit mode (gated in template via *ngIf="!layoutForm.enabled").
295
+ */
296
+ syncZoneResponse(): Promise<void>;
297
+ assignTask(): Promise<void>;
298
+ revokeZoneTask(): void;
299
+ publishZoneVerification(): Promise<void>;
300
+ publishZoneRedo(): Promise<void>;
301
+ onClickEdit(): void;
302
+ taskDetails(planoId: any, floorId: any): Promise<unknown>;
303
+ getStatus(type: any): {
304
+ name: string;
305
+ class: string;
306
+ };
307
+ getElementNumber(group: any): number | null;
308
+ highlightFixture(group: any, blink?: boolean): void;
309
+ removeHighlight(): void;
310
+ keepHighlightOnTop: () => void;
311
+ highlightFixtureInAccordion(fixtureData: any): void;
312
+ onChangeFixtureOnFeedbackPanel({ currentFixture, action, }: {
313
+ currentFixture?: string;
314
+ action?: "next" | "previous";
315
+ }, collapseTaskInfo?: boolean): void;
316
+ revokeTask(): void;
317
+ publish(): void;
318
+ goToStoreTourPage(): Promise<void>;
319
+ openNoVideoFoundModal(): Promise<void>;
320
+ goToStoreCameraPage(): void;
321
+ getStoreList(planoId?: string): void;
322
+ onSelected(event: any): Promise<void>;
323
+ applyPIDLogics(): Promise<void>;
324
+ onClickApplyLogics(): Promise<void>;
325
+ onClickApproveLayout(): Promise<void>;
326
+ approveLayout(): Promise<void>;
327
+ ngOnDestroy(): void;
328
+ static ɵfac: i0.ɵɵFactoryDeclaration<TouchupEditorComponent, never>;
329
+ static ɵcmp: i0.ɵɵComponentDeclaration<TouchupEditorComponent, "lib-touchup-editor", never, {}, {}, never, never, false, never>;
330
+ }
331
+ export {};
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class ToolPageHeaderComponent {
3
+ title: string;
4
+ description: string;
5
+ backLink: string;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToolPageHeaderComponent, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToolPageHeaderComponent, "lib-tool-page-header", never, { "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "backLink": { "alias": "backLink"; "required": false; }; }, {}, never, never, false, never>;
8
+ }
@@ -1,16 +1,18 @@
1
1
  import { OnInit } from "@angular/core";
2
2
  import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
3
- import { GlobalStateService } from "tango-app-ui-global";
3
+ import { GlobalStateService, PageInfoService } from "tango-app-ui-global";
4
4
  import { Router } from "@angular/router";
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class ToolsParentComponent implements OnInit {
7
7
  private ngbModal;
8
8
  private router;
9
9
  private gs;
10
+ private pageInfo;
10
11
  clientId: string;
11
12
  private readonly destroy$;
12
- constructor(ngbModal: NgbModal, router: Router, gs: GlobalStateService);
13
+ constructor(ngbModal: NgbModal, router: Router, gs: GlobalStateService, pageInfo: PageInfoService);
13
14
  ngOnInit(): void;
15
+ setPageData(): void;
14
16
  onClickCreateFixtureTemplate(): void;
15
17
  ngOnDestroy(): void;
16
18
  static ɵfac: i0.ɵɵFactoryDeclaration<ToolsParentComponent, never>;
@@ -0,0 +1,9 @@
1
+ import { CanActivateFn } from '@angular/router';
2
+ /**
3
+ * Route guard for the Find & Replace pages. Allows navigation only when the
4
+ * session user's email is in the planostaticdatas `allowedFindReplaceUsers`
5
+ * allowlist (checked server-side via StoreBuilderService.getFindReplaceAccess).
6
+ * Denied users — and any error resolving access — are redirected to the shared
7
+ * Access-denied view. Same email-based mechanism the Looks feature uses.
8
+ */
9
+ export declare const findReplaceAccessGuard: CanActivateFn;
@@ -20,4 +20,13 @@ export declare function uniqueFieldInFormArrayValidator(fieldName: string): Vali
20
20
  export declare const getNameFromEmail: (email: string) => string;
21
21
  export declare const indianPincodeValidator: () => ValidatorFn;
22
22
  export declare const getFixtureCanvasLabel: (fixture: any) => string;
23
+ /**
24
+ * Computes a fixture's product capacity as the live sum of its individual
25
+ * shelf capacities, mirroring the backend rule: a tray holds
26
+ * productPerShelf x trayRows, a plain shelf holds productPerShelf, and
27
+ * VM-only shelves carry no products. Always derive the displayed "Products"
28
+ * count from this (the shelf config) rather than the stored fixtureCapacity,
29
+ * which can be stale relative to the current shelves.
30
+ */
31
+ export declare const getFixtureProductCapacity: (shelfConfig: any) => number;
23
32
  export declare const lightenColor: (hex: string, amount?: number) => string;
@@ -79,6 +79,16 @@ export declare class StoreBuilderService implements OnDestroy {
79
79
  updateApprovalStatus(data: any): import("rxjs").Observable<Object>;
80
80
  getStoreFixturesfeedback(data: any): import("rxjs").Observable<Object>;
81
81
  updateStorePlano(data: any): import("rxjs").Observable<Object>;
82
+ updateLayoutTouchup(data: {
83
+ planoId: string;
84
+ floorId: string;
85
+ data: any;
86
+ }): import("rxjs").Observable<Object>;
87
+ getStoresForTouchup(): import("rxjs").Observable<Object>;
88
+ syncZoneResponseFromFixtures(data: {
89
+ planoId: string;
90
+ floorId: string;
91
+ }): import("rxjs").Observable<Object>;
82
92
  getStoreFeedback(data: any): import("rxjs").Observable<Object>;
83
93
  getRolloutFeedback(data: any): import("rxjs").Observable<Object>;
84
94
  getZoneVerificationFeedback(data: any): import("rxjs").Observable<Object>;
@@ -272,6 +282,12 @@ export declare class StoreBuilderService implements OnDestroy {
272
282
  storeNames: string[];
273
283
  vmName: string;
274
284
  }): import("rxjs").Observable<Object>;
285
+ /** Whether the current session user may access Find & Replace
286
+ * (email present in planostaticdatas `allowedFindReplaceUsers`). */
287
+ getFindReplaceAccess(): import("rxjs").Observable<Object>;
288
+ /** Whether the current session user may access the Fixture Library
289
+ * (email present in planostaticdatas `allowedFixtureLibraryUsers`). */
290
+ getFixtureLibraryAccess(): import("rxjs").Observable<Object>;
275
291
  /** Whether the current session user may access the Looks feature
276
292
  * (email present in planostaticdatas `allowedLookUsers`). */
277
293
  getLookAccess(): import("rxjs").Observable<Object>;