@aggdirect/coolmap 5.0.4 → 5.0.5

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":"aggdirect-coolmap.mjs","sources":["../../../projects/coolmap/src/lib/coolmap.ts","../../../projects/coolmap/src/lib/components/sms-card-details/sms-card-details.component.ts","../../../projects/coolmap/src/lib/components/sms-card-details/sms-card-details.component.html","../../../projects/coolmap/src/lib/components/driver-list/driver-list.component.ts","../../../projects/coolmap/src/lib/components/driver-list/driver-list.component.html","../../../projects/coolmap/src/lib/components/job-details/job-details.component.ts","../../../projects/coolmap/src/lib/components/job-details/job-details.component.html","../../../projects/coolmap/src/lib/components/job-code/job-code.component.ts","../../../projects/coolmap/src/lib/components/job-code/job-code.component.html","../../../projects/coolmap/src/lib/components/route-info-card/route-info-card.component.ts","../../../projects/coolmap/src/lib/components/route-info-card/route-info-card.component.html","../../../projects/coolmap/src/lib/components/job-route-list/job-route-list.component.ts","../../../projects/coolmap/src/lib/components/job-route-list/job-route-list.component.html","../../../projects/coolmap/src/lib/components/view-route-list/view-route-list.component.ts","../../../projects/coolmap/src/lib/components/view-route-list/view-route-list.component.html","../../../projects/coolmap/src/lib/components/add-route/add-route.component.ts","../../../projects/coolmap/src/lib/components/add-route/add-route.component.html","../../../projects/coolmap/src/lib/components/coolmap/coolmap.component.ts","../../../projects/coolmap/src/lib/components/coolmap/coolmap.component.html","../../../projects/coolmap/src/public-api.ts","../../../projects/coolmap/src/aggdirect-coolmap.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-coolmap',\n imports: [],\n template: ``,\n styles: ``,\n})\nexport class Coolmap {\n\n}\n","import { NgClass } from '@angular/common';\nimport { Component, EventEmitter, Output, effect, input } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\n\n@Component({\n selector: 'lib-sms-card-details',\n standalone: true,\n imports: [LucideAngularModule, NgClass],\n templateUrl: './sms-card-details.component.html',\n styleUrl: './sms-card-details.component.scss',\n})\nexport class SmsCardDetailsComponent {\n modalOpen = input<boolean>(false);\n smsListcollapse = input<boolean>(false);\n driverListcollapse = input<boolean>(false);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n}\n","@if (modalOpen()) {\n<div\n class=\"fixed lg:absolute inset-0 overflow-y-auto lg:top-0 z-[111] lg:z-auto\"\n [ngClass]=\"smsListcollapse() && driverListcollapse() ? 'lg:left-[425px]' : 'lg:left-[670px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full lg:items-start lg:justify-start items-center justify-center p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 text-[13px] font-medium text-gray-900 dark:text-white\">\n SMS All Drivers\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[70vh] overflow-y-auto p-2\">\n <div class=\"device-info\">\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Jobcode</span>\n <span class=\"value\">016164</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Date</span>\n <span class=\"value\">2026-4-1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Total tasks</span>\n <span class=\"value\">1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Material</span>\n <span class=\"value\">#2 Washed Gravel *</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Unit</span>\n <span class=\"value\">Ton</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Pickup Address</span>\n <span class=\"value\">vaibhav loc-1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Delivery Address</span>\n <span class=\"value\">vaibhav loc-2</span>\n </div>\n </div>\n <div class=\"mt-4\">\n <textarea\n rows=\"2\"\n placeholder=\"Text here....\"\n class=\"w-full px-3 py-2 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm resize-none ng-pristine ng-valid ng-touched\"\n ></textarea>\n </div>\n <div class=\"mt-2 mb-2 flex justify-end\">\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-3 py-1 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-sm\"\n >\n Send SMS\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { Component, EventEmitter, Output, effect, input, signal } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\nimport { SmsCardDetailsComponent } from '../sms-card-details/sms-card-details.component';\nimport { NgClass } from '@angular/common';\n@Component({\n selector: 'lib-driver-list',\n standalone: true,\n imports: [LucideAngularModule, SmsCardDetailsComponent, NgClass],\n templateUrl: './driver-list.component.html',\n styleUrl: './driver-list.component.scss',\n})\nexport class DriverListComponent {\n showSmsModal = false;\n modalOpen = input<boolean>(false);\n driverListcollapse = input<boolean>(false);\n smsListcollapse = signal(false);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n showSmsModalPopup() {\n this.showSmsModal = !this.showSmsModal;\n this.smsListcollapse.set(this.showSmsModal);\n }\n}\n","@if (modalOpen()) {\n<div\n class=\"absolute inset-0 overflow-y-auto top-0\"\n [ngClass]=\"driverListcollapse() ? 'left-[60px]' : 'left-[300px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full items-start justify-start p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Driver List\n </h3>\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-3 sm:px-6 py-1 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-sm\"\n (click)=\"showSmsModalPopup()\"\n >\n SMS\n </button>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[40vh] overflow-y-auto p-2\">\n <ul class=\"flex flex-col gap-2\">\n <li>\n <div\n class=\"driver-row-1 flex flex-col driver-card bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2\"\n >\n <span class=\"driver-name\">Nilufarrr Lokmannn</span>\n <span class=\"com-name\">Aggdirect Android LLC 2</span>\n <div class=\"cont_del flex justify-between text-black dark:text-grey-600\">\n <small>Driver contact: <b>8318428713</b></small>\n <small>Company contact: <b>8318428713</b></small>\n </div>\n </div>\n </li>\n <li>\n <div\n class=\"driver-row-1 flex flex-col driver-card bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2\"\n >\n <span class=\"driver-name\">Nilufarrr Lokmannn</span>\n <span class=\"com-name\">Aggdirect Android LLC 2</span>\n <div class=\"cont_del flex justify-between\">\n <small>Driver contact: <b>8318428713</b></small>\n <small>Company contact: <b>8318428713</b></small>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n}\n\n<lib-sms-card-details\n [(modalOpen)]=\"showSmsModal\"\n [smsListcollapse]=\"smsListcollapse()\"\n [driverListcollapse]=\"driverListcollapse()\"\n></lib-sms-card-details>\n","import { Component, EventEmitter, HostListener, Output, input, signal } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\n@Component({\n selector: 'lib-job-details',\n standalone: true,\n imports: [LucideAngularModule],\n templateUrl: './job-details.component.html',\n styleUrl: './job-details.component.scss',\n})\nexport class JobDetailsComponent {\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n dragX = signal(0);\n dragY = signal(0);\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragInitialX = 0;\n private dragInitialY = 0;\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n startDrag(event: MouseEvent): void {\n this.isDragging = true;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.dragInitialX = this.dragX();\n this.dragInitialY = this.dragY();\n event.preventDefault();\n }\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging || !this.modalOpen()) return;\n this.dragX.set(this.dragInitialX + (event.clientX - this.dragStartX));\n this.dragY.set(this.dragInitialY + (event.clientY - this.dragStartY));\n }\n @HostListener('document:mouseup')\n onMouseUp(): void {\n this.isDragging = false;\n }\n}\n","@if (modalOpen()) {\n<div class=\"z-[111] xl:z-[80] bottom-0 lg:left-[300px] fixed lg:absolute inset-0 overflow-y-auto\">\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full lg:items-end lg:justify-start items-center justify-center p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n [style.transform]=\"'translate(' + dragX() + 'px, ' + dragY() + 'px)'\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b cursor-move border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n (mousedown)=\"startDrag($event)\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Job Details\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[50vh] overflow-y-auto p-2\">\n <div class=\"stats-row\">\n <div class=\"stat-item active\" title=\"Active routes (assigned + in progress)\">\n <span class=\"stat-count\">{{ routeData()?.values?.Done || 0 }}</span>\n <span class=\"stat-label\">Done</span>\n </div>\n\n <div class=\"stat-item completed\" title=\"Completed tasks\">\n <span class=\"stat-count\">{{ routeData()?.values?.Incomplete || 0 }}</span>\n <span class=\"stat-label\">Imcomplete</span>\n </div>\n <div class=\"stat-item declined\" title=\"Declined routes - needs attention\">\n <span class=\"stat-count\">{{ routeData()?.values?.Ongoing || 0 }}</span>\n <span class=\"stat-label\">Ongoing</span>\n </div>\n <div class=\"stat-item scheduled\" title=\"Scheduled jobs for today\">\n <span class=\"stat-count\">{{ routeData()?.values?.Open || 1 }}</span>\n <span class=\"stat-label\">Open</span>\n </div>\n </div>\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2 rounded-lg mt-4\"\n >\n <span class=\"pickup truncate block\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"inline mr-1 text-green-500\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n Pickup: {{ routeData()?.pickup_location || 'N/A' }}\n </span>\n <span class=\"delivery truncate block mt-1\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"inline mr-1 text-blue-500\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n Delivery: {{ routeData()?.delivery_location || 'N/A' }}\n </span>\n </div>\n <div class=\"device-info mt-2\">\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Jobcode</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.order_number || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Customer</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.customer_name || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Project Name</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.project || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Job Type</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.unit || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Material</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.material || 'General Freight' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Customer Contact</span>\n <span class=\"font-medium\">{{ routeData()?.customer_contact || 'None' }}</span>\n </div>\n <div class=\"flex justify-between py-2 text-xs\">\n <span class=\"text-gray-500 dark:text-slate-500\">Delivery Contact</span>\n <span class=\"font-medium\">{{ routeData()?.delivery_contact || 'None' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { Component, HostListener, Input, signal, inject, Output, EventEmitter } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { LucideAngularModule, CarFront, Info, LoaderCircle } from 'lucide-angular';\nimport { DriverListComponent } from '../driver-list/driver-list.component';\nimport { JobDetailsComponent } from '../job-details/job-details.component';\nimport { COOLMAP_CONFIG, UtilsService, CoolmapService, CoolmapRoute } from '@aggdirect/coolmap-services';\n\nexport type CardListMode = 'sidebar' | 'floating' | 'inline';\n@Component({\n selector: 'lib-job-code',\n standalone: true,\n imports: [LucideAngularModule, DriverListComponent, JobDetailsComponent, NgClass],\n templateUrl: './job-code.component.html',\n styleUrl: './job-code.component.scss',\n})\nexport class JobCodeComponent {\n config = inject(COOLMAP_CONFIG);\n utils = inject(UtilsService);\n coolmapService = inject(CoolmapService);\n\n showDriverModal = false;\n showDetailModal = false;\n @Input() listMode: CardListMode = 'sidebar';\n @Input() collapsible = true;\n @Input() routes: CoolmapRoute[] = [];\n @Input() selectedRouteIds: string[] = [];\n @Input() isLoading: boolean = false;\n @Output() routeSelect = new EventEmitter<string>();\n collapsed = false;\n\n // New Signal States\n selectedJobDetail = signal<any>(null);\n contextMenuVisible = signal(false);\n driverListcollapse = signal(false);\n contextMenuPosition = signal({ x: 0, y: 0 });\n\n @HostListener('document:keydown.escape')\n icons = {\n CarFront,\n Info,\n LoaderCircle\n };\n\n toggleRouteSelection(route: CoolmapRoute) {\n const id = route.job_id || route.route_id || (route as any).route_details_id;\n if (!id) return;\n this.routeSelect.emit(id);\n }\n\n toggleCollapse() {\n if (this.collapsible) {\n this.collapsed = !this.collapsed;\n this.driverListcollapse.set(this.collapsed);\n }\n }\n\n calculateStatusPercentage(type: string, route: any) {\n const values = route?.values || { Done: 0, Ongoing: 0, Open: 0 };\n const total = (values.Done || 0) + (values.Ongoing || 0) + (values.Open || 0);\n if (total === 0) return type === 'open' ? 100 : 0;\n \n if (type === 'done') return Math.round((100 * (values.Done || 0)) / total);\n if (type === 'ongoing') return Math.round((100 * (values.Ongoing || 0)) / total);\n if (type === 'open') return Math.round((100 * (values.Open || 0)) / total);\n return 0;\n }\n}\n\n","<div\n class=\"cards-list-container\"\n [class.floating]=\"listMode === 'floating'\"\n [class.sidebar]=\"listMode === 'sidebar'\"\n [class.inline]=\"listMode === 'inline'\"\n [class.collapsed]=\"collapsed\"\n>\n <div class=\"list-header\">\n <div class=\"header-title\">\n <span class=\"title-text\">Routes</span>\n <span class=\"routes-count\">({{ routes.length || 0 }})</span>\n </div>\n <button\n class=\"collapse-btn\"\n (click)=\"toggleCollapse()\"\n [title]=\"collapsed ? 'Expand' : 'Collapse'\"\n >\n @if (collapsed) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n </button>\n </div>\n @if (!collapsed) {\n <div class=\"cards-scroll-container\" #scrollContainer>\n @if (isLoading) {\n <div class=\"list-loader\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"32\" class=\"animate-spin text-amber-500\"></lucide-icon>\n </div>\n }\n <div class=\"cards-list\">\n @for (route of routes; track $index) {\n <div class=\"card-wrapper\" (click)=\"toggleRouteSelection(route)\">\n <div\n class=\"route-card bg-white dark:bg-slate-800 border transition-all duration-200\"\n [class.border-brand-blue]=\"selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.border-gray-300]=\"!selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.dark:border-slate-700]=\"!selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.selected]=\"selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n >\n <div class=\"task-header justify-between\">\n <span class=\"job-code\">{{ route.order_number || 'N/A' }}</span>\n <div class=\"flex gap-2\">\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">{{ route.unit?.charAt(0) || 'U' }}</div>\n @if (config.repository !== 'customer') {\n <div\n class=\"statusunit bg-slate-900 dark:bg-white text-white dark:text-black flex items-center justify-center cursor-pointer hover:opacity-80\"\n (click)=\"showDriverModal = true; toggleCollapse(); $event.stopPropagation()\"\n >\n <lucide-icon [img]=\"icons.CarFront\" [size]=\"15\"></lucide-icon>\n </div>\n }\n <div\n class=\"text-black dark:text-white flex items-center justify-center cursor-pointer hover:opacity-80\"\n (click)=\"selectedJobDetail.set(route); showDetailModal = true; $event.stopPropagation()\"\n >\n <lucide-icon [img]=\"icons.Info\" [size]=\"20\"></lucide-icon>\n </div>\n </div>\n </div>\n @if (config.repository === 'coolmap') {\n <div class=\"customer-name font-semibold truncate\">{{ route.customer_name }}</div>\n }\n <div class=\"material-info truncate text-gray-600 dark:text-gray-300\">{{ route.project || 'No Project' }}</div>\n <div class=\"location-flow mt-2 text-sm flex items-center gap-2\">\n <span class=\"pickup flex items-center gap-1 truncate max-w-[40%] text-green-600 dark:text-green-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.pickup_location || '').split('|')[0] || 'Unknown' }}\n </span>\n <span class=\"arrow text-gray-400\">→</span>\n <span class=\"delivery truncate max-w-[40%] text-brand-blue\">{{ (route.delivery_location || '').split('|')[0] || 'Unknown' }}</span>\n </div>\n <div class=\"material-info mt-2 truncate font-medium\">{{ route.material || '' }}</div>\n <div class=\"driver-row-4 mt-3 flex items-center gap-2\">\n <div class=\"progress-bar flex-1 h-1.5 bg-gray-200 dark:bg-slate-700 rounded-full overflow-hidden flex\">\n <div class=\"progress-segment completed h-full bg-green-500 transition-all duration-300\" [style.width.%]=\"calculateStatusPercentage('done', route)\"></div>\n <div class=\"progress-segment ongoing h-full transition-all duration-300\" [style.backgroundColor]=\"'#fc0'\" [style.width.%]=\"calculateStatusPercentage('ongoing', route)\"></div>\n <div class=\"progress-segment open h-full bg-gray-300 dark:bg-slate-600 transition-all duration-300\" [style.width.%]=\"calculateStatusPercentage('open', route)\"></div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n<lib-driver-list\n [(modalOpen)]=\"showDriverModal\"\n [driverListcollapse]=\"driverListcollapse()\"\n></lib-driver-list>\n<lib-job-details [(modalOpen)]=\"showDetailModal\" [routeData]=\"selectedJobDetail()\"></lib-job-details>\n","import { Component, EventEmitter, Output, input, inject, computed } from '@angular/core';\nimport { CommonModule, CurrencyPipe } from '@angular/common';\nimport { LucideAngularModule, X } from 'lucide-angular';\nimport { UtilsService } from '@aggdirect/coolmap-services';\n\n@Component({\n selector: 'lib-route-info-card',\n standalone: true,\n imports: [LucideAngularModule, CommonModule, CurrencyPipe],\n templateUrl: './route-info-card.component.html',\n styleUrl: './route-info-card.component.scss',\n})\nexport class RouteInfoCardComponent {\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n repository = input<string | null>('coolmap');\n displayMode = input<'dispatch' | 'catalog'>('dispatch');\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() edit = new EventEmitter<void>();\n\n utils = inject(UtilsService);\n addRouteModal = false;\n\n formattedDate = computed(() => {\n const data = this.routeData();\n if (!data?.created_at) return 'N/A';\n return this.utils.getDateFormat(new Date(data.created_at), '/');\n });\n\n close() {\n this.modalOpenChange.emit(false);\n }\n\n icons = {\n X,\n };\n}\n","@if (modalOpen()) {\n<div \n class=\"z-[112] bottom-0 fixed lg:absolute inset-0 overflow-y-auto\"\n [ngClass]=\"displayMode() === 'catalog' ? 'lg:left-[300px]' : 'lg:right-[300px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div \n class=\"flex min-h-full lg:items-end items-center justify-center p-3\"\n [ngClass]=\"displayMode() === 'catalog' ? 'lg:justify-start' : 'lg:justify-end'\"\n >\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Route Info\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[60vh] overflow-y-auto p-3\">\n <div class=\"space-y-2 bg-gray-50 dark:bg-slate-900/50 border border-gray-200 dark:border-slate-700 p-3 rounded-lg mb-4\">\n <p class=\"text-xs\">\n <b class=\"text-gray-900 dark:text-white\">Pickup:</b> \n <span class=\"text-gray-600 dark:text-gray-400\">\n {{ (routeData()?.pickup_location || '').split('|')[1] || routeData()?.pickup_location || 'N/A' }}\n </span>\n </p>\n <p class=\"text-xs\">\n <b class=\"text-gray-900 dark:text-white\">Delivery:</b> \n <span class=\"text-gray-600 dark:text-gray-400\">\n {{ (routeData()?.delivery_location || '').split('|')[1] || routeData()?.delivery_location || 'N/A' }}\n </span>\n </p>\n </div>\n\n <div class=\"space-y-2.5\">\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Name:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.route_name || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Customer:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.customer_name || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Type:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.unit || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Distance:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.estimated_distance || '0' }} Miles</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Travel Time:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.estimated_time || '0' }} Min</span>\n </div>\n\n @if (repository() !== 'customer') {\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Trucker Pay Estimate:</b>\n <span class=\"text-brand-blue font-medium text-right ml-4\">{{ routeData()?.trucker_pay_estimate | currency }}</span>\n </div>\n }\n\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Customer Price Estimate:</b>\n <span class=\"text-brand-blue font-medium text-right ml-4\">{{ routeData()?.customer_price_estimate | currency }}</span>\n </div>\n\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Notes:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4 italic\">{{ routeData()?.note || 'None' }}</span>\n </div>\n </div>\n\n <div class=\"mt-4 pt-3 border-t border-gray-100 dark:border-slate-700 flex justify-between items-center\">\n <p class=\"text-[10px] text-gray-400 italic\">\n Created by {{ routeData()?.created_by_name || routeData()?.user || 'System' }} on {{ formattedDate() }}\n </p>\n @if (displayMode() === 'catalog') {\n <button \n type=\"button\"\n (click)=\"edit.emit(); close()\"\n class=\"px-3 py-1 text-[11px] font-bold uppercase tracking-wider bg-orange-500 hover:bg-orange-600 text-white rounded transition-colors\"\n >\n Edit\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n}","import { Component, EventEmitter, Output, input, signal, inject, Input, OnInit, computed } from '@angular/core';\nimport { NgClass, NgIf, NgFor } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { LucideAngularModule, X, Info, Share2, CheckCircle, LoaderCircle } from 'lucide-angular';\nimport { RouteInfoCardComponent } from '../route-info-card/route-info-card.component';\nimport { COOLMAP_CONFIG, CoolmapRoute, UtilsService, CoolmapService } from '@aggdirect/coolmap-services';\n@Component({\n selector: 'lib-job-route-list',\n standalone: true,\n imports: [LucideAngularModule, RouteInfoCardComponent, NgClass, ScrollingModule],\n templateUrl: './job-route-list.component.html',\n styleUrl: './job-route-list.component.scss',\n})\nexport class JobRouteListComponent implements OnInit {\n config = inject(COOLMAP_CONFIG);\n @Input() customerRepoDetails?: { customer: { id?: string, name?: string }, projectId: string };\n utils = inject(UtilsService);\n coolmapService = inject(CoolmapService);\n \n unitList: any[] = [];\n materialsList: any[] = [];\n \n routes = signal<CoolmapRoute[]>([]);\n searchTerm = signal<string>('');\n selectedRouteIds = input<string[]>([]);\n filters = signal<any[]>([]);\n showSuggestions = signal(false);\n\n suggestions = computed(() => {\n const term = this.searchTerm();\n if (term.length < 1) return [];\n return this.utils.filter(term, this.filters());\n });\n\n filteredRoutes = computed(() => {\n let list = this.routes();\n const activeFilters = this.filters();\n \n // Apply category search from V1 logic\n if (activeFilters.length > 0) {\n list = this.utils.getSearchResults(list, activeFilters);\n }\n \n const search = this.searchTerm().toLowerCase().trim();\n if (!search || this.showSuggestions()) return list;\n \n return list.filter(r => {\n const id = this.getRouteId(r).toLowerCase();\n const order = (r.order_number || '').toLowerCase();\n const name = (r.route_name || '').toLowerCase();\n return id.includes(search) || order.includes(search) || name.includes(search);\n });\n });\n\n allSelected = computed(() => {\n const visible = this.filteredRoutes();\n const selected = this.selectedRouteIds();\n if (visible.length === 0) return false;\n return visible.every(r => selected.includes(this.getRouteId(r)));\n });\n\n isAnyPlotting = computed(() => {\n const prefix = this.modalOpen() ? 'jobrouteList' : 'jobcode';\n const plotting = this.coolmapService.plottingIds();\n return Array.from(plotting).some(id => id.startsWith(`${prefix}-`));\n });\n \n showRouteModal = false;\n modalOpen = input<boolean>(false);\n \n @Input() set initialRoutes(val: CoolmapRoute[]) {\n if (val) {\n this.routes.set(val);\n this.utils.clearOptions();\n val.forEach(r => this.utils.makeOptions(r));\n }\n }\n\n selectedRoute = signal<any>(null);\n\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() routeSelect = new EventEmitter<CoolmapRoute>();\n @Output() masterToggleEvent = new EventEmitter<CoolmapRoute[]>();\n\n ngOnInit(): void {\n this.checkAndCallRouteList();\n }\n\n checkAndCallRouteList() {\n this.utils.clearOptions();\n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((res: any) => {\n this.unitList = res;\n this.utils.fetchMaterialsListForCustomer().then((res: any) => {\n this.materialsList = res;\n this.getRouteListForCustomer();\n });\n });\n } else {\n this.getRouteListForCoolMap();\n }\n }\n\n getRouteListForCoolMap() {\n this.utils.getData('routes/all').subscribe((res: any) => {\n if (res && res.data) {\n const list = res.data;\n list.forEach((ele: CoolmapRoute) => this.utils.makeOptions(ele));\n this.routes.set(list);\n }\n });\n }\n\n getRouteListForCustomer() {\n const customerId = this.customerRepoDetails?.customer.id;\n if (customerId) {\n this.utils.postdata('routes/all', { customer_id: customerId }).subscribe((res: any) => {\n if (res && res.data) {\n const list = res.data.map((ele: CoolmapRoute) => {\n ele.unit = this.getUnitName(ele);\n this.utils.makeOptions(ele);\n return ele;\n });\n this.routes.set(list);\n }\n });\n }\n }\n\n getUnitName(data: any): string {\n let unitName = '';\n this.unitList.forEach((res) => {\n if (res.id === data.unit_id) {\n unitName = res.type;\n }\n });\n return unitName || data.unit;\n }\n\n close() {\n this.modalOpenChange.emit(false);\n }\n\n isRouteSelected(route: CoolmapRoute): boolean {\n const id = this.getRouteId(route);\n return this.selectedRouteIds().includes(id || '');\n }\n\n toggleRoute(route: CoolmapRoute) {\n if (this.isPlotting(route)) return;\n this.routeSelect.emit(route);\n }\n\n onMasterToggle() {\n if (this.isAnyPlotting()) return;\n this.masterToggleEvent.emit(this.filteredRoutes());\n }\n\n addFilter(option: any) {\n // V1 behavior: keep single filter\n this.filters.set([{ name: option.label, type: option.type, value: option.value }]);\n this.searchTerm.set('');\n this.showSuggestions.set(false);\n }\n\n removeFilter() {\n this.filters.set([]);\n }\n\n handleSearchInput(val: string) {\n this.searchTerm.set(val);\n this.showSuggestions.set(true);\n }\n\n onSearchBlur() {\n // Delay hiding to allow (click) on suggestions to fire first\n setTimeout(() => {\n this.showSuggestions.set(false);\n }, 200);\n }\n\n get hasFilter(): boolean {\n return this.filters().length > 0;\n }\n\n isPlotting(route: CoolmapRoute): boolean {\n const prefix = this.modalOpen() ? 'jobrouteList' : 'jobcode';\n const id = this.getRouteId(route);\n return this.coolmapService.plottingIds().has(`${prefix}-${id}`);\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n\n icons = {\n X,\n Info,\n Share2,\n CheckCircle,\n LoaderCircle\n };\n}\n","@if (modalOpen()) {\n<div class=\"fixed z-[111] route-list\">\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <aside class=\"detail-drawer top-[0] sm:top-[115px]\" (click)=\"$event.stopPropagation()\">\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900\"\n >\n <h3 class=\"flex items-center gap-1 font-semibold text-gray-900 dark:text-white text-[14px]\">\n List of Routes\n <span class=\"text-xs font-normal text-gray-400\">({{ filteredRoutes().length }})</span>\n </h3>\n <button\n type=\"button\"\n (click)=\"onMasterToggle()\"\n [disabled]=\"isAnyPlotting()\"\n class=\"inline-flex items-center justify-center gap-2 px-3 sm:px-4 py-1.5 bg-brand-blue hover:bg-blue-700 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-[12px]\"\n >\n {{ allSelected() ? 'Uncheck All' : 'Check All' }}\n </button>\n <button\n (click)=\"close()\"\n class=\"p-1.5 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"18\"></lucide-icon>\n </button>\n </div>\n <div class=\"p-2\">\n <div class=\"relative w-full\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <lucide-icon [img]=\"hasFilter ? icons.Info : icons.Share2\" class=\"text-gray-400\" [size]=\"18\"></lucide-icon>\n </div>\n <input\n type=\"text\"\n #searchinput\n [value]=\"searchTerm()\"\n (input)=\"handleSearchInput(searchinput.value)\"\n (focus)=\"showSuggestions.set(true)\"\n (blur)=\"onSearchBlur()\"\n placeholder=\"Search...\"\n class=\"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm\"\n />\n\n <!-- Autocomplete Suggestions Dropdown -->\n @if (showSuggestions() && suggestions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-60 overflow-y-auto\">\n <ul class=\"py-1 text-sm text-gray-700 dark:text-gray-200\">\n @for (option of suggestions(); track option.label + option.type) {\n <li (click)=\"addFilter(option)\"\n class=\"px-4 py-2 hover:bg-brand-blue/10 dark:hover:bg-brand-blue/20 cursor-pointer flex justify-between items-center group\">\n <span>\n <span class=\"font-semibold text-brand-blue capitalize\">{{option.type}}:</span> \n {{option.label}}\n </span>\n <lucide-icon [img]=\"icons.CheckCircle\" class=\"opacity-0 group-hover:opacity-100 text-brand-blue transition-opacity\" [size]=\"16\"></lucide-icon>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n\n <!-- Active Filter Chips -->\n @if (hasFilter) {\n <div class=\"flex flex-wrap gap-2 mt-2 px-1\">\n @for (filter of filters(); track filter.name + filter.type) {\n <div class=\"inline-flex items-center gap-1.5 px-3 py-1 bg-brand-blue/10 border border-brand-blue/20 text-brand-blue rounded-full text-xs font-medium\">\n <span class=\"capitalize\">{{filter.type}}:</span>\n <span class=\"truncate max-w-[150px]\">{{filter.name}}</span>\n <button (click)=\"removeFilter()\" class=\"hover:text-red-500 transition-colors\">\n <lucide-icon [img]=\"icons.X\" [size]=\"14\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"overflow-y-auto p-2 drawer-listing-box\">\n <cdk-virtual-scroll-viewport itemSize=\"60\" class=\"routeList-viewport h-[calc(100vh-250px)]\">\n @if (filteredRoutes().length > 0) {\n <ul class=\"route-list-ul gap-2 flex flex-col\">\n @for (route of filteredRoutes(); track getRouteId(route)) {\n <li \n class=\"route-li-v1 bg-white dark:bg-slate-800 border border-gray-300 dark:border-slate-700\" \n [class.selected]=\"isRouteSelected(route)\" \n [class.pointer-events-none]=\"isAnyPlotting()\"\n [class.opacity-60]=\"isAnyPlotting()\"\n (click)=\"toggleRoute(route)\">\n <div class=\"task-header justify-between\">\n <span class=\"job-code\"> {{route.route_name || route.order_number}} </span>\n @if (config.repository === 'coolmap') {\n <span class=\"job-code\">{{route.customer_name}}</span>\n }\n <div class=\"iconprt\">\n @if (isPlotting(route)) {\n <div class=\"plotting-spinner\">\n <lucide-icon [img]=\"icons.LoaderCircle\" class=\"animate-spin text-black dark:text-white flex items-center justify-center relative z-10\" [size]=\"18\"></lucide-icon>\n </div>\n }\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">\n {{ route.unit?.charAt(0) || 'U' }}\n </div>\n <div class=\"infoicon\" (click)=\"$event.stopPropagation(); selectedRoute.set(route); showRouteModal = true\">\n <lucide-icon [img]=\"icons.Info\" [size]=\"18\" class=\"text-gray-400\"></lucide-icon>\n </div>\n @if (config.repository === 'customer') {\n <div class=\"infoicon\" (click)=\"$event.stopPropagation()\">\n <lucide-icon [img]=\"icons.Share2\" [size]=\"16\" class=\"text-gray-400\"></lucide-icon>\n </div>\n }\n </div>\n </div>\n \n <div class=\"location-flow bg-gray-100 dark:bg-slate-900 px-2 py-2 pb-3 rounded-lg\">\n <span class=\"pickup\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.pickup_location || '').split('|')[1] ? (route.pickup_location || '').split('|')[1] : (route.pickup_location || '') }}\n </span>\n <span class=\"delivery\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.delivery_location || '').split('|')[1] ? (route.delivery_location || '').split('|')[1] : (route.delivery_location || '') }}\n </span>\n </div>\n </li>\n }\n </ul>\n } @else if (routes().length === 0) {\n <div class=\"p-8 text-center text-gray-400\">\n No routes available for this perspective.\n </div>\n }\n </cdk-virtual-scroll-viewport>\n </div>\n </aside>\n</div>\n}\n<lib-route-info-card [(modalOpen)]=\"showRouteModal\" [routeData]=\"selectedRoute()\" [repository]=\"config.repository\" displayMode=\"dispatch\"></lib-route-info-card>\n","import { Component, Input, Output, EventEmitter, signal, inject } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { LucideAngularModule, Info, ChevronRight, ChevronLeft } from 'lucide-angular';\nimport { COOLMAP_CONFIG, CoolmapRoute } from '@aggdirect/coolmap-services';\nimport { RouteInfoCardComponent } from '../route-info-card/route-info-card.component';\n\nexport type CardListMode = 'sidebar' | 'floating' | 'inline';\n\n@Component({\n selector: 'lib-view-route-list',\n standalone: true,\n imports: [LucideAngularModule, RouteInfoCardComponent, NgClass],\n templateUrl: './view-route-list.component.html',\n styleUrl: './view-route-list.component.scss',\n})\nexport class ViewRouteListComponent {\n showRouteModal = false;\n selectedRoute = signal<CoolmapRoute | null>(null);\n config = inject(COOLMAP_CONFIG);\n\n @Input() listMode: CardListMode = 'sidebar';\n @Input() collapsible = true;\n @Input() routes: CoolmapRoute[] = [];\n @Input() selectedRouteIds: string[] = [];\n @Output() routeSelect = new EventEmitter<string>();\n @Output() editRoute = new EventEmitter<CoolmapRoute>();\n\n collapsed = false;\n\n icons = {\n Info,\n ChevronRight,\n ChevronLeft\n };\n\n toggleCollapse() {\n if (this.collapsible) {\n this.collapsed = !this.collapsed;\n }\n }\n\n toggleRouteSelection(route: CoolmapRoute) {\n const id = this.getRouteId(route);\n if (!id) return;\n this.routeSelect.emit(id);\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n}\n","<div\n class=\"cards-list-container\"\n [class.floating]=\"listMode === 'floating'\"\n [class.sidebar]=\"listMode === 'sidebar'\"\n [class.inline]=\"listMode === 'inline'\"\n [class.collapsed]=\"collapsed\"\n>\n @if (listMode !== 'inline') {\n <div class=\"list-header\">\n <div class=\"header-title\">\n <span class=\"title-text\">View Route</span>\n <span class=\"routes-count\">({{ routes.length || 0 }})</span>\n </div>\n <button\n class=\"collapse-btn\"\n (click)=\"toggleCollapse()\"\n [title]=\"collapsed ? 'Expand' : 'Collapse'\"\n >\n @if (collapsed) {\n <lucide-icon [img]=\"icons.ChevronRight\" [size]=\"16\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"icons.ChevronLeft\" [size]=\"16\"></lucide-icon>\n }\n </button>\n </div>\n } \n \n @if (!collapsed) {\n <div class=\"cards-scroll-container\" #scrollContainer>\n <div class=\"cards-list\">\n @for (route of routes; track getRouteId(route)) {\n <div class=\"card-wrapper\" (click)=\"toggleRouteSelection(route)\">\n <div\n class=\"route-card bg-white dark:bg-slate-800 border transition-all duration-200\"\n [class.border-brand-blue]=\"selectedRouteIds.includes(getRouteId(route))\"\n [class.border-gray-200]=\"!selectedRouteIds.includes(getRouteId(route))\"\n [class.dark:border-slate-700]=\"!selectedRouteIds.includes(getRouteId(route))\"\n [class.selected]=\"selectedRouteIds.includes(getRouteId(route))\"\n >\n <div class=\"task-header justify-between items-start mb-1\">\n <h2 class=\"text-sm font-semibold text-gray-900 dark:text-white truncate max-w-[80%]\">\n {{ route.route_name || route.order_number || 'Unnamed Route' }}\n </h2>\n <div class=\"flex gap-2 shrink-0\">\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">\n {{ route.unit?.charAt(0) || 'U' }}\n </div>\n <button\n type=\"button\"\n class=\"text-gray-400 hover:text-brand-blue transition-colors\"\n (click)=\"$event.stopPropagation(); selectedRoute.set(route); showRouteModal = true\"\n >\n <lucide-icon [img]=\"icons.Info\" [size]=\"18\"></lucide-icon>\n </button>\n </div>\n </div>\n \n @if (route.customer_name) {\n <div class=\"text-[10px] text-gray-500 dark:text-slate-500 mb-2 uppercase tracking-wider font-medium truncate\">\n {{ route.customer_name }}\n </div>\n }\n\n <div class=\"location-flow bg-gray-50 dark:bg-slate-900/50 border border-gray-100 dark:border-slate-700/50 p-2 rounded-lg\">\n <div class=\"text-[11px] truncate flex items-center gap-1.5 text-gray-600 dark:text-gray-400\">\n <div class=\"w-1.5 h-1.5 rounded-full bg-green-500 shrink-0\"></div>\n {{ (route.pickup_location || '').split('|')[1] || route.pickup_location || 'N/A' }}\n </div>\n <div class=\"text-[11px] truncate flex items-center gap-1.5 mt-1 text-gray-600 dark:text-gray-400\">\n <div class=\"w-1.5 h-1.5 rounded-full bg-blue-500 shrink-0\"></div>\n {{ (route.delivery_location || '').split('|')[1] || route.delivery_location || 'N/A' }}\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"p-8 text-center text-gray-400 text-sm italic\">\n No routes found in this catalog.\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<lib-route-info-card \n [(modalOpen)]=\"showRouteModal\" \n [routeData]=\"selectedRoute()\" \n [repository]=\"config.repository\" \n displayMode=\"catalog\"\n (edit)=\"editRoute.emit(selectedRoute()!)\"\n></lib-route-info-card>\n","import { Component, EventEmitter, HostListener, Output, input, signal, inject, effect, viewChild, ElementRef, AfterViewInit, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { LucideAngularModule, X, ChevronDown, Check, LoaderCircle } from 'lucide-angular';\nimport { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { filter, pairwise } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { COOLMAP_CONFIG, UtilsService, CoolmapService, LocationAll } from '@aggdirect/coolmap-services';\nimport { DestroyRef, ChangeDetectorRef } from '@angular/core';\n\n@Component({\n selector: 'lib-add-route',\n standalone: true,\n imports: [LucideAngularModule, ReactiveFormsModule, CommonModule],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './add-route.component.html',\n styleUrl: './add-route.component.scss',\n})\nexport class AddRouteComponent implements AfterViewInit {\n config = inject(COOLMAP_CONFIG);\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n customerRepoDetails = input<any>(null);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() routeDeleted = new EventEmitter<string>();\n @Output() routeSaved = new EventEmitter<any>();\n dragX = signal(0);\n dragY = signal(0);\n isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragInitialX = 0;\n private dragInitialY = 0;\n\n // New Services\n utils = inject(UtilsService);\n coolMapService = inject(CoolmapService);\n destroyRef = inject(DestroyRef);\n cdr = inject(ChangeDetectorRef);\n\n addRouteForm = new FormGroup({\n route_name: new FormControl('', [Validators.required]),\n customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),\n customer_id: new FormControl(''),\n unit_id: new FormControl('', [Validators.required]),\n path: new FormControl('', [Validators.required]),\n pickup_location: new FormControl('', [Validators.required]),\n pickup_lat_lng: new FormControl('', [Validators.required]),\n delivery_location: new FormControl('', [Validators.required]),\n delivery_lat_lng: new FormControl('', [Validators.required]),\n estimated_distance: new FormControl('', [Validators.required]),\n estimated_time: new FormControl('', [Validators.required]),\n note: new FormControl('', [Validators.maxLength(2048)]),\n trucker_pay_estimate: new FormControl(null),\n customer_price_estimate: new FormControl(null),\n pickUpSearchOption: new FormControl(inject(COOLMAP_CONFIG).repository === 'coolmap' ? 'system' : 'google'),\n deliverySearchOtption: new FormControl(inject(COOLMAP_CONFIG).repository === 'coolmap' ? 'system' : 'google'),\n });\n\n // Data signals\n unitsList = signal<any[]>([]);\n locationList = signal<LocationAll[]>([]);\n customersList = signal<any[]>([]);\n showDeleteModal = signal(false);\n routeId = signal<string | null>(null);\n preventSave = signal(false);\n preventInitialSave = signal(false);\n \n // Search options\n customerOptions = signal<any[]>([]);\n pickupOptions = signal<LocationAll[]>([]);\n deliveryOptions = signal<LocationAll[]>([]);\n \n // UI toggles\n showCustomerDropdown = signal(false);\n showPickupDropdown = signal(false);\n showDeliveryDropdown = signal(false);\n loadingLocations = signal(false);\n loadingCustomers = signal(false);\n\n hideDropdown(type: string) {\n setTimeout(() => {\n if (type === 'customer') this.showCustomerDropdown.set(false);\n if (type === 'pickup') this.showPickupDropdown.set(false);\n if (type === 'delivery') this.showDeliveryDropdown.set(false);\n }, 200);\n }\n\n // ElementRefs for Google Maps integration\n filterPickup = viewChild<ElementRef>('filterPickup');\n filterDelivery = viewChild<ElementRef>('filterDelivery');\n\n get isSystemPickup() {\n return this.addRouteForm.get('pickUpSearchOption')?.value === 'system';\n }\n\n get isSystemDelivery() {\n return this.addRouteForm.get('deliverySearchOtption')?.value === 'system';\n }\n\n get selectedUnitName() {\n const unitId = this.addRouteForm.value.unit_id;\n if (!unitId) return 'Select Unit/Driver';\n const unit = this.unitsList().find(u => u.id === unitId);\n return unit ? unit.type : 'Select Unit/Driver';\n }\n\n constructor() {\n\n\n // Effect for handling routeData Input\n effect(() => {\n const data = this.routeData();\n setTimeout(() => {\n this.inIt(data);\n }, 0);\n });\n\n effect(() => {\n if (this.modalOpen()) {\n this.coolMapService.clearAllRoutes();\n this.utils.fetchUnitsList().then((res: any) => {\n this.unitsList.set(res || []);\n });\n\n if (this.config.repository === 'coolmap') {\n this.loadingLocations.set(true);\n this.addRouteForm.get('pickup_location')?.disable();\n this.addRouteForm.get('delivery_location')?.disable();\n \n this.utils.fetchLocationlist().then((res: any) => {\n this.locationList.set(res || []);\n this.pickupOptions.set(res || []);\n this.deliveryOptions.set(res || []);\n this.loadingLocations.set(false);\n this.addRouteForm.get('pickup_location')?.enable();\n this.addRouteForm.get('delivery_location')?.enable();\n });\n this.loadingCustomers.set(true);\n this.utils.fetchCustomersList().then((res: any) => {\n this.customersList.set(res || []);\n this.customerOptions.set(res || []);\n this.addRouteForm.controls['customer_name'].enable();\n this.loadingCustomers.set(false);\n });\n }\n\n setTimeout(() => {\n this.bindGoogleAutocomplete();\n }, 150);\n }\n });\n\n // Reacting to dropdown changes for re-running calculations\n this.addRouteForm.get('pickup_location')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (res && res !== this.addRouteForm.getRawValue().pickup_location) {\n this.addRouteForm.patchValue({ pickup_lat_lng: '' });\n }\n // Populate dropdown for system\n if (this.isSystemPickup) {\n if (!res) {\n this.pickupOptions.set(this.locationList());\n } else {\n const lower = res.toLowerCase();\n this.pickupOptions.set(this.locationList().filter(l => l.formatted_address.toLowerCase().includes(lower)));\n }\n }\n });\n\n this.addRouteForm.get('delivery_location')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (res && res !== this.addRouteForm.getRawValue().delivery_location) {\n this.addRouteForm.patchValue({ delivery_lat_lng: '' });\n }\n if (this.isSystemDelivery) {\n if (!res) {\n this.deliveryOptions.set(this.locationList());\n } else {\n const lower = res.toLowerCase();\n this.deliveryOptions.set(this.locationList().filter(l => l.formatted_address.toLowerCase().includes(lower)));\n }\n }\n });\n\n this.addRouteForm.get('customer_name')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (!res) {\n this.customerOptions.set(this.customersList());\n } else {\n const lower = res.toLowerCase();\n this.customerOptions.set(this.customersList().filter(c => c.customer_name.toLowerCase().includes(lower)));\n }\n });\n \n // Clear path if logic changes\n this.addRouteForm.valueChanges.pipe(\n takeUntilDestroyed(),\n pairwise(),\n filter(([prev, curr]) => {\n return (prev.pickUpSearchOption === curr.pickUpSearchOption) && \n prev.deliverySearchOtption === curr.deliverySearchOtption\n })\n ).subscribe(() => {\n if (this.preventInitialSave()) {\n this.preventInitialSave.set(false);\n }\n });\n }\n\n ngAfterViewInit() {\n // Listen for search mode changes\n this.addRouteForm.get('pickUpSearchOption')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\n this.addRouteForm.patchValue({ pickup_location: null, pickup_lat_lng: null });\n });\n\n this.addRouteForm.get('deliverySearchOtption')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\n this.addRouteForm.patchValue({ delivery_location: null, delivery_lat_lng: null });\n });\n }\n\n async onGooglePlaceSelect(event: any, type: 'pickup' | 'delivery') {\n console.log('event', event);\n const place = event.placePrediction?.toPlace();\n if (!place) return;\n \n // The google API wrapper may require raw DOM event access depending on module configuration\n try {\n await place.fetchFields({ fields: ['location', 'formattedAddress', 'displayName'] });\n const res = {\n lat: place.location.lat(),\n lng: place.location.lng(),\n formatted_address: place.formattedAddress || place.displayName\n };\n this.patchAddressValue(res, type);\n } catch(e) {\n console.warn(\"Failed to retrieve Place data natively: \", e);\n }\n }\n\n bindGoogleAutocomplete() {\n const pickupEl = this.filterPickup()?.nativeElement;\n const deliveryEl = this.filterDelivery()?.nativeElement;\n\n if (pickupEl) {\n const autocomplete = new (window as any).google.maps.places.Autocomplete(pickupEl);\n autocomplete.addListener('place_changed', () => {\n const place = autocomplete.getPlace();\n if (place.geometry) {\n const res = {\n lat: place.geometry.location.lat(),\n lng: place.geometry.location.lng(),\n formatted_address: place.formatted_address || place.name\n };\n this.patchAddressValue(res, 'pickup');\n }\n });\n }\n\n if (deliveryEl) {\n const autocomplete = new (window as any).google.maps.places.Autocomplete(deliveryEl);\n autocomplete.addListener('place_changed', () => {\n const place = autocomplete.getPlace();\n if (place.geometry) {\n const res = {\n lat: place.geometry.location.lat(),\n lng: place.geometry.location.lng(),\n formatted_address: place.formatted_address || place.name\n };\n this.patchAddressValue(res, 'delivery');\n }\n });\n }\n }\n\n inIt(changes: any) {\n if (changes && Object.keys(changes).length > 0) {\n if (!changes.prevent) {\n this.preventSave.set(false);\n this.patchFormValue(changes).then(() => {\n this.checkAndFetchRouteInformation(true);\n });\n }\n } else {\n this.preventSave.set(true);\n this.patchFormValue().then(() => {\n this.checkAndFetchRouteInformation();\n });\n }\n }\n\n async patchFormValue(data?: any) {\n this.addRouteForm.reset();\n const isCustomerRepo = this.config.repository === 'customer';\n if (data) {\n this.addRouteForm.patchValue(data, { emitEvent: false });\n }\n if (isCustomerRepo && this.customerRepoDetails()) {\n this.addRouteForm.patchValue({\n customer_id: this.customerRepoDetails().customer?.id,\n customer_name: this.customerRepoDetails().customer?.name,\n pickUpSearchOption: 'google',\n deliverySearchOtption: 'google'\n }, { emitEvent: false });\n } else {\n this.addRouteForm.patchValue({\n pickUpSearchOption: (!data || (data.hasOwnProperty('is_system_pickup') ? data.is_system_pickup : true)) ? 'system' : 'google',\n deliverySearchOtption: (!data || (data.hasOwnProperty('is_system_delivery') ? data.is_system_delivery : true)) ? 'system' : 'google',\n }, { emitEvent: false });\n }\n this.routeId.set(data?.route_id || data?.id || null);\n await true;\n }\n\n patchAddressValue(data: any, type: string) {\n this.addRouteForm.patchValue({\n [type + '_location']: data.formatted_address,\n [type + '_lat_lng']: `${data.lat},${data.lng}`\n });\n this.checkAndFetchRouteInformation();\n }\n\n checkAndFetchRouteInformation(isinitial?: boolean) {\n const val = this.addRouteForm.value;\n if (val.delivery_lat_lng && val.pickup_lat_lng && val.unit_id) {\n const unit = this.unitsList().find((x: any) => x.id === val.unit_id);\n const param = {\n delivery_lat_lng: val.delivery_lat_lng,\n pickup_lat_lng: val.pickup_lat_lng,\n unit: unit?.type || 'Ton'\n };\n // Mapbox estimation route\n this.utils.postdata('calculate/routes/estimation', param).subscribe({\n next: (res: any) => {\n setTimeout(() => {\n if (res && res.path) {\n this.addRouteForm.patchValue({\n estimated_distance: res.dist,\n estimated_time: res.time,\n path: res.path,\n trucker_pay_estimate: res.trucker_haul_cost,\n customer_price_estimate: res.customer_price_estimate\n });\n // Decode and plot\n let path = res.path.split(';').map((str: string) => {\n const parts = str.split(',');\n return [parseFloat(parts[1]), parseFloat(parts[0])];\n });\n const element: any = {\n type: 'FeatureCollection',\n features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: path } }]\n };\n this.coolMapService.removeRouteAndMarker(1).then(() => {\n this.coolMapService.loadMapProperty(element, 1, unit?.type, {\n pickup_location: val.pickup_location,\n delivery_location: val.delivery_location,\n route_name: val.route_name,\n unit: unit?.type\n });\n this.preventSave.set(true);\n this.cdr.detectChanges();\n });\n } else {\n console.warn('Could not calculate route');\n this.preventSave.set(true);\n this.utils.openSnackBar((res?.status ? res.status : 'Somthing went wrong, Please try different address.'), 'error');\n this.cdr.detectChanges();\n }\n if (this.routeId() && isinitial) {\n this.preventInitialSave.set(true);\n this.cdr.detectChanges();\n }\n });\n }\n });\n } else {\n this.coolMapService.removeRouteAndMarker(1, 'addroute');\n }\n }\n\n saveRoute() {\n if (this.addRouteForm.valid) {\n const data: any = this.addRouteForm.getRawValue();\n const endpoint = this.routeId() ? 'update/routes' : 'add/routes';\n if (this.routeId()) data.id = this.routeId();\n \n this.utils.postdata(endpoint, data).subscribe({\n next: (res: any) => {\n if (res.success) {\n this.utils.openSnackBar(res.message, 'success');\n // Emit the saved data for local synchronization\n this.routeSaved.emit(data);\n this.close();\n } else {\n this.utils.openSnackBar(res.message, 'error');\n }\n }\n });\n } else {\n this.addRouteForm.markAllAsTouched();\n }\n }\n\n promptDelete() {\n this.showDeleteModal.set(true);\n }\n\n confirmDelete() {\n if (!this.routeId()) return;\n this.utils.postdata('delete/routes', { uuid: this.routeId() }).subscribe({\n next: (res: any) => {\n if (res?.data?.success) {\n this.utils.openSnackBar(res.data.message, 'success');\n const deletedId = this.routeId()!;\n this.routeDeleted.emit(deletedId);\n this.showDeleteModal.set(false);\n this.close();\n }\n }\n });\n }\n\n close() {\n const isCoolmap = this.config.repository === 'coolmap';\n this.addRouteForm.reset({\n pickUpSearchOption: isCoolmap ? 'system' : 'google',\n deliverySearchOtption: isCoolmap ? 'system' : 'google'\n });\n this.coolMapService.removeRouteAndMarker(1, 'addroute');\n this.modalOpenChange.emit(false);\n }\n icons = {\n X, ChevronDown, Check, LoaderCircle\n };\n\n // Dynamic dropdown state logic\n dropdownOpen = signal(false);\n selectedUnitDriver = signal<string | null>(null);\n\n toggleDropdown() {\n this.dropdownOpen.update(v => !v);\n }\n\n selectOption(opt: string) {\n this.selectedUnitDriver.set(opt);\n this.dropdownOpen.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n closeDropdowns(event: Event) {\n // Basic click-outside wrapper\n const target = event.target as HTMLElement;\n if (!target.closest('.relative')) {\n this.dropdownOpen.set(false);\n }\n }\n\n startDrag(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.tagName.toLowerCase() === 'button' || target.closest('button')) {\n return;\n }\n this.isDragging = true;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.dragInitialX = this.dragX();\n this.dragInitialY = this.dragY();\n event.preventDefault();\n }\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging || !this.modalOpen()) return;\n this.dragX.set(this.dragInitialX + (event.clientX - this.dragStartX));\n this.dragY.set(this.dragInitialY + (event.clientY - this.dragStartY));\n }\n @HostListener('document:mouseup')\n onMouseUp(): void {\n this.isDragging = false;\n }\n}\n\n","@if (modalOpen()) {\n<div class=\"fixed inset-0 z-[112] overflow-y-auto\">\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <form\n [formGroup]=\"addRouteForm\"\n (ngSubmit)=\"saveRoute()\"\n class=\"pointer-events-auto relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[1000px]\"\n [style.transform]=\"'translate(' + dragX() + 'px, ' + dragY() + 'px)'\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-slate-700 cursor-move\"\n (mousedown)=\"startDrag($event)\"\n >\n <h3 class=\"flex items-center gap-1 text-lg font-semibold text-gray-900 dark:text-white\">\n {{ routeId() ? 'Edit Route' : 'Add Route' }}\n </h3>\n <div class=\"flex items-center gap-4\">\n <button\n type=\"submit\"\n class=\"inline-flex items-center justify-center gap-2 px-4 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-lg transition-colors text-sm\">\n Save\n </button>\n @if (routeId()) {\n <button\n type=\"button\"\n (click)=\"promptDelete()\"\n class=\"inline-flex items-center gap-2 px-4 py-2 bg-red-600 text-white hover:bg-red-700 font-medium rounded-lg transition-colors text-sm\"\n >\n Delete\n </button>\n }\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 px-4 py-2 bg-gray-600 text-white hover:bg-gray-700 font-medium rounded-lg transition-colors text-sm\"\n (click)=\"close()\"\n >\n Close\n </button>\n </div>\n </div>\n <div class=\"max-h-[70vh] overflow-y-auto p-4\">\n <div class=\"grid grid-cols-2 mb-[1rem] gap-4\">\n <div>\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Route Name</label\n >\n <input\n type=\"text\"\n formControlName=\"route_name\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm\"\n />\n </div>\n <div class=\"relative\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Customer Name</label>\n <div class=\"relative\">\n <input\n type=\"text\"\n formControlName=\"customer_name\"\n (focus)=\"showCustomerDropdown.set(true)\"\n (blur)=\"hideDropdown('customer')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingCustomers()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n </div>\n @if (showCustomerDropdown() && customerOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (cust of customerOptions(); track cust.customer_id) {\n <div \n (mousedown)=\"addRouteForm.patchValue({customer_name: cust.customer_name})\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ cust.customer_name }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n <div class=\"grid grid-cols-1 mb-[1rem]\">\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-3 py-3 rounded-lg\"\n >\n @if (config.repository === 'coolmap') {\n <div class=\"flex gap-2 mb-2\">\n <div class=\"radio w-100 md:w-auto\">\n <input\n type=\"radio\"\n formControlName=\"pickUpSearchOption\"\n value=\"system\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"\n />\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\"\n >\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">System Search</div>\n </div>\n </label>\n </div>\n <div class=\"radio w-100 md:w-auto ml-2\">\n <input\n type=\"radio\"\n formControlName=\"pickUpSearchOption\"\n value=\"google\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"\n />\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\"\n >\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">Google Search</div>\n </div>\n </label>\n </div>\n </div>\n }\n <div class=\"relative\">\n <input\n #filterPickup\n type=\"text\"\n formControlName=\"pickup_location\"\n placeholder=\"Pickup\"\n (focus)=\"showPickupDropdown.set(true)\"\n (blur)=\"hideDropdown('pickup')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingLocations()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n @if (isSystemPickup && showPickupDropdown() && pickupOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (loc of pickupOptions(); track loc.formatted_address) {\n <div \n (mousedown)=\"patchAddressValue(loc, 'pickup')\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ loc.formatted_address }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-1 mb-[1rem]\">\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-3 py-3 rounded-lg\"\n >\n @if (config.repository === 'coolmap') {\n <div class=\"flex gap-2 mb-2\">\n <div class=\"radio w-100 md:w-auto\">\n <input\n type=\"radio\"\n formControlName=\"deliverySearchOtption\"\n value=\"system\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"/>\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\">\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">System Search</div>\n </div>\n </label>\n </div>\n <div class=\"radio w-100 md:w-auto ml-2\">\n <input\n type=\"radio\"\n formControlName=\"deliverySearchOtption\"\n value=\"google\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"/>\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\">\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">Google Search</div>\n </div>\n </label>\n </div>\n </div>\n }\n <div class=\"relative\">\n <input\n #filterDelivery\n type=\"text\"\n formControlName=\"delivery_location\"\n placeholder=\"Delivery\"\n (focus)=\"showDeliveryDropdown.set(true)\"\n (blur)=\"hideDropdown('delivery')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingLocations()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n @if (isSystemDelivery && showDeliveryDropdown() && deliveryOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (loc of deliveryOptions(); track loc.formatted_address) {\n <div \n (mousedown)=\"patchAddressValue(loc, 'delivery')\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ loc.formatted_address }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"flex gap-4 flex-col md:flex-row\">\n <div class=\"w-full md:w-[70%]\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Notes</label\n >\n <textarea\n formControlName=\"note\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm h-[46px]\"\n ></textarea>\n </div>\n <div class=\"w-full md:w-[30%]\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Unit Type</label\n >\n <div class=\"relative w-full\">\n <button\n type=\"button\"\n (click)=\"toggleDropdown(); $event.stopPropagation()\"\n class=\"w-full flex justify-between items-center px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm text-left\"\n >\n <span>{{ selectedUnitName }}</span>\n <lucide-icon [img]=\"icons.ChevronDown\" [size]=\"16\" class=\"text-gray-400\"></lucide-icon>\n </button>\n @if (dropdownOpen()) {\n <div class=\"absolute z-10 mt-1 w-full bg-white dark:bg-slate-800 rounded-lg shadow-lg border border-gray-200 dark:border-slate-700 py-1 max-h-60 overflow-auto\">\n @for (opt of unitsList(); track opt.id) {\n <button\n type=\"button\"\n (click)=\"addRouteForm.patchValue({unit_id: opt.id}); checkAndFetchRouteInformation(); dropdownOpen.set(false)\"\n class=\"w-full flex items-center justify-between px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-slate-700 transition\"\n >\n <span>{{ opt.type }}</span>\n @if (addRouteForm.value.unit_id === opt.id) {\n <lucide-icon [img]=\"icons.Check\" [size]=\"16\" class=\"text-blue-500\"></lucide-icon>\n }\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-2 mt-2 gap-4\">\n <div class=\"flex flex-col lg:flex-row gap-2\">\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Estimation of miles - <b>{{ addRouteForm.value.estimated_distance || '0' }} Miles</b>\n </span>\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Estimation of time - <b>{{ addRouteForm.value.estimated_time || '0' }} Minutes</b>\n </span>\n </div>\n <div class=\"flex flex-col lg:flex-row gap-2 justify-end\">\n @if (config.repository !== 'customer') {\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Trucker Pay Estimate - <b>{{ addRouteForm.value.trucker_pay_estimate | currency }}</b>\n </span>\n }\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Customer Price Estimate - <b>{{ addRouteForm.value.customer_price_estimate | currency }}</b>\n </span>\n \n </div>\n </div>\n </div>\n </form>\n\n @if (showDeleteModal()) {\n <div class=\"fixed inset-0 z-[120] flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in pointer-events-auto\">\n <div class=\"bg-white dark:bg-slate-900 rounded-xl shadow-2xl p-6 max-w-sm w-full mx-4 border border-gray-200 dark:border-slate-800\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-lg font-bold text-gray-900 dark:text-white mb-2\">Delete Route?</h3>\n <p class=\"text-gray-600 dark:text-gray-400 text-sm mb-6\">\n Are you sure you want to delete this route?\n </p>\n <div class=\"flex justify-end gap-3\">\n <button\n type=\"button\"\n (click)=\"showDeleteModal.set(false)\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 dark:text-gray-300 dark:bg-slate-800 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n (click)=\"confirmDelete()\"\n class=\"px-4 py-2 text-sm font-medium text-white bg-red-600 hover:bg-red-700 rounded-lg shadow-sm transition-colors\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n</div>\n}\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild, inject, signal, computed, OnInit, OnChanges, SimpleChanges, input, effect } from '@angular/core';\nimport { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MapboxService, COOLMAP_CONFIG, UtilsService, CoolmapService, CoolmapRoute } from '@aggdirect/coolmap-services';\nimport { JobCodeComponent } from '../job-code/job-code.component';\nimport { JobRouteListComponent } from '../job-route-list/job-route-list.component';\nimport { ViewRouteListComponent } from '../view-route-list/view-route-list.component';\nimport { AddRouteComponent } from '../add-route/add-route.component';\nimport { LucideAngularModule, Search, X, Route, LoaderCircle } from 'lucide-angular';\n\n@Component({\n selector: 'lib-coolmap',\n standalone: true,\n imports: [\n JobCodeComponent,\n LucideAngularModule,\n JobRouteListComponent,\n ViewRouteListComponent,\n AddRouteComponent,\n ReactiveFormsModule,\n ],\n templateUrl: './coolmap.component.html',\n styleUrl: './coolmap.component.scss',\n})\nexport class CoolmapComponent implements OnInit, AfterViewInit, OnChanges {\n @Input() mobileMode: boolean = false;\n @Input() activeSection: 'Jobcode' | 'ViewRoute' = 'Jobcode';\n @Input() customerRepoDetails?: { customer: { id?: string, name?: string }, projectId: string };\n darkMode = input<boolean>(false);\n @ViewChild('mapContainer') mapContainer!: ElementRef;\n public coolmapService = inject(CoolmapService);\n utils = inject(UtilsService);\n config = inject(COOLMAP_CONFIG);\n mapService = inject(MapboxService);\n \n showRouteList = false;\n addRouteModal = false;\n \n // Filtering Signals (Lifted from JobCode)\n routesList = signal<CoolmapRoute[]>([]);\n viewRoutesList = signal<CoolmapRoute[]>([]);\n filters = signal<any[]>([]);\n filteredOptions = signal<any[]>([]);\n dropdownOpen = signal(false);\n dateValue = signal(this.utils.getDateFormat(new Date()));\n selectedRouteIds = signal<string[]>([]);\n modalPlottedIds = signal<string[]>([]);\n modalPlottedRoutes = signal<CoolmapRoute[]>([]);\n selectedRouteForEdit = signal<CoolmapRoute | null>(null);\n unitList = signal<any[]>([]);\n materialsList = signal<any[]>([]);\n private currentlyPlottedIds: string[] = [];\n private skipNextRefresh = false;\n private mapOpQueue: Promise<void> = Promise.resolve();\n\n activeFilteredRoutes = computed(() => {\n const list = this.activeSection === 'Jobcode' ? this.routesList() : this.viewRoutesList();\n const filtersArray = this.filters();\n if (filtersArray.length === 0) return list;\n return this.utils.getSearchResults(list, filtersArray) || [];\n });\n\n filterForm = new FormGroup({\n search: new FormControl('')\n });\n\n allSelected = computed(() => {\n const active = this.activeFilteredRoutes();\n const selected = this.selectedRouteIds();\n if (active.length === 0) return false;\n return active.every(r => selected.includes(this.getRouteId(r)));\n });\n\n modalAllSelected = computed(() => {\n return false;\n });\n\n masterStats = computed(() => {\n const routes = this.activeFilteredRoutes();\n const stats = { Done: 0, Incomplete: 0, Ongoing: 0, Open: 0 };\n \n routes.forEach(route => {\n const v = route?.values || {};\n stats.Done += (v.Done || 0);\n stats.Incomplete += (v.Incomplete || 0);\n stats.Ongoing += (v.Ongoing || 0);\n stats.Open += (v.Open || 0);\n });\n \n // Fallback default: if no routes, but we expect at least 1 \"Open\" slot behavior\n if (routes.length > 0 && stats.Done === 0 && stats.Ongoing === 0 && stats.Open === 0 && stats.Incomplete === 0) {\n stats.Open = routes.length;\n }\n \n return stats;\n });\n\n masterToggle() {\n if (this.allSelected()) {\n this.selectedRouteIds.set([]);\n } else {\n const ids = this.activeFilteredRoutes().map(r => this.getRouteId(r));\n this.selectedRouteIds.set(ids);\n }\n }\n\n modalMasterToggle(modalRoutes: CoolmapRoute[]) {\n const currentPlotted = this.modalPlottedRoutes();\n const isAllPlotted = modalRoutes.every(r => currentPlotted.some(p => this.getRouteId(p) === this.getRouteId(r)));\n\n if (isAllPlotted) {\n // Unplot all routes in this modal's view\n const modalIdsInView = modalRoutes.map(r => this.getRouteId(r));\n this.modalPlottedRoutes.update(curr => curr.filter(r => !modalIdsInView.includes(this.getRouteId(r))));\n } else {\n // Plot all routes in this modal's view (prevent duplicates)\n this.modalPlottedRoutes.update(curr => {\n const newRoutes = modalRoutes.filter(mr => !curr.some(c => this.getRouteId(c) === this.getRouteId(mr)));\n return [...curr, ...newRoutes];\n });\n }\n \n this.modalPlottedIds.set(this.modalPlottedRoutes().map(r => this.getRouteId(r)));\n }\n\n icons = {\n Route,\n Search,\n X,\n LoaderCircle\n };\n\n constructor() {\n this.filterForm.get('search')?.valueChanges.pipe(\n takeUntilDestroyed()\n ).subscribe(value => {\n if (value && typeof value === 'string') {\n const options = this.utils.filter(value, this.filters());\n this.filteredOptions.set(options);\n this.dropdownOpen.set(options.length > 0);\n } else {\n this.filteredOptions.set([]);\n this.dropdownOpen.set(false);\n }\n });\n\n effect(() => {\n const isDark = this.darkMode();\n this.mapService.updateTheme(isDark);\n });\n\n // Effect 1: Manage Floating List (JobCode)\n effect(async () => {\n const routes = this.activeFilteredRoutes();\n const selectedIds = this.selectedRouteIds();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('jobcode', routes, selectedIds)\n );\n });\n\n // Effect 2: Manage Modal List (JobRouteList)\n effect(async () => {\n const modalRoutes = this.modalPlottedRoutes();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('jobrouteList', modalRoutes, modalRoutes.map(r => this.getRouteId(r)))\n );\n });\n\n // Effect 3: Manage View Route Section\n effect(async () => {\n if (this.activeSection === 'ViewRoute') {\n const routes = this.activeFilteredRoutes();\n const selectedIds = this.selectedRouteIds();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('viewroute', routes, selectedIds)\n );\n } else {\n // Clear viewroute prefix if not in the section\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('viewroute', [], [])\n );\n }\n });\n }\n\n ngOnInit() {\n this.loadData(this.dateValue());\n }\n\n getUnitList() {\n this.utils.getData('unit/all').subscribe((res: any) => {\n if (res && res.data) {\n this.unitList.set(res.data);\n }\n });\n }\n\n getMaterialsList() {\n this.utils.getData('material/all').subscribe((res: any) => {\n if (res && res.data) {\n this.materialsList.set(res.data);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['customerRepoDetails'] && !changes['customerRepoDetails'].firstChange) {\n if (this.config.repository === 'customer') {\n if (this.activeSection === 'Jobcode') {\n this.loadData(this.dateValue());\n } else {\n this.loadViewRoutes();\n }\n }\n }\n if (changes['activeSection'] && !changes['activeSection'].firstChange) {\n this.selectedRouteIds.set([]);\n this.filters.set([]);\n if (this.activeSection === 'Jobcode') {\n this.loadData(this.dateValue());\n } else {\n this.loadViewRoutes();\n }\n }\n }\n\n loadData(value: string, isRefresh = false) {\n this.dateValue.set(value);\n this.coolmapService.isLoading.set(true);\n \n // Clear selection when the base list changes (date/repo switch)\n if (!isRefresh) {\n this.selectedRouteIds.set([]);\n }\n\n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((unitsRes: any) => {\n this.unitList.set(unitsRes);\n this.utils.fetchMaterialsListForCustomer().then((matRes: any) => {\n this.materialsList.set(matRes);\n this.executeJobReportFetch(value);\n });\n });\n } else {\n this.executeJobReportFetch(value);\n }\n }\n\n private executeJobReportFetch(value: string) {\n let dataSet: any;\n if (this.config.repository === 'customer') {\n const custId = this.customerRepoDetails?.customer?.id || '';\n const projId = this.customerRepoDetails?.projectId || '';\n dataSet = { date: value, customer_id: custId, project_id: projId };\n } else {\n dataSet = { date: value };\n }\n\n this.utils.postdata('jobs_report_v2', dataSet).subscribe({\n next: (res: any) => {\n if (res && res.data && typeof res.data !== 'string') {\n const list = res.data.map((ele: CoolmapRoute) => {\n (ele as any).date = value;\n if (this.config.repository === 'customer') {\n ele.unit = this.getUnitName(ele);\n (ele as any).material = this.getMaterialName(ele).split('|')[0].trim();\n }\n this.utils.makeOptions(ele);\n return ele;\n });\n this.routesList.set(list);\n } else {\n this.routesList.set([]);\n }\n this.coolmapService.isLoading.set(false);\n },\n error: () => {\n this.routesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n }\n\n loadViewRoutes(isRefresh = false) {\n this.coolmapService.isLoading.set(true);\n if (!isRefresh) {\n this.selectedRouteIds.set([]);\n }\n \n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((unitsRes: any) => {\n this.unitList.set(unitsRes);\n this.utils.fetchMaterialsListForCustomer().then((matRes: any) => {\n this.materialsList.set(matRes);\n this.executeViewRoutesFetch();\n });\n });\n } else {\n this.executeViewRoutesFetch();\n }\n }\n\n private executeViewRoutesFetch() {\n if (this.config.repository === 'customer') {\n const dataSet = { customer_id: this.customerRepoDetails?.customer?.id || '' };\n this.utils.postdata('routes/all', dataSet).subscribe({\n next: (res: any) => {\n this.handleViewRoutesResponse(res);\n },\n error: () => {\n this.viewRoutesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n } else {\n this.utils.getData('routes/all').subscribe({\n next: (res: any) => {\n this.handleViewRoutesResponse(res);\n },\n error: () => {\n this.viewRoutesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n }\n }\n\n private handleViewRoutesResponse(res: any) {\n if (res && res.data && Array.isArray(res.data)) {\n const list = res.data.map((ele: CoolmapRoute) => {\n if (this.config.repository === 'customer') {\n ele.unit = this.getUnitName(ele);\n (ele as any).material = this.getMaterialName(ele).split('|')[0].trim();\n }\n this.utils.makeOptions(ele);\n return ele;\n });\n this.viewRoutesList.set(list);\n } else {\n this.viewRoutesList.set([]);\n }\n this.coolmapService.isLoading.set(false);\n }\n\n getUnitName(data: any): string {\n let unitName = '';\n this.unitList().forEach((res) => {\n if (res.id === data.unit_id) {\n unitName = res.type;\n }\n });\n return unitName || data.unit;\n }\n\n getMaterialName(data: any): string {\n let materialName = '';\n this.materialsList().forEach((res) => {\n if (res.id === data.material_id) {\n materialName = res.name;\n }\n });\n return materialName || data.material || '';\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (target && target.value) {\n this.loadData(target.value);\n }\n }\n\n selectFilter(option: any) {\n this.filterForm.controls['search'].setValue('');\n this.selectedRouteIds.set([]); // Clear selection when switching filters\n this.filters.set([\n { name: option.label, type: option.type, value: option }\n ]);\n this.dropdownOpen.set(false);\n }\n\n removeFilter(filter: any) {\n this.filters.update(curr => curr.filter(f => f !== filter));\n }\n\n /**\n * Performs an isolated, diff-based synchronization for a specific route type.\n * This ensures that 'jobcode' and 'jobrouteList' updates never interfere.\n */\n async syncSpecificPrefix(prefix: string, sourceRoutes: CoolmapRoute[], selectedIds: string[]) {\n // 1. Identify desired state for THIS prefix only\n const desiredIds = new Set(sourceRoutes.map(r => `${prefix}-${this.getRouteId(r)}`));\n \n // 2. Get current state for THIS prefix only from map service\n const currentPlottedIds = this.mapService.getRegistryKeys().filter(k => k.startsWith(`${prefix}-`));\n\n // 3. Diff: Identify what to remove and what to add for THIS prefix\n const toRemove = currentPlottedIds.filter(id => !desiredIds.has(id));\n const toAdd = Array.from(desiredIds).filter(id => !currentPlottedIds.includes(id));\n\n // 4. Perform removals for THIS prefix\n for (const regId of toRemove) {\n const id = regId.substring(prefix.length + 1);\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.add(regId);\n return n;\n });\n try {\n await this.mapService.removeRouteAndMarker(id, prefix);\n } finally {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.delete(regId);\n return n;\n });\n }\n }\n\n // 5. Perform additions for THIS prefix\n if (toAdd.length > 0) {\n this.coolmapService.isLoading.set(true);\n for (const regId of toAdd) {\n const id = regId.substring(prefix.length + 1);\n const routeObj = sourceRoutes.find(r => this.getRouteId(r) === id);\n if (routeObj) {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.add(regId);\n return n;\n });\n try {\n await this.mapService.plotRoute(routeObj, id, prefix, false, false);\n } finally {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.delete(regId);\n return n;\n });\n }\n }\n }\n }\n\n // 6. Update Visibility for THIS prefix only\n // This allows jobcode and jobrouteList to have independent visibility states.\n const compositeVisible = selectedIds.map(id => `${prefix}-${id}`);\n const showAllForThisPrefix = (prefix === 'jobcode' && selectedIds.length === 0);\n \n this.mapService.setRoutesVisibility(compositeVisible, showAllForThisPrefix, prefix);\n this.coolmapService.isLoading.set(false);\n }\n\n toggleSelection(id: string) {\n this.selectedRouteIds.update(ids => {\n if (ids.includes(id)) {\n return ids.filter(i => i !== id);\n } else {\n return [...ids, id];\n }\n });\n }\n\n toggleModalRoute(route: CoolmapRoute) {\n const id = this.getRouteId(route);\n if (!id) return;\n\n this.modalPlottedRoutes.update(routes => {\n const isPlotted = routes.some(r => this.getRouteId(r) === id);\n if (isPlotted) {\n return routes.filter(r => this.getRouteId(r) !== id);\n } else {\n return [...routes, route];\n }\n });\n \n // Also update IDs for UI checkboxes\n this.modalPlottedIds.set(this.modalPlottedRoutes().map(r => this.getRouteId(r)));\n }\n\n async onAddRouteModalChange(isOpen: boolean) {\n this.addRouteModal = isOpen;\n if (!isOpen) {\n if (this.skipNextRefresh) {\n this.skipNextRefresh = false;\n return;\n }\n // Modal closed - restore map state and refresh data\n await this.refreshMapState();\n }\n }\n\n async refreshMapState() {\n if (this.activeSection === 'Jobcode') {\n await this.loadData(this.dateValue(), true);\n } else {\n await this.loadViewRoutes(true);\n }\n }\n\n onRouteSaved(data: any) {\n if (data.id) {\n // It was an update - surgical local update\n this.skipNextRefresh = true;\n const updater = (list: CoolmapRoute[]) => list.map(r => this.getRouteId(r) === data.id ? { ...r, ...data } : r);\n this.routesList.update(updater);\n this.viewRoutesList.update(updater);\n } else {\n // It was an add - need a re-fetch to get new ID from server\n this.skipNextRefresh = false; // explicitly allow refresh on add to get new ID\n }\n }\n\n onRouteDeleted(id: string) {\n this.skipNextRefresh = true;\n \n // 1. Remove from local signals\n this.routesList.update(list => list.filter(r => this.getRouteId(r) !== id));\n this.viewRoutesList.update(list => list.filter(r => this.getRouteId(r) !== id));\n \n // 2. Clear from selections\n this.selectedRouteIds.update(ids => ids.filter(i => i !== id));\n this.modalPlottedIds.update(ids => ids.filter(i => i !== id));\n this.modalPlottedRoutes.update(routes => routes.filter(r => this.getRouteId(r) !== id));\n\n // 3. Cleanup Map\n this.mapService.removeRouteAndMarker(id, 'jobcode');\n this.mapService.removeRouteAndMarker(id, 'jobrouteList');\n this.mapService.removeRouteAndMarker(id, 'viewroute');\n\n // 4. Update Filter Pills\n this.filters.update(curr => curr.filter(f => {\n if (f.type === 'job') {\n return f.value.job_id !== id;\n }\n return true;\n }));\n\n // 5. Refresh Search Suggestions (Options list in Utils)\n this.utils.clearOptions();\n [...this.routesList(), ...this.viewRoutesList()].forEach(r => this.utils.makeOptions(r));\n }\n\n openAddRouteModal() {\n this.selectedRouteForEdit.set(null);\n this.addRouteModal = true;\n }\n\n openEditModal(route: CoolmapRoute) {\n this.selectedRouteForEdit.set(route);\n this.addRouteModal = true;\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n\n clearSelection() {\n this.selectedRouteIds.set([]);\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.mapService.initializeMap(this.mapContainer.nativeElement, this.darkMode());\n\n setTimeout(() => {\n this.mapService.resize();\n }, 200);\n }, 0);\n }\n}\n","<div class=\"center-area\">\n <div [formGroup]=\"filterForm\" class=\"toolbar flex flex-col sm:flex-row md:h-[55px] h-auto py-2 px-2 gap-3 items-center\">\n <div class=\"toolbar-left flex items-center gap-3\">\n @if (activeSection === 'Jobcode') {\n <input\n type=\"date\"\n [value]=\"dateValue()\"\n (change)=\"onDateChange($event)\"\n [disabled]=\"coolmapService.isLoading()\"\n class=\"w-auto lg:w-[200px] px-3 py-2 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n <span class=\"toolbar-divider hidden sm:flex h-6 w-[1px] bg-gray-200 dark:bg-slate-700\"></span>\n }\n <div class=\"relative items-center flex\">\n <lucide-icon [img]=\"icons.Search\" [size]=\"18\" class=\"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\"></lucide-icon>\n <input\n type=\"text\"\n formControlName=\"search\"\n [attr.disabled]=\"coolmapService.isLoading() ? true : null\"\n placeholder=\"Search routes...\"\n class=\"w-[150px] xl:w-[300px] pl-10 pr-10 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-amber-500 focus:border-transparent text-sm disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n\n @if (filterForm.value.search) {\n <button (click)=\"filterForm.controls.search.setValue('')\" class=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\">\n <lucide-icon [img]=\"icons.X\" [size]=\"16\"></lucide-icon>\n </button>\n }\n\n <!-- Autocomplete Dropdown -->\n @if (dropdownOpen() && filteredOptions().length > 0) {\n <div class=\"absolute z-50 left-0 right-0 top-full mt-1 max-h-60 overflow-y-auto bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-600 rounded shadow-lg\">\n @for (option of filteredOptions(); track option.value + option.type) {\n <div (click)=\"selectFilter(option)\" class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm font-medium border-b border-gray-100 dark:border-slate-700 last:border-0 dark:text-white\">\n <span class=\"capitalize text-xs text-gray-500 dark:text-gray-400 font-normal mr-1\">{{ option.type }}:</span>\n {{ option.label }}\n </div>\n }\n </div>\n }\n </div>\n\n @if (filters().length > 0) {\n <div class=\"flex flex-wrap gap-2 ml-2\">\n @for (filter of filters(); track filter.value + filter.type) {\n <div class=\"inline-flex items-center gap-1 px-2 py-1 rounded bg-slate-200 dark:bg-slate-700 text-gray-800 dark:text-gray-200 text-xs font-medium border border-gray-300 dark:border-slate-600\">\n <span class=\"capitalize opacity-80\">{{ filter.type }}:</span> {{ filter.name }}\n <button type=\"button\" (click)=\"removeFilter(filter)\" class=\"hover:opacity-75 transition-opacity ml-1\">\n <lucide-icon [img]=\"icons.X\" [size]=\"12\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedRouteIds().length > 0) {\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n [disabled]=\"coolmapService.isLoading()\"\n class=\"inline-flex items-center justify-center gap-2 px-5 sm:px-6 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors text-xs md:text-sm\"\n >\n Show All ({{ selectedRouteIds().length }})\n </button>\n }\n @if (activeSection === 'ViewRoute') {\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-5 sm:px-6 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors text-xs md:text-sm\"\n [disabled]=\"coolmapService.isLoading()\"\n (click)=\"openAddRouteModal()\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n Add Route\n </button>\n }\n\n @if(activeSection === 'Jobcode'){\n <button\n class=\"inline-flex items-center gap-2 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed relative group\"\n (click)=\"showRouteList = true\"\n [disabled]=\"coolmapService.isLoading()\">\n <lucide-icon [img]=\"icons.Route\" [size]=\"20\"></lucide-icon>\n <div\n class=\"absolute top-full left-1/2 -translate-x-1/2 mt-2 hidden group-hover:block bg-gray-800 text-white text-[10px] rounded py-1 px-2 whitespace-nowrap\">\n Show Route List\n <div\n class=\"absolute -top-[8px] left-1/2 -translate-x-1/2 border-4 border-transparent border-b-gray-800\">\n </div>\n </div>\n </button>}\n </div>\n </div>\n <div class=\"view-content\">\n <div class=\"full-view\">\n <div class=\"map-container\">\n <div class=\"mapbox-container\" #mapContainer></div>\n </div>\n </div>\n\n <!-- FOR JOBCODE -->\n @if (activeSection === 'Jobcode') {\n <lib-job-code \n listMode=\"floating\" \n [routes]=\"activeFilteredRoutes()\"\n [selectedRouteIds]=\"selectedRouteIds()\"\n [isLoading]=\"coolmapService.isLoading()\"\n (routeSelect)=\"toggleSelection($event)\">\n </lib-job-code>\n }\n\n <!-- FOR VIEWROUTE -->\n @if (activeSection === 'ViewRoute') {\n <lib-view-route-list \n listMode=\"floating\" \n [routes]=\"activeFilteredRoutes()\"\n [selectedRouteIds]=\"selectedRouteIds()\"\n (routeSelect)=\"toggleSelection($event)\"\n (editRoute)=\"openEditModal($event)\"\n ></lib-view-route-list>\n }\n </div>\n @if (config.repository === 'coolmap') {\n <div class=\"status-bar\">\n <div class=\"stats-row\">\n <div class=\"stat-item active\" title=\"Active routes (assigned + in progress)\">\n <span class=\"stat-count\">{{ masterStats().Done }}</span>\n <span class=\"stat-label\">Done</span>\n </div>\n\n <div class=\"stat-item completed\" title=\"Completed tasks\">\n <span class=\"stat-count\">{{ masterStats().Incomplete }}</span>\n <span class=\"stat-label\">Incomplete</span>\n </div>\n\n <div class=\"stat-item declined\" title=\"Declined routes - needs attention\">\n <span class=\"stat-count\">{{ masterStats().Ongoing }}</span>\n <span class=\"stat-label\">Ongoing</span>\n </div>\n\n <div class=\"stat-item scheduled\" title=\"Scheduled jobs for today\">\n <span class=\"stat-count\">{{ masterStats().Open }}</span>\n <span class=\"stat-label\">Open</span>\n </div>\n </div>\n </div>\n }\n</div>\n<lib-job-route-list \n [initialRoutes]=\"viewRoutesList()\"\n [(modalOpen)]=\"showRouteList\"\n [selectedRouteIds]=\"modalPlottedIds()\"\n (routeSelect)=\"toggleModalRoute($event)\"\n (masterToggleEvent)=\"modalMasterToggle($event)\"\n [customerRepoDetails]=\"customerRepoDetails\"\n></lib-job-route-list>\n<lib-add-route \n [modalOpen]=\"addRouteModal\"\n (modalOpenChange)=\"onAddRouteModalChange($event)\"\n (routeSaved)=\"onRouteSaved($event)\"\n (routeDeleted)=\"onRouteDeleted($event)\"\n [customerRepoDetails]=\"customerRepoDetails\"\n [routeData]=\"selectedRouteForEdit()\"\n></lib-add-route>\n","/*\n * Public API Surface of coolmap\n */\n\nexport * from './lib/coolmap';\nexport * from './lib/components/coolmap/coolmap.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"aggdirect-coolmap.mjs","sources":["../../../projects/coolmap/src/lib/coolmap.ts","../../../projects/coolmap/src/lib/components/sms-card-details/sms-card-details.component.ts","../../../projects/coolmap/src/lib/components/sms-card-details/sms-card-details.component.html","../../../projects/coolmap/src/lib/components/driver-list/driver-list.component.ts","../../../projects/coolmap/src/lib/components/driver-list/driver-list.component.html","../../../projects/coolmap/src/lib/components/job-details/job-details.component.ts","../../../projects/coolmap/src/lib/components/job-details/job-details.component.html","../../../projects/coolmap/src/lib/components/job-code/job-code.component.ts","../../../projects/coolmap/src/lib/components/job-code/job-code.component.html","../../../projects/coolmap/src/lib/components/route-info-card/route-info-card.component.ts","../../../projects/coolmap/src/lib/components/route-info-card/route-info-card.component.html","../../../projects/coolmap/src/lib/components/job-route-list/job-route-list.component.ts","../../../projects/coolmap/src/lib/components/job-route-list/job-route-list.component.html","../../../projects/coolmap/src/lib/components/view-route-list/view-route-list.component.ts","../../../projects/coolmap/src/lib/components/view-route-list/view-route-list.component.html","../../../projects/coolmap/src/lib/components/add-route/add-route.component.ts","../../../projects/coolmap/src/lib/components/add-route/add-route.component.html","../../../projects/coolmap/src/lib/components/coolmap/coolmap.component.ts","../../../projects/coolmap/src/lib/components/coolmap/coolmap.component.html","../../../projects/coolmap/src/public-api.ts","../../../projects/coolmap/src/aggdirect-coolmap.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-coolmap',\n imports: [],\n template: ``,\n styles: ``,\n})\nexport class Coolmap {\n\n}\n","import { NgClass } from '@angular/common';\nimport { Component, EventEmitter, Output, effect, input } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\n\n@Component({\n selector: 'lib-sms-card-details',\n standalone: true,\n imports: [LucideAngularModule, NgClass],\n templateUrl: './sms-card-details.component.html',\n styleUrl: './sms-card-details.component.scss',\n})\nexport class SmsCardDetailsComponent {\n modalOpen = input<boolean>(false);\n smsListcollapse = input<boolean>(false);\n driverListcollapse = input<boolean>(false);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n}\n","@if (modalOpen()) {\n<div\n class=\"fixed lg:absolute inset-0 overflow-y-auto lg:top-0 z-[111] lg:z-auto\"\n [ngClass]=\"smsListcollapse() && driverListcollapse() ? 'lg:left-[425px]' : 'lg:left-[670px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full lg:items-start lg:justify-start items-center justify-center p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 text-[13px] font-medium text-gray-900 dark:text-white\">\n SMS All Drivers\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[70vh] overflow-y-auto p-2\">\n <div class=\"device-info\">\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Jobcode</span>\n <span class=\"value\">016164</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Date</span>\n <span class=\"value\">2026-4-1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Total tasks</span>\n <span class=\"value\">1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Material</span>\n <span class=\"value\">#2 Washed Gravel *</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Unit</span>\n <span class=\"value\">Ton</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Pickup Address</span>\n <span class=\"value\">vaibhav loc-1</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-sm\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Delivery Address</span>\n <span class=\"value\">vaibhav loc-2</span>\n </div>\n </div>\n <div class=\"mt-4\">\n <textarea\n rows=\"2\"\n placeholder=\"Text here....\"\n class=\"w-full px-3 py-2 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm resize-none ng-pristine ng-valid ng-touched\"\n ></textarea>\n </div>\n <div class=\"mt-2 mb-2 flex justify-end\">\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-3 py-1 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-sm\"\n >\n Send SMS\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { Component, EventEmitter, Output, effect, input, signal } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\nimport { SmsCardDetailsComponent } from '../sms-card-details/sms-card-details.component';\nimport { NgClass } from '@angular/common';\n@Component({\n selector: 'lib-driver-list',\n standalone: true,\n imports: [LucideAngularModule, SmsCardDetailsComponent, NgClass],\n templateUrl: './driver-list.component.html',\n styleUrl: './driver-list.component.scss',\n})\nexport class DriverListComponent {\n showSmsModal = false;\n modalOpen = input<boolean>(false);\n driverListcollapse = input<boolean>(false);\n smsListcollapse = signal(false);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n showSmsModalPopup() {\n this.showSmsModal = !this.showSmsModal;\n this.smsListcollapse.set(this.showSmsModal);\n }\n}\n","@if (modalOpen()) {\n<div\n class=\"absolute inset-0 overflow-y-auto top-0\"\n [ngClass]=\"driverListcollapse() ? 'left-[60px]' : 'left-[300px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full items-start justify-start p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Driver List\n </h3>\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-3 sm:px-6 py-1 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-sm\"\n (click)=\"showSmsModalPopup()\"\n >\n SMS\n </button>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[40vh] overflow-y-auto p-2\">\n <ul class=\"flex flex-col gap-2\">\n <li>\n <div\n class=\"driver-row-1 flex flex-col driver-card bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2\"\n >\n <span class=\"driver-name\">Nilufarrr Lokmannn</span>\n <span class=\"com-name\">Aggdirect Android LLC 2</span>\n <div class=\"cont_del flex justify-between text-black dark:text-grey-600\">\n <small>Driver contact: <b>8318428713</b></small>\n <small>Company contact: <b>8318428713</b></small>\n </div>\n </div>\n </li>\n <li>\n <div\n class=\"driver-row-1 flex flex-col driver-card bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2\"\n >\n <span class=\"driver-name\">Nilufarrr Lokmannn</span>\n <span class=\"com-name\">Aggdirect Android LLC 2</span>\n <div class=\"cont_del flex justify-between\">\n <small>Driver contact: <b>8318428713</b></small>\n <small>Company contact: <b>8318428713</b></small>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n}\n\n<lib-sms-card-details\n [(modalOpen)]=\"showSmsModal\"\n [smsListcollapse]=\"smsListcollapse()\"\n [driverListcollapse]=\"driverListcollapse()\"\n></lib-sms-card-details>\n","import { Component, EventEmitter, HostListener, Output, input, signal } from '@angular/core';\nimport { LucideAngularModule, X } from 'lucide-angular';\n@Component({\n selector: 'lib-job-details',\n standalone: true,\n imports: [LucideAngularModule],\n templateUrl: './job-details.component.html',\n styleUrl: './job-details.component.scss',\n})\nexport class JobDetailsComponent {\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n dragX = signal(0);\n dragY = signal(0);\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragInitialX = 0;\n private dragInitialY = 0;\n close() {\n this.modalOpenChange.emit(false);\n }\n icons = {\n X,\n };\n startDrag(event: MouseEvent): void {\n this.isDragging = true;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.dragInitialX = this.dragX();\n this.dragInitialY = this.dragY();\n event.preventDefault();\n }\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging || !this.modalOpen()) return;\n this.dragX.set(this.dragInitialX + (event.clientX - this.dragStartX));\n this.dragY.set(this.dragInitialY + (event.clientY - this.dragStartY));\n }\n @HostListener('document:mouseup')\n onMouseUp(): void {\n this.isDragging = false;\n }\n}\n","@if (modalOpen()) {\n<div class=\"z-[111] xl:z-[80] bottom-0 lg:left-[350px] fixed lg:absolute inset-0 overflow-y-auto\">\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div class=\"flex min-h-full lg:items-end lg:justify-start items-center justify-center p-3\">\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n [style.transform]=\"'translate(' + dragX() + 'px, ' + dragY() + 'px)'\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b cursor-move border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n (mousedown)=\"startDrag($event)\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Job Details\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[50vh] overflow-y-auto p-2\">\n <div class=\"stats-row\">\n <div class=\"stat-item active\" title=\"Active routes (assigned + in progress)\">\n <span class=\"stat-count\">{{ routeData()?.values?.Done || 0 }}</span>\n <span class=\"stat-label\">Done</span>\n </div>\n\n <div class=\"stat-item completed\" title=\"Completed tasks\">\n <span class=\"stat-count\">{{ routeData()?.values?.Incomplete || 0 }}</span>\n <span class=\"stat-label\">Imcomplete</span>\n </div>\n <div class=\"stat-item declined\" title=\"Declined routes - needs attention\">\n <span class=\"stat-count\">{{ routeData()?.values?.Ongoing || 0 }}</span>\n <span class=\"stat-label\">Ongoing</span>\n </div>\n <div class=\"stat-item scheduled\" title=\"Scheduled jobs for today\">\n <span class=\"stat-count\">{{ routeData()?.values?.Open || 1 }}</span>\n <span class=\"stat-label\">Open</span>\n </div>\n </div>\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-2 py-2 rounded-lg mt-4\"\n >\n <span class=\"pickup truncate block\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"inline mr-1 text-green-500\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n Pickup: {{ routeData()?.pickup_location || 'N/A' }}\n </span>\n <span class=\"delivery truncate block mt-1\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"inline mr-1 text-blue-500\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n Delivery: {{ routeData()?.delivery_location || 'N/A' }}\n </span>\n </div>\n <div class=\"device-info mt-2\">\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Jobcode</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.order_number || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Customer</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.customer_name || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Project Name</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.project || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Job Type</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.unit || 'N/A' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Material</span>\n <span class=\"font-medium truncate max-w-[65%] text-right\">{{ routeData()?.material || 'General Freight' }}</span>\n </div>\n <div\n class=\"flex justify-between py-2 border-b border-gray-200 dark:border-slate-600 text-xs\"\n >\n <span class=\"text-gray-500 dark:text-slate-500\">Customer Contact</span>\n <span class=\"font-medium\">{{ routeData()?.customer_contact || 'None' }}</span>\n </div>\n <div class=\"flex justify-between py-2 text-xs\">\n <span class=\"text-gray-500 dark:text-slate-500\">Delivery Contact</span>\n <span class=\"font-medium\">{{ routeData()?.delivery_contact || 'None' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n","import { Component, HostListener, Input, signal, inject, Output, EventEmitter } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { LucideAngularModule, CarFront, Info, LoaderCircle } from 'lucide-angular';\nimport { DriverListComponent } from '../driver-list/driver-list.component';\nimport { JobDetailsComponent } from '../job-details/job-details.component';\nimport { COOLMAP_CONFIG, UtilsService, CoolmapService, CoolmapRoute } from '@aggdirect/coolmap-services';\n\nexport type CardListMode = 'sidebar' | 'floating' | 'inline';\n@Component({\n selector: 'lib-job-code',\n standalone: true,\n imports: [LucideAngularModule, DriverListComponent, JobDetailsComponent, NgClass],\n templateUrl: './job-code.component.html',\n styleUrl: './job-code.component.scss',\n})\nexport class JobCodeComponent {\n config = inject(COOLMAP_CONFIG);\n utils = inject(UtilsService);\n coolmapService = inject(CoolmapService);\n\n showDriverModal = false;\n showDetailModal = false;\n @Input() listMode: CardListMode = 'sidebar';\n @Input() collapsible = true;\n @Input() routes: CoolmapRoute[] = [];\n @Input() selectedRouteIds: string[] = [];\n @Input() isLoading: boolean = false;\n @Output() routeSelect = new EventEmitter<string>();\n collapsed = false;\n\n // New Signal States\n selectedJobDetail = signal<any>(null);\n contextMenuVisible = signal(false);\n driverListcollapse = signal(false);\n contextMenuPosition = signal({ x: 0, y: 0 });\n\n @HostListener('document:keydown.escape')\n icons = {\n CarFront,\n Info,\n LoaderCircle\n };\n\n toggleRouteSelection(route: CoolmapRoute) {\n const id = route.job_id || route.route_id || (route as any).route_details_id;\n if (!id) return;\n this.routeSelect.emit(id);\n }\n\n toggleCollapse() {\n if (this.collapsible) {\n this.collapsed = !this.collapsed;\n this.driverListcollapse.set(this.collapsed);\n }\n }\n\n calculateStatusPercentage(type: string, route: any) {\n const values = route?.values || { Done: 0, Ongoing: 0, Open: 0 };\n const total = (values.Done || 0) + (values.Ongoing || 0) + (values.Open || 0);\n if (total === 0) return type === 'open' ? 100 : 0;\n \n if (type === 'done') return Math.round((100 * (values.Done || 0)) / total);\n if (type === 'ongoing') return Math.round((100 * (values.Ongoing || 0)) / total);\n if (type === 'open') return Math.round((100 * (values.Open || 0)) / total);\n return 0;\n }\n}\n\n","<div\n class=\"cards-list-container\"\n [class.floating]=\"listMode === 'floating'\"\n [class.sidebar]=\"listMode === 'sidebar'\"\n [class.inline]=\"listMode === 'inline'\"\n [class.collapsed]=\"collapsed\"\n>\n <div class=\"list-header\">\n <div class=\"header-title\">\n <span class=\"title-text\">Routes</span>\n <span class=\"routes-count\">({{ routes.length || 0 }})</span>\n </div>\n <button\n class=\"collapse-btn\"\n (click)=\"toggleCollapse()\"\n [title]=\"collapsed ? 'Expand' : 'Collapse'\"\n >\n @if (collapsed) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n </button>\n </div>\n @if (!collapsed) {\n <div class=\"cards-scroll-container\" #scrollContainer>\n @if (isLoading) {\n <div class=\"list-loader\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"32\" class=\"animate-spin text-amber-500\"></lucide-icon>\n </div>\n }\n <div class=\"cards-list\">\n @for (route of routes; track $index) {\n <div class=\"card-wrapper\" (click)=\"toggleRouteSelection(route)\">\n <div\n class=\"route-card bg-white dark:bg-slate-800 border transition-all duration-200\"\n [class.border-brand-blue]=\"selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.border-gray-300]=\"!selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.dark:border-slate-700]=\"!selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n [class.selected]=\"selectedRouteIds.includes(route.job_id || route.route_id || route.route_details_id || '')\"\n >\n <div class=\"task-header justify-between\">\n <span class=\"job-code\">{{ route.order_number || 'N/A' }}</span>\n <div class=\"flex gap-2\">\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">{{ route.unit?.charAt(0) || 'U' }}</div>\n @if (config.repository !== 'customer') {\n <div\n class=\"statusunit bg-slate-900 dark:bg-white text-white dark:text-black flex items-center justify-center cursor-pointer hover:opacity-80\"\n (click)=\"showDriverModal = true; toggleCollapse(); $event.stopPropagation()\"\n >\n <lucide-icon [img]=\"icons.CarFront\" [size]=\"15\"></lucide-icon>\n </div>\n }\n <div\n class=\"text-black dark:text-white flex items-center justify-center cursor-pointer hover:opacity-80\"\n (click)=\"selectedJobDetail.set(route); showDetailModal = true; $event.stopPropagation()\"\n >\n <lucide-icon [img]=\"icons.Info\" [size]=\"20\"></lucide-icon>\n </div>\n </div>\n </div>\n @if (config.repository === 'coolmap') {\n <div class=\"customer-name font-semibold truncate\">{{ route.customer_name }}</div>\n }\n <div class=\"material-info truncate text-gray-600 dark:text-gray-300\">{{ route.project || 'No Project' }}</div>\n <div class=\"location-flow mt-2 text-sm flex items-center gap-2\">\n <span class=\"pickup flex items-center gap-1 truncate max-w-[40%] text-green-600 dark:text-green-400\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.pickup_location || '').split('|')[0] || 'Unknown' }}\n </span>\n <span class=\"arrow text-gray-400\">→</span>\n <span class=\"delivery truncate max-w-[40%] text-brand-blue\">{{ (route.delivery_location || '').split('|')[0] || 'Unknown' }}</span>\n </div>\n <div class=\"material-info mt-2 truncate font-medium\">{{ route.material || '' }}</div>\n <div class=\"driver-row-4 mt-3 flex items-center gap-2\">\n <div class=\"progress-bar flex-1 h-1.5 bg-gray-200 dark:bg-slate-700 rounded-full overflow-hidden flex\">\n <div class=\"progress-segment completed h-full bg-green-500 transition-all duration-300\" [style.width.%]=\"calculateStatusPercentage('done', route)\"></div>\n <div class=\"progress-segment ongoing h-full transition-all duration-300\" [style.backgroundColor]=\"'#fc0'\" [style.width.%]=\"calculateStatusPercentage('ongoing', route)\"></div>\n <div class=\"progress-segment open h-full bg-gray-300 dark:bg-slate-600 transition-all duration-300\" [style.width.%]=\"calculateStatusPercentage('open', route)\"></div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n<lib-driver-list\n [(modalOpen)]=\"showDriverModal\"\n [driverListcollapse]=\"driverListcollapse()\"\n></lib-driver-list>\n<lib-job-details [(modalOpen)]=\"showDetailModal\" [routeData]=\"selectedJobDetail()\"></lib-job-details>\n","import { Component, EventEmitter, Output, input, inject, computed } from '@angular/core';\nimport { CommonModule, CurrencyPipe } from '@angular/common';\nimport { LucideAngularModule, X } from 'lucide-angular';\nimport { UtilsService } from '@aggdirect/coolmap-services';\n\n@Component({\n selector: 'lib-route-info-card',\n standalone: true,\n imports: [LucideAngularModule, CommonModule, CurrencyPipe],\n templateUrl: './route-info-card.component.html',\n styleUrl: './route-info-card.component.scss',\n})\nexport class RouteInfoCardComponent {\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n repository = input<string | null>('coolmap');\n displayMode = input<'dispatch' | 'catalog'>('dispatch');\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() edit = new EventEmitter<void>();\n\n utils = inject(UtilsService);\n addRouteModal = false;\n\n formattedDate = computed(() => {\n const data = this.routeData();\n if (!data?.created_at) return 'N/A';\n return this.utils.getDateFormat(new Date(data.created_at), '/');\n });\n\n close() {\n this.modalOpenChange.emit(false);\n }\n\n icons = {\n X,\n };\n}\n","@if (modalOpen()) {\n<div \n class=\"z-[112] bottom-0 fixed lg:absolute inset-0 overflow-y-auto\"\n [ngClass]=\"displayMode() === 'catalog' ? 'lg:left-[350px]' : 'lg:right-[350px]'\"\n>\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <div \n class=\"flex min-h-full lg:items-end items-center justify-center p-3\"\n [ngClass]=\"displayMode() === 'catalog' ? 'lg:justify-start' : 'lg:justify-end'\"\n >\n <div\n class=\"relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[350px]\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900 rounded-t-lg\"\n >\n <h3 class=\"flex items-center gap-1 font-medium text-gray-900 dark:text-white text-[13px]\">\n Route Info\n </h3>\n <button\n (click)=\"close()\"\n class=\"p-2 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"20\"></lucide-icon>\n </button>\n </div>\n <div class=\"max-h-[60vh] overflow-y-auto p-3\">\n <div class=\"space-y-2 bg-gray-50 dark:bg-slate-900/50 border border-gray-200 dark:border-slate-700 p-3 rounded-lg mb-4\">\n <p class=\"text-xs\">\n <b class=\"text-gray-900 dark:text-white\">Pickup:</b> \n <span class=\"text-gray-600 dark:text-gray-400\">\n {{ (routeData()?.pickup_location || '').split('|')[1] || routeData()?.pickup_location || 'N/A' }}\n </span>\n </p>\n <p class=\"text-xs\">\n <b class=\"text-gray-900 dark:text-white\">Delivery:</b> \n <span class=\"text-gray-600 dark:text-gray-400\">\n {{ (routeData()?.delivery_location || '').split('|')[1] || routeData()?.delivery_location || 'N/A' }}\n </span>\n </p>\n </div>\n\n <div class=\"space-y-2.5\">\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Name:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.route_name || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Customer:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.customer_name || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Type:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.unit || 'N/A' }}</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Distance:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.estimated_distance || '0' }} Miles</span>\n </div>\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Travel Time:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4\">{{ routeData()?.estimated_time || '0' }} Min</span>\n </div>\n\n @if (repository() !== 'customer') {\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Trucker Pay Estimate:</b>\n <span class=\"text-brand-blue font-medium text-right ml-4\">{{ routeData()?.trucker_pay_estimate | currency }}</span>\n </div>\n }\n\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Customer Price Estimate:</b>\n <span class=\"text-brand-blue font-medium text-right ml-4\">{{ routeData()?.customer_price_estimate | currency }}</span>\n </div>\n\n <div class=\"flex justify-between items-start text-xs border-b border-gray-100 dark:border-slate-700/50 pb-2\">\n <b class=\"text-gray-900 dark:text-white whitespace-nowrap\">Notes:</b>\n <span class=\"text-gray-600 dark:text-gray-400 text-right ml-4 italic\">{{ routeData()?.note || 'None' }}</span>\n </div>\n </div>\n\n <div class=\"mt-4 pt-3 border-t border-gray-100 dark:border-slate-700 flex justify-between items-center\">\n <p class=\"text-[10px] text-gray-400 italic\">\n Created by {{ routeData()?.created_by_name || routeData()?.user || 'System' }} on {{ formattedDate() }}\n </p>\n @if (displayMode() === 'catalog') {\n <button \n type=\"button\"\n (click)=\"edit.emit(); close()\"\n class=\"px-3 py-1 text-[11px] font-bold uppercase tracking-wider bg-orange-500 hover:bg-orange-600 text-white rounded transition-colors\"\n >\n Edit\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n}","import { Component, EventEmitter, Output, input, signal, inject, Input, OnInit, computed } from '@angular/core';\nimport { NgClass, NgIf, NgFor } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { LucideAngularModule, X, Info, Share2, CheckCircle, LoaderCircle } from 'lucide-angular';\nimport { RouteInfoCardComponent } from '../route-info-card/route-info-card.component';\nimport { COOLMAP_CONFIG, CoolmapRoute, UtilsService, CoolmapService } from '@aggdirect/coolmap-services';\n@Component({\n selector: 'lib-job-route-list',\n standalone: true,\n imports: [LucideAngularModule, RouteInfoCardComponent, NgClass, ScrollingModule],\n templateUrl: './job-route-list.component.html',\n styleUrl: './job-route-list.component.scss',\n})\nexport class JobRouteListComponent implements OnInit {\n config = inject(COOLMAP_CONFIG);\n @Input() customerRepoDetails?: { customer: { id?: string, name?: string }, projectId: string };\n utils = inject(UtilsService);\n coolmapService = inject(CoolmapService);\n \n unitList: any[] = [];\n materialsList: any[] = [];\n \n routes = signal<CoolmapRoute[]>([]);\n searchTerm = signal<string>('');\n selectedRouteIds = input<string[]>([]);\n filters = signal<any[]>([]);\n showSuggestions = signal(false);\n\n suggestions = computed(() => {\n const term = this.searchTerm();\n if (term.length < 1) return [];\n return this.utils.filter(term, this.filters());\n });\n\n filteredRoutes = computed(() => {\n let list = this.routes();\n const activeFilters = this.filters();\n \n // Apply category search from V1 logic\n if (activeFilters.length > 0) {\n list = this.utils.getSearchResults(list, activeFilters);\n }\n \n const search = this.searchTerm().toLowerCase().trim();\n if (!search || this.showSuggestions()) return list;\n \n return list.filter(r => {\n const id = this.getRouteId(r).toLowerCase();\n const order = (r.order_number || '').toLowerCase();\n const name = (r.route_name || '').toLowerCase();\n return id.includes(search) || order.includes(search) || name.includes(search);\n });\n });\n\n allSelected = computed(() => {\n const visible = this.filteredRoutes();\n const selected = this.selectedRouteIds();\n if (visible.length === 0) return false;\n return visible.every(r => selected.includes(this.getRouteId(r)));\n });\n\n isAnyPlotting = computed(() => {\n const prefix = this.modalOpen() ? 'jobrouteList' : 'jobcode';\n const plotting = this.coolmapService.plottingIds();\n return Array.from(plotting).some(id => id.startsWith(`${prefix}-`));\n });\n \n showRouteModal = false;\n modalOpen = input<boolean>(false);\n \n @Input() set initialRoutes(val: CoolmapRoute[]) {\n if (val) {\n this.routes.set(val);\n this.utils.clearOptions();\n val.forEach(r => this.utils.makeOptions(r));\n }\n }\n\n selectedRoute = signal<any>(null);\n\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() routeSelect = new EventEmitter<CoolmapRoute>();\n @Output() masterToggleEvent = new EventEmitter<CoolmapRoute[]>();\n\n ngOnInit(): void {\n this.checkAndCallRouteList();\n }\n\n checkAndCallRouteList() {\n this.utils.clearOptions();\n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((res: any) => {\n this.unitList = res;\n this.utils.fetchMaterialsListForCustomer().then((res: any) => {\n this.materialsList = res;\n this.getRouteListForCustomer();\n });\n });\n } else {\n this.getRouteListForCoolMap();\n }\n }\n\n getRouteListForCoolMap() {\n this.utils.getData('routes/all').subscribe((res: any) => {\n if (res && res.data) {\n const list = res.data;\n list.forEach((ele: CoolmapRoute) => this.utils.makeOptions(ele));\n this.routes.set(list);\n }\n });\n }\n\n getRouteListForCustomer() {\n const customerId = this.customerRepoDetails?.customer.id;\n if (customerId) {\n this.utils.postdata('routes/all', { customer_id: customerId }).subscribe((res: any) => {\n if (res && res.data) {\n const list = res.data.map((ele: CoolmapRoute) => {\n ele.unit = this.getUnitName(ele);\n this.utils.makeOptions(ele);\n return ele;\n });\n this.routes.set(list);\n }\n });\n }\n }\n\n getUnitName(data: any): string {\n let unitName = '';\n this.unitList.forEach((res) => {\n if (res.id === data.unit_id) {\n unitName = res.type;\n }\n });\n return unitName || data.unit;\n }\n\n close() {\n this.modalOpenChange.emit(false);\n }\n\n isRouteSelected(route: CoolmapRoute): boolean {\n const id = this.getRouteId(route);\n return this.selectedRouteIds().includes(id || '');\n }\n\n toggleRoute(route: CoolmapRoute) {\n if (this.isPlotting(route)) return;\n this.routeSelect.emit(route);\n }\n\n onMasterToggle() {\n if (this.isAnyPlotting()) return;\n this.masterToggleEvent.emit(this.filteredRoutes());\n }\n\n addFilter(option: any) {\n // V1 behavior: keep single filter\n this.filters.set([{ name: option.label, type: option.type, value: option.value }]);\n this.searchTerm.set('');\n this.showSuggestions.set(false);\n }\n\n removeFilter() {\n this.filters.set([]);\n }\n\n handleSearchInput(val: string) {\n this.searchTerm.set(val);\n this.showSuggestions.set(true);\n }\n\n onSearchBlur() {\n // Delay hiding to allow (click) on suggestions to fire first\n setTimeout(() => {\n this.showSuggestions.set(false);\n }, 200);\n }\n\n get hasFilter(): boolean {\n return this.filters().length > 0;\n }\n\n isPlotting(route: CoolmapRoute): boolean {\n const prefix = this.modalOpen() ? 'jobrouteList' : 'jobcode';\n const id = this.getRouteId(route);\n return this.coolmapService.plottingIds().has(`${prefix}-${id}`);\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n\n icons = {\n X,\n Info,\n Share2,\n CheckCircle,\n LoaderCircle\n };\n}\n","@if (modalOpen()) {\n<div class=\"fixed z-[111] route-list\">\n <div class=\"fixed inset-0 bg-black/50\" (click)=\"close()\"></div>\n <aside class=\"detail-drawer top-[0] sm:top-[115px]\" (click)=\"$event.stopPropagation()\">\n <div\n class=\"flex items-center justify-between px-[12px] py-[10px] border-b border-gray-200 dark:border-slate-700 dark:bg-slate-900\"\n >\n <h3 class=\"flex items-center gap-1 font-semibold text-gray-900 dark:text-white text-[14px]\">\n List of Routes\n <span class=\"text-xs font-normal text-gray-400\">({{ filteredRoutes().length }})</span>\n </h3>\n <button\n type=\"button\"\n (click)=\"onMasterToggle()\"\n [disabled]=\"isAnyPlotting()\"\n class=\"inline-flex items-center justify-center gap-2 px-3 sm:px-4 py-1.5 bg-brand-blue hover:bg-blue-700 disabled:opacity-50 text-white font-medium rounded-md transition-colors text-[12px]\"\n >\n {{ allSelected() ? 'Uncheck All' : 'Check All' }}\n </button>\n <button\n (click)=\"close()\"\n class=\"p-1.5 hover:bg-gray-100 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n <lucide-icon [img]=\"icons.X\" [size]=\"18\"></lucide-icon>\n </button>\n </div>\n <div class=\"p-2\">\n <div class=\"relative w-full\">\n <div class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <lucide-icon [img]=\"hasFilter ? icons.Info : icons.Share2\" class=\"text-gray-400\" [size]=\"18\"></lucide-icon>\n </div>\n <input\n type=\"text\"\n #searchinput\n [value]=\"searchTerm()\"\n (input)=\"handleSearchInput(searchinput.value)\"\n (focus)=\"showSuggestions.set(true)\"\n (blur)=\"onSearchBlur()\"\n placeholder=\"Search...\"\n class=\"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm\"\n />\n\n <!-- Autocomplete Suggestions Dropdown -->\n @if (showSuggestions() && suggestions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-60 overflow-y-auto\">\n <ul class=\"py-1 text-sm text-gray-700 dark:text-gray-200\">\n @for (option of suggestions(); track option.label + option.type) {\n <li (click)=\"addFilter(option)\"\n class=\"px-4 py-2 hover:bg-brand-blue/10 dark:hover:bg-brand-blue/20 cursor-pointer flex justify-between items-center group\">\n <span>\n <span class=\"font-semibold text-brand-blue capitalize\">{{option.type}}:</span> \n {{option.label}}\n </span>\n <lucide-icon [img]=\"icons.CheckCircle\" class=\"opacity-0 group-hover:opacity-100 text-brand-blue transition-opacity\" [size]=\"16\"></lucide-icon>\n </li>\n }\n </ul>\n </div>\n }\n </div>\n\n <!-- Active Filter Chips -->\n @if (hasFilter) {\n <div class=\"flex flex-wrap gap-2 mt-2 px-1\">\n @for (filter of filters(); track filter.name + filter.type) {\n <div class=\"inline-flex items-center gap-1.5 px-3 py-1 bg-brand-blue/10 border border-brand-blue/20 text-brand-blue rounded-full text-xs font-medium\">\n <span class=\"capitalize\">{{filter.type}}:</span>\n <span class=\"truncate max-w-[150px]\">{{filter.name}}</span>\n <button (click)=\"removeFilter()\" class=\"hover:text-red-500 transition-colors\">\n <lucide-icon [img]=\"icons.X\" [size]=\"14\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"overflow-y-auto p-2 drawer-listing-box\">\n <cdk-virtual-scroll-viewport itemSize=\"60\" class=\"routeList-viewport h-[calc(100vh-250px)]\">\n @if (filteredRoutes().length > 0) {\n <ul class=\"route-list-ul gap-2 flex flex-col\">\n @for (route of filteredRoutes(); track getRouteId(route)) {\n <li \n class=\"route-li-v1 bg-white dark:bg-slate-800 border border-gray-300 dark:border-slate-700\" \n [class.selected]=\"isRouteSelected(route)\" \n [class.pointer-events-none]=\"isAnyPlotting()\"\n [class.opacity-60]=\"isAnyPlotting()\"\n (click)=\"toggleRoute(route)\">\n <div class=\"task-header justify-between\">\n <span class=\"job-code\"> {{route.route_name || route.order_number}} </span>\n @if (config.repository === 'coolmap') {\n <span class=\"job-code\">{{route.customer_name}}</span>\n }\n <div class=\"iconprt\">\n @if (isPlotting(route)) {\n <div class=\"plotting-spinner\">\n <lucide-icon [img]=\"icons.LoaderCircle\" class=\"animate-spin text-black dark:text-white flex items-center justify-center relative z-10\" [size]=\"18\"></lucide-icon>\n </div>\n }\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">\n {{ route.unit?.charAt(0) || 'U' }}\n </div>\n <div class=\"infoicon\" (click)=\"$event.stopPropagation(); selectedRoute.set(route); showRouteModal = true\">\n <lucide-icon [img]=\"icons.Info\" [size]=\"18\" class=\"text-gray-400\"></lucide-icon>\n </div>\n @if (config.repository === 'customer') {\n <div class=\"infoicon\" (click)=\"$event.stopPropagation()\">\n <lucide-icon [img]=\"icons.Share2\" [size]=\"16\" class=\"text-gray-400\"></lucide-icon>\n </div>\n }\n </div>\n </div>\n \n <div class=\"location-flow bg-gray-100 dark:bg-slate-900 px-2 py-2 pb-3 rounded-lg\">\n <span class=\"pickup\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.pickup_location || '').split('|')[1] ? (route.pickup_location || '').split('|')[1] : (route.pickup_location || '') }}\n </span>\n <span class=\"delivery\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n {{ (route.delivery_location || '').split('|')[1] ? (route.delivery_location || '').split('|')[1] : (route.delivery_location || '') }}\n </span>\n </div>\n </li>\n }\n </ul>\n } @else if (routes().length === 0) {\n <div class=\"p-8 text-center text-gray-400\">\n No routes available for this perspective.\n </div>\n }\n </cdk-virtual-scroll-viewport>\n </div>\n </aside>\n</div>\n}\n<lib-route-info-card [(modalOpen)]=\"showRouteModal\" [routeData]=\"selectedRoute()\" [repository]=\"config.repository\" displayMode=\"dispatch\"></lib-route-info-card>\n","import { Component, Input, Output, EventEmitter, signal, inject } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { LucideAngularModule, Info, ChevronRight, ChevronLeft } from 'lucide-angular';\nimport { COOLMAP_CONFIG, CoolmapRoute } from '@aggdirect/coolmap-services';\nimport { RouteInfoCardComponent } from '../route-info-card/route-info-card.component';\n\nexport type CardListMode = 'sidebar' | 'floating' | 'inline';\n\n@Component({\n selector: 'lib-view-route-list',\n standalone: true,\n imports: [LucideAngularModule, RouteInfoCardComponent, NgClass],\n templateUrl: './view-route-list.component.html',\n styleUrl: './view-route-list.component.scss',\n})\nexport class ViewRouteListComponent {\n showRouteModal = false;\n selectedRoute = signal<CoolmapRoute | null>(null);\n config = inject(COOLMAP_CONFIG);\n\n @Input() listMode: CardListMode = 'sidebar';\n @Input() collapsible = true;\n @Input() routes: CoolmapRoute[] = [];\n @Input() selectedRouteIds: string[] = [];\n @Output() routeSelect = new EventEmitter<string>();\n @Output() editRoute = new EventEmitter<CoolmapRoute>();\n\n collapsed = false;\n\n icons = {\n Info,\n ChevronRight,\n ChevronLeft\n };\n\n toggleCollapse() {\n if (this.collapsible) {\n this.collapsed = !this.collapsed;\n }\n }\n\n toggleRouteSelection(route: CoolmapRoute) {\n const id = this.getRouteId(route);\n if (!id) return;\n this.routeSelect.emit(id);\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n}\n","<div\n class=\"cards-list-container\"\n [class.floating]=\"listMode === 'floating'\"\n [class.sidebar]=\"listMode === 'sidebar'\"\n [class.inline]=\"listMode === 'inline'\"\n [class.collapsed]=\"collapsed\"\n>\n @if (listMode !== 'inline') {\n <div class=\"list-header\">\n <div class=\"header-title\">\n <span class=\"title-text\">View Route</span>\n <span class=\"routes-count\">({{ routes.length || 0 }})</span>\n </div>\n <button\n class=\"collapse-btn\"\n (click)=\"toggleCollapse()\"\n [title]=\"collapsed ? 'Expand' : 'Collapse'\"\n >\n @if (collapsed) {\n <lucide-icon [img]=\"icons.ChevronRight\" [size]=\"16\"></lucide-icon>\n } @else {\n <lucide-icon [img]=\"icons.ChevronLeft\" [size]=\"16\"></lucide-icon>\n }\n </button>\n </div>\n } \n \n @if (!collapsed) {\n <div class=\"cards-scroll-container\" #scrollContainer>\n <div class=\"cards-list\">\n @for (route of routes; track getRouteId(route)) {\n <div class=\"card-wrapper\" (click)=\"toggleRouteSelection(route)\">\n <div\n class=\"route-card bg-white dark:bg-slate-800 border transition-all duration-200\"\n [class.border-brand-blue]=\"selectedRouteIds.includes(getRouteId(route))\"\n [class.border-gray-200]=\"!selectedRouteIds.includes(getRouteId(route))\"\n [class.dark:border-slate-700]=\"!selectedRouteIds.includes(getRouteId(route))\"\n [class.selected]=\"selectedRouteIds.includes(getRouteId(route))\"\n >\n <div class=\"task-header justify-between items-start mb-1\">\n <h2 class=\"text-sm font-semibold text-gray-900 dark:text-white truncate max-w-[80%]\">\n {{ route.route_name || route.order_number || 'Unnamed Route' }}\n </h2>\n <div class=\"flex gap-2 shrink-0\">\n <div class=\"statusunit text-white\" [ngClass]=\"route.unit || ''\">\n {{ route.unit?.charAt(0) || 'U' }}\n </div>\n <button\n type=\"button\"\n class=\"text-gray-400 hover:text-brand-blue transition-colors\"\n (click)=\"$event.stopPropagation(); selectedRoute.set(route); showRouteModal = true\"\n >\n <lucide-icon [img]=\"icons.Info\" [size]=\"18\"></lucide-icon>\n </button>\n </div>\n </div>\n \n @if (route.customer_name) {\n <div class=\"text-[10px] text-gray-500 dark:text-slate-500 mb-2 uppercase tracking-wider font-medium truncate\">\n {{ route.customer_name }}\n </div>\n }\n\n <div class=\"location-flow bg-gray-50 dark:bg-slate-900/50 border border-gray-100 dark:border-slate-700/50 p-2 rounded-lg\">\n <div class=\"text-[11px] truncate flex items-center gap-1.5 text-gray-600 dark:text-gray-400\">\n <div class=\"w-1.5 h-1.5 rounded-full bg-green-500 shrink-0 bullet\"></div>\n {{ (route.pickup_location || '').split('|')[1] || route.pickup_location || 'N/A' }}\n </div>\n <div class=\"text-[11px] truncate flex items-center gap-1.5 mt-1 text-gray-600 dark:text-gray-400\">\n <div class=\"w-1.5 h-1.5 rounded-full bg-blue-500 shrink-0 bullet\"></div>\n {{ (route.delivery_location || '').split('|')[1] || route.delivery_location || 'N/A' }}\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"p-8 text-center text-gray-400 text-sm italic\">\n No routes found in this catalog.\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<lib-route-info-card \n [(modalOpen)]=\"showRouteModal\" \n [routeData]=\"selectedRoute()\" \n [repository]=\"config.repository\" \n displayMode=\"catalog\"\n (edit)=\"editRoute.emit(selectedRoute()!)\"\n></lib-route-info-card>\n","import { Component, EventEmitter, HostListener, Output, input, signal, inject, effect, viewChild, ElementRef, AfterViewInit, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { LucideAngularModule, X, ChevronDown, Check, LoaderCircle } from 'lucide-angular';\nimport { ReactiveFormsModule, FormGroup, FormControl, Validators } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { filter, pairwise } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { COOLMAP_CONFIG, UtilsService, CoolmapService, LocationAll } from '@aggdirect/coolmap-services';\nimport { DestroyRef, ChangeDetectorRef } from '@angular/core';\n\n@Component({\n selector: 'lib-add-route',\n standalone: true,\n imports: [LucideAngularModule, ReactiveFormsModule, CommonModule],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './add-route.component.html',\n styleUrl: './add-route.component.scss',\n})\nexport class AddRouteComponent implements AfterViewInit {\n config = inject(COOLMAP_CONFIG);\n modalOpen = input<boolean>(false);\n routeData = input<any>(null);\n customerRepoDetails = input<any>(null);\n @Output() modalOpenChange = new EventEmitter<boolean>();\n @Output() routeDeleted = new EventEmitter<string>();\n @Output() routeSaved = new EventEmitter<any>();\n dragX = signal(0);\n dragY = signal(0);\n isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private dragInitialX = 0;\n private dragInitialY = 0;\n\n // New Services\n utils = inject(UtilsService);\n coolMapService = inject(CoolmapService);\n destroyRef = inject(DestroyRef);\n cdr = inject(ChangeDetectorRef);\n\n addRouteForm = new FormGroup({\n route_name: new FormControl('', [Validators.required]),\n customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),\n customer_id: new FormControl(''),\n unit_id: new FormControl('', [Validators.required]),\n path: new FormControl('', [Validators.required]),\n pickup_location: new FormControl('', [Validators.required]),\n pickup_lat_lng: new FormControl('', [Validators.required]),\n delivery_location: new FormControl('', [Validators.required]),\n delivery_lat_lng: new FormControl('', [Validators.required]),\n estimated_distance: new FormControl('', [Validators.required]),\n estimated_time: new FormControl('', [Validators.required]),\n note: new FormControl('', [Validators.maxLength(2048)]),\n trucker_pay_estimate: new FormControl(null),\n customer_price_estimate: new FormControl(null),\n pickUpSearchOption: new FormControl(inject(COOLMAP_CONFIG).repository === 'coolmap' ? 'system' : 'google'),\n deliverySearchOtption: new FormControl(inject(COOLMAP_CONFIG).repository === 'coolmap' ? 'system' : 'google'),\n });\n\n // Data signals\n unitsList = signal<any[]>([]);\n locationList = signal<LocationAll[]>([]);\n customersList = signal<any[]>([]);\n showDeleteModal = signal(false);\n routeId = signal<string | null>(null);\n preventSave = signal(false);\n preventInitialSave = signal(false);\n \n // Search options\n customerOptions = signal<any[]>([]);\n pickupOptions = signal<LocationAll[]>([]);\n deliveryOptions = signal<LocationAll[]>([]);\n \n // UI toggles\n showCustomerDropdown = signal(false);\n showPickupDropdown = signal(false);\n showDeliveryDropdown = signal(false);\n loadingLocations = signal(false);\n loadingCustomers = signal(false);\n\n hideDropdown(type: string) {\n setTimeout(() => {\n if (type === 'customer') this.showCustomerDropdown.set(false);\n if (type === 'pickup') this.showPickupDropdown.set(false);\n if (type === 'delivery') this.showDeliveryDropdown.set(false);\n }, 200);\n }\n\n // ElementRefs for Google Maps integration\n filterPickup = viewChild<ElementRef>('filterPickup');\n filterDelivery = viewChild<ElementRef>('filterDelivery');\n\n get isSystemPickup() {\n return this.addRouteForm.get('pickUpSearchOption')?.value === 'system';\n }\n\n get isSystemDelivery() {\n return this.addRouteForm.get('deliverySearchOtption')?.value === 'system';\n }\n\n get selectedUnitName() {\n const unitId = this.addRouteForm.value.unit_id;\n if (!unitId) return 'Select Unit/Driver';\n const unit = this.unitsList().find(u => u.id === unitId);\n return unit ? unit.type : 'Select Unit/Driver';\n }\n\n constructor() {\n\n\n // Effect for handling routeData Input\n effect(() => {\n const data = this.routeData();\n setTimeout(() => {\n this.inIt(data);\n }, 0);\n });\n\n effect(() => {\n if (this.modalOpen()) {\n this.coolMapService.clearAllRoutes();\n this.utils.fetchUnitsList().then((res: any) => {\n this.unitsList.set(res || []);\n });\n\n if (this.config.repository === 'coolmap') {\n this.loadingLocations.set(true);\n this.addRouteForm.get('pickup_location')?.disable();\n this.addRouteForm.get('delivery_location')?.disable();\n \n this.utils.fetchLocationlist().then((res: any) => {\n this.locationList.set(res || []);\n this.pickupOptions.set(res || []);\n this.deliveryOptions.set(res || []);\n this.loadingLocations.set(false);\n this.addRouteForm.get('pickup_location')?.enable();\n this.addRouteForm.get('delivery_location')?.enable();\n });\n this.loadingCustomers.set(true);\n this.utils.fetchCustomersList().then((res: any) => {\n this.customersList.set(res || []);\n this.customerOptions.set(res || []);\n this.addRouteForm.controls['customer_name'].enable();\n this.loadingCustomers.set(false);\n });\n }\n\n setTimeout(() => {\n this.bindGoogleAutocomplete();\n }, 150);\n }\n });\n\n // Reacting to dropdown changes for re-running calculations\n this.addRouteForm.get('pickup_location')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (res && res !== this.addRouteForm.getRawValue().pickup_location) {\n this.addRouteForm.patchValue({ pickup_lat_lng: '' });\n }\n // Populate dropdown for system\n if (this.isSystemPickup) {\n if (!res) {\n this.pickupOptions.set(this.locationList());\n } else {\n const lower = res.toLowerCase();\n this.pickupOptions.set(this.locationList().filter(l => l.formatted_address.toLowerCase().includes(lower)));\n }\n }\n });\n\n this.addRouteForm.get('delivery_location')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (res && res !== this.addRouteForm.getRawValue().delivery_location) {\n this.addRouteForm.patchValue({ delivery_lat_lng: '' });\n }\n if (this.isSystemDelivery) {\n if (!res) {\n this.deliveryOptions.set(this.locationList());\n } else {\n const lower = res.toLowerCase();\n this.deliveryOptions.set(this.locationList().filter(l => l.formatted_address.toLowerCase().includes(lower)));\n }\n }\n });\n\n this.addRouteForm.get('customer_name')?.valueChanges.pipe(takeUntilDestroyed()).subscribe(res => {\n if (!res) {\n this.customerOptions.set(this.customersList());\n } else {\n const lower = res.toLowerCase();\n this.customerOptions.set(this.customersList().filter(c => c.customer_name.toLowerCase().includes(lower)));\n }\n });\n \n // Clear path if logic changes\n this.addRouteForm.valueChanges.pipe(\n takeUntilDestroyed(),\n pairwise(),\n filter(([prev, curr]) => {\n return (prev.pickUpSearchOption === curr.pickUpSearchOption) && \n prev.deliverySearchOtption === curr.deliverySearchOtption\n })\n ).subscribe(() => {\n if (this.preventInitialSave()) {\n this.preventInitialSave.set(false);\n }\n });\n }\n\n ngAfterViewInit() {\n // Listen for search mode changes\n this.addRouteForm.get('pickUpSearchOption')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\n this.addRouteForm.patchValue({ pickup_location: null, pickup_lat_lng: null });\n });\n\n this.addRouteForm.get('deliverySearchOtption')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => {\n this.addRouteForm.patchValue({ delivery_location: null, delivery_lat_lng: null });\n });\n }\n\n async onGooglePlaceSelect(event: any, type: 'pickup' | 'delivery') {\n console.log('event', event);\n const place = event.placePrediction?.toPlace();\n if (!place) return;\n \n // The google API wrapper may require raw DOM event access depending on module configuration\n try {\n await place.fetchFields({ fields: ['location', 'formattedAddress', 'displayName'] });\n const res = {\n lat: place.location.lat(),\n lng: place.location.lng(),\n formatted_address: place.formattedAddress || place.displayName\n };\n this.patchAddressValue(res, type);\n } catch(e) {\n console.warn(\"Failed to retrieve Place data natively: \", e);\n }\n }\n\n bindGoogleAutocomplete() {\n const pickupEl = this.filterPickup()?.nativeElement;\n const deliveryEl = this.filterDelivery()?.nativeElement;\n\n if (pickupEl) {\n const autocomplete = new (window as any).google.maps.places.Autocomplete(pickupEl);\n autocomplete.addListener('place_changed', () => {\n const place = autocomplete.getPlace();\n if (place.geometry) {\n const res = {\n lat: place.geometry.location.lat(),\n lng: place.geometry.location.lng(),\n formatted_address: place.formatted_address || place.name\n };\n this.patchAddressValue(res, 'pickup');\n }\n });\n }\n\n if (deliveryEl) {\n const autocomplete = new (window as any).google.maps.places.Autocomplete(deliveryEl);\n autocomplete.addListener('place_changed', () => {\n const place = autocomplete.getPlace();\n if (place.geometry) {\n const res = {\n lat: place.geometry.location.lat(),\n lng: place.geometry.location.lng(),\n formatted_address: place.formatted_address || place.name\n };\n this.patchAddressValue(res, 'delivery');\n }\n });\n }\n }\n\n inIt(changes: any) {\n if (changes && Object.keys(changes).length > 0) {\n if (!changes.prevent) {\n this.preventSave.set(false);\n this.patchFormValue(changes).then(() => {\n this.checkAndFetchRouteInformation(true);\n });\n }\n } else {\n this.preventSave.set(true);\n this.patchFormValue().then(() => {\n this.checkAndFetchRouteInformation();\n });\n }\n }\n\n async patchFormValue(data?: any) {\n this.addRouteForm.reset();\n const isCustomerRepo = this.config.repository === 'customer';\n if (data) {\n this.addRouteForm.patchValue(data, { emitEvent: false });\n }\n if (isCustomerRepo && this.customerRepoDetails()) {\n this.addRouteForm.patchValue({\n customer_id: this.customerRepoDetails().customer?.id,\n customer_name: this.customerRepoDetails().customer?.name,\n pickUpSearchOption: 'google',\n deliverySearchOtption: 'google'\n }, { emitEvent: false });\n } else {\n this.addRouteForm.patchValue({\n pickUpSearchOption: (!data || (data.hasOwnProperty('is_system_pickup') ? data.is_system_pickup : true)) ? 'system' : 'google',\n deliverySearchOtption: (!data || (data.hasOwnProperty('is_system_delivery') ? data.is_system_delivery : true)) ? 'system' : 'google',\n }, { emitEvent: false });\n }\n this.routeId.set(data?.route_id || data?.id || null);\n await true;\n }\n\n patchAddressValue(data: any, type: string) {\n this.addRouteForm.patchValue({\n [type + '_location']: data.formatted_address,\n [type + '_lat_lng']: `${data.lat},${data.lng}`\n });\n this.checkAndFetchRouteInformation();\n }\n\n checkAndFetchRouteInformation(isinitial?: boolean) {\n const val = this.addRouteForm.value;\n if (val.delivery_lat_lng && val.pickup_lat_lng && val.unit_id) {\n const unit = this.unitsList().find((x: any) => x.id === val.unit_id);\n const param = {\n delivery_lat_lng: val.delivery_lat_lng,\n pickup_lat_lng: val.pickup_lat_lng,\n unit: unit?.type || 'Ton'\n };\n // Mapbox estimation route\n this.utils.postdata('calculate/routes/estimation', param).subscribe({\n next: (res: any) => {\n setTimeout(() => {\n if (res && res.path) {\n this.addRouteForm.patchValue({\n estimated_distance: res.dist,\n estimated_time: res.time,\n path: res.path,\n trucker_pay_estimate: res.trucker_haul_cost,\n customer_price_estimate: res.customer_price_estimate\n });\n // Decode and plot\n let path = res.path.split(';').map((str: string) => {\n const parts = str.split(',');\n return [parseFloat(parts[1]), parseFloat(parts[0])];\n });\n const element: any = {\n type: 'FeatureCollection',\n features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: path } }]\n };\n this.coolMapService.removeRouteAndMarker(1).then(() => {\n this.coolMapService.loadMapProperty(element, 1, unit?.type, {\n pickup_location: val.pickup_location,\n delivery_location: val.delivery_location,\n route_name: val.route_name,\n unit: unit?.type\n });\n this.preventSave.set(true);\n this.cdr.detectChanges();\n });\n } else {\n console.warn('Could not calculate route');\n this.preventSave.set(true);\n this.utils.openSnackBar((res?.status ? res.status : 'Somthing went wrong, Please try different address.'), 'error');\n this.cdr.detectChanges();\n }\n if (this.routeId() && isinitial) {\n this.preventInitialSave.set(true);\n this.cdr.detectChanges();\n }\n });\n }\n });\n } else {\n this.coolMapService.removeRouteAndMarker(1, 'addroute');\n }\n }\n\n saveRoute() {\n if (this.addRouteForm.valid) {\n const data: any = this.addRouteForm.getRawValue();\n const endpoint = this.routeId() ? 'update/routes' : 'add/routes';\n if (this.routeId()) data.id = this.routeId();\n \n this.utils.postdata(endpoint, data).subscribe({\n next: (res: any) => {\n if (res.success) {\n this.utils.openSnackBar(res.message, 'success');\n // Emit the saved data for local synchronization\n this.routeSaved.emit(data);\n this.close();\n } else {\n this.utils.openSnackBar(res.message, 'error');\n }\n }\n });\n } else {\n this.addRouteForm.markAllAsTouched();\n }\n }\n\n promptDelete() {\n this.showDeleteModal.set(true);\n }\n\n confirmDelete() {\n if (!this.routeId()) return;\n this.utils.postdata('delete/routes', { uuid: this.routeId() }).subscribe({\n next: (res: any) => {\n if (res?.data?.success) {\n this.utils.openSnackBar(res.data.message, 'success');\n const deletedId = this.routeId()!;\n this.routeDeleted.emit(deletedId);\n this.showDeleteModal.set(false);\n this.close();\n }\n }\n });\n }\n\n close() {\n const isCoolmap = this.config.repository === 'coolmap';\n this.addRouteForm.reset({\n pickUpSearchOption: isCoolmap ? 'system' : 'google',\n deliverySearchOtption: isCoolmap ? 'system' : 'google'\n });\n this.coolMapService.removeRouteAndMarker(1, 'addroute');\n this.modalOpenChange.emit(false);\n }\n icons = {\n X, ChevronDown, Check, LoaderCircle\n };\n\n // Dynamic dropdown state logic\n dropdownOpen = signal(false);\n selectedUnitDriver = signal<string | null>(null);\n\n toggleDropdown() {\n this.dropdownOpen.update(v => !v);\n }\n\n selectOption(opt: string) {\n this.selectedUnitDriver.set(opt);\n this.dropdownOpen.set(false);\n }\n\n @HostListener('document:click', ['$event'])\n closeDropdowns(event: Event) {\n // Basic click-outside wrapper\n const target = event.target as HTMLElement;\n if (!target.closest('.relative')) {\n this.dropdownOpen.set(false);\n }\n }\n\n startDrag(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n if (target.tagName.toLowerCase() === 'button' || target.closest('button')) {\n return;\n }\n this.isDragging = true;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.dragInitialX = this.dragX();\n this.dragInitialY = this.dragY();\n event.preventDefault();\n }\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.isDragging || !this.modalOpen()) return;\n this.dragX.set(this.dragInitialX + (event.clientX - this.dragStartX));\n this.dragY.set(this.dragInitialY + (event.clientY - this.dragStartY));\n }\n @HostListener('document:mouseup')\n onMouseUp(): void {\n this.isDragging = false;\n }\n}\n\n","@if (modalOpen()) {\n<div class=\"fixed inset-0 z-[112] overflow-y-auto\">\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <form\n [formGroup]=\"addRouteForm\"\n (ngSubmit)=\"saveRoute()\"\n class=\"pointer-events-auto relative bg-white dark:bg-slate-800 rounded-lg shadow-xl animate-slide-up w-[1000px]\"\n [style.transform]=\"'translate(' + dragX() + 'px, ' + dragY() + 'px)'\"\n (click)=\"$event.stopPropagation()\"\n >\n <div\n class=\"flex items-center justify-between p-4 border-b border-gray-200 dark:border-slate-700 cursor-move\"\n (mousedown)=\"startDrag($event)\"\n >\n <h3 class=\"flex items-center gap-1 text-lg font-semibold text-gray-900 dark:text-white\">\n {{ routeId() ? 'Edit Route' : 'Add Route' }}\n </h3>\n <div class=\"flex items-center gap-4\">\n <button\n type=\"submit\"\n class=\"inline-flex items-center justify-center gap-2 px-4 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 text-white font-medium rounded-lg transition-colors text-sm\">\n Save\n </button>\n @if (routeId()) {\n <button\n type=\"button\"\n (click)=\"promptDelete()\"\n class=\"inline-flex items-center gap-2 px-4 py-2 bg-red-600 text-white hover:bg-red-700 font-medium rounded-lg transition-colors text-sm\"\n >\n Delete\n </button>\n }\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 px-4 py-2 bg-gray-600 text-white hover:bg-gray-700 font-medium rounded-lg transition-colors text-sm\"\n (click)=\"close()\"\n >\n Close\n </button>\n </div>\n </div>\n <div class=\"max-h-[70vh] overflow-y-auto p-4\">\n <div class=\"grid grid-cols-2 mb-[1rem] gap-4\">\n <div>\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Route Name</label\n >\n <input\n type=\"text\"\n formControlName=\"route_name\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm\"\n />\n </div>\n <div class=\"relative\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Customer Name</label>\n <div class=\"relative\">\n <input\n type=\"text\"\n formControlName=\"customer_name\"\n (focus)=\"showCustomerDropdown.set(true)\"\n (blur)=\"hideDropdown('customer')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingCustomers()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n </div>\n @if (showCustomerDropdown() && customerOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (cust of customerOptions(); track cust.customer_id) {\n <div \n (mousedown)=\"addRouteForm.patchValue({customer_name: cust.customer_name})\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ cust.customer_name }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n <div class=\"grid grid-cols-1 mb-[1rem]\">\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-3 py-3 rounded-lg\"\n >\n @if (config.repository === 'coolmap') {\n <div class=\"flex gap-2 mb-2\">\n <div class=\"radio w-100 md:w-auto\">\n <input\n type=\"radio\"\n formControlName=\"pickUpSearchOption\"\n value=\"system\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"\n />\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\"\n >\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">System Search</div>\n </div>\n </label>\n </div>\n <div class=\"radio w-100 md:w-auto ml-2\">\n <input\n type=\"radio\"\n formControlName=\"pickUpSearchOption\"\n value=\"google\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"\n />\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\"\n >\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">Google Search</div>\n </div>\n </label>\n </div>\n </div>\n }\n <div class=\"relative\">\n <input\n #filterPickup\n type=\"text\"\n formControlName=\"pickup_location\"\n placeholder=\"Pickup\"\n (focus)=\"showPickupDropdown.set(true)\"\n (blur)=\"hideDropdown('pickup')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingLocations()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n @if (isSystemPickup && showPickupDropdown() && pickupOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (loc of pickupOptions(); track loc.formatted_address) {\n <div \n (mousedown)=\"patchAddressValue(loc, 'pickup')\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ loc.formatted_address }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-1 mb-[1rem]\">\n <div\n class=\"location-flow bg-gray-100 dark:bg-slate-900 border border-gray-300 dark:border-slate-700 px-3 py-3 rounded-lg\"\n >\n @if (config.repository === 'coolmap') {\n <div class=\"flex gap-2 mb-2\">\n <div class=\"radio w-100 md:w-auto\">\n <input\n type=\"radio\"\n formControlName=\"deliverySearchOtption\"\n value=\"system\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"/>\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\">\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">System Search</div>\n </div>\n </label>\n </div>\n <div class=\"radio w-100 md:w-auto ml-2\">\n <input\n type=\"radio\"\n formControlName=\"deliverySearchOtption\"\n value=\"google\"\n class=\"shrink-0 size-4 bg-transparent border-line-3 rounded-full shadow-2xs text-primary focus:ring-0 focus:ring-offset-0 checked:bg-primary-checked checked:border-primary-checked\"/>\n <label\n class=\"border-solid border-1 border-grey dark:border-slate-400 block shadow-md rounded-lg lg:whitespace-nowrap w-full ml-2\">\n <div class=\"flex justify-between items-center px-4 py-2 text-xs lg:text-base\">\n <div class=\"tracking-wide text-xs\">Google Search</div>\n </div>\n </label>\n </div>\n </div>\n }\n <div class=\"relative\">\n <input\n #filterDelivery\n type=\"text\"\n formControlName=\"delivery_location\"\n placeholder=\"Delivery\"\n (focus)=\"showDeliveryDropdown.set(true)\"\n (blur)=\"hideDropdown('delivery')\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm pr-10\"\n />\n @if (loadingLocations()) {\n <div class=\"absolute right-3 top-1/2 -translate-y-1/2\">\n <lucide-icon [img]=\"icons.LoaderCircle\" [size]=\"18\" class=\"animate-spin text-blue-500\"></lucide-icon>\n </div>\n }\n @if (isSystemDelivery && showDeliveryDropdown() && deliveryOptions().length > 0) {\n <div class=\"absolute z-50 w-full mt-1 bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-lg shadow-lg max-h-48 overflow-y-auto\">\n @for (loc of deliveryOptions(); track loc.formatted_address) {\n <div \n (mousedown)=\"patchAddressValue(loc, 'delivery')\"\n class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm text-gray-900 dark:text-white\">\n {{ loc.formatted_address }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"flex gap-4 flex-col md:flex-row\">\n <div class=\"w-full md:w-[70%]\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Notes</label\n >\n <textarea\n formControlName=\"note\"\n class=\"w-full px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm h-[46px]\"\n ></textarea>\n </div>\n <div class=\"w-full md:w-[30%]\">\n <label class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Unit Type</label\n >\n <div class=\"relative w-full\">\n <button\n type=\"button\"\n (click)=\"toggleDropdown(); $event.stopPropagation()\"\n class=\"w-full flex justify-between items-center px-3 py-3 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm text-left\"\n >\n <span>{{ selectedUnitName }}</span>\n <lucide-icon [img]=\"icons.ChevronDown\" [size]=\"16\" class=\"text-gray-400\"></lucide-icon>\n </button>\n @if (dropdownOpen()) {\n <div class=\"absolute z-10 mt-1 w-full bg-white dark:bg-slate-800 rounded-lg shadow-lg border border-gray-200 dark:border-slate-700 py-1 max-h-60 overflow-auto\">\n @for (opt of unitsList(); track opt.id) {\n <button\n type=\"button\"\n (click)=\"addRouteForm.patchValue({unit_id: opt.id}); checkAndFetchRouteInformation(); dropdownOpen.set(false)\"\n class=\"w-full flex items-center justify-between px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-slate-700 transition\"\n >\n <span>{{ opt.type }}</span>\n @if (addRouteForm.value.unit_id === opt.id) {\n <lucide-icon [img]=\"icons.Check\" [size]=\"16\" class=\"text-blue-500\"></lucide-icon>\n }\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-2 mt-2 gap-4\">\n <div class=\"flex flex-col lg:flex-row gap-2\">\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Estimation of miles - <b>{{ addRouteForm.value.estimated_distance || '0' }} Miles</b>\n </span>\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Estimation of time - <b>{{ addRouteForm.value.estimated_time || '0' }} Minutes</b>\n </span>\n </div>\n <div class=\"flex flex-col lg:flex-row gap-2 justify-end\">\n @if (config.repository !== 'customer') {\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Trucker Pay Estimate - <b>{{ addRouteForm.value.trucker_pay_estimate | currency }}</b>\n </span>\n }\n <span\n class=\"text-[10px] text-gray-500 dark:text-slate-400 mb-1 whitespace-nowrap italic\"\n >\n Customer Price Estimate - <b>{{ addRouteForm.value.customer_price_estimate | currency }}</b>\n </span>\n \n </div>\n </div>\n </div>\n </form>\n\n @if (showDeleteModal()) {\n <div class=\"fixed inset-0 z-[120] flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in pointer-events-auto\">\n <div class=\"bg-white dark:bg-slate-900 rounded-xl shadow-2xl p-6 max-w-sm w-full mx-4 border border-gray-200 dark:border-slate-800\" (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-lg font-bold text-gray-900 dark:text-white mb-2\">Delete Route?</h3>\n <p class=\"text-gray-600 dark:text-gray-400 text-sm mb-6\">\n Are you sure you want to delete this route?\n </p>\n <div class=\"flex justify-end gap-3\">\n <button\n type=\"button\"\n (click)=\"showDeleteModal.set(false)\"\n class=\"px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 dark:text-gray-300 dark:bg-slate-800 dark:hover:bg-slate-700 rounded-lg transition-colors\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n (click)=\"confirmDelete()\"\n class=\"px-4 py-2 text-sm font-medium text-white bg-red-600 hover:bg-red-700 rounded-lg shadow-sm transition-colors\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n</div>\n}\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild, inject, signal, computed, OnInit, OnChanges, SimpleChanges, input, effect } from '@angular/core';\nimport { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MapboxService, COOLMAP_CONFIG, UtilsService, CoolmapService, CoolmapRoute } from '@aggdirect/coolmap-services';\nimport { JobCodeComponent } from '../job-code/job-code.component';\nimport { JobRouteListComponent } from '../job-route-list/job-route-list.component';\nimport { ViewRouteListComponent } from '../view-route-list/view-route-list.component';\nimport { AddRouteComponent } from '../add-route/add-route.component';\nimport { LucideAngularModule, Search, X, Route, LoaderCircle } from 'lucide-angular';\n\n@Component({\n selector: 'lib-coolmap',\n standalone: true,\n imports: [\n JobCodeComponent,\n LucideAngularModule,\n JobRouteListComponent,\n ViewRouteListComponent,\n AddRouteComponent,\n ReactiveFormsModule,\n ],\n templateUrl: './coolmap.component.html',\n styleUrl: './coolmap.component.scss',\n})\nexport class CoolmapComponent implements OnInit, AfterViewInit, OnChanges {\n @Input() mobileMode: boolean = false;\n @Input() activeSection: 'Jobcode' | 'ViewRoute' = 'Jobcode';\n @Input() customerRepoDetails?: { customer: { id?: string, name?: string }, projectId: string };\n darkMode = input<boolean>(false);\n @ViewChild('mapContainer') mapContainer!: ElementRef;\n public coolmapService = inject(CoolmapService);\n utils = inject(UtilsService);\n config = inject(COOLMAP_CONFIG);\n mapService = inject(MapboxService);\n \n showRouteList = false;\n addRouteModal = false;\n \n // Filtering Signals (Lifted from JobCode)\n routesList = signal<CoolmapRoute[]>([]);\n viewRoutesList = signal<CoolmapRoute[]>([]);\n filters = signal<any[]>([]);\n filteredOptions = signal<any[]>([]);\n dropdownOpen = signal(false);\n dateValue = signal(this.utils.getDateFormat(new Date()));\n selectedRouteIds = signal<string[]>([]);\n modalPlottedIds = signal<string[]>([]);\n modalPlottedRoutes = signal<CoolmapRoute[]>([]);\n selectedRouteForEdit = signal<CoolmapRoute | null>(null);\n unitList = signal<any[]>([]);\n materialsList = signal<any[]>([]);\n private currentlyPlottedIds: string[] = [];\n private skipNextRefresh = false;\n private mapOpQueue: Promise<void> = Promise.resolve();\n\n activeFilteredRoutes = computed(() => {\n const list = this.activeSection === 'Jobcode' ? this.routesList() : this.viewRoutesList();\n const filtersArray = this.filters();\n if (filtersArray.length === 0) return list;\n return this.utils.getSearchResults(list, filtersArray) || [];\n });\n\n filterForm = new FormGroup({\n search: new FormControl('')\n });\n\n allSelected = computed(() => {\n const active = this.activeFilteredRoutes();\n const selected = this.selectedRouteIds();\n if (active.length === 0) return false;\n return active.every(r => selected.includes(this.getRouteId(r)));\n });\n\n modalAllSelected = computed(() => {\n return false;\n });\n\n masterStats = computed(() => {\n const routes = this.activeFilteredRoutes();\n const stats = { Done: 0, Incomplete: 0, Ongoing: 0, Open: 0 };\n \n routes.forEach(route => {\n const v = route?.values || {};\n stats.Done += (v.Done || 0);\n stats.Incomplete += (v.Incomplete || 0);\n stats.Ongoing += (v.Ongoing || 0);\n stats.Open += (v.Open || 0);\n });\n \n // Fallback default: if no routes, but we expect at least 1 \"Open\" slot behavior\n if (routes.length > 0 && stats.Done === 0 && stats.Ongoing === 0 && stats.Open === 0 && stats.Incomplete === 0) {\n stats.Open = routes.length;\n }\n \n return stats;\n });\n\n masterToggle() {\n if (this.allSelected()) {\n this.selectedRouteIds.set([]);\n } else {\n const ids = this.activeFilteredRoutes().map(r => this.getRouteId(r));\n this.selectedRouteIds.set(ids);\n }\n }\n\n modalMasterToggle(modalRoutes: CoolmapRoute[]) {\n const currentPlotted = this.modalPlottedRoutes();\n const isAllPlotted = modalRoutes.every(r => currentPlotted.some(p => this.getRouteId(p) === this.getRouteId(r)));\n\n if (isAllPlotted) {\n // Unplot all routes in this modal's view\n const modalIdsInView = modalRoutes.map(r => this.getRouteId(r));\n this.modalPlottedRoutes.update(curr => curr.filter(r => !modalIdsInView.includes(this.getRouteId(r))));\n } else {\n // Plot all routes in this modal's view (prevent duplicates)\n this.modalPlottedRoutes.update(curr => {\n const newRoutes = modalRoutes.filter(mr => !curr.some(c => this.getRouteId(c) === this.getRouteId(mr)));\n return [...curr, ...newRoutes];\n });\n }\n \n this.modalPlottedIds.set(this.modalPlottedRoutes().map(r => this.getRouteId(r)));\n }\n\n icons = {\n Route,\n Search,\n X,\n LoaderCircle\n };\n\n constructor() {\n this.filterForm.get('search')?.valueChanges.pipe(\n takeUntilDestroyed()\n ).subscribe(value => {\n if (value && typeof value === 'string') {\n const options = this.utils.filter(value, this.filters());\n this.filteredOptions.set(options);\n this.dropdownOpen.set(options.length > 0);\n } else {\n this.filteredOptions.set([]);\n this.dropdownOpen.set(false);\n }\n });\n\n effect(() => {\n const isDark = this.darkMode();\n this.mapService.updateTheme(isDark);\n });\n\n // Effect 1: Manage Floating List (JobCode)\n effect(async () => {\n const routes = this.activeFilteredRoutes();\n const selectedIds = this.selectedRouteIds();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('jobcode', routes, selectedIds)\n );\n });\n\n // Effect 2: Manage Modal List (JobRouteList)\n effect(async () => {\n const modalRoutes = this.modalPlottedRoutes();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('jobrouteList', modalRoutes, modalRoutes.map(r => this.getRouteId(r)))\n );\n });\n\n // Effect 3: Manage View Route Section\n effect(async () => {\n if (this.activeSection === 'ViewRoute') {\n const routes = this.activeFilteredRoutes();\n const selectedIds = this.selectedRouteIds();\n \n // Queue the sync operation\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('viewroute', routes, selectedIds)\n );\n } else {\n // Clear viewroute prefix if not in the section\n this.mapOpQueue = this.mapOpQueue.then(() => \n this.syncSpecificPrefix('viewroute', [], [])\n );\n }\n });\n }\n\n ngOnInit() {\n this.loadData(this.dateValue());\n }\n\n getUnitList() {\n this.utils.getData('unit/all').subscribe((res: any) => {\n if (res && res.data) {\n this.unitList.set(res.data);\n }\n });\n }\n\n getMaterialsList() {\n this.utils.getData('material/all').subscribe((res: any) => {\n if (res && res.data) {\n this.materialsList.set(res.data);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['customerRepoDetails'] && !changes['customerRepoDetails'].firstChange) {\n if (this.config.repository === 'customer') {\n if (this.activeSection === 'Jobcode') {\n this.loadData(this.dateValue());\n } else {\n this.loadViewRoutes();\n }\n }\n }\n if (changes['activeSection'] && !changes['activeSection'].firstChange) {\n this.selectedRouteIds.set([]);\n this.filters.set([]);\n if (this.activeSection === 'Jobcode') {\n this.loadData(this.dateValue());\n } else {\n this.loadViewRoutes();\n }\n }\n }\n\n loadData(value: string, isRefresh = false) {\n this.dateValue.set(value);\n this.coolmapService.isLoading.set(true);\n \n // Clear selection when the base list changes (date/repo switch)\n if (!isRefresh) {\n this.selectedRouteIds.set([]);\n }\n\n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((unitsRes: any) => {\n this.unitList.set(unitsRes);\n this.utils.fetchMaterialsListForCustomer().then((matRes: any) => {\n this.materialsList.set(matRes);\n this.executeJobReportFetch(value);\n });\n });\n } else {\n this.executeJobReportFetch(value);\n }\n }\n\n private executeJobReportFetch(value: string) {\n let dataSet: any;\n if (this.config.repository === 'customer') {\n const custId = this.customerRepoDetails?.customer?.id || '';\n const projId = this.customerRepoDetails?.projectId || '';\n dataSet = { date: value, customer_id: custId, project_id: projId };\n } else {\n dataSet = { date: value };\n }\n\n this.utils.postdata('jobs_report_v2', dataSet).subscribe({\n next: (res: any) => {\n if (res && res.data && typeof res.data !== 'string') {\n const list = res.data.map((ele: CoolmapRoute) => {\n (ele as any).date = value;\n if (this.config.repository === 'customer') {\n ele.unit = this.getUnitName(ele);\n (ele as any).material = this.getMaterialName(ele).split('|')[0].trim();\n }\n this.utils.makeOptions(ele);\n return ele;\n });\n this.routesList.set(list);\n } else {\n this.routesList.set([]);\n }\n this.coolmapService.isLoading.set(false);\n },\n error: () => {\n this.routesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n }\n\n loadViewRoutes(isRefresh = false) {\n this.coolmapService.isLoading.set(true);\n if (!isRefresh) {\n this.selectedRouteIds.set([]);\n }\n \n if (this.config.repository === 'customer') {\n this.utils.fetchUnitsList().then((unitsRes: any) => {\n this.unitList.set(unitsRes);\n this.utils.fetchMaterialsListForCustomer().then((matRes: any) => {\n this.materialsList.set(matRes);\n this.executeViewRoutesFetch();\n });\n });\n } else {\n this.executeViewRoutesFetch();\n }\n }\n\n private executeViewRoutesFetch() {\n if (this.config.repository === 'customer') {\n const dataSet = { customer_id: this.customerRepoDetails?.customer?.id || '' };\n this.utils.postdata('routes/all', dataSet).subscribe({\n next: (res: any) => {\n this.handleViewRoutesResponse(res);\n },\n error: () => {\n this.viewRoutesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n } else {\n this.utils.getData('routes/all').subscribe({\n next: (res: any) => {\n this.handleViewRoutesResponse(res);\n },\n error: () => {\n this.viewRoutesList.set([]);\n this.coolmapService.isLoading.set(false);\n }\n });\n }\n }\n\n private handleViewRoutesResponse(res: any) {\n if (res && res.data && Array.isArray(res.data)) {\n const list = res.data.map((ele: CoolmapRoute) => {\n if (this.config.repository === 'customer') {\n ele.unit = this.getUnitName(ele);\n (ele as any).material = this.getMaterialName(ele).split('|')[0].trim();\n }\n this.utils.makeOptions(ele);\n return ele;\n });\n this.viewRoutesList.set(list);\n } else {\n this.viewRoutesList.set([]);\n }\n this.coolmapService.isLoading.set(false);\n }\n\n getUnitName(data: any): string {\n let unitName = '';\n this.unitList().forEach((res) => {\n if (res.id === data.unit_id) {\n unitName = res.type;\n }\n });\n return unitName || data.unit;\n }\n\n getMaterialName(data: any): string {\n let materialName = '';\n this.materialsList().forEach((res) => {\n if (res.id === data.material_id) {\n materialName = res.name;\n }\n });\n return materialName || data.material || '';\n }\n\n onDateChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (target && target.value) {\n this.loadData(target.value);\n }\n }\n\n selectFilter(option: any) {\n this.filterForm.controls['search'].setValue('');\n this.selectedRouteIds.set([]); // Clear selection when switching filters\n this.filters.set([\n { name: option.label, type: option.type, value: option }\n ]);\n this.dropdownOpen.set(false);\n }\n\n removeFilter(filter: any) {\n this.filters.update(curr => curr.filter(f => f !== filter));\n }\n\n /**\n * Performs an isolated, diff-based synchronization for a specific route type.\n * This ensures that 'jobcode' and 'jobrouteList' updates never interfere.\n */\n async syncSpecificPrefix(prefix: string, sourceRoutes: CoolmapRoute[], selectedIds: string[]) {\n // 1. Identify desired state for THIS prefix only\n const desiredIds = new Set(sourceRoutes.map(r => `${prefix}-${this.getRouteId(r)}`));\n \n // 2. Get current state for THIS prefix only from map service\n const currentPlottedIds = this.mapService.getRegistryKeys().filter(k => k.startsWith(`${prefix}-`));\n\n // 3. Diff: Identify what to remove and what to add for THIS prefix\n const toRemove = currentPlottedIds.filter(id => !desiredIds.has(id));\n const toAdd = Array.from(desiredIds).filter(id => !currentPlottedIds.includes(id));\n\n // 4. Perform removals for THIS prefix\n for (const regId of toRemove) {\n const id = regId.substring(prefix.length + 1);\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.add(regId);\n return n;\n });\n try {\n await this.mapService.removeRouteAndMarker(id, prefix);\n } finally {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.delete(regId);\n return n;\n });\n }\n }\n\n // 5. Perform additions for THIS prefix\n if (toAdd.length > 0) {\n this.coolmapService.isLoading.set(true);\n for (const regId of toAdd) {\n const id = regId.substring(prefix.length + 1);\n const routeObj = sourceRoutes.find(r => this.getRouteId(r) === id);\n if (routeObj) {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.add(regId);\n return n;\n });\n try {\n await this.mapService.plotRoute(routeObj, id, prefix, false, false);\n } finally {\n this.coolmapService.plottingIds.update(set => {\n const n = new Set(set);\n n.delete(regId);\n return n;\n });\n }\n }\n }\n }\n\n // 6. Update Visibility for THIS prefix only\n // This allows jobcode and jobrouteList to have independent visibility states.\n const compositeVisible = selectedIds.map(id => `${prefix}-${id}`);\n const showAllForThisPrefix = (prefix === 'jobcode' && selectedIds.length === 0);\n \n this.mapService.setRoutesVisibility(compositeVisible, showAllForThisPrefix, prefix);\n this.coolmapService.isLoading.set(false);\n }\n\n toggleSelection(id: string) {\n this.selectedRouteIds.update(ids => {\n if (ids.includes(id)) {\n return ids.filter(i => i !== id);\n } else {\n return [...ids, id];\n }\n });\n }\n\n toggleModalRoute(route: CoolmapRoute) {\n const id = this.getRouteId(route);\n if (!id) return;\n\n this.modalPlottedRoutes.update(routes => {\n const isPlotted = routes.some(r => this.getRouteId(r) === id);\n if (isPlotted) {\n return routes.filter(r => this.getRouteId(r) !== id);\n } else {\n return [...routes, route];\n }\n });\n \n // Also update IDs for UI checkboxes\n this.modalPlottedIds.set(this.modalPlottedRoutes().map(r => this.getRouteId(r)));\n }\n\n async onAddRouteModalChange(isOpen: boolean) {\n this.addRouteModal = isOpen;\n if (!isOpen) {\n if (this.skipNextRefresh) {\n this.skipNextRefresh = false;\n return;\n }\n // Modal closed - restore map state and refresh data\n await this.refreshMapState();\n }\n }\n\n async refreshMapState() {\n if (this.activeSection === 'Jobcode') {\n await this.loadData(this.dateValue(), true);\n } else {\n await this.loadViewRoutes(true);\n }\n }\n\n onRouteSaved(data: any) {\n if (data.id) {\n // It was an update - surgical local update\n this.skipNextRefresh = true;\n const updater = (list: CoolmapRoute[]) => list.map(r => this.getRouteId(r) === data.id ? { ...r, ...data } : r);\n this.routesList.update(updater);\n this.viewRoutesList.update(updater);\n } else {\n // It was an add - need a re-fetch to get new ID from server\n this.skipNextRefresh = false; // explicitly allow refresh on add to get new ID\n }\n }\n\n onRouteDeleted(id: string) {\n this.skipNextRefresh = true;\n \n // 1. Remove from local signals\n this.routesList.update(list => list.filter(r => this.getRouteId(r) !== id));\n this.viewRoutesList.update(list => list.filter(r => this.getRouteId(r) !== id));\n \n // 2. Clear from selections\n this.selectedRouteIds.update(ids => ids.filter(i => i !== id));\n this.modalPlottedIds.update(ids => ids.filter(i => i !== id));\n this.modalPlottedRoutes.update(routes => routes.filter(r => this.getRouteId(r) !== id));\n\n // 3. Cleanup Map\n this.mapService.removeRouteAndMarker(id, 'jobcode');\n this.mapService.removeRouteAndMarker(id, 'jobrouteList');\n this.mapService.removeRouteAndMarker(id, 'viewroute');\n\n // 4. Update Filter Pills\n this.filters.update(curr => curr.filter(f => {\n if (f.type === 'job') {\n return f.value.job_id !== id;\n }\n return true;\n }));\n\n // 5. Refresh Search Suggestions (Options list in Utils)\n this.utils.clearOptions();\n [...this.routesList(), ...this.viewRoutesList()].forEach(r => this.utils.makeOptions(r));\n }\n\n openAddRouteModal() {\n this.selectedRouteForEdit.set(null);\n this.addRouteModal = true;\n }\n\n openEditModal(route: CoolmapRoute) {\n this.selectedRouteForEdit.set(route);\n this.addRouteModal = true;\n }\n\n getRouteId(route: CoolmapRoute): string {\n return route.job_id || route.route_id || (route as any).route_details_id || '';\n }\n\n clearSelection() {\n this.selectedRouteIds.set([]);\n }\n\n ngAfterViewInit() {\n setTimeout(() => {\n this.mapService.initializeMap(this.mapContainer.nativeElement, this.darkMode());\n\n setTimeout(() => {\n this.mapService.resize();\n }, 200);\n }, 0);\n }\n}\n","<div class=\"center-area\">\n <div [formGroup]=\"filterForm\" class=\"toolbar flex flex-col sm:flex-row md:h-[55px] h-auto py-2 px-2 gap-3 items-center\">\n <div class=\"toolbar-left flex items-center gap-3\">\n @if (activeSection === 'Jobcode') {\n <input\n type=\"date\"\n [value]=\"dateValue()\"\n (change)=\"onDateChange($event)\"\n [disabled]=\"coolmapService.isLoading()\"\n class=\"w-auto lg:w-[200px] px-3 py-2 rounded-lg border border-gray-200 dark:border-slate-600 bg-white dark:bg-slate-700 text-gray-900 dark:text-white focus:ring-2 focus:ring-brand-blue focus:border-transparent text-sm disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n <span class=\"toolbar-divider hidden sm:flex h-6 w-[1px] bg-gray-200 dark:bg-slate-700\"></span>\n }\n <div class=\"relative items-center flex\">\n <lucide-icon [img]=\"icons.Search\" [size]=\"18\" class=\"absolute left-3 top-1/2 -translate-y-1/2 text-gray-400\"></lucide-icon>\n <input\n type=\"text\"\n formControlName=\"search\"\n [attr.disabled]=\"coolmapService.isLoading() ? true : null\"\n placeholder=\"Search routes...\"\n class=\"w-[150px] xl:w-[300px] pl-10 pr-10 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-amber-500 focus:border-transparent text-sm disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n\n @if (filterForm.value.search) {\n <button (click)=\"filterForm.controls.search.setValue('')\" class=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\">\n <lucide-icon [img]=\"icons.X\" [size]=\"16\"></lucide-icon>\n </button>\n }\n\n <!-- Autocomplete Dropdown -->\n @if (dropdownOpen() && filteredOptions().length > 0) {\n <div class=\"absolute z-50 left-0 right-0 top-full mt-1 max-h-60 overflow-y-auto bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-600 rounded shadow-lg\">\n @for (option of filteredOptions(); track option.value + option.type) {\n <div (click)=\"selectFilter(option)\" class=\"px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-700 cursor-pointer text-sm font-medium border-b border-gray-100 dark:border-slate-700 last:border-0 dark:text-white\">\n <span class=\"capitalize text-xs text-gray-500 dark:text-gray-400 font-normal mr-1\">{{ option.type }}:</span>\n {{ option.label }}\n </div>\n }\n </div>\n }\n </div>\n\n @if (filters().length > 0) {\n <div class=\"flex flex-wrap gap-2 ml-2\">\n @for (filter of filters(); track filter.value + filter.type) {\n <div class=\"inline-flex items-center gap-1 px-2 py-1 rounded bg-slate-200 dark:bg-slate-700 text-gray-800 dark:text-gray-200 text-xs font-medium border border-gray-300 dark:border-slate-600\">\n <span class=\"capitalize opacity-80\">{{ filter.type }}:</span> {{ filter.name }}\n <button type=\"button\" (click)=\"removeFilter(filter)\" class=\"hover:opacity-75 transition-opacity ml-1\">\n <lucide-icon [img]=\"icons.X\" [size]=\"12\"></lucide-icon>\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"toolbar-right\">\n @if (selectedRouteIds().length > 0) {\n <button\n type=\"button\"\n (click)=\"clearSelection()\"\n [disabled]=\"coolmapService.isLoading()\"\n class=\"inline-flex items-center justify-center gap-2 px-5 sm:px-6 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors text-xs md:text-sm\"\n >\n Show All ({{ selectedRouteIds().length }})\n </button>\n }\n @if (activeSection === 'ViewRoute') {\n <button\n type=\"button\"\n class=\"inline-flex items-center justify-center gap-2 px-5 sm:px-6 py-2 bg-amber-500 hover:bg-amber-600 disabled:opacity-50 disabled:cursor-not-allowed text-white font-medium rounded-lg transition-colors text-xs md:text-sm\"\n [disabled]=\"coolmapService.isLoading()\"\n (click)=\"openAddRouteModal()\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n Add Route\n </button>\n }\n\n @if(activeSection === 'Jobcode'){\n <button\n class=\"inline-flex items-center gap-2 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed relative group\"\n (click)=\"showRouteList = true\"\n [disabled]=\"coolmapService.isLoading()\">\n <lucide-icon [img]=\"icons.Route\" [size]=\"20\"></lucide-icon>\n <div\n class=\"absolute top-full left-1/2 -translate-x-1/2 mt-2 hidden group-hover:block bg-gray-800 text-white text-[10px] rounded py-1 px-2 whitespace-nowrap\">\n Show Route List\n <div\n class=\"absolute -top-[8px] left-1/2 -translate-x-1/2 border-4 border-transparent border-b-gray-800\">\n </div>\n </div>\n </button>}\n </div>\n </div>\n <div class=\"view-content\">\n <div class=\"full-view\">\n <div class=\"map-container\">\n <div class=\"mapbox-container\" #mapContainer></div>\n </div>\n </div>\n\n <!-- FOR JOBCODE -->\n @if (activeSection === 'Jobcode') {\n <lib-job-code \n listMode=\"floating\" \n [routes]=\"activeFilteredRoutes()\"\n [selectedRouteIds]=\"selectedRouteIds()\"\n [isLoading]=\"coolmapService.isLoading()\"\n (routeSelect)=\"toggleSelection($event)\">\n </lib-job-code>\n }\n\n <!-- FOR VIEWROUTE -->\n @if (activeSection === 'ViewRoute') {\n <lib-view-route-list \n listMode=\"floating\" \n [routes]=\"activeFilteredRoutes()\"\n [selectedRouteIds]=\"selectedRouteIds()\"\n (routeSelect)=\"toggleSelection($event)\"\n (editRoute)=\"openEditModal($event)\"\n ></lib-view-route-list>\n }\n </div>\n @if (config.repository === 'coolmap') {\n <div class=\"status-bar\">\n <div class=\"stats-row\">\n <div class=\"stat-item active\" title=\"Active routes (assigned + in progress)\">\n <span class=\"stat-count\">{{ masterStats().Done }}</span>\n <span class=\"stat-label\">Done</span>\n </div>\n\n <div class=\"stat-item completed\" title=\"Completed tasks\">\n <span class=\"stat-count\">{{ masterStats().Incomplete }}</span>\n <span class=\"stat-label\">Incomplete</span>\n </div>\n\n <div class=\"stat-item declined\" title=\"Declined routes - needs attention\">\n <span class=\"stat-count\">{{ masterStats().Ongoing }}</span>\n <span class=\"stat-label\">Ongoing</span>\n </div>\n\n <div class=\"stat-item scheduled\" title=\"Scheduled jobs for today\">\n <span class=\"stat-count\">{{ masterStats().Open }}</span>\n <span class=\"stat-label\">Open</span>\n </div>\n </div>\n </div>\n }\n</div>\n<lib-job-route-list \n [initialRoutes]=\"viewRoutesList()\"\n [(modalOpen)]=\"showRouteList\"\n [selectedRouteIds]=\"modalPlottedIds()\"\n (routeSelect)=\"toggleModalRoute($event)\"\n (masterToggleEvent)=\"modalMasterToggle($event)\"\n [customerRepoDetails]=\"customerRepoDetails\"\n></lib-job-route-list>\n<lib-add-route \n [modalOpen]=\"addRouteModal\"\n (modalOpenChange)=\"onAddRouteModalChange($event)\"\n (routeSaved)=\"onRouteSaved($event)\"\n (routeDeleted)=\"onRouteDeleted($event)\"\n [customerRepoDetails]=\"customerRepoDetails\"\n [routeData]=\"selectedRouteForEdit()\"\n></lib-add-route>\n","/*\n * Public API Surface of coolmap\n */\n\nexport * from './lib/coolmap';\nexport * from './lib/components/coolmap/coolmap.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3"],"mappings":"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"}