tango-app-ui-manage-tickets 3.7.0-beta.69 → 3.7.0-beta.70

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 (177) hide show
  1. package/.eslintrc.json +37 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +12 -25
  4. package/src/lib/components/add-csm-modal/add-csm-modal.component.html +32 -0
  5. package/src/lib/components/add-csm-modal/add-csm-modal.component.scss +14 -0
  6. package/src/lib/components/add-csm-modal/add-csm-modal.component.spec.ts +23 -0
  7. package/src/lib/components/add-csm-modal/add-csm-modal.component.ts +94 -0
  8. package/src/lib/components/audit-log/audit-log.component.html +1 -0
  9. package/src/lib/components/audit-log/audit-log.component.scss +0 -0
  10. package/src/lib/components/audit-log/audit-log.component.spec.ts +23 -0
  11. package/src/lib/components/audit-log/audit-log.component.ts +10 -0
  12. package/src/lib/components/audit-mapping-list/audit-mapping-list.component.html +234 -0
  13. package/src/lib/components/audit-mapping-list/audit-mapping-list.component.scss +186 -0
  14. package/src/lib/components/audit-mapping-list/audit-mapping-list.component.spec.ts +23 -0
  15. package/src/lib/components/audit-mapping-list/audit-mapping-list.component.ts +536 -0
  16. package/src/lib/components/audit-metrics/audit-metrics.component.html +345 -0
  17. package/src/lib/components/audit-metrics/audit-metrics.component.scss +34 -0
  18. package/src/lib/components/audit-metrics/audit-metrics.component.spec.ts +23 -0
  19. package/src/lib/components/audit-metrics/audit-metrics.component.ts +292 -0
  20. package/src/lib/components/audit-report-popup/audit-report-popup.component.html +111 -0
  21. package/src/lib/components/audit-report-popup/audit-report-popup.component.scss +101 -0
  22. package/src/lib/components/audit-report-popup/audit-report-popup.component.spec.ts +23 -0
  23. package/src/lib/components/audit-report-popup/audit-report-popup.component.ts +397 -0
  24. package/src/lib/components/audit-retag/audit-retag.component.html +129 -0
  25. package/src/lib/components/audit-retag/audit-retag.component.scss +146 -0
  26. package/src/lib/components/audit-retag/audit-retag.component.spec.ts +23 -0
  27. package/src/lib/components/audit-retag/audit-retag.component.ts +497 -0
  28. package/src/lib/components/comment-model/comment-model.component.html +24 -0
  29. package/src/lib/components/comment-model/comment-model.component.scss +20 -0
  30. package/src/lib/components/comment-model/comment-model.component.spec.ts +23 -0
  31. package/src/lib/components/comment-model/comment-model.component.ts +53 -0
  32. package/src/lib/components/count/count.component.html +54 -0
  33. package/src/lib/components/count/count.component.scss +14 -0
  34. package/src/lib/components/count/count.component.spec.ts +23 -0
  35. package/src/lib/components/count/count.component.ts +82 -0
  36. package/src/lib/components/custom-select/custom-select.component.html +134 -0
  37. package/src/lib/components/custom-select/custom-select.component.scss +204 -0
  38. package/src/lib/components/custom-select/custom-select.component.spec.ts +23 -0
  39. package/src/lib/components/custom-select/custom-select.component.ts +189 -0
  40. package/src/lib/components/filter-options/filter-options.component.html +51 -0
  41. package/src/lib/components/filter-options/filter-options.component.scss +102 -0
  42. package/src/lib/components/filter-options/filter-options.component.spec.ts +23 -0
  43. package/src/lib/components/filter-options/filter-options.component.ts +38 -0
  44. package/src/lib/components/footfall-dic/footfall-dic.component.html +1275 -0
  45. package/src/lib/components/footfall-dic/footfall-dic.component.scss +273 -0
  46. package/src/lib/components/footfall-dic/footfall-dic.component.spec.ts +23 -0
  47. package/src/lib/components/footfall-dic/footfall-dic.component.ts +1206 -0
  48. package/src/lib/components/footfall-dicview/footfall-dicview.component.html +1136 -0
  49. package/src/lib/components/footfall-dicview/footfall-dicview.component.scss +416 -0
  50. package/src/lib/components/footfall-dicview/footfall-dicview.component.spec.ts +23 -0
  51. package/src/lib/components/footfall-dicview/footfall-dicview.component.ts +1168 -0
  52. package/src/lib/components/footfall-popup/footfall-popup.component.html +61 -0
  53. package/src/lib/components/footfall-popup/footfall-popup.component.scss +20 -0
  54. package/src/lib/components/footfall-popup/footfall-popup.component.spec.ts +23 -0
  55. package/src/lib/components/footfall-popup/footfall-popup.component.ts +12 -0
  56. package/src/lib/components/group-select/group-select.component.html +44 -0
  57. package/src/lib/components/group-select/group-select.component.scss +144 -0
  58. package/src/lib/components/group-select/group-select.component.spec.ts +23 -0
  59. package/src/lib/components/group-select/group-select.component.ts +145 -0
  60. package/src/lib/components/re-trigger/re-trigger.component.html +53 -0
  61. package/src/lib/components/re-trigger/re-trigger.component.scss +16 -0
  62. package/src/lib/components/re-trigger/re-trigger.component.spec.ts +23 -0
  63. package/src/lib/components/re-trigger/re-trigger.component.ts +96 -0
  64. package/src/lib/components/reactive-select/reactive-select.component.html +18 -0
  65. package/src/lib/components/reactive-select/reactive-select.component.scss +52 -0
  66. package/src/lib/components/reactive-select/reactive-select.component.spec.ts +23 -0
  67. package/src/lib/components/reactive-select/reactive-select.component.ts +104 -0
  68. package/src/lib/components/remove-audit/remove-audit.component.html +38 -0
  69. package/src/lib/components/remove-audit/remove-audit.component.scss +27 -0
  70. package/src/lib/components/remove-audit/remove-audit.component.spec.ts +23 -0
  71. package/src/lib/components/remove-audit/remove-audit.component.ts +81 -0
  72. package/src/lib/components/start-audit/start-audit.component.html +174 -0
  73. package/src/lib/components/start-audit/start-audit.component.scss +185 -0
  74. package/src/lib/components/start-audit/start-audit.component.spec.ts +23 -0
  75. package/src/lib/components/start-audit/start-audit.component.ts +772 -0
  76. package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.html +43 -0
  77. package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.scss +35 -0
  78. package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.spec.ts +23 -0
  79. package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.ts +118 -0
  80. package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.html +386 -0
  81. package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.scss +87 -0
  82. package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.spec.ts +23 -0
  83. package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.ts +493 -0
  84. package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.html +3751 -0
  85. package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.scss +1240 -0
  86. package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.spec.ts +23 -0
  87. package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.ts +2863 -0
  88. package/src/lib/components/ticketclosepopup/ticketclosepopup.component.html +100 -0
  89. package/src/lib/components/ticketclosepopup/ticketclosepopup.component.scss +34 -0
  90. package/src/lib/components/ticketclosepopup/ticketclosepopup.component.spec.ts +23 -0
  91. package/src/lib/components/ticketclosepopup/ticketclosepopup.component.ts +48 -0
  92. package/src/lib/components/tickets/tickets.component.html +451 -0
  93. package/src/lib/components/tickets/tickets.component.scss +131 -0
  94. package/src/lib/components/tickets/tickets.component.spec.ts +23 -0
  95. package/src/lib/components/tickets/tickets.component.ts +809 -0
  96. package/src/lib/components/viewcategory/viewcategory.component.html +38 -0
  97. package/src/lib/components/viewcategory/viewcategory.component.scss +29 -0
  98. package/src/lib/components/viewcategory/viewcategory.component.spec.ts +23 -0
  99. package/src/lib/components/viewcategory/viewcategory.component.ts +79 -0
  100. package/src/lib/services/audit.service.spec.ts +16 -0
  101. package/src/lib/services/audit.service.ts +98 -0
  102. package/src/lib/services/excel.service.ts +48 -0
  103. package/src/lib/services/ticket.service.spec.ts +16 -0
  104. package/src/lib/services/ticket.service.ts +501 -0
  105. package/src/lib/services/timer.service.spec.ts +16 -0
  106. package/src/lib/services/timer.service.ts +92 -0
  107. package/src/lib/tango-manage-tickets-routing.module.ts +37 -0
  108. package/src/lib/tango-manage-tickets.module.ts +68 -0
  109. package/{public-api.d.ts → src/public-api.ts} +8 -2
  110. package/tsconfig.lib.json +14 -0
  111. package/tsconfig.lib.prod.json +10 -0
  112. package/tsconfig.spec.json +14 -0
  113. package/esm2022/lib/components/add-csm-modal/add-csm-modal.component.mjs +0 -98
  114. package/esm2022/lib/components/audit-log/audit-log.component.mjs +0 -11
  115. package/esm2022/lib/components/audit-mapping-list/audit-mapping-list.component.mjs +0 -498
  116. package/esm2022/lib/components/audit-metrics/audit-metrics.component.mjs +0 -298
  117. package/esm2022/lib/components/audit-report-popup/audit-report-popup.component.mjs +0 -389
  118. package/esm2022/lib/components/audit-retag/audit-retag.component.mjs +0 -480
  119. package/esm2022/lib/components/comment-model/comment-model.component.mjs +0 -58
  120. package/esm2022/lib/components/count/count.component.mjs +0 -89
  121. package/esm2022/lib/components/custom-select/custom-select.component.mjs +0 -187
  122. package/esm2022/lib/components/filter-options/filter-options.component.mjs +0 -41
  123. package/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +0 -1061
  124. package/esm2022/lib/components/footfall-dicview/footfall-dicview.component.mjs +0 -1014
  125. package/esm2022/lib/components/footfall-popup/footfall-popup.component.mjs +0 -15
  126. package/esm2022/lib/components/group-select/group-select.component.mjs +0 -155
  127. package/esm2022/lib/components/re-trigger/re-trigger.component.mjs +0 -96
  128. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +0 -108
  129. package/esm2022/lib/components/remove-audit/remove-audit.component.mjs +0 -81
  130. package/esm2022/lib/components/start-audit/start-audit.component.mjs +0 -758
  131. package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +0 -131
  132. package/esm2022/lib/components/ticket-filter-panel/ticket-filter-panel.component.mjs +0 -435
  133. package/esm2022/lib/components/ticket-footfall-new/ticket-footfall-new.component.mjs +0 -2414
  134. package/esm2022/lib/components/ticketclosepopup/ticketclosepopup.component.mjs +0 -43
  135. package/esm2022/lib/components/tickets/tickets.component.mjs +0 -847
  136. package/esm2022/lib/components/viewcategory/viewcategory.component.mjs +0 -89
  137. package/esm2022/lib/services/audit.service.mjs +0 -88
  138. package/esm2022/lib/services/excel.service.mjs +0 -45
  139. package/esm2022/lib/services/ticket.service.mjs +0 -319
  140. package/esm2022/lib/services/timer.service.mjs +0 -84
  141. package/esm2022/lib/tango-manage-tickets-routing.module.mjs +0 -44
  142. package/esm2022/lib/tango-manage-tickets.module.mjs +0 -109
  143. package/esm2022/public-api.mjs +0 -6
  144. package/esm2022/tango-app-ui-manage-tickets.mjs +0 -5
  145. package/fesm2022/tango-app-ui-manage-tickets.mjs +0 -9848
  146. package/fesm2022/tango-app-ui-manage-tickets.mjs.map +0 -1
  147. package/index.d.ts +0 -5
  148. package/lib/components/add-csm-modal/add-csm-modal.component.d.ts +0 -30
  149. package/lib/components/audit-log/audit-log.component.d.ts +0 -5
  150. package/lib/components/audit-mapping-list/audit-mapping-list.component.d.ts +0 -73
  151. package/lib/components/audit-metrics/audit-metrics.component.d.ts +0 -59
  152. package/lib/components/audit-report-popup/audit-report-popup.component.d.ts +0 -52
  153. package/lib/components/audit-retag/audit-retag.component.d.ts +0 -59
  154. package/lib/components/comment-model/comment-model.component.d.ts +0 -17
  155. package/lib/components/count/count.component.d.ts +0 -23
  156. package/lib/components/custom-select/custom-select.component.d.ts +0 -35
  157. package/lib/components/filter-options/filter-options.component.d.ts +0 -15
  158. package/lib/components/footfall-dic/footfall-dic.component.d.ts +0 -143
  159. package/lib/components/footfall-dicview/footfall-dicview.component.d.ts +0 -132
  160. package/lib/components/footfall-popup/footfall-popup.component.d.ts +0 -8
  161. package/lib/components/group-select/group-select.component.d.ts +0 -33
  162. package/lib/components/re-trigger/re-trigger.component.d.ts +0 -32
  163. package/lib/components/reactive-select/reactive-select.component.d.ts +0 -32
  164. package/lib/components/remove-audit/remove-audit.component.d.ts +0 -16
  165. package/lib/components/start-audit/start-audit.component.d.ts +0 -86
  166. package/lib/components/tango-manage-tickets/tango-manage-tickets.component.d.ts +0 -28
  167. package/lib/components/ticket-filter-panel/ticket-filter-panel.component.d.ts +0 -79
  168. package/lib/components/ticket-footfall-new/ticket-footfall-new.component.d.ts +0 -291
  169. package/lib/components/ticketclosepopup/ticketclosepopup.component.d.ts +0 -15
  170. package/lib/components/tickets/tickets.component.d.ts +0 -88
  171. package/lib/components/viewcategory/viewcategory.component.d.ts +0 -16
  172. package/lib/services/audit.service.d.ts +0 -36
  173. package/lib/services/excel.service.d.ts +0 -10
  174. package/lib/services/ticket.service.d.ts +0 -87
  175. package/lib/services/timer.service.d.ts +0 -22
  176. package/lib/tango-manage-tickets-routing.module.d.ts +0 -7
  177. package/lib/tango-manage-tickets.module.d.ts +0 -38
