@tuki-io/tuki-widgets 0.0.219-dev.37 → 0.0.219-dev.38

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.
@@ -1 +1 @@
1
- {"version":3,"file":"tuki-io-tuki-widgets-locations.mjs","sources":["../../../../projects/tuki/widgets/locations/src/material.module.ts","../../../../projects/tuki/widgets/locations/src/services/api.service.ts","../../../../projects/tuki/widgets/locations/src/app.constants.ts","../../../../projects/tuki/widgets/locations/src/services/locations.service.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/locations/src/locations.component.ts","../../../../projects/tuki/widgets/locations/src/locations.component.html","../../../../projects/tuki/widgets/locations/src/locations.module.ts","../../../../projects/tuki/widgets/locations/public-api.ts","../../../../projects/tuki/widgets/locations/tuki-io-tuki-widgets-locations.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n imports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ],\n exports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ]\n})\nexport class MaterialModule { }\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]) {\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","export const API = {\n LOCATIONS: {\n GET_ALL: \"/api/webex/locations/customers/:customerId\",\n }\n};\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { APIService } from './api.service';\nimport { Location, LocationAddress } from '../types/location';\n\nexport interface LocationsPage {\n locations: Location[];\n totalElements: number;\n}\n\nfunction toLocationAddress(raw: any): LocationAddress {\n return {\n address1: raw?.address1 || '',\n address2: raw?.address2 || '',\n city: raw?.city || '',\n state: raw?.state || '',\n postalCode: raw?.postalCode || '',\n country: raw?.country || '',\n countryName: raw?.countryName || raw?.country || '',\n };\n}\n\nfunction toLocation(raw: any): Location {\n return {\n id: String(raw?.id ?? ''),\n name: raw?.name || '',\n timeZone: raw?.timeZone || '',\n address: toLocationAddress(raw?.address),\n // Every location returned by this endpoint is a Webex Control Hub location.\n provisioningType: raw?.provisioningType || 'WEBEX',\n hasPendingActions: !!raw?.hasPendingActions,\n };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationsService {\n constructor(private apiService: APIService) { }\n\n fetchLocations(customerId: number, page: number, size: number): Observable<LocationsPage> {\n const url = API.LOCATIONS.GET_ALL.replace(':customerId', String(customerId));\n return this.apiService.fetch(url, { page, size }).pipe(\n map((response: any) => {\n const content = response?.content || [];\n return {\n locations: content.map(toLocation),\n totalElements: response?.totalElements ?? content.length,\n };\n }),\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, OnInit, Output } from '@angular/core';\nimport { APIService } from './services/api.service';\nimport { LocationsService } from './services/locations.service';\nimport { Location } from './types/location';\n\ntype LocationsSortDirection = 'asc' | 'desc';\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n@Component({\n selector: 'tk-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss'],\n})\nexport class LocationsComponent implements OnInit {\n @Input() exHost!: string;\n @Input() token!: string;\n @Input() customerId!: number;\n\n @Output() openLocation = new EventEmitter<string>();\n @Output() editLocation = new EventEmitter<string>();\n @Output() removeLocation = new EventEmitter<string>();\n @Output() addLocation = new EventEmitter<void>();\n @Output() importLocations = new EventEmitter<void>();\n\n locations: Location[] = [];\n totalElements = 0;\n isLoading = false;\n\n searchTerm = '';\n sortDirection: LocationsSortDirection = 'asc';\n isBannerDismissed = false;\n\n readonly pageSizeOptions = PAGE_SIZE_OPTIONS;\n pageIndex = 0;\n pageSize = PAGE_SIZE_OPTIONS[0];\n\n isFilterPanelOpen = false;\n filters = {\n country: '',\n pendingActions: '',\n };\n\n private readonly countryDisplayNames = typeof Intl !== 'undefined' && 'DisplayNames' in Intl\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null;\n\n constructor(\n private apiService: APIService,\n private locationsService: LocationsService,\n ) { }\n\n ngOnInit(): void {\n this.apiService.token = this.token;\n this.apiService.apiUrl = this.exHost + '/webex';\n this.loadPage();\n }\n\n private loadPage(): void {\n this.isLoading = true;\n this.locationsService.fetchLocations(this.customerId, this.pageIndex, this.pageSize).subscribe({\n next: ({ locations, totalElements }) => {\n this.locations = locations;\n this.totalElements = totalElements;\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n },\n });\n }\n\n get pendingLocations(): Location[] {\n return this.locations.filter(location => location.hasPendingActions);\n }\n\n get showPendingBanner(): boolean {\n return !this.isBannerDismissed && this.pendingLocations.length > 0;\n }\n\n get countries(): string[] {\n return Array.from(new Set(this.locations.map(location => this.countryLabel(location)).filter(Boolean))).sort();\n }\n\n // Search/filter/sort apply only to the currently loaded page — the API paginates\n // server-side (page/size) and doesn't expose a documented search/filter parameter.\n get filteredLocations(): Location[] {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = this.locations.filter(location =>\n (!term ||\n location.name.toLowerCase().includes(term) ||\n this.addressLine(location).toLowerCase().includes(term) ||\n location.address.city.toLowerCase().includes(term) ||\n location.address.state.toLowerCase().includes(term) ||\n this.countryLabel(location).toLowerCase().includes(term)) &&\n (!this.filters.country || this.countryLabel(location) === this.filters.country) &&\n (!this.filters.pendingActions || String(location.hasPendingActions) === this.filters.pendingActions)\n );\n\n return filtered.sort((a, b) => {\n const comparison = a.name.localeCompare(b.name);\n return this.sortDirection === 'asc' ? comparison : -comparison;\n });\n }\n\n get pageRangeLabel(): string {\n if (!this.totalElements) {\n return '0 of 0';\n }\n const start = this.pageIndex * this.pageSize + 1;\n const end = Math.min(this.totalElements, start + this.locations.length - 1);\n return `${start} – ${end} of ${this.totalElements}`;\n }\n\n get hasPreviousPage(): boolean {\n return this.pageIndex > 0;\n }\n\n get hasNextPage(): boolean {\n return (this.pageIndex + 1) * this.pageSize < this.totalElements;\n }\n\n addressLine(location: Location): string {\n return [location.address.address1, location.address.address2, location.address.city]\n .filter(Boolean)\n .join(' - ');\n }\n\n countryLabel(location: Location): string {\n const { countryName, country } = location.address;\n if (countryName) {\n return countryName;\n }\n if (!country) {\n return '';\n }\n return this.countryDisplayNames?.of(country) || country;\n }\n\n // Same icon set as users-list's \"Provisioning Type\" column (assets/icons/webex.svg,\n // local_24.svg, di_cloud_24.svg).\n private readonly provisioningTypeIcons: Record<string, { src: string; tooltip: string }> = {\n WEBEX: { src: 'assets/icons/webex.svg', tooltip: 'Webex Calling' },\n UCM: { src: 'assets/icons/local_24.svg', tooltip: 'UCM' },\n DI: { src: 'assets/icons/di_cloud_24.svg', tooltip: 'Webex Calling DI' },\n };\n\n provisioningTypeIcon(location: Location): { src: string; tooltip: string } | null {\n return this.provisioningTypeIcons[location.provisioningType] || null;\n }\n\n onSearchInputChange(event: Event): void {\n this.searchTerm = (event.target as HTMLInputElement).value;\n }\n\n toggleNameSort(): void {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n\n dismissBanner(): void {\n this.isBannerDismissed = true;\n }\n\n toggleFilterPanel(): void {\n this.isFilterPanelOpen = !this.isFilterPanelOpen;\n }\n\n closeFilterPanel(): void {\n this.isFilterPanelOpen = false;\n }\n\n clearFilters(): void {\n this.filters = { country: '', pendingActions: '' };\n }\n\n onPageSizeChange(event: Event): void {\n this.pageSize = Number((event.target as HTMLSelectElement).value);\n this.pageIndex = 0;\n this.loadPage();\n }\n\n goToPreviousPage(): void {\n if (this.hasPreviousPage) {\n this.pageIndex--;\n this.loadPage();\n }\n }\n\n goToNextPage(): void {\n if (this.hasNextPage) {\n this.pageIndex++;\n this.loadPage();\n }\n }\n\n onOpenLocation(location: Location): void {\n this.openLocation.emit(location.id);\n }\n\n onEditLocation(location: Location): void {\n this.editLocation.emit(location.id);\n }\n\n onRemoveLocation(location: Location): void {\n this.removeLocation.emit(location.id);\n }\n\n onAddLocation(): void {\n this.addLocation.emit();\n }\n\n onImportLocations(): void {\n this.importLocations.emit();\n }\n\n exportLocations(): void {\n const rows = this.filteredLocations.map(location => [\n location.name,\n this.addressLine(location),\n this.countryLabel(location),\n this.provisioningTypeIcon(location)?.tooltip || '',\n ]);\n const csvLines = [\n ['Location Name', 'Address', 'Country/Region', 'Provisioning Type'],\n ...rows,\n ].map(row => row.map(cell => `\"${String(cell).replace(/\"/g, '\"\"')}\"`).join(','));\n\n const blob = new Blob([csvLines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'locations.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__header\">\n <h1 class=\"tk-locations__title\">Locations</h1>\n </div>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '—' }}</td>\n <td>{{ countryLabel(location) || '—' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>—</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n","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 { LocationsComponent } from './locations.component';\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n AppLoaderComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n MaterialModule,\n ],\n exports: [\n LocationsComponent,\n ],\n})\nexport class LocationsModule { }\n","/*\n * Public API Surface of @tuki-io/tuki-widgets\n */\n\n// Widget Modules\nexport * from './src/locations.module';\n\n// Components\nexport * from './src/locations.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.APIService","i1","i2.LocationsService","i9.AppLoaderComponent"],"mappings":"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"}
1
+ {"version":3,"file":"tuki-io-tuki-widgets-locations.mjs","sources":["../../../../projects/tuki/widgets/locations/src/material.module.ts","../../../../projects/tuki/widgets/locations/src/services/api.service.ts","../../../../projects/tuki/widgets/locations/src/app.constants.ts","../../../../projects/tuki/widgets/locations/src/services/locations.service.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.ts","../../../../projects/tuki/widgets/locations/src/utils/app-loader/app-loader.component.html","../../../../projects/tuki/widgets/locations/src/locations.component.ts","../../../../projects/tuki/widgets/locations/src/locations.component.html","../../../../projects/tuki/widgets/locations/src/locations.module.ts","../../../../projects/tuki/widgets/locations/public-api.ts","../../../../projects/tuki/widgets/locations/tuki-io-tuki-widgets-locations.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@NgModule({\n imports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ],\n exports: [\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n ]\n})\nexport class MaterialModule { }\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]) {\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","export const API = {\n LOCATIONS: {\n GET_ALL: \"/api/webex/locations/customers/:customerId\",\n }\n};\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { API } from '../app.constants';\nimport { APIService } from './api.service';\nimport { Location, LocationAddress } from '../types/location';\n\nexport interface LocationsPage {\n locations: Location[];\n totalElements: number;\n}\n\nfunction toLocationAddress(raw: any): LocationAddress {\n return {\n address1: raw?.address1 || '',\n address2: raw?.address2 || '',\n city: raw?.city || '',\n state: raw?.state || '',\n postalCode: raw?.postalCode || '',\n country: raw?.country || '',\n countryName: raw?.countryName || raw?.country || '',\n };\n}\n\nfunction toLocation(raw: any): Location {\n return {\n id: String(raw?.id ?? ''),\n name: raw?.name || '',\n timeZone: raw?.timeZone || '',\n address: toLocationAddress(raw?.address),\n // Every location returned by this endpoint is a Webex Control Hub location.\n provisioningType: raw?.provisioningType || 'WEBEX',\n hasPendingActions: !!raw?.hasPendingActions,\n };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LocationsService {\n constructor(private apiService: APIService) { }\n\n fetchLocations(customerId: number, page: number, size: number): Observable<LocationsPage> {\n const url = API.LOCATIONS.GET_ALL.replace(':customerId', String(customerId));\n return this.apiService.fetch(url, { page, size }).pipe(\n map((response: any) => {\n const content = response?.content || [];\n return {\n locations: content.map(toLocation),\n totalElements: response?.totalElements ?? content.length,\n };\n }),\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, OnInit, Output } from '@angular/core';\nimport { APIService } from './services/api.service';\nimport { LocationsService } from './services/locations.service';\nimport { Location } from './types/location';\n\ntype LocationsSortDirection = 'asc' | 'desc';\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n@Component({\n selector: 'tk-locations',\n templateUrl: './locations.component.html',\n styleUrls: ['./locations.component.scss'],\n})\nexport class LocationsComponent implements OnInit {\n @Input() exHost!: string;\n @Input() token!: string;\n @Input() customerId!: number;\n\n @Output() openLocation = new EventEmitter<string>();\n @Output() editLocation = new EventEmitter<string>();\n @Output() removeLocation = new EventEmitter<string>();\n @Output() addLocation = new EventEmitter<void>();\n @Output() importLocations = new EventEmitter<void>();\n\n locations: Location[] = [];\n totalElements = 0;\n isLoading = false;\n\n searchTerm = '';\n sortDirection: LocationsSortDirection = 'asc';\n isBannerDismissed = false;\n\n readonly pageSizeOptions = PAGE_SIZE_OPTIONS;\n pageIndex = 0;\n pageSize = PAGE_SIZE_OPTIONS[0];\n\n isFilterPanelOpen = false;\n filters = {\n country: '',\n pendingActions: '',\n };\n\n private readonly countryDisplayNames = typeof Intl !== 'undefined' && 'DisplayNames' in Intl\n ? new Intl.DisplayNames(['en'], { type: 'region' })\n : null;\n\n constructor(\n private apiService: APIService,\n private locationsService: LocationsService,\n ) { }\n\n ngOnInit(): void {\n this.apiService.token = this.token;\n this.apiService.apiUrl = this.exHost + '/webex';\n this.loadPage();\n }\n\n private loadPage(): void {\n this.isLoading = true;\n this.locationsService.fetchLocations(this.customerId, this.pageIndex, this.pageSize).subscribe({\n next: ({ locations, totalElements }) => {\n this.locations = locations;\n this.totalElements = totalElements;\n this.isLoading = false;\n },\n error: () => {\n this.isLoading = false;\n },\n });\n }\n\n get pendingLocations(): Location[] {\n return this.locations.filter(location => location.hasPendingActions);\n }\n\n get showPendingBanner(): boolean {\n return !this.isBannerDismissed && this.pendingLocations.length > 0;\n }\n\n get countries(): string[] {\n return Array.from(new Set(this.locations.map(location => this.countryLabel(location)).filter(Boolean))).sort();\n }\n\n // Search/filter/sort apply only to the currently loaded page — the API paginates\n // server-side (page/size) and doesn't expose a documented search/filter parameter.\n get filteredLocations(): Location[] {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = this.locations.filter(location =>\n (!term ||\n location.name.toLowerCase().includes(term) ||\n this.addressLine(location).toLowerCase().includes(term) ||\n location.address.city.toLowerCase().includes(term) ||\n location.address.state.toLowerCase().includes(term) ||\n this.countryLabel(location).toLowerCase().includes(term)) &&\n (!this.filters.country || this.countryLabel(location) === this.filters.country) &&\n (!this.filters.pendingActions || String(location.hasPendingActions) === this.filters.pendingActions)\n );\n\n return filtered.sort((a, b) => {\n const comparison = a.name.localeCompare(b.name);\n return this.sortDirection === 'asc' ? comparison : -comparison;\n });\n }\n\n get pageRangeLabel(): string {\n if (!this.totalElements) {\n return '0 of 0';\n }\n const start = this.pageIndex * this.pageSize + 1;\n const end = Math.min(this.totalElements, start + this.locations.length - 1);\n return `${start} – ${end} of ${this.totalElements}`;\n }\n\n get hasPreviousPage(): boolean {\n return this.pageIndex > 0;\n }\n\n get hasNextPage(): boolean {\n return (this.pageIndex + 1) * this.pageSize < this.totalElements;\n }\n\n addressLine(location: Location): string {\n return [location.address.address1, location.address.address2, location.address.city]\n .filter(Boolean)\n .join(' - ');\n }\n\n countryLabel(location: Location): string {\n const { countryName, country } = location.address;\n if (countryName) {\n return countryName;\n }\n if (!country) {\n return '';\n }\n return this.countryDisplayNames?.of(country) || country;\n }\n\n // Same icon set as users-list's \"Provisioning Type\" column (assets/icons/webex.svg,\n // local_24.svg, di_cloud_24.svg).\n private readonly provisioningTypeIcons: Record<string, { src: string; tooltip: string }> = {\n WEBEX: { src: 'assets/icons/webex.svg', tooltip: 'Webex Calling' },\n UCM: { src: 'assets/icons/local_24.svg', tooltip: 'UCM' },\n DI: { src: 'assets/icons/di_cloud_24.svg', tooltip: 'Webex Calling DI' },\n };\n\n provisioningTypeIcon(location: Location): { src: string; tooltip: string } | null {\n return this.provisioningTypeIcons[location.provisioningType] || null;\n }\n\n onSearchInputChange(event: Event): void {\n this.searchTerm = (event.target as HTMLInputElement).value;\n }\n\n toggleNameSort(): void {\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n }\n\n dismissBanner(): void {\n this.isBannerDismissed = true;\n }\n\n toggleFilterPanel(): void {\n this.isFilterPanelOpen = !this.isFilterPanelOpen;\n }\n\n closeFilterPanel(): void {\n this.isFilterPanelOpen = false;\n }\n\n clearFilters(): void {\n this.filters = { country: '', pendingActions: '' };\n }\n\n onPageSizeChange(event: Event): void {\n this.pageSize = Number((event.target as HTMLSelectElement).value);\n this.pageIndex = 0;\n this.loadPage();\n }\n\n goToPreviousPage(): void {\n if (this.hasPreviousPage) {\n this.pageIndex--;\n this.loadPage();\n }\n }\n\n goToNextPage(): void {\n if (this.hasNextPage) {\n this.pageIndex++;\n this.loadPage();\n }\n }\n\n onOpenLocation(location: Location): void {\n this.openLocation.emit(location.id);\n }\n\n onEditLocation(location: Location): void {\n this.editLocation.emit(location.id);\n }\n\n onRemoveLocation(location: Location): void {\n this.removeLocation.emit(location.id);\n }\n\n onAddLocation(): void {\n this.addLocation.emit();\n }\n\n onImportLocations(): void {\n this.importLocations.emit();\n }\n\n exportLocations(): void {\n const rows = this.filteredLocations.map(location => [\n location.name,\n this.addressLine(location),\n this.countryLabel(location),\n this.provisioningTypeIcon(location)?.tooltip || '',\n ]);\n const csvLines = [\n ['Location Name', 'Address', 'Country/Region', 'Provisioning Type'],\n ...rows,\n ].map(row => row.map(cell => `\"${String(cell).replace(/\"/g, '\"\"')}\"`).join(','));\n\n const blob = new Blob([csvLines.join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'locations.csv';\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '—' }}</td>\n <td>{{ countryLabel(location) || '—' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>—</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n","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 { LocationsComponent } from './locations.component';\nimport { AppLoaderComponent } from './utils/app-loader/app-loader';\n\n@NgModule({\n declarations: [\n LocationsComponent,\n AppLoaderComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n MaterialModule,\n ],\n exports: [\n LocationsComponent,\n ],\n})\nexport class LocationsModule { }\n","/*\n * Public API Surface of @tuki-io/tuki-widgets\n */\n\n// Widget Modules\nexport * from './src/locations.module';\n\n// Components\nexport * from './src/locations.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.APIService","i1","i2.LocationsService","i9.AppLoaderComponent"],"mappings":"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"}
@@ -367,10 +367,10 @@ class LocationsComponent {
367
367
  }
