@tuki-io/tuki-widgets 0.0.219-dev.56 → 0.0.219-dev.58
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.
- package/README.md +24 -24
- package/esm2020/contact-center/cc-import/cc-import.module.mjs +1 -1
- package/esm2020/contact-center/cc-import/cc-import.service.mjs +1 -1
- package/esm2020/contact-center/cc-import/components/import-contact-center-panel/import-contact-center-panel.component.mjs +3 -3
- package/esm2020/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.component.mjs +3 -3
- package/esm2020/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.types.mjs +1 -1
- package/esm2020/contact-center/cc-import/constants/cc-import.constants.mjs +1 -1
- package/esm2020/contact-center/cc-import/mock/cc-import.mock.mjs +1 -1
- package/esm2020/contact-center/cc-import/types/cc-import.mjs +1 -1
- package/esm2020/contact-center/cc-import/types/uccx.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +3 -3
- package/esm2020/contact-center/public-api.mjs +1 -1
- package/esm2020/contact-center/shared/api.endpoints.mjs +1 -1
- package/esm2020/contact-center/shared/components/card/card.component.mjs +3 -3
- package/esm2020/contact-center/shared/dcp-api.service.mjs +1 -1
- package/esm2020/contact-center/shared/shared.module.mjs +1 -1
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
- package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
- package/esm2020/lib/widgets.component.mjs +9 -9
- package/esm2020/lib/widgets.module.mjs +1 -1
- package/esm2020/lib/widgets.service.mjs +1 -1
- package/esm2020/locations/public-api.mjs +1 -1
- package/esm2020/locations/src/app.constants.mjs +1 -1
- package/esm2020/locations/src/location-confirm-dialog/location-confirm-dialog.component.mjs +3 -3
- package/esm2020/locations/src/locations.component.mjs +3 -3
- package/esm2020/locations/src/locations.module.mjs +1 -1
- package/esm2020/locations/src/material.module.mjs +1 -1
- package/esm2020/locations/src/services/api.service.mjs +1 -1
- package/esm2020/locations/src/services/locations.service.mjs +1 -1
- package/esm2020/locations/src/types/location.mjs +1 -1
- package/esm2020/locations/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/meetings/public-api.mjs +1 -1
- package/esm2020/meetings/src/app.constants.mjs +1 -1
- package/esm2020/meetings/src/components/live-meetings/live-meeting/live-meeting.component.mjs +3 -3
- package/esm2020/meetings/src/components/live-meetings/live-meetings.component.mjs +3 -3
- package/esm2020/meetings/src/components/meeting-spaces/meeting-space/meeting-space.component.mjs +3 -3
- package/esm2020/meetings/src/components/meeting-spaces/meeting-spaces.component.mjs +3 -3
- package/esm2020/meetings/src/material.module.mjs +1 -1
- package/esm2020/meetings/src/meetings.component.mjs +3 -3
- package/esm2020/meetings/src/meetings.module.mjs +1 -1
- package/esm2020/meetings/src/services/api.service.mjs +1 -1
- package/esm2020/meetings/src/services/live-meetings.service.mjs +1 -1
- package/esm2020/meetings/src/services/meeting-spaces.service.mjs +1 -1
- package/esm2020/meetings/src/types/live-meeting.mjs +1 -1
- package/esm2020/meetings/src/types/meeting-space.mjs +1 -1
- package/esm2020/meetings/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/public-api.mjs +1 -1
- package/esm2020/user-creation/src/app.constants.mjs +1 -1
- package/esm2020/user-creation/src/classes/notification.mjs +1 -1
- package/esm2020/user-creation/src/classes/site.mjs +1 -1
- package/esm2020/user-creation/src/environments/environment.mjs +1 -1
- package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +1 -1
- package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +3 -3
- package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/notification.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
- package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-default-prefix.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-name-validation.mjs +1 -1
- package/esm2020/user-creation/src/utils/model.mjs +1 -1
- package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +1 -1
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +3 -3
- package/esm2020/user-device-manage/public-api.mjs +1 -1
- package/esm2020/user-device-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-device-manage/src/associate-lines/associate-lines.component.mjs +3 -3
- package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
- package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
- package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-settings/device-settings.component.mjs +3 -3
- package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-device-manage/src/line-key-config/line-key-config.component.mjs +3 -3
- package/esm2020/user-device-manage/src/material.module.mjs +1 -1
- package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
- package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/device.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
- package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/public-api.mjs +1 -1
- package/esm2020/user-manage/src/app.constants.mjs +2 -1
- package/esm2020/user-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-manage/src/classes/simplified-user.mjs +15 -2
- package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
- package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
- package/esm2020/user-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
- package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
- package/esm2020/user-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +9 -5
- package/esm2020/user-manage/src/material.module.mjs +14 -7
- package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dcp-api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/site-settings.service.mjs +11 -4
- package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-manage/src/services/user.service.mjs +30 -1
- package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
- package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
- package/esm2020/user-manage/src/user-manage-widget.component.mjs +42 -26
- package/esm2020/user-manage/src/user-manage.module.mjs +5 -2
- package/esm2020/user-manage/src/user-summary/user-summary.component.mjs +30 -0
- package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
- package/esm2020/users-list/public-api.mjs +1 -1
- package/esm2020/users-list/src/app.constants.mjs +1 -1
- package/esm2020/users-list/src/classes/app-location.mjs +1 -1
- package/esm2020/users-list/src/classes/device.mjs +1 -1
- package/esm2020/users-list/src/classes/line.mjs +1 -1
- package/esm2020/users-list/src/classes/move-user.mjs +1 -1
- package/esm2020/users-list/src/classes/notification.mjs +1 -1
- package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
- package/esm2020/users-list/src/classes/table-data.mjs +1 -1
- package/esm2020/users-list/src/classes/user-list.mjs +1 -1
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
- package/esm2020/users-list/src/services/api.service.mjs +1 -1
- package/esm2020/users-list/src/services/dns.service.mjs +1 -1
- package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
- package/esm2020/users-list/src/services/notification.service.mjs +1 -1
- package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
- package/esm2020/users-list/src/services/user.service.mjs +1 -1
- package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
- package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
- package/esm2020/users-list/src/utils/notifications/notification.component.mjs +3 -3
- package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
- package/esm2020/workspaces/public-api.mjs +1 -1
- package/esm2020/workspaces/src/app.constants.mjs +1 -1
- package/esm2020/workspaces/src/components/workspace-confirm-dialog/workspace-confirm-dialog.component.mjs +3 -3
- package/esm2020/workspaces/src/components/workspace-detail/workspace-detail.component.mjs +3 -3
- package/esm2020/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.mjs +3 -3
- package/esm2020/workspaces/src/components/workspaces-filters/workspaces-filters.component.mjs +3 -3
- package/esm2020/workspaces/src/components/workspaces-table/workspaces-table.component.mjs +3 -3
- package/esm2020/workspaces/src/material.module.mjs +1 -1
- package/esm2020/workspaces/src/services/api-webex.service.mjs +1 -1
- package/esm2020/workspaces/src/services/api.service.mjs +1 -1
- package/esm2020/workspaces/src/services/workspace-detail.service.mjs +1 -1
- package/esm2020/workspaces/src/services/workspaces-migration.service.mjs +1 -1
- package/esm2020/workspaces/src/services/workspaces.service.mjs +25 -8
- package/esm2020/workspaces/src/types/workspace.mjs +1 -1
- package/esm2020/workspaces/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/workspaces/src/utils/device-icon.mjs +1 -1
- package/esm2020/workspaces/src/utils/workspace-name.mjs +1 -1
- package/esm2020/workspaces/src/workspaces.component.mjs +9 -9
- package/esm2020/workspaces/src/workspaces.module.mjs +1 -1
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-locations.mjs +6 -6
- package/fesm2015/tuki-io-tuki-widgets-locations.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-meetings.mjs +12 -12
- package/fesm2015/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +6 -6
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +24 -24
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +165 -61
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +12 -12
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs +45 -27
- package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-locations.mjs +6 -6
- package/fesm2020/tuki-io-tuki-widgets-locations.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-meetings.mjs +12 -12
- package/fesm2020/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +6 -6
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +24 -24
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +155 -55
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +12 -12
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs +44 -27
- package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
- package/package.json +1 -1
- package/user-manage/src/app.constants.d.ts +1 -0
- package/user-manage/src/classes/simplified-user.d.ts +6 -0
- package/user-manage/src/material.module.d.ts +2 -1
- package/user-manage/src/services/user.service.d.ts +11 -0
- package/user-manage/src/user-manage-widget.component.d.ts +4 -0
- package/user-manage/src/user-manage.module.d.ts +9 -8
- package/user-manage/src/user-summary/user-summary.component.d.ts +10 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tuki-io-tuki-widgets-workspaces.mjs","sources":["../../../../projects/tuki/widgets/workspaces/src/material.module.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-confirm-dialog/workspace-confirm-dialog.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-confirm-dialog/workspace-confirm-dialog.component.html","../../../../projects/tuki/widgets/workspaces/src/services/api.service.ts","../../../../projects/tuki/widgets/workspaces/src/services/api-webex.service.ts","../../../../projects/tuki/widgets/workspaces/src/app.constants.ts","../../../../projects/tuki/widgets/workspaces/src/utils/workspace-name.ts","../../../../projects/tuki/widgets/workspaces/src/services/workspaces.service.ts","../../../../projects/tuki/widgets/workspaces/src/services/workspaces-migration.service.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-filters/workspaces-filters.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-filters/workspaces-filters.component.html","../../../../projects/tuki/widgets/workspaces/src/utils/device-icon.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-table/workspaces-table.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-table/workspaces-table.component.html","../../../../projects/tuki/widgets/workspaces/src/services/workspace-detail.service.ts","../../../../projects/tuki/widgets/workspaces/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/workspaces/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.html","../../../../projects/tuki/widgets/workspaces/src/components/workspace-detail/workspace-detail.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-detail/workspace-detail.component.html","../../../../projects/tuki/widgets/workspaces/src/workspaces.component.ts","../../../../projects/tuki/widgets/workspaces/src/workspaces.component.html","../../../../projects/tuki/widgets/workspaces/src/workspaces.module.ts","../../../../projects/tuki/widgets/workspaces/public-api.ts","../../../../projects/tuki/widgets/workspaces/tuki-io-tuki-widgets-workspaces.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialogModule } from '@angular/material/dialog';\n\n@NgModule({\n imports: [\n MatButtonModule,\n MatIconModule,\n MatTableModule,\n MatProgressSpinnerModule,\n MatFormFieldModule,\n MatInputModule,\n MatMenuModule,\n MatPaginatorModule,\n MatTooltipModule,\n MatDialogModule,\n ],\n exports: [\n MatButtonModule,\n MatIconModule,\n MatTableModule,\n MatProgressSpinnerModule,\n MatFormFieldModule,\n MatInputModule,\n MatMenuModule,\n MatPaginatorModule,\n MatTooltipModule,\n MatDialogModule,\n ]\n})\nexport class MaterialModule { }\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nexport interface WorkspaceConfirmDialogConfig {\n title: string;\n message: string;\n confirmButtonText: string;\n}\n\n@Component({\n selector: 'tk-workspace-confirm-dialog',\n templateUrl: './workspace-confirm-dialog.component.html',\n styleUrls: ['./workspace-confirm-dialog.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class WorkspaceConfirmDialogComponent implements OnInit {\n confirmButtonText = 'OK';\n message = '';\n title = '';\n\n constructor(\n public dialogRef: MatDialogRef<WorkspaceConfirmDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: WorkspaceConfirmDialogConfig,\n ) { }\n\n ngOnInit(): void {\n this.confirmButtonText = this.data.confirmButtonText || '';\n this.message = this.data.message || '';\n this.title = this.data.title || '';\n }\n\n onClose(result: boolean): void {\n this.dialogRef.close(result);\n }\n}\n","<div id=\"tk-workspace-confirm-dialog\" class=\"tk-workspace-confirm-dialog\" aria-labelledby=\"tk-workspace-confirm-dialog-label\" role=\"dialog\">\n <h3 *ngIf=\"title\" class=\"tk-workspace-confirm-dialog__title\">{{ title }}</h3>\n <div mat-dialog-content *ngIf=\"message\" class=\"tk-workspace-confirm-dialog__content\">\n <div class=\"tk-workspace-confirm-dialog__message\" [innerHTML]=\"message\"></div>\n </div>\n <div mat-dialog-actions class=\"tk-workspace-confirm-dialog__actions\">\n <button type=\"button\" class=\"tk-workspace-confirm-dialog__button tk-workspace-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\n Cancel\n </button>\n <button type=\"button\" class=\"tk-workspace-confirm-dialog__button tk-workspace-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\n {{ confirmButtonText }}\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class APIService {\n token!: string;\n apiUrl!: string;\n\n constructor(\n private httpClient: HttpClient\n ) { }\n\n fetch(url: string, params?: any, cache?: boolean): Observable<any> {\n const headers = this.getHeaders(cache);\n params = params || {};\n return this.httpClient.get(this.apiUrl + url, { params: this.prepareEncodedParams(params), headers });\n }\n\n post(url: string, body: any, params = {}): Observable<any> {\n body = body || null;\n const headers = this.getHeaders();\n return this.httpClient.post(this.apiUrl + url, body, { params: this.prepareEncodedParams(params), headers });\n }\n\n put(url: string, body: any = null, params = {}): Observable<any> {\n const headers = this.getHeaders();\n return this.httpClient.put(this.apiUrl + url, body, { headers, params: this.prepareEncodedParams(params) });\n }\n\n delete(url: string, params = {}) {\n const headers = this.getHeaders();\n return this.httpClient.delete(this.apiUrl + url, { headers, params: this.prepareEncodedParams(params) });\n }\n\n private prepareEncodedParams(params: any) {\n const result: any = {};\n\n if (!params) {\n return {};\n }\n for (const key of Object.keys(params)) {\n if (params[key] !== undefined && params[key] !== null && params[key] !== '') {\n const stringParam = params[key].toString();\n result[key] = stringParam.includes('+') ? encodeURIComponent(stringParam) : stringParam;\n }\n }\n return result;\n }\n\n private getHeaders(cache?: boolean): HttpHeaders {\n let headers = new HttpHeaders();\n if (cache) {\n headers = headers.append('_Cache', 'true ');\n }\n const token = this.token || this.getParameterByName('token');\n headers = headers.append('Authorization', 'Bearer ' + token);\n return headers;\n }\n\n private getParameterByName(name: any, url = window.location.href) {\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(url);\n if (!results) return null;\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { APIService } from './api.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ApiWebexService extends APIService { }\n","export const API = {\n WORKSPACES: {\n GET_ALL: '/api/search/quicknonuserdevices',\n },\n MIGRATION: {\n MOVE: '/api/migration/webex/singlemigration/features/ORPHANED_DEVICE',\n MIGRATION_FORM: '/api/search/webex/customers/:customerId/migrationforms/:formId',\n MIGRATION_FORM_ENTITIES_MIGRATED: '/api/search/webex/customers/:customerId/migrationformentities/migrated',\n TRIGGER_FIRMWARE_MIGRATION: '/api/migration/:migrationType/firmwaremigration/customer/:customerId/migration/:migrationFormId',\n REMOVE_UCM_LICENSE: '/api/migration/:controlHubType/removeucmlicense/customer/:customerId/migrationform/:migrationFormId',\n WEBEX_REVERT: '/api/webex/provisioning/customers/:customerId/persons/:personId/revertmigration',\n },\n DETAILS: {\n // CUCM detail endpoints will be provided later.\n CUCM: {\n WORKSPACE: '/api/provision/:siteId/nonuserdevices/:workspaceId?type=ORPHAN_DEVICE',\n SITE: '/api/sites/:siteId',\n },\n WEBEX: {\n WORKSPACE: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId',\n NUMBERS: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId/numbers',\n CALLERID: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId/callerId',\n },\n },\n};\n\nexport const ON_PREM_ID = 2542;","// CUCM and Webex Calling device names for the same physical workspace can differ\n// only by the 'SEP' substring (Cisco's MAC-based device naming for CUCM\n// endpoints). Comparing/rendering with it stripped is how the two get treated\n// as one workspace, without altering the underlying device name data.\nexport function withoutSep(name: string): string {\n return name.toLocaleUpperCase().replace(/SEP/gi, '');\n}\n","import { Injectable } from '@angular/core';\nimport { forkJoin, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { APIService } from './api.service';\nimport { Workspace, WorkspaceListItem, WorkspacesPage, WorkspacesResponse, WorkspaceStatus } from '../types/workspace';\nimport { withoutSep } from '../utils/workspace-name';\n\nfunction parseResponse(response: any): any {\n return typeof response === 'string' ? JSON.parse(response) : response;\n}\n\nfunction toStatus(provisioningStatus: string | null): WorkspaceStatus {\n if (!provisioningStatus) {\n return 'unavailable';\n }\n return provisioningStatus.toLowerCase() === 'active' ? 'active' : 'inactive';\n}\n\nfunction toWorkspace(item: WorkspaceListItem, index: number, isCucm: boolean): Workspace {\n const device = item.device;\n const firstDirectoryNumber = device.associatedDNs?.[0]?.directoryNumber ?? '';\n\n return {\n id: device.pkid || item.workspaceDevices?.[0]?.deviceId || device.name || `workspace-${index}`,\n displayName: device.newName || device.name || 'Unnamed device',\n typeLabel: device.userDeviceType || 'No type',\n capacity: null,\n location: item.site?.name || device.siteName || device.location || '',\n siteId: item.site?.id ?? null,\n devices: (item.workspaceDevices || []).map(workspaceDevice => ({\n id: workspaceDevice.deviceId,\n kind: 'device' as const,\n label: workspaceDevice.model || workspaceDevice.mac,\n model: workspaceDevice.model,\n mac: workspaceDevice.mac,\n })),\n scheduling: 'Not set',\n callingLicense: firstDirectoryNumber,\n provisioningType: 'On-premises',\n status: toStatus(device.provisioningStatus),\n statusLabel: device.provisioningStatus || 'Status unavailable',\n device,\n isHybrid: false,\n cucmDeviceName: isCucm ? (device.name || null) : null,\n };\n}\n\nfunction mergeDevices(a: Workspace['device'], b: Workspace['device']): Workspace['device'] {\n return {\n ...a,\n ...b,\n cucmId: b.cucmId ?? a.cucmId,\n webexUUID: b.webexUUID ?? a.webexUUID,\n };\n}\n\nfunction mergeWorkspacesByDeviceName(workspaces: Workspace[]): Workspace[] {\n const merged = new Map<string, Workspace>();\n\n for (const workspace of workspaces) {\n const key = withoutSep(workspace.device.name);\n const existing = merged.get(key);\n merged.set(key, existing ? {\n ...existing,\n ...workspace,\n device: mergeDevices(existing.device, workspace.device),\n isHybrid: true,\n cucmDeviceName: existing.cucmDeviceName ?? workspace.cucmDeviceName,\n } : workspace);\n }\n\n return Array.from(merged.values());\n}\n\nconst FETCH_ALL_SIZE = 9999;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WorkspacesService {\n constructor(private apiService: APIService) { }\n\n fetchWorkspaces(customerId: string | number): Observable<WorkspacesPage> {\n const baseParams: Record<string, string> = {\n type: 'ORPHAN_DEVICE',\n customerid: customerId.toString(),\n size: FETCH_ALL_SIZE.toString(),\n page: '0',\n };\n\n const cucm$ = this.apiService.fetch(API.WORKSPACES.GET_ALL, {\n ...baseParams,\n 'device-name': 'SEP',\n provisionType: 'CUCM',\n });\n\n const webex$ = this.apiService.fetch(API.WORKSPACES.GET_ALL, {\n ...baseParams,\n provisionType: 'WEBEX',\n });\n\n return forkJoin([cucm$, webex$]).pipe(\n map(([cucmResponse, webexResponse]) => {\n const cucmParsed = parseResponse(cucmResponse) as WorkspacesResponse;\n const webexParsed = parseResponse(webexResponse) as WorkspacesResponse;\n const cucmWorkspaces = (cucmParsed?.pageData || []).map((item, index) => toWorkspace(item, index, true));\n const webexWorkspaces = (webexParsed?.pageData || []).map((item, index) => toWorkspace(item, index, false));\n const workspaces = mergeWorkspacesByDeviceName([...cucmWorkspaces, ...webexWorkspaces]);\n\n return {\n workspaces,\n total: workspaces.length,\n };\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { API } from '../app.constants';\nimport { WorkspaceDeviceRecord } from '../types/workspace';\nimport { ApiWebexService } from './api-webex.service';\n\nexport type FirmwareDeviceMap = Record<number, Record<string, string[]>>;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkspacesMigrationService {\n constructor(private apiWebexService: ApiWebexService) { }\n\n moveToMT(customerId: string | number, device: WorkspaceDeviceRecord): Observable<any> {\n return this.apiWebexService.post(API.MIGRATION.MOVE, this.getMoveBody(customerId, device));\n }\n\n getMigrationFormStatus(customerId: string | number, formId: number): Observable<any> {\n const url = API.MIGRATION.MIGRATION_FORM\n .replace(':customerId', String(customerId))\n .replace(':formId', String(formId));\n return this.apiWebexService.fetch(url);\n }\n\n getMigratedMigrationFormEntities(\n customerId: string | number,\n webexUUID: string,\n feature = 'ORPHANED_DEVICE',\n ): Observable<any> {\n const url = API.MIGRATION.MIGRATION_FORM_ENTITIES_MIGRATED.replace(':customerId', String(customerId));\n return this.apiWebexService.fetch(url, { webexUUID, feature });\n }\n\n triggerFirmwareUpgrade(\n customerId: string | number,\n migrationFormId: number,\n deviceMap: FirmwareDeviceMap,\n ): Observable<any> {\n const url = API.MIGRATION.TRIGGER_FIRMWARE_MIGRATION\n .replace(':migrationType', 'WEBEX')\n .replace(':customerId', String(customerId))\n .replace(':migrationFormId', String(migrationFormId));\n return this.apiWebexService.post(url, deviceMap);\n }\n\n removeUcmLicense(\n customerId: string | number,\n migrationFormId: number,\n controlHubType = 'WEBEX',\n ): Observable<any> {\n const url = API.MIGRATION.REMOVE_UCM_LICENSE\n .replace(':controlHubType', controlHubType)\n .replace(':customerId', String(customerId))\n .replace(':migrationFormId', String(migrationFormId));\n return this.apiWebexService.post(url, {});\n }\n\n revertMigration(customerId: string | number, personId: string): Observable<any> {\n const url = API.MIGRATION.WEBEX_REVERT\n .replace(':customerId', String(customerId))\n .replace(':personId', personId);\n return this.apiWebexService.post(url, {});\n }\n\n private getMoveBody(customerId: string | number, device: WorkspaceDeviceRecord): any {\n return {\n customerId,\n entities: {\n ORPHANED_DEVICE: [{ cucmId: device.cucmId, entityId: device.name }],\n },\n };\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'tk-workspaces-filters',\n templateUrl: './workspaces-filters.component.html',\n styleUrls: ['./workspaces-filters.component.scss'],\n})\nexport class WorkspacesFiltersComponent {\n @Input() resultCount = 0;\n @Input() typeOptions: string[] = [];\n @Input() locationOptions: string[] = [];\n\n @Output() searchChange = new EventEmitter<string>();\n @Output() typeChange = new EventEmitter<string>();\n @Output() locationChange = new EventEmitter<string>();\n @Output() addWorkspace = new EventEmitter<void>();\n\n searchTerm = '';\n selectedType = '';\n selectedLocation = '';\n\n onSearchInputChange(event: Event): void {\n this.searchTerm = (event.target as HTMLInputElement).value;\n this.searchChange.emit(this.searchTerm);\n }\n\n onTypeChange(value: string): void {\n this.selectedType = value;\n this.typeChange.emit(value);\n }\n\n onLocationChange(value: string): void {\n this.selectedLocation = value;\n this.locationChange.emit(value);\n }\n\n onAddWorkspace(): void {\n this.addWorkspace.emit();\n }\n}\n","<div class=\"tk-workspaces-filters\">\n <div class=\"tk-workspaces-filters__search\">\n <input\n class=\"tk-workspaces-filters__search-input blue-input\"\n type=\"text\"\n placeholder=\"Search\"\n [value]=\"searchTerm\"\n (input)=\"onSearchInputChange($event)\"\n />\n <mat-icon class=\"tk-workspaces-filters__search-icon\">search</mat-icon>\n </div>\n\n <div class=\"tk-workspaces-filters__filters\">\n <span class=\"tk-workspaces-filters__filters-label\">Filters:</span>\n\n <div class=\"tk-workspaces-filters__select-wrap\">\n <select\n class=\"tk-workspaces-filters__select\"\n [ngModel]=\"selectedType\"\n (ngModelChange)=\"onTypeChange($event)\">\n <option value=\"\">General</option>\n <option *ngFor=\"let type of typeOptions\" [value]=\"type\">{{ type }}</option>\n </select>\n <mat-icon class=\"tk-workspaces-filters__select-icon\">expand_more</mat-icon>\n </div>\n\n <div class=\"tk-workspaces-filters__select-wrap\">\n <select\n class=\"tk-workspaces-filters__select\"\n [ngModel]=\"selectedLocation\"\n (ngModelChange)=\"onLocationChange($event)\">\n <option value=\"\">Location</option>\n <option *ngFor=\"let location of locationOptions\" [value]=\"location\">{{ location }}</option>\n </select>\n <mat-icon class=\"tk-workspaces-filters__select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <span class=\"tk-workspaces-filters__count\">{{ resultCount }} workspace{{ resultCount === 1 ? '' : 's' }} in total</span>\n\n <button type=\"button\" class=\"tk-workspaces-filters__add-button\" [matMenuTriggerFor]=\"addMenu\">\n Add workspace\n <mat-icon class=\"tk-workspaces-filters__add-icon\">expand_more</mat-icon>\n </button>\n\n <mat-menu #addMenu=\"matMenu\">\n <button type=\"button\" mat-menu-item (click)=\"onAddWorkspace()\">Add workspace</button>\n <button type=\"button\" mat-menu-item disabled>Import workspaces</button>\n </mat-menu>\n</div>\n","const DEFAULT_DEVICE_ICON = 'assets/icons/cisco_8851.png';\n\nconst DEVICE_MODEL_ICONS: Record<string, string> = {\n 'cisco 8851': 'assets/icons/cisco_8851.png',\n 'cisco 8845': 'assets/icons/cisco_8845.png',\n 'cisco 9841': 'assets/icons/cisco_9841.png',\n};\n\nexport function getDeviceIcon(model?: string): string {\n if (!model) {\n return DEFAULT_DEVICE_ICON;\n }\n return DEVICE_MODEL_ICONS[model.trim().toLowerCase()] ?? DEFAULT_DEVICE_ICON;\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { PageEvent } from '@angular/material/paginator';\nimport { Workspace, WorkspaceConnectionType, WorkspaceOpenEvent } from '../../types/workspace';\nimport { getDeviceIcon as resolveDeviceIcon } from '../../utils/device-icon';\nimport { withoutSep } from '../../utils/workspace-name';\n\nexport interface WorkspacesPageChange {\n pageIndex: number;\n pageSize: number;\n}\n\n@Component({\n selector: 'tk-workspaces-table',\n templateUrl: './workspaces-table.component.html',\n styleUrls: ['./workspaces-table.component.scss'],\n})\nexport class WorkspacesTableComponent {\n @Input() workspaces: Workspace[] = [];\n @Input() total = 0;\n @Input() pageIndex = 0;\n @Input() pageSize = 10;\n @Input() pageSizeOptions: number[] = [10, 25, 50, 100];\n @Input() pendingWorkspaceIds: Set<string> = new Set();\n\n @Output() openWorkspace = new EventEmitter<WorkspaceOpenEvent>();\n @Output() licenseWithHybrid = new EventEmitter<Workspace>();\n @Output() migrateToMT = new EventEmitter<Workspace>();\n @Output() enableWebexCalling = new EventEmitter<Workspace>();\n @Output() migrateToUCM = new EventEmitter<Workspace>();\n @Output() addDevice = new EventEmitter<string>();\n @Output() pageChange = new EventEmitter<WorkspacesPageChange>();\n\n selectedIds = new Set<string>();\n\n get allSelected(): boolean {\n return this.workspaces.length > 0 && this.selectedIds.size === this.workspaces.length;\n }\n\n get someSelected(): boolean {\n return this.selectedIds.size > 0 && !this.allSelected;\n }\n\n toggleAll(): void {\n this.selectedIds = this.allSelected ? new Set() : new Set(this.workspaces.map(workspace => workspace.id));\n }\n\n toggleRow(workspaceId: string): void {\n const nextSelection = new Set(this.selectedIds);\n if (nextSelection.has(workspaceId)) {\n nextSelection.delete(workspaceId);\n } else {\n nextSelection.add(workspaceId);\n }\n this.selectedIds = nextSelection;\n }\n\n isSelected(workspaceId: string): boolean {\n return this.selectedIds.has(workspaceId);\n }\n\n onOpenWorkspace(workspace: Workspace, connectionType?: WorkspaceConnectionType): void {\n if (!this.canOpenWorkspace(workspace)) {\n return;\n }\n this.openWorkspace.emit({ id: workspace.id, connectionType: connectionType ?? this.resolveConnectionType(workspace) });\n }\n\n canOpenWorkspace(workspace: Workspace): boolean {\n return !!workspace.location;\n }\n\n private resolveConnectionType(workspace: Workspace): WorkspaceConnectionType {\n return !workspace.isHybrid && workspace.device.webexUUID != null ? 'webex' : 'di';\n }\n\n onAddDevice(workspace: Workspace, event: Event): void {\n event.stopPropagation();\n this.addDevice.emit(workspace.id);\n }\n\n onPage(event: PageEvent): void {\n this.selectedIds = new Set();\n this.pageChange.emit({ pageIndex: event.pageIndex, pageSize: event.pageSize });\n }\n\n getDeviceIcon(model?: string): string {\n return resolveDeviceIcon(model);\n }\n\n onCopyMac(mac: string): void {\n navigator.clipboard?.writeText(mac);\n }\n\n getDisplayName(workspace: Workspace): string {\n return withoutSep(workspace.displayName);\n }\n\n isPending(workspaceId: string): boolean {\n return this.pendingWorkspaceIds.has(workspaceId);\n }\n\n isMoveToMTDisabled(workspace: Workspace): boolean {\n if (workspace.status !== 'active') {\n return true;\n }\n return !workspace.isHybrid && !!workspace.device.webexUUID;\n }\n\n isEnableWebexCallingDisabled(workspace: Workspace): boolean {\n if (workspace.status !== 'inactive') {\n return true;\n }\n return !workspace.isHybrid && !workspace.device.webexUUID;\n }\n\n isMigrateToUCMDisabled(workspace: Workspace): boolean {\n return !workspace.device.webexUUID || workspace.status !== 'active';\n }\n}\n","<div class=\"tk-workspaces-table__bulk-bar\">Select one or more workspaces for bulk actions</div>\n\n<div class=\"tk-workspaces-table__wrapper\">\n <table class=\"tk-workspaces-table__table\">\n <thead>\n <tr>\n <th class=\"tk-workspaces-table__checkbox-cell\">\n <input type=\"checkbox\" [checked]=\"allSelected\" [indeterminate]=\"someSelected\" (change)=\"toggleAll()\" />\n </th>\n <th>Name</th>\n <th>Devices</th>\n <th>Scheduling</th>\n <th>Calling</th>\n <th>Provisioning Type</th>\n <th>Status</th>\n <th class=\"tk-workspaces-table__settings-cell\">\n <mat-icon class=\"tk-workspaces-table__settings-icon\">settings</mat-icon>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let workspace of workspaces\"\n [class.tk-workspaces-table__row--selected]=\"isSelected(workspace.id)\"\n [class.tk-workspaces-table__row--disabled]=\"!canOpenWorkspace(workspace)\">\n <td class=\"tk-workspaces-table__checkbox-cell\">\n <input type=\"checkbox\" [checked]=\"isSelected(workspace.id)\" (change)=\"toggleRow(workspace.id)\" />\n </td>\n <td class=\"tk-workspaces-table__name-cell\" (click)=\"onOpenWorkspace(workspace)\">\n <div class=\"tk-workspaces-table__name-wrapper\">\n <span class=\"tk-workspaces-table__name-icon\">\n <img src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\n </span>\n <div class=\"tk-workspaces-table__name-info\">\n <a href=\"javascript:void(0)\" class=\"tk-workspaces-table__name-link\">{{ getDisplayName(workspace) }}</a>\n <div class=\"tk-workspaces-table__name-meta\">\n <span class=\"tk-workspaces-table__name-type\">{{ workspace.typeLabel }}</span>\n <span class=\"tk-workspaces-table__meta-sep\">·</span>\n <img class=\"tk-workspaces-table__meta-icon\" src=\"assets/icons/people-regular.svg\" alt=\"\" />\n <span class=\"tk-workspaces-table__name-capacity\">{{ workspace.capacity ?? 'No capacity' }}</span>\n <span class=\"tk-workspaces-table__meta-sep\">·</span>\n <!-- <mat-icon class=\"tk-workspaces-table__meta-icon\">location_on</mat-icon> -->\n <img class=\"tk-workspaces-table__meta-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\n <a\n *ngIf=\"workspace.location; else noLocation\"\n href=\"javascript:void(0)\"\n class=\"tk-workspaces-table__location-link\">{{ workspace.location }}</a>\n <ng-template #noLocation>\n <span class=\"tk-workspaces-table__location-empty\">No location</span>\n </ng-template>\n </div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"tk-workspaces-table__devices\">\n <ng-container *ngIf=\"workspace.devices.length; else noDevices\">\n <span *ngFor=\"let device of workspace.devices\" class=\"tk-workspaces-table__device-card\">\n <img\n class=\"tk-workspaces-table__device-icon\"\n [src]=\"getDeviceIcon(device.model)\"\n [alt]=\"device.label\" />\n <div class=\"tk-workspaces-table__device-tooltip\" (click)=\"$event.stopPropagation()\">\n <div class=\"tk-workspaces-table__device-tooltip-title\">{{ device.label }}</div>\n <div class=\"tk-workspaces-table__device-tooltip-status\">\n <span\n class=\"tk-workspaces-table__device-tooltip-status-dot\"\n [class.tk-workspaces-table__device-tooltip-status-dot--active]=\"workspace.status === 'active'\"></span>\n {{ workspace.statusLabel }}\n </div>\n <div class=\"tk-workspaces-table__device-tooltip-divider\"></div>\n <div class=\"tk-workspaces-table__device-tooltip-mac\">\n <span class=\"tk-workspaces-table__device-tooltip-mac-label\">MAC address</span>\n <span class=\"tk-workspaces-table__device-tooltip-mac-value\">{{ device.mac }}</span>\n <button\n *ngIf=\"device.mac\"\n type=\"button\"\n class=\"tk-workspaces-table__device-tooltip-copy\"\n (click)=\"onCopyMac(device.mac)\">\n <img class=\"tk-workspaces-table__device-tooltip-copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\n </button>\n </div>\n </div>\n </span>\n </ng-container>\n <!-- <ng-container *ngFor=\"let device of workspace.devices\">\n <span *ngIf=\"device && device.model else noDevice\" class=\"tk-workspaces-table__device-card\" [title]=\"device.label\">\n <img\n class=\"tk-workspaces-table__device-icon\"\n [src]=\"getDeviceIcon(device.model)\"\n [alt]=\"device.label\" />\n </span>\n </ng-container> -->\n <ng-template #noDevices>\n <button\n type=\"button\"\n class=\"tk-workspaces-table__device-add\"\n (click)=\"onAddDevice(workspace, $event)\">\n <span class=\"tk-workspaces-table__device-add-label\">\n <img\n class=\"tk-workspaces-table__device-add-icon\"\n src=\"assets/icons/multipled-devices-regular.svg\"\n alt=\"\" />\n Add device\n </span>\n </button>\n </ng-template>\n </div>\n </td>\n <td>{{ workspace.scheduling }}</td>\n <td class=\"tk-workspaces-table__calling-cell\">\n <span class=\"tk-workspaces-table__calling-content\">\n <img class=\"tk-workspaces-table__calling-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\n <span class=\"tk-workspaces-table__calling-text\" title=\"Cisco Webex Calling Professional Workspace\">Cisco Webex Calling Professional Workspace</span>\n </span>\n </td>\n <td>\n <div *ngIf=\"workspace.isHybrid\" class=\"tk-workspaces-table__provisioning-icons\">\n <span class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'webex'); $event.stopPropagation()\"\n ><img\n src=\"assets/icons/webex.svg\"\n [matTooltip]=\"'Webex Calling'\"\n matTooltipPosition=\"right\"\n width=\"20\"\n alt=\"\"\n /></span>\n <span class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'di'); $event.stopPropagation()\"\n ><img\n src=\"assets/icons/di_cloud_24.svg\"\n [matTooltip]=\"'Webex Calling DI'\"\n matTooltipPosition=\"right\"\n width=\"20\"\n alt=\"\"\n /></span>\n </div>\n <ng-container *ngIf=\"!workspace.isHybrid\">\n <span *ngIf=\"workspace.device.cucmId != null\" class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'di'); $event.stopPropagation()\"\n ><img\n src=\"assets/icons/di_cloud_24.svg\"\n [matTooltip]=\"'Webex Calling DI'\"\n matTooltipPosition=\"right\"\n width=\"20\"\n alt=\"\"\n /></span>\n <span *ngIf=\"workspace.device.webexUUID != null\" class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'webex'); $event.stopPropagation()\"\n ><img\n src=\"assets/icons/webex.svg\"\n [matTooltip]=\"'Webex Calling'\"\n matTooltipPosition=\"right\"\n width=\"20\"\n alt=\"\"\n /></span>\n </ng-container>\n </td>\n <td>\n <span class=\"tk-workspaces-table__status\">\n <span\n class=\"tk-workspaces-table__status-dot\"\n [class.tk-workspaces-table__status-dot--hybrid]=\"workspace.isHybrid\"\n [class.tk-workspaces-table__status-dot--active]=\"!workspace.isHybrid\"></span>\n {{ workspace.isHybrid ? 'Hybrid' : 'Active' }}\n </span>\n </td>\n <td class=\"tk-workspaces-table__actions-cell\">\n <mat-progress-spinner\n *ngIf=\"isPending(workspace.id)\"\n class=\"tk-workspaces-table__actions-spinner\"\n [diameter]=\"20\"\n strokeWidth=\"2\"\n mode=\"indeterminate\">\n </mat-progress-spinner>\n <button\n *ngIf=\"!isPending(workspace.id)\"\n type=\"button\"\n class=\"tk-workspaces-table__actions-button\"\n [matMenuTriggerFor]=\"rowMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\">\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isMoveToMTDisabled(workspace)\"\n (click)=\"licenseWithHybrid.emit(workspace)\">\n License with Cloud Intelligence\n </button>\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isMoveToMTDisabled(workspace)\"\n (click)=\"migrateToMT.emit(workspace)\">\n Migrate Workspace To Webex Calling\n </button>\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isEnableWebexCallingDisabled(workspace)\"\n (click)=\"enableWebexCalling.emit(workspace)\">\n Enable Webex Calling\n </button>\n <button\n type=\"button\"\n mat-menu-item\n [disabled]=\"isMigrateToUCMDisabled(workspace)\"\n (click)=\"migrateToUCM.emit(workspace)\">\n Migrate User to UCM\n </button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!workspaces.length\">\n <td [attr.colspan]=\"8\" class=\"tk-workspaces-table__empty\">No workspaces to display.</td>\n </tr>\n </tbody>\n </table>\n</div>\n\n<mat-paginator\n class=\"tk-workspaces-table__paginator\"\n [length]=\"total\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPage($event)\">\n</mat-paginator>\n","import { Injectable } from '@angular/core';\nimport { forkJoin, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { ApiWebexService } from './api-webex.service';\nimport { APIService } from './api.service';\nimport {\n CucmSiteResponse,\n CucmWorkspaceDetailsResponse,\n WebexCallerIdResponse,\n WebexNumbersResponse,\n WebexWorkspaceDetailsResponse,\n Workspace,\n WorkspaceConnectionType,\n WorkspaceDetails,\n WorkspaceDeviceDetails,\n WorkspaceIssue,\n} from '../types/workspace';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WorkspaceDetailService {\n constructor(\n private apiService: APIService,\n private apiWebexService: ApiWebexService,\n ) { }\n\n getByWorkspace(\n workspace: Workspace,\n connectionType: WorkspaceConnectionType,\n customerId: string | number,\n ): Observable<WorkspaceDetails> {\n if (connectionType === 'webex' && workspace.device.webexUUID) {\n return this.getWebexDetails(customerId, workspace.device.webexUUID);\n }\n return this.getCucmDetails(workspace);\n }\n\n private getWebexDetails(customerId: string | number, workspaceId: string): Observable<WorkspaceDetails> {\n const params = { customerId: String(customerId), workspaceId };\n\n return forkJoin([\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.WORKSPACE, params)),\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.NUMBERS, params)),\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.CALLERID, params)),\n ]).pipe(\n map(([workspaceRes, numbersRes, callerIdRes]: [\n WebexWorkspaceDetailsResponse,\n WebexNumbersResponse,\n WebexCallerIdResponse,\n ]) => this.toWebexDetails(workspaceRes, numbersRes, callerIdRes)),\n );\n }\n\n private toWebexDetails(\n workspaceRes: WebexWorkspaceDetailsResponse,\n numbersRes: WebexNumbersResponse,\n callerIdRes: WebexCallerIdResponse,\n ): WorkspaceDetails {\n const primaryNumber = numbersRes.phoneNumbers?.find(number => number.primary) ?? numbersRes.phoneNumbers?.[0];\n\n return {\n issues: this.buildIssues(workspaceRes.type, workspaceRes.capacity),\n location: {\n country: numbersRes.location?.name || workspaceRes.locationName || 'Not set',\n address: numbersRes.location?.address || 'Address not available',\n },\n calling: {\n license: workspaceRes.licenseName || 'Not set',\n sipAddress: workspaceRes.sipAddress || 'Not assigned',\n directoryNumber: primaryNumber?.external || primaryNumber?.extension || 'Not assigned',\n extension: primaryNumber?.extension || undefined,\n routePartition: '',\n callingSearchSpace: '',\n securityProfile: '',\n externalCallerIdName: callerIdRes.locationExternalCallerIdName || callerIdRes.customExternalCallerIdName || undefined,\n externalCallerIdNumber: callerIdRes.locationNumber || callerIdRes.customNumber || callerIdRes.directNumber || undefined,\n },\n schedulingConfigured: false,\n plannedMaintenanceEnabled: false,\n notes: null,\n capacity: workspaceRes.capacity,\n device: this.buildWebexDeviceDetails(workspaceRes, numbersRes),\n };\n }\n\n private buildWebexDeviceDetails(\n workspaceRes: WebexWorkspaceDetailsResponse,\n numbersRes: WebexNumbersResponse,\n ): WorkspaceDeviceDetails {\n const device = workspaceRes.devices?.[0];\n const primaryNumber = numbersRes.phoneNumbers?.find(number => number.primary) ?? numbersRes.phoneNumbers?.[0];\n\n return {\n model: device?.model || 'Unknown device',\n registrationStatus: device?.registered ? 'Registered' : 'Not Registered',\n mac: device?.mac || 'N/A',\n lineCount: numbersRes.phoneNumbers?.length ?? null,\n hostIpAddress: 'N/A',\n remoteIpAddress: 'N/A',\n managedBy: 'Cisco',\n softwareChannel: 'Unknown',\n softwareVersion: 'N/A',\n lines: primaryNumber ? [{\n name: workspaceRes.workspaceName || '',\n number: primaryNumber.external || primaryNumber.extension || 'NA',\n registered: !!device?.registered,\n }] : [],\n };\n }\n\n private getCucmDetails(workspace: Workspace): Observable<WorkspaceDetails> {\n const siteId = String(workspace.siteId);\n const params = { siteId, workspaceId: workspace.cucmDeviceName ?? workspace.device.name };\n\n return forkJoin([\n this.apiService.fetch(this.buildUrl(API.DETAILS.CUCM.WORKSPACE, params)),\n this.apiService.fetch(this.buildUrl(API.DETAILS.CUCM.SITE, { siteId })),\n ]).pipe(\n map(([workspaceRes, siteRes]: [CucmWorkspaceDetailsResponse, CucmSiteResponse]) =>\n this.toCucmDetails(workspace, workspaceRes, siteRes)),\n );\n }\n\n private toCucmDetails(\n workspace: Workspace,\n workspaceRes: CucmWorkspaceDetailsResponse,\n siteRes: CucmSiteResponse,\n ): WorkspaceDetails {\n const device = workspaceRes.device;\n const directoryNumber = device.associatedDNs?.[0]?.directoryNumber ?? '';\n const sipAddress = `${(device.name || workspace.displayName || 'workspace').toLowerCase()}@tukidev.rooms.webex.com`;\n const address = [siteRes.address2, siteRes.address3].filter(Boolean).join(', ');\n\n return {\n issues: this.buildIssues(workspace.typeLabel, workspace.capacity),\n location: {\n country: siteRes.country || 'Not set',\n address: address || 'Address not available',\n },\n calling: {\n license: workspace.callingLicense || 'Cisco Webex Calling Professional Workspace',\n sipAddress,\n directoryNumber: directoryNumber || 'Not assigned',\n routePartition: device.associatedDNs?.[0]?.routePartitionName || 'Not set',\n callingSearchSpace: device.callingSearchSpaceName || 'Not set',\n securityProfile: device.securityProfile || 'Not set',\n },\n schedulingConfigured: false,\n plannedMaintenanceEnabled: false,\n notes: null,\n device: this.buildCucmDeviceDetails(workspaceRes),\n };\n }\n\n private buildCucmDeviceDetails(workspaceRes: CucmWorkspaceDetailsResponse): WorkspaceDeviceDetails {\n const device = workspaceRes.device;\n const isRegistered = (device.deviceRegStatus || '').toLowerCase() === 'registered';\n\n return {\n model: device.deviceType || 'Unknown device',\n registrationStatus: device.deviceRegStatus || 'Not Registered',\n mac: workspaceRes.workspaceDevices?.[0]?.mac || 'N/A',\n lineCount: workspaceRes.lines?.length ?? null,\n hostIpAddress: device.ipAddress || 'N/A',\n remoteIpAddress: 'N/A',\n managedBy: 'Cisco',\n softwareChannel: 'Unknown',\n softwareVersion: device.firmwareVersion || 'N/A',\n lines: (workspaceRes.lines || []).map(line => ({\n name: line.alertingName || line.description || '',\n number: line.directoryNumber?.directoryNumber || 'NA',\n registered: isRegistered,\n })),\n };\n }\n\n private buildUrl(template: string, params: Record<string, string>): string {\n return Object.keys(params).reduce((url, key) => url.replace(`:${key}`, params[key]), template);\n }\n\n private buildIssues(typeLabel: string | null | undefined, capacity: number | null | undefined): WorkspaceIssue[] {\n const timestamp = this.formatTimestamp(new Date());\n\n return [\n !typeLabel || typeLabel === 'No type' || typeLabel.toLowerCase() === 'notset' ? {\n id: 'type',\n message: 'Workspace type not set',\n timestamp,\n actionLabel: 'Assign type',\n description: 'Adding a type specifies what the workspace is used for.',\n suggestedAction: 'Set a type for this workspace.',\n } : null,\n capacity == null ? {\n id: 'capacity',\n message: 'Workspace capacity not set',\n timestamp,\n actionLabel: 'Set capacity',\n description: 'Adding a capacity specifies how many people can use this workspace.',\n suggestedAction: 'Set a capacity for this workspace.',\n } : null,\n ].filter((issue): issue is NonNullable<typeof issue> => issue !== null);\n }\n\n private formatTimestamp(date: Date): string {\n return date.toLocaleString('en-US', {\n year: '2-digit',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n }\n}\n","import { Component, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './app-loader.component.html',\n styleUrls: ['./app-loader.component.scss'],\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppLoaderComponent {\n constructor() {\n }\n\n}\n","<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","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Workspace, WorkspaceDevice, WorkspaceDeviceDetails } from '../../types/workspace';\nimport { getDeviceIcon } from '../../utils/device-icon';\n\n@Component({\n selector: 'tk-workspace-device-detail',\n templateUrl: './workspace-device-detail.component.html',\n styleUrls: ['./workspace-device-detail.component.scss'],\n})\nexport class WorkspaceDeviceDetailComponent {\n @Input() workspace!: Workspace;\n @Input() device: WorkspaceDevice | null = null;\n @Input() details: WorkspaceDeviceDetails | null = null;\n @Input() isLoading = false;\n\n @Output() back = new EventEmitter<void>();\n\n tags: string[] = [];\n isAddingTag = false;\n newTag = '';\n hotelingEnabled = false;\n guestHoursLimit = 0;\n readonly hotelingTimeHours = Array.from({ length: 24 }, (_, index) => index);\n\n get deviceLabel(): string {\n return this.details?.model || this.device?.label || 'Device';\n }\n\n get deviceIcon(): string {\n return getDeviceIcon(this.details?.model || this.device?.model);\n }\n\n get isRegistered(): boolean {\n return (this.details?.registrationStatus || '').toLowerCase() === 'registered';\n }\n\n onBack(): void {\n this.back.emit();\n }\n\n showTagInput(): void {\n this.isAddingTag = true;\n }\n\n onTagInputBlur(): void {\n const value = this.newTag.trim();\n if (value) {\n this.tags.push(value);\n }\n this.newTag = '';\n this.isAddingTag = false;\n }\n\n removeTag(index: number): void {\n this.tags.splice(index, 1);\n }\n}\n","<button type=\"button\" class=\"tk-workspace-device-detail__breadcrumb\" (click)=\"onBack()\">\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-left-bold.svg\" alt=\"Back\" />\n Devices\n</button>\n\n<app-loader *ngIf=\"isLoading\"></app-loader>\n\n<ng-container *ngIf=\"!isLoading\">\n <div class=\"tk-workspace-device-detail__header\">\n <img class=\"tk-workspace-device-detail__icon\" [src]=\"deviceIcon\" [alt]=\"deviceLabel\" />\n <div class=\"tk-workspace-device-detail__title-block\">\n <h1 class=\"tk-workspace-device-detail__name\">{{ deviceLabel }}</h1>\n <div class=\"tk-workspace-device-detail__meta\">\n <span class=\"tk-workspace-device-detail__meta-pill\">\n <span class=\"tk-workspace-device-detail__status-dot\" [class.tk-workspace-device-detail__status-dot--active]=\"isRegistered\"></span>\n {{ details?.registrationStatus || 'Not Registered' }}\n </span>\n <span class=\"tk-workspace-device-detail__meta-sep\"></span>\n <span>Phones</span>\n </div>\n </div>\n <button type=\"button\" class=\"tk-workspace-device-detail__actions-button\" [matMenuTriggerFor]=\"actionsMenu\">\n Actions\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\n </button>\n <mat-menu #actionsMenu=\"matMenu\">\n <button type=\"button\" mat-menu-item disabled>More actions coming soon</button>\n </mat-menu>\n <a href=\"javascript:void(0)\" class=\"tk-workspace-device-detail__workspace-link\">{{ workspace?.displayName }}</a>\n </div>\n\n <div class=\"tk-workspace-device-detail__grid\">\n <div class=\"tk-workspace-device-detail__col\">\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Details</h2>\n <div class=\"tk-workspace-device-detail__row\">\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.lineCount ?? 'N/A' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Lines</span>\n </div>\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.mac || 'N/A' }}</span>\n <span class=\"tk-workspace-device-detail__label\">MAC address</span>\n </div>\n </div>\n <hr class=\"tk-workspace-device-detail__divider\" />\n <div class=\"tk-workspace-device-detail__row\">\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.hostIpAddress || 'N/A' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Host IP address</span>\n </div>\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.remoteIpAddress || 'N/A' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Remote IP address</span>\n </div>\n </div>\n <hr class=\"tk-workspace-device-detail__divider\" />\n <div class=\"tk-workspace-device-detail__row\">\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.managedBy || 'Cisco' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Managed By</span>\n </div>\n </div>\n </section>\n\n <section class=\"tk-workspace-device-detail__card\">\n <div class=\"tk-workspace-device-detail__card-header\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Software</h2>\n <div class=\"tk-workspace-device-detail__settings-icon-wrapper\">\n <img class=\"tk-workspace-device-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\n </div>\n </div>\n <div class=\"tk-workspace-device-detail__row\">\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.softwareChannel || 'Unknown' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Software Channel</span>\n </div>\n <div class=\"tk-workspace-device-detail__row-half\">\n <span class=\"tk-workspace-device-detail__value\">{{ details?.softwareVersion || 'N/A' }}</span>\n <span class=\"tk-workspace-device-detail__label\">Software version</span>\n </div>\n </div>\n </section>\n\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Tags</h2>\n <div class=\"tk-workspace-device-detail__tags\">\n <div *ngFor=\"let tag of tags; let i = index\" class=\"tk-workspace-device-detail__tag\">\n <span>{{ tag }}</span>\n <mat-icon class=\"tk-workspace-device-detail__tag-remove\" (click)=\"removeTag(i)\">close</mat-icon>\n </div>\n <button type=\"button\" class=\"tk-workspace-device-detail__tag tk-workspace-device-detail__tag--add\" (click)=\"showTagInput()\">\n <mat-icon class=\"tk-workspace-device-detail__tag-add-icon\">add</mat-icon>\n Add tag\n </button>\n <input\n *ngIf=\"isAddingTag\"\n class=\"tk-workspace-device-detail__tag-input\"\n type=\"text\"\n placeholder=\"Enter tag...\"\n [(ngModel)]=\"newTag\"\n (blur)=\"onTagInputBlur()\" />\n </div>\n </section>\n </div>\n\n <div class=\"tk-workspace-device-detail__col\">\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Issues & Information</h2>\n <div class=\"tk-workspace-device-detail__no-issues\">\n <mat-icon class=\"tk-workspace-device-detail__no-issues-icon\">check_circle</mat-icon>\n No reported issues at this time\n </div>\n </section>\n\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Hoteling</h2>\n <p class=\"tk-workspace-device-detail__hint\">Allow this device to be used as a Hoteling Host by visiting guests.</p>\n <div class=\"tk-workspace-device-detail__hoteling-toggle-row\">\n <label class=\"tk-workspace-device-detail__toggle\">\n <input type=\"checkbox\" [(ngModel)]=\"hotelingEnabled\" />\n <span class=\"tk-workspace-device-detail__toggle-slider\"></span>\n </label>\n <img\n class=\"tk-workspace-device-detail__meta-icon\"\n src=\"assets/icons/info-circle-regular.svg\"\n alt=\"\"\n matTooltip=\"Enabling this device for Hoteling means that a guest can log into this host and use this phone as if it were their own.\" />\n </div>\n <p class=\"tk-workspace-device-detail__hint\">Limit the time a guest can use this phone to</p>\n <select class=\"tk-workspace-device-detail__select\" [(ngModel)]=\"guestHoursLimit\">\n <option *ngFor=\"let hour of hotelingTimeHours\" [value]=\"hour\">{{ hour }}</option>\n </select>\n </section>\n\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Device Management</h2>\n <p class=\"tk-workspace-device-detail__hint\">The users and workspaces that appear on this device are displayed below in the order of appearance.</p>\n <p class=\"tk-workspace-device-detail__hint\">\n To add and remove users and workspaces, select <b>Configure Lines</b>.<br />\n To customize the programmable Line Keys, select <b>Configure Layout</b>.<br />\n To set up the display settings and dialing options, select <b>Device Settings</b>.\n </p>\n <div class=\"tk-workspace-device-detail__table-wrapper\">\n <table class=\"tk-workspace-device-detail__table\">\n <thead>\n <tr>\n <th>Index #</th>\n <th>Name</th>\n <th>Number/Extension</th>\n <th>Registered</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let line of details?.lines; let i = index\">\n <td>{{ i + 1 }}</td>\n <td>{{ line.name || 'NA' }}</td>\n <td>{{ line.number }}</td>\n <td>\n <span *ngIf=\"line.registered; else notRegistered\" class=\"tk-workspace-device-detail__registered\">Registered</span>\n <ng-template #notRegistered>\n <mat-icon class=\"tk-workspace-device-detail__warning-icon\" matTooltip=\"Unregistered\">warning</mat-icon>\n </ng-template>\n </td>\n </tr>\n <tr *ngIf=\"!details?.lines?.length\">\n <td colspan=\"4\" class=\"tk-workspace-device-detail__table-empty\">No lines configured.</td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"tk-workspace-device-detail__configure-lines\">\n <div class=\"tk-workspace-device-detail__configure-line\">\n <span>Configure Lines</span>\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\n </div>\n <hr class=\"tk-workspace-device-detail__divider\" />\n <div class=\"tk-workspace-device-detail__configure-line\">\n <span>Configure Layout</span>\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\n </div>\n <hr class=\"tk-workspace-device-detail__divider\" />\n <div class=\"tk-workspace-device-detail__configure-line\">\n <span>Device Settings</span>\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\n </div>\n </div>\n </section>\n\n <section class=\"tk-workspace-device-detail__card\">\n <h2 class=\"tk-workspace-device-detail__card-title\">Support</h2>\n <div class=\"tk-workspace-device-detail__configure-lines\">\n <div class=\"tk-workspace-device-detail__configure-line\">\n <span>Meetings & Calls</span>\n <span class=\"tk-workspace-device-detail__configure-manage\">Go to troubleshooting</span>\n </div>\n <hr class=\"tk-workspace-device-detail__divider\" />\n <div class=\"tk-workspace-device-detail__configure-line\">\n <span>Device Logs</span>\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\n </div>\n </div>\n </section>\n </div>\n </div>\n</ng-container>\n","import { Location } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Workspace, WorkspaceConnectionType, WorkspaceDetails, WorkspaceDevice } from '../../types/workspace';\nimport { WorkspaceDetailService } from '../../services/workspace-detail.service';\nimport { getDeviceIcon } from '../../utils/device-icon';\n\nexport type WorkspaceDetailTab = 'overview' | 'calling';\nexport type WorkspaceDetailView = 'overview' | 'device';\n\n@Component({\n selector: 'tk-workspace-detail',\n templateUrl: './workspace-detail.component.html',\n styleUrls: ['./workspace-detail.component.scss'],\n})\nexport class WorkspaceDetailComponent implements OnInit {\n @Input() workspace!: Workspace;\n @Input() connectionType: WorkspaceConnectionType = 'di';\n @Input() customerId!: string;\n\n @Output() back = new EventEmitter<void>();\n\n activeTab: WorkspaceDetailTab = 'overview';\n view: WorkspaceDetailView = 'overview';\n selectedDevice: WorkspaceDevice | null = null;\n details: WorkspaceDetails | null = null;\n isLoading = false;\n expandedIssueId: string | null = null;\n\n constructor(\n private workspaceDetailService: WorkspaceDetailService,\n private location: Location,\n ) { }\n\n ngOnInit(): void {\n this.isLoading = true;\n this.workspaceDetailService.getByWorkspace(this.workspace, this.connectionType, this.customerId).subscribe({\n next: details => {\n this.details = details;\n if (details.capacity != null) {\n this.workspace = { ...this.workspace, capacity: details.capacity };\n }\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n },\n });\n this.updateUrl();\n }\n\n get callerIdLabel(): string {\n const calling = this.details?.calling;\n if (!calling?.externalCallerIdNumber) {\n return 'Not set';\n }\n return calling.externalCallerIdName\n ? `${calling.externalCallerIdName}: ${calling.externalCallerIdNumber}`\n : `Location number: ${calling.externalCallerIdNumber}`;\n }\n\n get deviceName(): string {\n if (this.connectionType === 'webex') {\n return this.workspace.device?.webexUUID || this.workspace.device?.name || this.workspace.id;\n }\n return this.workspace.device?.name || this.workspace.id;\n }\n\n resolveIcon(model?: string): string {\n return getDeviceIcon(model);\n }\n\n toggleIssue(issueId: string): void {\n this.expandedIssueId = this.expandedIssueId === issueId ? null : issueId;\n }\n\n selectTab(tab: WorkspaceDetailTab): void {\n this.activeTab = tab;\n this.updateUrl();\n }\n\n onBack(): void {\n this.location.replaceState('/workspaces');\n this.back.emit();\n }\n\n onOpenDevice(device: WorkspaceDevice): void {\n this.selectedDevice = device;\n this.view = 'device';\n this.location.replaceState(`/workspaces/${this.deviceName}/device`);\n }\n\n onDeviceBack(): void {\n this.view = 'overview';\n this.selectedDevice = null;\n this.updateUrl();\n }\n\n private updateUrl(): void {\n this.location.replaceState(`/workspaces/${this.deviceName}/${this.activeTab}`);\n }\n}\n","<ng-container *ngIf=\"view === 'overview'; else deviceDetailView\">\n<button type=\"button\" class=\"tk-workspace-detail__breadcrumb\" (click)=\"onBack()\">\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-left-bold.svg\" alt=\"Back\" />\n Workspaces\n</button>\n\n<div class=\"tk-workspace-detail__header\">\n <span class=\"tk-workspace-detail__icon\">\n <img src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\n </span>\n <div class=\"tk-workspace-detail__title-block\">\n <h1 class=\"tk-workspace-detail__name\">{{ workspace.displayName }}</h1>\n <div class=\"tk-workspace-detail__meta\">\n <span class=\"tk-workspace-detail__meta-pill\">\n <span class=\"tk-workspace-detail__status-dot\"></span>\n Live status unavailable\n </span>\n <span class=\"tk-workspace-detail__meta-sep\"></span>\n <span class=\"tk-workspace-detail__meta-type\">Type: {{ workspace.typeLabel === 'No type' ? 'Not set' : workspace.typeLabel }}</span>\n <span class=\"tk-workspace-detail__meta-sep\"></span>\n <span class=\"tk-workspace-detail__meta-pill\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/people-regular.svg\" alt=\"\" />\n Capacity: {{ workspace.capacity ?? 'Not set' }}\n </span>\n <span class=\"tk-workspace-detail__meta-sep\"></span>\n <span class=\"tk-workspace-detail__meta-pill tk-workspace-detail__meta-pill--muted\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\n Size not set\n </span>\n </div>\n </div>\n <button type=\"button\" class=\"tk-workspace-detail__actions-button\" [matMenuTriggerFor]=\"actionsMenu\">\n Actions\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\n </button>\n <mat-menu #actionsMenu=\"matMenu\">\n <button type=\"button\" mat-menu-item disabled>More actions coming soon</button>\n </mat-menu>\n</div>\n\n<nav class=\"tk-workspace-detail__tabs\">\n <button\n type=\"button\"\n class=\"tk-workspace-detail__tab\"\n [class.tk-workspace-detail__tab--active]=\"activeTab === 'overview'\"\n (click)=\"selectTab('overview')\">\n Overview\n </button>\n <button\n type=\"button\"\n class=\"tk-workspace-detail__tab\"\n [class.tk-workspace-detail__tab--active]=\"activeTab === 'calling'\"\n (click)=\"selectTab('calling')\">\n Calling\n </button>\n</nav>\n\n<app-loader *ngIf=\"isLoading\"></app-loader>\n\n<ng-container *ngIf=\"details\">\n <div class=\"tk-workspace-detail__grid\" *ngIf=\"activeTab === 'overview'\">\n <div class=\"tk-workspace-detail__col\">\n <section class=\"tk-workspace-detail__card\">\n <h2 class=\"tk-workspace-detail__card-title\">Issues & Information</h2>\n <div class=\"tk-workspace-detail__no-issues\" *ngIf=\"!details.issues.length\">\n <mat-icon class=\"tk-workspace-detail__no-issues-icon\">check_circle</mat-icon>\n There are currently no issues detected in your workspace.\n </div>\n <div class=\"tk-workspace-detail__issue\" *ngFor=\"let issue of details.issues\">\n <div class=\"tk-workspace-detail__issue-row\">\n <div class=\"tk-workspace-detail__issue-info\">\n <div class=\"tk-workspace-detail__issue-message-row\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n <div class=\"tk-workspace-detail__issue-message\">{{ issue.message }}</div>\n </div>\n <div class=\"tk-workspace-detail__issue-timestamp\">{{ issue.timestamp }}</div>\n </div>\n <div class=\"tk-workspace-detail__issue-actions\">\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">{{ issue.actionLabel }}</button>\n <button\n type=\"button\"\n class=\"tk-workspace-detail__issue-toggle\"\n [class.tk-workspace-detail__issue-toggle--open]=\"expandedIssueId === issue.id\"\n [attr.aria-expanded]=\"expandedIssueId === issue.id\"\n (click)=\"'void 0'\">\n <img style=\"width: .75rem; height: .75rem;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\n </button>\n </div>\n </div>\n <div class=\"tk-workspace-detail__issue-details\" *ngIf=\"expandedIssueId === issue.id\">\n <p>{{ issue.description }}</p>\n <p>\n Suggested action:<br />\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__issue-link\">{{ issue.suggestedAction }}</a>\n </p>\n </div>\n </div>\n </section>\n\n <section class=\"tk-workspace-detail__card\">\n <div class=\"tk-workspace-detail__card-header\">\n <h2 class=\"tk-workspace-detail__card-title\">Devices</h2>\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\n </div>\n </div>\n <div class=\"tk-workspace-detail__devices\" *ngIf=\"workspace.devices.length; else noDevices\">\n <div class=\"tk-workspace-detail__device\" *ngFor=\"let device of workspace.devices\">\n <img class=\"tk-workspace-detail__device-icon\" [src]=\"resolveIcon(device.model)\" [alt]=\"device.label\" />\n <div class=\"tk-workspace-detail__device-info\">\n <div style=\"display: flex; gap: 0.5rem; align-items: center;\">\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__device-link\" (click)=\"onOpenDevice(device)\">{{ device.label }}</a>\n <span class=\"tk-workspace-detail__device-primary\">Primary</span>\n </div>\n <div class=\"tk-workspace-detail__device-status\">\n <span class=\"tk-workspace-detail__status-dot\"></span>\n Status unavailable\n <img class=\"tk-workspace-detail__info-icon\" style=\"width: 12px; height: 12px;\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n </div>\n </div>\n </div>\n </div>\n <ng-template #noDevices>\n <div class=\"tk-workspace-detail__no-devices\">\n <img class=\"tk-workspace-detail__no-devices-icon\" src=\"assets/icons/desk-phone-bold.svg\" alt=\"\" />\n <h3 class=\"tk-workspace-detail__card-heading\">Add device</h3>\n <p class=\"tk-workspace-detail__card-text\">Add an IP Phone to collaborate in this workspace.</p>\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Add device</button>\n </div>\n </ng-template>\n </section>\n\n <section class=\"tk-workspace-detail__card\">\n <div class=\"tk-workspace-detail__card-header\">\n <h2 class=\"tk-workspace-detail__card-title\">Calling</h2>\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\n </div>\n </div>\n <div class=\"tk-workspace-detail__calling-license\">\n <img style=\"width: 20px; height: 20px;\" src=\"assets/icons/handset-regular.svg\" alt=\"\" />\n {{ details.calling.license }}\n </div>\n <hr class=\"tk-workspace-detail__divider\" />\n <div class=\"tk-workspace-detail__row tk-workspace-detail__row--kv\">\n <span class=\"tk-workspace-detail__row-label\">Cisco Webex SIP Address</span>\n <span class=\"tk-workspace-detail__row-value\">{{ details.calling.sipAddress }}</span>\n </div>\n </section>\n\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\" *ngIf=\"!details.schedulingConfigured\">\n <div class=\"tk-workspace-detail__card-header\">\n <h2 class=\"tk-workspace-detail__card-title\">Scheduling</h2>\n </div>\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/calendar-month-regular.svg\" alt=\"\" />\n <h3 class=\"tk-workspace-detail__card-heading\">Choose scheduling</h3>\n <p class=\"tk-workspace-detail__card-text\">Choose a calendar service or setup hot-desking for this workspace.</p>\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Choose scheduling</button>\n </section>\n\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\">\n <div class=\"tk-workspace-detail__card-header\">\n <h2 class=\"tk-workspace-detail__card-title\">Meetings</h2>\n </div>\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n <h3 class=\"tk-workspace-detail__card-heading\">Device hosted meetings unavailable</h3>\n <p class=\"tk-workspace-detail__card-text\">Service not supported by Cisco IP phones</p>\n </section>\n\n <section class=\"tk-workspace-detail__card\">\n <h2 class=\"tk-workspace-detail__card-title\">\n Planned Maintenance\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n </h2>\n <div class=\"tk-workspace-detail__row\">\n <img style=\"width: 20px; height: 20px;\" src=\"assets/icons/tools-regular.svg\" alt=\"\">\n <span>{{ details.plannedMaintenanceEnabled ? 'On' : 'Off' }}</span>\n </div>\n <hr class=\"tk-workspace-detail__divider\" />\n <div class=\"tk-workspace-detail__row tk-workspace-detail__row--with-action\">\n <div class=\"tk-workspace-detail__row\" style=\"flex-direction: column; gap: 1rem;\">\n <div style=\"display: flex; gap: 1rem; align-items: center;\">\n <img class=\"tk-workspace-detail__meta-icon\" style=\"width: 20px; height: 20px;\" src=\"assets/icons/calendar-month-regular.svg\" alt=\"\" />\n <div>Schedule</div>\n </div>\n <div class=\"tk-workspace-detail__row-hint\">No schedule set</div>\n </div>\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Edit schedule</button>\n </div>\n </section>\n\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\" *ngIf=\"!details.notes\">\n <div class=\"tk-workspace-detail__card-header\">\n <h2 class=\"tk-workspace-detail__card-title\">Add Notes</h2>\n </div>\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/notes-regular.svg\" alt=\"\" />\n <h3 class=\"tk-workspace-detail__card-heading\">Add notes</h3>\n <p class=\"tk-workspace-detail__card-text\">Write a note about this workspace.</p>\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Add notes</button>\n </section>\n </div>\n\n <div class=\"tk-workspace-detail__col\">\n <section class=\"tk-workspace-detail__card\">\n <div class=\"tk-workspace-detail__card-header\" style=\"margin-bottom: 1.25rem;\">\n <h2 class=\"tk-workspace-detail__card-title\">Location</h2>\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\n </div>\n </div>\n <div class=\"tk-workspace-detail__location\">\n <!-- <mat-icon>location_on</mat-icon> -->\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\n <div style=\"display: flex; flex-direction: column; gap: .25rem;\">\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__location-link\">{{ details.location.country }}</a>\n <div class=\"tk-workspace-detail__location-address\">{{ details.location.address }}</div>\n </div>\n </div>\n </section>\n </div>\n </div>\n\n <div class=\"tk-workspace-detail__col\" *ngIf=\"activeTab === 'calling'\">\n <section class=\"tk-workspace-detail__card tk-workspace-detail__numbers-card\">\n <h2 class=\"tk-workspace-detail__numbers-title\">Numbers</h2>\n\n <div class=\"tk-workspace-detail__numbers-content\">\n <div class=\"tk-workspace-detail__numbers-row\">\n <div class=\"tk-workspace-detail__numbers-row-label\">\n Directory number\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n </div>\n <table class=\"tk-workspace-detail__numbers-table\">\n <thead>\n <tr>\n <th>Type</th>\n <th>Phone Number</th>\n <th>Extension</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td><span class=\"tk-workspace-detail__badge\">Primary</span></td>\n <td>\n {{ details.calling.directoryNumber }}\n <img class=\"tk-workspace-detail__copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\n </td>\n <td>\n {{ details.calling.extension || 'Not set' }}\n <img class=\"tk-workspace-detail__copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\n </td>\n <td class=\"tk-workspace-detail__numbers-chevron-cell\">\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <hr class=\"tk-workspace-detail__divider\" />\n\n <div class=\"tk-workspace-detail__numbers-row\">\n <div class=\"tk-workspace-detail__numbers-row-label\">\n Caller ID\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n </div>\n <div class=\"tk-workspace-detail__numbers-row-value\">\n <span>{{ callerIdLabel }}</span>\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\n </div>\n </div>\n\n <hr class=\"tk-workspace-detail__divider\" />\n\n <div class=\"tk-workspace-detail__numbers-row\">\n <div class=\"tk-workspace-detail__numbers-row-label\">\n Emergency Calling\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\n </div>\n <div class=\"tk-workspace-detail__numbers-row-value\">\n <span>Not set</span>\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\n </div>\n </div>\n </div>\n </section>\n </div>\n</ng-container>\n</ng-container>\n\n<ng-template #deviceDetailView>\n <tk-workspace-device-detail\n [workspace]=\"workspace\"\n [device]=\"selectedDevice\"\n [details]=\"details?.device ?? null\"\n [isLoading]=\"isLoading\"\n (back)=\"onDeviceBack()\">\n </tk-workspace-device-detail>\n</ng-template>\n","import { Location } from '@angular/common';\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { map, Subscription, switchMap, takeWhile, timer } from 'rxjs';\nimport { APIService } from './services/api.service';\nimport { ApiWebexService } from './services/api-webex.service';\nimport { FirmwareDeviceMap, WorkspacesMigrationService } from './services/workspaces-migration.service';\nimport { WorkspacesService } from './services/workspaces.service';\nimport { Workspace, WorkspaceConnectionType, WorkspaceDeviceRecord, WorkspaceOpenEvent } from './types/workspace';\nimport { WorkspaceConfirmDialogComponent } from './components/workspace-confirm-dialog/workspace-confirm-dialog.component';\n\ntype WorkspacesView = 'list' | 'detail';\n\ntype WorkspacesTab = 'workspaces' | 'insights' | 'integrations' | 'settings';\n\ninterface WorkspacesTabDefinition {\n id: WorkspacesTab;\n label: string;\n icon: string;\n}\n\n@Component({\n selector: 'tk-workspaces',\n templateUrl: './workspaces.component.html',\n styleUrls: ['./workspaces.component.scss'],\n})\nexport class WorkspacesComponent implements OnInit, OnDestroy {\n @Input() host!: string;\n @Input() token!: string;\n @Input() customerId!: string;\n\n @Output() addWorkspace = new EventEmitter<void>();\n @Output() openWorkspace = new EventEmitter<string>();\n @Output() addDevice = new EventEmitter<string>();\n\n readonly tabs: WorkspacesTabDefinition[] = [\n { id: 'workspaces', label: 'Workspaces', icon: 'assets/icons/device-in-room-regular.svg' },\n { id: 'insights', label: 'Insights', icon: 'assets/icons/analysis-regular.svg' },\n { id: 'integrations', label: 'Integrations', icon: 'assets/icons/integrations-regular.svg' },\n { id: 'settings', label: 'Settings', icon: 'assets/icons/tools-regular.svg' },\n ];\n\n activeTab: WorkspacesTab = 'workspaces';\n\n view: WorkspacesView = 'list';\n selectedWorkspace: Workspace | null = null;\n selectedConnectionType: WorkspaceConnectionType = 'di';\n\n workspaces: Workspace[] = [];\n isLoading = false;\n\n pageIndex = 0;\n pageSize = 10;\n total = 0;\n\n searchTerm = '';\n typeFilter = '';\n locationFilter = '';\n\n pendingWorkspaceIds = new Set<string>();\n\n private readonly subscriptions: Subscription[] = [];\n\n constructor(\n private apiService: APIService,\n private apiWebexService: ApiWebexService,\n private workspacesService: WorkspacesService,\n private migrationService: WorkspacesMigrationService,\n private dialog: MatDialog,\n private location: Location,\n ) { }\n\n ngOnInit(): void {\n this.apiService.token = this.token;\n this.apiService.apiUrl = this.host + '/dcp';\n this.apiWebexService.token = this.token;\n this.apiWebexService.apiUrl = this.host + '/webex';\n this.fetchWorkspaces();\n }\n\n ngOnDestroy(): void {\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\n }\n\n get typeOptions(): string[] {\n return [...new Set(this.workspaces.map(workspace => workspace.typeLabel).filter(Boolean))];\n }\n\n get locationOptions(): string[] {\n return [...new Set(this.workspaces.map(workspace => workspace.location).filter(Boolean))];\n }\n\n private get filteredWorkspacesAll(): Workspace[] {\n const term = this.searchTerm.trim().toLowerCase();\n return this.workspaces.filter(workspace =>\n (!term || workspace.displayName.toLowerCase().includes(term) || workspace.location.toLowerCase().includes(term)) &&\n (!this.typeFilter || workspace.typeLabel === this.typeFilter) &&\n (!this.locationFilter || workspace.location === this.locationFilter)\n );\n }\n\n get filteredWorkspaces(): Workspace[] {\n const start = this.pageIndex * this.pageSize;\n return this.filteredWorkspacesAll.slice(start, start + this.pageSize);\n }\n\n get filteredTotal(): number {\n return this.filteredWorkspacesAll.length;\n }\n\n selectTab(tab: WorkspacesTab): void {\n this.activeTab = tab;\n }\n\n onOpenWorkspace({ id, connectionType }: WorkspaceOpenEvent): void {\n const workspace = this.workspaces.find(item => item.id === id) ?? null;\n this.openWorkspace.emit(id);\n\n if (!workspace) {\n return;\n }\n\n this.selectedWorkspace = workspace;\n this.selectedConnectionType = connectionType;\n this.view = 'detail';\n }\n\n onBackToList(): void {\n this.view = 'list';\n this.selectedWorkspace = null;\n this.location.replaceState('/workspaces');\n }\n\n onSearchChange(term: string): void {\n this.searchTerm = term;\n this.pageIndex = 0;\n }\n\n onTypeFilterChange(type: string): void {\n this.typeFilter = type;\n this.pageIndex = 0;\n }\n\n onLocationFilterChange(location: string): void {\n this.locationFilter = location;\n this.pageIndex = 0;\n }\n\n onPageChange({ pageIndex, pageSize }: { pageIndex: number; pageSize: number }): void {\n this.pageIndex = pageIndex;\n this.pageSize = pageSize;\n }\n\n onMoveToMT(workspace: Workspace): void {\n const dialogRef = this.dialog.open(WorkspaceConfirmDialogComponent, {\n data: {\n title: `Upgrade workspace ${workspace.displayName} to Multi Tenant?`,\n message: `<p>Upgrading this workspace will prepare it for migration to Multi Tenant.</p>\n <p>During this process, the workspace configuration will be copied to the Multi Tenant environment.\n The workspace will remain active on the current system until the Activate step is completed.</p>\n <p>Do you want to continue?</p>`,\n confirmButtonText: 'Yes, upgrade',\n },\n });\n\n dialogRef.beforeClosed().subscribe((result: boolean) => {\n if (!result) {\n return;\n }\n this.pendingWorkspaceIds.add(workspace.id);\n const subscription = this.migrationService.moveToMT(this.customerId, workspace.device).subscribe({\n next: (formId: number) => {\n if (formId) {\n this.pollMigrationFormStatus(Number(formId), workspace.id);\n } else {\n this.pendingWorkspaceIds.delete(workspace.id);\n this.fetchWorkspaces();\n }\n },\n error: () => {\n this.pendingWorkspaceIds.delete(workspace.id);\n this.fetchWorkspaces();\n },\n });\n this.subscriptions.push(subscription);\n });\n }\n\n onEnableWebexCalling(workspace: Workspace): void {\n const device = workspace.device;\n if (!device.webexUUID || workspace.status !== 'inactive') {\n return;\n }\n\n const dialogRef = this.dialog.open(WorkspaceConfirmDialogComponent, {\n data: {\n title: `Activate workspace ${workspace.displayName} on Multi Tenant?`,\n message: `<p>Activating this workspace will perform the cutover to Multi Tenant and complete the migration process.</p>\n <p>After activation, the workspace will become active on Multi Tenant and the original workspace will become inactive.</p>\n <p>Do you want to continue?</p>`,\n confirmButtonText: 'Activate',\n },\n });\n\n dialogRef.beforeClosed().subscribe((result: boolean) => {\n if (!result) {\n return;\n }\n this.pendingWorkspaceIds.add(workspace.id);\n const subscription = this.migrationService\n .getMigratedMigrationFormEntities(this.customerId, device.webexUUID as string, 'ORPHANED_DEVICE')\n .pipe(map((entities: any[]) => (Array.isArray(entities) ? entities[0] : entities || null)))\n .subscribe({\n next: (entity: any) => {\n const formId = entity?.migrationFormId ?? entity?.id ?? null;\n if (!formId) {\n this.pendingWorkspaceIds.delete(workspace.id);\n return;\n }\n const deviceMap = this.buildFirmwareDeviceMap(entity, device);\n const upgradeSubscription = this.migrationService\n .triggerFirmwareUpgrade(this.customerId, Number(formId), deviceMap)\n .subscribe({\n next: () => {\n window.setTimeout(() => {\n this.pollMigrationFormStatus(Number(formId), workspace.id, () => {\n this.migrationService.removeUcmLicense(this.customerId, Number(formId)).subscribe();\n });\n }, 10000);\n },\n error: () => {\n this.pendingWorkspaceIds.delete(workspace.id);\n this.fetchWorkspaces();\n },\n });\n this.subscriptions.push(upgradeSubscription);\n },\n error: () => {\n this.pendingWorkspaceIds.delete(workspace.id);\n },\n });\n this.subscriptions.push(subscription);\n });\n }\n\n onMigrateToUCM(workspace: Workspace): void {\n const device = workspace.device;\n if (!device.webexUUID || workspace.status !== 'active') {\n return;\n }\n\n this.pendingWorkspaceIds.add(workspace.id);\n const subscription = this.migrationService\n .revertMigration(this.customerId, device.webexUUID)\n .pipe(switchMap(() => timer(2000)))\n .subscribe({\n next: () => {\n this.pendingWorkspaceIds.delete(workspace.id);\n this.fetchWorkspaces();\n },\n error: () => {\n this.pendingWorkspaceIds.delete(workspace.id);\n this.fetchWorkspaces();\n },\n });\n this.subscriptions.push(subscription);\n }\n\n private pollMigrationFormStatus(formId: number, workspaceId: string, onCompleted?: () => void): void {\n const subscription = timer(0, 10000)\n .pipe(\n switchMap(() => this.migrationService.getMigrationFormStatus(this.customerId, formId)),\n takeWhile((response: any) => !this.isTerminalMigrationStatus(response?.status), true),\n )\n .subscribe({\n next: (response: any) => {\n const status = this.normalizeMigrationStatus(response?.status);\n if (!this.isTerminalMigrationStatus(status)) {\n return;\n }\n this.pendingWorkspaceIds.delete(workspaceId);\n this.fetchWorkspaces();\n if (status === 'COMPLETED') {\n onCompleted?.();\n }\n },\n error: () => {\n this.pendingWorkspaceIds.delete(workspaceId);\n this.fetchWorkspaces();\n },\n });\n this.subscriptions.push(subscription);\n }\n\n private buildFirmwareDeviceMap(entity: any, device: WorkspaceDeviceRecord): FirmwareDeviceMap {\n const deviceMap: FirmwareDeviceMap = {};\n const entityDevices: any[] = [\n ...(Array.isArray(entity?.devices) ? entity.devices : []),\n ...(Array.isArray(entity?.webexMigrationDevices) ? entity.webexMigrationDevices : []),\n ];\n const sourceDevices = entityDevices.length ? entityDevices : [device];\n const cucmId = Number(device.cucmId) || 0;\n\n sourceDevices.forEach((rawDevice: any) => {\n const name: string = rawDevice?.name || device.name || '';\n if (!name) {\n return;\n }\n const deviceName = name.includes('SEP') ? name : `SEP${name}`;\n if (!deviceMap[cucmId]) {\n deviceMap[cucmId] = {};\n }\n if (!deviceMap[cucmId]['ORPHANED_DEVICE']) {\n deviceMap[cucmId]['ORPHANED_DEVICE'] = [];\n }\n deviceMap[cucmId]['ORPHANED_DEVICE'].push(deviceName);\n });\n\n return deviceMap;\n }\n\n private normalizeMigrationStatus(status: string | null | undefined): string {\n return (status || '').toUpperCase();\n }\n\n private isTerminalMigrationStatus(status: string | null | undefined): boolean {\n const normalized = this.normalizeMigrationStatus(status);\n return normalized === 'COMPLETED' || normalized === 'FAILED' || normalized === 'ERROR' || normalized === 'COMPLETED_WITH_ERRORS';\n }\n\n private fetchWorkspaces(): void {\n this.isLoading = true;\n this.workspacesService.fetchWorkspaces(this.customerId).subscribe({\n next: ({ workspaces, total }) => {\n this.workspaces = workspaces;\n this.total = total;\n this.isLoading = false;\n },\n error: () => {\n this.workspaces = [];\n this.total = 0;\n this.isLoading = false;\n },\n });\n }\n}\n","<div class=\"tk-workspaces\">\n <ng-container *ngIf=\"view === 'list'; else detailView\">\n <header class=\"tk-workspaces__header\">\n <h1 class=\"tk-workspaces__title\">Workspaces</h1>\n </header>\n\n <nav class=\"tk-workspaces__tabs\">\n <button\n type=\"button\"\n *ngFor=\"let tab of tabs\"\n class=\"tk-workspaces__tab\"\n [class.tk-workspaces__tab--active]=\"activeTab === tab.id\"\n (click)=\"selectTab(tab.id)\">\n <img class=\"tk-workspaces__tab-icon\" [src]=\"tab.icon\" alt=\"\" />\n {{ tab.label }}\n </button>\n </nav>\n\n <ng-container *ngIf=\"activeTab === 'workspaces'; else placeholder\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <tk-workspaces-filters\n [resultCount]=\"total\"\n [typeOptions]=\"typeOptions\"\n [locationOptions]=\"locationOptions\"\n (searchChange)=\"onSearchChange($event)\"\n (typeChange)=\"onTypeFilterChange($event)\"\n (locationChange)=\"onLocationFilterChange($event)\"\n (addWorkspace)=\"addWorkspace.emit()\">\n </tk-workspaces-filters>\n\n <tk-workspaces-table\n [workspaces]=\"filteredWorkspaces\"\n [total]=\"filteredTotal\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pendingWorkspaceIds]=\"pendingWorkspaceIds\"\n (openWorkspace)=\"onOpenWorkspace($event)\"\n (licenseWithHybrid)=\"onMoveToMT($event)\"\n (migrateToMT)=\"onMoveToMT($event)\"\n (enableWebexCalling)=\"onEnableWebexCalling($event)\"\n (migrateToUCM)=\"onMigrateToUCM($event)\"\n (addDevice)=\"addDevice.emit($event)\"\n (pageChange)=\"onPageChange($event)\">\n </tk-workspaces-table>\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"tk-workspaces__placeholder\">This section isn't available in this widget yet.</div>\n </ng-template>\n </ng-container>\n\n <ng-template #detailView>\n <tk-workspace-detail\n *ngIf=\"selectedWorkspace\"\n [workspace]=\"selectedWorkspace\"\n [connectionType]=\"selectedConnectionType\"\n [customerId]=\"customerId\"\n (back)=\"onBackToList()\">\n </tk-workspace-detail>\n </ng-template>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport { MaterialModule } from './material.module';\nimport { WorkspacesComponent } from './workspaces.component';\nimport { WorkspacesFiltersComponent } from './components/workspaces-filters/workspaces-filters.component';\nimport { WorkspacesTableComponent } from './components/workspaces-table/workspaces-table.component';\nimport { WorkspaceDetailComponent } from './components/workspace-detail/workspace-detail.component';\nimport { WorkspaceDeviceDetailComponent } from './components/workspace-device-detail/workspace-device-detail.component';\nimport { WorkspaceConfirmDialogComponent } from './components/workspace-confirm-dialog/workspace-confirm-dialog.component';\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\n\n@NgModule({\n declarations: [\n WorkspacesComponent,\n WorkspacesFiltersComponent,\n WorkspacesTableComponent,\n WorkspaceDetailComponent,\n WorkspaceDeviceDetailComponent,\n WorkspaceConfirmDialogComponent,\n AppLoaderComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n MaterialModule,\n ],\n exports: [\n WorkspacesComponent,\n ],\n})\nexport class WorkspacesModule { }\n","/*\n * Public API Surface of @tuki-io/tuki-widgets\n */\n\n// Widget Modules\nexport * from './src/workspaces.module';\n\n// Components\nexport * from './src/workspaces.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i1.APIService","i1.ApiWebexService","resolveDeviceIcon","i3","i2.ApiWebexService","i5","i6.AppLoaderComponent","i1.WorkspaceDetailService","i5.WorkspaceDeviceDetailComponent","map","i3.WorkspacesService","i4.WorkspacesMigrationService","i6","i7.WorkspacesFiltersComponent","i8.WorkspacesTableComponent","i9.WorkspaceDetailComponent","i10.AppLoaderComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tuki-io-tuki-widgets-workspaces.mjs","sources":["../../../../projects/tuki/widgets/workspaces/src/material.module.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-confirm-dialog/workspace-confirm-dialog.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-confirm-dialog/workspace-confirm-dialog.component.html","../../../../projects/tuki/widgets/workspaces/src/services/api.service.ts","../../../../projects/tuki/widgets/workspaces/src/services/api-webex.service.ts","../../../../projects/tuki/widgets/workspaces/src/app.constants.ts","../../../../projects/tuki/widgets/workspaces/src/utils/workspace-name.ts","../../../../projects/tuki/widgets/workspaces/src/services/workspaces.service.ts","../../../../projects/tuki/widgets/workspaces/src/services/workspaces-migration.service.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-filters/workspaces-filters.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-filters/workspaces-filters.component.html","../../../../projects/tuki/widgets/workspaces/src/utils/device-icon.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-table/workspaces-table.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspaces-table/workspaces-table.component.html","../../../../projects/tuki/widgets/workspaces/src/services/workspace-detail.service.ts","../../../../projects/tuki/widgets/workspaces/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/workspaces/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.html","../../../../projects/tuki/widgets/workspaces/src/components/workspace-detail/workspace-detail.component.ts","../../../../projects/tuki/widgets/workspaces/src/components/workspace-detail/workspace-detail.component.html","../../../../projects/tuki/widgets/workspaces/src/workspaces.component.ts","../../../../projects/tuki/widgets/workspaces/src/workspaces.component.html","../../../../projects/tuki/widgets/workspaces/src/workspaces.module.ts","../../../../projects/tuki/widgets/workspaces/public-api.ts","../../../../projects/tuki/widgets/workspaces/tuki-io-tuki-widgets-workspaces.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\n@NgModule({\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTableModule,\r\n MatProgressSpinnerModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatMenuModule,\r\n MatPaginatorModule,\r\n MatTooltipModule,\r\n MatDialogModule,\r\n ],\r\n exports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTableModule,\r\n MatProgressSpinnerModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatMenuModule,\r\n MatPaginatorModule,\r\n MatTooltipModule,\r\n MatDialogModule,\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\n\r\nexport interface WorkspaceConfirmDialogConfig {\r\n title: string;\r\n message: string;\r\n confirmButtonText: string;\r\n}\r\n\r\n@Component({\r\n selector: 'tk-workspace-confirm-dialog',\r\n templateUrl: './workspace-confirm-dialog.component.html',\r\n styleUrls: ['./workspace-confirm-dialog.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class WorkspaceConfirmDialogComponent implements OnInit {\r\n confirmButtonText = 'OK';\r\n message = '';\r\n title = '';\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<WorkspaceConfirmDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: WorkspaceConfirmDialogConfig,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.confirmButtonText = this.data.confirmButtonText || '';\r\n this.message = this.data.message || '';\r\n this.title = this.data.title || '';\r\n }\r\n\r\n onClose(result: boolean): void {\r\n this.dialogRef.close(result);\r\n }\r\n}\r\n","<div id=\"tk-workspace-confirm-dialog\" class=\"tk-workspace-confirm-dialog\" aria-labelledby=\"tk-workspace-confirm-dialog-label\" role=\"dialog\">\r\n <h3 *ngIf=\"title\" class=\"tk-workspace-confirm-dialog__title\">{{ title }}</h3>\r\n <div mat-dialog-content *ngIf=\"message\" class=\"tk-workspace-confirm-dialog__content\">\r\n <div class=\"tk-workspace-confirm-dialog__message\" [innerHTML]=\"message\"></div>\r\n </div>\r\n <div mat-dialog-actions class=\"tk-workspace-confirm-dialog__actions\">\r\n <button type=\"button\" class=\"tk-workspace-confirm-dialog__button tk-workspace-confirm-dialog__button--cancel\" (click)=\"onClose(false)\">\r\n Cancel\r\n </button>\r\n <button type=\"button\" class=\"tk-workspace-confirm-dialog__button tk-workspace-confirm-dialog__button--confirm\" (click)=\"onClose(true)\">\r\n {{ confirmButtonText }}\r\n </button>\r\n </div>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class APIService {\r\n token!: string;\r\n apiUrl!: string;\r\n\r\n constructor(\r\n private httpClient: HttpClient\r\n ) { }\r\n\r\n fetch(url: string, params?: any, cache?: boolean): Observable<any> {\r\n const headers = this.getHeaders(cache);\r\n params = params || {};\r\n return this.httpClient.get(this.apiUrl + url, { params: this.prepareEncodedParams(params), headers });\r\n }\r\n\r\n post(url: string, body: any, params = {}): Observable<any> {\r\n body = body || null;\r\n const headers = this.getHeaders();\r\n return this.httpClient.post(this.apiUrl + url, body, { params: this.prepareEncodedParams(params), headers });\r\n }\r\n\r\n put(url: string, body: any = null, params = {}): Observable<any> {\r\n const headers = this.getHeaders();\r\n return this.httpClient.put(this.apiUrl + url, body, { headers, params: this.prepareEncodedParams(params) });\r\n }\r\n\r\n delete(url: string, params = {}) {\r\n const headers = this.getHeaders();\r\n return this.httpClient.delete(this.apiUrl + url, { headers, params: this.prepareEncodedParams(params) });\r\n }\r\n\r\n private prepareEncodedParams(params: any) {\r\n const result: any = {};\r\n\r\n if (!params) {\r\n return {};\r\n }\r\n for (const key of Object.keys(params)) {\r\n if (params[key] !== undefined && params[key] !== null && params[key] !== '') {\r\n const stringParam = params[key].toString();\r\n result[key] = stringParam.includes('+') ? encodeURIComponent(stringParam) : stringParam;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private getHeaders(cache?: boolean): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n if (cache) {\r\n headers = headers.append('_Cache', 'true ');\r\n }\r\n const token = this.token || this.getParameterByName('token');\r\n headers = headers.append('Authorization', 'Bearer ' + token);\r\n return headers;\r\n }\r\n\r\n private getParameterByName(name: any, url = window.location.href) {\r\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\r\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\r\n results = regex.exec(url);\r\n if (!results) return null;\r\n if (!results[2]) return '';\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { APIService } from './api.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ApiWebexService extends APIService { }\r\n","export const API = {\r\n WORKSPACES: {\r\n GET_ALL: '/api/search/quicknonuserdevices',\r\n },\r\n MIGRATION: {\r\n MOVE: '/api/migration/webex/singlemigration/features/ORPHANED_DEVICE',\r\n MIGRATION_FORM: '/api/search/webex/customers/:customerId/migrationforms/:formId',\r\n MIGRATION_FORM_ENTITIES_MIGRATED: '/api/search/webex/customers/:customerId/migrationformentities/migrated',\r\n TRIGGER_FIRMWARE_MIGRATION: '/api/migration/:migrationType/firmwaremigration/customer/:customerId/migration/:migrationFormId',\r\n REMOVE_UCM_LICENSE: '/api/migration/:controlHubType/removeucmlicense/customer/:customerId/migrationform/:migrationFormId',\r\n WEBEX_REVERT: '/api/webex/provisioning/customers/:customerId/persons/:personId/revertmigration',\r\n },\r\n DETAILS: {\r\n // CUCM detail endpoints will be provided later.\r\n CUCM: {\r\n WORKSPACE: '/api/provision/:siteId/nonuserdevices/:workspaceId?type=ORPHAN_DEVICE',\r\n SITE: '/api/sites/:siteId',\r\n },\r\n WEBEX: {\r\n WORKSPACE: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId',\r\n NUMBERS: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId/numbers',\r\n CALLERID: '/api/webex/provisioning/customers/:customerId/workspaces/:workspaceId/callerId',\r\n },\r\n },\r\n};\r\n\r\nexport const ON_PREM_ID = 2542;","// CUCM and Webex Calling device names for the same physical workspace can differ\r\n// only by the 'SEP' substring (Cisco's MAC-based device naming for CUCM\r\n// endpoints). Comparing/rendering with it stripped is how the two get treated\r\n// as one workspace, without altering the underlying device name data.\r\nexport function withoutSep(name: string): string {\r\n return name.toLocaleUpperCase().replace(/SEP/gi, '');\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { forkJoin, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { API } from '../app.constants';\r\nimport { APIService } from './api.service';\r\nimport { Workspace, WorkspaceDevice, WorkspaceListItem, WorkspacesPage, WorkspacesResponse, WorkspaceStatus } from '../types/workspace';\r\nimport { withoutSep } from '../utils/workspace-name';\r\n\r\nfunction parseResponse(response: any): any {\r\n return typeof response === 'string' ? JSON.parse(response) : response;\r\n}\r\n\r\nfunction toStatus(provisioningStatus: string | null): WorkspaceStatus {\r\n if (!provisioningStatus) {\r\n return 'unavailable';\r\n }\r\n return provisioningStatus.toLowerCase() === 'active' ? 'active' : 'inactive';\r\n}\r\n\r\nfunction toWorkspaceDevices(item: WorkspaceListItem, index: number): WorkspaceDevice[] {\r\n if (item.workspaceDevices?.length) {\r\n return item.workspaceDevices.map(workspaceDevice => ({\r\n id: workspaceDevice.deviceId,\r\n kind: 'device' as const,\r\n label: workspaceDevice.model || workspaceDevice.mac,\r\n model: workspaceDevice.model,\r\n mac: workspaceDevice.mac,\r\n }));\r\n }\r\n\r\n const device = item.device;\r\n if (!device) {\r\n return [];\r\n }\r\n\r\n const model = device.deviceType || device.userDeviceType || undefined;\r\n return [{\r\n id: device.pkid || device.webexUUID || device.name || `device-${index}`,\r\n kind: 'device' as const,\r\n label: model || device.name || 'Unnamed device',\r\n model,\r\n mac: /^SEP/i.test(device.name || '') ? device.name.slice(3) : undefined,\r\n }];\r\n}\r\n\r\nfunction toWorkspace(item: WorkspaceListItem, index: number, isCucm: boolean): Workspace {\r\n const device = item.device;\r\n const firstDirectoryNumber = device.associatedDNs?.[0]?.directoryNumber ?? '';\r\n\r\n return {\r\n id: device.pkid || item.workspaceDevices?.[0]?.deviceId || device.name || `workspace-${index}`,\r\n displayName: device.newName || device.name || 'Unnamed device',\r\n typeLabel: device.userDeviceType || 'No type',\r\n capacity: null,\r\n location: item.site?.name || device.siteName || device.location || '',\r\n siteId: item.site?.id ?? null,\r\n devices: toWorkspaceDevices(item, index),\r\n scheduling: 'Not set',\r\n callingLicense: firstDirectoryNumber,\r\n provisioningType: 'On-premises',\r\n status: toStatus(device.provisioningStatus),\r\n statusLabel: device.provisioningStatus || 'Status unavailable',\r\n device,\r\n isHybrid: false,\r\n cucmDeviceName: isCucm ? (device.name || null) : null,\r\n };\r\n}\r\n\r\nfunction mergeDevices(a: Workspace['device'], b: Workspace['device']): Workspace['device'] {\r\n return {\r\n ...a,\r\n ...b,\r\n cucmId: b.cucmId ?? a.cucmId,\r\n webexUUID: b.webexUUID ?? a.webexUUID,\r\n };\r\n}\r\n\r\nfunction mergeWorkspacesByDeviceName(workspaces: Workspace[]): Workspace[] {\r\n const merged = new Map<string, Workspace>();\r\n\r\n for (const workspace of workspaces) {\r\n const key = withoutSep(workspace.device.name);\r\n const existing = merged.get(key);\r\n merged.set(key, existing ? {\r\n ...existing,\r\n ...workspace,\r\n device: mergeDevices(existing.device, workspace.device),\r\n isHybrid: true,\r\n cucmDeviceName: existing.cucmDeviceName ?? workspace.cucmDeviceName,\r\n } : workspace);\r\n }\r\n\r\n return Array.from(merged.values());\r\n}\r\n\r\nconst FETCH_ALL_SIZE = 9999;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WorkspacesService {\r\n constructor(private apiService: APIService) { }\r\n\r\n fetchWorkspaces(customerId: string | number): Observable<WorkspacesPage> {\r\n const baseParams: Record<string, string> = {\r\n type: 'ORPHAN_DEVICE',\r\n customerid: customerId.toString(),\r\n size: FETCH_ALL_SIZE.toString(),\r\n page: '0',\r\n };\r\n\r\n const cucm$ = this.apiService.fetch(API.WORKSPACES.GET_ALL, {\r\n ...baseParams,\r\n 'device-name': 'SEP',\r\n provisionType: 'CUCM',\r\n });\r\n\r\n const webex$ = this.apiService.fetch(API.WORKSPACES.GET_ALL, {\r\n ...baseParams,\r\n provisionType: 'WEBEX',\r\n });\r\n\r\n return forkJoin([cucm$, webex$]).pipe(\r\n map(([cucmResponse, webexResponse]) => {\r\n const cucmParsed = parseResponse(cucmResponse) as WorkspacesResponse;\r\n const webexParsed = parseResponse(webexResponse) as WorkspacesResponse;\r\n const cucmWorkspaces = (cucmParsed?.pageData || []).map((item, index) => toWorkspace(item, index, true));\r\n const webexWorkspaces = (webexParsed?.pageData || []).map((item, index) => toWorkspace(item, index, false));\r\n const workspaces = mergeWorkspacesByDeviceName([...cucmWorkspaces, ...webexWorkspaces]);\r\n\r\n return {\r\n workspaces,\r\n total: workspaces.length,\r\n };\r\n }),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { API } from '../app.constants';\r\nimport { WorkspaceDeviceRecord } from '../types/workspace';\r\nimport { ApiWebexService } from './api-webex.service';\r\n\r\nexport type FirmwareDeviceMap = Record<number, Record<string, string[]>>;\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class WorkspacesMigrationService {\r\n constructor(private apiWebexService: ApiWebexService) { }\r\n\r\n moveToMT(customerId: string | number, device: WorkspaceDeviceRecord): Observable<any> {\r\n return this.apiWebexService.post(API.MIGRATION.MOVE, this.getMoveBody(customerId, device));\r\n }\r\n\r\n getMigrationFormStatus(customerId: string | number, formId: number): Observable<any> {\r\n const url = API.MIGRATION.MIGRATION_FORM\r\n .replace(':customerId', String(customerId))\r\n .replace(':formId', String(formId));\r\n return this.apiWebexService.fetch(url);\r\n }\r\n\r\n getMigratedMigrationFormEntities(\r\n customerId: string | number,\r\n webexUUID: string,\r\n feature = 'ORPHANED_DEVICE',\r\n ): Observable<any> {\r\n const url = API.MIGRATION.MIGRATION_FORM_ENTITIES_MIGRATED.replace(':customerId', String(customerId));\r\n return this.apiWebexService.fetch(url, { webexUUID, feature });\r\n }\r\n\r\n triggerFirmwareUpgrade(\r\n customerId: string | number,\r\n migrationFormId: number,\r\n deviceMap: FirmwareDeviceMap,\r\n ): Observable<any> {\r\n const url = API.MIGRATION.TRIGGER_FIRMWARE_MIGRATION\r\n .replace(':migrationType', 'WEBEX')\r\n .replace(':customerId', String(customerId))\r\n .replace(':migrationFormId', String(migrationFormId));\r\n return this.apiWebexService.post(url, deviceMap);\r\n }\r\n\r\n removeUcmLicense(\r\n customerId: string | number,\r\n migrationFormId: number,\r\n controlHubType = 'WEBEX',\r\n ): Observable<any> {\r\n const url = API.MIGRATION.REMOVE_UCM_LICENSE\r\n .replace(':controlHubType', controlHubType)\r\n .replace(':customerId', String(customerId))\r\n .replace(':migrationFormId', String(migrationFormId));\r\n return this.apiWebexService.post(url, {});\r\n }\r\n\r\n revertMigration(customerId: string | number, personId: string): Observable<any> {\r\n const url = API.MIGRATION.WEBEX_REVERT\r\n .replace(':customerId', String(customerId))\r\n .replace(':personId', personId);\r\n return this.apiWebexService.post(url, {});\r\n }\r\n\r\n private getMoveBody(customerId: string | number, device: WorkspaceDeviceRecord): any {\r\n return {\r\n customerId,\r\n entities: {\r\n ORPHANED_DEVICE: [{ cucmId: device.cucmId, entityId: device.name }],\r\n },\r\n };\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'tk-workspaces-filters',\r\n templateUrl: './workspaces-filters.component.html',\r\n styleUrls: ['./workspaces-filters.component.scss'],\r\n})\r\nexport class WorkspacesFiltersComponent {\r\n @Input() resultCount = 0;\r\n @Input() typeOptions: string[] = [];\r\n @Input() locationOptions: string[] = [];\r\n\r\n @Output() searchChange = new EventEmitter<string>();\r\n @Output() typeChange = new EventEmitter<string>();\r\n @Output() locationChange = new EventEmitter<string>();\r\n @Output() addWorkspace = new EventEmitter<void>();\r\n\r\n searchTerm = '';\r\n selectedType = '';\r\n selectedLocation = '';\r\n\r\n onSearchInputChange(event: Event): void {\r\n this.searchTerm = (event.target as HTMLInputElement).value;\r\n this.searchChange.emit(this.searchTerm);\r\n }\r\n\r\n onTypeChange(value: string): void {\r\n this.selectedType = value;\r\n this.typeChange.emit(value);\r\n }\r\n\r\n onLocationChange(value: string): void {\r\n this.selectedLocation = value;\r\n this.locationChange.emit(value);\r\n }\r\n\r\n onAddWorkspace(): void {\r\n this.addWorkspace.emit();\r\n }\r\n}\r\n","<div class=\"tk-workspaces-filters\">\r\n <div class=\"tk-workspaces-filters__search\">\r\n <input\r\n class=\"tk-workspaces-filters__search-input blue-input\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [value]=\"searchTerm\"\r\n (input)=\"onSearchInputChange($event)\"\r\n />\r\n <mat-icon class=\"tk-workspaces-filters__search-icon\">search</mat-icon>\r\n </div>\r\n\r\n <div class=\"tk-workspaces-filters__filters\">\r\n <span class=\"tk-workspaces-filters__filters-label\">Filters:</span>\r\n\r\n <div class=\"tk-workspaces-filters__select-wrap\">\r\n <select\r\n class=\"tk-workspaces-filters__select\"\r\n [ngModel]=\"selectedType\"\r\n (ngModelChange)=\"onTypeChange($event)\">\r\n <option value=\"\">General</option>\r\n <option *ngFor=\"let type of typeOptions\" [value]=\"type\">{{ type }}</option>\r\n </select>\r\n <mat-icon class=\"tk-workspaces-filters__select-icon\">expand_more</mat-icon>\r\n </div>\r\n\r\n <div class=\"tk-workspaces-filters__select-wrap\">\r\n <select\r\n class=\"tk-workspaces-filters__select\"\r\n [ngModel]=\"selectedLocation\"\r\n (ngModelChange)=\"onLocationChange($event)\">\r\n <option value=\"\">Location</option>\r\n <option *ngFor=\"let location of locationOptions\" [value]=\"location\">{{ location }}</option>\r\n </select>\r\n <mat-icon class=\"tk-workspaces-filters__select-icon\">expand_more</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <span class=\"tk-workspaces-filters__count\">{{ resultCount }} workspace{{ resultCount === 1 ? '' : 's' }} in total</span>\r\n\r\n <button type=\"button\" class=\"tk-workspaces-filters__add-button\" [matMenuTriggerFor]=\"addMenu\">\r\n Add workspace\r\n <mat-icon class=\"tk-workspaces-filters__add-icon\">expand_more</mat-icon>\r\n </button>\r\n\r\n <mat-menu #addMenu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item (click)=\"onAddWorkspace()\">Add workspace</button>\r\n <button type=\"button\" mat-menu-item disabled>Import workspaces</button>\r\n </mat-menu>\r\n</div>\r\n","const DEFAULT_DEVICE_ICON = 'assets/icons/cisco_8851.png';\r\n\r\nconst DEVICE_MODEL_ICONS: Record<string, string> = {\r\n 'cisco 8851': 'assets/icons/cisco_8851.png',\r\n 'cisco 8845': 'assets/icons/cisco_8845.png',\r\n 'cisco 9841': 'assets/icons/cisco_9841.png',\r\n};\r\n\r\nexport function getDeviceIcon(model?: string): string {\r\n if (!model) {\r\n return DEFAULT_DEVICE_ICON;\r\n }\r\n return DEVICE_MODEL_ICONS[model.trim().toLowerCase()] ?? DEFAULT_DEVICE_ICON;\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Workspace, WorkspaceConnectionType, WorkspaceOpenEvent } from '../../types/workspace';\r\nimport { getDeviceIcon as resolveDeviceIcon } from '../../utils/device-icon';\r\nimport { withoutSep } from '../../utils/workspace-name';\r\n\r\nexport interface WorkspacesPageChange {\r\n pageIndex: number;\r\n pageSize: number;\r\n}\r\n\r\n@Component({\r\n selector: 'tk-workspaces-table',\r\n templateUrl: './workspaces-table.component.html',\r\n styleUrls: ['./workspaces-table.component.scss'],\r\n})\r\nexport class WorkspacesTableComponent {\r\n @Input() workspaces: Workspace[] = [];\r\n @Input() total = 0;\r\n @Input() pageIndex = 0;\r\n @Input() pageSize = 10;\r\n @Input() pageSizeOptions: number[] = [10, 25, 50, 100];\r\n @Input() pendingWorkspaceIds: Set<string> = new Set();\r\n\r\n @Output() openWorkspace = new EventEmitter<WorkspaceOpenEvent>();\r\n @Output() licenseWithHybrid = new EventEmitter<Workspace>();\r\n @Output() migrateToMT = new EventEmitter<Workspace>();\r\n @Output() enableWebexCalling = new EventEmitter<Workspace>();\r\n @Output() migrateToUCM = new EventEmitter<Workspace>();\r\n @Output() addDevice = new EventEmitter<string>();\r\n @Output() pageChange = new EventEmitter<WorkspacesPageChange>();\r\n\r\n selectedIds = new Set<string>();\r\n\r\n get allSelected(): boolean {\r\n return this.workspaces.length > 0 && this.selectedIds.size === this.workspaces.length;\r\n }\r\n\r\n get someSelected(): boolean {\r\n return this.selectedIds.size > 0 && !this.allSelected;\r\n }\r\n\r\n toggleAll(): void {\r\n this.selectedIds = this.allSelected ? new Set() : new Set(this.workspaces.map(workspace => workspace.id));\r\n }\r\n\r\n toggleRow(workspaceId: string): void {\r\n const nextSelection = new Set(this.selectedIds);\r\n if (nextSelection.has(workspaceId)) {\r\n nextSelection.delete(workspaceId);\r\n } else {\r\n nextSelection.add(workspaceId);\r\n }\r\n this.selectedIds = nextSelection;\r\n }\r\n\r\n isSelected(workspaceId: string): boolean {\r\n return this.selectedIds.has(workspaceId);\r\n }\r\n\r\n onOpenWorkspace(workspace: Workspace, connectionType?: WorkspaceConnectionType): void {\r\n if (!this.canOpenWorkspace(workspace)) {\r\n return;\r\n }\r\n this.openWorkspace.emit({ id: workspace.id, connectionType: connectionType ?? this.resolveConnectionType(workspace) });\r\n }\r\n\r\n canOpenWorkspace(workspace: Workspace): boolean {\r\n return !!workspace.location;\r\n }\r\n\r\n private resolveConnectionType(workspace: Workspace): WorkspaceConnectionType {\r\n return !workspace.isHybrid && workspace.device.webexUUID != null ? 'webex' : 'di';\r\n }\r\n\r\n onAddDevice(workspace: Workspace, event: Event): void {\r\n event.stopPropagation();\r\n this.addDevice.emit(workspace.id);\r\n }\r\n\r\n onPage(event: PageEvent): void {\r\n this.selectedIds = new Set();\r\n this.pageChange.emit({ pageIndex: event.pageIndex, pageSize: event.pageSize });\r\n }\r\n\r\n getDeviceIcon(model?: string): string {\r\n return resolveDeviceIcon(model);\r\n }\r\n\r\n onCopyMac(mac: string): void {\r\n navigator.clipboard?.writeText(mac);\r\n }\r\n\r\n getDisplayName(workspace: Workspace): string {\r\n return withoutSep(workspace.displayName);\r\n }\r\n\r\n isPending(workspaceId: string): boolean {\r\n return this.pendingWorkspaceIds.has(workspaceId);\r\n }\r\n\r\n isMoveToMTDisabled(workspace: Workspace): boolean {\r\n if (workspace.status !== 'active') {\r\n return true;\r\n }\r\n return !workspace.isHybrid && !!workspace.device.webexUUID;\r\n }\r\n\r\n isEnableWebexCallingDisabled(workspace: Workspace): boolean {\r\n if (workspace.status !== 'inactive') {\r\n return true;\r\n }\r\n return !workspace.isHybrid && !workspace.device.webexUUID;\r\n }\r\n\r\n isMigrateToUCMDisabled(workspace: Workspace): boolean {\r\n return !workspace.device.webexUUID || workspace.status !== 'active';\r\n }\r\n}\r\n","<div class=\"tk-workspaces-table__bulk-bar\">Select one or more workspaces for bulk actions</div>\r\n\r\n<div class=\"tk-workspaces-table__wrapper\">\r\n <table class=\"tk-workspaces-table__table\">\r\n <thead>\r\n <tr>\r\n <th class=\"tk-workspaces-table__checkbox-cell\">\r\n <input type=\"checkbox\" [checked]=\"allSelected\" [indeterminate]=\"someSelected\" (change)=\"toggleAll()\" />\r\n </th>\r\n <th>Name</th>\r\n <th>Devices</th>\r\n <th>Scheduling</th>\r\n <th>Calling</th>\r\n <th>Provisioning Type</th>\r\n <th>Status</th>\r\n <th class=\"tk-workspaces-table__settings-cell\">\r\n <mat-icon class=\"tk-workspaces-table__settings-icon\">settings</mat-icon>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let workspace of workspaces\"\r\n [class.tk-workspaces-table__row--selected]=\"isSelected(workspace.id)\"\r\n [class.tk-workspaces-table__row--disabled]=\"!canOpenWorkspace(workspace)\">\r\n <td class=\"tk-workspaces-table__checkbox-cell\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(workspace.id)\" (change)=\"toggleRow(workspace.id)\" />\r\n </td>\r\n <td class=\"tk-workspaces-table__name-cell\" (click)=\"onOpenWorkspace(workspace)\">\r\n <div class=\"tk-workspaces-table__name-wrapper\">\r\n <span class=\"tk-workspaces-table__name-icon\">\r\n <img src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\r\n </span>\r\n <div class=\"tk-workspaces-table__name-info\">\r\n <a href=\"javascript:void(0)\" class=\"tk-workspaces-table__name-link\">{{ getDisplayName(workspace) }}</a>\r\n <div class=\"tk-workspaces-table__name-meta\">\r\n <span class=\"tk-workspaces-table__name-type\">{{ workspace.typeLabel }}</span>\r\n <span class=\"tk-workspaces-table__meta-sep\">·</span>\r\n <img class=\"tk-workspaces-table__meta-icon\" src=\"assets/icons/people-regular.svg\" alt=\"\" />\r\n <span class=\"tk-workspaces-table__name-capacity\">{{ workspace.capacity ?? 'No capacity' }}</span>\r\n <span class=\"tk-workspaces-table__meta-sep\">·</span>\r\n <!-- <mat-icon class=\"tk-workspaces-table__meta-icon\">location_on</mat-icon> -->\r\n <img class=\"tk-workspaces-table__meta-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\r\n <a\r\n *ngIf=\"workspace.location; else noLocation\"\r\n href=\"javascript:void(0)\"\r\n class=\"tk-workspaces-table__location-link\">{{ workspace.location }}</a>\r\n <ng-template #noLocation>\r\n <span class=\"tk-workspaces-table__location-empty\">No location</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"tk-workspaces-table__devices\">\r\n <ng-container *ngIf=\"workspace.devices.length; else noDevices\">\r\n <span *ngFor=\"let device of workspace.devices\" class=\"tk-workspaces-table__device-card\">\r\n <img\r\n class=\"tk-workspaces-table__device-icon\"\r\n [src]=\"getDeviceIcon(device.model)\"\r\n [alt]=\"device.label\" />\r\n <div class=\"tk-workspaces-table__device-tooltip\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"tk-workspaces-table__device-tooltip-title\">{{ device.label }}</div>\r\n <div class=\"tk-workspaces-table__device-tooltip-status\">\r\n <span\r\n class=\"tk-workspaces-table__device-tooltip-status-dot\"\r\n [class.tk-workspaces-table__device-tooltip-status-dot--active]=\"workspace.status === 'active'\"></span>\r\n {{ workspace.statusLabel }}\r\n </div>\r\n <div class=\"tk-workspaces-table__device-tooltip-divider\"></div>\r\n <div class=\"tk-workspaces-table__device-tooltip-mac\">\r\n <span class=\"tk-workspaces-table__device-tooltip-mac-label\">MAC address</span>\r\n <span class=\"tk-workspaces-table__device-tooltip-mac-value\">{{ device.mac }}</span>\r\n <button\r\n *ngIf=\"device.mac\"\r\n type=\"button\"\r\n class=\"tk-workspaces-table__device-tooltip-copy\"\r\n (click)=\"onCopyMac(device.mac)\">\r\n <img class=\"tk-workspaces-table__device-tooltip-copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\r\n </button>\r\n </div>\r\n </div>\r\n </span>\r\n </ng-container>\r\n <!-- <ng-container *ngFor=\"let device of workspace.devices\">\r\n <span *ngIf=\"device && device.model else noDevice\" class=\"tk-workspaces-table__device-card\" [title]=\"device.label\">\r\n <img\r\n class=\"tk-workspaces-table__device-icon\"\r\n [src]=\"getDeviceIcon(device.model)\"\r\n [alt]=\"device.label\" />\r\n </span>\r\n </ng-container> -->\r\n <ng-template #noDevices>\r\n <button\r\n type=\"button\"\r\n class=\"tk-workspaces-table__device-add\"\r\n (click)=\"onAddDevice(workspace, $event)\">\r\n <span class=\"tk-workspaces-table__device-add-label\">\r\n <img\r\n class=\"tk-workspaces-table__device-add-icon\"\r\n src=\"assets/icons/multipled-devices-regular.svg\"\r\n alt=\"\" />\r\n Add device\r\n </span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td>{{ workspace.scheduling }}</td>\r\n <td class=\"tk-workspaces-table__calling-cell\">\r\n <span class=\"tk-workspaces-table__calling-content\">\r\n <img class=\"tk-workspaces-table__calling-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\r\n <span class=\"tk-workspaces-table__calling-text\" title=\"Cisco Webex Calling Professional Workspace\">Cisco Webex Calling Professional Workspace</span>\r\n </span>\r\n </td>\r\n <td>\r\n <div *ngIf=\"workspace.isHybrid\" class=\"tk-workspaces-table__provisioning-icons\">\r\n <span class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'webex'); $event.stopPropagation()\"\r\n ><img\r\n src=\"assets/icons/webex.svg\"\r\n [matTooltip]=\"'Webex Calling'\"\r\n matTooltipPosition=\"right\"\r\n width=\"20\"\r\n alt=\"\"\r\n /></span>\r\n <span class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'di'); $event.stopPropagation()\"\r\n ><img\r\n src=\"assets/icons/di_cloud_24.svg\"\r\n [matTooltip]=\"'Webex Calling DI'\"\r\n matTooltipPosition=\"right\"\r\n width=\"20\"\r\n alt=\"\"\r\n /></span>\r\n </div>\r\n <ng-container *ngIf=\"!workspace.isHybrid\">\r\n <span *ngIf=\"workspace.device.cucmId != null\" class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'di'); $event.stopPropagation()\"\r\n ><img\r\n src=\"assets/icons/di_cloud_24.svg\"\r\n [matTooltip]=\"'Webex Calling DI'\"\r\n matTooltipPosition=\"right\"\r\n width=\"20\"\r\n alt=\"\"\r\n /></span>\r\n <span *ngIf=\"workspace.device.webexUUID != null\" class=\"icon-wrapper\" (click)=\"onOpenWorkspace(workspace, 'webex'); $event.stopPropagation()\"\r\n ><img\r\n src=\"assets/icons/webex.svg\"\r\n [matTooltip]=\"'Webex Calling'\"\r\n matTooltipPosition=\"right\"\r\n width=\"20\"\r\n alt=\"\"\r\n /></span>\r\n </ng-container>\r\n </td>\r\n <td>\r\n <span class=\"tk-workspaces-table__status\">\r\n <span\r\n class=\"tk-workspaces-table__status-dot\"\r\n [class.tk-workspaces-table__status-dot--hybrid]=\"workspace.isHybrid\"\r\n [class.tk-workspaces-table__status-dot--active]=\"!workspace.isHybrid\"></span>\r\n {{ workspace.isHybrid ? 'Hybrid' : 'Active' }}\r\n </span>\r\n </td>\r\n <td class=\"tk-workspaces-table__actions-cell\">\r\n <mat-progress-spinner\r\n *ngIf=\"isPending(workspace.id)\"\r\n class=\"tk-workspaces-table__actions-spinner\"\r\n [diameter]=\"20\"\r\n strokeWidth=\"2\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n <button\r\n *ngIf=\"!isPending(workspace.id)\"\r\n type=\"button\"\r\n class=\"tk-workspaces-table__actions-button\"\r\n [matMenuTriggerFor]=\"rowMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #rowMenu=\"matMenu\">\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"isMoveToMTDisabled(workspace)\"\r\n (click)=\"licenseWithHybrid.emit(workspace)\">\r\n License with Cloud Intelligence\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"isMoveToMTDisabled(workspace)\"\r\n (click)=\"migrateToMT.emit(workspace)\">\r\n Migrate Workspace To Webex Calling\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"isEnableWebexCallingDisabled(workspace)\"\r\n (click)=\"enableWebexCalling.emit(workspace)\">\r\n Enable Webex Calling\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"isMigrateToUCMDisabled(workspace)\"\r\n (click)=\"migrateToUCM.emit(workspace)\">\r\n Migrate User to UCM\r\n </button>\r\n </mat-menu>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!workspaces.length\">\r\n <td [attr.colspan]=\"8\" class=\"tk-workspaces-table__empty\">No workspaces to display.</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<mat-paginator\r\n class=\"tk-workspaces-table__paginator\"\r\n [length]=\"total\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onPage($event)\">\r\n</mat-paginator>\r\n","import { Injectable } from '@angular/core';\r\nimport { forkJoin, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { API } from '../app.constants';\r\nimport { ApiWebexService } from './api-webex.service';\r\nimport { APIService } from './api.service';\r\nimport {\r\n CucmSiteResponse,\r\n CucmWorkspaceDetailsResponse,\r\n WebexCallerIdResponse,\r\n WebexNumbersResponse,\r\n WebexWorkspaceDetailsResponse,\r\n Workspace,\r\n WorkspaceConnectionType,\r\n WorkspaceDetails,\r\n WorkspaceDeviceDetails,\r\n WorkspaceIssue,\r\n} from '../types/workspace';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WorkspaceDetailService {\r\n constructor(\r\n private apiService: APIService,\r\n private apiWebexService: ApiWebexService,\r\n ) { }\r\n\r\n getByWorkspace(\r\n workspace: Workspace,\r\n connectionType: WorkspaceConnectionType,\r\n customerId: string | number,\r\n ): Observable<WorkspaceDetails> {\r\n if (connectionType === 'webex' && workspace.device.webexUUID) {\r\n return this.getWebexDetails(customerId, workspace.device.webexUUID);\r\n }\r\n return this.getCucmDetails(workspace);\r\n }\r\n\r\n private getWebexDetails(customerId: string | number, workspaceId: string): Observable<WorkspaceDetails> {\r\n const params = { customerId: String(customerId), workspaceId };\r\n\r\n return forkJoin([\r\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.WORKSPACE, params)),\r\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.NUMBERS, params)),\r\n this.apiWebexService.fetch(this.buildUrl(API.DETAILS.WEBEX.CALLERID, params)),\r\n ]).pipe(\r\n map(([workspaceRes, numbersRes, callerIdRes]: [\r\n WebexWorkspaceDetailsResponse,\r\n WebexNumbersResponse,\r\n WebexCallerIdResponse,\r\n ]) => this.toWebexDetails(workspaceRes, numbersRes, callerIdRes)),\r\n );\r\n }\r\n\r\n private toWebexDetails(\r\n workspaceRes: WebexWorkspaceDetailsResponse,\r\n numbersRes: WebexNumbersResponse,\r\n callerIdRes: WebexCallerIdResponse,\r\n ): WorkspaceDetails {\r\n const primaryNumber = numbersRes.phoneNumbers?.find(number => number.primary) ?? numbersRes.phoneNumbers?.[0];\r\n\r\n return {\r\n issues: this.buildIssues(workspaceRes.type, workspaceRes.capacity),\r\n location: {\r\n country: numbersRes.location?.name || workspaceRes.locationName || 'Not set',\r\n address: numbersRes.location?.address || 'Address not available',\r\n },\r\n calling: {\r\n license: workspaceRes.licenseName || 'Not set',\r\n sipAddress: workspaceRes.sipAddress || 'Not assigned',\r\n directoryNumber: primaryNumber?.external || primaryNumber?.extension || 'Not assigned',\r\n extension: primaryNumber?.extension || undefined,\r\n routePartition: '',\r\n callingSearchSpace: '',\r\n securityProfile: '',\r\n externalCallerIdName: callerIdRes.locationExternalCallerIdName || callerIdRes.customExternalCallerIdName || undefined,\r\n externalCallerIdNumber: callerIdRes.locationNumber || callerIdRes.customNumber || callerIdRes.directNumber || undefined,\r\n },\r\n schedulingConfigured: false,\r\n plannedMaintenanceEnabled: false,\r\n notes: null,\r\n capacity: workspaceRes.capacity,\r\n device: this.buildWebexDeviceDetails(workspaceRes, numbersRes),\r\n };\r\n }\r\n\r\n private buildWebexDeviceDetails(\r\n workspaceRes: WebexWorkspaceDetailsResponse,\r\n numbersRes: WebexNumbersResponse,\r\n ): WorkspaceDeviceDetails {\r\n const device = workspaceRes.devices?.[0];\r\n const primaryNumber = numbersRes.phoneNumbers?.find(number => number.primary) ?? numbersRes.phoneNumbers?.[0];\r\n\r\n return {\r\n model: device?.model || 'Unknown device',\r\n registrationStatus: device?.registered ? 'Registered' : 'Not Registered',\r\n mac: device?.mac || 'N/A',\r\n lineCount: numbersRes.phoneNumbers?.length ?? null,\r\n hostIpAddress: 'N/A',\r\n remoteIpAddress: 'N/A',\r\n managedBy: 'Cisco',\r\n softwareChannel: 'Unknown',\r\n softwareVersion: 'N/A',\r\n lines: primaryNumber ? [{\r\n name: workspaceRes.workspaceName || '',\r\n number: primaryNumber.external || primaryNumber.extension || 'NA',\r\n registered: !!device?.registered,\r\n }] : [],\r\n };\r\n }\r\n\r\n private getCucmDetails(workspace: Workspace): Observable<WorkspaceDetails> {\r\n const siteId = String(workspace.siteId);\r\n const params = { siteId, workspaceId: workspace.cucmDeviceName ?? workspace.device.name };\r\n\r\n return forkJoin([\r\n this.apiService.fetch(this.buildUrl(API.DETAILS.CUCM.WORKSPACE, params)),\r\n this.apiService.fetch(this.buildUrl(API.DETAILS.CUCM.SITE, { siteId })),\r\n ]).pipe(\r\n map(([workspaceRes, siteRes]: [CucmWorkspaceDetailsResponse, CucmSiteResponse]) =>\r\n this.toCucmDetails(workspace, workspaceRes, siteRes)),\r\n );\r\n }\r\n\r\n private toCucmDetails(\r\n workspace: Workspace,\r\n workspaceRes: CucmWorkspaceDetailsResponse,\r\n siteRes: CucmSiteResponse,\r\n ): WorkspaceDetails {\r\n const device = workspaceRes.device;\r\n const directoryNumber = device.associatedDNs?.[0]?.directoryNumber ?? '';\r\n const sipAddress = `${(device.name || workspace.displayName || 'workspace').toLowerCase()}@tukidev.rooms.webex.com`;\r\n const address = [siteRes.address2, siteRes.address3].filter(Boolean).join(', ');\r\n\r\n return {\r\n issues: this.buildIssues(workspace.typeLabel, workspace.capacity),\r\n location: {\r\n country: siteRes.country || 'Not set',\r\n address: address || 'Address not available',\r\n },\r\n calling: {\r\n license: workspace.callingLicense || 'Cisco Webex Calling Professional Workspace',\r\n sipAddress,\r\n directoryNumber: directoryNumber || 'Not assigned',\r\n routePartition: device.associatedDNs?.[0]?.routePartitionName || 'Not set',\r\n callingSearchSpace: device.callingSearchSpaceName || 'Not set',\r\n securityProfile: device.securityProfile || 'Not set',\r\n },\r\n schedulingConfigured: false,\r\n plannedMaintenanceEnabled: false,\r\n notes: null,\r\n device: this.buildCucmDeviceDetails(workspaceRes),\r\n };\r\n }\r\n\r\n private buildCucmDeviceDetails(workspaceRes: CucmWorkspaceDetailsResponse): WorkspaceDeviceDetails {\r\n const device = workspaceRes.device;\r\n const isRegistered = (device.deviceRegStatus || '').toLowerCase() === 'registered';\r\n\r\n return {\r\n model: device.deviceType || 'Unknown device',\r\n registrationStatus: device.deviceRegStatus || 'Not Registered',\r\n mac: workspaceRes.workspaceDevices?.[0]?.mac || 'N/A',\r\n lineCount: workspaceRes.lines?.length ?? null,\r\n hostIpAddress: device.ipAddress || 'N/A',\r\n remoteIpAddress: 'N/A',\r\n managedBy: 'Cisco',\r\n softwareChannel: 'Unknown',\r\n softwareVersion: device.firmwareVersion || 'N/A',\r\n lines: (workspaceRes.lines || []).map(line => ({\r\n name: line.alertingName || line.description || '',\r\n number: line.directoryNumber?.directoryNumber || 'NA',\r\n registered: isRegistered,\r\n })),\r\n };\r\n }\r\n\r\n private buildUrl(template: string, params: Record<string, string>): string {\r\n return Object.keys(params).reduce((url, key) => url.replace(`:${key}`, params[key]), template);\r\n }\r\n\r\n private buildIssues(typeLabel: string | null | undefined, capacity: number | null | undefined): WorkspaceIssue[] {\r\n const timestamp = this.formatTimestamp(new Date());\r\n\r\n return [\r\n !typeLabel || typeLabel === 'No type' || typeLabel.toLowerCase() === 'notset' ? {\r\n id: 'type',\r\n message: 'Workspace type not set',\r\n timestamp,\r\n actionLabel: 'Assign type',\r\n description: 'Adding a type specifies what the workspace is used for.',\r\n suggestedAction: 'Set a type for this workspace.',\r\n } : null,\r\n capacity == null ? {\r\n id: 'capacity',\r\n message: 'Workspace capacity not set',\r\n timestamp,\r\n actionLabel: 'Set capacity',\r\n description: 'Adding a capacity specifies how many people can use this workspace.',\r\n suggestedAction: 'Set a capacity for this workspace.',\r\n } : null,\r\n ].filter((issue): issue is NonNullable<typeof issue> => issue !== null);\r\n }\r\n\r\n private formatTimestamp(date: Date): string {\r\n return date.toLocaleString('en-US', {\r\n year: '2-digit',\r\n month: 'numeric',\r\n day: 'numeric',\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n}\r\n","import { Component, ViewEncapsulation } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-loader',\r\n templateUrl: './app-loader.component.html',\r\n styleUrls: ['./app-loader.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class AppLoaderComponent {\r\n constructor() {\r\n }\r\n\r\n}\r\n","<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","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { Workspace, WorkspaceDevice, WorkspaceDeviceDetails } from '../../types/workspace';\r\nimport { getDeviceIcon } from '../../utils/device-icon';\r\n\r\n@Component({\r\n selector: 'tk-workspace-device-detail',\r\n templateUrl: './workspace-device-detail.component.html',\r\n styleUrls: ['./workspace-device-detail.component.scss'],\r\n})\r\nexport class WorkspaceDeviceDetailComponent {\r\n @Input() workspace!: Workspace;\r\n @Input() device: WorkspaceDevice | null = null;\r\n @Input() details: WorkspaceDeviceDetails | null = null;\r\n @Input() isLoading = false;\r\n\r\n @Output() back = new EventEmitter<void>();\r\n\r\n tags: string[] = [];\r\n isAddingTag = false;\r\n newTag = '';\r\n hotelingEnabled = false;\r\n guestHoursLimit = 0;\r\n readonly hotelingTimeHours = Array.from({ length: 24 }, (_, index) => index);\r\n\r\n get deviceLabel(): string {\r\n return this.details?.model || this.device?.label || 'Device';\r\n }\r\n\r\n get deviceIcon(): string {\r\n return getDeviceIcon(this.details?.model || this.device?.model);\r\n }\r\n\r\n get isRegistered(): boolean {\r\n return (this.details?.registrationStatus || '').toLowerCase() === 'registered';\r\n }\r\n\r\n onBack(): void {\r\n this.back.emit();\r\n }\r\n\r\n showTagInput(): void {\r\n this.isAddingTag = true;\r\n }\r\n\r\n onTagInputBlur(): void {\r\n const value = this.newTag.trim();\r\n if (value) {\r\n this.tags.push(value);\r\n }\r\n this.newTag = '';\r\n this.isAddingTag = false;\r\n }\r\n\r\n removeTag(index: number): void {\r\n this.tags.splice(index, 1);\r\n }\r\n}\r\n","<button type=\"button\" class=\"tk-workspace-device-detail__breadcrumb\" (click)=\"onBack()\">\r\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-left-bold.svg\" alt=\"Back\" />\r\n Devices\r\n</button>\r\n\r\n<app-loader *ngIf=\"isLoading\"></app-loader>\r\n\r\n<ng-container *ngIf=\"!isLoading\">\r\n <div class=\"tk-workspace-device-detail__header\">\r\n <img class=\"tk-workspace-device-detail__icon\" [src]=\"deviceIcon\" [alt]=\"deviceLabel\" />\r\n <div class=\"tk-workspace-device-detail__title-block\">\r\n <h1 class=\"tk-workspace-device-detail__name\">{{ deviceLabel }}</h1>\r\n <div class=\"tk-workspace-device-detail__meta\">\r\n <span class=\"tk-workspace-device-detail__meta-pill\">\r\n <span class=\"tk-workspace-device-detail__status-dot\" [class.tk-workspace-device-detail__status-dot--active]=\"isRegistered\"></span>\r\n {{ details?.registrationStatus || 'Not Registered' }}\r\n </span>\r\n <span class=\"tk-workspace-device-detail__meta-sep\"></span>\r\n <span>Phones</span>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"tk-workspace-device-detail__actions-button\" [matMenuTriggerFor]=\"actionsMenu\">\r\n Actions\r\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\r\n </button>\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item disabled>More actions coming soon</button>\r\n </mat-menu>\r\n <a href=\"javascript:void(0)\" class=\"tk-workspace-device-detail__workspace-link\">{{ workspace.displayName }}</a>\r\n </div>\r\n\r\n <div class=\"tk-workspace-device-detail__grid\">\r\n <div class=\"tk-workspace-device-detail__col\">\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Details</h2>\r\n <div class=\"tk-workspace-device-detail__row\">\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.lineCount ?? 'N/A' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Lines</span>\r\n </div>\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.mac || 'N/A' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">MAC address</span>\r\n </div>\r\n </div>\r\n <hr class=\"tk-workspace-device-detail__divider\" />\r\n <div class=\"tk-workspace-device-detail__row\">\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.hostIpAddress || 'N/A' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Host IP address</span>\r\n </div>\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.remoteIpAddress || 'N/A' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Remote IP address</span>\r\n </div>\r\n </div>\r\n <hr class=\"tk-workspace-device-detail__divider\" />\r\n <div class=\"tk-workspace-device-detail__row\">\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.managedBy || 'Cisco' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Managed By</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <div class=\"tk-workspace-device-detail__card-header\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Software</h2>\r\n <div class=\"tk-workspace-device-detail__settings-icon-wrapper\">\r\n <img class=\"tk-workspace-device-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div class=\"tk-workspace-device-detail__row\">\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.softwareChannel || 'Unknown' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Software Channel</span>\r\n </div>\r\n <div class=\"tk-workspace-device-detail__row-half\">\r\n <span class=\"tk-workspace-device-detail__value\">{{ details?.softwareVersion || 'N/A' }}</span>\r\n <span class=\"tk-workspace-device-detail__label\">Software version</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Tags</h2>\r\n <div class=\"tk-workspace-device-detail__tags\">\r\n <div *ngFor=\"let tag of tags; let i = index\" class=\"tk-workspace-device-detail__tag\">\r\n <span>{{ tag }}</span>\r\n <mat-icon class=\"tk-workspace-device-detail__tag-remove\" (click)=\"removeTag(i)\">close</mat-icon>\r\n </div>\r\n <button type=\"button\" class=\"tk-workspace-device-detail__tag tk-workspace-device-detail__tag--add\" (click)=\"showTagInput()\">\r\n <mat-icon class=\"tk-workspace-device-detail__tag-add-icon\">add</mat-icon>\r\n Add tag\r\n </button>\r\n <input\r\n *ngIf=\"isAddingTag\"\r\n class=\"tk-workspace-device-detail__tag-input\"\r\n type=\"text\"\r\n placeholder=\"Enter tag...\"\r\n [(ngModel)]=\"newTag\"\r\n (blur)=\"onTagInputBlur()\" />\r\n </div>\r\n </section>\r\n </div>\r\n\r\n <div class=\"tk-workspace-device-detail__col\">\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Issues & Information</h2>\r\n <div class=\"tk-workspace-device-detail__no-issues\">\r\n <mat-icon class=\"tk-workspace-device-detail__no-issues-icon\">check_circle</mat-icon>\r\n No reported issues at this time\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Hoteling</h2>\r\n <p class=\"tk-workspace-device-detail__hint\">Allow this device to be used as a Hoteling Host by visiting guests.</p>\r\n <div class=\"tk-workspace-device-detail__hoteling-toggle-row\">\r\n <label class=\"tk-workspace-device-detail__toggle\">\r\n <input type=\"checkbox\" [(ngModel)]=\"hotelingEnabled\" />\r\n <span class=\"tk-workspace-device-detail__toggle-slider\"></span>\r\n </label>\r\n <img\r\n class=\"tk-workspace-device-detail__meta-icon\"\r\n src=\"assets/icons/info-circle-regular.svg\"\r\n alt=\"\"\r\n matTooltip=\"Enabling this device for Hoteling means that a guest can log into this host and use this phone as if it were their own.\" />\r\n </div>\r\n <p class=\"tk-workspace-device-detail__hint\">Limit the time a guest can use this phone to</p>\r\n <select class=\"tk-workspace-device-detail__select\" [(ngModel)]=\"guestHoursLimit\">\r\n <option *ngFor=\"let hour of hotelingTimeHours\" [value]=\"hour\">{{ hour }}</option>\r\n </select>\r\n </section>\r\n\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Device Management</h2>\r\n <p class=\"tk-workspace-device-detail__hint\">The users and workspaces that appear on this device are displayed below in the order of appearance.</p>\r\n <p class=\"tk-workspace-device-detail__hint\">\r\n To add and remove users and workspaces, select <b>Configure Lines</b>.<br />\r\n To customize the programmable Line Keys, select <b>Configure Layout</b>.<br />\r\n To set up the display settings and dialing options, select <b>Device Settings</b>.\r\n </p>\r\n <div class=\"tk-workspace-device-detail__table-wrapper\">\r\n <table class=\"tk-workspace-device-detail__table\">\r\n <thead>\r\n <tr>\r\n <th>Index #</th>\r\n <th>Name</th>\r\n <th>Number/Extension</th>\r\n <th>Registered</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let line of details?.lines; let i = index\">\r\n <td>{{ i + 1 }}</td>\r\n <td>{{ line.name || 'NA' }}</td>\r\n <td>{{ line.number }}</td>\r\n <td>\r\n <span *ngIf=\"line.registered; else notRegistered\" class=\"tk-workspace-device-detail__registered\">Registered</span>\r\n <ng-template #notRegistered>\r\n <mat-icon class=\"tk-workspace-device-detail__warning-icon\" matTooltip=\"Unregistered\">warning</mat-icon>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"!details?.lines?.length\">\r\n <td colspan=\"4\" class=\"tk-workspace-device-detail__table-empty\">No lines configured.</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"tk-workspace-device-detail__configure-lines\">\r\n <div class=\"tk-workspace-device-detail__configure-line\">\r\n <span>Configure Lines</span>\r\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\r\n </div>\r\n <hr class=\"tk-workspace-device-detail__divider\" />\r\n <div class=\"tk-workspace-device-detail__configure-line\">\r\n <span>Configure Layout</span>\r\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\r\n </div>\r\n <hr class=\"tk-workspace-device-detail__divider\" />\r\n <div class=\"tk-workspace-device-detail__configure-line\">\r\n <span>Device Settings</span>\r\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-device-detail__card\">\r\n <h2 class=\"tk-workspace-device-detail__card-title\">Support</h2>\r\n <div class=\"tk-workspace-device-detail__configure-lines\">\r\n <div class=\"tk-workspace-device-detail__configure-line\">\r\n <span>Meetings & Calls</span>\r\n <span class=\"tk-workspace-device-detail__configure-manage\">Go to troubleshooting</span>\r\n </div>\r\n <hr class=\"tk-workspace-device-detail__divider\" />\r\n <div class=\"tk-workspace-device-detail__configure-line\">\r\n <span>Device Logs</span>\r\n <span class=\"tk-workspace-device-detail__configure-manage\">Manage</span>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n</ng-container>\r\n","import { Location } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { Workspace, WorkspaceConnectionType, WorkspaceDetails, WorkspaceDevice } from '../../types/workspace';\r\nimport { WorkspaceDetailService } from '../../services/workspace-detail.service';\r\nimport { getDeviceIcon } from '../../utils/device-icon';\r\n\r\nexport type WorkspaceDetailTab = 'overview' | 'calling';\r\nexport type WorkspaceDetailView = 'overview' | 'device';\r\n\r\n@Component({\r\n selector: 'tk-workspace-detail',\r\n templateUrl: './workspace-detail.component.html',\r\n styleUrls: ['./workspace-detail.component.scss'],\r\n})\r\nexport class WorkspaceDetailComponent implements OnInit {\r\n @Input() workspace!: Workspace;\r\n @Input() connectionType: WorkspaceConnectionType = 'di';\r\n @Input() customerId!: string;\r\n\r\n @Output() back = new EventEmitter<void>();\r\n\r\n activeTab: WorkspaceDetailTab = 'overview';\r\n view: WorkspaceDetailView = 'overview';\r\n selectedDevice: WorkspaceDevice | null = null;\r\n details: WorkspaceDetails | null = null;\r\n isLoading = false;\r\n expandedIssueId: string | null = null;\r\n\r\n constructor(\r\n private workspaceDetailService: WorkspaceDetailService,\r\n private location: Location,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.isLoading = true;\r\n this.workspaceDetailService.getByWorkspace(this.workspace, this.connectionType, this.customerId).subscribe({\r\n next: details => {\r\n this.details = details;\r\n if (details.capacity != null) {\r\n this.workspace = { ...this.workspace, capacity: details.capacity };\r\n }\r\n this.isLoading = false;\r\n },\r\n error: () => {\r\n this.isLoading = false;\r\n },\r\n });\r\n this.updateUrl();\r\n }\r\n\r\n get callerIdLabel(): string {\r\n const calling = this.details?.calling;\r\n if (!calling?.externalCallerIdNumber) {\r\n return 'Not set';\r\n }\r\n return calling.externalCallerIdName\r\n ? `${calling.externalCallerIdName}: ${calling.externalCallerIdNumber}`\r\n : `Location number: ${calling.externalCallerIdNumber}`;\r\n }\r\n\r\n get deviceName(): string {\r\n if (this.connectionType === 'webex') {\r\n return this.workspace.device?.webexUUID || this.workspace.device?.name || this.workspace.id;\r\n }\r\n return this.workspace.device?.name || this.workspace.id;\r\n }\r\n\r\n resolveIcon(model?: string): string {\r\n return getDeviceIcon(model);\r\n }\r\n\r\n toggleIssue(issueId: string): void {\r\n this.expandedIssueId = this.expandedIssueId === issueId ? null : issueId;\r\n }\r\n\r\n selectTab(tab: WorkspaceDetailTab): void {\r\n this.activeTab = tab;\r\n this.updateUrl();\r\n }\r\n\r\n onBack(): void {\r\n this.location.replaceState('/workspaces');\r\n this.back.emit();\r\n }\r\n\r\n onOpenDevice(device: WorkspaceDevice): void {\r\n this.selectedDevice = device;\r\n this.view = 'device';\r\n this.location.replaceState(`/workspaces/${this.deviceName}/device`);\r\n }\r\n\r\n onDeviceBack(): void {\r\n this.view = 'overview';\r\n this.selectedDevice = null;\r\n this.updateUrl();\r\n }\r\n\r\n private updateUrl(): void {\r\n this.location.replaceState(`/workspaces/${this.deviceName}/${this.activeTab}`);\r\n }\r\n}\r\n","<ng-container *ngIf=\"view === 'overview'; else deviceDetailView\">\r\n<button type=\"button\" class=\"tk-workspace-detail__breadcrumb\" (click)=\"onBack()\">\r\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-left-bold.svg\" alt=\"Back\" />\r\n Workspaces\r\n</button>\r\n\r\n<div class=\"tk-workspace-detail__header\">\r\n <span class=\"tk-workspace-detail__icon\">\r\n <img src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\r\n </span>\r\n <div class=\"tk-workspace-detail__title-block\">\r\n <h1 class=\"tk-workspace-detail__name\">{{ workspace.displayName }}</h1>\r\n <div class=\"tk-workspace-detail__meta\">\r\n <span class=\"tk-workspace-detail__meta-pill\">\r\n <span class=\"tk-workspace-detail__status-dot\"></span>\r\n Live status unavailable\r\n </span>\r\n <span class=\"tk-workspace-detail__meta-sep\"></span>\r\n <span class=\"tk-workspace-detail__meta-type\">Type: {{ workspace.typeLabel === 'No type' ? 'Not set' : workspace.typeLabel }}</span>\r\n <span class=\"tk-workspace-detail__meta-sep\"></span>\r\n <span class=\"tk-workspace-detail__meta-pill\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/people-regular.svg\" alt=\"\" />\r\n Capacity: {{ workspace.capacity ?? 'Not set' }}\r\n </span>\r\n <span class=\"tk-workspace-detail__meta-sep\"></span>\r\n <span class=\"tk-workspace-detail__meta-pill tk-workspace-detail__meta-pill--muted\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/device-in-room-regular.svg\" alt=\"\" />\r\n Size not set\r\n </span>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"tk-workspace-detail__actions-button\" [matMenuTriggerFor]=\"actionsMenu\">\r\n Actions\r\n <img style=\"width: 16px; height: 16px;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\r\n </button>\r\n <mat-menu #actionsMenu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item disabled>More actions coming soon</button>\r\n </mat-menu>\r\n</div>\r\n\r\n<nav class=\"tk-workspace-detail__tabs\">\r\n <button\r\n type=\"button\"\r\n class=\"tk-workspace-detail__tab\"\r\n [class.tk-workspace-detail__tab--active]=\"activeTab === 'overview'\"\r\n (click)=\"selectTab('overview')\">\r\n Overview\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tk-workspace-detail__tab\"\r\n [class.tk-workspace-detail__tab--active]=\"activeTab === 'calling'\"\r\n (click)=\"selectTab('calling')\">\r\n Calling\r\n </button>\r\n</nav>\r\n\r\n<app-loader *ngIf=\"isLoading\"></app-loader>\r\n\r\n<ng-container *ngIf=\"details\">\r\n <div class=\"tk-workspace-detail__grid\" *ngIf=\"activeTab === 'overview'\">\r\n <div class=\"tk-workspace-detail__col\">\r\n <section class=\"tk-workspace-detail__card\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Issues & Information</h2>\r\n <div class=\"tk-workspace-detail__no-issues\" *ngIf=\"!details.issues.length\">\r\n <mat-icon class=\"tk-workspace-detail__no-issues-icon\">check_circle</mat-icon>\r\n There are currently no issues detected in your workspace.\r\n </div>\r\n <div class=\"tk-workspace-detail__issue\" *ngFor=\"let issue of details.issues\">\r\n <div class=\"tk-workspace-detail__issue-row\">\r\n <div class=\"tk-workspace-detail__issue-info\">\r\n <div class=\"tk-workspace-detail__issue-message-row\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n <div class=\"tk-workspace-detail__issue-message\">{{ issue.message }}</div>\r\n </div>\r\n <div class=\"tk-workspace-detail__issue-timestamp\">{{ issue.timestamp }}</div>\r\n </div>\r\n <div class=\"tk-workspace-detail__issue-actions\">\r\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">{{ issue.actionLabel }}</button>\r\n <button\r\n type=\"button\"\r\n class=\"tk-workspace-detail__issue-toggle\"\r\n [class.tk-workspace-detail__issue-toggle--open]=\"expandedIssueId === issue.id\"\r\n [attr.aria-expanded]=\"expandedIssueId === issue.id\"\r\n (click)=\"'void 0'\">\r\n <img style=\"width: .75rem; height: .75rem;\" src=\"assets/icons/arrow-down-regular.svg\" alt=\"Expand\" />\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"tk-workspace-detail__issue-details\" *ngIf=\"expandedIssueId === issue.id\">\r\n <p>{{ issue.description }}</p>\r\n <p>\r\n Suggested action:<br />\r\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__issue-link\">{{ issue.suggestedAction }}</a>\r\n </p>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card\">\r\n <div class=\"tk-workspace-detail__card-header\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Devices</h2>\r\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div class=\"tk-workspace-detail__devices\" *ngIf=\"workspace.devices.length; else noDevices\">\r\n <div class=\"tk-workspace-detail__device\" *ngFor=\"let device of workspace.devices\">\r\n <img class=\"tk-workspace-detail__device-icon\" [src]=\"resolveIcon(device.model)\" [alt]=\"device.label\" />\r\n <div class=\"tk-workspace-detail__device-info\">\r\n <div style=\"display: flex; gap: 0.5rem; align-items: center;\">\r\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__device-link\" (click)=\"onOpenDevice(device)\">{{ device.label }}</a>\r\n <span class=\"tk-workspace-detail__device-primary\">Primary</span>\r\n </div>\r\n <div class=\"tk-workspace-detail__device-status\">\r\n <span class=\"tk-workspace-detail__status-dot\"></span>\r\n Status unavailable\r\n <img class=\"tk-workspace-detail__info-icon\" style=\"width: 12px; height: 12px;\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #noDevices>\r\n <div class=\"tk-workspace-detail__no-devices\">\r\n <img class=\"tk-workspace-detail__no-devices-icon\" src=\"assets/icons/desk-phone-bold.svg\" alt=\"\" />\r\n <h3 class=\"tk-workspace-detail__card-heading\">Add device</h3>\r\n <p class=\"tk-workspace-detail__card-text\">Add an IP Phone to collaborate in this workspace.</p>\r\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Add device</button>\r\n </div>\r\n </ng-template>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card\">\r\n <div class=\"tk-workspace-detail__card-header\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Calling</h2>\r\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div class=\"tk-workspace-detail__calling-license\">\r\n <img style=\"width: 20px; height: 20px;\" src=\"assets/icons/handset-regular.svg\" alt=\"\" />\r\n {{ details.calling.license }}\r\n </div>\r\n <hr class=\"tk-workspace-detail__divider\" />\r\n <div class=\"tk-workspace-detail__row tk-workspace-detail__row--kv\">\r\n <span class=\"tk-workspace-detail__row-label\">Cisco Webex SIP Address</span>\r\n <span class=\"tk-workspace-detail__row-value\">{{ details.calling.sipAddress }}</span>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\" *ngIf=\"!details.schedulingConfigured\">\r\n <div class=\"tk-workspace-detail__card-header\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Scheduling</h2>\r\n </div>\r\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/calendar-month-regular.svg\" alt=\"\" />\r\n <h3 class=\"tk-workspace-detail__card-heading\">Choose scheduling</h3>\r\n <p class=\"tk-workspace-detail__card-text\">Choose a calendar service or setup hot-desking for this workspace.</p>\r\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Choose scheduling</button>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\">\r\n <div class=\"tk-workspace-detail__card-header\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Meetings</h2>\r\n </div>\r\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n <h3 class=\"tk-workspace-detail__card-heading\">Device hosted meetings unavailable</h3>\r\n <p class=\"tk-workspace-detail__card-text\">Service not supported by Cisco IP phones</p>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card\">\r\n <h2 class=\"tk-workspace-detail__card-title\">\r\n Planned Maintenance\r\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n </h2>\r\n <div class=\"tk-workspace-detail__row\">\r\n <img style=\"width: 20px; height: 20px;\" src=\"assets/icons/tools-regular.svg\" alt=\"\">\r\n <span>{{ details.plannedMaintenanceEnabled ? 'On' : 'Off' }}</span>\r\n </div>\r\n <hr class=\"tk-workspace-detail__divider\" />\r\n <div class=\"tk-workspace-detail__row tk-workspace-detail__row--with-action\">\r\n <div class=\"tk-workspace-detail__row\" style=\"flex-direction: column; gap: 1rem;\">\r\n <div style=\"display: flex; gap: 1rem; align-items: center;\">\r\n <img class=\"tk-workspace-detail__meta-icon\" style=\"width: 20px; height: 20px;\" src=\"assets/icons/calendar-month-regular.svg\" alt=\"\" />\r\n <div>Schedule</div>\r\n </div>\r\n <div class=\"tk-workspace-detail__row-hint\">No schedule set</div>\r\n </div>\r\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Edit schedule</button>\r\n </div>\r\n </section>\r\n\r\n <section class=\"tk-workspace-detail__card tk-workspace-detail__card--centered\" *ngIf=\"!details.notes\">\r\n <div class=\"tk-workspace-detail__card-header\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Add Notes</h2>\r\n </div>\r\n <img class=\"tk-workspace-detail__card-icon\" src=\"assets/icons/notes-regular.svg\" alt=\"\" />\r\n <h3 class=\"tk-workspace-detail__card-heading\">Add notes</h3>\r\n <p class=\"tk-workspace-detail__card-text\">Write a note about this workspace.</p>\r\n <button type=\"button\" class=\"tk-workspace-detail__pill-button\">Add notes</button>\r\n </section>\r\n </div>\r\n\r\n <div class=\"tk-workspace-detail__col\">\r\n <section class=\"tk-workspace-detail__card\">\r\n <div class=\"tk-workspace-detail__card-header\" style=\"margin-bottom: 1.25rem;\">\r\n <h2 class=\"tk-workspace-detail__card-title\">Location</h2>\r\n <div class=\"tk-workspace-detail__card-title__settings_icon_wrapper\">\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/settings-regular.svg\" alt=\"\" />\r\n </div>\r\n </div>\r\n <div class=\"tk-workspace-detail__location\">\r\n <!-- <mat-icon>location_on</mat-icon> -->\r\n <img class=\"tk-workspace-detail__meta-icon\" src=\"assets/icons/location-regular.svg\" alt=\"\" />\r\n <div style=\"display: flex; flex-direction: column; gap: .25rem;\">\r\n <a href=\"javascript:void(0)\" class=\"tk-workspace-detail__location-link\">{{ details.location.country }}</a>\r\n <div class=\"tk-workspace-detail__location-address\">{{ details.location.address }}</div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tk-workspace-detail__col\" *ngIf=\"activeTab === 'calling'\">\r\n <section class=\"tk-workspace-detail__card tk-workspace-detail__numbers-card\">\r\n <h2 class=\"tk-workspace-detail__numbers-title\">Numbers</h2>\r\n\r\n <div class=\"tk-workspace-detail__numbers-content\">\r\n <div class=\"tk-workspace-detail__numbers-row\">\r\n <div class=\"tk-workspace-detail__numbers-row-label\">\r\n Directory number\r\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n </div>\r\n <table class=\"tk-workspace-detail__numbers-table\">\r\n <thead>\r\n <tr>\r\n <th>Type</th>\r\n <th>Phone Number</th>\r\n <th>Extension</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td><span class=\"tk-workspace-detail__badge\">Primary</span></td>\r\n <td>\r\n {{ details.calling.directoryNumber }}\r\n <img class=\"tk-workspace-detail__copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\r\n </td>\r\n <td>\r\n {{ details.calling.extension || 'Not set' }}\r\n <img class=\"tk-workspace-detail__copy-icon\" src=\"assets/icons/copy-regular.svg\" alt=\"Copy\" />\r\n </td>\r\n <td class=\"tk-workspace-detail__numbers-chevron-cell\">\r\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <hr class=\"tk-workspace-detail__divider\" />\r\n\r\n <div class=\"tk-workspace-detail__numbers-row\">\r\n <div class=\"tk-workspace-detail__numbers-row-label\">\r\n Caller ID\r\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n </div>\r\n <div class=\"tk-workspace-detail__numbers-row-value\">\r\n <span>{{ callerIdLabel }}</span>\r\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\r\n </div>\r\n </div>\r\n\r\n <hr class=\"tk-workspace-detail__divider\" />\r\n\r\n <div class=\"tk-workspace-detail__numbers-row\">\r\n <div class=\"tk-workspace-detail__numbers-row-label\">\r\n Emergency Calling\r\n <img class=\"tk-workspace-detail__info-icon\" src=\"assets/icons/info-circle-regular.svg\" alt=\"\" />\r\n </div>\r\n <div class=\"tk-workspace-detail__numbers-row-value\">\r\n <span>Not set</span>\r\n <img class=\"tk-workspace-detail__row-chevron\" src=\"assets/icons/arrow-right-regular.svg\" alt=\"Expand\" />\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-container>\r\n</ng-container>\r\n\r\n<ng-template #deviceDetailView>\r\n <tk-workspace-device-detail\r\n [workspace]=\"workspace\"\r\n [device]=\"selectedDevice\"\r\n [details]=\"details?.device ?? null\"\r\n [isLoading]=\"isLoading\"\r\n (back)=\"onDeviceBack()\">\r\n </tk-workspace-device-detail>\r\n</ng-template>\r\n","import { Location } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { map, Subscription, switchMap, takeWhile, timer } from 'rxjs';\r\nimport { APIService } from './services/api.service';\r\nimport { ApiWebexService } from './services/api-webex.service';\r\nimport { FirmwareDeviceMap, WorkspacesMigrationService } from './services/workspaces-migration.service';\r\nimport { WorkspacesService } from './services/workspaces.service';\r\nimport { Workspace, WorkspaceConnectionType, WorkspaceDeviceRecord, WorkspaceOpenEvent } from './types/workspace';\r\nimport { WorkspaceConfirmDialogComponent } from './components/workspace-confirm-dialog/workspace-confirm-dialog.component';\r\n\r\ntype WorkspacesView = 'list' | 'detail';\r\n\r\ntype WorkspacesTab = 'workspaces' | 'insights' | 'integrations' | 'settings';\r\n\r\ninterface WorkspacesTabDefinition {\r\n id: WorkspacesTab;\r\n label: string;\r\n icon: string;\r\n}\r\n\r\n@Component({\r\n selector: 'tk-workspaces',\r\n templateUrl: './workspaces.component.html',\r\n styleUrls: ['./workspaces.component.scss'],\r\n})\r\nexport class WorkspacesComponent implements OnInit, OnDestroy {\r\n @Input() host!: string;\r\n @Input() token!: string;\r\n @Input() customerId!: string;\r\n\r\n @Output() addWorkspace = new EventEmitter<void>();\r\n @Output() openWorkspace = new EventEmitter<string>();\r\n @Output() addDevice = new EventEmitter<string>();\r\n\r\n readonly tabs: WorkspacesTabDefinition[] = [\r\n { id: 'workspaces', label: 'Workspaces', icon: 'assets/icons/device-in-room-regular.svg' },\r\n { id: 'insights', label: 'Insights', icon: 'assets/icons/analysis-regular.svg' },\r\n { id: 'integrations', label: 'Integrations', icon: 'assets/icons/integrations-regular.svg' },\r\n { id: 'settings', label: 'Settings', icon: 'assets/icons/tools-regular.svg' },\r\n ];\r\n\r\n activeTab: WorkspacesTab = 'workspaces';\r\n\r\n view: WorkspacesView = 'list';\r\n selectedWorkspace: Workspace | null = null;\r\n selectedConnectionType: WorkspaceConnectionType = 'di';\r\n\r\n workspaces: Workspace[] = [];\r\n isLoading = false;\r\n\r\n pageIndex = 0;\r\n pageSize = 10;\r\n total = 0;\r\n\r\n searchTerm = '';\r\n typeFilter = '';\r\n locationFilter = '';\r\n\r\n pendingWorkspaceIds = new Set<string>();\r\n\r\n private readonly subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n private apiService: APIService,\r\n private apiWebexService: ApiWebexService,\r\n private workspacesService: WorkspacesService,\r\n private migrationService: WorkspacesMigrationService,\r\n private dialog: MatDialog,\r\n private location: Location,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.apiService.token = this.token;\r\n this.apiService.apiUrl = this.host + '/dcp';\r\n this.apiWebexService.token = this.token;\r\n this.apiWebexService.apiUrl = this.host + '/webex';\r\n this.fetchWorkspaces();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.forEach(subscription => subscription.unsubscribe());\r\n }\r\n\r\n get typeOptions(): string[] {\r\n return [...new Set(this.workspaces.map(workspace => workspace.typeLabel).filter(Boolean))];\r\n }\r\n\r\n get locationOptions(): string[] {\r\n return [...new Set(this.workspaces.map(workspace => workspace.location).filter(Boolean))];\r\n }\r\n\r\n private get filteredWorkspacesAll(): Workspace[] {\r\n const term = this.searchTerm.trim().toLowerCase();\r\n return this.workspaces.filter(workspace =>\r\n (!term || workspace.displayName.toLowerCase().includes(term) || workspace.location.toLowerCase().includes(term)) &&\r\n (!this.typeFilter || workspace.typeLabel === this.typeFilter) &&\r\n (!this.locationFilter || workspace.location === this.locationFilter)\r\n );\r\n }\r\n\r\n get filteredWorkspaces(): Workspace[] {\r\n const start = this.pageIndex * this.pageSize;\r\n return this.filteredWorkspacesAll.slice(start, start + this.pageSize);\r\n }\r\n\r\n get filteredTotal(): number {\r\n return this.filteredWorkspacesAll.length;\r\n }\r\n\r\n selectTab(tab: WorkspacesTab): void {\r\n this.activeTab = tab;\r\n }\r\n\r\n onOpenWorkspace({ id, connectionType }: WorkspaceOpenEvent): void {\r\n const workspace = this.workspaces.find(item => item.id === id) ?? null;\r\n this.openWorkspace.emit(id);\r\n\r\n if (!workspace) {\r\n return;\r\n }\r\n\r\n this.selectedWorkspace = workspace;\r\n this.selectedConnectionType = connectionType;\r\n this.view = 'detail';\r\n }\r\n\r\n onBackToList(): void {\r\n this.view = 'list';\r\n this.selectedWorkspace = null;\r\n this.location.replaceState('/workspaces');\r\n }\r\n\r\n onSearchChange(term: string): void {\r\n this.searchTerm = term;\r\n this.pageIndex = 0;\r\n }\r\n\r\n onTypeFilterChange(type: string): void {\r\n this.typeFilter = type;\r\n this.pageIndex = 0;\r\n }\r\n\r\n onLocationFilterChange(location: string): void {\r\n this.locationFilter = location;\r\n this.pageIndex = 0;\r\n }\r\n\r\n onPageChange({ pageIndex, pageSize }: { pageIndex: number; pageSize: number }): void {\r\n this.pageIndex = pageIndex;\r\n this.pageSize = pageSize;\r\n }\r\n\r\n onMoveToMT(workspace: Workspace): void {\r\n const dialogRef = this.dialog.open(WorkspaceConfirmDialogComponent, {\r\n data: {\r\n title: `Upgrade workspace ${workspace.displayName} to Webex Calling?`,\r\n message: `<p>Upgrading this workspace will prepare it for migration to Webex Calling.</p>\r\n <p>During this process, the workspace configuration will be copied to the Webex Calling environment.\r\n The workspace will remain active on the current system until the Activate step is completed.</p>\r\n <p>Do you want to continue?</p>`,\r\n confirmButtonText: 'Yes, upgrade',\r\n },\r\n });\r\n\r\n dialogRef.beforeClosed().subscribe((result: boolean) => {\r\n if (!result) {\r\n return;\r\n }\r\n this.pendingWorkspaceIds.add(workspace.id);\r\n const subscription = this.migrationService.moveToMT(this.customerId, workspace.device).subscribe({\r\n next: (formId: number) => {\r\n if (formId) {\r\n this.pollMigrationFormStatus(Number(formId), workspace.id);\r\n } else {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n this.fetchWorkspaces();\r\n }\r\n },\r\n error: () => {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n this.fetchWorkspaces();\r\n },\r\n });\r\n this.subscriptions.push(subscription);\r\n });\r\n }\r\n\r\n onEnableWebexCalling(workspace: Workspace): void {\r\n const device = workspace.device;\r\n if (!device.webexUUID || workspace.status !== 'inactive') {\r\n return;\r\n }\r\n\r\n const dialogRef = this.dialog.open(WorkspaceConfirmDialogComponent, {\r\n data: {\r\n title: `Activate workspace ${workspace.displayName} on Multi Tenant?`,\r\n message: `<p>Activating this workspace will perform the cutover to Multi Tenant and complete the migration process.</p>\r\n <p>After activation, the workspace will become active on Multi Tenant and the original workspace will become inactive.</p>\r\n <p>Do you want to continue?</p>`,\r\n confirmButtonText: 'Activate',\r\n },\r\n });\r\n\r\n dialogRef.beforeClosed().subscribe((result: boolean) => {\r\n if (!result) {\r\n return;\r\n }\r\n this.pendingWorkspaceIds.add(workspace.id);\r\n const subscription = this.migrationService\r\n .getMigratedMigrationFormEntities(this.customerId, device.webexUUID as string, 'ORPHANED_DEVICE')\r\n .pipe(map((entities: any[]) => (Array.isArray(entities) ? entities[0] : entities || null)))\r\n .subscribe({\r\n next: (entity: any) => {\r\n const formId = entity?.migrationFormId ?? entity?.id ?? null;\r\n if (!formId) {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n return;\r\n }\r\n const deviceMap = this.buildFirmwareDeviceMap(entity, device);\r\n const upgradeSubscription = this.migrationService\r\n .triggerFirmwareUpgrade(this.customerId, Number(formId), deviceMap)\r\n .subscribe({\r\n next: () => {\r\n window.setTimeout(() => {\r\n this.pollMigrationFormStatus(Number(formId), workspace.id, () => {\r\n this.migrationService.removeUcmLicense(this.customerId, Number(formId)).subscribe();\r\n });\r\n }, 10000);\r\n },\r\n error: () => {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n this.fetchWorkspaces();\r\n },\r\n });\r\n this.subscriptions.push(upgradeSubscription);\r\n },\r\n error: () => {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n },\r\n });\r\n this.subscriptions.push(subscription);\r\n });\r\n }\r\n\r\n onMigrateToUCM(workspace: Workspace): void {\r\n const device = workspace.device;\r\n if (!device.webexUUID || workspace.status !== 'active') {\r\n return;\r\n }\r\n\r\n this.pendingWorkspaceIds.add(workspace.id);\r\n const subscription = this.migrationService\r\n .revertMigration(this.customerId, device.webexUUID)\r\n .pipe(switchMap(() => timer(2000)))\r\n .subscribe({\r\n next: () => {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n this.fetchWorkspaces();\r\n },\r\n error: () => {\r\n this.pendingWorkspaceIds.delete(workspace.id);\r\n this.fetchWorkspaces();\r\n },\r\n });\r\n this.subscriptions.push(subscription);\r\n }\r\n\r\n private pollMigrationFormStatus(formId: number, workspaceId: string, onCompleted?: () => void): void {\r\n const subscription = timer(0, 10000)\r\n .pipe(\r\n switchMap(() => this.migrationService.getMigrationFormStatus(this.customerId, formId)),\r\n takeWhile((response: any) => !this.isTerminalMigrationStatus(response?.status), true),\r\n )\r\n .subscribe({\r\n next: (response: any) => {\r\n const status = this.normalizeMigrationStatus(response?.status);\r\n if (!this.isTerminalMigrationStatus(status)) {\r\n return;\r\n }\r\n this.pendingWorkspaceIds.delete(workspaceId);\r\n this.fetchWorkspaces();\r\n if (status === 'COMPLETED') {\r\n onCompleted?.();\r\n }\r\n },\r\n error: () => {\r\n this.pendingWorkspaceIds.delete(workspaceId);\r\n this.fetchWorkspaces();\r\n },\r\n });\r\n this.subscriptions.push(subscription);\r\n }\r\n\r\n private buildFirmwareDeviceMap(entity: any, device: WorkspaceDeviceRecord): FirmwareDeviceMap {\r\n const deviceMap: FirmwareDeviceMap = {};\r\n const entityDevices: any[] = [\r\n ...(Array.isArray(entity?.devices) ? entity.devices : []),\r\n ...(Array.isArray(entity?.webexMigrationDevices) ? entity.webexMigrationDevices : []),\r\n ];\r\n const sourceDevices = entityDevices.length ? entityDevices : [device];\r\n const cucmId = Number(device.cucmId) || 0;\r\n\r\n sourceDevices.forEach((rawDevice: any) => {\r\n const name: string = rawDevice?.name || device.name || '';\r\n if (!name) {\r\n return;\r\n }\r\n const deviceName = name.includes('SEP') ? name : `SEP${name}`;\r\n if (!deviceMap[cucmId]) {\r\n deviceMap[cucmId] = {};\r\n }\r\n if (!deviceMap[cucmId]['ORPHANED_DEVICE']) {\r\n deviceMap[cucmId]['ORPHANED_DEVICE'] = [];\r\n }\r\n deviceMap[cucmId]['ORPHANED_DEVICE'].push(deviceName);\r\n });\r\n\r\n return deviceMap;\r\n }\r\n\r\n private normalizeMigrationStatus(status: string | null | undefined): string {\r\n return (status || '').toUpperCase();\r\n }\r\n\r\n private isTerminalMigrationStatus(status: string | null | undefined): boolean {\r\n const normalized = this.normalizeMigrationStatus(status);\r\n return normalized === 'COMPLETED' || normalized === 'FAILED' || normalized === 'ERROR' || normalized === 'COMPLETED_WITH_ERRORS';\r\n }\r\n\r\n private fetchWorkspaces(): void {\r\n this.isLoading = true;\r\n this.workspacesService.fetchWorkspaces(this.customerId).subscribe({\r\n next: ({ workspaces, total }) => {\r\n this.workspaces = workspaces;\r\n this.total = total;\r\n this.isLoading = false;\r\n },\r\n error: () => {\r\n this.workspaces = [];\r\n this.total = 0;\r\n this.isLoading = false;\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"tk-workspaces\">\r\n <ng-container *ngIf=\"view === 'list'; else detailView\">\r\n <header class=\"tk-workspaces__header\">\r\n <h1 class=\"tk-workspaces__title\">Workspaces</h1>\r\n </header>\r\n\r\n <nav class=\"tk-workspaces__tabs\">\r\n <button\r\n type=\"button\"\r\n *ngFor=\"let tab of tabs\"\r\n class=\"tk-workspaces__tab\"\r\n [class.tk-workspaces__tab--active]=\"activeTab === tab.id\"\r\n (click)=\"selectTab(tab.id)\">\r\n <img class=\"tk-workspaces__tab-icon\" [src]=\"tab.icon\" alt=\"\" />\r\n {{ tab.label }}\r\n </button>\r\n </nav>\r\n\r\n <ng-container *ngIf=\"activeTab === 'workspaces'; else placeholder\">\r\n <app-loader *ngIf=\"isLoading\"></app-loader>\r\n\r\n <tk-workspaces-filters\r\n [resultCount]=\"total\"\r\n [typeOptions]=\"typeOptions\"\r\n [locationOptions]=\"locationOptions\"\r\n (searchChange)=\"onSearchChange($event)\"\r\n (typeChange)=\"onTypeFilterChange($event)\"\r\n (locationChange)=\"onLocationFilterChange($event)\"\r\n (addWorkspace)=\"addWorkspace.emit()\">\r\n </tk-workspaces-filters>\r\n\r\n <tk-workspaces-table\r\n [workspaces]=\"filteredWorkspaces\"\r\n [total]=\"filteredTotal\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pendingWorkspaceIds]=\"pendingWorkspaceIds\"\r\n (openWorkspace)=\"onOpenWorkspace($event)\"\r\n (licenseWithHybrid)=\"onMoveToMT($event)\"\r\n (migrateToMT)=\"onMoveToMT($event)\"\r\n (enableWebexCalling)=\"onEnableWebexCalling($event)\"\r\n (migrateToUCM)=\"onMigrateToUCM($event)\"\r\n (addDevice)=\"addDevice.emit($event)\"\r\n (pageChange)=\"onPageChange($event)\">\r\n </tk-workspaces-table>\r\n </ng-container>\r\n\r\n <ng-template #placeholder>\r\n <div class=\"tk-workspaces__placeholder\">This section isn't available in this widget yet.</div>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-template #detailView>\r\n <tk-workspace-detail\r\n *ngIf=\"selectedWorkspace\"\r\n [workspace]=\"selectedWorkspace\"\r\n [connectionType]=\"selectedConnectionType\"\r\n [customerId]=\"customerId\"\r\n (back)=\"onBackToList()\">\r\n </tk-workspace-detail>\r\n </ng-template>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MaterialModule } from './material.module';\r\nimport { WorkspacesComponent } from './workspaces.component';\r\nimport { WorkspacesFiltersComponent } from './components/workspaces-filters/workspaces-filters.component';\r\nimport { WorkspacesTableComponent } from './components/workspaces-table/workspaces-table.component';\r\nimport { WorkspaceDetailComponent } from './components/workspace-detail/workspace-detail.component';\r\nimport { WorkspaceDeviceDetailComponent } from './components/workspace-device-detail/workspace-device-detail.component';\r\nimport { WorkspaceConfirmDialogComponent } from './components/workspace-confirm-dialog/workspace-confirm-dialog.component';\r\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\r\n\r\n@NgModule({\r\n declarations: [\r\n WorkspacesComponent,\r\n WorkspacesFiltersComponent,\r\n WorkspacesTableComponent,\r\n WorkspaceDetailComponent,\r\n WorkspaceDeviceDetailComponent,\r\n WorkspaceConfirmDialogComponent,\r\n AppLoaderComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n MaterialModule,\r\n ],\r\n exports: [\r\n WorkspacesComponent,\r\n ],\r\n})\r\nexport class WorkspacesModule { }\r\n","/*\r\n * Public API Surface of @tuki-io/tuki-widgets\r\n */\r\n\r\n// Widget Modules\r\nexport * from './src/workspaces.module';\r\n\r\n// Components\r\nexport * from './src/workspaces.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i1.APIService","i1.ApiWebexService","resolveDeviceIcon","i3","i2.ApiWebexService","i5","i6.AppLoaderComponent","i1.WorkspaceDetailService","i5.WorkspaceDeviceDetailComponent","map","i3.WorkspacesService","i4.WorkspacesMigrationService","i6","i7.WorkspacesFiltersComponent","i8.WorkspacesTableComponent","i9.WorkspaceDetailComponent","i10.AppLoaderComponent"],"mappings":"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"}
|