@@ -0,0 +1,3751 @@
1
+ <section *ngIf="select ==='ticketList'">
2
+ <div class="row ms-3 my-3">
3
+ <ul *ngIf="usersDetails?.userType === 'tango'"
4
+ class="nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap">
5
+ <li class="nav-item">
6
+ <a [ngClass]="tangoType === 'store' ? 'active' : ''" (click)="viewTicket('store')"
7
+ class="nav-link cursor-pointer no-border me-3">
8
+ Tickets
9
+ </a>
10
+ </li>
11
+ <li class="nav-item">
12
+ <a [ngClass]="tangoType === 'internal' ? 'active' : ''" (click)="viewTicket('internal')"
13
+ class="nav-link cursor-pointer no-border me-3"> Internal audit
14
+ </a>
15
+ </li>
16
+ </ul>
17
+ <ul *ngIf="hasApproverAccess && hasReviewerAccess && usersDetails?.userType !== 'tango'"
18
+ class="nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap">
19
+ <!-- Approver tab -->
20
+ <li class="nav-item" *ngIf="hasApproverAccess">
21
+ <a [ngClass]="selectedRole === 'approver' ? 'active' : ''"
22
+ class="nav-link cursor-pointer no-border me-3" (click)="SelectedRole('approver')">
23
+ Approver
24
+ </a>
25
+ </li>
26
+
27
+ <!-- Reviewer tab -->
28
+ <li class="nav-item" *ngIf="hasReviewerAccess">
29
+ <a [ngClass]="selectedRole === 'reviewer' ? 'active' : ''"
30
+ class="nav-link cursor-pointer no-border me-3" (click)="SelectedRole('reviewer')">
31
+ Reviewer
32
+ </a>
33
+ </li>
34
+ </ul>
35
+
36
+ </div>
37
+ <div class="row">
38
+ <div class="mb-3 col-md-12">
39
+ <div class="card">
40
+ <div class="card-header ellipse1 px-5">
41
+ <div class="my-0">
42
+ <h5 class="card-title my-0">{{ getFootfallSummaryData?.totalTickets !== null ?
43
+ getFootfallSummaryData?.totalTickets : '--' }}</h5>
44
+ <span class="sub-header">Total tickets</span>
45
+ </div>
46
+ <div *ngIf="getFootfallSummaryData?.averageAccuracyOverAll !== null &&
47
+ getFootfallSummaryData?.averageAccuracyOverAll !== undefined" class="card-toolbar">
48
+ <div class="my-0">
49
+ <h5 class="card-title my-0">{{ getFootfallSummaryData?.averageAccuracyOverAll !== null ?
50
+ getFootfallSummaryData?.averageAccuracyOverAll : '--' }}</h5>
51
+ <span class="sub-header">Average accuracy (Overall)</span>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ <div class="card-body py-2 px-5">
56
+ <div class="row">
57
+ <div *ngIf="getFootfallSummaryData?.openTickets !== null &&
58
+ getFootfallSummaryData?.openTickets !== undefined" class="col my-3">
59
+ <h5 class="card-title">{{ getFootfallSummaryData?.openTickets !== null ?
60
+ getFootfallSummaryData?.openTickets : '--' }}</h5>
61
+ <span class="card-title-sub-header">Open</span>
62
+ </div>
63
+ <div *ngIf="getFootfallSummaryData?.openInfraIssues !== null &&
64
+ getFootfallSummaryData?.openInfraIssues !== undefined" class="col my-3">
65
+ <h5 class="card-title">{{ getFootfallSummaryData?.openInfraIssues !== null ?
66
+ getFootfallSummaryData?.openInfraIssues : '--' }}</h5>
67
+ <span class="card-title-sub-header">Open-Infra Issue</span>
68
+ </div>
69
+ <div *ngIf="getFootfallSummaryData?.inprogress !== null &&
70
+ getFootfallSummaryData?.inprogress !== undefined" class="col my-3">
71
+ <h5 class="card-title">{{ getFootfallSummaryData?.inprogress !== null ?
72
+ getFootfallSummaryData?.inprogress : '--' }}</h5>
73
+ <span class="card-title-sub-header">In-progress</span>
74
+ </div>
75
+ <div *ngIf="getFootfallSummaryData?.closedTickets !== null &&
76
+ getFootfallSummaryData?.closedTickets !== undefined" class="col my-3">
77
+ <h5 class="card-title">{{ getFootfallSummaryData?.closedTickets !== null ?
78
+ getFootfallSummaryData?.closedTickets : '--' }}</h5>
79
+ <span class="card-title-sub-header">Closed</span>
80
+ </div>
81
+
82
+ <div *ngIf="getFootfallSummaryData?.dueToday !== null &&
83
+ getFootfallSummaryData?.dueToday !== undefined" class="col my-3 ">
84
+ <h5 style="color:#DC6803 !important" class="card-title">{{ getFootfallSummaryData?.dueToday
85
+ !== null ?
86
+ getFootfallSummaryData?.dueToday : '--' }}</h5>
87
+ <span class="card-title-sub-header" style="color:#DC6803 !important">Due today</span>
88
+ </div>
89
+
90
+ <div *ngIf="getFootfallSummaryData?.Expired !== null &&
91
+ getFootfallSummaryData?.Expired !== undefined" class="col my-3 ">
92
+ <h5 class="card-title">{{ getFootfallSummaryData?.Expired !== null ?
93
+ getFootfallSummaryData?.Expired : '--' }}</h5>
94
+ <span class="card-title-sub-header">Expired</span>
95
+ </div>
96
+
97
+ <div *ngIf="getFootfallSummaryData?.underTangoReview !== null &&
98
+ getFootfallSummaryData?.underTangoReview !== undefined" class="col my-3 ">
99
+ <h5 class="card-title">{{ getFootfallSummaryData?.underTangoReview !== null ?
100
+ getFootfallSummaryData?.underTangoReview : '--' }}</h5>
101
+ <span class="card-title-sub-header">Under tango review</span>
102
+ </div>
103
+ </div>
104
+
105
+ </div>
106
+ </div>
107
+ </div>
108
+
109
+ <!-- <div class="col-md-3 mb-3">
110
+ <div class="card">
111
+ <div class="card-header ellipse1 py-1 px-5">
112
+ <div *ngIf="getFootfallSummaryData?.ticketAccuracyAbove !== null &&
113
+ getFootfallSummaryData?.ticketAccuracyAbove !== undefined" class="my-0">
114
+ <h5 class="card-title mt-0">{{ getFootfallSummaryData?.ticketAccuracyAbove !== null ?
115
+ getFootfallSummaryData?.ticketAccuracyAbove : '--' }}</h5>
116
+ <div class="sub-header">Tickets with Accuracy Above {{clientData?.tangoReview ?
117
+ clientData?.tangoReview:'85%'}}</div>
118
+ </div>
119
+ <div *ngIf="getFootfallSummaryData?.avgTicket !== null &&
120
+ getFootfallSummaryData?.avgTicket !== undefined" class="my-0">
121
+ <h5 class="card-title mt-0">{{ getFootfallSummaryData?.avgTicket !== null ?
122
+ getFootfallSummaryData?.avgTicket : '--' }}</h5>
123
+ <div class="sub-header">Average ticket %</div>
124
+ </div>
125
+ </div>
126
+ <div class="card-body py-2 px-5">
127
+ <div class="row">
128
+ <div *ngIf="getFootfallSummaryData?.ticketAccuracyBelow !== null &&
129
+ getFootfallSummaryData?.ticketAccuracyBelow !== undefined"
130
+ class="col-lg-12 col-xl-12 col-md-12 my-3">
131
+ <h5 class="card-title">{{ getFootfallSummaryData?.ticketAccuracyBelow !== null ?
132
+ getFootfallSummaryData?.ticketAccuracyBelow : '--' }}</h5>
133
+ <span class="card-title-sub-header">Tickets with Accuracy Below {{clientData?.tangoReview ?
134
+ clientData?.tangoReview:'85%'}}</span>
135
+ </div>
136
+ <div *ngIf="getFootfallSummaryData?.avgAccuracy !== null &&
137
+ getFootfallSummaryData?.avgAccuracy !== undefined" class="col-lg-12 col-xl-12 col-md-12 my-3">
138
+ <h5 class="card-title">{{ getFootfallSummaryData?.avgAccuracy !== null ?
139
+ getFootfallSummaryData?.avgAccuracy : '--' }}</h5>
140
+ <span class="card-title-sub-header">Average accuracy%</span>
141
+ </div>
142
+ </div>
143
+
144
+ </div>
145
+ </div>
146
+ </div> -->
147
+ </div>
148
+ <div class="card">
149
+ <div class="card-header border-0 pt-3">
150
+ <h3 class="card-title align-items-start flex-column">
151
+ <span class="card-label mb-2" *ngIf="tangoType==='store'"><span
152
+ *ngIf="usersDetails?.userType !== 'tango'">Ticket Info</span> <span
153
+ *ngIf="usersDetails?.userType === 'tango'">Showing tickets with Accuracy Below
154
+ {{clientData?.tangoReview ? clientData?.tangoReview:'85%'}} </span><span
155
+ class="ms-2 px-3 badge badge-light-primary">{{totalItems}} Total</span></span>
156
+ <span class="card-label mb-2" *ngIf="tangoType==='internal'">Internal Tickets <span
157
+ class="ms-2 px-3 badge badge-light-primary">{{totalItems}} Total</span></span>
158
+ <span class="text-sub mb-2">Based on {{headerFilters?.date?.startDate | date:'dd MMM, yyyy'}} –
159
+ {{headerFilters?.date?.endDate | date:'dd MMM, yyyy'}} </span>
160
+ </h3>
161
+ <div class="card-toolbar">
162
+ <div class="d-flex">
163
+ <div class="d-flex align-items-center position-relative my-1">
164
+ <span class="svg-icon svg-icon-1 position-absolute ms-3">
165
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
166
+ fill="none">
167
+ <rect opacity="0.5" x="17.0365" y="15.1223" width="8.15546" height="2" rx="1"
168
+ transform="rotate(45 17.0365 15.1223)" fill="currentColor"></rect>
169
+ <path
170
+ 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"
171
+ fill="currentColor"></path>
172
+ </svg>
173
+ </span>
174
+ <input type="text" class="form-control ps-14 me-2" placeholder="Search by store"
175
+ autocomplete="off" (change)="searchData()" [(ngModel)]="searchValue" />
176
+ <!-- <section *ngIf="!loading && !noData"> -->
177
+ <button type="button" (click)="filterPanel.open(); $event.stopPropagation()"
178
+ class="btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val">
179
+ <span class="mx-2"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
180
+ viewBox="0 0 20 20" fill="none">
181
+ <path d="M5 10H15M2.5 5H17.5M7.5 15H12.5" stroke="#344054" stroke-width="2"
182
+ stroke-linecap="round" stroke-linejoin="round" />
183
+ </svg></span>Filter
184
+
185
+ </button>
186
+ <lib-ticket-filter-panel #filterPanel [client]="headerFilters?.client"
187
+ [permissionType]="permissionType" [userType]="usersDetails?.userType"
188
+ (panelClosed)="onFilterPanelClosed()" (apply)="onFilterApply($event)">
189
+ </lib-ticket-filter-panel>
190
+ <!-- </section> -->
191
+ <button type="button" *ngIf="!loading && !noData" (click)="exportXLSX()"
192
+ class="btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val">
193
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"
194
+ fill="none">
195
+ <path
196
+ 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"
197
+ stroke="#344054" stroke-width="1.67" stroke-linecap="round"
198
+ stroke-linejoin="round" />
199
+ </svg>
200
+ <span class="ms-2">Export</span>
201
+ </button>
202
+ <button
203
+ class="btn btn-default btn-primary btn-outline btn-outline-default rounded-3 text-nowrap border-val"
204
+ *ngIf="tangoType==='internal'" (click)="createInternalticket()">Start Audit</button>
205
+ <button
206
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')"
207
+ [disabled]="closeMultiple" class="btn btn-sm btn-primary mx-2 text-nowrap"
208
+ (click)="getMultipleTicketClose()">
209
+ Close Ticket
210
+ </button>
211
+ </div>
212
+ </div>
213
+
214
+ </div>
215
+ </div>
216
+ <div class="card-body">
217
+ <div class="table-responsive" *ngIf="!loading && !noData">
218
+ <table class="table custom-table bottom-border text-nowrap">
219
+ <thead>
220
+ <tr>
221
+ <!-- NEW: checkbox column for approver only -->
222
+ <th
223
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')">
224
+ <input type="checkbox" [checked]="areAllSelectableRowsSelected()"
225
+ (change)="toggleSelectAllRows($event)" />
226
+ </th>
227
+
228
+ <th *ngFor="let col of tableColumns"
229
+ [class.cursor-pointer]="col.sortable && col.type !== 'store'"
230
+ (click)="col.sortable && col.type !== 'store' && onSort(col.key)">
231
+ {{ col.label }}
232
+
233
+ <svg *ngIf="col.sortable && col.type !== 'store'"
234
+ [ngClass]="sortedColumn === col.key && sortDirection === 1 ? 'rotate' : ''"
235
+ width="16" height="16" viewBox="0 0 16 16" fill="none">
236
+ <path d="M8 3.333V12.667L12.667 8 8 12.667 3.333 8"
237
+ [attr.stroke]="sortedColumn === col.key ? '#00A3FF' : '#667085'"
238
+ stroke-width="1.333" stroke-linecap="round" stroke-linejoin="round" />
239
+ </svg>
240
+ </th>
241
+
242
+ </tr>
243
+ </thead>
244
+
245
+ <tbody>
246
+ <tr *ngFor="let row of footfallListData">
247
+ <!-- NEW: per-row checkbox (approver only) -->
248
+ <td
249
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')">
250
+ <input type="checkbox" [disabled]="!isRowSelectable(row)" [checked]="isRowSelected(row)"
251
+ [style.cursor]="isRowSelectable(row) ? 'pointer' : 'not-allowed text-muted'"
252
+ (change)="toggleRowSelection(row, $event)" />
253
+ </td>
254
+
255
+ <td *ngFor="let col of tableColumns">
256
+ <!-- Store + ticket clickable -->
257
+ <ng-container *ngIf="col.type === 'store'">
258
+ <div class="text-primary ellipsis-underline" (click)="ticketView(row)">
259
+ {{ row.ticketId }}
260
+ </div>
261
+ <div class="pt-2">{{ row.storeName }}</div>
262
+ </ng-container>
263
+
264
+ <!-- Date -->
265
+ <ng-container class="pt-5" *ngIf="col.type === 'date' || col.type === 'ticketRaised'">
266
+ {{ row[col.key] | date: 'dd MMM, yyyy' }}
267
+ </ng-container>
268
+
269
+ <!-- Status -->
270
+ <ng-container class="pt-5" *ngIf="col.type === 'status'">
271
+ <span class="badge mx-2" [ngClass]="getStatusBadgeClass(row[col.key])">
272
+ {{ row[col.key] | titlecase }}
273
+ </span>
274
+ </ng-container>
275
+
276
+ <!-- Default Text -->
277
+ <ng-container class="pt-5" *ngIf="col.type === 'text'">
278
+ {{ row[col.key] ?? '--' }}
279
+ </ng-container>
280
+ </td>
281
+ </tr>
282
+ </tbody>
283
+ </table>
284
+
285
+
286
+ </div>
287
+ <div *ngIf="!loading && !noData" class="my-3">
288
+ <lib-pagination [itemsPerPage]="pageSize" [currentPage]="currentPage" [totalItems]="totalItems"
289
+ [paginationSizes]="paginationSizes" [pageSize]="setpageSize()" (pageChange)="onPageChange($event)"
290
+ (pageSizeChange)="onPageSizeChange($event)"></lib-pagination>
291
+ </div>
292
+ </div>
293
+ <div *ngIf="loading" class="card mt-5">
294
+ <div class="card-body h-500px">
295
+ <div class="row loader d-flex justify-content-center align-items-center">
296
+ <div class="shimmer">
297
+ <div class="wrapper">
298
+ <div class="stroke animate title"></div>
299
+ <div class="stroke animate link"></div>
300
+ <div class="stroke animate description"></div>
301
+ </div>
302
+ </div>
303
+ <div class="shimmer">
304
+ <div class="wrapper">
305
+ <div class="stroke animate title"></div>
306
+ <div class="stroke animate link"></div>
307
+ <div class="stroke animate description"></div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ </div>
313
+ </div>
314
+ <ng-container *ngIf="noData">
315
+ <div class="row">
316
+ <div class="col-lg-12 mb-3">
317
+ <div class="card-body d-flex justify-content-center align-items-center flex-column">
318
+ <img class="img-nodata" src="./assets/tango/Icons/Nodata1.svg" alt="">
319
+ <div class="nodata-title">No data found</div>
320
+ <div class="nodata-sub">There is no result for this conversion funnel</div>
321
+ </div>
322
+ </div>
323
+ </div>
324
+ </ng-container>
325
+ </div>
326
+ </section>
327
+ <!-- -->
328
+ <section *ngIf="select ==='ticketMethod'">
329
+ <div class="row my-2">
330
+ <div class="position-relative"
331
+ [ngClass]="isCollapsed || this.usersDetails.userType ==='tango' ? 'd-none' : 'col-md-3 h-auto'">
332
+ <div class="card h-100">
333
+ <div class="card-header border-0 pt-3 ps-1 pe-5">
334
+ <span class="ms-2"><span class="cursor-pointer" (click)="backToNavigation()"><svg
335
+ xmlns="http://www.w3.org/2000/svg" width="56" height="44" viewBox="0 0 56 44"
336
+ fill="none">
337
+ <g filter="url(#filter0_d_887_4505)">
338
+ <rect x="2" y="1" width="52" height="40" rx="8" fill="white" />
339
+ <rect x="2.5" y="1.5" width="51" height="39" rx="7.5" stroke="#D0D5DD" />
340
+ <path d="M30.5 26L25.5 21L30.5 16" stroke="#344054" stroke-width="1.67"
341
+ stroke-linecap="round" stroke-linejoin="round" />
342
+ </g>
343
+ <defs>
344
+ <filter id="filter0_d_887_4505" x="0" y="0" width="56" height="44"
345
+ filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
346
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
347
+ <feColorMatrix in="SourceAlpha" type="matrix"
348
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
349
+ <feOffset dy="1" />
350
+ <feGaussianBlur stdDeviation="1" />
351
+ <feColorMatrix type="matrix"
352
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
353
+ <feBlend mode="normal" in2="BackgroundImageFix"
354
+ result="effect1_dropShadow_887_4505" />
355
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_887_4505"
356
+ result="shape" />
357
+ </filter>
358
+ </defs>
359
+ </svg></span><span class="card-title-foot pt-15 ms-3">Tickets</span></span>
360
+ <span class="cursor-pointer" (click)="toggleSidebar()"
361
+ style="position: absolute; top: 15px; right: -25px;">
362
+ <svg xmlns="http://www.w3.org/2000/svg" width="68" height="68" viewBox="0 0 68 68" fill="none">
363
+ <g filter="url(#filter0_dd_778_34282)">
364
+ <rect x="12" width="44" height="44" rx="22" fill="white" />
365
+ <path d="M33 27L28 22L33 17M40 27L35 22L40 17" stroke="#101828" stroke-width="2"
366
+ stroke-linecap="round" stroke-linejoin="round" />
367
+ </g>
368
+ <defs>
369
+ <filter id="filter0_dd_778_34282" x="0" y="0" width="68" height="68"
370
+ filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
371
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
372
+ <feColorMatrix in="SourceAlpha" type="matrix"
373
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
374
+ <feMorphology radius="2" operator="erode" in="SourceAlpha"
375
+ result="effect1_dropShadow_778_34282" />
376
+ <feOffset dy="4" />
377
+ <feGaussianBlur stdDeviation="3" />
378
+ <feColorMatrix type="matrix"
379
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0" />
380
+ <feBlend mode="normal" in2="BackgroundImageFix"
381
+ result="effect1_dropShadow_778_34282" />
382
+ <feColorMatrix in="SourceAlpha" type="matrix"
383
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
384
+ <feMorphology radius="4" operator="erode" in="SourceAlpha"
385
+ result="effect2_dropShadow_778_34282" />
386
+ <feOffset dy="12" />
387
+ <feGaussianBlur stdDeviation="8" />
388
+ <feColorMatrix type="matrix"
389
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0" />
390
+ <feBlend mode="normal" in2="effect1_dropShadow_778_34282"
391
+ result="effect2_dropShadow_778_34282" />
392
+ <feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_778_34282"
393
+ result="shape" />
394
+ </filter>
395
+ </defs>
396
+ </svg>
397
+ </span>
398
+ </div>
399
+ <div class="p-4 w-100 overflow-auto">
400
+ <div class="row my-1">
401
+ <div class="col-12">
402
+
403
+ <span class="svg-icon svg-icon-1 position-absolute py-2 ms-3">
404
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
405
+ fill="none">
406
+ <rect opacity="0.5" x="17.0365" y="15.1223" width="8.15546" height="2" rx="1"
407
+ transform="rotate(45 17.0365 15.1223)" fill="currentColor"></rect>
408
+ <path
409
+ 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"
410
+ fill="currentColor"></path>
411
+ </svg>
412
+ </span>
413
+ <input class="form-control form-control-sm mb-2 ps-14 pe-2 w-100" type="text"
414
+ placeholder="Search" [(ngModel)]="StoresSearchValue" (change)="searchStoresData()" />
415
+ </div>
416
+ <!-- <div class="text-end text-nowrp ms-3 mt-2">
417
+ <button
418
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')"
419
+ [disabled]="closeMultiple" class="btn btn-sm btn-primary text-nowrap mx-2"
420
+ (click)="getMultipleTicketClose()">
421
+ Close Ticket
422
+ </button>
423
+ </div> -->
424
+
425
+ <div *ngIf="openTicketsList.length" class="mb-2 border-selectall">
426
+ <div class="d-flex justify-content-between align-items-center w-100">
427
+
428
+ <!-- LEFT: checkbox + text -->
429
+ <div class="d-flex align-items-center">
430
+ <input
431
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')"
432
+ type="checkbox" class="me-2" [checked]="newallSelected"
433
+ (change)="toggleSelectAll()" />
434
+ <label class="m-0 font-semibold">
435
+ Select <span
436
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')">all
437
+ {{ storeCount }}</span> stores
438
+ </label>
439
+ </div>
440
+
441
+ <!-- RIGHT: Reviewer(%) + optional sort icon -->
442
+ <div class="d-flex align-items-center reviewer-label">
443
+ <span *ngIf="hasReviewerAccess && selectedRole === 'reviewer'"
444
+ class="me-1">Reviewer(%)</span>
445
+ <span *ngIf="hasApproverAccess && selectedRole === 'approver'"
446
+ class="me-1">Accuracy(%)</span>
447
+ <!-- if you want arrow icon -->
448
+ <span (click)="onSortClick()" class="sort-arrow cursor-pointer"><svg
449
+ [ngClass]="sortOpen === 1 ? 'rotate' : ''"
450
+ xmlns="http://www.w3.org/2000/svg" width="14" height="14"
451
+ viewBox="0 0 14 14" fill="none">
452
+ <path
453
+ d="M6.83464 1L6.83463 12.6667M6.83463 12.6667L12.668 6.83333M6.83463 12.6667L1.0013 6.83333"
454
+ stroke="#475467" stroke-width="2" stroke-linecap="round"
455
+ stroke-linejoin="round" />
456
+ </svg></span>
457
+ <!-- or use an <i> from font-awesome/bootstrap icon instead -->
458
+ </div>
459
+
460
+ </div>
461
+ </div>
462
+
463
+ <ul class="list-unstyled ps-0">
464
+ <li *ngFor="let store of openTicketsList" class="mb-2"
465
+ [ngClass]="{ 'store-item-active': isSelected(store), 'store-item': true }">
466
+
467
+ <div class="d-flex justify-content-between align-items-center w-100">
468
+ <!-- LEFT: checkbox + text -->
469
+ <div class="d-flex align-items-start">
470
+ <input
471
+ *ngIf="usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')"
472
+ type="checkbox" class="me-2 my-3" [checked]="isSelected(store)"
473
+ (change)="toggleStoreSelection(store)" />
474
+
475
+ <div class="store-text ms-1 cursor-pointer" (click)="ticketViewChanges(store)">
476
+ <div class="ticket-id" [ngClass]="{ 'active-text': isSelected(store) }">
477
+ {{ store?.ticketId }}
478
+ </div>
479
+ <div class="store-name mt-1">
480
+ {{ store?.storeName }}
481
+ </div>
482
+ </div>
483
+ </div>
484
+
485
+ <!-- RIGHT: pill badge -->
486
+ <span
487
+ class="ms-2 px-3 py-1 rounded-pill d-inline-flex align-items-center justify-content-center perc-badge"
488
+ [ngClass]="{
489
+ 'perc-badge-active': isSelected(store),
490
+ 'perc-badge-normal': !isSelected(store)
491
+ }">
492
+ {{ store?.revicedPerc }}
493
+ </span>
494
+ </div>
495
+ </li>
496
+
497
+ </ul>
498
+
499
+
500
+
501
+ <div *ngIf="!openTicketsList.length" class="row">
502
+ <div class="col-lg-12 mb-3">
503
+
504
+ <div class="card-body mx-0 d-flex justify-content-center align-items-center flex-column "
505
+ style="margin: 64px;border-radius: 8px;
506
+ background: var(--Gray-50, #F9FAFB);">
507
+ <svg class="my-5" xmlns="http://www.w3.org/2000/svg" width="94" height="94"
508
+ viewBox="0 0 94 94" fill="none">
509
+ <rect x="7" y="7" width="80" height="80" rx="40" fill="#DAF1FF" />
510
+ <rect x="7" y="7" width="80" height="80" rx="40" stroke="#EAF8FF"
511
+ stroke-width="13.3333" />
512
+ <g clip-path="url(#clip0_730_75095)">
513
+ <path
514
+ d="M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z"
515
+ stroke="#00A3FF" stroke-width="4" stroke-linecap="round"
516
+ stroke-linejoin="round" />
517
+ </g>
518
+ <defs>
519
+ <clipPath id="clip0_730_75095">
520
+ <rect width="40" height="40" fill="white"
521
+ transform="translate(27 27)" />
522
+ </clipPath>
523
+ </defs>
524
+ </svg>
525
+ <div class="nodata-title my-3">No Stores Found</div>
526
+ <div class="nodata-sub mb-3">Looks like there is no stores </div>
527
+ </div>
528
+ </div>
529
+ </div>
530
+ </div>
531
+ </div>
532
+
533
+ </div>
534
+ </div>
535
+ <div [ngClass]="isCollapsed || this.usersDetails.userType ==='tango' ? 'col-12' : 'col-md-9'">
536
+ <div class="card bg-light-primary p-1 h-100">
537
+ <div *ngIf="!footfallLoading && !footfallNoData" class="card-header border-0 pt-3 px-5">
538
+ <div class="d-flex justify-content-start">
539
+ <div *ngIf="this.usersDetails.userType !=='tango'" class="cursor-pointer"><span
540
+ *ngIf="isCollapsed" (click)="toggleSidebar()"
541
+ style="position: absolute; top: 10px; left: 10px;">
542
+ <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40"
543
+ fill="none">
544
+ <path d="M22.5 25L17.5 20L22.5 15" stroke="#667085" stroke-width="1.67"
545
+ stroke-linecap="round" stroke-linejoin="round" />
546
+ </svg> </span>
547
+ <span class="card-title-foot" [ngClass]="isCollapsed ? 'ms-10' : 'ms-0'">Footfall
548
+ Directory</span>
549
+ </div>
550
+ <div *ngIf="this.usersDetails.userType ==='tango'" class="cursor-pointer"><span
551
+ (click)="backToNavigation()" style="position: absolute; top: 10px; left: 10px;">
552
+ <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40"
553
+ fill="none">
554
+ <path d="M22.5 25L17.5 20L22.5 15" stroke="#667085" stroke-width="1.67"
555
+ stroke-linecap="round" stroke-linejoin="round" />
556
+ </svg> </span>
557
+ <span class="card-title-foot ms-10">Footfall Directory</span>
558
+ </div>
559
+ </div>
560
+ <div class="card-toolbar py-0">
561
+ <!-- Start Review -->
562
+ <section *ngIf="usersDetails?.userType !=='tango'">
563
+ <span
564
+ *ngIf="statusVal?.type !== 'tangoreview' && (ticketData?.status === 'Raised' || statusVal?.status === 'Open')">
565
+
566
+ <button class="btn btn-sm btn-primary mx-2" (click)="startReview()">
567
+ Start Review
568
+ </button>
569
+ </span>
570
+ <!-- <section *ngIf="
571
+ (hasReviewerAccess && selectedRole === 'reviewer') ||
572
+ (hasApproverAccess && selectedRole === 'approver')
573
+ ">
574
+ <span *ngIf="
575
+ getHeaderStatus()?.toLowerCase() === 'in-progress' ||
576
+ ticketData?.status?.toLowerCase() === 'in-progress'
577
+ ">
578
+ <button *ngIf="closeBtn" [disabled]="closeDisabled" class="btn btn-sm btn-primary mx-2"
579
+ (click)="stopReview()">
580
+ Close Ticket
581
+ </button>
582
+ </span>
583
+ </section> -->
584
+ <section *ngIf="
585
+ (
586
+ (hasReviewerAccess && selectedRole === 'reviewer'&&ticketStatus === usersDetails?.email) ||
587
+ (hasApproverAccess && selectedRole === 'approver'&&ticketStatus === usersDetails?.email)
588
+ )
589
+ ">
590
+ <span *ngIf="
591
+ getHeaderStatus()?.toLowerCase() === 'in-progress' ||
592
+ ticketData?.status?.toLowerCase() === 'in-progress'
593
+ ">
594
+ <button *ngIf="closeBtn" [disabled]="closeDisabled"
595
+ class="btn btn-sm btn-primary mx-2" (click)="stopReview()">
596
+ Close Ticket
597
+ </button>
598
+ </span>
599
+ </section>
600
+ </section>
601
+ <span
602
+ *ngIf="usersDetails?.userType ==='tango' && statusVal?.type === 'tangoreview' && statusVal?.status ==='Open'||usersDetails?.userType ==='tango' && statusVal?.type === 'tangoreview' && statusVal?.status !='Open'&&footfallTicketsData[0]?._source?.createdByEmail===this.usersDetails.email||usersDetails?.userType ==='tango'&&this.tangoType === 'internal'&&ticketData.status!='In-Progress'||usersDetails?.userType ==='tango'&&this.tangoType === 'internal'&&ticketData.status==='In-Progress'&&footfallTicketsData[0]?._source?.createdByEmail===this.usersDetails.email">
603
+ <button class="btn btn-sm btn-primary mx-2" (click)="startAudit()">Start Audit</button>
604
+ </span>
605
+
606
+ <span
607
+ *ngIf="this.tangoType === 'store'&&usersDetails?.userType ==='tango'&&footfallTicketsData[0]?._source?.createdByEmail===this.usersDetails.email||usersDetails?.userType ==='tango'&&this.tangoType === 'internal'&&ticketData.status==='In-Progress'&&footfallTicketsData[0]?._source?.createdByEmail===this.usersDetails.email">
608
+ <span class="ticket-actions-wrapper" (click)="$event.stopPropagation()">
609
+
610
+ <span class="icon-btn" (click)="toggleTicketMenu($event)">
611
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
612
+ fill="none">
613
+ <path
614
+ d="M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z"
615
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
616
+ stroke-linejoin="round" />
617
+ <path
618
+ d="M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z"
619
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
620
+ stroke-linejoin="round" />
621
+ <path
622
+ d="M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z"
623
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
624
+ stroke-linejoin="round" />
625
+ </svg>
626
+ </span>
627
+ <div class="ticket-menu" *ngIf="isTicketMenuOpen">
628
+ <div class="ticket-menu-item" (click)="onReassignClick()">
629
+ Re-Assign Ticket
630
+ </div>
631
+ <!-- <div class="ticket-menu-item" (click)="onExportClick()">
632
+ Export
633
+ </div> -->
634
+ </div>
635
+ </span>
636
+ </span>
637
+ <span *ngIf="
638
+ (
639
+ (hasReviewerAccess && selectedRole === 'reviewer'&&ticketStatus === usersDetails?.email)
640
+ )
641
+ ">
642
+ <span *ngIf="
643
+ getHeaderStatus()?.toLowerCase() === 'in-progress' ||
644
+ ticketData?.status?.toLowerCase() === 'in-progress'">
645
+ <span *ngIf="closeBtn" class="ticket-actions-wrapper"
646
+ (click)="$event.stopPropagation()">
647
+
648
+ <span class="icon-btn" (click)="toggleTicketMenu($event)">
649
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
650
+ viewBox="0 0 24 24" fill="none">
651
+ <path
652
+ d="M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z"
653
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
654
+ stroke-linejoin="round" />
655
+ <path
656
+ d="M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z"
657
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
658
+ stroke-linejoin="round" />
659
+ <path
660
+ d="M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z"
661
+ stroke="#667085" stroke-width="2" stroke-linecap="round"
662
+ stroke-linejoin="round" />
663
+ </svg>
664
+ </span>
665
+ <div class="ticket-menu" *ngIf="isTicketMenuOpen">
666
+ <div class="ticket-menu-item" (click)="onReassignClick()">
667
+ Re-Assign Ticket
668
+ </div>
669
+ <!-- <div class="ticket-menu-item" (click)="onExportClick()">
670
+ Export
671
+ </div> -->
672
+ </div>
673
+ </span>
674
+ </span>
675
+ </span>
676
+ </div>
677
+ </div>
678
+ <div *ngIf="!footfallLoading && !footfallNoData" class="card-body p-4 ">
679
+ <div class="row mb-6">
680
+
681
+ <div class="col-2 card-title-label my-2">Store Name</div>
682
+ <div class="col-1 font-bold my-2">:</div>
683
+ <div class="col-3 card-title-value my-2">{{footfallTicketsData[0]?._source?.storeName}}</div>
684
+ <div class="col-2 card-title-label my-2">Ticket ID</div>
685
+ <div class="col-1 font-bold my-2">:</div>
686
+ <div class="col-3 card-title-value my-2">{{footfallTicketsData[0]?._source?.ticketId}}</div>
687
+ <div class="col-2 card-title-label my-2">Status</div>
688
+ <div class="col-1 font-bold my-2">:</div>
689
+
690
+ <div class="col-3 my-2">
691
+ <span class="badge mx-2" [ngClass]="getStatusBadgeClass(getHeaderStatus())">
692
+ {{ getHeaderStatus() | titlecase }}
693
+ </span>
694
+ </div>
695
+
696
+ <div *ngIf="dueDate" class="col-2 card-title-label my-2">Due Date</div>
697
+ <div *ngIf="dueDate" class="col-1 font-bold my-2">:</div>
698
+ <div *ngIf="dueDate" class="col-3 card-title-value my-2">{{dueDate ? (dueDate | date:'dd MMM yyyy') :''}}</div>
699
+ </div>
700
+ <div class="accuracy-panel" *ngIf="getHeaderStatus()==='Open - Accuracy Issue'">
701
+ <!-- Title + badge -->
702
+ <div class=" accuracy-header">
703
+ <span class="badge badge-light-blue px-3 py-2 badge-light-blue">Accuracy issue</span>
704
+ </div>
705
+
706
+ <!-- Info Text -->
707
+ <p class="info-line mb-3">
708
+ <i class="bi bi-info-circle-fill me-2"></i>
709
+ Please review and determine the root cause of the low accuracy.
710
+ </p>
711
+
712
+ <!-- Form area -->
713
+ <div class="row gx-3">
714
+ <!-- Column for select and +Add -->
715
+ <div class="col-12 col-md-4">
716
+ <div class="form-small">
717
+ <label class="visually-hidden" for="issueSelect">Select issue</label>
718
+ <select id="issueSelect" class="form-select form-select-sm"
719
+ [(ngModel)]="selectedIssue" name="selectedIssue">
720
+ <option value="">Select issue</option>
721
+ <option value="{{item?.issueName}}" *ngFor="let item of accuracyList">
722
+ {{item?.issueName}}</option>
723
+ </select>
724
+
725
+ <!-- <button type="button" class="btn btn-sm btn-outline-secondary add-btn"
726
+ (click)="onAddIssue()">
727
+ + Add
728
+ </button> -->
729
+ </div>
730
+ </div>
731
+
732
+ <!-- You can put additional fields here if needed -->
733
+ <div class="col-12 col-md-8">
734
+ <input type="text" class="form-control" *ngIf="selectedIssue!=''"
735
+ [(ngModel)]="selectedsubIssue"
736
+ placeholder="Changes camera location, hence closing this ticket" />
737
+ </div>
738
+ </div>
739
+
740
+ <!-- Footer with right-aligned buttons -->
741
+ <div class="panel-footer">
742
+
743
+ <button type="button" [disabled]="selectedIssue==''||selectedsubIssue===''"
744
+ class="btn btn-sm btn-primary" (click)="oncloseSubmit()">Close &amp;
745
+ Submit</button>
746
+ </div>
747
+ </div>
748
+
749
+
750
+
751
+
752
+ <div class="card-layer">
753
+ <div class="d-flex justify-content-between align-items-start w-100">
754
+
755
+ <!-- LEFT SIDE -->
756
+ <h3 class="card-title align-items-start flex-column mb-0">
757
+ <div class="card-label">Ticket Status</div>
758
+ <div class="text-sub mb-2">Logs for each revision of the ticket.</div>
759
+ </h3>
760
+
761
+ <!-- RIGHT SIDE -->
762
+ <div class="cursor-pointer">
763
+ <span (click)="openArrow()"> <svg *ngIf="arrowshow" xmlns="http://www.w3.org/2000/svg"
764
+ width="40" height="40" viewBox="0 0 40 40" fill="none">
765
+ <g filter="url(#filter0_d_486_91902)">
766
+ <rect x="2" y="1" width="36" height="36" rx="8" fill="white" />
767
+ <rect x="2.5" y="1.5" width="35" height="35" rx="7.5" stroke="#D0D5DD" />
768
+ <path d="M15 16.5L20 21.5L25 16.5" stroke="#344054" stroke-width="1.67"
769
+ stroke-linecap="round" stroke-linejoin="round" />
770
+ </g>
771
+ <defs>
772
+ <filter id="filter0_d_486_91902" x="0" y="0" width="40" height="40"
773
+ filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
774
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
775
+ <feColorMatrix in="SourceAlpha" type="matrix"
776
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
777
+ result="hardAlpha" />
778
+ <feOffset dy="1" />
779
+ <feGaussianBlur stdDeviation="1" />
780
+ <feColorMatrix type="matrix"
781
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
782
+ <feBlend mode="normal" in2="BackgroundImageFix"
783
+ result="effect1_dropShadow_486_91902" />
784
+ <feBlend mode="normal" in="SourceGraphic"
785
+ in2="effect1_dropShadow_486_91902" result="shape" />
786
+ </filter>
787
+ </defs>
788
+ </svg></span>
789
+ <span (click)="openArrow()">
790
+ <svg *ngIf="!arrowshow" xmlns="http://www.w3.org/2000/svg" width="40" height="40"
791
+ viewBox="0 0 40 40" fill="none">
792
+ <g filter="url(#filter0_d_486_91893)">
793
+ <rect x="38" y="37" width="36" height="36" rx="8"
794
+ transform="rotate(180 38 37)" fill="white" />
795
+ <rect x="37.5" y="36.5" width="35" height="35" rx="7.5"
796
+ transform="rotate(180 37.5 36.5)" stroke="#D0D5DD" />
797
+ <path d="M25 21.5L20 16.5L15 21.5" stroke="#344054" stroke-width="1.67"
798
+ stroke-linecap="round" stroke-linejoin="round" />
799
+ </g>
800
+ <defs>
801
+ <filter id="filter0_d_486_91893" x="0" y="0" width="40" height="40"
802
+ filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
803
+ <feFlood flood-opacity="0" result="BackgroundImageFix" />
804
+ <feColorMatrix in="SourceAlpha" type="matrix"
805
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
806
+ result="hardAlpha" />
807
+ <feOffset dy="1" />
808
+ <feGaussianBlur stdDeviation="1" />
809
+ <feColorMatrix type="matrix"
810
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
811
+ <feBlend mode="normal" in2="BackgroundImageFix"
812
+ result="effect1_dropShadow_486_91893" />
813
+ <feBlend mode="normal" in="SourceGraphic"
814
+ in2="effect1_dropShadow_486_91893" result="shape" />
815
+ </filter>
816
+ </defs>
817
+ </svg>
818
+ </span>
819
+ </div>
820
+
821
+ </div>
822
+
823
+
824
+ <section *ngIf="!arrowshow">
825
+
826
+ <ng-container *ngFor="let ticket of footfallTicketsData">
827
+
828
+ <div *ngIf="ticket?._source as source" class="ticket-container">
829
+
830
+ <!-- Actual Footfall Header -->
831
+ <div class="ticket-header">
832
+ <div class="footfall-value">{{source?.footfallCount}} <span
833
+ class="footfall-label ms-3">Actual
834
+ Footfall</span>
835
+ </div>
836
+ <div class="issue-date">Issue date : {{source?.dateString | date:'dd MMM yyyy'}}
837
+ </div>
838
+ </div>
839
+
840
+ <!-- Timeline Line -->
841
+ <ng-container *ngFor="let mapping of source?.mappingInfo">
842
+
843
+ <!-- When ticket is CLOSED, skip the tagging row -->
844
+ <ng-container *ngIf="
845
+ (mapping?.status === 'Raised') ||
846
+ (['tagging','review','approve','tangoreview'].includes(mapping?.type) &&
847
+ (mapping?.status === 'Closed' || mapping?.status === 'Closed - Accuracy Issue' || mapping?.status === 'Open - Accuracy Issue'))
848
+ ">
849
+
850
+ <div class="timeline"></div>
851
+ <div class="user-info ms-4">
852
+
853
+ <div class="avatar avatar-text light-primary p-3">
854
+ {{ getInitialsFromEmail(mapping?.createdByEmail ||
855
+ source?.createdByEmail) }}
856
+ </div>
857
+
858
+ <div>
859
+ <div class="user-name">
860
+ <span *ngIf="mapping?.type === 'tagging' || mapping?.status === 'Raised'">
861
+ Ticket created by
862
+ </span>
863
+ <span *ngIf="mapping?.type === 'review'">
864
+ Reviewed by
865
+ </span>
866
+ <span *ngIf="mapping?.type === 'approve'">
867
+ Approved by
868
+ </span>
869
+
870
+ <span *ngIf="mapping?.type === 'tangoreview'">
871
+ Tango
872
+ </span>
873
+ </div>
874
+
875
+ <div class="user-email">
876
+ {{ mapping?.createdByEmail || source?.createdByEmail }}
877
+ {{(mapping?.createdAt || source?.createdAt)
878
+ | date:'HH:mm:ss –dd MMM yyyy' }}
879
+ </div>
880
+ </div>
881
+
882
+ </div>
883
+
884
+
885
+ <div class="timeline"></div>
886
+
887
+ <!-- Show revision card only when NOT closed & type is tagging -->
888
+ <div class="revision-card"
889
+ [ngClass]="{'revision-card-approve-closed':(mapping?.status === 'Closed' || mapping?.status === 'Closed - Accuracy Issue' || mapping?.status === 'Open - Accuracy Issue') && (mapping?.type === 'approve' || mapping?.type === 'tangoreview'),}">
890
+ <div class="values-row">
891
+ <div class="value-block">
892
+ <div class="value">
893
+ {{ mapping?.revicedFootfall === null ? '--' :
894
+ mapping?.revicedFootfall }}
895
+ </div>
896
+ <div class="label fw-bold">Revised Footfall</div>
897
+ </div>
898
+
899
+ <div class="value-block">
900
+ <div class="value accuracy down">
901
+ {{ mapping?.revicedPerc || source?.revicedPerc || '--' }}
902
+ <span class="ms-1">
903
+ <!-- arrow svg -->
904
+ </span>
905
+ </div>
906
+ <div class="label fw-bold pt-1">Accuracy</div>
907
+ </div>
908
+
909
+ <div class="timeline-new my-2"></div>
910
+
911
+ <div class="value-block" *ngFor="let item of mapping?.count">
912
+ <div class="value">
913
+ {{ item?.value ?? '--' }}
914
+ </div>
915
+ <div class="label">
916
+ {{ item?.name }}
917
+ </div>
918
+ </div>
919
+ </div>
920
+ </div>
921
+
922
+
923
+ </ng-container>
924
+
925
+ <div *ngIf="mapping?.status === 'Closed' && ['approve'].includes(mapping?.type)"
926
+ class="card-footer revision-card-approve py-1 bg-light-primary">
927
+ <div *ngIf="!showApproveDetails"
928
+ class="details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2"
929
+ (click)="toggleRevisedDetails(mapping)">
930
+ <span class="text-primary ">
931
+ Show in details
932
+ </span>
933
+ <span class="chevron ms-3 cursor-pointer"
934
+ [class.rotate-180]="showRevisedDetails"><svg
935
+ xmlns="http://www.w3.org/2000/svg" width="24" height="24"
936
+ viewBox="0 0 24 24" fill="none">
937
+ <path d="M18 9L12 15L6 9" stroke="#101828" stroke-width="2"
938
+ stroke-linecap="round" stroke-linejoin="round" />
939
+ </svg></span>
940
+ <span *ngIf="showApproveDetails" class="chevron ms-3 cursor-pointer">
941
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
942
+ viewBox="0 0 24 24" fill="none">
943
+ <path d="M6 15L12 9L18 15" stroke="#101828" stroke-width="2"
944
+ stroke-linecap="round" stroke-linejoin="round" />
945
+ </svg>
946
+ </span>
947
+ </div>
948
+
949
+ <div class="details-body mt-2" *ngIf="showApproveDetails">
950
+ <ng-container *ngFor="let ticket of footfallTicketsData">
951
+ <div *ngIf="ticket?._source as source" class="my-5">
952
+ <ng-container *ngFor="let type of revopsTypes">
953
+ <section *ngIf="type ==='duplicate'">
954
+
955
+ <div *ngIf="hasRevopsType(type)" class="layers">
956
+ <!-- Header Section -->
957
+ <div class="card-header min-h-25px pt-3">
958
+ <h3 class="text-lg font-semibold mb-4">
959
+ <span class="me-2">
960
+ <svg xmlns="http://www.w3.org/2000/svg"
961
+ width="18" height="18"
962
+ viewBox="0 0 18 18" fill="none">
963
+ <g
964
+ clip-path="url(#clip0_730_76157)">
965
+ <path
966
+ d="M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z"
967
+ stroke="#475467"
968
+ stroke-width="2"
969
+ stroke-linecap="round"
970
+ stroke-linejoin="round" />
971
+ </g>
972
+ <defs>
973
+ <clipPath id="clip0_730_76157">
974
+ <rect width="18" height="18"
975
+ fill="white" />
976
+ </clipPath>
977
+ </defs>
978
+ </svg>
979
+ </span>
980
+ Duplicates
981
+ </h3>
982
+ </div>
983
+
984
+
985
+ <!-- Body Section -->
986
+ <ng-container
987
+ *ngFor="let mapping of source?.mappingInfo">
988
+ <!-- Body Section -->
989
+ <ng-container *ngIf="mapping?.type ===viewMode">
990
+ <ng-container
991
+ *ngFor="let original of mapping?.revisedDetail">
992
+ <div *ngIf="original?.isParent && original?.revopsType ==='duplicate'"
993
+ class="card-body bg-white layers pt-5 pb-0 px-0 m-3">
994
+ <div class="mt-4">
995
+ <!-- Original Image -->
996
+ <div
997
+ class="duplicate-head px-5 my-3">
998
+ Original image
999
+ </div>
1000
+ <div class="row px-5">
1001
+ <div
1002
+ class="col-md-4 relative">
1003
+ <div
1004
+ class="pb-3 img-border border border-1 h-100 rounded-3">
1005
+
1006
+ <img [src]="imageUrl + original?.filePath"
1007
+ alt=""
1008
+ class="w-100 rounded border" />
1009
+ <div
1010
+ class="desc-title ms-2 my-2">
1011
+ Tango ID: {{
1012
+ original.tempId
1013
+ }}</div>
1014
+ <div
1015
+ class="desc-value ms-2">
1016
+ Entry Time: {{
1017
+ getFormattedEntryTime(original?.entryTime)
1018
+ }}</div>
1019
+ </div>
1020
+ </div>
1021
+ </div>
1022
+
1023
+
1024
+ <div
1025
+ class="separator separator-dashed mt-3 mb-5">
1026
+ </div>
1027
+ <div class="row px-5">
1028
+ <h5
1029
+ class="duplicate-head my-3 fs-6">
1030
+ Tagged Duplicates</h5>
1031
+ <div *ngIf="isCheckboxEnable"
1032
+ class="my-3">
1033
+ <input type="checkbox"
1034
+ [checked]="areAllDuplicatesSelected(original)"
1035
+ (change)="onToggleSelectAllDuplicates(original, $event)" />
1036
+ <label
1037
+ class="ms-2">Select
1038
+ All</label>
1039
+ </div>
1040
+ <div *ngFor="let duplicate of original?.duplicateImage; let i = index"
1041
+ class="col-md-3 mb-3 position-relative">
1042
+ <div class="pb-3 h-100 rounded-3 position-relative"
1043
+ [ngClass]="{
1044
+ 'layer-approved': isApproved(duplicate),
1045
+ 'layer-rejected': isRejected(duplicate),
1046
+ 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}">
1047
+ <!-- Checkbox -->
1048
+ <div
1049
+ *ngIf="isCheckboxEnable">
1050
+ <input
1051
+ type="checkbox"
1052
+ *ngIf="!isLockedByReviewer(duplicate)"
1053
+ style="right: 5px ; margin: 10px 5px 4px !important;"
1054
+ [checked]="isDuplicateSelected(original.tempId, duplicate.tempId)"
1055
+ (change)="onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)"
1056
+ class="position-absolute form-check-input duplicate-checkbox" />
1057
+ <span
1058
+ class="position-absolute absolute"
1059
+ *ngIf="isLockedByReviewer(duplicate)"
1060
+ (click)="resetCheckbox('duplicate', duplicate)">
1061
+
1062
+
1063
+ <svg xmlns="http://www.w3.org/2000/svg"
1064
+ width="19"
1065
+ height="19"
1066
+ viewBox="0 0 19 19"
1067
+ fill="none">
1068
+ <g
1069
+ filter="url(#filter0_d_2023_13718)">
1070
+ <rect
1071
+ x="1.11133"
1072
+ y="0.555664"
1073
+ width="16"
1074
+ height="16"
1075
+ rx="2"
1076
+ fill="white" />
1077
+ <rect
1078
+ x="1.38911"
1079
+ y="0.833442"
1080
+ width="15.4444"
1081
+ height="15.4444"
1082
+ rx="1.72222"
1083
+ stroke="#D0D5DD"
1084
+ stroke-width="0.555556" />
1085
+ <path
1086
+ d="M5.87109 8.55566H12.3526"
1087
+ stroke="#344054"
1088
+ stroke-width="0.927778"
1089
+ stroke-linecap="round"
1090
+ stroke-linejoin="round" />
1091
+ </g>
1092
+ <defs>
1093
+ <filter
1094
+ id="filter0_d_2023_13718"
1095
+ x="0.00021708"
1096
+ y="0.00010854"
1097
+ width="18.2222"
1098
+ height="18.2222"
1099
+ filterUnits="userSpaceOnUse"
1100
+ color-interpolation-filters="sRGB">
1101
+ <feFlood
1102
+ flood-opacity="0"
1103
+ result="BackgroundImageFix" />
1104
+ <feColorMatrix
1105
+ in="SourceAlpha"
1106
+ type="matrix"
1107
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
1108
+ result="hardAlpha" />
1109
+ <feOffset
1110
+ dy="0.555556" />
1111
+ <feGaussianBlur
1112
+ stdDeviation="0.555556" />
1113
+ <feColorMatrix
1114
+ type="matrix"
1115
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
1116
+ <feBlend
1117
+ mode="normal"
1118
+ in2="BackgroundImageFix"
1119
+ result="effect1_dropShadow_2023_13718" />
1120
+ <feBlend
1121
+ mode="normal"
1122
+ in="SourceGraphic"
1123
+ in2="effect1_dropShadow_2023_13718"
1124
+ result="shape" />
1125
+ </filter>
1126
+ </defs>
1127
+ </svg>
1128
+
1129
+ </span>
1130
+ </div>
1131
+ <!-- (change)="onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')" -->
1132
+ <!-- Duplicate Image -->
1133
+ <img [src]="imageUrl + duplicate.filePath"
1134
+ alt=""
1135
+ (click)="openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')"
1136
+ class="w-100 rounded border duplicate-image cursor-pointer" />
1137
+
1138
+ <!-- Duplicate Info -->
1139
+ <div
1140
+ class="row my-2">
1141
+ <div
1142
+ class="col-8">
1143
+ <div
1144
+ class="desc-title ms-2 my-2">
1145
+ Tango
1146
+ ID: {{
1147
+ duplicate.tempId
1148
+ }}
1149
+
1150
+ <span
1151
+ *ngIf="getAction(duplicate, 'review')?.action === 'approved'"
1152
+ class="ms-2"><svg
1153
+ style="width: 20px;
1154
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
1155
+ <rect
1156
+ y="0.5"
1157
+ width="10"
1158
+ height="10"
1159
+ rx="5"
1160
+ fill="#D1FADF" />
1161
+ <path
1162
+ fill-rule="evenodd"
1163
+ clip-rule="evenodd"
1164
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
1165
+ fill="#12B76A" />
1166
+ </svg>
1167
+ </span>
1168
+ <span
1169
+ *ngIf="getAction(duplicate, 'review')?.action === 'rejected'"
1170
+ class="ms-2"><svg
1171
+ style="width: 20px;
1172
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
1173
+ <g
1174
+ clip-path="url(#clip0_1428_59484)">
1175
+ <path
1176
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1177
+ fill="#FEE4E2" />
1178
+ <path
1179
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1180
+ stroke="#D92D20"
1181
+ stroke-linecap="round"
1182
+ stroke-linejoin="round" />
1183
+ </g>
1184
+ <defs>
1185
+ <clipPath
1186
+ id="clip0_1428_59484">
1187
+ <rect
1188
+ width="12"
1189
+ height="12"
1190
+ fill="white"
1191
+ transform="translate(0.599609 0.5)" />
1192
+ </clipPath>
1193
+ </defs>
1194
+ </svg></span>
1195
+
1196
+ </div>
1197
+
1198
+ <div
1199
+ class="desc-value ms-2">
1200
+ Entry
1201
+ Time: {{
1202
+ getFormattedEntryTime(duplicate.entryTime)
1203
+ }}
1204
+ </div>
1205
+ </div>
1206
+ <div
1207
+ class="col-4">
1208
+ <span
1209
+ *ngIf="getAction(duplicate, 'approve')?.action === 'approved'">
1210
+
1211
+ <svg xmlns="http://www.w3.org/2000/svg"
1212
+ width="37"
1213
+ height="37"
1214
+ viewBox="0 0 24 24"
1215
+ fill="none">
1216
+ <rect
1217
+ width="24"
1218
+ height="24"
1219
+ rx="12"
1220
+ fill="#D1FADF" />
1221
+ <g
1222
+ clip-path="url(#clip0_486_94051)">
1223
+ <path
1224
+ d="M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z"
1225
+ stroke="#039855"
1226
+ stroke-linecap="round"
1227
+ stroke-linejoin="round" />
1228
+ </g>
1229
+ <defs>
1230
+ <clipPath
1231
+ id="clip0_486_94051">
1232
+ <rect
1233
+ width="12"
1234
+ height="12"
1235
+ fill="white"
1236
+ transform="translate(6 6)" />
1237
+ </clipPath>
1238
+ </defs>
1239
+ </svg>
1240
+
1241
+ </span>
1242
+ <span
1243
+ *ngIf="getAction(duplicate, 'approve')?.action === 'rejected'"><svg
1244
+ xmlns="http://www.w3.org/2000/svg"
1245
+ width="37"
1246
+ height="37"
1247
+ viewBox="0 0 24 24"
1248
+ fill="none">
1249
+ <rect
1250
+ width="24"
1251
+ height="24"
1252
+ rx="12"
1253
+ fill="#FEE4E2" />
1254
+ <g
1255
+ clip-path="url(#clip0_486_94090)">
1256
+ <path
1257
+ d="M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z"
1258
+ stroke="#D92D20"
1259
+ stroke-linecap="round"
1260
+ stroke-linejoin="round" />
1261
+ </g>
1262
+ <defs>
1263
+ <clipPath
1264
+ id="clip0_486_94090">
1265
+ <rect
1266
+ width="12"
1267
+ height="12"
1268
+ fill="white"
1269
+ transform="translate(6 6)" />
1270
+ </clipPath>
1271
+ </defs>
1272
+ </svg>
1273
+ </span>
1274
+ </div>
1275
+ </div>
1276
+ <!-- Duplicate Reason -->
1277
+ <!-- <div class="duplicate-reason ms-2 mt-2">
1278
+ <small class="text-muted">{{ duplicate.reason }}</small>
1279
+ </div> -->
1280
+ </div>
1281
+ </div>
1282
+ </div>
1283
+
1284
+
1285
+ <div class="card-footer py-5"
1286
+ *ngIf="source?.commentsDetails?.length">
1287
+ <div
1288
+ class="comments-accordion">
1289
+ <!-- Accordion Header -->
1290
+ <div class="accordion-header"
1291
+ (click)="toggleCommentsAccordion(type)">
1292
+ <div
1293
+ class="d-flex justify-content-start align-items-center w-100">
1294
+ <span
1295
+ class="comments-count">
1296
+ <!-- {{
1297
+ getCategoryCommentCountForSource(source,
1298
+ type) }} -->
1299
+ Comments</span>
1300
+ <div
1301
+ class="accordion-arrow ms-3">
1302
+ <svg [class.rotated]="selectedCommentCategory ==='duplicate' && commentsAccordionOpen"
1303
+ xmlns="http://www.w3.org/2000/svg"
1304
+ width="16"
1305
+ height="16"
1306
+ viewBox="0 0 16 16"
1307
+ fill="none">
1308
+ <path
1309
+ d="M4 6L8 10L12 6"
1310
+ stroke="#667085"
1311
+ stroke-width="2"
1312
+ stroke-linecap="round"
1313
+ stroke-linejoin="round" />
1314
+ </svg>
1315
+ </div>
1316
+
1317
+ </div>
1318
+ </div>
1319
+
1320
+ <!-- Accordion Body -->
1321
+ <div class="accordion-body mt-3"
1322
+ *ngIf="selectedCommentCategory ==='duplicate' && commentsAccordionOpen">
1323
+
1324
+ <!-- Loop each block: tagging / review / approve -->
1325
+ <ng-container
1326
+ *ngFor="let block of source?.commentsDetails">
1327
+
1328
+ <!-- Loop inside comments -->
1329
+ <ng-container
1330
+ *ngFor="let c of block.comments">
1331
+
1332
+ <div *ngIf="block?.category ==='duplicate'"
1333
+ class="comment-thread d-flex mb-4">
1334
+
1335
+ <!-- avatar -->
1336
+ <div
1337
+ class="avatar avatar-text light-primary p-3">
1338
+
1339
+ {{
1340
+ getInitialsFromEmail(c.createdByEmail)
1341
+ }}
1342
+ </div>
1343
+ <div
1344
+ class="w-100">
1345
+
1346
+ <!-- email -->
1347
+ <div
1348
+ class="fw-semibold">
1349
+ {{
1350
+ c.createdByEmail
1351
+ }}
1352
+ </div>
1353
+ <div class="text-muted small"
1354
+ *ngIf="c.createdAt">
1355
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
1356
+ }}
1357
+ </div>
1358
+
1359
+ <!-- message text -->
1360
+ <p class="mb-2 mt-2"
1361
+ *ngIf="c.message">
1362
+ {{
1363
+ c.message
1364
+ }}
1365
+ </p>
1366
+
1367
+ <!-- Review / Approve only -->
1368
+ <ng-container
1369
+ *ngIf="block.type === 'review' || block.type === 'approve'">
1370
+ <!-- Tagged images -->
1371
+ <div
1372
+ class="d-flex flex-wrap">
1373
+
1374
+ <div
1375
+ *ngFor="let img of c.taggedImages; let i = index">
1376
+
1377
+ <!-- Show only first 4 -->
1378
+ <ng-container
1379
+ *ngIf="i < 3">
1380
+ <div
1381
+ class="tango-card me-2">
1382
+ <div class="tango-image"
1383
+ [style.backgroundImage]="'url('+ imageUrl + img.filePath + ')'">
1384
+ </div>
1385
+
1386
+ <div
1387
+ class="tango-meta small">
1388
+ <div>
1389
+ Tango
1390
+ ID:
1391
+ {{
1392
+ img.tempId
1393
+ }}
1394
+
1395
+ <!-- status dots -->
1396
+ <span
1397
+ *ngIf="c.status === 'approved'"><svg
1398
+ style="width: 20px;
1399
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
1400
+ <rect
1401
+ y="0.5"
1402
+ width="10"
1403
+ height="10"
1404
+ rx="5"
1405
+ fill="#D1FADF" />
1406
+ <path
1407
+ fill-rule="evenodd"
1408
+ clip-rule="evenodd"
1409
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
1410
+ fill="#12B76A" />
1411
+ </svg></span>
1412
+
1413
+ <span
1414
+ *ngIf="c.status === 'rejected'"><svg
1415
+ style="width: 20px;
1416
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
1417
+ <g
1418
+ clip-path="url(#clip0_1428_59484)">
1419
+ <path
1420
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1421
+ fill="#FEE4E2" />
1422
+ <path
1423
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1424
+ stroke="#D92D20"
1425
+ stroke-linecap="round"
1426
+ stroke-linejoin="round" />
1427
+ </g>
1428
+ <defs>
1429
+ <clipPath
1430
+ id="clip0_1428_59484">
1431
+ <rect
1432
+ width="12"
1433
+ height="12"
1434
+ fill="white"
1435
+ transform="translate(0.599609 0.5)" />
1436
+ </clipPath>
1437
+ </defs>
1438
+ </svg></span>
1439
+ </div>
1440
+
1441
+ <div
1442
+ class="text-muted">
1443
+ Entry
1444
+ time:
1445
+ {{
1446
+ img.entryTime
1447
+ }}
1448
+ </div>
1449
+ </div>
1450
+ </div>
1451
+ </ng-container>
1452
+
1453
+ </div>
1454
+
1455
+ <!-- +N more -->
1456
+ <div class="tango-card me-2 more-card text-center"
1457
+ *ngIf="c.taggedImages.length > 3"
1458
+ [style.backgroundImage]="'url(' + imageUrl + c.taggedImages[3].filePath + ')'"
1459
+ (click)="openImagesPopup(c)">
1460
+ <div
1461
+ class="more-overlay">
1462
+ </div>
1463
+
1464
+ <!-- vertical container -->
1465
+ <div
1466
+ class="more-wrapper my-10 d-flex flex-column align-items-center justify-content-center">
1467
+ <div
1468
+ class="more-text fw-semibold">
1469
+ +{{
1470
+ c.taggedImages.length
1471
+ -
1472
+ 3
1473
+ }}
1474
+ </div>
1475
+ <div
1476
+ class="text-primary text-dark text-decoration-underline small">
1477
+ View
1478
+ all
1479
+ </div>
1480
+ </div>
1481
+ </div>
1482
+
1483
+
1484
+
1485
+ </div>
1486
+
1487
+ </ng-container>
1488
+
1489
+ </div>
1490
+ </div>
1491
+ </ng-container>
1492
+ </ng-container>
1493
+ </div>
1494
+
1495
+
1496
+ </div>
1497
+ </div>
1498
+ </div>
1499
+ </div>
1500
+ </ng-container>
1501
+
1502
+ </ng-container>
1503
+
1504
+ </ng-container>
1505
+ <!-- Status Icons -->
1506
+
1507
+
1508
+ </div>
1509
+ </section>
1510
+ <section *ngIf="type !=='duplicate'">
1511
+ <div class="layers my-2" *ngIf="hasRevopsType(type)">
1512
+ <div class="card-header min-h-25px pt-3">
1513
+ <div class="duplicate-head text-lg my-3"><span
1514
+ *ngIf="type ==='employee'"
1515
+ class="me-2"><svg
1516
+ xmlns="http://www.w3.org/2000/svg"
1517
+ width="18" height="16"
1518
+ viewBox="0 0 18 16" fill="none">
1519
+ <path
1520
+ d="M12.75 14.75V13.25C12.75 12.4544 12.4339 11.6913 11.8713 11.1287C11.3087 10.5661 10.5456 10.25 9.75 10.25H3.75C2.95435 10.25 2.19129 10.5661 1.62868 11.1287C1.06607 11.6913 0.75 12.4544 0.75 13.25V14.75M17.25 14.75V13.25C17.2495 12.5853 17.0283 11.9396 16.621 11.4142C16.2138 10.8889 15.6436 10.5137 15 10.3475M12 1.3475C12.6453 1.51273 13.2173 1.88803 13.6257 2.41423C14.0342 2.94044 14.2559 3.58762 14.2559 4.25375C14.2559 4.91988 14.0342 5.56706 13.6257 6.09327C13.2173 6.61947 12.6453 6.99477 12 7.16M9.75 4.25C9.75 5.90685 8.40685 7.25 6.75 7.25C5.09315 7.25 3.75 5.90685 3.75 4.25C3.75 2.59315 5.09315 1.25 6.75 1.25C8.40685 1.25 9.75 2.59315 9.75 4.25Z"
1521
+ stroke="#475467"
1522
+ stroke-width="2"
1523
+ stroke-linecap="round"
1524
+ stroke-linejoin="round" />
1525
+ </svg></span> <span
1526
+ *ngIf="type ==='houseKeeping'"
1527
+ class="me-2"><svg
1528
+ xmlns="http://www.w3.org/2000/svg"
1529
+ width="18" height="18"
1530
+ viewBox="0 0 18 18" fill="none">
1531
+ <path fill-rule="evenodd"
1532
+ clip-rule="evenodd"
1533
+ d="M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z"
1534
+ fill="#475467" />
1535
+ </svg></span> <span
1536
+ *ngIf="type ==='junk'" class="me-2"><svg
1537
+ xmlns="http://www.w3.org/2000/svg"
1538
+ width="17" height="19"
1539
+ viewBox="0 0 17 19" fill="none">
1540
+ <path
1541
+ d="M1 4.33333H2.66667M2.66667 4.33333H16M2.66667 4.33333V16C2.66667 16.442 2.84226 16.8659 3.15482 17.1785C3.46738 17.4911 3.89131 17.6667 4.33333 17.6667H12.6667C13.1087 17.6667 13.5326 17.4911 13.8452 17.1785C14.1577 16.8659 14.3333 16.442 14.3333 16V4.33333H2.66667ZM5.16667 4.33333V2.66667C5.16667 2.22464 5.34226 1.80072 5.65482 1.48816C5.96738 1.17559 6.39131 1 6.83333 1H10.1667C10.6087 1 11.0326 1.17559 11.3452 1.48816C11.6577 1.80072 11.8333 2.22464 11.8333 2.66667V4.33333M6.83333 8.5V13.5M10.1667 8.5V13.5"
1542
+ stroke="#475467"
1543
+ stroke-width="2"
1544
+ stroke-linecap="round"
1545
+ stroke-linejoin="round" />
1546
+ </svg></span> <span
1547
+ *ngIf="type !=='junk' && type !=='houseKeeping' && type !=='employee'"
1548
+ class="me-2"><svg
1549
+ xmlns="http://www.w3.org/2000/svg"
1550
+ width="21" height="21"
1551
+ viewBox="0 0 21 21" fill="none">
1552
+ <path
1553
+ d="M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
1554
+ fill="#FFEAD5" />
1555
+ <path
1556
+ d="M5.66406 5.66663H5.67406M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
1557
+ stroke="#FB6514"
1558
+ stroke-width="1.33333"
1559
+ stroke-linecap="round"
1560
+ stroke-linejoin="round" />
1561
+ </svg></span> {{type | titlecase}}
1562
+
1563
+ </div>
1564
+ </div>
1565
+ <div *ngIf="isCheckboxEnable" class="ms-3 my-3">
1566
+ <input type="checkbox"
1567
+ [(ngModel)]="selectAllByType[type]"
1568
+ (change)="onSelectAll(type, $event)">
1569
+ <label>Select All</label>
1570
+ </div>
1571
+ <ng-container
1572
+ *ngFor="let mapping of source?.mappingInfo">
1573
+ <!-- Body Section -->
1574
+ <div *ngIf="mapping?.type ===viewMode"
1575
+ class="card-body bg-white layers p-5 m-3">
1576
+
1577
+ <div class="row">
1578
+ <ng-container
1579
+ *ngFor="let original of mapping?.revisedDetail;let i=index">
1580
+ <div *ngIf="original?.revopsType ===type"
1581
+ class="col-md-3 mb-3 position-relative">
1582
+ <div class="pb-3 h-100 rounded-3 position-relative"
1583
+ [ngClass]="{
1584
+ 'layer-approved': isApproved(original),
1585
+ 'layer-rejected': isRejected(original),
1586
+ 'img-border border border-1': !isApproved(original) && !isRejected(original)}">
1587
+
1588
+
1589
+ <!-- Top-right Checkbox -->
1590
+ <div
1591
+ *ngIf="isCheckboxEnable">
1592
+
1593
+ <input
1594
+ *ngIf="!isLockedByReviewer(original)"
1595
+ type="checkbox"
1596
+ class="position-absolute absolute form-check-input"
1597
+ [checked]="(selectedByType[type] || []).includes(original?.tempId)"
1598
+ (change)="onImageCheckboxChange(type, original.tempId,$event)" />
1599
+ <span
1600
+ class="position-absolute absolute"
1601
+ *ngIf="isLockedByReviewer(original)"
1602
+ (click)="resetCheckbox(type, original)">
1603
+
1604
+ <svg xmlns="http://www.w3.org/2000/svg"
1605
+ width="19"
1606
+ height="19"
1607
+ viewBox="0 0 19 19"
1608
+ fill="none">
1609
+ <g
1610
+ filter="url(#filter0_d_2023_13718)">
1611
+ <rect
1612
+ x="1.11133"
1613
+ y="0.555664"
1614
+ width="16"
1615
+ height="16"
1616
+ rx="2"
1617
+ fill="white" />
1618
+ <rect
1619
+ x="1.38911"
1620
+ y="0.833442"
1621
+ width="15.4444"
1622
+ height="15.4444"
1623
+ rx="1.72222"
1624
+ stroke="#D0D5DD"
1625
+ stroke-width="0.555556" />
1626
+ <path
1627
+ d="M5.87109 8.55566H12.3526"
1628
+ stroke="#344054"
1629
+ stroke-width="0.927778"
1630
+ stroke-linecap="round"
1631
+ stroke-linejoin="round" />
1632
+ </g>
1633
+ <defs>
1634
+ <filter
1635
+ id="filter0_d_2023_13718"
1636
+ x="0.00021708"
1637
+ y="0.00010854"
1638
+ width="18.2222"
1639
+ height="18.2222"
1640
+ filterUnits="userSpaceOnUse"
1641
+ color-interpolation-filters="sRGB">
1642
+ <feFlood
1643
+ flood-opacity="0"
1644
+ result="BackgroundImageFix" />
1645
+ <feColorMatrix
1646
+ in="SourceAlpha"
1647
+ type="matrix"
1648
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
1649
+ result="hardAlpha" />
1650
+ <feOffset
1651
+ dy="0.555556" />
1652
+ <feGaussianBlur
1653
+ stdDeviation="0.555556" />
1654
+ <feColorMatrix
1655
+ type="matrix"
1656
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
1657
+ <feBlend
1658
+ mode="normal"
1659
+ in2="BackgroundImageFix"
1660
+ result="effect1_dropShadow_2023_13718" />
1661
+ <feBlend
1662
+ mode="normal"
1663
+ in="SourceGraphic"
1664
+ in2="effect1_dropShadow_2023_13718"
1665
+ result="shape" />
1666
+ </filter>
1667
+ </defs>
1668
+ </svg>
1669
+ </span>
1670
+ </div>
1671
+
1672
+
1673
+ <img [src]="imageUrl + original?.filePath"
1674
+ alt=""
1675
+ (click)="openImagePreview(mapping,original, i, type)"
1676
+ class="w-100 rounded border cursor-pointer" />
1677
+ <div class="row my-2">
1678
+ <div class="col-8">
1679
+ <div
1680
+ class="desc-title ms-2 my-2">
1681
+ Tango ID: {{
1682
+ original.tempId
1683
+ }}
1684
+ <span
1685
+ *ngIf="getAction(original, 'review')?.action === 'approved'"
1686
+ class="ms-2"><svg
1687
+ style="width: 20px;
1688
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
1689
+ <rect
1690
+ y="0.5"
1691
+ width="10"
1692
+ height="10"
1693
+ rx="5"
1694
+ fill="#D1FADF" />
1695
+ <path
1696
+ fill-rule="evenodd"
1697
+ clip-rule="evenodd"
1698
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
1699
+ fill="#12B76A" />
1700
+ </svg>
1701
+ </span>
1702
+ <span
1703
+ *ngIf="getAction(original, 'review')?.action === 'rejected'"
1704
+ class="ms-2"><svg
1705
+ style="width: 20px;
1706
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
1707
+ <g
1708
+ clip-path="url(#clip0_1428_59484)">
1709
+ <path
1710
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1711
+ fill="#FEE4E2" />
1712
+ <path
1713
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
1714
+ stroke="#D92D20"
1715
+ stroke-linecap="round"
1716
+ stroke-linejoin="round" />
1717
+ </g>
1718
+ <defs>
1719
+ <clipPath
1720
+ id="clip0_1428_59484">
1721
+ <rect
1722
+ width="12"
1723
+ height="12"
1724
+ fill="white"
1725
+ transform="translate(0.599609 0.5)" />
1726
+ </clipPath>
1727
+ </defs>
1728
+ </svg></span>
1729
+ </div>
1730
+ <div
1731
+ class="desc-value ms-2">
1732
+ Entry Time: {{
1733
+ getFormattedEntryTime(original?.entryTime)
1734
+ }}</div>
1735
+ </div>
1736
+ <div class="col-4">
1737
+ <span
1738
+ *ngIf="getAction(original, 'approve')?.action === 'approved'">
1739
+ <svg xmlns="http://www.w3.org/2000/svg"
1740
+ width="37"
1741
+ height="37"
1742
+ viewBox="0 0 24 24"
1743
+ fill="none">
1744
+ <rect
1745
+ width="24"
1746
+ height="24"
1747
+ rx="12"
1748
+ fill="#D1FADF" />
1749
+ <g
1750
+ clip-path="url(#clip0_486_94051)">
1751
+ <path
1752
+ d="M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z"
1753
+ stroke="#039855"
1754
+ stroke-linecap="round"
1755
+ stroke-linejoin="round" />
1756
+ </g>
1757
+ <defs>
1758
+ <clipPath
1759
+ id="clip0_486_94051">
1760
+ <rect
1761
+ width="12"
1762
+ height="12"
1763
+ fill="white"
1764
+ transform="translate(6 6)" />
1765
+ </clipPath>
1766
+ </defs>
1767
+ </svg>
1768
+ </span>
1769
+ <span
1770
+ *ngIf="getAction(original, 'approve')?.action === 'rejected'"><svg
1771
+ xmlns="http://www.w3.org/2000/svg"
1772
+ width="37"
1773
+ height="37"
1774
+ viewBox="0 0 24 24"
1775
+ fill="none">
1776
+ <rect
1777
+ width="24"
1778
+ height="24"
1779
+ rx="12"
1780
+ fill="#FEE4E2" />
1781
+ <g
1782
+ clip-path="url(#clip0_486_94090)">
1783
+ <path
1784
+ d="M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z"
1785
+ stroke="#D92D20"
1786
+ stroke-linecap="round"
1787
+ stroke-linejoin="round" />
1788
+ </g>
1789
+ <defs>
1790
+ <clipPath
1791
+ id="clip0_486_94090">
1792
+ <rect
1793
+ width="12"
1794
+ height="12"
1795
+ fill="white"
1796
+ transform="translate(6 6)" />
1797
+ </clipPath>
1798
+ </defs>
1799
+ </svg></span>
1800
+ </div>
1801
+ </div>
1802
+ </div>
1803
+ </div>
1804
+ </ng-container>
1805
+ </div>
1806
+ </div>
1807
+ </ng-container>
1808
+ <div class="card-footer py-5"
1809
+ *ngIf="source?.commentsDetails?.length">
1810
+ <div class="comments-accordion">
1811
+ <!-- Accordion Header -->
1812
+ <div class="accordion-header"
1813
+ (click)="toggleCommentsAccordion(type)">
1814
+ <div
1815
+ class="d-flex justify-content-start align-items-center w-100">
1816
+ <div class="comments-title">
1817
+
1818
+ <span class="comments-count">
1819
+ <!-- {{
1820
+ getCategoryCommentCountForSource(source,
1821
+ type) }} -->
1822
+ Comments</span>
1823
+
1824
+
1825
+ </div>
1826
+ <div class="accordion-arrow ms-3">
1827
+ <svg [class.rotated]="selectedCommentCategory === type && commentsAccordionOpen"
1828
+ xmlns="http://www.w3.org/2000/svg"
1829
+ width="16" height="16"
1830
+ viewBox="0 0 16 16"
1831
+ fill="none">
1832
+ <path d="M4 6L8 10L12 6"
1833
+ stroke="#667085"
1834
+ stroke-width="2"
1835
+ stroke-linecap="round"
1836
+ stroke-linejoin="round" />
1837
+ </svg>
1838
+ </div>
1839
+ </div>
1840
+ </div>
1841
+
1842
+ <!-- Accordion Content -->
1843
+ <div class="accordion-body mt-3"
1844
+ *ngIf="selectedCommentCategory === type && commentsAccordionOpen">
1845
+
1846
+ <!-- loop each block: tagging / review / approve -->
1847
+ <ng-container
1848
+ *ngFor="let block of source?.commentsDetails">
1849
+
1850
+ <!-- TAGGING COMMENTS (each comment = one image + message) -->
1851
+ <ng-container
1852
+ *ngIf="block.type === 'tagging'">
1853
+ <ng-container
1854
+ *ngFor="let c of block.comments">
1855
+
1856
+ <div *ngIf="block.category === selectedCommentCategory"
1857
+ class="comment-thread d-flex mb-4">
1858
+
1859
+ <!-- avatar -->
1860
+ <div
1861
+ class="avatar avatar-text light-primary p-3">
1862
+
1863
+ {{
1864
+ getInitialsFromEmail(c.createdByEmail)
1865
+ }}
1866
+ </div>
1867
+
1868
+ <!-- content -->
1869
+ <div>
1870
+ <div
1871
+ class="fw-semibold">
1872
+ {{
1873
+ c.createdByEmail
1874
+ }}
1875
+ </div>
1876
+
1877
+ <div class="text-muted small"
1878
+ *ngIf="c.createdAt">
1879
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
1880
+ }}
1881
+ </div>
1882
+
1883
+ <p class="mb-2 mt-2"
1884
+ *ngIf="c.message">
1885
+ {{ c.message }}
1886
+ </p>
1887
+
1888
+ <!-- single image card -->
1889
+ <div
1890
+ class="d-flex flex-wrap">
1891
+ <div class="tango-card me-2"
1892
+ *ngIf="c.filePath">
1893
+ <div class="tango-image"
1894
+ [style.backgroundImage]="'url(' + imageUrl + c.filePath + ')'">
1895
+ </div>
1896
+
1897
+ <div
1898
+ class="tango-meta small">
1899
+ <div>
1900
+ Tango
1901
+ ID:
1902
+ {{
1903
+ c.tempId
1904
+ }}
1905
+ </div>
1906
+ <div
1907
+ class="text-muted">
1908
+ Entry
1909
+ time:
1910
+ {{
1911
+ c.entryTime
1912
+ }}
1913
+ </div>
1914
+ </div>
1915
+ </div>
1916
+ </div>
1917
+ </div>
1918
+ </div>
1919
+ </ng-container>
1920
+ </ng-container>
1921
+
1922
+ <!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->
1923
+ <ng-container
1924
+ *ngIf="block.type === 'review' || block.type === 'approve'">
1925
+ <ng-container
1926
+ *ngFor="let c of block.comments">
1927
+
1928
+ <div *ngIf="c.category === selectedCommentCategory"
1929
+ class="comment-thread d-flex mb-4">
1930
+
1931
+ <!-- avatar -->
1932
+ <div
1933
+ class="avatar avatar-text light-primary p-3">
1934
+
1935
+ {{
1936
+ getInitialsFromEmail(c.createdByEmail)
1937
+ }}
1938
+ </div>
1939
+
1940
+ <!-- content -->
1941
+ <div class="w-100">
1942
+ <div
1943
+ class="fw-semibold">
1944
+ {{
1945
+ c.createdByEmail
1946
+ }}
1947
+ </div>
1948
+
1949
+ <div class="text-muted small"
1950
+ *ngIf="c.createdAt">
1951
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
1952
+ }}
1953
+ </div>
1954
+
1955
+ <!-- main review/approve message -->
1956
+ <p class="mb-2 mt-2"
1957
+ *ngIf="c.message">
1958
+ {{ c.message }}
1959
+ </p>
1960
+
1961
+
1962
+
1963
+ <!-- image list + +N View all -->
1964
+ <div class="d-flex flex-wrap"
1965
+ *ngIf="c.taggedImages?.length">
1966
+
1967
+ <!-- first 3 images -->
1968
+ <div
1969
+ *ngFor="let img of c.taggedImages; let i = index">
1970
+ <ng-container
1971
+ *ngIf="i < 3">
1972
+ <div
1973
+ class="tango-card me-2">
1974
+ <div class="tango-image"
1975
+ [style.backgroundImage]="'url(' + imageUrl + img.filePath + ')'">
1976
+ </div>
1977
+
1978
+ <div
1979
+ class="tango-meta small">
1980
+ <div>
1981
+ Tango
1982
+ ID:
1983
+ {{
1984
+ img.tempId
1985
+ }}
1986
+ <span
1987
+ *ngIf="c.status === 'approved'"><svg
1988
+ style="width: 20px;
1989
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
1990
+ <rect
1991
+ y="0.5"
1992
+ width="10"
1993
+ height="10"
1994
+ rx="5"
1995
+ fill="#D1FADF" />
1996
+ <path
1997
+ fill-rule="evenodd"
1998
+ clip-rule="evenodd"
1999
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
2000
+ fill="#12B76A" />
2001
+ </svg></span>
2002
+
2003
+ <span
2004
+ *ngIf="c.status === 'rejected'"><svg
2005
+ style="width: 20px;
2006
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
2007
+ <g
2008
+ clip-path="url(#clip0_1428_59484)">
2009
+ <path
2010
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2011
+ fill="#FEE4E2" />
2012
+ <path
2013
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2014
+ stroke="#D92D20"
2015
+ stroke-linecap="round"
2016
+ stroke-linejoin="round" />
2017
+ </g>
2018
+ <defs>
2019
+ <clipPath
2020
+ id="clip0_1428_59484">
2021
+ <rect
2022
+ width="12"
2023
+ height="12"
2024
+ fill="white"
2025
+ transform="translate(0.599609 0.5)" />
2026
+ </clipPath>
2027
+ </defs>
2028
+ </svg></span>
2029
+ </div>
2030
+ <div
2031
+ class="text-muted">
2032
+ Entry
2033
+ time:
2034
+ {{
2035
+ img.entryTime
2036
+ }}
2037
+ </div>
2038
+ </div>
2039
+ </div>
2040
+ </ng-container>
2041
+ </div>
2042
+
2043
+ <!-- +N View all card -->
2044
+ <div class="tango-card me-2 more-card text-center"
2045
+ *ngIf="c.taggedImages.length > 3"
2046
+ [style.backgroundImage]="'url(' + imageUrl + c.taggedImages[3].filePath + ')'"
2047
+ (click)="openImagesPopup(c)">
2048
+ <div
2049
+ class="more-overlay">
2050
+ </div>
2051
+
2052
+ <!-- vertical container -->
2053
+ <div
2054
+ class="more-wrapper my-10 d-flex flex-column align-items-center justify-content-center">
2055
+ <div
2056
+ class="more-text fw-semibold">
2057
+ +{{
2058
+ c.taggedImages.length
2059
+ -
2060
+ 3 }}
2061
+ </div>
2062
+ <div
2063
+ class="text-primary text-dark text-decoration-underline small">
2064
+ View
2065
+ all
2066
+ </div>
2067
+ </div>
2068
+ </div>
2069
+
2070
+ </div>
2071
+ </div>
2072
+ </div>
2073
+ </ng-container>
2074
+ </ng-container>
2075
+ </ng-container>
2076
+
2077
+ </div>
2078
+
2079
+ </div>
2080
+ </div>
2081
+ </div>
2082
+ </section>
2083
+ </ng-container>
2084
+
2085
+
2086
+
2087
+ </div>
2088
+ </ng-container>
2089
+ </div>
2090
+
2091
+
2092
+ <div *ngIf="showApproveDetails"
2093
+ class="details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2"
2094
+ (click)="toggleRevisedDetails(mapping)">
2095
+ <span class="text-primary ">
2096
+ Hide in details
2097
+ </span>
2098
+
2099
+ <span *ngIf="showApproveDetails" class="chevron ms-3 cursor-pointer">
2100
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
2101
+ viewBox="0 0 24 24" fill="none">
2102
+ <path d="M6 15L12 9L18 15" stroke="#101828" stroke-width="2"
2103
+ stroke-linecap="round" stroke-linejoin="round" />
2104
+ </svg>
2105
+ </span>
2106
+ </div>
2107
+ </div>
2108
+
2109
+
2110
+ <div *ngIf="(mapping?.status === 'Closed' || mapping?.status === 'Closed - Accuracy Issue' || mapping?.status === 'Open - Accuracy Issue') && ['tangoreview'].includes(mapping?.type)"
2111
+ class="card-footer revision-card-approve py-1 bg-light-primary">
2112
+ <div *ngIf="!showTangoDetails"
2113
+ class="details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2"
2114
+ (click)="toggleRevisedDetails(mapping)">
2115
+ <span class="text-primary ">
2116
+ Show in details
2117
+ </span>
2118
+ <span class="chevron ms-3 cursor-pointer"
2119
+ [class.rotate-180]="showRevisedDetails"><svg
2120
+ xmlns="http://www.w3.org/2000/svg" width="24" height="24"
2121
+ viewBox="0 0 24 24" fill="none">
2122
+ <path d="M18 9L12 15L6 9" stroke="#101828" stroke-width="2"
2123
+ stroke-linecap="round" stroke-linejoin="round" />
2124
+ </svg></span>
2125
+
2126
+ </div>
2127
+
2128
+ <div class="details-body mt-2" *ngIf="showTangoDetails">
2129
+
2130
+ <div>
2131
+ <div class="nav-group bg-white btn-group w-auto my-2">
2132
+ <ng-container>
2133
+
2134
+ <button class="btn btn-outline px-6 py-3"
2135
+ [ngClass]="type === 'footfall' ? 'activePlanBtn' : 'inactivePlanBtn'"
2136
+ (click)="selectPlanTrends('footfall')">
2137
+ Total Footfall
2138
+ <span
2139
+ [ngClass]="type === 'footfall' ? 'activePlanBtn badge badge-active' : 'inactivePlanBtn badge badge-light-default'">
2140
+ {{ this.filterList?.length || 0 }}
2141
+ </span>
2142
+ </button>
2143
+ <button class="btn btn-outline px-6 py-3 text-capitalize"
2144
+ *ngFor="let item of countData"
2145
+ [ngClass]="type === item.type ? 'activePlanBtn' : 'inactivePlanBtn'"
2146
+ (click)="selectPlanTrends(item.type)">
2147
+ {{item.type}}
2148
+ <span
2149
+ [ngClass]="type === item.type ? 'activePlanBtn badge badge-active' : 'inactivePlanBtn badge badge-light-default'">
2150
+ {{ item?.count || 0 }}
2151
+ </span>
2152
+ </button>
2153
+ </ng-container>
2154
+
2155
+ </div>
2156
+ <div class="row">
2157
+ <div *ngFor="let original of filteredList;let i=index"
2158
+ class="col-6 col-sm-4 col-md-3 col-lg-2-4 mb-2">
2159
+
2160
+ <div
2161
+ class="pb-3 img-border border border-1 h-100 rounded-3">
2162
+ <img [src]="original?.filePath" alt=""
2163
+ class="w-100 h-250px rounded border cursor-pointer" />
2164
+ <div class="row my-2">
2165
+ <div class="col-9">
2166
+ <div class="desc-title ms-2 my-2">Tango ID:
2167
+ {{
2168
+ original.tempId
2169
+ }}
2170
+
2171
+ </div>
2172
+
2173
+ </div>
2174
+ <div class="col-3 my-2 pe-5 text-end">
2175
+ <span
2176
+ *ngIf="original.revopsType==='non-tagging'">
2177
+ <svg xmlns="http://www.w3.org/2000/svg"
2178
+ width="19" height="18"
2179
+ viewBox="0 0 19 18" fill="none">
2180
+ <path
2181
+ d="M6.02344 5.625H6.03094M16.2159 10.4325L10.8384 15.81C10.6991 15.9495 10.5337 16.0601 10.3516 16.1356C10.1695 16.2111 9.97431 16.2499 9.77719 16.2499C9.58006 16.2499 9.38487 16.2111 9.20278 16.1356C9.02068 16.0601 8.85525 15.9495 8.71594 15.81L2.27344 9.375V1.875H9.77344L16.2159 8.3175C16.4953 8.59854 16.6521 8.97872 16.6521 9.375C16.6521 9.77128 16.4953 10.1515 16.2159 10.4325Z"
2182
+ stroke="#475467" stroke-width="2"
2183
+ stroke-linecap="round"
2184
+ stroke-linejoin="round">
2185
+ </path>
2186
+ </svg>
2187
+ </span>
2188
+ <span *ngIf="original.revopsType==='duplicate'">
2189
+ <svg xmlns="http://www.w3.org/2000/svg"
2190
+ width="18" height="18"
2191
+ viewBox="0 0 18 18" fill="none">
2192
+ <g clip-path="url(#clip0_730_76157)">
2193
+ <path
2194
+ d="M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z"
2195
+ stroke="#475467"
2196
+ stroke-width="2"
2197
+ stroke-linecap="round"
2198
+ stroke-linejoin="round" />
2199
+ </g>
2200
+ <defs>
2201
+ <clipPath id="clip0_730_76157">
2202
+ <rect width="18" height="18"
2203
+ fill="white" />
2204
+ </clipPath>
2205
+ </defs>
2206
+ </svg>
2207
+ </span>
2208
+ <span *ngIf="original.revopsType==='employee'">
2209
+ <svg xmlns="http://www.w3.org/2000/svg"
2210
+ width="18" height="16"
2211
+ viewBox="0 0 18 16" fill="none">
2212
+ <path
2213
+ d="M12.75 14.75V13.25C12.75 12.4544 12.4339 11.6913 11.8713 11.1287C11.3087 10.5661 10.5456 10.25 9.75 10.25H3.75C2.95435 10.25 2.19129 10.5661 1.62868 11.1287C1.06607 11.6913 0.75 12.4544 0.75 13.25V14.75M17.25 14.75V13.25C17.2495 12.5853 17.0283 11.9396 16.621 11.4142C16.2138 10.8889 15.6436 10.5137 15 10.3475M12 1.3475C12.6453 1.51273 13.2173 1.88803 13.6257 2.41423C14.0342 2.94044 14.2559 3.58762 14.2559 4.25375C14.2559 4.91988 14.0342 5.56706 13.6257 6.09327C13.2173 6.61947 12.6453 6.99477 12 7.16M9.75 4.25C9.75 5.90685 8.40685 7.25 6.75 7.25C5.09315 7.25 3.75 5.90685 3.75 4.25C3.75 2.59315 5.09315 1.25 6.75 1.25C8.40685 1.25 9.75 2.59315 9.75 4.25Z"
2214
+ stroke="#475467" stroke-width="2"
2215
+ stroke-linecap="round"
2216
+ stroke-linejoin="round" />
2217
+ </svg>
2218
+ </span>
2219
+ <span
2220
+ *ngIf="original.revopsType==='houseKeeping'">
2221
+ <svg xmlns="http://www.w3.org/2000/svg"
2222
+ width="18" height="18"
2223
+ viewBox="0 0 18 18" fill="none">
2224
+ <path fill-rule="evenodd"
2225
+ clip-rule="evenodd"
2226
+ d="M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z"
2227
+ fill="#475467" />
2228
+ </svg>
2229
+ </span>
2230
+ <span *ngIf="original.revopsType==='vendor'">
2231
+ <svg xmlns="http://www.w3.org/2000/svg"
2232
+ width="21" height="21"
2233
+ viewBox="0 0 21 21" fill="none">
2234
+ <path
2235
+ d="M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2236
+ fill="#EBE9FE" />
2237
+ <path
2238
+ d="M5.66406 5.66663H5.67406M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2239
+ stroke="#7A5AF8"
2240
+ stroke-width="1.33333"
2241
+ stroke-linecap="round"
2242
+ stroke-linejoin="round" />
2243
+ </svg>
2244
+ </span>
2245
+ <span
2246
+ *ngIf="original.revopsType==='technician'">
2247
+ <svg xmlns="http://www.w3.org/2000/svg"
2248
+ width="21" height="21"
2249
+ viewBox="0 0 21 21" fill="none">
2250
+ <path
2251
+ d="M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2252
+ fill="#EBE9FE" />
2253
+ <path
2254
+ d="M5.66406 5.66663H5.67406M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2255
+ stroke="#7A5AF8"
2256
+ stroke-width="1.33333"
2257
+ stroke-linecap="round"
2258
+ stroke-linejoin="round" />
2259
+ </svg>
2260
+ </span>
2261
+ <span *ngIf="original.revopsType==='junk'">
2262
+ <svg xmlns="http://www.w3.org/2000/svg"
2263
+ width="17" height="19"
2264
+ viewBox="0 0 17 19" fill="none">
2265
+ <path
2266
+ d="M1 4.33333H2.66667M2.66667 4.33333H16M2.66667 4.33333V16C2.66667 16.442 2.84226 16.8659 3.15482 17.1785C3.46738 17.4911 3.89131 17.6667 4.33333 17.6667H12.6667C13.1087 17.6667 13.5326 17.4911 13.8452 17.1785C14.1577 16.8659 14.3333 16.442 14.3333 16V4.33333H2.66667ZM5.16667 4.33333V2.66667C5.16667 2.22464 5.34226 1.80072 5.65482 1.48816C5.96738 1.17559 6.39131 1 6.83333 1H10.1667C10.6087 1 11.0326 1.17559 11.3452 1.48816C11.6577 1.80072 11.8333 2.22464 11.8333 2.66667V4.33333M6.83333 8.5V13.5M10.1667 8.5V13.5"
2267
+ stroke="#475467" stroke-width="2"
2268
+ stroke-linecap="round"
2269
+ stroke-linejoin="round" />
2270
+ </svg>
2271
+ </span>
2272
+ </div>
2273
+ </div>
2274
+ </div>
2275
+ </div>
2276
+ </div>
2277
+ </div>
2278
+
2279
+
2280
+
2281
+ </div>
2282
+ <div *ngIf="showTangoDetails"
2283
+ class="details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2"
2284
+ (click)="toggleRevisedDetails(mapping)">
2285
+ <span class="text-primary ">
2286
+ Hide in details
2287
+ </span>
2288
+
2289
+ <span class="chevron ms-3 cursor-pointer">
2290
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
2291
+ viewBox="0 0 24 24" fill="none">
2292
+ <path d="M6 15L12 9L18 15" stroke="#101828" stroke-width="2"
2293
+ stroke-linecap="round" stroke-linejoin="round" />
2294
+ </svg>
2295
+ </span>
2296
+ </div>
2297
+ </div>
2298
+
2299
+
2300
+ </ng-container>
2301
+
2302
+
2303
+
2304
+ <!-- <div class="timeline"></div> -->
2305
+
2306
+ </div>
2307
+ </ng-container>
2308
+ </section>
2309
+ </div>
2310
+
2311
+ </div>
2312
+ <section *ngIf="!footfallLoading && !footfallNoData">
2313
+
2314
+
2315
+ <div class="row">
2316
+ <div class="col-md-6 position-relative">
2317
+ <div *ngIf="isCheckboxEnable" class="pb-3 my-3 h-100 rounded-3 position-relative">
2318
+
2319
+ <input type="checkbox" class="position-absolute absolute1 form-check-input"
2320
+ [(ngModel)]="allSelected" (change)="overallSelect($event)" /><span class="ms-12">
2321
+ Select
2322
+ All</span>
2323
+ </div>
2324
+ </div>
2325
+ <div *ngIf="isCheckboxEnable" class="col-md-6 pe-8">
2326
+
2327
+ <div class="row">
2328
+ <div class="col-md-4">
2329
+
2330
+
2331
+
2332
+
2333
+ </div>
2334
+ <div class="col-md-4">
2335
+ <button [disabled]="!overallSelectedIds?.length"
2336
+ class="btn btn-outline bg-white w-100" (click)="popupOpen('rejected')">
2337
+
2338
+ {{ ((hasApproverAccess && selectedRole === 'approver')
2339
+ || (hasReviewerAccess && selectedRole === 'reviewer'))
2340
+ ? 'Deny'
2341
+ : 'Reject' }}
2342
+
2343
+ </button>
2344
+ </div>
2345
+ <div class="col-md-4">
2346
+ <button [disabled]="!overallSelectedIds?.length"
2347
+ class="btn btn-outline bg-white w-100" (click)="popupOpen('approved')">
2348
+
2349
+ {{ ((hasApproverAccess && selectedRole === 'approver')
2350
+ || (hasReviewerAccess && selectedRole === 'reviewer'))
2351
+ ? 'Approve'
2352
+ : 'Accept' }}
2353
+
2354
+ </button>
2355
+ </div>
2356
+
2357
+ </div>
2358
+ </div>
2359
+
2360
+ </div>
2361
+
2362
+ <div *ngIf="!approverClosed" class="bg-white">
2363
+ <ng-container *ngFor="let ticket of footfallTicketsData">
2364
+ <div *ngIf="ticket?._source as source" class="my-5">
2365
+ <ng-container *ngFor="let type of revopsTypes">
2366
+ <section *ngIf="type ==='duplicate'">
2367
+
2368
+ <div *ngIf="hasRevopsType(type)" class="layers">
2369
+ <!-- Header Section -->
2370
+ <div class="card-header min-h-25px pt-3">
2371
+ <h3 class="text-lg font-semibold mb-4">
2372
+ <span class="me-2">
2373
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18"
2374
+ viewBox="0 0 18 18" fill="none">
2375
+ <g clip-path="url(#clip0_730_76157)">
2376
+ <path
2377
+ d="M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z"
2378
+ stroke="#475467" stroke-width="2"
2379
+ stroke-linecap="round" stroke-linejoin="round" />
2380
+ </g>
2381
+ <defs>
2382
+ <clipPath id="clip0_730_76157">
2383
+ <rect width="18" height="18" fill="white" />
2384
+ </clipPath>
2385
+ </defs>
2386
+ </svg>
2387
+ </span>
2388
+ Duplicates
2389
+ </h3>
2390
+ </div>
2391
+
2392
+
2393
+ <!-- Body Section -->
2394
+ <ng-container *ngFor="let mapping of source?.mappingInfo">
2395
+ <!-- Body Section -->
2396
+ <ng-container *ngIf="mapping?.type ===viewMode">
2397
+ <ng-container *ngFor="let original of mapping?.revisedDetail">
2398
+ <div *ngIf="original?.isParent && original?.revopsType ==='duplicate'"
2399
+ class="card-body bg-white layers pt-5 pb-0 px-0 m-3">
2400
+ <div class="mt-4">
2401
+ <!-- Original Image -->
2402
+ <div class="duplicate-head px-5 my-3">Original image
2403
+ </div>
2404
+ <div class="row px-5">
2405
+ <div class="col-md-4 relative">
2406
+ <div
2407
+ class="pb-3 img-border border border-1 h-100 rounded-3">
2408
+
2409
+ <img [src]="imageUrl + original?.filePath"
2410
+ alt="" class="w-100 rounded border" />
2411
+ <div class="desc-title ms-2 my-2">Tango ID:
2412
+ {{
2413
+ original.tempId
2414
+ }}</div>
2415
+ <div class="desc-value ms-2">Entry Time: {{
2416
+ getFormattedEntryTime(original?.entryTime)
2417
+ }}</div>
2418
+ </div>
2419
+ </div>
2420
+ </div>
2421
+
2422
+
2423
+ <div class="separator separator-dashed mt-3 mb-5"></div>
2424
+ <div class="row px-5">
2425
+ <h5 class="duplicate-head my-3 fs-6">Tagged
2426
+ Duplicates</h5>
2427
+ <div *ngIf="isCheckboxEnable" class="my-3">
2428
+ <input type="checkbox"
2429
+ [checked]="areAllDuplicatesSelected(original)"
2430
+ (change)="onToggleSelectAllDuplicates(original, $event)" />
2431
+ <label class="ms-2">Select All</label>
2432
+ </div>
2433
+ <div *ngFor="let duplicate of original?.duplicateImage; let i = index"
2434
+ class="col-md-3 mb-3 position-relative">
2435
+ <div *ngIf="matchesStatusFilter(duplicate)"
2436
+ class="pb-3 h-100 rounded-3 position-relative"
2437
+ [ngClass]="{
2438
+ 'layer-approved': isApproved(duplicate),
2439
+ 'layer-rejected': isRejected(duplicate),
2440
+ 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}">
2441
+ <!-- Checkbox -->
2442
+ <div *ngIf="isCheckboxEnable">
2443
+ <input type="checkbox"
2444
+ *ngIf="!isLockedByReviewer(duplicate)"
2445
+ style="right: 5px ; margin: 10px 5px 4px !important;"
2446
+ [checked]="isDuplicateSelected(original.tempId, duplicate.tempId)"
2447
+ (change)="onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)"
2448
+ class="position-absolute form-check-input duplicate-checkbox" />
2449
+ <span class="position-absolute absolute"
2450
+ *ngIf="isLockedByReviewer(duplicate)"
2451
+ (click)="resetCheckbox('duplicate', duplicate)">
2452
+
2453
+
2454
+ <svg xmlns="http://www.w3.org/2000/svg"
2455
+ width="19" height="19"
2456
+ viewBox="0 0 19 19" fill="none">
2457
+ <g
2458
+ filter="url(#filter0_d_2023_13718)">
2459
+ <rect x="1.11133"
2460
+ y="0.555664" width="16"
2461
+ height="16" rx="2"
2462
+ fill="white" />
2463
+ <rect x="1.38911"
2464
+ y="0.833442"
2465
+ width="15.4444"
2466
+ height="15.4444"
2467
+ rx="1.72222"
2468
+ stroke="#D0D5DD"
2469
+ stroke-width="0.555556" />
2470
+ <path
2471
+ d="M5.87109 8.55566H12.3526"
2472
+ stroke="#344054"
2473
+ stroke-width="0.927778"
2474
+ stroke-linecap="round"
2475
+ stroke-linejoin="round" />
2476
+ </g>
2477
+ <defs>
2478
+ <filter
2479
+ id="filter0_d_2023_13718"
2480
+ x="0.00021708"
2481
+ y="0.00010854"
2482
+ width="18.2222"
2483
+ height="18.2222"
2484
+ filterUnits="userSpaceOnUse"
2485
+ color-interpolation-filters="sRGB">
2486
+ <feFlood
2487
+ flood-opacity="0"
2488
+ result="BackgroundImageFix" />
2489
+ <feColorMatrix
2490
+ in="SourceAlpha"
2491
+ type="matrix"
2492
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
2493
+ result="hardAlpha" />
2494
+ <feOffset
2495
+ dy="0.555556" />
2496
+ <feGaussianBlur
2497
+ stdDeviation="0.555556" />
2498
+ <feColorMatrix
2499
+ type="matrix"
2500
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
2501
+ <feBlend mode="normal"
2502
+ in2="BackgroundImageFix"
2503
+ result="effect1_dropShadow_2023_13718" />
2504
+ <feBlend mode="normal"
2505
+ in="SourceGraphic"
2506
+ in2="effect1_dropShadow_2023_13718"
2507
+ result="shape" />
2508
+ </filter>
2509
+ </defs>
2510
+ </svg>
2511
+
2512
+ </span>
2513
+ </div>
2514
+ <!-- (change)="onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')" -->
2515
+ <!-- Duplicate Image -->
2516
+ <img [src]="imageUrl + duplicate.filePath"
2517
+ alt=""
2518
+ (click)="openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')"
2519
+ class="w-100 rounded border duplicate-image cursor-pointer" />
2520
+
2521
+ <!-- Duplicate Info -->
2522
+ <div class="row my-2">
2523
+ <div class="col-9">
2524
+ <div class="desc-title ms-2 my-2">
2525
+ Tango ID: {{ duplicate.tempId }}
2526
+
2527
+ <span
2528
+ *ngIf="getAction(duplicate, 'review')?.action === 'approved'"
2529
+ class="ms-2"><svg style="width: 20px;
2530
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
2531
+ <rect y="0.5" width="10"
2532
+ height="10" rx="5"
2533
+ fill="#D1FADF" />
2534
+ <path
2535
+ fill-rule="evenodd"
2536
+ clip-rule="evenodd"
2537
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
2538
+ fill="#12B76A" />
2539
+ </svg>
2540
+ </span>
2541
+ <span
2542
+ *ngIf="getAction(duplicate, 'review')?.action === 'rejected'"
2543
+ class="ms-2"><svg style="width: 20px;
2544
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
2545
+ <g
2546
+ clip-path="url(#clip0_1428_59484)">
2547
+ <path
2548
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2549
+ fill="#FEE4E2" />
2550
+ <path
2551
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2552
+ stroke="#D92D20"
2553
+ stroke-linecap="round"
2554
+ stroke-linejoin="round" />
2555
+ </g>
2556
+ <defs>
2557
+ <clipPath
2558
+ id="clip0_1428_59484">
2559
+ <rect width="12"
2560
+ height="12"
2561
+ fill="white"
2562
+ transform="translate(0.599609 0.5)" />
2563
+ </clipPath>
2564
+ </defs>
2565
+ </svg></span>
2566
+
2567
+ </div>
2568
+
2569
+ <div class="desc-value ms-2">Entry
2570
+ Time: {{
2571
+ getFormattedEntryTime(duplicate.entryTime)
2572
+ }}
2573
+ </div>
2574
+ </div>
2575
+ <div class="col-3">
2576
+ <span
2577
+ *ngIf="getAction(duplicate, 'approve')?.action === 'approved'">
2578
+
2579
+ <svg xmlns="http://www.w3.org/2000/svg"
2580
+ width="37" height="37"
2581
+ viewBox="0 0 24 24"
2582
+ fill="none">
2583
+ <rect width="24" height="24"
2584
+ rx="12"
2585
+ fill="#D1FADF" />
2586
+ <g
2587
+ clip-path="url(#clip0_486_94051)">
2588
+ <path
2589
+ d="M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z"
2590
+ stroke="#039855"
2591
+ stroke-linecap="round"
2592
+ stroke-linejoin="round" />
2593
+ </g>
2594
+ <defs>
2595
+ <clipPath
2596
+ id="clip0_486_94051">
2597
+ <rect width="12"
2598
+ height="12"
2599
+ fill="white"
2600
+ transform="translate(6 6)" />
2601
+ </clipPath>
2602
+ </defs>
2603
+ </svg>
2604
+
2605
+ </span>
2606
+ <span
2607
+ *ngIf="getAction(duplicate, 'approve')?.action === 'rejected'"><svg
2608
+ xmlns="http://www.w3.org/2000/svg"
2609
+ width="37" height="37"
2610
+ viewBox="0 0 24 24"
2611
+ fill="none">
2612
+ <rect width="24" height="24"
2613
+ rx="12"
2614
+ fill="#FEE4E2" />
2615
+ <g
2616
+ clip-path="url(#clip0_486_94090)">
2617
+ <path
2618
+ d="M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z"
2619
+ stroke="#D92D20"
2620
+ stroke-linecap="round"
2621
+ stroke-linejoin="round" />
2622
+ </g>
2623
+ <defs>
2624
+ <clipPath
2625
+ id="clip0_486_94090">
2626
+ <rect width="12"
2627
+ height="12"
2628
+ fill="white"
2629
+ transform="translate(6 6)" />
2630
+ </clipPath>
2631
+ </defs>
2632
+ </svg> </span>
2633
+ </div>
2634
+ </div>
2635
+ <!-- Duplicate Reason -->
2636
+ <!-- <div class="duplicate-reason ms-2 mt-2">
2637
+ <small class="text-muted">{{ duplicate.reason }}</small>
2638
+ </div> -->
2639
+ </div>
2640
+ </div>
2641
+ </div>
2642
+
2643
+ <div class="card-footer py-5"
2644
+ *ngIf="source?.commentsDetails?.length">
2645
+ <div class="comments-accordion">
2646
+ <!-- Accordion Header -->
2647
+ <div class="accordion-header"
2648
+ (click)="toggleCommentsAccordion(type)">
2649
+ <div
2650
+ class="d-flex justify-content-start align-items-center w-100">
2651
+ <span class="comments-count">
2652
+ <!-- {{
2653
+ getCategoryCommentCountForSource(source,
2654
+ type) }} -->
2655
+ Comments</span>
2656
+ <div class="accordion-arrow ms-3">
2657
+ <svg [class.rotated]="selectedCommentCategory ==='duplicate' && commentsAccordionOpen"
2658
+ xmlns="http://www.w3.org/2000/svg"
2659
+ width="16" height="16"
2660
+ viewBox="0 0 16 16" fill="none">
2661
+ <path d="M4 6L8 10L12 6"
2662
+ stroke="#667085"
2663
+ stroke-width="2"
2664
+ stroke-linecap="round"
2665
+ stroke-linejoin="round" />
2666
+ </svg>
2667
+ </div>
2668
+
2669
+ </div>
2670
+ </div>
2671
+
2672
+ <!-- Accordion Body -->
2673
+ <div class="accordion-body mt-3"
2674
+ *ngIf="selectedCommentCategory ==='duplicate' && commentsAccordionOpen">
2675
+
2676
+ <!-- Loop each block: tagging / review / approve -->
2677
+ <ng-container
2678
+ *ngFor="let block of source?.commentsDetails">
2679
+
2680
+ <!-- Loop inside comments -->
2681
+ <ng-container
2682
+ *ngFor="let c of block.comments">
2683
+ <ng-container
2684
+ *ngIf="(block?.parent === original?.tempId && block.category ==='duplicate') || (c?.parent === original?.tempId && c.category ==='duplicate')">
2685
+
2686
+ <div *ngIf="(c.category === 'duplicate' || block.category === 'duplicate')"
2687
+ class="comment-thread d-flex mb-4">
2688
+
2689
+ <!-- avatar -->
2690
+ <div
2691
+ class="avatar avatar-text light-primary p-3">
2692
+
2693
+ {{
2694
+ getInitialsFromEmail(c.createdByEmail)
2695
+ }}
2696
+ </div>
2697
+ <div class="w-100">
2698
+ <!-- email -->
2699
+ <div
2700
+ class="fw-semibold">
2701
+ {{ c.createdByEmail
2702
+ }}
2703
+ </div>
2704
+ <div class="text-muted small"
2705
+ *ngIf="c.createdAt">
2706
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
2707
+ }}
2708
+ </div>
2709
+
2710
+ <!-- message text -->
2711
+ <p class="mb-2 mt-2"
2712
+ *ngIf="c.message">
2713
+ {{ c.message }}
2714
+ </p>
2715
+
2716
+
2717
+ <!-- Review / Approve only -->
2718
+ <ng-container
2719
+ *ngIf="block.type === 'review' || block.type === 'approve'">
2720
+ <!-- Tagged images -->
2721
+ <div
2722
+ class="d-flex flex-wrap">
2723
+
2724
+ <div
2725
+ *ngFor="let img of c.taggedImages; let i = index">
2726
+
2727
+ <!-- Show only first 4 -->
2728
+ <ng-container
2729
+ *ngIf="i < 3">
2730
+ <div
2731
+ class="tango-card me-2">
2732
+ <div class="tango-image"
2733
+ [style.backgroundImage]="'url('+ imageUrl + img.filePath + ')'">
2734
+ </div>
2735
+
2736
+ <div
2737
+ class="tango-meta small">
2738
+ <div>
2739
+ Tango
2740
+ ID:
2741
+ {{
2742
+ img.tempId
2743
+ }}
2744
+
2745
+ <!-- status dots -->
2746
+ <span
2747
+ *ngIf="c.status === 'approved'"><svg
2748
+ style="width: 20px;
2749
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
2750
+ <rect
2751
+ y="0.5"
2752
+ width="10"
2753
+ height="10"
2754
+ rx="5"
2755
+ fill="#D1FADF" />
2756
+ <path
2757
+ fill-rule="evenodd"
2758
+ clip-rule="evenodd"
2759
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
2760
+ fill="#12B76A" />
2761
+ </svg></span>
2762
+
2763
+ <span
2764
+ *ngIf="c.status === 'rejected'"><svg
2765
+ style="width: 20px;
2766
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
2767
+ <g
2768
+ clip-path="url(#clip0_1428_59484)">
2769
+ <path
2770
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2771
+ fill="#FEE4E2" />
2772
+ <path
2773
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
2774
+ stroke="#D92D20"
2775
+ stroke-linecap="round"
2776
+ stroke-linejoin="round" />
2777
+ </g>
2778
+ <defs>
2779
+ <clipPath
2780
+ id="clip0_1428_59484">
2781
+ <rect
2782
+ width="12"
2783
+ height="12"
2784
+ fill="white"
2785
+ transform="translate(0.599609 0.5)" />
2786
+ </clipPath>
2787
+ </defs>
2788
+ </svg></span>
2789
+ </div>
2790
+
2791
+ <div
2792
+ class="text-muted">
2793
+ Entry
2794
+ time:
2795
+ {{
2796
+ img.entryTime
2797
+ }}
2798
+ </div>
2799
+ </div>
2800
+ </div>
2801
+ </ng-container>
2802
+
2803
+ </div>
2804
+
2805
+ <!-- +N more -->
2806
+ <div class="tango-card me-2 more-card text-center"
2807
+ *ngIf="c.taggedImages.length > 3"
2808
+ [style.backgroundImage]="'url(' + imageUrl + c.taggedImages[3].filePath + ')'"
2809
+ (click)="openImagesPopup(c)">
2810
+ <div
2811
+ class="more-overlay">
2812
+ </div>
2813
+
2814
+ <!-- vertical container -->
2815
+ <div
2816
+ class="more-wrapper my-10 d-flex flex-column align-items-center justify-content-center">
2817
+ <div
2818
+ class="more-text fw-semibold">
2819
+ +{{
2820
+ c.taggedImages.length
2821
+ -
2822
+ 3 }}
2823
+ </div>
2824
+ <div
2825
+ class="text-primary text-dark text-decoration-underline small">
2826
+ View
2827
+ all
2828
+ </div>
2829
+ </div>
2830
+ </div>
2831
+
2832
+
2833
+
2834
+ </div>
2835
+
2836
+ </ng-container>
2837
+
2838
+ </div>
2839
+ </div>
2840
+ </ng-container>
2841
+ </ng-container>
2842
+ </ng-container>
2843
+ </div>
2844
+
2845
+
2846
+ </div>
2847
+ </div>
2848
+ </div>
2849
+ </div>
2850
+
2851
+ </ng-container>
2852
+
2853
+ </ng-container>
2854
+
2855
+ </ng-container>
2856
+ <!-- Status Icons -->
2857
+
2858
+
2859
+ </div>
2860
+ </section>
2861
+ <section *ngIf="type !=='duplicate'">
2862
+ <div class="layers my-2" *ngIf="hasRevopsType(type)">
2863
+ <div class="card-header min-h-25px pt-3">
2864
+ <div class="duplicate-head text-lg my-3"><span
2865
+ *ngIf="type ==='employee'" class="me-2"><svg
2866
+ xmlns="http://www.w3.org/2000/svg" width="18" height="16"
2867
+ viewBox="0 0 18 16" fill="none">
2868
+ <path
2869
+ d="M12.75 14.75V13.25C12.75 12.4544 12.4339 11.6913 11.8713 11.1287C11.3087 10.5661 10.5456 10.25 9.75 10.25H3.75C2.95435 10.25 2.19129 10.5661 1.62868 11.1287C1.06607 11.6913 0.75 12.4544 0.75 13.25V14.75M17.25 14.75V13.25C17.2495 12.5853 17.0283 11.9396 16.621 11.4142C16.2138 10.8889 15.6436 10.5137 15 10.3475M12 1.3475C12.6453 1.51273 13.2173 1.88803 13.6257 2.41423C14.0342 2.94044 14.2559 3.58762 14.2559 4.25375C14.2559 4.91988 14.0342 5.56706 13.6257 6.09327C13.2173 6.61947 12.6453 6.99477 12 7.16M9.75 4.25C9.75 5.90685 8.40685 7.25 6.75 7.25C5.09315 7.25 3.75 5.90685 3.75 4.25C3.75 2.59315 5.09315 1.25 6.75 1.25C8.40685 1.25 9.75 2.59315 9.75 4.25Z"
2870
+ stroke="#475467" stroke-width="2" stroke-linecap="round"
2871
+ stroke-linejoin="round" />
2872
+ </svg></span> <span *ngIf="type ==='houseKeeping'"
2873
+ class="me-2"><svg xmlns="http://www.w3.org/2000/svg" width="18"
2874
+ height="18" viewBox="0 0 18 18" fill="none">
2875
+ <path fill-rule="evenodd" clip-rule="evenodd"
2876
+ d="M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z"
2877
+ fill="#475467" />
2878
+ </svg></span> <span *ngIf="type ==='junk'" class="me-2"><svg
2879
+ xmlns="http://www.w3.org/2000/svg" width="17" height="19"
2880
+ viewBox="0 0 17 19" fill="none">
2881
+ <path
2882
+ d="M1 4.33333H2.66667M2.66667 4.33333H16M2.66667 4.33333V16C2.66667 16.442 2.84226 16.8659 3.15482 17.1785C3.46738 17.4911 3.89131 17.6667 4.33333 17.6667H12.6667C13.1087 17.6667 13.5326 17.4911 13.8452 17.1785C14.1577 16.8659 14.3333 16.442 14.3333 16V4.33333H2.66667ZM5.16667 4.33333V2.66667C5.16667 2.22464 5.34226 1.80072 5.65482 1.48816C5.96738 1.17559 6.39131 1 6.83333 1H10.1667C10.6087 1 11.0326 1.17559 11.3452 1.48816C11.6577 1.80072 11.8333 2.22464 11.8333 2.66667V4.33333M6.83333 8.5V13.5M10.1667 8.5V13.5"
2883
+ stroke="#475467" stroke-width="2" stroke-linecap="round"
2884
+ stroke-linejoin="round" />
2885
+ </svg></span> <span
2886
+ *ngIf="type !=='junk' && type !=='houseKeeping' && type !=='employee'"
2887
+ class="me-2">
2888
+
2889
+ <svg xmlns="http://www.w3.org/2000/svg" width="21" height="21"
2890
+ viewBox="0 0 21 21" fill="none">
2891
+ <path
2892
+ d="M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2893
+ fill="#EBE9FE" />
2894
+ <path
2895
+ d="M5.66406 5.66663H5.67406M19.2541 12.0766L12.0841 19.2466C11.8983 19.4326 11.6777 19.5801 11.4349 19.6807C11.1921 19.7814 10.9319 19.8332 10.6691 19.8332C10.4062 19.8332 10.146 19.7814 9.90318 19.6807C9.66039 19.5801 9.43981 19.4326 9.25406 19.2466L0.664062 10.6666V0.666626H10.6641L19.2541 9.25663C19.6266 9.63135 19.8356 10.1383 19.8356 10.6666C19.8356 11.195 19.6266 11.7019 19.2541 12.0766Z"
2896
+ stroke="#7A5AF8" stroke-width="1.33333"
2897
+ stroke-linecap="round" stroke-linejoin="round" />
2898
+ </svg></span> {{type | titlecase}}
2899
+
2900
+
2901
+ </div>
2902
+ </div>
2903
+
2904
+ <div *ngIf="isCheckboxEnable" class="ms-3 my-3">
2905
+ <input type="checkbox" [(ngModel)]="selectAllByType[type]"
2906
+ (change)="onSelectAll(type, $event)">
2907
+ <label>Select All</label>
2908
+ </div>
2909
+ <ng-container *ngFor="let mapping of source?.mappingInfo">
2910
+ <!-- Body Section -->
2911
+ <div *ngIf="mapping?.type ===viewMode"
2912
+ class="card-body bg-white layers p-5 m-3">
2913
+
2914
+ <div class="row">
2915
+ <ng-container
2916
+ *ngFor="let original of mapping?.revisedDetail;let i=index">
2917
+ <div *ngIf="original?.revopsType ===type && matchesStatusFilter(original)"
2918
+ class="col-md-3 mb-3 position-relative">
2919
+ <div class="pb-3 h-100 rounded-3 position-relative"
2920
+ [ngClass]="{
2921
+ 'layer-approved': isApproved(original),
2922
+ 'layer-rejected': isRejected(original),
2923
+ 'img-border border border-1': !isApproved(original) && !isRejected(original)}">
2924
+
2925
+
2926
+ <!-- Top-right Checkbox -->
2927
+ <div *ngIf="isCheckboxEnable">
2928
+
2929
+ <input *ngIf="!isLockedByReviewer(original)"
2930
+ type="checkbox"
2931
+ class="position-absolute absolute form-check-input"
2932
+ [checked]="(selectedByType[type] || []).includes(original?.tempId)"
2933
+ (change)="onImageCheckboxChange(type, original.tempId,$event)" />
2934
+ <span class="position-absolute absolute"
2935
+ *ngIf="isLockedByReviewer(original)"
2936
+ (click)="resetCheckbox(type, original)">
2937
+
2938
+ <svg xmlns="http://www.w3.org/2000/svg"
2939
+ width="19" height="19"
2940
+ viewBox="0 0 19 19" fill="none">
2941
+ <g filter="url(#filter0_d_2023_13718)">
2942
+ <rect x="1.11133" y="0.555664"
2943
+ width="16" height="16" rx="2"
2944
+ fill="white" />
2945
+ <rect x="1.38911" y="0.833442"
2946
+ width="15.4444" height="15.4444"
2947
+ rx="1.72222" stroke="#D0D5DD"
2948
+ stroke-width="0.555556" />
2949
+ <path d="M5.87109 8.55566H12.3526"
2950
+ stroke="#344054"
2951
+ stroke-width="0.927778"
2952
+ stroke-linecap="round"
2953
+ stroke-linejoin="round" />
2954
+ </g>
2955
+ <defs>
2956
+ <filter id="filter0_d_2023_13718"
2957
+ x="0.00021708" y="0.00010854"
2958
+ width="18.2222" height="18.2222"
2959
+ filterUnits="userSpaceOnUse"
2960
+ color-interpolation-filters="sRGB">
2961
+ <feFlood flood-opacity="0"
2962
+ result="BackgroundImageFix" />
2963
+ <feColorMatrix in="SourceAlpha"
2964
+ type="matrix"
2965
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
2966
+ result="hardAlpha" />
2967
+ <feOffset dy="0.555556" />
2968
+ <feGaussianBlur
2969
+ stdDeviation="0.555556" />
2970
+ <feColorMatrix type="matrix"
2971
+ values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0" />
2972
+ <feBlend mode="normal"
2973
+ in2="BackgroundImageFix"
2974
+ result="effect1_dropShadow_2023_13718" />
2975
+ <feBlend mode="normal"
2976
+ in="SourceGraphic"
2977
+ in2="effect1_dropShadow_2023_13718"
2978
+ result="shape" />
2979
+ </filter>
2980
+ </defs>
2981
+ </svg>
2982
+ </span>
2983
+ </div>
2984
+
2985
+
2986
+ <img [src]="imageUrl + original?.filePath" alt=""
2987
+ (click)="openImagePreview(mapping,original, i, selectedByType[type])"
2988
+ class="w-100 rounded border cursor-pointer" />
2989
+ <div class="row my-2">
2990
+ <div class="col-8">
2991
+ <div class="desc-title ms-2 my-2">Tango ID:
2992
+ {{
2993
+ original.tempId
2994
+ }}
2995
+ <span
2996
+ *ngIf="getAction(original, 'review')?.action === 'approved'"
2997
+ class="ms-2"><svg style="width: 20px;
2998
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
2999
+ <rect y="0.5" width="10"
3000
+ height="10" rx="5"
3001
+ fill="#D1FADF" />
3002
+ <path fill-rule="evenodd"
3003
+ clip-rule="evenodd"
3004
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
3005
+ fill="#12B76A" />
3006
+ </svg>
3007
+ </span>
3008
+ <span
3009
+ *ngIf="getAction(original, 'review')?.action === 'rejected'"
3010
+ class="ms-2"><svg style="width: 20px;
3011
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
3012
+ <g
3013
+ clip-path="url(#clip0_1428_59484)">
3014
+ <path
3015
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3016
+ fill="#FEE4E2" />
3017
+ <path
3018
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3019
+ stroke="#D92D20"
3020
+ stroke-linecap="round"
3021
+ stroke-linejoin="round" />
3022
+ </g>
3023
+ <defs>
3024
+ <clipPath
3025
+ id="clip0_1428_59484">
3026
+ <rect width="12"
3027
+ height="12"
3028
+ fill="white"
3029
+ transform="translate(0.599609 0.5)" />
3030
+ </clipPath>
3031
+ </defs>
3032
+ </svg></span>
3033
+ </div>
3034
+ <div class="desc-value ms-2">Entry Time: {{
3035
+ getFormattedEntryTime(original?.entryTime)
3036
+ }}</div>
3037
+ </div>
3038
+ <div class="col-4">
3039
+ <span
3040
+ *ngIf="getAction(original, 'approve')?.action === 'approved'">
3041
+ <svg xmlns="http://www.w3.org/2000/svg"
3042
+ width="37" height="37"
3043
+ viewBox="0 0 24 24" fill="none">
3044
+ <rect width="24" height="24" rx="12"
3045
+ fill="#D1FADF" />
3046
+ <g
3047
+ clip-path="url(#clip0_486_94051)">
3048
+ <path
3049
+ d="M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z"
3050
+ stroke="#039855"
3051
+ stroke-linecap="round"
3052
+ stroke-linejoin="round" />
3053
+ </g>
3054
+ <defs>
3055
+ <clipPath id="clip0_486_94051">
3056
+ <rect width="12" height="12"
3057
+ fill="white"
3058
+ transform="translate(6 6)" />
3059
+ </clipPath>
3060
+ </defs>
3061
+ </svg>
3062
+ </span>
3063
+ <span
3064
+ *ngIf="getAction(original, 'approve')?.action === 'rejected'"><svg
3065
+ xmlns="http://www.w3.org/2000/svg"
3066
+ width="37" height="37"
3067
+ viewBox="0 0 24 24" fill="none">
3068
+ <rect width="24" height="24" rx="12"
3069
+ fill="#FEE4E2" />
3070
+ <g
3071
+ clip-path="url(#clip0_486_94090)">
3072
+ <path
3073
+ d="M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z"
3074
+ stroke="#D92D20"
3075
+ stroke-linecap="round"
3076
+ stroke-linejoin="round" />
3077
+ </g>
3078
+ <defs>
3079
+ <clipPath id="clip0_486_94090">
3080
+ <rect width="12" height="12"
3081
+ fill="white"
3082
+ transform="translate(6 6)" />
3083
+ </clipPath>
3084
+ </defs>
3085
+ </svg></span>
3086
+ </div>
3087
+ </div>
3088
+ </div>
3089
+ </div>
3090
+ </ng-container>
3091
+ </div>
3092
+ </div>
3093
+ </ng-container>
3094
+ <div class="card-footer py-5" *ngIf="source?.commentsDetails?.length">
3095
+ <div class="comments-accordion">
3096
+ <!-- Accordion Header -->
3097
+ <div class="accordion-header"
3098
+ (click)="toggleCommentsAccordion(type)">
3099
+ <div
3100
+ class="d-flex justify-content-start align-items-center w-100">
3101
+ <div class="comments-title">
3102
+
3103
+ <span class="comments-count">
3104
+ <!-- {{getCategoryCommentCountForSource(source, type) }} -->
3105
+ Comments</span>
3106
+
3107
+
3108
+ </div>
3109
+ <div class="accordion-arrow ms-3">
3110
+ <svg [class.rotated]="selectedCommentCategory === type && commentsAccordionOpen"
3111
+ xmlns="http://www.w3.org/2000/svg" width="16"
3112
+ height="16" viewBox="0 0 16 16" fill="none">
3113
+ <path d="M4 6L8 10L12 6" stroke="#667085"
3114
+ stroke-width="2" stroke-linecap="round"
3115
+ stroke-linejoin="round" />
3116
+ </svg>
3117
+ </div>
3118
+ </div>
3119
+ </div>
3120
+
3121
+ <!-- Accordion Content -->
3122
+ <div class="accordion-body mt-3"
3123
+ *ngIf="selectedCommentCategory === type && commentsAccordionOpen">
3124
+
3125
+ <!-- loop each block: tagging / review / approve -->
3126
+ <ng-container *ngFor="let block of source?.commentsDetails">
3127
+
3128
+ <!-- TAGGING COMMENTS (each comment = one image + message) -->
3129
+ <ng-container *ngIf="block.type === 'tagging'">
3130
+ <ng-container *ngFor="let c of block.comments">
3131
+ <div *ngIf="block.category === selectedCommentCategory"
3132
+ class="comment-thread d-flex mb-4">
3133
+
3134
+ <!-- avatar -->
3135
+ <div
3136
+ class="avatar avatar-text light-primary p-3">
3137
+
3138
+ {{ getInitialsFromEmail(c.createdByEmail) }}
3139
+ </div>
3140
+
3141
+ <!-- content -->
3142
+ <div>
3143
+ <div class="fw-semibold">
3144
+ {{ c.createdByEmail }}
3145
+ </div>
3146
+
3147
+ <div class="text-muted small"
3148
+ *ngIf="c.createdAt">
3149
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
3150
+ }}
3151
+ </div>
3152
+
3153
+ <p class="mb-2 mt-2" *ngIf="c.message">
3154
+ {{ c.message }}
3155
+ </p>
3156
+
3157
+ <!-- single image card -->
3158
+ <div class="d-flex flex-wrap">
3159
+ <div class="tango-card me-2"
3160
+ *ngIf="c.filePath">
3161
+ <div class="tango-image"
3162
+ [style.backgroundImage]="'url(' + imageUrl + c.filePath + ')'">
3163
+ </div>
3164
+
3165
+ <div class="tango-meta small">
3166
+ <div>Tango ID: {{ c.tempId }}
3167
+ </div>
3168
+ <div class="text-muted">Entry
3169
+ time:
3170
+ {{ c.entryTime }}</div>
3171
+ </div>
3172
+ </div>
3173
+ </div>
3174
+ </div>
3175
+ </div>
3176
+ </ng-container>
3177
+ </ng-container>
3178
+
3179
+ <!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->
3180
+ <ng-container
3181
+ *ngIf="block.type === 'review' || block.type === 'approve'">
3182
+ <ng-container *ngFor="let c of block.comments">
3183
+
3184
+ <div *ngIf="c.category === selectedCommentCategory"
3185
+ class="comment-thread d-flex mb-4">
3186
+
3187
+ <!-- avatar -->
3188
+ <div
3189
+ class="avatar avatar-text light-primary p-3">
3190
+
3191
+ {{ getInitialsFromEmail(c.createdByEmail) }}
3192
+ </div>
3193
+
3194
+ <!-- content -->
3195
+ <div class="w-100">
3196
+ <div class="fw-semibold">
3197
+ {{ c.createdByEmail }}
3198
+ </div>
3199
+
3200
+ <div class="text-muted small"
3201
+ *ngIf="c.createdAt">
3202
+ {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy'
3203
+ }}
3204
+ </div>
3205
+
3206
+ <!-- main review/approve message -->
3207
+ <p class="mb-2 mt-2" *ngIf="c.message">
3208
+ {{ c.message }}
3209
+ </p>
3210
+
3211
+
3212
+
3213
+ <!-- image list + +N View all -->
3214
+ <div class="d-flex flex-wrap"
3215
+ *ngIf="c.taggedImages?.length">
3216
+
3217
+ <!-- first 3 images -->
3218
+ <div
3219
+ *ngFor="let img of c.taggedImages; let i = index">
3220
+ <ng-container *ngIf="i < 3">
3221
+ <div class="tango-card me-2">
3222
+ <div class="tango-image"
3223
+ [style.backgroundImage]="'url(' + imageUrl + img.filePath + ')'">
3224
+ </div>
3225
+
3226
+ <div
3227
+ class="tango-meta small">
3228
+ <div>
3229
+ Tango ID: {{
3230
+ img.tempId
3231
+ }}
3232
+ <span
3233
+ *ngIf="c.status === 'approved'"><svg
3234
+ style="width: 20px;
3235
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11"
3236
+ fill="none">
3237
+ <rect
3238
+ y="0.5"
3239
+ width="10"
3240
+ height="10"
3241
+ rx="5"
3242
+ fill="#D1FADF" />
3243
+ <path
3244
+ fill-rule="evenodd"
3245
+ clip-rule="evenodd"
3246
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
3247
+ fill="#12B76A" />
3248
+ </svg></span>
3249
+
3250
+ <span
3251
+ *ngIf="c.status === 'rejected'"><svg
3252
+ style="width: 20px;
3253
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13"
3254
+ fill="none">
3255
+ <g
3256
+ clip-path="url(#clip0_1428_59484)">
3257
+ <path
3258
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3259
+ fill="#FEE4E2" />
3260
+ <path
3261
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3262
+ stroke="#D92D20"
3263
+ stroke-linecap="round"
3264
+ stroke-linejoin="round" />
3265
+ </g>
3266
+ <defs>
3267
+ <clipPath
3268
+ id="clip0_1428_59484">
3269
+ <rect
3270
+ width="12"
3271
+ height="12"
3272
+ fill="white"
3273
+ transform="translate(0.599609 0.5)" />
3274
+ </clipPath>
3275
+ </defs>
3276
+ </svg></span>
3277
+ </div>
3278
+ <div class="text-muted">
3279
+ Entry time: {{
3280
+ img.entryTime }}
3281
+ </div>
3282
+ </div>
3283
+ </div>
3284
+ </ng-container>
3285
+ </div>
3286
+
3287
+ <!-- +N View all card -->
3288
+ <div class="tango-card me-2 more-card text-center"
3289
+ *ngIf="c.taggedImages.length > 3"
3290
+ [style.backgroundImage]="'url(' + imageUrl + c.taggedImages[3].filePath + ')'"
3291
+ (click)="openImagesPopup(c)">
3292
+ <div class="more-overlay"></div>
3293
+
3294
+ <!-- vertical container -->
3295
+ <div
3296
+ class="more-wrapper my-10 d-flex flex-column align-items-center justify-content-center">
3297
+ <div
3298
+ class="more-text fw-semibold">
3299
+ +{{
3300
+ c.taggedImages.length -
3301
+ 3 }}</div>
3302
+ <div
3303
+ class="text-primary text-dark text-decoration-underline small">
3304
+ View all
3305
+ </div>
3306
+ </div>
3307
+ </div>
3308
+
3309
+ </div>
3310
+ </div>
3311
+ </div>
3312
+ </ng-container>
3313
+ </ng-container>
3314
+ </ng-container>
3315
+
3316
+ </div>
3317
+
3318
+ </div>
3319
+ </div>
3320
+ </div>
3321
+ </section>
3322
+ </ng-container>
3323
+
3324
+
3325
+
3326
+ </div>
3327
+ </ng-container>
3328
+ </div>
3329
+ </section>
3330
+ <div *ngIf="footfallLoading" class="card mt-5">
3331
+ <div class="card-body h-500px">
3332
+ <div class="row loader d-flex justify-content-center align-items-center">
3333
+ <div class="shimmer">
3334
+ <div class="wrapper">
3335
+ <div class="stroke animate title"></div>
3336
+ <div class="stroke animate link"></div>
3337
+ <div class="stroke animate description"></div>
3338
+ </div>
3339
+ </div>
3340
+ <div class="shimmer">
3341
+ <div class="wrapper">
3342
+ <div class="stroke animate title"></div>
3343
+ <div class="stroke animate link"></div>
3344
+ <div class="stroke animate description"></div>
3345
+ </div>
3346
+ </div>
3347
+ </div>
3348
+
3349
+ </div>
3350
+ </div>
3351
+ <ng-container *ngIf="footfallNoData">
3352
+ <div class="row mt-20">
3353
+ <div class="col-lg-12 mt-20 mb-5">
3354
+ <div class="card-body d-flex justify-content-center align-items-center flex-column">
3355
+ <img class="img-nodata" src="./assets/tango/Icons/Nodata1.svg" alt="">
3356
+ <div class="nodata-title">No data found</div>
3357
+ <div class="nodata-sub">There is no result for this footfall directory</div>
3358
+ </div>
3359
+ </div>
3360
+ </div>
3361
+ </ng-container>
3362
+ </div>
3363
+ </div>
3364
+ </div>
3365
+
3366
+ </section>
3367
+
3368
+
3369
+ <ng-template #zoomPopup let-model>
3370
+ <div class="p-4 m-4">
3371
+ <div class="modal-header border-0 p-0 w-100 flex-column align-items-start">
3372
+
3373
+ <!-- Heading -->
3374
+ <h5 class="modal-title mb-2">
3375
+ {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images
3376
+ </h5>
3377
+
3378
+ <!-- Description -->
3379
+ <p class="mb-3 test-appvalue">
3380
+ You're about to {{ popupType === 'approved' ? 'Approve' : 'Reject' }} {{ this.overallSelectedIds?.length
3381
+ ? this.overallSelectedIds?.length : this.popupValue ?
3382
+ this.popupValue:'--' }} <span class="fw-bold">{{ selectedCategoriesLabel | titlecase }}</span>
3383
+ </p>
3384
+ <!-- Count Box -->
3385
+ <div *ngIf="selectedCategories?.length === 1" class="w-100 mb-4">
3386
+ <label class="mb-2">Remarks (Optional)</label>
3387
+ <textarea class="form-control" rows="3" [(ngModel)]="remarks"></textarea>
3388
+
3389
+ </div>
3390
+
3391
+ <!-- Action Buttons -->
3392
+ <div class="w-100 d-flex justify-content-end">
3393
+ <button class="btn btn-outline me-2" (click)="cancel()">Cancel</button>
3394
+ <button class="btn btn-primary" (click)="submitValue(popupType, popupvalue)">
3395
+ {{ popupType === 'approved' ? 'Approve' : 'Reject' }}
3396
+ </button>
3397
+ </div>
3398
+
3399
+ </div>
3400
+ </div>
3401
+ </ng-template>
3402
+
3403
+ <ng-template #closePopup let-model>
3404
+ <div class="p-4 m-4">
3405
+ <div class="modal-header border-0 p-0 w-100 flex-column align-items-start">
3406
+ <h5 class="modal-title mb-2">
3407
+ Close ticket
3408
+ </h5>
3409
+ <p class="mb-3 test-appvalue">
3410
+ You are about to close the ticket, Are you sure want to continue?
3411
+ </p>
3412
+ <div class="w-100 d-flex justify-content-end">
3413
+ <button class="btn btn-outline me-2" (click)="confirmCloseCancel()">Cancel</button>
3414
+ <button class="btn btn-primary" (click)="confirmCloseTicket()">
3415
+ Close ticket
3416
+ </button>
3417
+ </div>
3418
+ </div>
3419
+ </div>
3420
+ </ng-template>
3421
+
3422
+ <ng-template #ReassignTicketPopup let-model>
3423
+ <div class="p-4 m-4">
3424
+ <div class="modal-header border-0 p-0 w-100 flex-column align-items-start">
3425
+
3426
+ <!-- Heading -->
3427
+ <h5 class="modal-title mb-2">
3428
+ Re-Assign Ticket
3429
+ </h5>
3430
+
3431
+ <!-- Description -->
3432
+ <p class="mb-3 test-appvalue">
3433
+ Transfer the ticket to another user
3434
+ </p>
3435
+
3436
+ <!-- Count Box -->
3437
+ <div class="row w-100 my-3">
3438
+ <div class="col-md-12 mb-4">
3439
+ <label class="label mb-2">Choose User</label>
3440
+ <team-select [items]="reviwerList" [multi]="false" [searchField]="'userName'" [idField]="'email'"
3441
+ (selected)="reviewerChange($event)" [selectedValues]="[selectedReviewer]"></team-select>
3442
+ </div>
3443
+ </div>
3444
+ `
3445
+ <!-- Action Buttons -->
3446
+ <div class="w-100 d-flex justify-content-end">
3447
+ <button class="btn btn-outline me-2" (click)="cancelassign()">Cancel</button>
3448
+ <button class="btn btn-primary" (click)="assignTicketView()">
3449
+ Re-Assign
3450
+ </button>
3451
+ </div>
3452
+
3453
+ </div>
3454
+ </div>
3455
+ </ng-template>
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+ <ng-template #imagePreviewPopup let-model>
3463
+ <div class="p-4 m-4">
3464
+ <div class="modal-header border-0 my-2 p-0 w-100 d-flex justify-content-between align-items-center">
3465
+
3466
+ <h5 class="modal-title mb-2 m-0">{{ currentPreviewItem.revopsType | titlecase}}</h5>
3467
+
3468
+ <!-- Close Button -->
3469
+ <button type="button" class="btn-close fs-4" aria-label="Close" (click)="model.close()">
3470
+
3471
+ </button>
3472
+
3473
+ </div>
3474
+
3475
+ <div class="w-100 position-relative mb-4">
3476
+
3477
+ <button class="btn btn-light position-absolute ms-3 start-0 top-50 translate-middle-y"
3478
+ (click)="prevPreview()" [disabled]="previewList.length <= 1">
3479
+ <svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25" fill="none">
3480
+ <path d="M15.5615 6.22429L9.33724 12.4486L15.5615 18.6729" stroke="#344054" stroke-width="2.07891"
3481
+ stroke-linecap="round" stroke-linejoin="round" />
3482
+ </svg>
3483
+ </button>
3484
+
3485
+ <img [src]="getPreviewImageUrl()" class="w-100 rounded border" />
3486
+ <div class="row my-2">
3487
+ <div class="col-10">
3488
+ <div class="desc-title ms-2 my-2">
3489
+ Tango ID: {{ currentPreviewItem.tempId }}
3490
+
3491
+ <span *ngIf="getAction(currentPreviewItem, 'review')?.action === 'approved'" class="ms-2"><svg
3492
+ style="width: 20px;
3493
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
3494
+ <rect y="0.5" width="10" height="10" rx="5" fill="#D1FADF" />
3495
+ <path fill-rule="evenodd" clip-rule="evenodd"
3496
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
3497
+ fill="#12B76A" />
3498
+ </svg>
3499
+ </span>
3500
+ <span *ngIf="getAction(currentPreviewItem, 'review')?.action === 'rejected'" class="ms-2"><svg
3501
+ style="width: 20px;
3502
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
3503
+ <g clip-path="url(#clip0_1428_59484)">
3504
+ <path
3505
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3506
+ fill="#FEE4E2" />
3507
+ <path
3508
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3509
+ stroke="#D92D20" stroke-linecap="round" stroke-linejoin="round" />
3510
+ </g>
3511
+ <defs>
3512
+ <clipPath id="clip0_1428_59484">
3513
+ <rect width="12" height="12" fill="white" transform="translate(0.599609 0.5)" />
3514
+ </clipPath>
3515
+ </defs>
3516
+ </svg></span>
3517
+
3518
+ </div>
3519
+
3520
+ <div class="desc-value ms-2">Entry Time: {{
3521
+ getFormattedEntryTime(currentPreviewItem.entryTime) }}</div>
3522
+ </div>
3523
+ <div class="col-2 mt-2 text-end">
3524
+ <span *ngIf="getAction(currentPreviewItem, 'approve')?.action === 'approved'">
3525
+ <svg xmlns="http://www.w3.org/2000/svg" width="42" height="42" viewBox="0 0 24 24" fill="none">
3526
+ <rect width="24" height="24" rx="12" fill="#D1FADF" />
3527
+ <g clip-path="url(#clip0_486_94051)">
3528
+ <path
3529
+ d="M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z"
3530
+ stroke="#039855" stroke-linecap="round" stroke-linejoin="round" />
3531
+ </g>
3532
+ <defs>
3533
+ <clipPath id="clip0_486_94051">
3534
+ <rect width="12" height="12" fill="white" transform="translate(6 6)" />
3535
+ </clipPath>
3536
+ </defs>
3537
+ </svg>
3538
+ </span>
3539
+ <span *ngIf="getAction(currentPreviewItem, 'approve')?.action === 'rejected'"><svg
3540
+ xmlns="http://www.w3.org/2000/svg" width="42" height="42" viewBox="0 0 24 24" fill="none">
3541
+ <rect width="24" height="24" rx="12" fill="#FEE4E2" />
3542
+ <g clip-path="url(#clip0_486_94090)">
3543
+ <path
3544
+ d="M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z"
3545
+ stroke="#D92D20" stroke-linecap="round" stroke-linejoin="round" />
3546
+ </g>
3547
+ <defs>
3548
+ <clipPath id="clip0_486_94090">
3549
+ <rect width="12" height="12" fill="white" transform="translate(6 6)" />
3550
+ </clipPath>
3551
+ </defs>
3552
+ </svg></span>
3553
+ </div>
3554
+ </div>
3555
+
3556
+
3557
+ <!-- <div class="duplicate-reason ms-2 mt-2">
3558
+ <small class="text-muted">{{ currentPreviewItem.reason }}</small>
3559
+ </div> -->
3560
+
3561
+ <button class="btn btn-light position-absolute me-3 end-0 top-50 translate-middle-y" (click)="nextPreview()"
3562
+ [disabled]="previewList.length <= 1">
3563
+ <svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25" fill="none">
3564
+ <path d="M9.33594 18.6732L15.5602 12.4489L9.33594 6.22461" stroke="#344054" stroke-width="2.07891"
3565
+ stroke-linecap="round" stroke-linejoin="round" />
3566
+ </svg>
3567
+ </button>
3568
+
3569
+ </div>
3570
+ <section *ngIf="isCheckboxEnable">
3571
+
3572
+ <div *ngIf="canShowPreviewActions(currentPreviewItem)" class="w-100 d-flex justify-content-end">
3573
+
3574
+ <!-- Reject / Deny -->
3575
+ <button class="btn btn-outline me-2" (click)="rejectedPopup('rejected', currentPreviewItem)">
3576
+ {{ ((hasApproverAccess && selectedRole === 'approver')
3577
+ || (hasReviewerAccess && selectedRole === 'reviewer'))
3578
+ ? 'Deny'
3579
+ : 'Reject' }}
3580
+ </button>
3581
+
3582
+ <!-- Approve / Accept -->
3583
+ <button class="btn btn-primary" (click)="approvedPopup('approved', currentPreviewItem)">
3584
+ {{ ((hasApproverAccess && selectedRole === 'approver')
3585
+ || (hasReviewerAccess && selectedRole === 'reviewer'))
3586
+ ? 'Approve'
3587
+ : 'Accept' }}
3588
+ </button>
3589
+
3590
+ </div>
3591
+ </section>
3592
+
3593
+ </div>
3594
+
3595
+ </ng-template>
3596
+
3597
+
3598
+ <ng-template #internalticket let-modal>
3599
+ <div class="h-auto p-10">
3600
+ <div class="card-header border-0">
3601
+ <div class="card-title">Start audit</div>
3602
+ <div class="card-sub">Please select a store and date range to start audit</div>
3603
+ </div>
3604
+ <div class="row my-3">
3605
+ <div class="col-md-7 mb-4">
3606
+ <label class="label">Store</label>
3607
+ <lib-select [items]="storeList" [multi]="false" [searchField]="'storeName'" [idField]="'storeId'"
3608
+ (selected)="storeChange($event)" [selectedValues]="[selectedStore]"></lib-select>
3609
+ </div>
3610
+ <div class="col-md-5 mt-7">
3611
+
3612
+ <div class="d-flex align-items-center position-relative my-1">
3613
+ <span class="svg-icon svg-icon-1 position-absolute ms-3">
3614
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
3615
+ <path
3616
+ 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"
3617
+ stroke="#344054" stroke-width="1.67" stroke-linecap="round" stroke-linejoin="round" />
3618
+ </svg>
3619
+ </span>
3620
+ <input class="fx-date-range form-control ps-14" style="width:165px !important" type="text" matInput
3621
+ ngxDaterangepickerMd [singleDatePicker]="true" [drops]="'down'" [opens]="'left'"
3622
+ [alwaysShowCalendars]="false" [keepCalendarOpeningWithRange]="true" [showCancel]="true"
3623
+ autocomplete="off" [(ngModel)]="selectedDateRange" [isInvalidDate]="disableToday"
3624
+ (startDateChanged)="onStartDateChange($event)" [isCustomDate]="isCustomDate"
3625
+ [locale]="{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }"
3626
+ (datesUpdated)="datechange($event)" name="daterange" [readonly]="true" [autoApply]="true" />
3627
+ </div>
3628
+ </div>
3629
+ </div>
3630
+ <div class="mt-3 card p-3 back-ground" *ngIf="footfallcount>0">
3631
+ <div class="card-title">{{footfallcount}}</div>
3632
+ <div class="mt-2 card-title1">Total footfall</div>
3633
+ </div>
3634
+ <div class="card-body mt-5">
3635
+ <div class="w-100 d-flex mt-5">
3636
+
3637
+ <button class="btn btn-outline w-50 me-2" (click)="modal.close('isDenied')">Cancel</button>
3638
+ <button [disabled]="footfallcount<=0" class="btn btn-primary w-50 ms-2"
3639
+ (click)="modal.close('isConfirmed')">start</button>
3640
+ </div>
3641
+ </div>
3642
+ </div>
3643
+ </ng-template>
3644
+
3645
+ <!-- Simple overlay modal -->
3646
+ <div class="images-modal-backdrop" *ngIf="showImagesModal">
3647
+ <div class="images-modal">
3648
+ <div class="modal-header d-flex justify-content-between align-items-start mb-3">
3649
+ <div>
3650
+
3651
+ <div class="comment-header d-flex align-items-start">
3652
+
3653
+ <!-- Avatar -->
3654
+ <div class="avatar avatar-text light-primary p-3 me-3">
3655
+ {{ getInitialsFromEmail(selectedComment.createdByEmail) }}
3656
+ </div>
3657
+
3658
+ <!-- Text content -->
3659
+ <div class="comment-info">
3660
+ <!-- email -->
3661
+ <div class="medium fw-semibold">
3662
+ {{ selectedComment?.createdByEmail }}
3663
+ </div>
3664
+
3665
+ <!-- created time -->
3666
+ <div class="medium text-muted" *ngIf="selectedComment?.createdAt">
3667
+ {{ selectedComment?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy' }}
3668
+ </div>
3669
+ </div>
3670
+
3671
+ </div>
3672
+
3673
+
3674
+ <!-- optional comment text under time -->
3675
+ <p class="mb-0 mt-2" *ngIf="selectedComment?.message">
3676
+ {{ selectedComment?.message }}
3677
+ </p>
3678
+ </div>
3679
+ <span class="cursor-pointer" (click)="closeImagesPopup()"><svg xmlns="http://www.w3.org/2000/svg" width="14"
3680
+ height="14" viewBox="0 0 14 14" fill="none">
3681
+ <path d="M13 1L1 13M1 1L13 13" stroke="#101828" stroke-width="2" stroke-linecap="round"
3682
+ stroke-linejoin="round" />
3683
+ </svg></span>
3684
+ <!-- <button type="button" class="btn-close ms-3" >
3685
+ </button> -->
3686
+ </div>
3687
+
3688
+
3689
+ <div class="modal-body d-flex flex-wrap border border-1 p-3 gap-2">
3690
+ <div *ngFor="let img of selectedImagesForPopup" class="tango-card me-2">
3691
+ <div class="tango-image" [style.backgroundImage]="'url('+ imageUrl + img.filePath + ')'">
3692
+ </div>
3693
+ <div class="tango-meta small">
3694
+ <div>
3695
+ Tango ID: {{ img.tempId }}
3696
+
3697
+ <!-- status dots -->
3698
+ <span *ngIf="selectedComment.status === 'approved'"><svg style="width: 20px;
3699
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="10" height="11" viewBox="0 0 10 11" fill="none">
3700
+ <rect y="0.5" width="10" height="10" rx="5" fill="#D1FADF" />
3701
+ <path fill-rule="evenodd" clip-rule="evenodd"
3702
+ d="M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z"
3703
+ fill="#12B76A" />
3704
+ </svg></span>
3705
+
3706
+ <span *ngIf="selectedComment.status === 'rejected'"><svg style="width: 20px;
3707
+ height: 20px;" xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 13 13" fill="none">
3708
+ <g clip-path="url(#clip0_1428_59484)">
3709
+ <path
3710
+ d="M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3711
+ fill="#FEE4E2" />
3712
+ <path
3713
+ d="M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z"
3714
+ stroke="#D92D20" stroke-linecap="round" stroke-linejoin="round" />
3715
+ </g>
3716
+ <defs>
3717
+ <clipPath id="clip0_1428_59484">
3718
+ <rect width="12" height="12" fill="white" transform="translate(0.599609 0.5)" />
3719
+ </clipPath>
3720
+ </defs>
3721
+ </svg></span>
3722
+ </div>
3723
+
3724
+ <div class="text-muted">
3725
+ Entry time: {{ img.entryTime }}
3726
+ </div>
3727
+ </div>
3728
+ </div>
3729
+ </div>
3730
+ </div>
3731
+ </div>
3732
+
3733
+
3734
+ <ng-template #closeacuuracyissue let-modal>
3735
+ <div class="p-4 m-4">
3736
+ <div class="modal-header border-0 p-0 w-100 flex-column align-items-start">
3737
+ <h5 class="modal-title mb-5 fw-bold">
3738
+ Close accuracy issue
3739
+ </h5>
3740
+ <p class="mb-5 test-appvalue">
3741
+ The ticket will be “closed” and updated in the store as a final revision.
3742
+ </p>
3743
+ <div class="w-100 d-flex justify-content-end">
3744
+ <button class="btn btn-outline me-2" (click)="modal.close('isDenied')">Cancel</button>
3745
+ <button class="btn btn-primary" (click)="modal.close('isConfirmed')">
3746
+ Close accuracy issue
3747
+ </button>
3748
+ </div>
3749
+ </div>
3750
+ </div>
3751
+ </ng-template>