368
368
  }
369
369
  LocationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationsComponent, deps: [{ token: APIService }, { token: LocationsService }], target: i0.ɵɵFactoryTarget.Component });
370
- LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationsComponent, selector: "tk-locations", inputs: { exHost: "exHost", token: "token", customerId: "customerId" }, outputs: { openLocation: "openLocation", editLocation: "editLocation", removeLocation: "removeLocation", addLocation: "addLocation", importLocations: "importLocations" }, ngImport: i0, template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__header\">\n <h1 class=\"tk-locations__title\">Locations</h1>\n </div>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '\u2014' }}</td>\n <td>{{ countryLabel(location) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2}.tk-locations__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.75rem}.tk-locations__title{margin:0;font-size:1.5rem;font-weight:600;color:#000000f2}.tk-locations__view-toggle{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;height:2.25rem;padding:0 1rem;background:none;border:none;border-radius:999px;font-family:inherit;font-size:.875rem;font-weight:500;color:#0009;cursor:pointer}.tk-locations__view-button--active{background:#e9e8e6;color:#000000f2}.tk-locations__view-button:disabled{cursor:default}.tk-locations__view-icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppLoaderComponent, selector: "app-loader" }] });
370
+ LocationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: LocationsComponent, selector: "tk-locations", inputs: { exHost: "exHost", token: "token", customerId: "customerId" }, outputs: { openLocation: "openLocation", editLocation: "editLocation", removeLocation: "removeLocation", addLocation: "addLocation", importLocations: "importLocations" }, ngImport: i0, template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '\u2014' }}</td>\n <td>{{ countryLabel(location) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2}.tk-locations__view-toggle{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;height:2.25rem;padding:0 1rem;background:none;border:none;border-radius:999px;font-family:inherit;font-size:.875rem;font-weight:500;color:#0009;cursor:pointer}.tk-locations__view-button--active{background:#e9e8e6;color:#000000f2}.tk-locations__view-button:disabled{cursor:default}.tk-locations__view-icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppLoaderComponent, selector: "app-loader" }] });
371
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocationsComponent, decorators: [{
372
372
  type: Component,
373
- args: [{ selector: 'tk-locations', template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__header\">\n <h1 class=\"tk-locations__title\">Locations</h1>\n </div>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '\u2014' }}</td>\n <td>{{ countryLabel(location) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2}.tk-locations__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding-bottom:.75rem}.tk-locations__title{margin:0;font-size:1.5rem;font-weight:600;color:#000000f2}.tk-locations__view-toggle{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;height:2.25rem;padding:0 1rem;background:none;border:none;border-radius:999px;font-family:inherit;font-size:.875rem;font-weight:500;color:#0009;cursor:pointer}.tk-locations__view-button--active{background:#e9e8e6;color:#000000f2}.tk-locations__view-button:disabled{cursor:default}.tk-locations__view-icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"] }]
373
+ args: [{ selector: 'tk-locations', template: "<div class=\"tk-locations\">\n <app-loader *ngIf=\"isLoading\"></app-loader>\n\n <div class=\"tk-locations__view-toggle\">\n <button type=\"button\" class=\"tk-locations__view-button tk-locations__view-button--active\">\n <mat-icon class=\"tk-locations__view-icon\">menu</mat-icon>\n List\n </button>\n <button type=\"button\" class=\"tk-locations__view-button\" disabled title=\"Map view coming soon\">\n <mat-icon class=\"tk-locations__view-icon\">place</mat-icon>\n Map\n </button>\n </div>\n\n <div class=\"tk-locations__banner\" *ngIf=\"showPendingBanner\">\n <mat-icon class=\"tk-locations__banner-icon\">warning</mat-icon>\n <span class=\"tk-locations__banner-text\">\n View location(s) with pending action items to resume your calling service in {{ pendingLocations.length }} or more locations.\n </span>\n <button type=\"button\" class=\"tk-locations__banner-close\" aria-label=\"Dismiss\" (click)=\"dismissBanner()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__toolbar\">\n <div style=\"position: relative; width: fit-content; min-width: 200px\">\n <input\n [value]=\"searchTerm\"\n class=\"blue-input\"\n (input)=\"onSearchInputChange($event)\"\n type=\"text\"\n placeholder=\"Search by name, city, state, country\"\n style=\"\n width: 100%;\n height: 34px;\n border-radius: 0.5rem;\n font-size: 16px;\n padding: 6px 12px 6px 44px;\n border: 1px solid #00000080;\n background: #fff;\n color: #222;\n outline: none;\n box-sizing: border-box;\n min-width: 280px;\n \"\n />\n <span\n style=\"\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: #757575;\n font-size: 18px;\n font-weight: normal;\n pointer-events: none;\n \"\n >\n <i\n class=\"material-icons\"\n style=\"font-size: 18px; font-weight: normal\"\n >search</i\n >\n </span>\n </div>\n\n <button type=\"button\" class=\"tk-locations__filter-button\" (click)=\"toggleFilterPanel()\">\n <img class=\"tk-locations__filter-icon\" src=\"assets/icons/filter-regular.svg\" alt=\"filter_list\" title=\"filter_list\">\n Filter\n </button>\n\n <span class=\"tk-locations__count\">{{ filteredLocations.length }} locations</span>\n\n <button type=\"button\" class=\"tk-locations__download-button\" aria-label=\"Download locations\" title=\"Download locations\" (click)=\"exportLocations()\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button type=\"button\" class=\"tk-locations__manage-button\" [matMenuTriggerFor]=\"manageMenu\">\n Manage locations\n <mat-icon class=\"tk-locations__manage-chevron\">expand_more</mat-icon>\n </button>\n <mat-menu #manageMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item type=\"button\" (click)=\"onAddLocation()\">Add location</button>\n <button mat-menu-item type=\"button\" (click)=\"onImportLocations()\">Import locations</button>\n </mat-menu>\n </div>\n\n <table class=\"tk-locations__table\">\n <thead>\n <tr>\n <th (click)=\"toggleNameSort()\">\n Location Name\n <mat-icon class=\"tk-locations__sort-icon\">{{ sortDirection === 'asc' ? 'arrow_upward' : 'arrow_downward' }}</mat-icon>\n </th>\n <th>Address</th>\n <th>Country/Region</th>\n <th>Provisioning Type</th>\n <th class=\"tk-locations__actions-col\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let location of filteredLocations\" (click)=\"onOpenLocation(location)\">\n <td class=\"tk-locations__name-cell\">\n <a href=\"javascript:void(0)\" class=\"tk-locations__name-link\" (click)=\"$event.stopPropagation(); onOpenLocation(location)\">{{ location.name }}</a>\n </td>\n <td>{{ addressLine(location) || '\u2014' }}</td>\n <td>{{ countryLabel(location) || '\u2014' }}</td>\n <td>\n <span class=\"tk-locations__icon-wrapper\" *ngIf=\"provisioningTypeIcon(location) as pt; else noProvisioningType\">\n <img [src]=\"pt.src\" [matTooltip]=\"pt.tooltip\" matTooltipPosition=\"right\" width=\"20\" alt=\"\">\n </span>\n <ng-template #noProvisioningType>\u2014</ng-template>\n </td>\n <td class=\"tk-locations__actions-col\">\n <button\n mat-icon-button\n class=\"tk-locations__row-action-button\"\n [matMenuTriggerFor]=\"rowMenu\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Open location actions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #rowMenu=\"matMenu\" yPosition=\"below\">\n <button mat-menu-item type=\"button\" (click)=\"onOpenLocation(location)\">View details</button>\n <button mat-menu-item type=\"button\" (click)=\"onEditLocation(location)\">Edit location</button>\n <button mat-menu-item type=\"button\" (click)=\"onRemoveLocation(location)\">Remove location</button>\n </mat-menu>\n </td>\n </tr>\n <tr *ngIf=\"!filteredLocations.length\">\n <td colspan=\"5\" class=\"tk-locations__empty\">No locations match your search.</td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"tk-locations__footer\">\n <div class=\"tk-locations__rows-per-page\">\n <label for=\"tk-locations-page-size\">Rows per page:</label>\n <select id=\"tk-locations-page-size\" class=\"tk-locations__rows-per-page-select\" [ngModel]=\"pageSize\" (change)=\"onPageSizeChange($event)\">\n <option *ngFor=\"let size of pageSizeOptions\" [value]=\"size\">{{ size }}</option>\n </select>\n </div>\n <span class=\"tk-locations__footer-text\">{{ pageRangeLabel }}</span>\n <div class=\"tk-locations__pagination\">\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasPreviousPage\" (click)=\"goToPreviousPage()\" aria-label=\"Previous page\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button type=\"button\" class=\"tk-locations__pagination-button\" [disabled]=\"!hasNextPage\" (click)=\"goToNextPage()\" aria-label=\"Next page\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n\n <div\n class=\"tk-locations__filter-backdrop\"\n *ngIf=\"isFilterPanelOpen\"\n (click)=\"closeFilterPanel()\">\n </div>\n\n <aside class=\"tk-locations__filter-panel\" [class.tk-locations__filter-panel--open]=\"isFilterPanelOpen\">\n <div class=\"tk-locations__filter-panel-header\">\n <h3 class=\"tk-locations__filter-panel-title\">Filter locations</h3>\n <button\n type=\"button\"\n class=\"tk-locations__filter-panel-close\"\n aria-label=\"Close filter panel\"\n (click)=\"closeFilterPanel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"tk-locations__filter-panel-body\">\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-country\">Country/Region</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-country\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.country\">\n <option value=\"\">All countries</option>\n <option *ngFor=\"let country of countries\" [value]=\"country\">{{ country }}</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-field\">\n <label class=\"tk-locations__filter-label\" for=\"tk-locations-filter-pending\">Pending action items</label>\n <div class=\"tk-locations__filter-select-wrap\">\n <select id=\"tk-locations-filter-pending\" class=\"tk-locations__filter-select\" [(ngModel)]=\"filters.pendingActions\">\n <option value=\"\">All</option>\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n <mat-icon class=\"tk-locations__filter-select-icon\">expand_more</mat-icon>\n </div>\n </div>\n </div>\n\n <div class=\"tk-locations__filter-panel-footer\">\n <button type=\"button\" class=\"tk-locations__filter-clear\" (click)=\"clearFilters()\">Clear all</button>\n <button type=\"button\" class=\"tk-locations__filter-done\" (click)=\"closeFilterPanel()\">Done</button>\n </div>\n </aside>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";.tk-locations{font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;color:#000000f2}.tk-locations__view-toggle{display:flex;align-items:center;gap:1rem;margin-bottom:1rem;width:-moz-fit-content;width:fit-content}.tk-locations__view-button{display:inline-flex;align-items:center;gap:.375rem;height:2.25rem;padding:0 1rem;background:none;border:none;border-radius:999px;font-family:inherit;font-size:.875rem;font-weight:500;color:#0009;cursor:pointer}.tk-locations__view-button--active{background:#e9e8e6;color:#000000f2}.tk-locations__view-button:disabled{cursor:default}.tk-locations__view-icon{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__banner{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.75rem 1rem;background:#fdf1d6;border:1px solid #f0d9a6;border-radius:.5rem;color:#7a5b0a}.tk-locations__banner-icon{font-size:1.125rem;height:1.125rem;width:1.125rem;color:#b5860b;flex-shrink:0}.tk-locations__banner-text{flex:1;font-size:.8125rem}.tk-locations__banner-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#7a5b0a;cursor:pointer}.tk-locations__banner-close:hover{color:#000000f2}.tk-locations__toolbar{display:flex;align-items:center;gap:.75rem;margin:.5rem .5rem 1rem}.tk-locations__filter-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem .875rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:.5rem;font-family:inherit;font-size:.8125rem;font-weight:500;color:#000000f2;cursor:pointer}.tk-locations__filter-button:hover{background:rgba(0,0,0,.03)}.tk-locations__filter-icon{font-size:1rem;height:1rem;width:1rem;opacity:.6}.tk-locations__count{font-size:.8125rem;color:#0009;white-space:nowrap}.tk-locations__download-button{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;margin-left:auto;background:none;border:none;color:#0009;cursor:pointer}.tk-locations__download-button:hover{color:#000000f2}.tk-locations__manage-button{display:inline-flex;align-items:center;gap:.375rem;height:34px;padding:.5rem 1rem;background:#000;color:#fff;border:none;border-radius:6.25rem;font-family:inherit;font-size:.8125rem;font-weight:500;cursor:pointer}.tk-locations__manage-button:hover{background:#222}.tk-locations__manage-icon,.tk-locations__manage-chevron{font-size:1.125rem;height:1.125rem;width:1.125rem}.tk-locations__table{width:100%;border-collapse:collapse;font-family:Inter,sans-serif}.tk-locations__table th{height:39px;padding:.5rem 1.5rem .5rem .75rem;background-color:#ededed;text-align:start;font-size:.75rem;font-weight:500;color:#000000b3;word-break:break-all;max-inline-size:100%;cursor:pointer}.tk-locations__table th:hover{background-color:#dedede}.tk-locations__table td{height:49px;padding:.5rem 1.5rem .5rem .75rem;box-shadow:inset 0 -1px #0003;background-color:#fff;text-align:start;font-size:.875rem;color:#000000f2;word-break:break-all;cursor:pointer;transition:background-color .2s,box-shadow .2s}.tk-locations__table tbody tr:hover td{background:#ededed}.tk-locations__sort-icon{font-size:1rem;height:1rem;width:1rem;vertical-align:middle;margin-left:.25rem;color:#00000080}.tk-locations__name-cell{min-width:0}.tk-locations__name-link{color:#000000de;font-weight:500;text-decoration:none}.tk-locations__actions-col{width:3rem;text-align:center!important}.tk-locations__icon-wrapper{display:inline-flex;align-items:center}.tk-locations__row-action-button{color:#0009}.tk-locations__row-action-button:hover{color:#000000f2}.tk-locations__empty{padding:1.5rem;text-align:center;color:#0009}.tk-locations__footer{display:flex;align-items:center;justify-content:flex-end;gap:1.5rem;margin-top:1rem;font-size:.8125rem;color:#0009}.tk-locations__rows-per-page{display:flex;align-items:center;gap:.5rem}.tk-locations__rows-per-page-select{padding:.25rem .5rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__pagination{display:flex;align-items:center;gap:.25rem}.tk-locations__pagination-button{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__pagination-button:hover:not(:disabled){color:#000000f2}.tk-locations__pagination-button:disabled{color:#00000040;cursor:default}.tk-locations__filter-backdrop{position:fixed;inset:0;z-index:1000;background-color:oklch(18% .01 260/20%)}.tk-locations__filter-panel{position:fixed;top:0;right:0;bottom:0;z-index:1001;display:flex;flex-direction:column;width:22rem;max-width:100vw;background:#fff;border-left:1px solid rgba(0,0,0,.12);box-shadow:-4px 0 16px #00000014;font-family:Inter,Helvetica Neue,Helvetica,Arial,sans-serif;transform:translate(100%);transition:transform .1s ease;will-change:transform}.tk-locations__filter-panel--open{transform:translate(0)}.tk-locations__filter-panel-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(0,0,0,.12)}.tk-locations__filter-panel-title{margin:0;font-size:1rem;font-weight:600;color:#000000f2}.tk-locations__filter-panel-close{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:#0009;cursor:pointer}.tk-locations__filter-panel-close:hover{color:#000000f2}.tk-locations__filter-panel-body{padding:1.5rem 1.5rem 0;overflow-y:auto}.tk-locations__filter-field{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1.5rem}.tk-locations__filter-label{font-size:.8125rem;font-weight:500;color:#000000f2}.tk-locations__filter-select-wrap{position:relative;display:flex;align-items:center}.tk-locations__filter-select{width:100%;appearance:none;padding:.625rem 2rem .625rem .75rem;background:#fff;border:1px solid rgba(0,0,0,.12);border-radius:6px;font-family:inherit;font-size:.8125rem;color:#000000f2;cursor:pointer}.tk-locations__filter-select:focus{outline:none;border-color:#0006}.tk-locations__filter-select-icon{position:absolute;right:.5rem;font-size:1.125rem;height:1.125rem;width:1.125rem;color:#0006;pointer-events:none}.tk-locations__filter-panel-footer{display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem 1.5rem}.tk-locations__filter-clear{background:none;border:none;padding:0;font-family:inherit;font-size:.813rem;font-weight:500;color:#000000f2;cursor:pointer;padding-inline:.75rem;height:2rem;border-radius:6px}.tk-locations__filter-clear:hover{background-color:oklch(95.5% .005 260)}.tk-locations__filter-done{background-color:#fff;border-radius:6px;font-weight:500;font-family:inherit;font-size:.813rem;cursor:pointer;border:1px solid oklch(92% .003 260);padding-inline:.75rem;height:2rem}.tk-locations__filter-done:hover{background-color:oklch(95.5% .005 260)}::ng-deep input.blue-input{border:solid .0625rem rgba(0,0,0,.5019607843)!important}::ng-deep input.blue-input:focus{color:#000000b3;background-color:#ededed;border:solid .0625rem rgba(0,0,0,.5019607843);font-weight:500;cursor:pointer;box-shadow:0 0 0 .12rem #fff,0 0 0 .25rem #1170cf,0 0 0 .3rem #1170cf59;background-color:#fff!important}::ng-deep input.blue-input:focus:focus-visible{outline:none}::ng-deep input.blue-input:hover{background-color:#00000012!important}\n"] }]
374
374
  }], ctorParameters: function () { return [{ type: APIService }, { type: LocationsService }]; }, propDecorators: { exHost: [{
375
375
  type: Input
376
376
  }], token: [{