@tuki-io/tuki-widgets 0.0.219-dev.52 → 0.0.219-dev.54

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 (216) hide show
  1. package/README.md +24 -24
  2. package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +1 -1
  3. package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
  4. package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +3 -3
  5. package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
  6. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
  7. package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
  8. package/esm2020/lib/widgets.component.mjs +9 -9
  9. package/esm2020/lib/widgets.module.mjs +1 -1
  10. package/esm2020/lib/widgets.service.mjs +1 -1
  11. package/esm2020/locations/public-api.mjs +1 -1
  12. package/esm2020/locations/src/app.constants.mjs +6 -2
  13. package/esm2020/locations/src/location-confirm-dialog/location-confirm-dialog.component.mjs +3 -3
  14. package/esm2020/locations/src/locations.component.mjs +62 -15
  15. package/esm2020/locations/src/locations.module.mjs +1 -1
  16. package/esm2020/locations/src/material.module.mjs +1 -1
  17. package/esm2020/locations/src/services/api.service.mjs +1 -1
  18. package/esm2020/locations/src/services/locations.service.mjs +7 -3
  19. package/esm2020/locations/src/types/location.mjs +1 -1
  20. package/esm2020/locations/src/utils/app-loader/app-loader.mjs +3 -3
  21. package/esm2020/meetings/src/app.constants.mjs +1 -1
  22. package/esm2020/meetings/src/components/live-meetings/live-meetings.component.mjs +3 -3
  23. package/esm2020/meetings/src/components/meeting-spaces/meeting-spaces.component.mjs +3 -3
  24. package/esm2020/meetings/src/meetings.component.mjs +3 -3
  25. package/esm2020/meetings/src/meetings.module.mjs +1 -1
  26. package/esm2020/meetings/src/services/live-meetings.service.mjs +1 -1
  27. package/esm2020/meetings/src/services/meeting-spaces.service.mjs +1 -1
  28. package/esm2020/meetings/src/types/live-meeting.mjs +1 -1
  29. package/esm2020/meetings/src/types/meeting-space.mjs +1 -1
  30. package/esm2020/meetings/src/utils/app-loader/app-loader.mjs +3 -3
  31. package/esm2020/public-api.mjs +1 -1
  32. package/esm2020/user-creation/src/app.constants.mjs +1 -1
  33. package/esm2020/user-creation/src/classes/notification.mjs +1 -1
  34. package/esm2020/user-creation/src/classes/site.mjs +1 -1
  35. package/esm2020/user-creation/src/environments/environment.mjs +1 -1
  36. package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +1 -1
  37. package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +3 -3
  38. package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +1 -1
  39. package/esm2020/user-creation/src/shared/services/notification.service.mjs +1 -1
  40. package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +1 -1
  41. package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
  42. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +3 -3
  43. package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +1 -1
  44. package/esm2020/user-creation/src/utils/device-default-prefix.mjs +1 -1
  45. package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +1 -1
  46. package/esm2020/user-creation/src/utils/device-name-validation.mjs +1 -1
  47. package/esm2020/user-creation/src/utils/model.mjs +1 -1
  48. package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +1 -1
  49. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +3 -3
  50. package/esm2020/user-device-manage/public-api.mjs +1 -1
  51. package/esm2020/user-device-manage/src/app.constants.mjs +1 -1
  52. package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
  53. package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
  54. package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
  55. package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
  56. package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
  57. package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
  58. package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
  59. package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
  60. package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
  61. package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
  62. package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
  63. package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
  64. package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
  65. package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
  66. package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
  67. package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
  68. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
  69. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
  70. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
  71. package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
  72. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +2 -2
  73. package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
  74. package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
  75. package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  76. package/esm2020/user-device-manage/src/material.module.mjs +1 -1
  77. package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
  78. package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
  79. package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
  80. package/esm2020/user-device-manage/src/services/device.service.mjs +1 -1
  81. package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
  82. package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
  83. package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
  84. package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
  85. package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
  86. package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
  87. package/esm2020/user-device-manage/src/services/user.service.mjs +1 -1
  88. package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
  89. package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
  90. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
  91. package/esm2020/user-manage/public-api.mjs +1 -1
  92. package/esm2020/user-manage/src/app.constants.mjs +1 -1
  93. package/esm2020/user-manage/src/classes/device.mjs +1 -1
  94. package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
  95. package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
  96. package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
  97. package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
  98. package/esm2020/user-manage/src/classes/line.mjs +1 -1
  99. package/esm2020/user-manage/src/classes/notification.mjs +1 -1
  100. package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
  101. package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
  102. package/esm2020/user-manage/src/classes/simplified-user.mjs +1 -1
  103. package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
  104. package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
  105. package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
  106. package/esm2020/user-manage/src/common-functions.mjs +1 -1
  107. package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
  108. package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
  109. package/esm2020/user-manage/src/environments/environment.mjs +1 -1
  110. package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
  111. package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  112. package/esm2020/user-manage/src/material.module.mjs +1 -1
  113. package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
  114. package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
  115. package/esm2020/user-manage/src/services/api.service.mjs +1 -1
  116. package/esm2020/user-manage/src/services/dcp-api.service.mjs +1 -1
  117. package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
  118. package/esm2020/user-manage/src/services/line.service.mjs +1 -1
  119. package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
  120. package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
  121. package/esm2020/user-manage/src/services/site-settings.service.mjs +1 -1
  122. package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
  123. package/esm2020/user-manage/src/services/user.service.mjs +1 -1
  124. package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
  125. package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
  126. package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
  127. package/esm2020/user-manage/src/user-manage-widget.component.mjs +2 -2
  128. package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
  129. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
  130. package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
  131. package/esm2020/users-list/public-api.mjs +1 -1
  132. package/esm2020/users-list/src/app.constants.mjs +1 -1
  133. package/esm2020/users-list/src/classes/app-location.mjs +1 -1
  134. package/esm2020/users-list/src/classes/device.mjs +1 -1
  135. package/esm2020/users-list/src/classes/line.mjs +1 -1
  136. package/esm2020/users-list/src/classes/move-user.mjs +1 -1
  137. package/esm2020/users-list/src/classes/notification.mjs +1 -1
  138. package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
  139. package/esm2020/users-list/src/classes/table-data.mjs +1 -1
  140. package/esm2020/users-list/src/classes/user-list.mjs +1 -1
  141. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
  142. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
  143. package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
  144. package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
  145. package/esm2020/users-list/src/services/api.service.mjs +1 -1
  146. package/esm2020/users-list/src/services/dns.service.mjs +1 -1
  147. package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
  148. package/esm2020/users-list/src/services/notification.service.mjs +1 -1
  149. package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
  150. package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
  151. package/esm2020/users-list/src/services/user.service.mjs +1 -1
  152. package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
  153. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
  154. package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
  155. package/esm2020/users-list/src/utils/notifications/notification.component.mjs +3 -3
  156. package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
  157. package/esm2020/workspaces/public-api.mjs +1 -1
  158. package/esm2020/workspaces/src/app.constants.mjs +1 -1
  159. package/esm2020/workspaces/src/components/workspace-detail/workspace-detail.component.mjs +3 -3
  160. package/esm2020/workspaces/src/components/workspaces-filters/workspaces-filters.component.mjs +3 -3
  161. package/esm2020/workspaces/src/components/workspaces-table/workspaces-table.component.mjs +3 -3
  162. package/esm2020/workspaces/src/material.module.mjs +1 -1
  163. package/esm2020/workspaces/src/services/api.service.mjs +1 -1
  164. package/esm2020/workspaces/src/services/workspace-detail.service.mjs +1 -1
  165. package/esm2020/workspaces/src/services/workspaces-migration.service.mjs +1 -1
  166. package/esm2020/workspaces/src/services/workspaces.service.mjs +1 -1
  167. package/esm2020/workspaces/src/types/workspace.mjs +1 -1
  168. package/esm2020/workspaces/src/utils/app-loader/app-loader.mjs +3 -3
  169. package/esm2020/workspaces/src/utils/device-icon.mjs +1 -1
  170. package/esm2020/workspaces/src/workspaces.component.mjs +8 -8
  171. package/esm2020/workspaces/src/workspaces.module.mjs +1 -1
  172. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  173. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  174. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
  175. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  176. package/fesm2015/tuki-io-tuki-widgets-locations.mjs +77 -21
  177. package/fesm2015/tuki-io-tuki-widgets-locations.mjs.map +1 -1
  178. package/fesm2015/tuki-io-tuki-widgets-meetings.mjs +8 -8
  179. package/fesm2015/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
  180. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +6 -6
  181. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  182. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
  183. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  184. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +18 -18
  185. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  186. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +12 -12
  187. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  188. package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs +15 -15
  189. package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
  190. package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
  191. package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
  192. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  193. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  194. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
  195. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  196. package/fesm2020/tuki-io-tuki-widgets-locations.mjs +76 -21
  197. package/fesm2020/tuki-io-tuki-widgets-locations.mjs.map +1 -1
  198. package/fesm2020/tuki-io-tuki-widgets-meetings.mjs +8 -8
  199. package/fesm2020/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
  200. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +6 -6
  201. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  202. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
  203. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  204. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +18 -18
  205. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  206. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +12 -12
  207. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  208. package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs +15 -15
  209. package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
  210. package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
  211. package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
  212. package/locations/src/app.constants.d.ts +1 -0
  213. package/locations/src/locations.component.d.ts +9 -3
  214. package/locations/src/services/locations.service.d.ts +7 -1
  215. package/locations/src/types/location.d.ts +2 -0
  216. package/package.json +1 -1
