tango-app-ui-shared 3.7.3-dev6-demo6 → 3.7.3-dev6-demo7

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 (402) 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/guards/auth.guard.ts +20 -0
  5. package/src/lib/guards/lead.guard.ts +16 -0
  6. package/src/lib/guards/stores.guard.ts +16 -0
  7. package/src/lib/guards/tickets.guard.ts +16 -0
  8. package/{lib/i18n/index.d.ts → src/lib/i18n/index.ts} +2 -2
  9. package/src/lib/i18n/translation.module.ts +9 -0
  10. package/src/lib/i18n/translation.service.ts +61 -0
  11. package/src/lib/i18n/vocabs/ch.ts +105 -0
  12. package/src/lib/i18n/vocabs/de.ts +105 -0
  13. package/src/lib/i18n/vocabs/en.ts +105 -0
  14. package/src/lib/i18n/vocabs/es.ts +105 -0
  15. package/src/lib/i18n/vocabs/fr.ts +105 -0
  16. package/src/lib/i18n/vocabs/jp.ts +105 -0
  17. package/src/lib/interceptors/http-auth-interceptor.ts +225 -0
  18. package/src/lib/interfaces/global-state.ts +6 -0
  19. package/src/lib/modules/common/common-shared.module.ts +20 -0
  20. package/src/lib/modules/common/custom-select/custom-select.component.html +42 -0
  21. package/src/lib/modules/common/custom-select/custom-select.component.scss +131 -0
  22. package/src/lib/modules/common/custom-select/custom-select.component.spec.ts +23 -0
  23. package/src/lib/modules/common/custom-select/custom-select.component.ts +149 -0
  24. package/src/lib/modules/common/filters/filters.component.html +76 -0
  25. package/src/lib/modules/common/filters/filters.component.scss +131 -0
  26. package/src/lib/modules/common/filters/filters.component.spec.ts +23 -0
  27. package/src/lib/modules/common/filters/filters.component.ts +181 -0
  28. package/src/lib/modules/common/pagination/pagination.component.html +26 -0
  29. package/src/lib/modules/common/pagination/pagination.component.scss +63 -0
  30. package/src/lib/modules/common/pagination/pagination.component.spec.ts +23 -0
  31. package/src/lib/modules/common/pagination/pagination.component.ts +46 -0
  32. package/src/lib/modules/errors/error403/error403.component.html +25 -0
  33. package/src/lib/modules/errors/error403/error403.component.scss +0 -0
  34. package/src/lib/modules/errors/error403/error403.component.spec.ts +23 -0
  35. package/src/lib/modules/errors/error403/error403.component.ts +28 -0
  36. package/src/lib/modules/errors/error404/error404.component.html +24 -0
  37. package/src/lib/modules/errors/error404/error404.component.scss +0 -0
  38. package/src/lib/modules/errors/error404/error404.component.spec.ts +25 -0
  39. package/src/lib/modules/errors/error404/error404.component.ts +50 -0
  40. package/src/lib/modules/errors/error500/error500.component.html +24 -0
  41. package/src/lib/modules/errors/error500/error500.component.scss +0 -0
  42. package/src/lib/modules/errors/error500/error500.component.spec.ts +25 -0
  43. package/src/lib/modules/errors/error500/error500.component.ts +50 -0
  44. package/src/lib/modules/errors/errors-routing.module.ts +40 -0
  45. package/src/lib/modules/errors/errors.component.html +15 -0
  46. package/src/lib/modules/errors/errors.component.scss +4 -0
  47. package/src/lib/modules/errors/errors.component.spec.ts +25 -0
  48. package/src/lib/modules/errors/errors.component.ts +42 -0
  49. package/src/lib/modules/errors/errors.module.ts +25 -0
  50. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.html +16 -0
  51. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.scss +0 -0
  52. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.spec.ts +23 -0
  53. package/src/lib/modules/errors/invalid-ip/invalid-ip.component.ts +43 -0
  54. package/src/lib/modules/intro/contact-support/contact-support.component.html +30 -0
  55. package/src/lib/modules/intro/contact-support/contact-support.component.scss +60 -0
  56. package/src/lib/modules/intro/contact-support/contact-support.component.spec.ts +23 -0
  57. package/src/lib/modules/intro/contact-support/contact-support.component.ts +17 -0
  58. package/src/lib/modules/intro/intro-routing.module.ts +16 -0
  59. package/src/lib/modules/intro/intro.module.ts +21 -0
  60. package/src/lib/modules/intro/lead-intro/lead-intro.component.html +325 -0
  61. package/src/lib/modules/intro/lead-intro/lead-intro.component.scss +185 -0
  62. package/src/lib/modules/intro/lead-intro/lead-intro.component.spec.ts +23 -0
  63. package/src/lib/modules/intro/lead-intro/lead-intro.component.ts +120 -0
  64. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.html +44 -0
  65. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.scss +28 -0
  66. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.spec.ts +23 -0
  67. package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.ts +24 -0
  68. package/src/lib/modules/layout/content/content.component.html +12 -0
  69. package/src/lib/modules/layout/content/content.component.scss +0 -0
  70. package/src/lib/modules/layout/content/content.component.ts +102 -0
  71. package/src/lib/modules/layout/footer/footer.component.html +29 -0
  72. package/src/lib/modules/layout/footer/footer.component.scss +7 -0
  73. package/src/lib/modules/layout/footer/footer.component.spec.ts +25 -0
  74. package/src/lib/modules/layout/footer/footer.component.ts +13 -0
  75. package/src/lib/modules/layout/header/header-menu/header-menu.component.html +27 -0
  76. package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +4 -0
  77. package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +25 -0
  78. package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +38 -0
  79. package/src/lib/modules/layout/header/header.component.html +90 -0
  80. package/src/lib/modules/layout/header/header.component.scss +7 -0
  81. package/src/lib/modules/layout/header/header.component.spec.ts +25 -0
  82. package/src/lib/modules/layout/header/header.component.ts +139 -0
  83. package/src/lib/modules/layout/header/navbar/navbar.component.html +156 -0
  84. package/src/lib/modules/layout/header/navbar/navbar.component.scss +223 -0
  85. package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +23 -0
  86. package/src/lib/modules/layout/header/navbar/navbar.component.ts +255 -0
  87. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.html +200 -0
  88. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.scss +139 -0
  89. package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.ts +76 -0
  90. package/src/lib/modules/layout/header/page-title/page-title.component.html +32 -0
  91. package/src/lib/modules/layout/header/page-title/page-title.component.scss +11 -0
  92. package/src/lib/modules/layout/header/page-title/page-title.component.ts +47 -0
  93. package/src/lib/modules/layout/keenicon/icons.json +1 -0
  94. package/src/lib/modules/layout/keenicon/keenicon.component.html +4 -0
  95. package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
  96. package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +23 -0
  97. package/src/lib/modules/layout/keenicon/keenicon.component.ts +30 -0
  98. package/src/lib/modules/layout/layout/layout.component.html +71 -0
  99. package/src/lib/modules/layout/layout/layout.component.scss +23 -0
  100. package/src/lib/modules/layout/layout/layout.component.ts +425 -0
  101. package/src/lib/modules/layout/layout.module.ts +129 -0
  102. package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
  103. package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +81 -0
  104. package/src/lib/modules/layout/scroll-top/scroll-top.component.html +1 -0
  105. package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +75 -0
  106. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +70 -0
  107. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +57 -0
  108. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +23 -0
  109. package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +136 -0
  110. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +26 -0
  111. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
  112. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +23 -0
  113. package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +36 -0
  114. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +761 -0
  115. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +38 -0
  116. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +23 -0
  117. package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +130 -0
  118. package/src/lib/modules/layout/sidebar/sidebar.component.html +16 -0
  119. package/src/lib/modules/layout/sidebar/sidebar.component.scss +3 -0
  120. package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +23 -0
  121. package/src/lib/modules/layout/sidebar/sidebar.component.ts +203 -0
  122. package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +84 -0
  123. package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
  124. package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +23 -0
  125. package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +14 -0
  126. package/src/lib/modules/layout/toolbar/classic/classic.component.html +69 -0
  127. package/src/lib/modules/layout/toolbar/classic/classic.component.scss +238 -0
  128. package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +23 -0
  129. package/src/lib/modules/layout/toolbar/classic/classic.component.ts +389 -0
  130. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.html +4 -0
  131. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.scss +3 -0
  132. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.spec.ts +23 -0
  133. package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.ts +91 -0
  134. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.html +22 -0
  135. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.scss +156 -0
  136. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.spec.ts +23 -0
  137. package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.ts +238 -0
  138. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.html +14 -0
  139. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.scss +149 -0
  140. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.spec.ts +23 -0
  141. package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.ts +183 -0
  142. package/src/lib/modules/layout/toolbar/extended/extended.component.html +100 -0
  143. package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
  144. package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +23 -0
  145. package/src/lib/modules/layout/toolbar/extended/extended.component.ts +12 -0
  146. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.html +311 -0
  147. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.scss +311 -0
  148. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.spec.ts +23 -0
  149. package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.ts +1555 -0
  150. package/src/lib/modules/layout/toolbar/reports/reports.component.html +62 -0
  151. package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
  152. package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +23 -0
  153. package/src/lib/modules/layout/toolbar/reports/reports.component.ts +14 -0
  154. package/src/lib/modules/layout/toolbar/saas/saas.component.html +77 -0
  155. package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
  156. package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +23 -0
  157. package/src/lib/modules/layout/toolbar/saas/saas.component.ts +14 -0
  158. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.html +26 -0
  159. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.scss +176 -0
  160. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.spec.ts +23 -0
  161. package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.ts +235 -0
  162. package/src/lib/modules/layout/toolbar/single-store/single-store.component.html +39 -0
  163. package/src/lib/modules/layout/toolbar/single-store/single-store.component.scss +176 -0
  164. package/src/lib/modules/layout/toolbar/single-store/single-store.component.spec.ts +23 -0
  165. package/src/lib/modules/layout/toolbar/single-store/single-store.component.ts +188 -0
  166. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.html +17 -0
  167. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.scss +172 -0
  168. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.spec.ts +23 -0
  169. package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.ts +179 -0
  170. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.html +4 -0
  171. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.scss +19 -0
  172. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.spec.ts +23 -0
  173. package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.ts +105 -0
  174. package/src/lib/modules/layout/toolbar/toolbar.component.html +64 -0
  175. package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
  176. package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +25 -0
  177. package/src/lib/modules/layout/toolbar/toolbar.component.ts +400 -0
  178. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.html +259 -0
  179. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.scss +305 -0
  180. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.spec.ts +23 -0
  181. package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.ts +1202 -0
  182. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.html +199 -0
  183. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.scss +311 -0
  184. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.spec.ts +23 -0
  185. package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.ts +899 -0
  186. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.html +204 -0
  187. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.scss +311 -0
  188. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.spec.ts +23 -0
  189. package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.ts +1045 -0
  190. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.html +190 -0
  191. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.scss +311 -0
  192. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.spec.ts +23 -0
  193. package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.ts +825 -0
  194. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.html +259 -0
  195. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.scss +305 -0
  196. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.spec.ts +23 -0
  197. package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.ts +1242 -0
  198. package/src/lib/modules/notification/conformation/conformation.component.html +25 -0
  199. package/src/lib/modules/notification/conformation/conformation.component.scss +0 -0
  200. package/src/lib/modules/notification/conformation/conformation.component.spec.ts +23 -0
  201. package/src/lib/modules/notification/conformation/conformation.component.ts +23 -0
  202. package/src/lib/modules/notification/notification/notification.component.html +209 -0
  203. package/src/lib/modules/notification/notification/notification.component.scss +211 -0
  204. package/src/lib/modules/notification/notification/notification.component.spec.ts +23 -0
  205. package/src/lib/modules/notification/notification/notification.component.ts +310 -0
  206. package/src/lib/modules/notification/notification-routing.module.ts +20 -0
  207. package/src/lib/modules/notification/notification.module.ts +21 -0
  208. package/src/lib/pipes/customDate.pipe.ts +18 -0
  209. package/src/lib/routes/route-wraper-modules/analyse-wrapper.module.ts +12 -0
  210. package/src/lib/routes/route-wraper-modules/edge-wrapper.module.ts +11 -0
  211. package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +11 -0
  212. package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +12 -0
  213. package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +11 -0
  214. package/src/lib/routes/route-wraper-modules/ticket-wrapper.module.ts +10 -0
  215. package/src/lib/routes/routing.ts +56 -0
  216. package/src/lib/services/auth.service.ts +178 -0
  217. package/src/lib/services/notification.service.spec.ts +16 -0
  218. package/src/lib/services/notification.service.ts +73 -0
  219. package/src/lib/services/toast.service.ts +82 -0
  220. package/{public-api.d.ts → src/public-api.ts} +71 -44
  221. package/tsconfig.lib.json +14 -0
  222. package/tsconfig.lib.prod.json +10 -0
  223. package/tsconfig.spec.json +14 -0
  224. package/esm2022/lib/guards/auth.guard.mjs +0 -26
  225. package/esm2022/lib/guards/lead.guard.mjs +0 -16
  226. package/esm2022/lib/guards/stores.guard.mjs +0 -16
  227. package/esm2022/lib/guards/tickets.guard.mjs +0 -16
  228. package/esm2022/lib/i18n/index.mjs +0 -3
  229. package/esm2022/lib/i18n/translation.module.mjs +0 -17
  230. package/esm2022/lib/i18n/translation.service.mjs +0 -53
  231. package/esm2022/lib/i18n/vocabs/ch.mjs +0 -106
  232. package/esm2022/lib/i18n/vocabs/de.mjs +0 -106
  233. package/esm2022/lib/i18n/vocabs/en.mjs +0 -106
  234. package/esm2022/lib/i18n/vocabs/es.mjs +0 -106
  235. package/esm2022/lib/i18n/vocabs/fr.mjs +0 -106
  236. package/esm2022/lib/i18n/vocabs/jp.mjs +0 -106
  237. package/esm2022/lib/interceptors/http-auth-interceptor.mjs +0 -124
  238. package/esm2022/lib/interfaces/global-state.mjs +0 -2
  239. package/esm2022/lib/modules/common/common-shared.module.mjs +0 -31
  240. package/esm2022/lib/modules/common/custom-select/custom-select.component.mjs +0 -155
  241. package/esm2022/lib/modules/common/filters/filters.component.mjs +0 -179
  242. package/esm2022/lib/modules/common/pagination/pagination.component.mjs +0 -49
  243. package/esm2022/lib/modules/errors/error403/error403.component.mjs +0 -33
  244. package/esm2022/lib/modules/errors/error404/error404.component.mjs +0 -44
  245. package/esm2022/lib/modules/errors/error500/error500.component.mjs +0 -45
  246. package/esm2022/lib/modules/errors/errors-routing.module.mjs +0 -48
  247. package/esm2022/lib/modules/errors/errors.component.mjs +0 -39
  248. package/esm2022/lib/modules/errors/errors.module.mjs +0 -37
  249. package/esm2022/lib/modules/errors/invalid-ip/invalid-ip.component.mjs +0 -44
  250. package/esm2022/lib/modules/intro/contact-support/contact-support.component.mjs +0 -19
  251. package/esm2022/lib/modules/intro/intro-routing.module.mjs +0 -24
  252. package/esm2022/lib/modules/intro/intro.module.mjs +0 -32
  253. package/esm2022/lib/modules/intro/lead-intro/lead-intro.component.mjs +0 -110
  254. package/esm2022/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.mjs +0 -31
  255. package/esm2022/lib/modules/layout/content/content.component.mjs +0 -107
  256. package/esm2022/lib/modules/layout/footer/footer.component.mjs +0 -17
  257. package/esm2022/lib/modules/layout/header/header-menu/header-menu.component.mjs +0 -41
  258. package/esm2022/lib/modules/layout/header/header.component.mjs +0 -100
  259. package/esm2022/lib/modules/layout/header/navbar/navbar.component.mjs +0 -256
  260. package/esm2022/lib/modules/layout/header/notifications-inner/notifications-inner.component.mjs +0 -79
  261. package/esm2022/lib/modules/layout/header/page-title/page-title.component.mjs +0 -56
  262. package/esm2022/lib/modules/layout/keenicon/icons.json +0 -1
  263. package/esm2022/lib/modules/layout/keenicon/keenicon.component.mjs +0 -37
  264. package/esm2022/lib/modules/layout/layout/layout.component.mjs +0 -314
  265. package/esm2022/lib/modules/layout/layout.module.mjs +0 -198
  266. package/esm2022/lib/modules/layout/scripts-init/scripts-init.component.mjs +0 -74
  267. package/esm2022/lib/modules/layout/scroll-top/scroll-top.component.mjs +0 -74
  268. package/esm2022/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -159
  269. package/esm2022/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.mjs +0 -45
  270. package/esm2022/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.mjs +0 -122
  271. package/esm2022/lib/modules/layout/sidebar/sidebar.component.mjs +0 -134
  272. package/esm2022/lib/modules/layout/toolbar/accounting/accounting.component.mjs +0 -16
  273. package/esm2022/lib/modules/layout/toolbar/classic/classic.component.mjs +0 -331
  274. package/esm2022/lib/modules/layout/toolbar/client-settings/client-settings.component.mjs +0 -88
  275. package/esm2022/lib/modules/layout/toolbar/date-single-select/date-single-select.component.mjs +0 -207
  276. package/esm2022/lib/modules/layout/toolbar/datepicker/datepicker.component.mjs +0 -158
  277. package/esm2022/lib/modules/layout/toolbar/extended/extended.component.mjs +0 -15
  278. package/esm2022/lib/modules/layout/toolbar/metrics-header/metrics-header.component.mjs +0 -1321
  279. package/esm2022/lib/modules/layout/toolbar/reports/reports.component.mjs +0 -18
  280. package/esm2022/lib/modules/layout/toolbar/saas/saas.component.mjs +0 -18
  281. package/esm2022/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.mjs +0 -216
  282. package/esm2022/lib/modules/layout/toolbar/single-store/single-store.component.mjs +0 -178
  283. package/esm2022/lib/modules/layout/toolbar/single-storedate/single-storedate.component.mjs +0 -166
  284. package/esm2022/lib/modules/layout/toolbar/storesingle/storesingle.component.mjs +0 -105
  285. package/esm2022/lib/modules/layout/toolbar/toolbar.component.mjs +0 -372
  286. package/esm2022/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.mjs +0 -1062
  287. package/esm2022/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.mjs +0 -795
  288. package/esm2022/lib/modules/layout/toolbar/trax-header/trax-header.component.mjs +0 -880
  289. package/esm2022/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.mjs +0 -729
  290. package/esm2022/lib/modules/layout/toolbar/zone-header/zone-header.component.mjs +0 -1088
  291. package/esm2022/lib/modules/notification/conformation/conformation.component.mjs +0 -22
  292. package/esm2022/lib/modules/notification/notification/notification.component.mjs +0 -317
  293. package/esm2022/lib/modules/notification/notification-routing.module.mjs +0 -28
  294. package/esm2022/lib/modules/notification/notification.module.mjs +0 -32
  295. package/esm2022/lib/pipes/customDate.pipe.mjs +0 -22
  296. package/esm2022/lib/routes/route-wraper-modules/edge-wrapper.module.mjs +0 -18
  297. package/esm2022/lib/routes/route-wraper-modules/manage-wrapper.module.mjs +0 -18
  298. package/esm2022/lib/routes/route-wraper-modules/profile-wrapper.module.mjs +0 -18
  299. package/esm2022/lib/routes/route-wraper-modules/store-wrapper.module.mjs +0 -18
  300. package/esm2022/lib/routes/route-wraper-modules/ticket-wrapper.module.mjs +0 -18
  301. package/esm2022/lib/routes/routing.mjs +0 -53
  302. package/esm2022/lib/services/auth.service.mjs +0 -141
  303. package/esm2022/lib/services/notification.service.mjs +0 -74
  304. package/esm2022/lib/services/toast.service.mjs +0 -83
  305. package/esm2022/public-api.mjs +0 -56
  306. package/esm2022/tango-app-ui-shared.mjs +0 -5
  307. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs +0 -21
  308. package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs.map +0 -1
  309. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs +0 -188
  310. package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs.map +0 -1
  311. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs +0 -21
  312. package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs.map +0 -1
  313. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs +0 -400
  314. package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs.map +0 -1
  315. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs +0 -21
  316. package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs.map +0 -1
  317. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs +0 -21
  318. package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs.map +0 -1
  319. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs +0 -21
  320. package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs.map +0 -1
  321. package/fesm2022/tango-app-ui-shared.mjs +0 -12438
  322. package/fesm2022/tango-app-ui-shared.mjs.map +0 -1
  323. package/index.d.ts +0 -5
  324. package/lib/guards/auth.guard.d.ts +0 -10
  325. package/lib/guards/lead.guard.d.ts +0 -2
  326. package/lib/guards/stores.guard.d.ts +0 -2
  327. package/lib/guards/tickets.guard.d.ts +0 -2
  328. package/lib/i18n/translation.module.d.ts +0 -8
  329. package/lib/i18n/translation.service.d.ts +0 -19
  330. package/lib/i18n/vocabs/ch.d.ts +0 -104
  331. package/lib/i18n/vocabs/de.d.ts +0 -104
  332. package/lib/i18n/vocabs/en.d.ts +0 -104
  333. package/lib/i18n/vocabs/es.d.ts +0 -104
  334. package/lib/i18n/vocabs/fr.d.ts +0 -104
  335. package/lib/i18n/vocabs/jp.d.ts +0 -104
  336. package/lib/interceptors/http-auth-interceptor.d.ts +0 -19
  337. package/lib/interfaces/global-state.d.ts +0 -5
  338. package/lib/modules/common/common-shared.module.d.ts +0 -13
  339. package/lib/modules/common/custom-select/custom-select.component.d.ts +0 -33
  340. package/lib/modules/common/filters/filters.component.d.ts +0 -38
  341. package/lib/modules/common/pagination/pagination.component.d.ts +0 -18
  342. package/lib/modules/errors/error403/error403.component.d.ts +0 -14
  343. package/lib/modules/errors/error404/error404.component.d.ts +0 -15
  344. package/lib/modules/errors/error500/error500.component.d.ts +0 -15
  345. package/lib/modules/errors/errors-routing.module.d.ts +0 -7
  346. package/lib/modules/errors/errors.component.d.ts +0 -13
  347. package/lib/modules/errors/errors.module.d.ts +0 -13
  348. package/lib/modules/errors/invalid-ip/invalid-ip.component.d.ts +0 -17
  349. package/lib/modules/intro/contact-support/contact-support.component.d.ts +0 -9
  350. package/lib/modules/intro/intro-routing.module.d.ts +0 -7
  351. package/lib/modules/intro/intro.module.d.ts +0 -11
  352. package/lib/modules/intro/lead-intro/lead-intro.component.d.ts +0 -31
  353. package/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.d.ts +0 -13
  354. package/lib/modules/layout/content/content.component.d.ts +0 -25
  355. package/lib/modules/layout/footer/footer.component.d.ts +0 -8
  356. package/lib/modules/layout/header/header-menu/header-menu.component.d.ts +0 -18
  357. package/lib/modules/layout/header/header.component.d.ts +0 -30
  358. package/lib/modules/layout/header/navbar/navbar.component.d.ts +0 -45
  359. package/lib/modules/layout/header/notifications-inner/notifications-inner.component.d.ts +0 -25
  360. package/lib/modules/layout/header/page-title/page-title.component.d.ts +0 -23
  361. package/lib/modules/layout/keenicon/keenicon.component.d.ts +0 -13
  362. package/lib/modules/layout/layout/layout.component.d.ts +0 -82
  363. package/lib/modules/layout/layout.module.d.ts +0 -50
  364. package/lib/modules/layout/scripts-init/scripts-init.component.d.ts +0 -19
  365. package/lib/modules/layout/scroll-top/scroll-top.component.d.ts +0 -19
  366. package/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.d.ts +0 -45
  367. package/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.d.ts +0 -19
  368. package/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.d.ts +0 -26
  369. package/lib/modules/layout/sidebar/sidebar.component.d.ts +0 -36
  370. package/lib/modules/layout/toolbar/accounting/accounting.component.d.ts +0 -8
  371. package/lib/modules/layout/toolbar/classic/classic.component.d.ts +0 -48
  372. package/lib/modules/layout/toolbar/client-settings/client-settings.component.d.ts +0 -16
  373. package/lib/modules/layout/toolbar/date-single-select/date-single-select.component.d.ts +0 -28
  374. package/lib/modules/layout/toolbar/datepicker/datepicker.component.d.ts +0 -28
  375. package/lib/modules/layout/toolbar/extended/extended.component.d.ts +0 -8
  376. package/lib/modules/layout/toolbar/metrics-header/metrics-header.component.d.ts +0 -103
  377. package/lib/modules/layout/toolbar/reports/reports.component.d.ts +0 -9
  378. package/lib/modules/layout/toolbar/saas/saas.component.d.ts +0 -9
  379. package/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.d.ts +0 -32
  380. package/lib/modules/layout/toolbar/single-store/single-store.component.d.ts +0 -33
  381. package/lib/modules/layout/toolbar/single-storedate/single-storedate.component.d.ts +0 -34
  382. package/lib/modules/layout/toolbar/storesingle/storesingle.component.d.ts +0 -24
  383. package/lib/modules/layout/toolbar/toolbar.component.d.ts +0 -57
  384. package/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.d.ts +0 -93
  385. package/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.d.ts +0 -80
  386. package/lib/modules/layout/toolbar/trax-header/trax-header.component.d.ts +0 -83
  387. package/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.d.ts +0 -74
  388. package/lib/modules/layout/toolbar/zone-header/zone-header.component.d.ts +0 -97
  389. package/lib/modules/notification/conformation/conformation.component.d.ts +0 -10
  390. package/lib/modules/notification/notification/notification.component.d.ts +0 -63
  391. package/lib/modules/notification/notification-routing.module.d.ts +0 -7
  392. package/lib/modules/notification/notification.module.d.ts +0 -11
  393. package/lib/pipes/customDate.pipe.d.ts +0 -7
  394. package/lib/routes/route-wraper-modules/edge-wrapper.module.d.ts +0 -7
  395. package/lib/routes/route-wraper-modules/manage-wrapper.module.d.ts +0 -7
  396. package/lib/routes/route-wraper-modules/profile-wrapper.module.d.ts +0 -7
  397. package/lib/routes/route-wraper-modules/store-wrapper.module.d.ts +0 -7
  398. package/lib/routes/route-wraper-modules/ticket-wrapper.module.d.ts +0 -7
  399. package/lib/routes/routing.d.ts +0 -3
  400. package/lib/services/auth.service.d.ts +0 -49
  401. package/lib/services/notification.service.d.ts +0 -30
  402. package/lib/services/toast.service.d.ts +0 -10
@@ -0,0 +1,1555 @@
1
+ import {
2
+ ChangeDetectorRef,
3
+ Component,
4
+ HostListener,
5
+ OnInit,
6
+ } from "@angular/core";
7
+ import dayjs from "dayjs";
8
+ import "dayjs/locale/en";
9
+ import { AuthService } from "../../../../services/auth.service";
10
+ import { GlobalStateService } from "tango-app-ui-global";
11
+ import { NavigationEnd, Router } from "@angular/router";
12
+ @Component({
13
+ selector: "lib-metrics-header",
14
+ templateUrl: "./metrics-header.component.html",
15
+ styleUrl: "./metrics-header.component.scss",
16
+ })
17
+ export class MetricsHeaderComponent implements OnInit {
18
+ dayjs = dayjs;
19
+ isCustomDate = (m: dayjs.Dayjs) => {
20
+ const isValidDate = m > this.dayjs();
21
+ return isValidDate ? "invalid-date" : false;
22
+ };
23
+
24
+ selectedDateRange: any = {
25
+ startDate: dayjs().subtract(30, "days"),
26
+ endDate: dayjs().subtract(1, "days"),
27
+ };
28
+ selectedFilters: any = {
29
+ client: null,
30
+ clientName: null,
31
+ clients: [],
32
+ store: null,
33
+ stores: [],
34
+ date: null,
35
+ group: [],
36
+ location: [],
37
+ country: [],
38
+ zoneName: [],
39
+ };
40
+ Opendropdown: boolean = false;
41
+ dropdownOpen: string | null = null; // 'location' or 'group'
42
+ searchLocationText: string = "";
43
+ searchGroupText: string = "";
44
+ locations: any[] = [];
45
+ filteredLocations: any[] = [];
46
+ groupsData: any[] = [];
47
+ filteredGroups: any[] = [];
48
+ filteredStores: any[] = [];
49
+ filteredZones: any[] = [];
50
+ stores: any[] = [];
51
+ zones: any[] = [];
52
+ searchStoreText: string = "";
53
+ searchZoneText: string = "";
54
+ clientList: any = [];
55
+ selectedClient: any;
56
+ locationLabel: any[] = [];
57
+ groupLabel: any[] = [];
58
+ users: any;
59
+ url: any;
60
+ filteredCountries: any[] = [];
61
+ countryLabel: any[] = [];
62
+ searchCountryText: string = "";
63
+ countries: any[] = [];
64
+ constructor(
65
+ private auth: AuthService,
66
+ private router: Router,
67
+ public gs: GlobalStateService,
68
+ private cd: ChangeDetectorRef
69
+ ) {}
70
+
71
+ @HostListener("document:click", ["$event"])
72
+ onClick(event: MouseEvent) {
73
+ const target = event.target as HTMLElement;
74
+ if (!target.closest(".dropdown2")) {
75
+ this.Opendropdown = false;
76
+ }
77
+ }
78
+ closeDropdown1() {
79
+ this.Opendropdown = false;
80
+ }
81
+ ngOnInit(): void {
82
+ // this.setRangesBasedOnRoute();
83
+
84
+ // Listen for route changes to update ranges
85
+ // this.router?.events?.subscribe((event) => {
86
+ // if (event instanceof NavigationEnd) {
87
+ // this.setRangesBasedOnRoute();
88
+ // }
89
+ // });
90
+ this.url = this.router.url.split("?")[0].split("/");
91
+ const user = JSON.parse(localStorage.getItem("user-info") as string);
92
+ this.users = user;
93
+ this.gs?.manageRefreshTrigger?.subscribe((e) => {
94
+ if (e) {
95
+ if (user.userType === "tango") {
96
+ this.getClient();
97
+ } else {
98
+ const storedFilters = localStorage.getItem("header-filters");
99
+ if (storedFilters) {
100
+ const headerFilters = JSON.parse(storedFilters);
101
+ this.filteredStores = headerFilters?.stores.map((store: any) => ({
102
+ ...store,
103
+ checked: store.checked,
104
+ }));
105
+ this.filteredZones = headerFilters?.zoneName.map((store: any) => ({
106
+ ...store,
107
+ checked: store.checked,
108
+ }));
109
+ }
110
+ }
111
+ }
112
+ });
113
+
114
+ // Fetch client data if the user is of type 'tango'
115
+ if (user.userType === "tango") {
116
+ this.getClient();
117
+ } else {
118
+ this.getCountry();
119
+ this.getLocations();
120
+ this.getGroups();
121
+ this.getStore();
122
+ const clientFilters = localStorage.getItem("client-details");
123
+ if (clientFilters) {
124
+ const headerclientFilters = JSON.parse(clientFilters);
125
+ this.selectedClient = {
126
+ trafficDateRange: headerclientFilters.trafficDateRange,
127
+ };
128
+ }
129
+ }
130
+
131
+ // Load filters from localStorage if they exist
132
+ const storedFilters = localStorage.getItem("header-filters");
133
+ if (storedFilters) {
134
+ const headerFilters = JSON.parse(storedFilters);
135
+
136
+ // Initialize selectedFilters with defaults or existing values
137
+ this.selectedFilters = {
138
+ client: headerFilters.client || this.users.client,
139
+ clientName: headerFilters.clientName || "",
140
+ clients: headerFilters.clients || [],
141
+ store: headerFilters.store || null,
142
+ date: headerFilters.date || {},
143
+ stores: headerFilters.stores || [],
144
+ group: headerFilters.group || [],
145
+ location: headerFilters.location || [],
146
+ country: headerFilters.country || [],
147
+ zoneName: headerFilters.zoneName || [],
148
+ };
149
+
150
+ // Sync filtered data with stored selections
151
+ this.filteredCountries = this.syncWithLocalStorage(headerFilters.country);
152
+ this.filteredLocations = this.syncWithLocalStorage(
153
+ headerFilters.location
154
+ );
155
+ this.filteredGroups = this.syncWithLocalStorage(headerFilters.group);
156
+ this.filteredStores = this.syncWithLocalStorage(headerFilters.stores);
157
+ this.filteredZones = this.syncWithLocalStorage(headerFilters.zoneName);
158
+ // Format date range if it exists
159
+ if (headerFilters.date) {
160
+ this.selectedDateRange = {
161
+ startDate: this.dayjs(
162
+ headerFilters.date.startDate,
163
+ "YYYY-MM-DD"
164
+ ).format("DD-MM-YYYY"),
165
+ endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format(
166
+ "DD-MM-YYYY"
167
+ ),
168
+ };
169
+ } else {
170
+ this.selectedDateRange = {
171
+ startDate: this.dayjs(
172
+ this.selectedDateRange.startDate,
173
+ "YYYY-MM-DD"
174
+ ).format("DD-MM-YYYY"),
175
+ endDate: this.dayjs(
176
+ this.selectedDateRange.endDate,
177
+ "YYYY-MM-DD"
178
+ ).format("DD-MM-YYYY"),
179
+ };
180
+ }
181
+ // console.log("3")
182
+ // Emit data via service and update localStorage
183
+ this.emitAndStoreFilters();
184
+ } else {
185
+ // Initialize empty states if no header filters are present in localStorage
186
+ this.resetFilters();
187
+ // console.log("2")
188
+ }
189
+ }
190
+ private syncWithLocalStorage(items: any[]): any[] {
191
+ return items
192
+ ? items.map((item: any) => ({
193
+ ...item,
194
+ checked: item.checked === true,
195
+ }))
196
+ : [];
197
+ }
198
+
199
+ private emitAndStoreFilters(): void {
200
+ this.gs.dataRangeValue.next(this.selectedFilters);
201
+ localStorage.setItem(
202
+ "header-filters",
203
+ JSON.stringify(this.selectedFilters)
204
+ );
205
+ // console.log("1")
206
+ }
207
+
208
+ /**
209
+ * Reset selectedFilters and all related arrays to empty states
210
+ */
211
+ private resetFilters(): void {
212
+ this.selectedFilters = {
213
+ client: null,
214
+ clientName: "",
215
+ clients: [],
216
+ store: null,
217
+ date: {},
218
+ stores: [],
219
+ group: [],
220
+ location: [],
221
+ country: [],
222
+ zoneName: [],
223
+ };
224
+ this.filteredLocations = [];
225
+ this.filteredGroups = [];
226
+ this.filteredStores = [];
227
+ this.filteredCountries = [];
228
+ this.filteredZones = [];
229
+ }
230
+ getClient() {
231
+ this.auth.getClients().subscribe({
232
+ next: (e) => {
233
+ if (e) {
234
+ this.clientList = e.data.result;
235
+ const headerFilters: any = JSON.parse(
236
+ localStorage.getItem("header-filters") || "{}"
237
+ );
238
+ if (headerFilters.client) {
239
+ this.clientList.find((obj: any) => {
240
+ if (obj.clientId === headerFilters.client) {
241
+ this.selectedClient = obj;
242
+ }
243
+ });
244
+ // const startDate = this.dayjs(headerFilters.date.startDate);
245
+ // const endDate = this.dayjs(headerFilters.date.endDate);
246
+ // const differenceInDays = endDate.diff(startDate, 'days');
247
+ // if (differenceInDays >= 90 && this.selectedClient?.trafficDateRange === 90) {
248
+ // this.selectedDateRange = {
249
+ // startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").subtract(-90, 'days').format("DD-MM-YYYY"),
250
+ // endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
251
+ // };
252
+ // } else {
253
+ // this.selectedDateRange = {
254
+ // startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
255
+ // endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
256
+ // };
257
+ // }
258
+
259
+ this.selectedFilters.client = headerFilters.client;
260
+ this.selectedFilters.clientName = headerFilters.clientName;
261
+ this.selectedFilters.clients = [headerFilters.client];
262
+ this.selectedFilters.store = headerFilters.store;
263
+ this.selectedFilters.date = headerFilters.date;
264
+ this.selectedFilters.stores = headerFilters.stores;
265
+ this.selectedFilters.group = headerFilters.group;
266
+ this.selectedFilters.location = headerFilters.location;
267
+ this.selectedFilters.country = headerFilters.country;
268
+ this.selectedFilters.zoneName = headerFilters.zoneName;
269
+ this.gs.dataRangeValue.next(this.selectedFilters);
270
+ // console.log("2")
271
+ // Ensure locations and groups are loaded before fetching stores
272
+ this.getCountry();
273
+ this.getLocations();
274
+ this.getGroups();
275
+ // Fetch stores only after locations and groups are set
276
+ this.getStore();
277
+ } else {
278
+ this.selectedClient = this.clientList[0];
279
+ this.selectedFilters.client = this.selectedClient.clientId;
280
+ this.selectedFilters.clientName = this.selectedClient.clientName;
281
+ this.selectedFilters.clients = [this.selectedClient.clientId];
282
+ this.selectedFilters.store = headerFilters.store;
283
+ this.selectedFilters.date = headerFilters.date;
284
+ this.selectedFilters.stores = headerFilters.stores;
285
+ this.selectedFilters.group = headerFilters.group;
286
+ this.selectedFilters.location = headerFilters.location;
287
+ this.selectedFilters.country = headerFilters.country;
288
+ this.selectedFilters.zoneName = headerFilters.zoneName;
289
+ localStorage.setItem(
290
+ "header-filters",
291
+ JSON.stringify(this.selectedFilters)
292
+ );
293
+ this.gs.dataRangeValue.next(this.selectedFilters);
294
+ // console.log("3")
295
+ this.cd.detectChanges();
296
+ // Ensure locations and groups are loaded before fetching stores
297
+ this.getCountry();
298
+ this.getLocations();
299
+ this.getGroups();
300
+ // Fetch stores only after locations and groups are set
301
+ this.getStore();
302
+ }
303
+ } else {
304
+ this.selectedClient = this.clientList[0];
305
+ this.selectedFilters.client = this.selectedClient.clientId;
306
+ this.selectedFilters.clientName = this.selectedClient.clientName;
307
+ // Ensure locations and groups are loaded before fetching stores
308
+ this.getCountry();
309
+ this.getLocations();
310
+ this.getGroups();
311
+ // Fetch stores only after locations and groups are set
312
+ this.getStore();
313
+ this.getZone();
314
+ localStorage.setItem(
315
+ "header-filters",
316
+ JSON.stringify(this.selectedFilters)
317
+ );
318
+ this.gs.dataRangeValue.next(this.selectedFilters);
319
+ // console.log("4")
320
+ this.cd.detectChanges();
321
+ }
322
+ this.getUserInfo(this.selectedFilters.client);
323
+ },
324
+ });
325
+ }
326
+ getUserInfo(client: any) {
327
+ let obj = {
328
+ clientId: client ? client : "",
329
+ };
330
+ if (client) {
331
+ this.auth.getHeaderUsers(obj).subscribe({
332
+ next: (e) => {
333
+ localStorage.setItem(
334
+ "usersEmail-info",
335
+ JSON.stringify(e?.data?.userEmailData || [])
336
+ );
337
+ },
338
+ });
339
+ }
340
+ }
341
+ onClientSelect(event: any): void {
342
+ // Update the selected client
343
+ this.selectedClient = event;
344
+ // Clear previous filtered data and selections
345
+ this.filteredGroups = [];
346
+ this.filteredStores = [];
347
+ this.filteredLocations = [];
348
+ this.selectedFilters.stores = [];
349
+ this.selectedFilters.group = [];
350
+ this.selectedFilters.location = [];
351
+ this.selectedFilters.country = [];
352
+ this.selectedFilters.zoneName = [];
353
+
354
+ // Fetch header filters from localStorage
355
+ const headerFilters: any = JSON.parse(
356
+ localStorage.getItem("header-filters") || "{}"
357
+ );
358
+
359
+ // Update the selected filters with the new client
360
+ this.selectedFilters.client = this.selectedClient.clientId;
361
+ this.selectedFilters.clientName = this.selectedClient.clientName;
362
+
363
+ // Remove old store, group, and location data from the header filters
364
+ delete headerFilters.stores;
365
+ delete headerFilters.groups;
366
+ delete headerFilters.location;
367
+ delete headerFilters.country;
368
+ delete headerFilters.zoneName;
369
+
370
+ // Fetch new data based on the new client
371
+ this.getCountry();
372
+ this.getLocations();
373
+ this.getStore();
374
+ this.getGroups();
375
+
376
+ // Update localStorage with the new client selection and empty filter data
377
+ localStorage.setItem(
378
+ "header-filters",
379
+ JSON.stringify(this.selectedFilters)
380
+ );
381
+ window.location.reload();
382
+ // Emit data to the global service
383
+ // this.gs.dataRangeValue.next(this.selectedFilters);
384
+ // Trigger change detection to reflect UI changes
385
+ this.cd.detectChanges();
386
+ }
387
+
388
+ ranges: any = {
389
+ Today: [dayjs(), dayjs()],
390
+ Yesterday: [dayjs().subtract(1, "days"), dayjs().subtract(1, "days")],
391
+ "This Week": [dayjs().subtract(7, "days"), dayjs().subtract(1, "days")],
392
+ "Last Week": [
393
+ dayjs().subtract(14, "days").startOf("day"),
394
+ dayjs().subtract(8, "days").endOf("day"),
395
+ ],
396
+ "This Month": [dayjs().subtract(30, "days"), dayjs().subtract(1, "days")],
397
+ "Last Month": [
398
+ dayjs().subtract(1, "month").startOf("month"),
399
+ dayjs().subtract(1, "month").endOf("month"),
400
+ ],
401
+ };
402
+
403
+ onStartDateChange(event: any) {
404
+ if (this.dayjs(event.startDate).isValid()) {
405
+ if (this.selectedClient?.traxDateRange === 90) {
406
+ this.isCustomDate = (m: dayjs.Dayjs) => {
407
+ const isValidDate =
408
+ m > this.dayjs() || m > this.dayjs(event.startDate.add(90, "days"));
409
+ return isValidDate ? "invalid-date" : false;
410
+ };
411
+ } else {
412
+ this.isCustomDate = (m: dayjs.Dayjs) => {
413
+ const isValidDate =
414
+ m > this.dayjs() ||
415
+ m > this.dayjs(event.startDate.add(180, "days"));
416
+ return isValidDate ? "invalid-date" : false;
417
+ };
418
+ }
419
+ }
420
+ }
421
+
422
+ datechange(event: any) {
423
+ if (event && event.startDate && event.endDate) {
424
+ if (
425
+ this.dayjs(event.startDate).isValid() &&
426
+ this.dayjs(event.endDate).isValid()
427
+ ) {
428
+ this.selectedDateRange.startDate = event.startDate;
429
+ this.selectedDateRange.endDate = event.endDate;
430
+ var datetime = {
431
+ startDate: this.dayjs(event.startDate, "DD-MM-YYYY").format(
432
+ "YYYY-MM-DD"
433
+ ),
434
+ endDate: this.dayjs(event.endDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
435
+ };
436
+ this.selectedFilters.date = datetime;
437
+ localStorage.setItem(
438
+ "header-filters",
439
+ JSON.stringify(this.selectedFilters)
440
+ );
441
+ window.location.reload();
442
+ // this.gs.dataRangeValue.next(this.selectedFilters);
443
+ }
444
+ }
445
+ }
446
+ opendropdown(e: MouseEvent) {
447
+ e.stopPropagation();
448
+ this.Opendropdown = !this.Opendropdown;
449
+ }
450
+ getLocations(): void {
451
+ const country = this.countries
452
+ .filter((country) => country.checked)
453
+ .map((country) => country.country);
454
+ // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
455
+ let obj = {
456
+ clientId: this.selectedFilters.client
457
+ ? this.selectedFilters.client
458
+ : this.users.clientId,
459
+ country,
460
+ city: [],
461
+ group: [],
462
+ };
463
+ this.auth.getLocation(obj).subscribe({
464
+ next: (res: any) => {
465
+ let cityList = this.selectedFilters?.location
466
+ ?.filter((location: any) => location.checked)
467
+ .map((loc: any) => loc.city);
468
+ // Map the fetched locations with default unchecked state
469
+ this.locations = res?.data?.locationData.map((city: any) => ({
470
+ city: city.city,
471
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
472
+ checked: cityList?.includes(city.city) ? true : false,
473
+ }));
474
+
475
+ // Sync the fetched locations with any stored checked values in localStorage
476
+ if (
477
+ this.selectedFilters.location &&
478
+ Array.isArray(this.selectedFilters.location)
479
+ ) {
480
+ this.filteredLocations = this.locations.map((location) => {
481
+ const matchedLocation = this.selectedFilters.location.find(
482
+ (loc: any) => loc.city === location.city
483
+ );
484
+ return matchedLocation
485
+ ? { ...location, checked: matchedLocation.checked }
486
+ : location;
487
+ });
488
+ } else {
489
+ this.filteredLocations = this.locations;
490
+ }
491
+
492
+ if (this.searchLocationText) {
493
+ this.filteredLocations = this.locations.filter((location: any) =>
494
+ location.city
495
+ .toLowerCase()
496
+ .includes(this.searchLocationText.toLowerCase())
497
+ );
498
+ }
499
+ const selectedLocations = this.locations
500
+ .filter((location) => location.checked)
501
+ .map((location) => location.city);
502
+ if (selectedLocations.length > 0) {
503
+ setTimeout(() => {
504
+ this.getGroups();
505
+ this.getStore(); // Fetch stores based on selected groups
506
+ }, 1000);
507
+ }
508
+
509
+ if (!selectedLocations.length && country.length) {
510
+ this.getGroups();
511
+ }
512
+ },
513
+ error: (err) => {
514
+ console.error("Failed to fetch locations", err);
515
+ },
516
+ });
517
+ }
518
+
519
+ isAllLocationsSelected(): boolean {
520
+ return this.filteredLocations.every((location) => location.checked);
521
+ }
522
+
523
+ selectedLocationsLabel(): string {
524
+ const selectedLocations = (this.locationLabel = this.searchLocationText
525
+ .length
526
+ ? this.locations
527
+ .filter((location) => location.checked)
528
+ .map((location) => location.city)
529
+ : this.filteredLocations
530
+ .filter((location) => location.checked)
531
+ .map((location) => location.city));
532
+ return selectedLocations.length === 0
533
+ ? ""
534
+ : selectedLocations.length === 1
535
+ ? selectedLocations[0]
536
+ : `${selectedLocations.length} Region`;
537
+ }
538
+
539
+ removeLocation(): void {
540
+ this.Reset();
541
+ }
542
+
543
+ getGroups(): void {
544
+ const country = this.countries
545
+ .filter((country) => country.checked)
546
+ .map((country) => country.country);
547
+ let city;
548
+ city = this.locations
549
+ .filter((location) => location.checked)
550
+ .map((location) => location.city);
551
+
552
+ if (!city.length && country.length) {
553
+ city = this.locations.map((loc) => loc.city);
554
+ }
555
+ const obj = {
556
+ country,
557
+ city,
558
+ clientId: this.selectedFilters.client
559
+ ? this.selectedFilters.client
560
+ : this.users.clientId,
561
+ group: [],
562
+ };
563
+ this.auth.getGroups(obj).subscribe({
564
+ next: (res: any) => {
565
+ let checkedGroup = this.selectedFilters?.group
566
+ ?.filter((group: any) => group.checked)
567
+ .map((group: any) => group.groupName);
568
+ const combinedGroups = res?.data?.groupData?.map((groupName: any) => ({
569
+ groupName: groupName.groupName,
570
+ checked: checkedGroup?.includes(groupName.groupName) ? true : false,
571
+ // checked: checkedGroup?.length ? checkedGroup.includes(groupName.groupName) : true,
572
+ }));
573
+ this.groupsData = combinedGroups;
574
+ if (this.searchGroupText.length) {
575
+ this.filteredGroups = combinedGroups.filter((item: any) =>
576
+ item.groupName.toLowerCase().includes(this.searchGroupText)
577
+ );
578
+ } else {
579
+ this.filteredGroups = combinedGroups;
580
+ }
581
+
582
+ // Auto-fetch stores when groups are selected
583
+ const selectedGroups = this.groupsData
584
+ .filter((group) => group.checked)
585
+ .map((group) => group.groupName);
586
+ if (selectedGroups.length > 0) {
587
+ setTimeout(() => {
588
+ this.getStore(); // Fetch stores based on selected groups
589
+ }, 1000);
590
+ }
591
+ },
592
+ error: (err) => {
593
+ console.error("Failed to fetch groups", err);
594
+ },
595
+ });
596
+ }
597
+
598
+ toggleDropdown(
599
+ type: "country" | "location" | "group" | "store" | "zone"
600
+ ): void {
601
+ if (this.dropdownOpen === type) {
602
+ // If the dropdown is open, close it and avoid resetting the selected values unnecessarily
603
+ this.dropdownOpen = null;
604
+ } else {
605
+ // Open the specific dropdown and handle data fetching only if necessary
606
+ this.dropdownOpen = type;
607
+
608
+ if (type === "country") {
609
+ // Fetch countries only if not already fetched and no search text exists
610
+ if (
611
+ (!this.filteredCountries || this.filteredCountries.length === 0) &&
612
+ !this.searchCountryText.trim()
613
+ ) {
614
+ this.getCountry();
615
+ }
616
+ }
617
+
618
+ if (type === "group") {
619
+ // Fetch groups only if there are selected cities and no active search text
620
+ const selectedCities = this.locations
621
+ .filter((location) => location.checked)
622
+ .map((location) => location.city);
623
+
624
+ // Fetch groups only if locations are selected, no search text exists, and dropdown is opened
625
+ if (
626
+ this.filteredLocations.length > 0 ||
627
+ (selectedCities.length > 0 && !this.searchGroupText.trim())
628
+ ) {
629
+ this.getGroups();
630
+ } else {
631
+ this.filteredGroups = []; // Clear groups if no locations are selected
632
+ }
633
+ }
634
+
635
+ if (type === "store") {
636
+ // Fetch stores only if not already fetched and no search text is active
637
+ if (
638
+ (!this.filteredStores || this.filteredStores.length === 0) &&
639
+ !this.searchStoreText.trim()
640
+ ) {
641
+ this.getStore();
642
+ }
643
+ }
644
+
645
+ if (type === "zone") {
646
+ // Fetch stores only if not already fetched and no search text is active
647
+ if (
648
+ (!this.filteredZones || this.filteredZones.length === 0) &&
649
+ !this.searchZoneText.trim()
650
+ ) {
651
+ this.getZone();
652
+ }
653
+ }
654
+ }
655
+ }
656
+
657
+ handleGroupDropdownClick(): void {
658
+ if (this.dropdownOpen === "group") {
659
+ this.resetSelectedGroups();
660
+ }
661
+ this.toggleDropdown("group");
662
+ }
663
+
664
+ resetSelectedGroups(): void {
665
+ this.filteredGroups.forEach((group) => (group.checked = false));
666
+ this.searchGroupText = "";
667
+ }
668
+ selectedGroupsLabel(): string {
669
+ const selectedGroups = (this.groupLabel = this.searchGroupText.length
670
+ ? this.groupsData.filter((group) => group.checked)
671
+ : this.filteredGroups.filter((group) => group.checked));
672
+ return selectedGroups.length === 0
673
+ ? ""
674
+ : selectedGroups.length === 1
675
+ ? selectedGroups[0].groupName
676
+ : `${selectedGroups.length} Clusters`;
677
+ }
678
+ removeGroup(): void {
679
+ this.Reset();
680
+ }
681
+
682
+ isAllGroupsSelected(): boolean {
683
+ return this.filteredGroups.length
684
+ ? this.filteredGroups.every((group) => group.checked)
685
+ : false;
686
+ }
687
+
688
+ getStore(): void {
689
+ const country = this.countries
690
+ .filter((country) => country.checked)
691
+ .map((country) => country.country);
692
+ const city = this.locations
693
+ .filter((location) => location.checked)
694
+ .map((location) => location.city);
695
+ const group = this.groupsData
696
+ .filter((group) => group.checked)
697
+ .map((group) => group.groupName);
698
+
699
+ const data = {
700
+ country,
701
+ city,
702
+ clusters: group,
703
+ clientId: this.users.clientId || this.selectedFilters.client,
704
+ };
705
+
706
+ this.auth.getHeaderStores(data).subscribe({
707
+ next: (res: any) => {
708
+ if (res && res.code === 200) {
709
+ // Initialize stores from API response
710
+ this.stores = res.data.storesData;
711
+ // Check if there are previously selected stores
712
+ const checkedStoreIds = this.selectedFilters?.stores
713
+ ? this.selectedFilters.stores
714
+ .filter((store: any) => store.checked)
715
+ .map((store: any) => store.storeId)
716
+ : [];
717
+ // Sync the `checked` state
718
+ this.stores.forEach((store) => {
719
+ store.checked = checkedStoreIds.length
720
+ ? checkedStoreIds.includes(store.storeId) // Use previous selection
721
+ : true; // Default to true if no previous selection
722
+ });
723
+
724
+ // Apply search filter if search text is present
725
+ if (this.searchStoreText.length) {
726
+ this.filteredStores = this.stores.filter((store) =>
727
+ store.storeName
728
+ .toLowerCase()
729
+ .includes(this.searchStoreText.toLowerCase())
730
+ );
731
+ } else {
732
+ this.filteredStores = [...this.stores];
733
+ }
734
+
735
+ // Update `selectedFilters.stores` to reflect the current state
736
+ this.selectedFilters.stores = this.filteredStores.map((store) => ({
737
+ storeId: store.storeId,
738
+ storeName: store.storeName,
739
+ checked: store.checked,
740
+ }));
741
+ // this.selectedFilters.country = country;
742
+
743
+ // Save updated filters to localStorage
744
+ localStorage.setItem(
745
+ "header-filters",
746
+ JSON.stringify(this.selectedFilters)
747
+ );
748
+ this.getZone();
749
+ // Trigger UI change detection
750
+ this.cd.detectChanges();
751
+ } else {
752
+ // Handle empty or error response
753
+ this.clearStoresState();
754
+ }
755
+ },
756
+ error: (err) => {
757
+ console.error("Failed to fetch stores", err);
758
+ this.clearStoresState();
759
+ },
760
+ });
761
+ }
762
+
763
+ getZone() {
764
+ const country = this.countries
765
+ .filter((country) => country.checked)
766
+ .map((country) => country.country);
767
+
768
+ const city = this.locations
769
+ .filter((location) => location.checked)
770
+ .map((location) => location.city);
771
+
772
+ const group = this.groupsData
773
+ .filter((group) => group.checked)
774
+ .map((group) => group.groupName);
775
+
776
+ const storeId = this.filteredStores
777
+ .filter((group) => group.checked)
778
+ .map((group) => group.storeId);
779
+
780
+ const data = {
781
+ country,
782
+ city,
783
+ clusters: group,
784
+ clientId: this.users.clientId || this.selectedFilters.client,
785
+ storeId: storeId,
786
+ };
787
+
788
+ this.auth.getHeaderZone(data).subscribe({
789
+ next: (res: any) => {
790
+ if (res && res.code === 200) {
791
+ // Initialize zones with Overall Store first, unchecked by default
792
+ this.zones = [
793
+ { _id: "overall", tagName: "Overall Store", checked: false },
794
+ ...(res?.data?.zoneData?.map((zone: any) => ({
795
+ _id: zone._id,
796
+ tagName: zone.tagName,
797
+ checked: false, // initialize unchecked; will update below
798
+ })) || []),
799
+ ];
800
+
801
+ // Get previously selected zone IDs (checked ones)
802
+ const checkedStoreIds = this.selectedFilters?.zoneName
803
+ ? this.selectedFilters.zoneName
804
+ .filter((zone: any) => zone.checked)
805
+ .map((zone: any) => zone._id)
806
+ : [];
807
+
808
+ // Sync checked state with previous selections or default:
809
+ // If no previous selection, Overall Store unchecked, others checked
810
+ this.zones.forEach((zone) => {
811
+ if (checkedStoreIds.length) {
812
+ zone.checked = checkedStoreIds.includes(zone._id);
813
+ } else {
814
+ zone.checked = zone._id !== "overall";
815
+ }
816
+ });
817
+
818
+ // Apply search filter if any
819
+ if (this.searchZoneText.length) {
820
+ this.filteredZones = this.zones.filter((zone) =>
821
+ zone.tagName
822
+ .toLowerCase()
823
+ .includes(this.searchZoneText.toLowerCase())
824
+ );
825
+ } else {
826
+ this.filteredZones = [...this.zones];
827
+ }
828
+
829
+ // Update selectedFilters.zoneName with current checked states
830
+ this.selectedFilters.zoneName = this.filteredZones.map((zone) => ({
831
+ _id: zone._id,
832
+ tagName: zone.tagName,
833
+ checked: zone.checked,
834
+ }));
835
+
836
+ // Save updated filters to localStorage
837
+ localStorage.setItem(
838
+ "header-filters",
839
+ JSON.stringify(this.selectedFilters)
840
+ );
841
+
842
+ // Trigger change detection if needed
843
+ this.cd.detectChanges();
844
+ } else {
845
+ this.clearZoneState();
846
+ }
847
+ },
848
+ error: (err: any) => {
849
+ console.error("Failed to fetch zones", err);
850
+ this.clearZoneState();
851
+ },
852
+ });
853
+ }
854
+
855
+ private clearZoneState(): void {
856
+ this.zones = [];
857
+ this.filteredZones = [];
858
+ this.selectedFilters.zonename = [];
859
+ localStorage.setItem(
860
+ "header-filters",
861
+ JSON.stringify(this.selectedFilters)
862
+ );
863
+ }
864
+ // Clear stores state and reset filters
865
+ private clearStoresState(): void {
866
+ this.stores = [];
867
+ this.filteredStores = [];
868
+ this.selectedFilters.stores = [];
869
+ localStorage.setItem(
870
+ "header-filters",
871
+ JSON.stringify(this.selectedFilters)
872
+ );
873
+ }
874
+
875
+ resetSelectedStores(): void {
876
+ this.filteredStores.forEach((store) => (store.checked = false));
877
+ this.searchStoreText = "";
878
+ }
879
+
880
+ selectedStoresLabel(): string {
881
+ const selectedStores = this.searchStoreText.length
882
+ ? this.stores.filter((store) => store.checked)
883
+ : this.filteredStores.filter((store) => store.checked);
884
+ return selectedStores.length === 0
885
+ ? "0 Stores"
886
+ : selectedStores.length === 1
887
+ ? selectedStores[0].storeName
888
+ : `${selectedStores.length} Stores`;
889
+ }
890
+
891
+ selectedZonesLabel(): string {
892
+ const selectedStores = this.searchZoneText.length
893
+ ? this.zones.filter((zone) => zone.checked)
894
+ : this.filteredZones.filter((zone) => zone.checked);
895
+ return selectedStores.length === 0
896
+ ? "0 Zones"
897
+ : selectedStores.length === 1
898
+ ? selectedStores[0].tagName
899
+ : `${selectedStores.length} Zones`;
900
+ }
901
+
902
+ isAllStoresSelected(): boolean {
903
+ return (
904
+ this.filteredStores.length > 0 &&
905
+ this.filteredStores.every((store) => store.checked)
906
+ );
907
+ }
908
+ isAllZonesSelected(): boolean {
909
+ return this.filteredZones
910
+ .filter((zone) => zone._id !== "overall")
911
+ .every((zone) => zone.checked);
912
+ }
913
+
914
+ // Method to handle dropdown item selection
915
+ updateSelectedStores(): void {
916
+ this.filteredStores.forEach((store) => {
917
+ const filteredStore = this.stores.findIndex(
918
+ (fStore) => fStore.storeId === store.storeId
919
+ );
920
+ if (filteredStore != -1) {
921
+ this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
922
+ }
923
+ });
924
+ // Update selectedFilters based on the current store selection
925
+ this.selectedFilters.stores = this.stores.filter((store) => store.checked);
926
+
927
+ // Update localStorage with the latest selection
928
+ localStorage.setItem(
929
+ "header-filters",
930
+ JSON.stringify(this.selectedFilters)
931
+ );
932
+
933
+ // Emit updated filters via service
934
+ // this.gs.dataRangeValue.next(this.selectedFilters);
935
+
936
+ // Trigger change detection if necessary
937
+ if (this.selectedFilters.stores.length > 0) this.getZone();
938
+ else this.zones = [];
939
+ this.filteredZones = [];
940
+ this.selectedFilters.zoneName = [];
941
+ this.cd.detectChanges();
942
+ }
943
+
944
+ updateSelectedZones(clickedZoneId: string): void {
945
+ this.filteredZones.forEach((zone) => {
946
+ const index = this.zones.findIndex((z) => z._id === zone._id);
947
+ if (index !== -1) {
948
+ this.zones[index].checked = zone.checked;
949
+ }
950
+ });
951
+
952
+ const overallZone = this.zones.find((z) => z._id === "overall");
953
+ const overallChecked = overallZone?.checked ?? false;
954
+ const othersSelected = this.zones.some(
955
+ (z) => z._id !== "overall" && z.checked
956
+ );
957
+
958
+ if (clickedZoneId === "overall" && overallChecked) {
959
+ this.zones = this.zones.map((z) => ({
960
+ ...z,
961
+ checked: z._id === "overall",
962
+ }));
963
+ }
964
+ if (clickedZoneId !== "overall" && overallChecked) {
965
+ if (overallZone) {
966
+ overallZone.checked = false;
967
+ }
968
+ }
969
+ this.filteredZones = [...this.zones];
970
+ this.selectedFilters.zoneName = this.zones.filter((z) => z.checked);
971
+ localStorage.setItem(
972
+ "header-filters",
973
+ JSON.stringify(this.selectedFilters)
974
+ );
975
+ this.cd.detectChanges();
976
+ }
977
+
978
+ toggleSelectAllLocations(event: any): void {
979
+ const isChecked = event.target.checked;
980
+ this.filteredLocations.forEach(
981
+ (location) => (location.checked = isChecked)
982
+ );
983
+ this.updateSelectedLocations();
984
+ }
985
+
986
+ toggleSelectAllStores(event: Event): void {
987
+ const checked = (event.target as HTMLInputElement).checked;
988
+
989
+ // Apply the selection to both filtered and full list of stores
990
+ this.filteredStores.forEach((store) => (store.checked = checked));
991
+ this.stores.forEach((store) => {
992
+ const filteredStore = this.filteredStores.find(
993
+ (fStore) => fStore.storeId === store.storeId
994
+ );
995
+ if (filteredStore) {
996
+ store.checked = checked; // Sync the checked state with full store list
997
+ }
998
+ });
999
+
1000
+ // Update the selected stores and persist the selection
1001
+ this.updateSelectedStores();
1002
+ }
1003
+
1004
+ toggleSelectAllZones(event: Event): void {
1005
+ const checked = (event.target as HTMLInputElement).checked;
1006
+ this.filteredZones.forEach((zone) => {
1007
+ if (zone._id !== "overall") {
1008
+ zone.checked = checked;
1009
+ } else {
1010
+ zone.checked = false;
1011
+ }
1012
+ });
1013
+ this.zones.forEach((zone) => {
1014
+ const match = this.filteredZones.find((fz) => fz._id === zone._id);
1015
+ if (match) {
1016
+ zone.checked = match.checked;
1017
+ }
1018
+ });
1019
+ // Since this is bulk, pass a dummy value — any non-overall zone is fine
1020
+ const anySelectedZone = this.filteredZones.find((z) => z._id !== "overall");
1021
+ const clickedId = anySelectedZone ? anySelectedZone._id : "";
1022
+ this.updateSelectedZones(clickedId);
1023
+ }
1024
+
1025
+ updateSelectedLocations(): void {
1026
+ // When locations are selected, fetch the related groups
1027
+ const selectedCities = this.filteredLocations
1028
+ .filter((location) => location.checked)
1029
+ .map((location) => location.city);
1030
+ this.filteredLocations.forEach((location: any) => {
1031
+ let findLocationIndex = this.locations.findIndex(
1032
+ (loc: any) => loc.city == location.city
1033
+ );
1034
+ if (findLocationIndex != -1) {
1035
+ this.locations[findLocationIndex].checked = location.checked;
1036
+ }
1037
+ });
1038
+ if (selectedCities.length > 0 || !selectedCities.length) {
1039
+ this.selectedFilters.stores = [];
1040
+ this.groupsData = [];
1041
+ this.getGroups(); // Fetch groups based on selected cities
1042
+ // If there are selected groups, fetch the stores based on selected groups
1043
+ this.getStore();
1044
+ this.selectedFilters.location = this.locations;
1045
+ } else {
1046
+ this.filteredGroups = []; // Clear groups if no locations are selected
1047
+ this.selectedFilters.location = [];
1048
+ }
1049
+
1050
+ this.selectedFilters.group = [];
1051
+ this.filteredStores = []; // Reset stores as well
1052
+ this.searchGroupText = "";
1053
+ this.searchStoreText = "";
1054
+ // this.Opendropdown = false;
1055
+ }
1056
+
1057
+ toggleSelectAllGroups(event: any): void {
1058
+ const isChecked = event.target.checked;
1059
+ this.filteredGroups.forEach((group) => (group.checked = isChecked));
1060
+ this.updateSelectedGroups();
1061
+ }
1062
+
1063
+ updateSelectedGroups(): void {
1064
+ // Fetch the relevant stores after groups are selected
1065
+ const selectedGroups = this.filteredGroups
1066
+ .filter((group) => group.checked)
1067
+ .map((group) => group.groupName);
1068
+
1069
+ this.filteredGroups.forEach((group: any) => {
1070
+ let findGroupIndex = this.groupsData.findIndex(
1071
+ (item: any) => item.groupName == group.groupName
1072
+ );
1073
+ if (findGroupIndex != -1) {
1074
+ this.groupsData[findGroupIndex].checked = group.checked;
1075
+ }
1076
+ });
1077
+ if (selectedGroups.length > 0 || !selectedGroups.length) {
1078
+ this.selectedFilters.stores = [];
1079
+ // If there are selected groups, fetch the stores based on selected groups
1080
+ this.getStore();
1081
+ this.selectedFilters.group = this.groupsData;
1082
+ } else {
1083
+ // If no groups are selected, clear the stores list
1084
+ this.filteredStores = [];
1085
+
1086
+ // Also, update localStorage to reflect the cleared store selection
1087
+ this.selectedFilters.stores = [];
1088
+ localStorage.setItem(
1089
+ "header-filters",
1090
+ JSON.stringify(this.selectedFilters)
1091
+ );
1092
+
1093
+ // Emit data via service
1094
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1095
+ }
1096
+
1097
+ // Clear the search store text when groups are updated
1098
+ this.searchStoreText = "";
1099
+ }
1100
+
1101
+ Reset(): void {
1102
+ setTimeout(() => {
1103
+ this.filteredCountries = [];
1104
+ this.filteredGroups = [];
1105
+ this.filteredStores = [];
1106
+ this.filteredLocations = [];
1107
+ this.locations = [];
1108
+ this.groupsData = [];
1109
+ this.stores = [];
1110
+ this.filteredZones = [];
1111
+ this.zones = [];
1112
+ this.countries = [];
1113
+ this.searchLocationText = "";
1114
+ this.searchGroupText = "";
1115
+ this.searchStoreText = "";
1116
+ this.selectedFilters.stores = [];
1117
+ this.selectedFilters.group = [];
1118
+ this.selectedFilters.location = [];
1119
+ this.selectedFilters.country = [];
1120
+ this.selectedFilters.zoneName = [];
1121
+
1122
+ this.getCountry();
1123
+ this.getLocations();
1124
+ this.getStore();
1125
+ this.getGroups();
1126
+
1127
+ localStorage.setItem(
1128
+ "header-filters",
1129
+ JSON.stringify(this.selectedFilters)
1130
+ );
1131
+ window.location.reload();
1132
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1133
+ this.cd.detectChanges();
1134
+
1135
+ this.Opendropdown = false;
1136
+ }, 100);
1137
+ }
1138
+
1139
+ filterLocations(): void {
1140
+ const searchText = this.searchLocationText.toLowerCase();
1141
+
1142
+ if (searchText) {
1143
+ // Preserve the checked state during filtering
1144
+ this.filteredLocations = this.locations
1145
+ .map((location) => ({
1146
+ ...location,
1147
+ checked:
1148
+ this.filteredLocations.find((l) => l.city === location.city)
1149
+ ?.checked || false,
1150
+ }))
1151
+ .filter((location) =>
1152
+ location?.city?.toLowerCase().includes(searchText)
1153
+ );
1154
+ } else {
1155
+ // Restore the original checked state when search text is cleared
1156
+ this.filteredLocations = this.locations.map((location) => ({
1157
+ ...location,
1158
+ checked:
1159
+ this.selectedFilters.location.find(
1160
+ (l: any) => l.city === location.city
1161
+ )?.checked || false,
1162
+ }));
1163
+ }
1164
+ }
1165
+
1166
+ filterGroups(): void {
1167
+ const searchText = this.searchGroupText.toLowerCase();
1168
+
1169
+ if (searchText) {
1170
+ // Preserve the checked state during filtering
1171
+ this.filteredGroups = this.groupsData
1172
+ .map((group) => ({
1173
+ ...group,
1174
+ checked:
1175
+ this.filteredGroups.find((g) => g.groupName === group.groupName)
1176
+ ?.checked || false,
1177
+ }))
1178
+ .filter((group) =>
1179
+ group?.groupName?.toLowerCase().includes(searchText)
1180
+ );
1181
+ } else {
1182
+ // Restore the original checked state when search text is cleared
1183
+ this.filteredGroups = this.groupsData.map((group) => ({
1184
+ ...group,
1185
+ checked:
1186
+ this.selectedFilters.group.find(
1187
+ (g: any) => g.groupName === group.groupName
1188
+ )?.checked || false,
1189
+ }));
1190
+ }
1191
+ }
1192
+
1193
+ filterStores(): void {
1194
+ const searchText = this.searchStoreText.toLowerCase();
1195
+ // Preserve checked states during filtering
1196
+ if (searchText) {
1197
+ // Filter based on search text while preserving checked state
1198
+ this.filteredStores = this.stores
1199
+ .map((store) => ({
1200
+ ...store,
1201
+ // Check if the store is already checked in filteredStores, fallback to original stores' checked state
1202
+ checked:
1203
+ this.selectedFilters.stores.find(
1204
+ (s: any) => s.storeId === store.storeId
1205
+ )?.checked ||
1206
+ store.checked ||
1207
+ false,
1208
+ }))
1209
+ .filter((store) => store.storeName.toLowerCase().includes(searchText));
1210
+ } else {
1211
+ // When the search text is cleared, restore the original list with preserved checked states
1212
+ this.filteredStores = this.stores.map((store) => ({
1213
+ ...store,
1214
+ // Preserve the checked state based on the selected filters
1215
+ checked:
1216
+ this.selectedFilters.stores.find(
1217
+ (s: any) => s.storeId === store.storeId
1218
+ )?.checked ||
1219
+ store.checked ||
1220
+ false,
1221
+ }));
1222
+ }
1223
+ }
1224
+
1225
+ filterZones(): void {
1226
+ const searchText = this.searchZoneText.toLowerCase();
1227
+ // Preserve checked states during filtering
1228
+ if (searchText) {
1229
+ // Filter based on search text while preserving checked state
1230
+ this.filteredZones = this.zones
1231
+ .map((zone) => ({
1232
+ ...zone,
1233
+ // Check if the store is already checked in filteredStores, fallback to original stores' checked state
1234
+ checked:
1235
+ this.selectedFilters.zoneName.find((s: any) => s._id === zone._id)
1236
+ ?.checked ||
1237
+ zone.checked ||
1238
+ false,
1239
+ }))
1240
+ .filter((zone) => zone.tagName.toLowerCase().includes(searchText));
1241
+ } else {
1242
+ // When the search text is cleared, restore the original list with preserved checked states
1243
+ this.filteredZones = this.zones.map((zone) => ({
1244
+ ...zone,
1245
+ // Preserve the checked state based on the selected filters
1246
+ checked:
1247
+ this.selectedFilters.zoneName.find((s: any) => s._id === zone._id)
1248
+ ?.checked ||
1249
+ zone.checked ||
1250
+ false,
1251
+ }));
1252
+ }
1253
+ }
1254
+
1255
+ closeDropdown(): void {
1256
+ this.dropdownOpen = null;
1257
+ }
1258
+
1259
+ @HostListener("document:click", ["$event"])
1260
+ clickOutside(event: MouseEvent): void {
1261
+ const clickedInside = (event.target as HTMLElement).closest(
1262
+ ".dropdown-container"
1263
+ );
1264
+ const clickedoutSide = (event.target as HTMLElement).closest(".dropdown2");
1265
+ if (!clickedInside) {
1266
+ this.closeDropdown();
1267
+ }
1268
+ if (!clickedoutSide) {
1269
+ this.closeDropdown1();
1270
+ }
1271
+ }
1272
+
1273
+ // getCountry(): void {
1274
+ // // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
1275
+ // let obj ={
1276
+ // clientId: this.selectedFilters.client ? this.selectedFilters.client :this.users.clientId,
1277
+ // }
1278
+ // this.auth.getCountry(obj).subscribe({
1279
+ // next: (res: any) => {
1280
+ // let countryList = this.selectedFilters?.country?.filter((country:any) => country.checked).map((loc:any) => loc.allCountry);
1281
+ // // Map the fetched countries with default unchecked state
1282
+ // this.countires = res?.data?.countryData.map((allCountry: any) => ({
1283
+ // allCountry: allCountry.allCountry,
1284
+ // checked: countryList?.includes(allCountry.allCountry) ? true : false,
1285
+ // }));
1286
+
1287
+ // // Sync the fetched countries with any stored checked values in localStorage
1288
+ // if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
1289
+ // this.filteredCountries = this.countries.map(country => {
1290
+ // const matchedLocation = this.selectedFilters.country.find((loc: any) => loc.allCountry === country.allCountry);
1291
+ // return matchedLocation ? { ...country, checked: matchedLocation.checked } : country;
1292
+ // });
1293
+ // } else {
1294
+ // this.filteredCountries = this.countries;
1295
+ // }
1296
+
1297
+ // if(this.searchLocationText) {
1298
+ // this.filteredCountries = this.countries.filter((country:any) => country.city.toLowerCase().includes(this.searchLocationText.toLowerCase()))
1299
+ // }
1300
+ // const selectedCountries = this.countries.filter((country) => country.checked).map((country) => country.allCountry);
1301
+ // if (selectedCountries.length > 0) {
1302
+ // setTimeout(()=>{
1303
+ // this.getStore(); // Fetch stores based on selected groups
1304
+ // },1000)
1305
+ // }
1306
+ // },
1307
+ // error: (err) => {
1308
+ // console.error("Failed to fetch countries", err);
1309
+ // },
1310
+ // });
1311
+ // }
1312
+
1313
+ // selectedCountriesLabel(): string {
1314
+ // const selectedCountries = this.countryLabel = this.searchLocationText.length ? this.countries
1315
+ // .filter(country => country.checked).map(country => country.allCountry) : this.filteredCountries
1316
+ // .filter(country => country.checked).map(country => country.allCountry);
1317
+ // return selectedCountries.length === 0
1318
+ // ? ''
1319
+ // : selectedCountries.length === 1
1320
+ // ? selectedCountries[0]
1321
+ // : `${selectedCountries.length} countries`;
1322
+ // }
1323
+
1324
+ // isAllCountriesSelected(): boolean {
1325
+ // return this.filteredCountries.every(country => country.checked);
1326
+
1327
+ // }
1328
+ // filterCountries(): void {
1329
+ // const searchText = this.searchCountryText.toLowerCase();
1330
+
1331
+ // if (searchText) {
1332
+ // // Preserve the checked state during filtering
1333
+ // this.filteredCountries = this.countires
1334
+ // .map(country => ({
1335
+ // ...country,
1336
+ // checked: this.filteredCountries.find(l => l.allCountry === country.allCountry)?.checked || false
1337
+ // }))
1338
+ // .filter(location =>
1339
+ // location?.allCountry?.toLowerCase().includes(searchText)
1340
+ // );
1341
+ // } else {
1342
+ // // Restore the original checked state when search text is cleared
1343
+ // this.filteredCountries = this.countires.map(country => ({
1344
+ // ...country,
1345
+ // checked: this.selectedFilters.country.find((l:any) => l.allCountry === country.allCountry)?.checked || false
1346
+ // }));
1347
+ // }
1348
+ // }
1349
+
1350
+ getCountry(): void {
1351
+ let obj = {
1352
+ clientId: this.selectedFilters.client
1353
+ ? this.selectedFilters.client
1354
+ : this.users.clientId,
1355
+ };
1356
+
1357
+ this.auth.getCountry(obj).subscribe({
1358
+ next: (res: any) => {
1359
+ // Extract selected countries from existing filters (if any)
1360
+ let countryList = this.selectedFilters?.country
1361
+ ?.filter((country: any) => country.checked)
1362
+ .map((loc: any) => loc.country);
1363
+
1364
+ // Map API response to frontend model
1365
+ this.countries = res?.data?.countryData.map((item: any) => ({
1366
+ country: item.country,
1367
+ // checked: countryList?.length ? countryList.includes(item.country) : true,
1368
+ // checked: cityList?.length ? cityList.includes(city.city) : true,
1369
+ checked: countryList?.includes(item.country) ? true : false,
1370
+ }));
1371
+ if (
1372
+ this.selectedFilters.country &&
1373
+ Array.isArray(this.selectedFilters.country)
1374
+ ) {
1375
+ this.filteredCountries = this.countries.map((location) => {
1376
+ const matchedLocation = this.selectedFilters.country.find(
1377
+ (loc: any) => loc.country === location.country
1378
+ );
1379
+ return matchedLocation
1380
+ ? { ...location, checked: matchedLocation.checked }
1381
+ : location;
1382
+ });
1383
+ } else {
1384
+ this.filteredCountries = this.countries;
1385
+ }
1386
+
1387
+ // Initially, all countries are visible
1388
+ this.filteredCountries = [...this.countries];
1389
+
1390
+ // If a search text already exists, filter immediately
1391
+ if (this.searchCountryText) {
1392
+ this.filterCountries();
1393
+ }
1394
+
1395
+ // Fetch stores if at least one country is selected
1396
+ let selectedCountries = this.countries.filter(
1397
+ (country) => country.checked
1398
+ );
1399
+ if (selectedCountries.length > 0) {
1400
+ setTimeout(() => {
1401
+ this.getLocations();
1402
+ this.getStore(); // fetch stores
1403
+ }, 1000);
1404
+ }
1405
+ },
1406
+ error: (err) => {
1407
+ console.error("Failed to fetch countries", err);
1408
+ },
1409
+ });
1410
+ }
1411
+
1412
+ selectedCountriesLabel(): string {
1413
+ const selectedCountries = this.searchCountryText.length
1414
+ ? this.filteredCountries
1415
+ .filter((country) => country.checked)
1416
+ .map((country) => country.country)
1417
+ : this.countries
1418
+ .filter((country) => country.checked)
1419
+ .map((country) => country.country);
1420
+
1421
+ return selectedCountries.length === 0
1422
+ ? ""
1423
+ : selectedCountries.length === 1
1424
+ ? selectedCountries[0]
1425
+ : `${selectedCountries.length} countries`;
1426
+ }
1427
+
1428
+ filterCountries(): void {
1429
+ const searchText = this.searchCountryText.toLowerCase();
1430
+
1431
+ if (searchText) {
1432
+ // Filter and preserve checked state
1433
+ this.filteredCountries = this.countries
1434
+ .map((country) => ({
1435
+ ...country,
1436
+ checked:
1437
+ this.filteredCountries.find((c) => c.country === country.country)
1438
+ ?.checked || false,
1439
+ }))
1440
+ .filter((country) =>
1441
+ country.country.toLowerCase().includes(searchText)
1442
+ );
1443
+ } else {
1444
+ // Reset to full list
1445
+ this.filteredCountries = this.countries.map((country: Country) => ({
1446
+ ...country,
1447
+ checked:
1448
+ this.selectedFilters.country?.find(
1449
+ (c: any) => c.country === country.country
1450
+ )?.checked || false,
1451
+ }));
1452
+ }
1453
+ }
1454
+
1455
+ isAllCountriesSelected(): boolean {
1456
+ return (
1457
+ this.filteredCountries.length > 0 &&
1458
+ this.filteredCountries.every((country) => country.checked)
1459
+ );
1460
+ }
1461
+ toggleSelectAllCountries(event: any): void {
1462
+ const isChecked = event.target.checked;
1463
+ this.filteredCountries.forEach((country) => (country.checked = isChecked));
1464
+ this.updateSelectedCountries();
1465
+ }
1466
+
1467
+ updateSelectedCountries(): void {
1468
+ // When locations are selected, fetch the related groups
1469
+ const selectedCountries = this.filteredCountries
1470
+ .filter((country) => country.checked)
1471
+ .map((country) => country.country);
1472
+ this.filteredCountries.forEach((country: any) => {
1473
+ let findCountryIndex = this.countries.findIndex(
1474
+ (loc: any) => loc.country == country.country
1475
+ );
1476
+ if (findCountryIndex != -1) {
1477
+ this.countries[findCountryIndex].checked = country.checked;
1478
+ }
1479
+ });
1480
+ if (selectedCountries.length > 0 || !selectedCountries.length) {
1481
+ this.selectedFilters.stores = [];
1482
+ this.groupsData = [];
1483
+ this.locations = [];
1484
+ this.selectedFilters.zoneName = [];
1485
+ this.getLocations();
1486
+ this.getGroups(); // Fetch groups based on selected cities
1487
+ // If there are selected groups, fetch the stores based on selected groups
1488
+ this.getStore();
1489
+ this.getZone();
1490
+ this.selectedFilters.country = this.filteredCountries;
1491
+ } else {
1492
+ this.filteredGroups = []; // Clear groups if no locations are selected
1493
+ this.selectedFilters.country = [];
1494
+ }
1495
+
1496
+ this.selectedFilters.group = [];
1497
+ this.filteredStores = []; // Reset stores as well
1498
+ this.filteredZones = [];
1499
+ this.searchGroupText = "";
1500
+ this.searchStoreText = "";
1501
+ // this.Opendropdown = false;
1502
+ }
1503
+
1504
+ removeCountry(): void {
1505
+ this.Reset();
1506
+ }
1507
+
1508
+ Apply(): void {
1509
+ // Close the dropdown
1510
+ this.Opendropdown = false;
1511
+
1512
+ // Fetch existing filters from localStorage
1513
+ const headerFilters: any = JSON.parse(
1514
+ localStorage.getItem("header-filters") || "{}"
1515
+ );
1516
+ this.selectedFilters.store = null;
1517
+
1518
+ // Ensure current selections are reflected
1519
+ this.selectedFilters.country = this.filteredCountries;
1520
+ this.selectedFilters.location = this.locations;
1521
+ this.selectedFilters.group = this.groupsData;
1522
+ this.selectedFilters.stores = headerFilters.stores
1523
+ ? headerFilters.stores
1524
+ : this.stores;
1525
+ this.selectedFilters.zoneName = headerFilters.zoneName
1526
+ ? headerFilters.zoneName
1527
+ : this.zones;
1528
+ // this.selectedFilters.zoneName = this.filteredZones;
1529
+ // Store updated filters back in localStorage
1530
+ localStorage.setItem(
1531
+ "header-filters",
1532
+ JSON.stringify(this.selectedFilters)
1533
+ );
1534
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1535
+ window.location.reload();
1536
+ // Emit the updated filters via the service
1537
+ // this.gs.dataRangeValue.next(this.selectedFilters);
1538
+ // Trigger refresh if necessary
1539
+ // this.gs.manageRefreshTrigger.next(true);
1540
+ this.cd.detectChanges();
1541
+ }
1542
+ }
1543
+ interface City {
1544
+ city: string;
1545
+ }
1546
+
1547
+ interface Location {
1548
+ city: City;
1549
+ checked: boolean;
1550
+ }
1551
+ interface Country {
1552
+ country: string;
1553
+ checked: boolean;
1554
+ }
1555
+