@@ -77,10 +77,10 @@ class LocationConfirmDialogComponent {
77
77
  }
78
78
  }
79
79
  LocationConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
80
- LocationConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationConfirmDialogComponent, selector: "tk-location-confirm-dialog", ngImport: i0, template: "<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\r\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\r\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\r\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\r\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\r\n {{ data.confirmButtonText }}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".tk-location-confirm-dialog-panel .mat-dialog-container{padding:24px;border-radius:8px;background:#fff;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.tk-location-confirm-dialog-backdrop{background:rgba(0,0,0,.32)}.tk-location-confirm-dialog{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;width:400px;box-sizing:border-box;padding:0 0 16px}.tk-location-confirm-dialog__title{text-align:left;font-weight:600;font-size:16px;margin:0 0 20px}.tk-location-confirm-dialog__content{color:#000000b3;font-size:14px}.tk-location-confirm-dialog__content p{margin:0 0 12px}.tk-location-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:12px;padding:0}.tk-location-confirm-dialog__button{height:32px;padding:0 16px;border-radius:50px;box-shadow:none;border:none;font-size:14px;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer}.tk-location-confirm-dialog__button--cancel{border:1px solid rgba(0,0,0,.5);color:#000;background:#fff}.tk-location-confirm-dialog__button--confirm{background:#000;color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }], encapsulation: i0.ViewEncapsulation.None });
80
+ LocationConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationConfirmDialogComponent, selector: "tk-location-confirm-dialog", ngImport: i0, template: "<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\n Cancel\n </button>\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\n {{ data.confirmButtonText }}\n </button>\n </div>\n</div>\n", styles: [".tk-location-confirm-dialog-panel .mat-dialog-container{padding:24px;border-radius:8px;background:#fff;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.tk-location-confirm-dialog-backdrop{background:rgba(0,0,0,.32)}.tk-location-confirm-dialog{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;width:400px;box-sizing:border-box;padding:0 0 16px}.tk-location-confirm-dialog__title{text-align:left;font-weight:600;font-size:16px;margin:0 0 20px}.tk-location-confirm-dialog__content{color:#000000b3;font-size:14px}.tk-location-confirm-dialog__content p{margin:0 0 12px}.tk-location-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:12px;padding:0}.tk-location-confirm-dialog__button{height:32px;padding:0 16px;border-radius:50px;box-shadow:none;border:none;font-size:14px;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer}.tk-location-confirm-dialog__button--cancel{border:1px solid rgba(0,0,0,.5);color:#000;background:#fff}.tk-location-confirm-dialog__button--confirm{background:#000;color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }], encapsulation: i0.ViewEncapsulation.None });
81
81
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationConfirmDialogComponent, decorators: [{
82
82
  type: Component,
83
- args: [{ selector: 'tk-location-confirm-dialog', encapsulation: ViewEncapsulation.None, template: "<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\r\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\r\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\r\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\r\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\r\n {{ data.confirmButtonText }}\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".tk-location-confirm-dialog-panel .mat-dialog-container{padding:24px;border-radius:8px;background:#fff;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.tk-location-confirm-dialog-backdrop{background:rgba(0,0,0,.32)}.tk-location-confirm-dialog{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;width:400px;box-sizing:border-box;padding:0 0 16px}.tk-location-confirm-dialog__title{text-align:left;font-weight:600;font-size:16px;margin:0 0 20px}.tk-location-confirm-dialog__content{color:#000000b3;font-size:14px}.tk-location-confirm-dialog__content p{margin:0 0 12px}.tk-location-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:12px;padding:0}.tk-location-confirm-dialog__button{height:32px;padding:0 16px;border-radius:50px;box-shadow:none;border:none;font-size:14px;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer}.tk-location-confirm-dialog__button--cancel{border:1px solid rgba(0,0,0,.5);color:#000;background:#fff}.tk-location-confirm-dialog__button--confirm{background:#000;color:#fff}\n"] }]
83
+ args: [{ selector: 'tk-location-confirm-dialog', encapsulation: ViewEncapsulation.None, template: "<div class=\"tk-location-confirm-dialog\" role=\"dialog\" aria-labelledby=\"tk-location-confirm-dialog-title\">\n <h3 id=\"tk-location-confirm-dialog-title\" class=\"tk-location-confirm-dialog__title\">{{ data.title }}</h3>\n <div mat-dialog-content class=\"tk-location-confirm-dialog__content\" [innerHTML]=\"data.message\"></div>\n <div mat-dialog-actions class=\"tk-location-confirm-dialog__actions\">\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\n Cancel\n </button>\n <button type=\"button\" class=\"tk-location-confirm-dialog__button tk-location-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\n {{ data.confirmButtonText }}\n </button>\n </div>\n</div>\n", styles: [".tk-location-confirm-dialog-panel .mat-dialog-container{padding:24px;border-radius:8px;background:#fff;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.tk-location-confirm-dialog-backdrop{background:rgba(0,0,0,.32)}.tk-location-confirm-dialog{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;width:400px;box-sizing:border-box;padding:0 0 16px}.tk-location-confirm-dialog__title{text-align:left;font-weight:600;font-size:16px;margin:0 0 20px}.tk-location-confirm-dialog__content{color:#000000b3;font-size:14px}.tk-location-confirm-dialog__content p{margin:0 0 12px}.tk-location-confirm-dialog__actions{display:flex;justify-content:flex-end;gap:12px;padding:0}.tk-location-confirm-dialog__button{height:32px;padding:0 16px;border-radius:50px;box-shadow:none;border:none;font-size:14px;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;cursor:pointer}.tk-location-confirm-dialog__button--cancel{border:1px solid rgba(0,0,0,.5);color:#000;background:#fff}.tk-location-confirm-dialog__button--confirm{background:#000;color:#fff}\n"] }]
84
84
  }], ctorParameters: function () {
85
85
  return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
86
86
  type: Inject,
@@ -160,8 +160,12 @@ const API = {
160
160
  GET_ALL: "/api/webex/configuration/customers/:customerId/siteslocations",
161
161
  },
162
162
  SITE_MIGRATION: {
163
- MIGRATE_SITE: "/api/migration/webex/sites/:siteId/migrate",
163
+ MIGRATE_SITE: "/api/migration/WEBEX/sites/:siteId/migrate",
164
164
  BATCH_STATUS: "/api/migration/webex/customer/:customerId/batchesstatus",
165
+ // Pre-existing migration batches for the customer, matched to a site by
166
+ // siteId. Reachable through the same exHost/webex gateway as everything
167
+ // else in this service — no separate host needed.
168
+ GET_BATCH_SITES: "/api/e2emigration/batch/:customerId/Sites",
165
169
  },
166
170
  };
167
171
 
@@ -208,9 +212,13 @@ class LocationsService {
208
212
  const url = API.SITES_LOCATIONS.GET_ALL.replace(':customerId', String(customerId));
209
213
  return this.apiService.fetch(url).pipe(map((response) => (Array.isArray(response) ? response : []).map(toSiteLocation)));
210
214
  }
211
- migrateSite(siteId) {
215
+ migrateSite(siteId, batchId) {
212
216
  const url = API.SITE_MIGRATION.MIGRATE_SITE.replace(':siteId', String(siteId));
213
- return this.apiService.post(url, {}, { batchId: '' });
217
+ return this.apiService.post(url, {}, batchId != null ? { batchId } : {});
218
+ }
219
+ getBatchSites(customerId) {
220
+ const url = API.SITE_MIGRATION.GET_BATCH_SITES.replace(':customerId', String(customerId));
221
+ return this.apiService.fetch(url).pipe(map((response) => (Array.isArray(response) ? response : [])));
214
222
  }
215
223
  getMigrationBatchStatuses(customerId, batchIds) {
216
224
  const url = API.SITE_MIGRATION.BATCH_STATUS.replace(':customerId', String(customerId));
@@ -231,10 +239,10 @@ class AppLoaderComponent {
231
239
  }
232
240
  }
233
241
  AppLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
234
- AppLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AppLoaderComponent, selector: "app-loader", ngImport: i0, template: "<div class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"70\"\r\n strokeWidth=\"3\"></mat-progress-spinner>\r\n</div>\r\n", styles: [".overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff3;z-index:200}.mat-progress-spinner circle,.mat-spinner circle{stroke:#000!important}\n"], dependencies: [{ kind: "component", type: i1$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None });
242
+ AppLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AppLoaderComponent, selector: "app-loader", ngImport: i0, template: "<div class=\"overlay\">\n <mat-progress-spinner\n class=\"page-spinner\"\n mode=\"indeterminate\"\n [diameter]=\"70\"\n strokeWidth=\"3\"></mat-progress-spinner>\n</div>\n", styles: [".overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff3;z-index:200}.mat-progress-spinner circle,.mat-spinner circle{stroke:#000!important}\n"], dependencies: [{ kind: "component", type: i1$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None });
235
243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppLoaderComponent, decorators: [{
236
244
  type: Component,
237
- args: [{ selector: 'app-loader', encapsulation: ViewEncapsulation.None, template: "<div class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"70\"\r\n strokeWidth=\"3\"></mat-progress-spinner>\r\n</div>\r\n", styles: [".overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff3;z-index:200}.mat-progress-spinner circle,.mat-spinner circle{stroke:#000!important}\n"] }]
245
+ args: [{ selector: 'app-loader', encapsulation: ViewEncapsulation.None, template: "<div class=\"overlay\">\n <mat-progress-spinner\n class=\"page-spinner\"\n mode=\"indeterminate\"\n [diameter]=\"70\"\n strokeWidth=\"3\"></mat-progress-spinner>\n</div>\n", styles: [".overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff3;z-index:200}.mat-progress-spinner circle,.mat-spinner circle{stroke:#000!important}\n"] }]
238
246
  }], ctorParameters: function () { return []; } });
239
247
 
240
248
  const MIGRATION_POLL_INTERVAL_MS = 10000;
@@ -264,12 +272,13 @@ class LocationsComponent {
264
272
  this.filters = {
265
273
  country: '',
266
274
  pendingActions: '',
267
- mapped: '',
275
+ status: '',
268
276
  };
269
277
  this.countryDisplayNames = typeof Intl !== 'undefined' && 'DisplayNames' in Intl
270
278
  ? new Intl.DisplayNames(['en'], { type: 'region' })
271
279
  : null;
272
280
  this.migrationIntervals = new Map();
281
+ this.batchInfoBySiteId = new Map();
273
282
  // Same icon set as users-list's "Provisioning Type" column (assets/icons/webex.svg,
274
283
  // local_24.svg, di_cloud_24.svg).
275
284
  this.provisioningTypeIcons = {
@@ -282,6 +291,7 @@ class LocationsComponent {
282
291
  this.apiService.token = this.token;
283
292
  this.apiService.apiUrl = this.exHost + '/webex';
284
293
  this.loadSiteLocations();
294
+ this.loadBatchSites();
285
295
  }
286
296
  ngOnDestroy() {
287
297
  this.migrationIntervals.forEach(interval => clearInterval(interval));
@@ -291,7 +301,7 @@ class LocationsComponent {
291
301
  this.isLoading = true;
292
302
  this.locationsService.fetchSiteLocations(this.customerId).subscribe({
293
303
  next: (siteLocations) => {
294
- this.siteLocations = siteLocations;
304
+ this.siteLocations = this.applyBatchIds(siteLocations);
295
305
  this.isLoading = false;
296
306
  },
297
307
  error: () => {
@@ -299,6 +309,23 @@ class LocationsComponent {
299
309
  },
300
310
  });
301
311
  }
312
+ // Runs independently of loadSiteLocations() — whichever resolves second
313
+ // re-applies the merge, so batchId ends up set regardless of load order.
314
+ loadBatchSites() {
315
+ this.locationsService.getBatchSites(this.customerId).subscribe({
316
+ next: (batches) => {
317
+ this.batchInfoBySiteId = new Map(batches.map(batch => [batch.siteId, { batchId: batch.id, status: batch.status }]));
318
+ this.siteLocations = this.applyBatchIds(this.siteLocations);
319
+ },
320
+ });
321
+ }
322
+ applyBatchIds(rows) {
323
+ return rows.map(row => {
324
+ var _a;
325
+ const info = this.batchInfoBySiteId.get(row.site.id);
326
+ return Object.assign(Object.assign({}, row), { batchId: info === null || info === void 0 ? void 0 : info.batchId, batchStatus: (_a = info === null || info === void 0 ? void 0 : info.status) !== null && _a !== void 0 ? _a : null });
327
+ });
328
+ }
302
329
  get pendingLocations() {
303
330
  return this.siteLocations.filter(row => { var _a; return !!((_a = row.location) === null || _a === void 0 ? void 0 : _a.hasPendingActions); });
304
331
  }
@@ -308,6 +335,9 @@ class LocationsComponent {
308
335
  get countries() {
309
336
  return Array.from(new Set(this.siteLocations.map(row => this.countryLabel(row)).filter(Boolean))).sort();
310
337
  }
338
+ get statuses() {
339
+ return Array.from(new Set(this.siteLocations.map(row => row.batchStatus).filter((v) => !!v))).sort();
340
+ }
311
341
  get filteredRows() {
312
342
  const term = this.searchTerm.trim().toLowerCase();
313
343
  const filtered = this.siteLocations.filter(row => {
@@ -320,7 +350,7 @@ class LocationsComponent {
320
350
  this.countryLabel(row).toLowerCase().includes(term)) &&
321
351
  (!this.filters.country || this.countryLabel(row) === this.filters.country) &&
322
352
  (!this.filters.pendingActions || String(!!((_e = row.location) === null || _e === void 0 ? void 0 : _e.hasPendingActions)) === this.filters.pendingActions) &&
323
- (!this.filters.mapped || (this.filters.mapped === 'mapped' ? this.isMapped(row) : !this.isMapped(row)));
353
+ (!this.filters.status || row.batchStatus === this.filters.status);
324
354
  });
325
355
  return filtered.sort((a, b) => {
326
356
  const comparison = this.rowName(a).localeCompare(this.rowName(b));
@@ -351,8 +381,31 @@ class LocationsComponent {
351
381
  rowName(row) {
352
382
  return row.site.name;
353
383
  }
354
- isMapped(row) {
355
- return !!row.location;
384
+ // Categorizes the free-text batch status into the three states the status
385
+ // dot can show — matched by keyword since the backend uses inconsistent
386
+ // casing/wording ("Finished Successfully", "COMPLETED", "collecting with
387
+ // fixes", "New", "FAILED", ...).
388
+ batchStatusCategory(row) {
389
+ const value = (row.batchStatus || '').toLowerCase();
390
+ if (!value) {
391
+ return '';
392
+ }
393
+ if (value.includes('fail')) {
394
+ return 'failed';
395
+ }
396
+ if (value.includes('complet') || value.includes('finished') || value.includes('success')) {
397
+ return 'success';
398
+ }
399
+ return 'in-progress';
400
+ }
401
+ isSuccessStatus(row) {
402
+ return this.batchStatusCategory(row) === 'success';
403
+ }
404
+ isInProgressStatus(row) {
405
+ return this.batchStatusCategory(row) === 'in-progress';
406
+ }
407
+ isFailedStatus(row) {
408
+ return this.batchStatusCategory(row) === 'failed';
356
409
  }
357
410
  addressLine(row) {
358
411
  if (!row.location) {
@@ -402,7 +455,7 @@ class LocationsComponent {
402
455
  this.pageIndex = 0;
403
456
  }
404
457
  clearFilters() {
405
- this.filters = { country: '', pendingActions: '', mapped: '' };
458
+ this.filters = { country: '', pendingActions: '', status: '' };
406
459
  this.pageIndex = 0;
407
460
  }
408
461
  onPageSizeChange(event) {
@@ -456,7 +509,7 @@ class LocationsComponent {
456
509
  migrateSite(row) {
457
510
  const siteId = row.site.id;
458
511
  row.migrationStatus = 'IN_PROGRESS';
459
- this.locationsService.migrateSite(siteId).subscribe({
512
+ this.locationsService.migrateSite(siteId, row.batchId).subscribe({
460
513
  next: (batchId) => {
461
514
  if (batchId) {
462
515
  this.pollMigrationStatus(siteId, batchId);
@@ -476,11 +529,14 @@ class LocationsComponent {
476
529
  this.locationsService.getMigrationBatchStatuses(this.customerId, [batchId]).subscribe({
477
530
  next: (statuses) => {
478
531
  const status = statuses.find(item => item.id === batchId);
479
- if (!status || status.status === 'In Progress') {
532
+ // The batch stops being returned once it's done processing, so its
533
+ // absence here means completion — only its presence with an
534
+ // in-progress status means we should keep polling.
535
+ if (status && status.status === 'In Progress') {
480
536
  return;
481
537
  }
482
538
  this.clearMigrationInterval(siteId);
483
- if (status.status === 'Completed') {
539
+ if (!status || status.status === 'Completed') {
484
540
  this.onMigrationComplete(siteId);
485
541
  }
486
542
  else {
@@ -518,7 +574,7 @@ class LocationsComponent {
518
574
  // concurrent poll's next tick doesn't land on a row that briefly lost it.
519
575
  mergeSiteLocations(fresh) {
520
576
  const inProgressSiteIds = new Set(this.siteLocations.filter(row => row.migrationStatus === 'IN_PROGRESS').map(row => row.site.id));
521
- this.siteLocations = fresh.map(row => inProgressSiteIds.has(row.site.id) && !row.location
577
+ this.siteLocations = this.applyBatchIds(fresh).map(row => inProgressSiteIds.has(row.site.id) && !row.location
522
578
  ? Object.assign(Object.assign({}, row), { migrationStatus: 'IN_PROGRESS' }) : row);
523
579
  }
524
580
  clearMigrationInterval(siteId) {
@@ -539,10 +595,10 @@ class LocationsComponent {
539
595
  row.site.name,
540
596
  this.addressLine(row),
541
597
  this.countryLabel(row),
542
- this.isMapped(row) ? 'Mapped' : 'Not mapped',
598
+ row.batchStatus || 'Not migrated',
543
599
  ]);
544
600
  const csvLines = [
545
- ['Location Name', 'Address', 'Country/Region', 'Mapping Status'],
601
+ ['Location Name', 'Address', 'Country/Region', 'Status'],
546
602
  ...rows,
547
603
  ].map(row => row.map(cell => `"${String(cell).replace(/"/g, '""')}"`).join(','));
548
604
  const blob = new Blob([csvLines.join('\n')], { type: 'text/csv;charset=utf-8;' });
@@ -555,10 +611,10 @@ class LocationsComponent {
555
611
  }
556
612
  }
557
613
  LocationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationsComponent, deps: [{ token: APIService }, { token: LocationsService }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
558
- LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationsComponent, selector: "tk-locations", inputs: { exHost: "exHost", token: "token", customerId: "customerId" }, outputs: { openLocation: "openLocation", editLocation: "editLocation", removeLocation: "removeLocation", addLocation: "addLocation", importLocations: "importLocations" }, ngImport: i0, template: "<div class=\"tk-locations\">\r\n <app-loader *ngIf=\"isLoading\"></app-loader>\r\n\r\n <div class=\"tk-locations__view-toggle\">\r\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\r\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\r\n List\r\n </button>\r\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\r\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\r\n Map\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\r\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\r\n <span class=\"tk-locations__banner-text\">\r\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\r\n </span>\r\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__toolbar\">\r\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\r\n <input\r\n [value]=\"searchTerm\"\r\n class=\"blue-input\"\r\n (input)=\"onSearchInputChange($event)\"\r\n type=\"text\"\r\n placeholder=\"Search by name, city, state, country\"\r\n style=\"\r\n width: 100%;\r\n height: 34px;\r\n border-radius: 0.5rem;\r\n font-size: 16px;\r\n padding: 6px 12px 6px 44px;\r\n border: 1px solid #00000080;\r\n background: #fff;\r\n color: #222;\r\n outline: none;\r\n box-sizing: border-box;\r\n min-width: 280px;\r\n \"\r\n />\r\n <span\r\n style=\"\r\n position: absolute;\r\n left: 12px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: #757575;\r\n font-size: 18px;\r\n font-weight: normal;\r\n pointer-events: none;\r\n \"\r\n >\r\n <i\r\n class=\"material-icons\"\r\n style=\"font-size: 18px; font-weight: normal\"\r\n >search</i\r\n >\r\n </span>\r\n </div>\r\n\r\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\r\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\r\n Filter\r\n </button>\r\n\r\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\r\n\r\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\r\n <mat-icon>file_download</mat-icon>\r\n </button>\r\n\r\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\r\n Manage locations\r\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\r\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\r\n </mat-menu>\r\n </div>\r\n\r\n <table class=\"tk-locations__table\">\r\n <thead>\r\n <tr>\r\n <th (click)=\"toggleNameSort()\">\r\n Location Name\r\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\r\n </th>\r\n <th>Address</th>\r\n <th>Country/Region</th>\r\n <th>Mapping</th>\r\n <th>Provisioning Type</th>\r\n <th class=\"tk-locations__actions-col\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\r\n <td class=\"tk-locations__name-cell\">\r\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\r\n </td>\r\n <td>{{ addressLine(row) || '\u2014' }}</td>\r\n <td>{{ countryLabel(row) || '\u2014' }}</td>\r\n <td>\r\n <span class=\"tk-locations__mapping-badge\" [class.tk-locations__mapping-badge--mapped]=\"isMapped(row)\">\r\n {{ isMapped(row) ? 'Mapped' : 'Not mapped' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\r\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\r\n </span>\r\n <ng-template #noProvisioningType>\u2014</ng-template>\r\n </td>\r\n <td class=\"tk-locations__actions-col\">\r\n <mat-progress-spinner\r\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\r\n class=\"tk-locations__row-action-spinner\"\r\n [diameter]=\"20\"\r\n strokeWidth=\"2\"\r\n mode=\"indeterminate\"\r\n matTooltip=\"Migrating site\u2026\">\r\n </mat-progress-spinner>\r\n <button\r\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\r\n mat-icon-button\r\n class=\"tk-locations__row-action-button\"\r\n [matMenuTriggerFor]=\"rowMenu\"\r\n (click)=\"$event.stopPropagation()\"\r\n aria-label=\"Open location actions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\r\n <button\r\n *ngIf=\"canMigrateSite(row)\"\r\n mat-menu-item\r\n type=\"button\"\r\n (click)=\"onMigrateSite(row)\">Migrate site</button>\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\r\n </mat-menu>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!pagedRows.length\">\r\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div class=\"tk-locations__footer\">\r\n <div class=\"tk-locations__rows-per-page\">\r\n <label for=\"tk-locations-page-size\">Rows per page:</label>\r\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\r\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\r\n </select>\r\n </div>\r\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\r\n <div class=\"tk-locations__pagination\">\r\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tk-locations__filter-backdrop\"\r\n *ngIf=\"isFilterPanelOpen\"\r\n (click)=\"closeFilterPanel()\">\r\n </div>\r\n\r\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\r\n <div class=\"tk-locations__filter-panel-header\">\r\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\r\n <button\r\n type=\"button\"\r\n class=\"tk-locations__filter-panel-close\"\r\n aria-label=\"Close filter panel\"\r\n (click)=\"closeFilterPanel()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-panel-body\">\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-mapped\">Mapping</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-mapped\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.mapped\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All</option>\r\n <option value=\"mapped\">Mapped</option>\r\n <option value=\"unmapped\">Not mapped</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All countries</option>\r\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All</option>\r\n <option value=\"true\">Yes</option>\r\n <option value=\"false\">No</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-panel-footer\">\r\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\r\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\r\n </div>\r\n </aside>\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2;padding-top:0}.tk-locations__view-toggle{display:flex;align-items:center;gap:.25rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;padding:.5rem .875rem;background:none;border:none;border-radius:6.25rem;font-family:inherit;font-size:1rem;font-weight:500;color:#000000b3;cursor:pointer}.tk-locations__view-button:hover:not(:disabled){background:rgba(0,0,0,.0705882353)}.tk-locations__view-button--active{background:#C1C1C1;color:#000000f2}.tk-locations__view-button--active:hover{background:rgba(0,0,0,.3019607843)}.tk-locations__view-button:disabled{cursor:default;opacity:.5}.tk-locations__view-button:disabled:hover{background:none}.tk-locations__view-icon{height:1.125rem;width:1.125rem;opacity:.6}.tk-locations__view-button--active .tk-locations__view-icon{opacity:1}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important;position:relative}.tk-locations__row-action-spinner{display:inline-block;margin:0 auto}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__mapping-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;border-radius:6.25rem;font-size:.75rem;font-weight:500;color:#0009;background:rgba(0,0,0,.06)}.tk-locations__mapping-badge--mapped{color:#1a7f37;background:rgba(26,127,55,.1)}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i1$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppLoaderComponent, selector: "app-loader" }] });
614
+ LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationsComponent, selector: "tk-locations", inputs: { exHost: "exHost", token: "token", customerId: "customerId" }, outputs: { openLocation: "openLocation", editLocation: "editLocation", removeLocation: "removeLocation", addLocation: "addLocation", importLocations: "importLocations" }, ngImport: i0, template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Status</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\n </td>\n <td>{{ addressLine(row) || '\u2014' }}</td>\n <td>{{ countryLabel(row) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__status\" *ngIf=\"row.batchStatus; else noStatus\">\n <span\n class=\"tk-locations__status-dot\"\n [class.tk-locations__status-dot--success]=\"isSuccessStatus(row)\"\n [class.tk-locations__status-dot--in-progress]=\"isInProgressStatus(row)\"\n [class.tk-locations__status-dot--failed]=\"isFailedStatus(row)\"></span>\n {{ row.batchStatus }}\n </span>\n <ng-template #noStatus>\u2014</ng-template>\n </td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <mat-progress-spinner\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\n class=\"tk-locations__row-action-spinner\"\n [diameter]=\"20\"\n strokeWidth=\"2\"\n mode=\"indeterminate\"\n matTooltip=\"Migrating site\u2026\">\n </mat-progress-spinner>\n <button\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\n <button\n *ngIf=\"canMigrateSite(row)\"\n mat-menu-item\n type=\"button\"\n (click)=\"onMigrateSite(row)\">Migrate site</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!pagedRows.length\">\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-status\">Status</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-status\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.status\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option *ngFor=\"let status of statuses\" [value]=\"status\">{{ status }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2;padding-top:0}.tk-locations__view-toggle{display:flex;align-items:center;gap:.25rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;padding:.5rem .875rem;background:none;border:none;border-radius:6.25rem;font-family:inherit;font-size:1rem;font-weight:500;color:#000000b3;cursor:pointer}.tk-locations__view-button:hover:not(:disabled){background:rgba(0,0,0,.0705882353)}.tk-locations__view-button--active{background:#C1C1C1;color:#000000f2}.tk-locations__view-button--active:hover{background:rgba(0,0,0,.3019607843)}.tk-locations__view-button:disabled{cursor:default;opacity:.5}.tk-locations__view-button:disabled:hover{background:none}.tk-locations__view-icon{height:1.125rem;width:1.125rem;opacity:.6}.tk-locations__view-button--active .tk-locations__view-icon{opacity:1}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important;position:relative}.tk-locations__row-action-spinner{display:inline-block;margin:0 auto}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__status{display:inline-flex;align-items:center;gap:.375rem;white-space:nowrap}.tk-locations__status-dot{width:.5rem;height:.5rem;border-radius:50%;background:rgba(0,0,0,.3);flex-shrink:0}.tk-locations__status-dot--success{background:#1d805f}.tk-locations__status-dot--in-progress{background:#639fff}.tk-locations__status-dot--failed{background:#c73636}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i1$2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppLoaderComponent, selector: "app-loader" }] });
559
615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationsComponent, decorators: [{
560
616
  type: Component,
561
- args: [{ selector: 'tk-locations', template: "<div class=\"tk-locations\">\r\n <app-loader *ngIf=\"isLoading\"></app-loader>\r\n\r\n <div class=\"tk-locations__view-toggle\">\r\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\r\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\r\n List\r\n </button>\r\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\r\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\r\n Map\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\r\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\r\n <span class=\"tk-locations__banner-text\">\r\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\r\n </span>\r\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__toolbar\">\r\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\r\n <input\r\n [value]=\"searchTerm\"\r\n class=\"blue-input\"\r\n (input)=\"onSearchInputChange($event)\"\r\n type=\"text\"\r\n placeholder=\"Search by name, city, state, country\"\r\n style=\"\r\n width: 100%;\r\n height: 34px;\r\n border-radius: 0.5rem;\r\n font-size: 16px;\r\n padding: 6px 12px 6px 44px;\r\n border: 1px solid #00000080;\r\n background: #fff;\r\n color: #222;\r\n outline: none;\r\n box-sizing: border-box;\r\n min-width: 280px;\r\n \"\r\n />\r\n <span\r\n style=\"\r\n position: absolute;\r\n left: 12px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: #757575;\r\n font-size: 18px;\r\n font-weight: normal;\r\n pointer-events: none;\r\n \"\r\n >\r\n <i\r\n class=\"material-icons\"\r\n style=\"font-size: 18px; font-weight: normal\"\r\n >search</i\r\n >\r\n </span>\r\n </div>\r\n\r\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\r\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\r\n Filter\r\n </button>\r\n\r\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\r\n\r\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\r\n <mat-icon>file_download</mat-icon>\r\n </button>\r\n\r\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\r\n Manage locations\r\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\r\n </button>\r\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\r\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\r\n </mat-menu>\r\n </div>\r\n\r\n <table class=\"tk-locations__table\">\r\n <thead>\r\n <tr>\r\n <th (click)=\"toggleNameSort()\">\r\n Location Name\r\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\r\n </th>\r\n <th>Address</th>\r\n <th>Country/Region</th>\r\n <th>Mapping</th>\r\n <th>Provisioning Type</th>\r\n <th class=\"tk-locations__actions-col\"></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\r\n <td class=\"tk-locations__name-cell\">\r\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\r\n </td>\r\n <td>{{ addressLine(row) || '\u2014' }}</td>\r\n <td>{{ countryLabel(row) || '\u2014' }}</td>\r\n <td>\r\n <span class=\"tk-locations__mapping-badge\" [class.tk-locations__mapping-badge--mapped]=\"isMapped(row)\">\r\n {{ isMapped(row) ? 'Mapped' : 'Not mapped' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\r\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\r\n </span>\r\n <ng-template #noProvisioningType>\u2014</ng-template>\r\n </td>\r\n <td class=\"tk-locations__actions-col\">\r\n <mat-progress-spinner\r\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\r\n class=\"tk-locations__row-action-spinner\"\r\n [diameter]=\"20\"\r\n strokeWidth=\"2\"\r\n mode=\"indeterminate\"\r\n matTooltip=\"Migrating site\u2026\">\r\n </mat-progress-spinner>\r\n <button\r\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\r\n mat-icon-button\r\n class=\"tk-locations__row-action-button\"\r\n [matMenuTriggerFor]=\"rowMenu\"\r\n (click)=\"$event.stopPropagation()\"\r\n aria-label=\"Open location actions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\r\n <button\r\n *ngIf=\"canMigrateSite(row)\"\r\n mat-menu-item\r\n type=\"button\"\r\n (click)=\"onMigrateSite(row)\">Migrate site</button>\r\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\r\n </mat-menu>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!pagedRows.length\">\r\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <div class=\"tk-locations__footer\">\r\n <div class=\"tk-locations__rows-per-page\">\r\n <label for=\"tk-locations-page-size\">Rows per page:</label>\r\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\r\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\r\n </select>\r\n </div>\r\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\r\n <div class=\"tk-locations__pagination\">\r\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"tk-locations__filter-backdrop\"\r\n *ngIf=\"isFilterPanelOpen\"\r\n (click)=\"closeFilterPanel()\">\r\n </div>\r\n\r\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\r\n <div class=\"tk-locations__filter-panel-header\">\r\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\r\n <button\r\n type=\"button\"\r\n class=\"tk-locations__filter-panel-close\"\r\n aria-label=\"Close filter panel\"\r\n (click)=\"closeFilterPanel()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-panel-body\">\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-mapped\">Mapping</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-mapped\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.mapped\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All</option>\r\n <option value=\"mapped\">Mapped</option>\r\n <option value=\"unmapped\">Not mapped</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All countries</option>\r\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-field\">\r\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\r\n <div class=\"tk-locations__filter-select-wrap\">\r\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\r\n <option value=\"\">All</option>\r\n <option value=\"true\">Yes</option>\r\n <option value=\"false\">No</option>\r\n </select>\r\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-locations__filter-panel-footer\">\r\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\r\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\r\n </div>\r\n </aside>\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2;padding-top:0}.tk-locations__view-toggle{display:flex;align-items:center;gap:.25rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;padding:.5rem .875rem;background:none;border:none;border-radius:6.25rem;font-family:inherit;font-size:1rem;font-weight:500;color:#000000b3;cursor:pointer}.tk-locations__view-button:hover:not(:disabled){background:rgba(0,0,0,.0705882353)}.tk-locations__view-button--active{background:#C1C1C1;color:#000000f2}.tk-locations__view-button--active:hover{background:rgba(0,0,0,.3019607843)}.tk-locations__view-button:disabled{cursor:default;opacity:.5}.tk-locations__view-button:disabled:hover{background:none}.tk-locations__view-icon{height:1.125rem;width:1.125rem;opacity:.6}.tk-locations__view-button--active .tk-locations__view-icon{opacity:1}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important;position:relative}.tk-locations__row-action-spinner{display:inline-block;margin:0 auto}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__mapping-badge{display:inline-flex;align-items:center;padding:.125rem .5rem;border-radius:6.25rem;font-size:.75rem;font-weight:500;color:#0009;background:rgba(0,0,0,.06)}.tk-locations__mapping-badge--mapped{color:#1a7f37;background:rgba(26,127,55,.1)}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"] }]
617
+ args: [{ selector: 'tk-locations', template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ totalElements }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Status</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" (click)=\"onOpenLocation(row)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(row)\">{{ row.site.name }}</a>\n </td>\n <td>{{ addressLine(row) || '\u2014' }}</td>\n <td>{{ countryLabel(row) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__status\" *ngIf=\"row.batchStatus; else noStatus\">\n <span\n class=\"tk-locations__status-dot\"\n [class.tk-locations__status-dot--success]=\"isSuccessStatus(row)\"\n [class.tk-locations__status-dot--in-progress]=\"isInProgressStatus(row)\"\n [class.tk-locations__status-dot--failed]=\"isFailedStatus(row)\"></span>\n {{ row.batchStatus }}\n </span>\n <ng-template #noStatus>\u2014</ng-template>\n </td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(row) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <mat-progress-spinner\n *ngIf=\"row.migrationStatus === 'IN_PROGRESS'\"\n class=\"tk-locations__row-action-spinner\"\n [diameter]=\"20\"\n strokeWidth=\"2\"\n mode=\"indeterminate\"\n matTooltip=\"Migrating site\u2026\">\n </mat-progress-spinner>\n <button\n *ngIf=\"row.migrationStatus !== 'IN_PROGRESS'\"\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onOpenLocation(row)\">View details</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onEditLocation(row)\">Edit location</button>\n <button\n *ngIf=\"canMigrateSite(row)\"\n mat-menu-item\n type=\"button\"\n (click)=\"onMigrateSite(row)\">Migrate site</button>\n <button *ngIf=\"row.location\" mat-menu-item type=\"button\" (click)=\"onRemoveLocation(row)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!pagedRows.length\">\n <td colspan=\"6\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-status\">Status</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-status\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.status\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option *ngFor=\"let status of statuses\" [value]=\"status\">{{ status }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\" (change)=\"onFilterChange()\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\" (change)=\"onFilterChange()\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2;padding-top:0}.tk-locations__view-toggle{display:flex;align-items:center;gap:.25rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;padding:.5rem .875rem;background:none;border:none;border-radius:6.25rem;font-family:inherit;font-size:1rem;font-weight:500;color:#000000b3;cursor:pointer}.tk-locations__view-button:hover:not(:disabled){background:rgba(0,0,0,.0705882353)}.tk-locations__view-button--active{background:#C1C1C1;color:#000000f2}.tk-locations__view-button--active:hover{background:rgba(0,0,0,.3019607843)}.tk-locations__view-button:disabled{cursor:default;opacity:.5}.tk-locations__view-button:disabled:hover{background:none}.tk-locations__view-icon{height:1.125rem;width:1.125rem;opacity:.6}.tk-locations__view-button--active .tk-locations__view-icon{opacity:1}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important;position:relative}.tk-locations__row-action-spinner{display:inline-block;margin:0 auto}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__status{display:inline-flex;align-items:center;gap:.375rem;white-space:nowrap}.tk-locations__status-dot{width:.5rem;height:.5rem;border-radius:50%;background:rgba(0,0,0,.3);flex-shrink:0}.tk-locations__status-dot--success{background:#1d805f}.tk-locations__status-dot--in-progress{background:#639fff}.tk-locations__status-dot--failed{background:#c73636}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"] }]
562
618
  }], ctorParameters: function () { return [{ type: APIService }, { type: LocationsService }, { type: i1.MatDialog }]; }, propDecorators: { exHost: [{
563
619
  type: Input
564
620
  }], token: [{