{"id":35658,"date":"2024-01-25T10:45:07","date_gmt":"2024-01-25T03:45:07","guid":{"rendered":"https:\/\/www.sakon-pao.go.th\/home\/?page_id=35658"},"modified":"2026-06-12T15:20:57","modified_gmt":"2026-06-12T08:20:57","slug":"led-car-service","status":"publish","type":"page","link":"https:\/\/www.sakon-pao.go.th\/home\/led-car-service\/","title":{"rendered":"\u0e01\u0e32\u0e23\u0e02\u0e2d\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c LED \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"35658\" class=\"elementor elementor-35658\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8fa95fc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8fa95fc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8a71616\" data-id=\"8a71616\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3981787 elementor-widget elementor-widget-spacer\" data-id=\"3981787\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-72eb7f7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"72eb7f7\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-05b3e99\" data-id=\"05b3e99\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-29abdab elementor-widget elementor-widget-heading\" data-id=\"29abdab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><i><\/i>  \u0e01\u0e32\u0e23\u0e02\u0e2d\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c LED \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-bd80841 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bd80841\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-3f9a3fe\" data-id=\"3f9a3fe\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-ca62c46\" data-id=\"ca62c46\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f4efd4e elementor-widget elementor-widget-image\" data-id=\"f4efd4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1431\" height=\"350\" src=\"https:\/\/www.sakon-pao.go.th\/home\/wp-content\/uploads\/2024\/01\/LED-CAR-SERVICE.png\" class=\"attachment-full size-full wp-image-35719\" alt=\"\" srcset=\"https:\/\/www.sakon-pao.go.th\/home\/wp-content\/uploads\/2024\/01\/LED-CAR-SERVICE.png 1431w, https:\/\/www.sakon-pao.go.th\/home\/wp-content\/uploads\/2024\/01\/LED-CAR-SERVICE-720x176.png 720w, https:\/\/www.sakon-pao.go.th\/home\/wp-content\/uploads\/2024\/01\/LED-CAR-SERVICE-1080x264.png 1080w, https:\/\/www.sakon-pao.go.th\/home\/wp-content\/uploads\/2024\/01\/LED-CAR-SERVICE-768x188.png 768w\" sizes=\"(max-width: 1431px) 100vw, 1431px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-f9272ab elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f9272ab\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-09da6a5\" data-id=\"09da6a5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7491a30 elementor-widget elementor-widget-spacer\" data-id=\"7491a30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-35fc66a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"35fc66a\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-0d5bff2\" data-id=\"0d5bff2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-44d451b elementor-widget elementor-widget-shortcode\" data-id=\"44d451b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><iframe src=\"https:\/\/forms.gle\/eSUpjGCyJfvKUvHQA\" width=\"640\" height=\"1654\" frameborder=\"0\" marginheight=\"0\" marginwidth=\"0\">\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14\u2026<\/iframe><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-32ae23f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"32ae23f\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-464bf77\" data-id=\"464bf77\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d5ec359 elementor-widget elementor-widget-spacer\" data-id=\"d5ec359\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-25231c2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"25231c2\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6f9f18b\" data-id=\"6f9f18b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8ee53b8 elementor-widget elementor-widget-shortcode\" data-id=\"8ee53b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><iframe src=\"https:\/\/calendar.google.com\/calendar\/embed?src=6b9aa8d3d39a5aa90d289ec0affddc29e35556d5c203b228bc4690a51f2bbabc%40group.calendar.google.com&ctz=Asia%2FBangkok\" style=\"border: 0\" width=\"800\" height=\"600\" frameborder=\"0\" scrolling=\"no\"><\/iframe><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8c40b28 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8c40b28\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b66f135\" data-id=\"b66f135\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9867299 elementor-widget elementor-widget-html\" data-id=\"9867299\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"th\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c\u0e08\u0e2d LED \u2014 \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23<\/title>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Sarabun:wght@300;400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.1\/dist\/chart.umd.min.js\"><\/script>\r\n\r\n<script>\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONFIG: \u0e27\u0e32\u0e07 URL \u0e08\u0e32\u0e01 Apps Script Deploy \u0e15\u0e23\u0e07\u0e19\u0e35\u0e49 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nconst APPS_SCRIPT_URL = \"https:\/\/script.google.com\/macros\/s\/AKfycbxmXLqZGP9xSB7FWe32zjrnQ80dobGi9-8Grbf6moY8nDWIKm5NgA4b1zRT-VDKko0u\/exec\";\r\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n<\/script>\r\n\r\n<style>\r\n*{box-sizing:border-box;margin:0;padding:0}\r\nbody{\r\n  font-family:'Sarabun',sans-serif;\r\n  background:#F0F4F8;\r\n  color:#1a2332;\r\n  min-height:100vh;\r\n}\r\n\r\n\/* \u2500\u2500 Header \u2500\u2500 *\/\r\n.page-header{\r\n  background:linear-gradient(135deg,#0D47A1 0%,#1565C0 60%,#1E88E5 100%);\r\n  padding:1.5rem 2rem;\r\n  display:flex;align-items:center;justify-content:space-between;\r\n  flex-wrap:wrap;gap:1rem;\r\n  box-shadow:0 4px 20px rgba(13,71,161,0.3);\r\n}\r\n.header-brand{display:flex;align-items:center;gap:1rem}\r\n.header-logo{\r\n  width:52px;height:52px;border-radius:50%;\r\n  background:rgba(255,255,255,0.15);\r\n  display:flex;align-items:center;justify-content:center;\r\n  font-size:24px;border:2px solid rgba(255,255,255,0.3);\r\n}\r\n.header-text h1{font-size:1.3rem;font-weight:600;color:#fff;line-height:1.2}\r\n.header-text p{font-size:0.85rem;color:rgba(255,255,255,0.75);margin-top:2px}\r\n.header-meta{text-align:right}\r\n.live-badge{\r\n  background:rgba(255,255,255,0.15);\r\n  border:1px solid rgba(255,255,255,0.3);\r\n  color:#fff;font-size:0.78rem;\r\n  padding:4px 12px;border-radius:20px;\r\n  display:inline-flex;align-items:center;gap:6px;\r\n}\r\n.live-dot{width:7px;height:7px;background:#4CAF50;border-radius:50%;animation:pulse 2s infinite}\r\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.4}}\r\n.updated-at{font-size:0.78rem;color:rgba(255,255,255,0.6);margin-top:6px}\r\n\r\n\/* \u2500\u2500 Content \u2500\u2500 *\/\r\n.container{max-width:1280px;margin:0 auto;padding:1.5rem}\r\n\r\n\/* \u2500\u2500 Filter bar \u2500\u2500 *\/\r\n.filter-bar{\r\n  background:#fff;border-radius:12px;\r\n  padding:1rem 1.25rem;margin-bottom:1.5rem;\r\n  box-shadow:0 2px 8px rgba(0,0,0,0.06);\r\n  display:flex;align-items:center;gap:0.75rem;\r\n  flex-wrap:wrap;\r\n}\r\n.filter-group{display:flex;align-items:center;gap:0.5rem;flex:1;min-width:160px}\r\n.filter-label{font-size:0.8rem;color:#78909C;font-weight:600;white-space:nowrap}\r\n.filter-select, .filter-input{\r\n  font-family:'Sarabun',sans-serif;\r\n  border:1px solid #E0E7EF;border-radius:8px;\r\n  padding:0.5rem 0.75rem;font-size:0.85rem;\r\n  background:#F8FAFC;color:#263238;\r\n  outline:none;transition:border-color 0.15s;\r\n  width:100%;\r\n}\r\n.filter-select:focus, .filter-input:focus{border-color:#1E88E5;background:#fff}\r\n.search-wrap{flex:2;min-width:220px;position:relative}\r\n.search-wrap .filter-input{padding-left:2.2rem}\r\n.search-icon{\r\n  position:absolute;left:0.7rem;top:50%;transform:translateY(-50%);\r\n  color:#90A4AE;font-size:0.9rem;pointer-events:none;\r\n}\r\n.btn-reset{\r\n  font-family:'Sarabun',sans-serif;font-size:0.8rem;font-weight:600;\r\n  color:#78909C;background:#F0F4F8;border:1px solid #E0E7EF;\r\n  border-radius:8px;padding:0.5rem 1rem;cursor:pointer;\r\n  transition:all 0.15s;white-space:nowrap;\r\n}\r\n.btn-reset:hover{background:#ECEFF1;color:#37474F}\r\n.result-count{\r\n  font-size:0.78rem;color:#90A4AE;white-space:nowrap;\r\n}\r\n.result-count b{color:#1565C0}\r\n\r\n\/* \u2500\u2500 Stat cards \u2500\u2500 *\/\r\n.stat-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));\r\n  gap:1rem;margin-bottom:1.5rem;\r\n}\r\n.stat-card{\r\n  background:#fff;border-radius:12px;\r\n  padding:1.25rem 1.5rem;\r\n  display:flex;align-items:center;gap:1rem;\r\n  box-shadow:0 2px 8px rgba(0,0,0,0.06);\r\n  border-left:4px solid #1E88E5;\r\n  transition:transform 0.2s,box-shadow 0.2s;\r\n}\r\n.stat-card:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(0,0,0,0.1)}\r\n.stat-card:nth-child(2){border-left-color:#00897B}\r\n.stat-card:nth-child(3){border-left-color:#F57C00}\r\n.stat-card:nth-child(4){border-left-color:#8E24AA}\r\n.stat-icon{\r\n  width:48px;height:48px;border-radius:10px;\r\n  display:flex;align-items:center;justify-content:center;\r\n  font-size:22px;flex-shrink:0;\r\n  background:#E3F2FD;\r\n}\r\n.stat-card:nth-child(2) .stat-icon{background:#E0F2F1}\r\n.stat-card:nth-child(3) .stat-icon{background:#FFF3E0}\r\n.stat-card:nth-child(4) .stat-icon{background:#F3E5F5}\r\n.stat-label{font-size:0.8rem;color:#78909C;font-weight:500;margin-bottom:3px}\r\n.stat-value{font-size:1.9rem;font-weight:700;color:#0D47A1;line-height:1}\r\n.stat-card:nth-child(2) .stat-value{color:#00695C}\r\n.stat-card:nth-child(3) .stat-value{color:#E65100}\r\n.stat-card:nth-child(4) .stat-value{color:#6A1B9A}\r\n.stat-sub{font-size:0.75rem;color:#90A4AE;margin-top:3px}\r\n\r\n\/* \u2500\u2500 Charts row \u2500\u2500 *\/\r\n.charts-row{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);\r\n  gap:1rem;margin-bottom:1.5rem;\r\n}\r\n@media(max-width:768px){.charts-row{grid-template-columns:1fr}}\r\n\r\n.card{\r\n  background:#fff;border-radius:12px;\r\n  padding:1.25rem 1.5rem;\r\n  box-shadow:0 2px 8px rgba(0,0,0,0.06);\r\n}\r\n.card-title{\r\n  font-size:0.9rem;font-weight:600;color:#37474F;\r\n  margin-bottom:1rem;display:flex;align-items:center;gap:8px;\r\n}\r\n.card-title span.dot{\r\n  width:10px;height:10px;border-radius:3px;\r\n  display:inline-block;background:#1E88E5;\r\n}\r\n\r\n\/* \u2500\u2500 Agency bars \u2500\u2500 *\/\r\n.agency-bar{display:flex;align-items:center;gap:8px;margin-bottom:10px}\r\n.agency-name{font-size:0.78rem;color:#546E7A;width:130px;flex-shrink:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:right}\r\n.bar-track{flex:1;background:#F0F4F8;border-radius:4px;height:22px;overflow:hidden}\r\n.bar-fill{\r\n  height:100%;border-radius:4px;\r\n  display:flex;align-items:center;padding-left:8px;\r\n  font-size:0.78rem;font-weight:600;color:#fff;\r\n  transition:width 0.8s ease;white-space:nowrap;\r\n}\r\n\r\n\/* \u2500\u2500 Table \u2500\u2500 *\/\r\n.table-wrap{overflow-x:auto;margin-top:0.5rem}\r\ntable.job-table{width:100%;border-collapse:collapse;font-size:0.83rem}\r\n.job-table th{\r\n  background:#F0F4F8;color:#546E7A;font-weight:600;\r\n  padding:10px 12px;text-align:left;white-space:nowrap;\r\n  border-bottom:2px solid #E0E7EF;font-size:0.78rem;\r\n}\r\n.job-table td{\r\n  padding:10px 12px;border-bottom:1px solid #F0F4F8;\r\n  color:#263238;vertical-align:top;\r\n}\r\n.job-table tr:last-child td{border-bottom:none}\r\n.job-table tr:hover td{background:#F8FAFC}\r\n.date-chip{\r\n  display:inline-block;font-size:0.72rem;font-weight:600;\r\n  padding:3px 9px;border-radius:6px;white-space:nowrap;\r\n  background:#E3F2FD;color:#1565C0;\r\n}\r\n.type-chip{\r\n  display:inline-block;font-size:0.7rem;padding:2px 8px;\r\n  border-radius:20px;white-space:nowrap;\r\n}\r\n.type-jangwad{background:#E3F2FD;color:#0D47A1}\r\n.type-obt{background:#E8F5E9;color:#2E7D32}\r\n.type-tessaban{background:#F3E5F5;color:#6A1B9A}\r\n.type-univ{background:#FFF3E0;color:#E65100}\r\n.type-other{background:#ECEFF1;color:#455A64}\r\n.status-done{\r\n  display:inline-block;font-size:0.7rem;padding:2px 8px;\r\n  border-radius:20px;background:#E8F5E9;color:#2E7D32;font-weight:600;\r\n}\r\n.status-pending{\r\n  display:inline-block;font-size:0.7rem;padding:2px 8px;\r\n  border-radius:20px;background:#FFF8E1;color:#F57F17;font-weight:600;\r\n}\r\n.truncate{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}\r\n\r\n\/* \u2500\u2500 Clickable cell \u2500\u2500 *\/\r\n.clickable-cell{\r\n  cursor:pointer;border-radius:6px;padding:2px 4px;margin:-2px -4px;\r\n  transition:background 0.12s;\r\n  display:flex;align-items:center;gap:6px;\r\n}\r\n.clickable-cell:hover{background:#E3F2FD}\r\n.clickable-cell .expand-icon{\r\n  font-size:0.65rem;color:#90A4AE;flex-shrink:0;opacity:0.7;\r\n}\r\n.clickable-cell:hover .expand-icon{color:#1565C0;opacity:1}\r\n.date-chip[title]{cursor:help}\r\n\r\n\/* \u2500\u2500 Modal popup \u2500\u2500 *\/\r\n.modal-overlay{\r\n  position:fixed;inset:0;background:rgba(13,30,50,0.45);\r\n  display:flex;align-items:center;justify-content:center;\r\n  z-index:1000;padding:1.25rem;\r\n  animation:fadeIn 0.15s ease;\r\n}\r\n@keyframes fadeIn{from{opacity:0}to{opacity:1}}\r\n.modal-box{\r\n  background:#fff;border-radius:14px;\r\n  max-width:520px;width:100%;max-height:80vh;\r\n  overflow-y:auto;\r\n  box-shadow:0 12px 40px rgba(0,0,0,0.25);\r\n  animation:slideUp 0.18s ease;\r\n}\r\n@keyframes slideUp{from{transform:translateY(12px);opacity:0}to{transform:translateY(0);opacity:1}}\r\n.modal-header{\r\n  display:flex;align-items:center;justify-content:space-between;\r\n  padding:1rem 1.25rem;border-bottom:1px solid #F0F4F8;\r\n  position:sticky;top:0;background:#fff;border-radius:14px 14px 0 0;\r\n}\r\n.modal-title{font-size:0.85rem;font-weight:600;color:#78909C;display:flex;align-items:center;gap:6px}\r\n.modal-close{\r\n  background:#F0F4F8;border:none;border-radius:50%;\r\n  width:30px;height:30px;font-size:1rem;color:#78909C;\r\n  cursor:pointer;display:flex;align-items:center;justify-content:center;\r\n  transition:background 0.12s,color 0.12s;flex-shrink:0;\r\n}\r\n.modal-close:hover{background:#FFEBEE;color:#E53935}\r\n.modal-body{padding:1.25rem;font-size:0.95rem;line-height:1.7;color:#263238}\r\n.modal-meta{\r\n  display:flex;flex-wrap:wrap;gap:8px;padding:0 1.25rem 1.25rem;\r\n}\r\n.modal-meta-chip{\r\n  font-size:0.75rem;padding:4px 10px;border-radius:8px;\r\n  background:#F0F4F8;color:#546E7A;\r\n}\r\n\r\n\/* \u2500\u2500 Empty state \u2500\u2500 *\/\r\n.empty-state{\r\n  text-align:center;padding:2.5rem 1rem;color:#90A4AE;\r\n}\r\n.empty-state .icon{font-size:2.2rem;margin-bottom:0.5rem}\r\n\r\n\/* \u2500\u2500 Loading \/ Error \u2500\u2500 *\/\r\n.loading-screen{\r\n  display:flex;flex-direction:column;align-items:center;justify-content:center;\r\n  min-height:60vh;gap:1rem;color:#78909C;\r\n}\r\n.spinner{\r\n  width:48px;height:48px;border:4px solid #E3F2FD;\r\n  border-top-color:#1E88E5;border-radius:50%;\r\n  animation:spin 0.9s linear infinite;\r\n}\r\n@keyframes spin{to{transform:rotate(360deg)}}\r\n.error-box{\r\n  background:#FFEBEE;border:1px solid #EF9A9A;\r\n  border-radius:10px;padding:1.5rem 2rem;\r\n  color:#B71C1C;max-width:500px;text-align:center;\r\n}\r\n.error-box h3{margin-bottom:0.5rem}\r\n.error-box code{font-size:0.8rem;background:#FFCDD2;padding:2px 6px;border-radius:4px}\r\n\r\n\/* \u2500\u2500 Demo mode banner \u2500\u2500 *\/\r\n.demo-banner{\r\n  background:#FFF8E1;border:1px solid #FFD54F;\r\n  border-radius:8px;padding:0.75rem 1.25rem;\r\n  margin-bottom:1rem;font-size:0.85rem;color:#F57F17;\r\n  display:flex;align-items:center;gap:8px;\r\n}\r\n\r\n\/* \u2500\u2500 Suspicious data warning banner \u2500\u2500 *\/\r\n.warn-banner{\r\n  background:#FFF3E0;border:1px solid #FFB74D;\r\n  border-radius:8px;padding:0.85rem 1.25rem;\r\n  margin-bottom:1rem;font-size:0.83rem;color:#5D4037;\r\n}\r\n.warn-title{font-weight:700;color:#E65100;margin-bottom:4px}\r\n.warn-desc{color:#795548;margin-bottom:6px}\r\n.warn-list{margin-left:1.25rem;color:#5D4037}\r\n.warn-list li{margin-bottom:2px}\r\n\r\n\/* \u2500\u2500 Subtle refresh overlay \u2500\u2500 *\/\r\n.refreshing{opacity:0.55;pointer-events:none;transition:opacity 0.2s}\r\n\r\n@media(max-width:640px){\r\n  .filter-bar{flex-direction:column;align-items:stretch}\r\n  .filter-group{min-width:0}\r\n  .agency-name{width:90px;font-size:0.72rem}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<header class=\"page-header\">\r\n  <div class=\"header-brand\">\r\n    <div class=\"header-logo\">\ud83d\ude8c<\/div>\r\n    <div class=\"header-text\">\r\n      <h1>\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c\u0e08\u0e2d LED<\/h1>\r\n      <p>\u0e2d\u0e07\u0e04\u0e4c\u0e01\u0e32\u0e23\u0e1a\u0e23\u0e34\u0e2b\u0e32\u0e23\u0e2a\u0e48\u0e27\u0e19\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23 \u00b7 \u0e1b\u0e35\u0e07\u0e1a\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13 2569<\/p>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"header-meta\">\r\n    <div class=\"live-badge\">\r\n      <span class=\"live-dot\"><\/span>\r\n      <span id=\"liveLabel\">\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14...<\/span>\r\n    <\/div>\r\n    <div class=\"updated-at\" id=\"updatedAt\"><\/div>\r\n  <\/div>\r\n<\/header>\r\n\r\n<div class=\"container\">\r\n  <div id=\"filterBar\"><\/div>\r\n  <div id=\"mainContent\">\r\n    <div class=\"loading-screen\" id=\"loadingScreen\">\r\n      <div class=\"spinner\"><\/div>\r\n      <div>\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e36\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e08\u0e32\u0e01 Google Sheets...<\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n\/\/ \u2500\u2500\u2500 Demo data (\u0e43\u0e0a\u0e49\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35 URL \u0e08\u0e23\u0e34\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e14\u0e36\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nconst DEMO_DATA = {\r\n  totalJobs: 29,\r\n  totalAgencies: 19,\r\n  peakMonth: \"\u0e21\u0e35.\u0e04. 2569\",\r\n  peakCount: 11,\r\n  updatedAt: \"\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 (Demo Mode)\",\r\n  availableYears: [2569, 2568],\r\n  typeOptions: [\"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",\"\u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\",\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19\",\"\u0e2a\u0e16\u0e32\u0e1a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32\",\"\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19\u0e23\u0e31\u0e10\",\"\u0e0a\u0e38\u0e21\u0e0a\u0e19\/\u0e28\u0e32\u0e2a\u0e19\u0e32\"],\r\n  appliedFilters: { year: \"all\", type: \"all\", q: \"\" },\r\n  monthlyData: [\r\n    {label:\"\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21 2568\",shortLabel:\"\u0e18.\u0e04. 2568\",count:1},\r\n    {label:\"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21 2569\",shortLabel:\"\u0e21.\u0e04. 2569\",count:3},\r\n    {label:\"\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c 2569\",shortLabel:\"\u0e01.\u0e1e. 2569\",count:5},\r\n    {label:\"\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21 2569\",shortLabel:\"\u0e21\u0e35.\u0e04. 2569\",count:11},\r\n    {label:\"\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",shortLabel:\"\u0e40\u0e21.\u0e22. 2569\",count:5},\r\n    {label:\"\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",shortLabel:\"\u0e1e.\u0e04. 2569\",count:4},\r\n  ],\r\n  agencyData: [\r\n    {name:\"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",count:5,type:\"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\"},\r\n    {name:\"\u0e2a\u0e33\u0e19\u0e31\u0e01\u0e1b\u0e25\u0e31\u0e14\u0e2f \u0e2d\u0e1a\u0e08.\",count:4,type:\"\u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\"},\r\n    {name:\"\u0e21.\u0e23\u0e32\u0e0a\u0e20\u0e31\u0e0f\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",count:4,type:\"\u0e2a\u0e16\u0e32\u0e1a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32\"},\r\n    {name:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",count:4,type:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\"},\r\n    {name:\"\u0e17\u0e15.\u0e1e\u0e31\u0e07\u0e42\u0e04\u0e19\",count:2,type:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19\"},\r\n    {name:\"\u0e17\u0e15.\u0e14\u0e07\u0e21\u0e30\u0e44\u0e1f\",count:1,type:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19\"},\r\n    {name:\"\u0e21.\u0e40\u0e01\u0e29\u0e15\u0e23\u0e28\u0e32\u0e2a\u0e15\u0e23\u0e4c\u0e2f\",count:1,type:\"\u0e2a\u0e16\u0e32\u0e1a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32\"},\r\n  ],\r\n  recentJobs: [\r\n    {startDate:\"23 \u0e1e.\u0e04. 2569\",startDateFull:\"23 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",endDate:\"23 \u0e1e.\u0e04. 2569\",endDateFull:\"23 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",agency:\"\u0e27\u0e31\u0e14\u0e1b\u0e48\u0e32\u0e19\u0e32\u0e04\u0e19\u0e34\u0e21\u0e34\u0e15\u0e15\u0e4c\",objective:\"\u0e2a\u0e21\u0e42\u0e20\u0e0a\u0e40\u0e08\u0e14\u0e35\u0e22\u0e4c\u0e27\u0e31\u0e14\u0e1b\u0e48\u0e32\u0e19\u0e32\u0e04\u0e19\u0e34\u0e21\u0e34\u0e15\u0e15\u0e4c \u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35 2569 \u0e1e\u0e34\u0e18\u0e35\u0e1a\u0e38\u0e0d\u0e43\u0e2b\u0e0d\u0e48\u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35\u0e02\u0e2d\u0e07\u0e27\u0e31\u0e14 \u0e40\u0e0a\u0e34\u0e0d\u0e23\u0e48\u0e27\u0e21\u0e07\u0e32\u0e19\u0e17\u0e33\u0e1a\u0e38\u0e0d\u0e15\u0e31\u0e01\u0e1a\u0e32\u0e15\u0e23\u0e41\u0e25\u0e30\u0e1f\u0e31\u0e07\u0e40\u0e17\u0e28\u0e19\u0e4c\",place:\"\u0e27\u0e31\u0e14\u0e1b\u0e48\u0e32\u0e19\u0e32\u0e04\u0e19\u0e34\u0e21\u0e34\u0e15\u0e15\u0e4c \u0e15\u0e33\u0e1a\u0e25\u0e18\u0e32\u0e15\u0e38\u0e40\u0e0a\u0e34\u0e07\u0e0a\u0e38\u0e21 \u0e2d\u0e33\u0e40\u0e20\u0e2d\u0e40\u0e21\u0e37\u0e2d\u0e07\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23 \u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",type:\"\u0e0a\u0e38\u0e21\u0e0a\u0e19\/\u0e28\u0e32\u0e2a\u0e19\u0e32\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n    {startDate:\"10 \u0e1e.\u0e04. 2569\",startDateFull:\"10 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",endDate:\"10 \u0e1e.\u0e04. 2569\",endDateFull:\"10 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",agency:\"\u0e01\u0e01\u0e17. \u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",objective:\"\u0e27\u0e34\u0e48\u0e07\u0e2d\u0e2d\u0e21\u0e1a\u0e38\u0e0d \u0e27\u0e31\u0e19\u0e27\u0e34\u0e2a\u0e32\u0e02\u0e1e\u0e38\u0e17\u0e18\u0e1a\u0e39\u0e0a\u0e32\u0e21\u0e07\u0e04\u0e25 \u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\u0e40\u0e21\u0e37\u0e2d\u0e07\u0e41\u0e2b\u0e48\u0e07\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e38\u0e02 \u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35 2569\",place:\"\u0e27\u0e31\u0e14\u0e1b\u0e48\u0e32\u0e2a\u0e38\u0e17\u0e18\u0e32\u0e27\u0e32\u0e2a \u0e15\u0e33\u0e1a\u0e25\u0e18\u0e32\u0e15\u0e38\u0e40\u0e0a\u0e34\u0e07\u0e0a\u0e38\u0e21 \u0e2d\u0e33\u0e40\u0e20\u0e2d\u0e40\u0e21\u0e37\u0e2d\u0e07\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",type:\"\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19\u0e23\u0e31\u0e10\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n    {startDate:\"08 \u0e1e.\u0e04. 2569\",startDateFull:\"8 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",endDate:\"08 \u0e1e.\u0e04. 2569\",endDateFull:\"8 \u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21 2569\",agency:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e15\u0e33\u0e1a\u0e25\u0e1e\u0e31\u0e07\u0e42\u0e04\u0e19\",objective:\"\u0e1b\u0e23\u0e30\u0e40\u0e1e\u0e13\u0e35\u0e1a\u0e38\u0e0d\u0e21\u0e2b\u0e32\u0e0a\u0e32\u0e15\u0e34\u0e41\u0e25\u0e30\u0e1a\u0e38\u0e0d\u0e1a\u0e31\u0e49\u0e07\u0e44\u0e1f\u0e1e\u0e31\u0e07\u0e42\u0e04\u0e19 \u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35 2569\",place:\"\u0e42\u0e14\u0e21\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e25\u0e32\u0e14\u0e2a\u0e14 \u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e15\u0e33\u0e1a\u0e25\u0e1e\u0e31\u0e07\u0e42\u0e04\u0e19\",type:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n    {startDate:\"30 \u0e40\u0e21.\u0e22. 2569\",startDateFull:\"30 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",endDate:\"30 \u0e40\u0e21.\u0e22. 2569\",endDateFull:\"30 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",agency:\"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",objective:\"\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21 Big Cleaning Day \u0e15\u0e32\u0e21\u0e19\u0e42\u0e22\u0e1a\u0e32\u0e22\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e30\u0e2d\u0e32\u0e14\",place:\"\u0e1a\u0e23\u0e34\u0e40\u0e27\u0e13\u0e2b\u0e49\u0e27\u0e22\u0e42\u0e21\u0e07 \u0e15\u0e33\u0e1a\u0e25\u0e18\u0e32\u0e15\u0e38\u0e40\u0e0a\u0e34\u0e07\u0e0a\u0e38\u0e21 \u0e2d\u0e33\u0e40\u0e20\u0e2d\u0e40\u0e21\u0e37\u0e2d\u0e07\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",type:\"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n    {startDate:\"12 \u0e40\u0e21.\u0e22. 2569\",startDateFull:\"12 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",endDate:\"12 \u0e40\u0e21.\u0e22. 2569\",endDateFull:\"12 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",agency:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",objective:\"\u0e21\u0e2b\u0e32\u0e2a\u0e07\u0e01\u0e23\u0e32\u0e19\u0e15\u0e4c \u0e16\u0e19\u0e19\u0e02\u0e49\u0e32\u0e27\u0e2e\u0e32\u0e07 \u0e16\u0e34\u0e48\u0e19\u0e44\u0e17\u0e2a\u0e01\u0e25 \u0e25\u0e30\u0e40\u0e1a\u0e4b\u0e2d 2569\",place:\"\u0e25\u0e32\u0e19\u0e1e\u0e23\u0e30\u0e1a\u0e23\u0e21\u0e23\u0e32\u0e0a\u0e32\u0e19\u0e38\u0e2a\u0e32\u0e27\u0e23\u0e35\u0e22\u0e4c \u0e23.5 \u0e2d\u0e33\u0e40\u0e20\u0e2d\u0e40\u0e21\u0e37\u0e2d\u0e07\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",type:\"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n    {startDate:\"10 \u0e40\u0e21.\u0e22. 2569\",startDateFull:\"10 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",endDate:\"10 \u0e40\u0e21.\u0e22. 2569\",endDateFull:\"10 \u0e40\u0e21\u0e29\u0e32\u0e22\u0e19 2569\",agency:\"\u0e2a\u0e33\u0e19\u0e31\u0e01\u0e1b\u0e25\u0e31\u0e14\u0e2f \u0e2d\u0e1a\u0e08.\",objective:\"\u0e07\u0e32\u0e19\u0e27\u0e31\u0e19\u0e2a\u0e07\u0e01\u0e23\u0e32\u0e19\u0e15\u0e4c \u0e1b\u0e23\u0e30\u0e08\u0e33\u0e1b\u0e35 2569 \u0e02\u0e2d\u0e07 \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",place:\"\u0e2b\u0e19\u0e49\u0e32\u0e2d\u0e32\u0e04\u0e32\u0e23\u0e2a\u0e33\u0e19\u0e31\u0e01\u0e07\u0e32\u0e19 \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",type:\"\u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\",status:\"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\",days:1},\r\n  ]\r\n};\r\n\r\nconst BAR_COLORS = [\"#1E88E5\",\"#00897B\",\"#F57C00\",\"#8E24AA\",\"#E53935\",\"#3949AB\",\"#00ACC1\",\"#7CB342\",\"#5D4037\",\"#546E7A\"];\r\nconst TYPE_CLASS = {\r\n  \"\u0e08\u0e31\u0e07\u0e2b\u0e27\u0e31\u0e14\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\":\"type-jangwad\",\r\n  \"\u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23\":\"type-obt\",\r\n  \"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e19\u0e04\u0e23\":\"type-tessaban\",\r\n  \"\u0e40\u0e17\u0e28\u0e1a\u0e32\u0e25\u0e17\u0e49\u0e2d\u0e07\u0e16\u0e34\u0e48\u0e19\":\"type-tessaban\",\r\n  \"\u0e2a\u0e16\u0e32\u0e1a\u0e31\u0e19\u0e01\u0e32\u0e23\u0e28\u0e36\u0e01\u0e29\u0e32\":\"type-univ\",\r\n  \"\u0e2a\u0e16\u0e32\u0e19\u0e28\u0e36\u0e01\u0e29\u0e32\":\"type-univ\",\r\n  \"\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19\u0e23\u0e31\u0e10\":\"type-jangwad\",\r\n  \"\u0e0a\u0e38\u0e21\u0e0a\u0e19\/\u0e28\u0e32\u0e2a\u0e19\u0e32\":\"type-other\",\r\n};\r\n\r\nlet trendChartInstance = null;\r\nlet state = { year: \"all\", type: \"all\", q: \"\" };\r\nlet debounceTimer = null;\r\nlet isFirstLoad = true;\r\nlet currentJobsData = []; \/\/ \u0e40\u0e01\u0e47\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 jobs \u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u0e44\u0e27\u0e49\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e40\u0e1b\u0e34\u0e14 modal\r\n\r\n\/\/ \u2500\u2500\u2500 Render filter bar (\u0e23\u0e35\u0e40\u0e1f\u0e23\u0e0a\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e40\u0e21\u0e37\u0e48\u0e2d options \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction renderFilterBar(data) {\r\n  const yearOptions = (data.availableYears || [])\r\n    .map(y => `<option value=\"${y}\" ${state.year == y ? \"selected\" : \"\"}>\u0e1b\u0e35 ${y}<\/option>`)\r\n    .join(\"\");\r\n  const typeOptionsHtml = (data.typeOptions || [])\r\n    .map(t => `<option value=\"${t}\" ${state.type === t ? \"selected\" : \"\"}>${t}<\/option>`)\r\n    .join(\"\");\r\n\r\n  document.getElementById(\"filterBar\").innerHTML = `\r\n    <div class=\"filter-bar\">\r\n      <div class=\"search-wrap\">\r\n        <span class=\"search-icon\">\ud83d\udd0d<\/span>\r\n        <input type=\"text\" class=\"filter-input\" id=\"searchInput\"\r\n               placeholder=\"\u0e04\u0e49\u0e19\u0e2b\u0e32\u0e0a\u0e37\u0e48\u0e2d\u0e07\u0e32\u0e19, \u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19, \u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48...\"\r\n               value=\"${escapeAttr(state.q)}\">\r\n      <\/div>\r\n      <div class=\"filter-group\">\r\n        <span class=\"filter-label\">\u0e1b\u0e35:<\/span>\r\n        <select class=\"filter-select\" id=\"yearSelect\">\r\n          <option value=\"all\" ${state.year === \"all\" ? \"selected\" : \"\"}>\u0e17\u0e38\u0e01\u0e1b\u0e35<\/option>\r\n          ${yearOptions}\r\n        <\/select>\r\n      <\/div>\r\n      <div class=\"filter-group\">\r\n        <span class=\"filter-label\">\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17:<\/span>\r\n        <select class=\"filter-select\" id=\"typeSelect\">\r\n          <option value=\"all\" ${state.type === \"all\" ? \"selected\" : \"\"}>\u0e17\u0e38\u0e01\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17<\/option>\r\n          ${typeOptionsHtml}\r\n        <\/select>\r\n      <\/div>\r\n      <button class=\"btn-reset\" id=\"resetBtn\">\u21ba \u0e25\u0e49\u0e32\u0e07\u0e15\u0e31\u0e27\u0e01\u0e23\u0e2d\u0e07<\/button>\r\n      <span class=\"result-count\" id=\"resultCount\"><\/span>\r\n    <\/div>\r\n  `;\r\n\r\n  document.getElementById(\"searchInput\").addEventListener(\"input\", (e) => {\r\n    state.q = e.target.value;\r\n    clearTimeout(debounceTimer);\r\n    debounceTimer = setTimeout(() => loadData(false), 400);\r\n  });\r\n  document.getElementById(\"yearSelect\").addEventListener(\"change\", (e) => {\r\n    state.year = e.target.value;\r\n    loadData(false);\r\n  });\r\n  document.getElementById(\"typeSelect\").addEventListener(\"change\", (e) => {\r\n    state.type = e.target.value;\r\n    loadData(false);\r\n  });\r\n  document.getElementById(\"resetBtn\").addEventListener(\"click\", () => {\r\n    state = { year: \"all\", type: \"all\", q: \"\" };\r\n    loadData(false);\r\n  });\r\n}\r\n\r\nfunction escapeAttr(s) {\r\n  return String(s).replace(\/\"\/g, \"&quot;\");\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 \u0e41\u0e2a\u0e14\u0e07\u0e04\u0e33\u0e40\u0e15\u0e37\u0e2d\u0e19\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1e\u0e1a\u0e41\u0e16\u0e27\u0e17\u0e35\u0e48\u0e1b\u0e35\u0e15\u0e48\u0e32\u0e07\u0e08\u0e32\u0e01\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2a\u0e48\u0e27\u0e19\u0e43\u0e2b\u0e0d\u0e48 (\u0e2d\u0e32\u0e08\u0e40\u0e1b\u0e47\u0e19\u0e41\u0e16\u0e27\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e01\u0e48\u0e32) \u2500\u2500\r\nfunction renderSuspiciousWarning(suspiciousRows) {\r\n  if (!suspiciousRows || suspiciousRows.length === 0) return \"\";\r\n  const items = suspiciousRows.map(r =>\r\n    `<li>\u0e41\u0e16\u0e27\u0e1b\u0e23\u0e30\u0e21\u0e32\u0e13\u0e17\u0e35\u0e48 <b>${r.rowNumber}<\/b> \u0e43\u0e19 Sheet \u2014 \u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19 \"${r.agency}\" \u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e34\u0e48\u0e21\u0e07\u0e32\u0e19 <b>${r.startDate}<\/b><\/li>`\r\n  ).join(\"\");\r\n  return `\r\n    <div class=\"warn-banner\">\r\n      <div class=\"warn-title\">\u26a0\ufe0f \u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25 ${suspiciousRows.length} \u0e41\u0e16\u0e27 \u0e17\u0e35\u0e48\u0e1b\u0e35\u0e15\u0e48\u0e32\u0e07\u0e08\u0e32\u0e01\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e2a\u0e48\u0e27\u0e19\u0e43\u0e2b\u0e0d\u0e48\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e21\u0e32\u0e01<\/div>\r\n      <div class=\"warn-desc\">\u0e2d\u0e32\u0e08\u0e40\u0e1b\u0e47\u0e19\u0e41\u0e16\u0e27\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e17\u0e35\u0e48\u0e2b\u0e25\u0e07\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e2d\u0e22\u0e39\u0e48 \u0e25\u0e2d\u0e07\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e41\u0e25\u0e30\u0e25\u0e1a\u0e43\u0e19 Google Sheets \u0e2b\u0e32\u0e01\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e08\u0e23\u0e34\u0e07:<\/div>\r\n      <ul class=\"warn-list\">${items}<\/ul>\r\n    <\/div>`;\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 Render main dashboard content \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction render(data, isDemo) {\r\n  const mc = document.getElementById(\"mainContent\");\r\n  document.getElementById(\"liveLabel\").textContent = isDemo ? \"Demo Mode\" : \"Live Data\";\r\n  document.getElementById(\"updatedAt\").textContent = data.updatedAt || \"\";\r\n\r\n  renderFilterBar(data);\r\n\r\n  const resultCount = document.getElementById(\"resultCount\");\r\n  if (resultCount) {\r\n    resultCount.innerHTML = `\u0e1e\u0e1a <b>${data.totalJobs}<\/b> \u0e07\u0e32\u0e19`;\r\n  }\r\n\r\n  const hasData = data.totalJobs > 0;\r\n\r\n  mc.innerHTML = `\r\n    ${isDemo ? `<div class=\"demo-banner\">\u26a0\ufe0f \u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e2a\u0e14\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 \u2014 \u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a Apps Script URL \u0e2b\u0e23\u0e37\u0e2d\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d<\/div>` : \"\"}\r\n    ${renderSuspiciousWarning(data.suspiciousRows)}\r\n\r\n    <div class=\"stat-grid\">\r\n      <div class=\"stat-card\">\r\n        <div class=\"stat-icon\">\ud83d\udccb<\/div>\r\n        <div class=\"stat-body\">\r\n          <div class=\"stat-label\">\u0e08\u0e33\u0e19\u0e27\u0e19\u0e07\u0e32\u0e19\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14<\/div>\r\n          <div class=\"stat-value\">${data.totalJobs}<\/div>\r\n          <div class=\"stat-sub\">\u0e04\u0e23\u0e31\u0e49\u0e07\u0e17\u0e35\u0e48\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23<\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"stat-card\">\r\n        <div class=\"stat-icon\">\ud83c\udfe2<\/div>\r\n        <div class=\"stat-body\">\r\n          <div class=\"stat-label\">\u0e08\u0e33\u0e19\u0e27\u0e19\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19<\/div>\r\n          <div class=\"stat-value\">${data.totalAgencies}<\/div>\r\n          <div class=\"stat-sub\">\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e02\u0e2d\u0e43\u0e0a\u0e49<\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"stat-card\">\r\n        <div class=\"stat-icon\">\ud83d\udcc8<\/div>\r\n        <div class=\"stat-body\">\r\n          <div class=\"stat-label\">\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e17\u0e35\u0e48\u0e22\u0e2d\u0e14\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14<\/div>\r\n          <div class=\"stat-value\" style=\"font-size:1.3rem;padding-top:3px\">${data.peakMonth}<\/div>\r\n          <div class=\"stat-sub\">${data.peakCount} \u0e07\u0e32\u0e19 \u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e43\u0e19\u0e0a\u0e48\u0e27\u0e07\u0e17\u0e35\u0e48\u0e40\u0e25\u0e37\u0e2d\u0e01<\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"stat-card\">\r\n        <div class=\"stat-icon\">\ud83d\ude8c<\/div>\r\n        <div class=\"stat-body\">\r\n          <div class=\"stat-label\">\u0e40\u0e09\u0e25\u0e35\u0e48\u0e22\u0e15\u0e48\u0e2d\u0e40\u0e14\u0e37\u0e2d\u0e19<\/div>\r\n          <div class=\"stat-value\">${data.monthlyData.length ? (data.totalJobs \/ data.monthlyData.length).toFixed(1) : \"0.0\"}<\/div>\r\n          <div class=\"stat-sub\">\u0e07\u0e32\u0e19\/\u0e40\u0e14\u0e37\u0e2d\u0e19<\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    ${hasData ? `\r\n    <div class=\"charts-row\">\r\n      <div class=\"card\">\r\n        <div class=\"card-title\"><span class=\"dot\"><\/span> \u0e08\u0e33\u0e19\u0e27\u0e19\u0e07\u0e32\u0e19\u0e23\u0e32\u0e22\u0e40\u0e14\u0e37\u0e2d\u0e19${data.appliedFilters.year !== \"all\" ? \" \u0e1b\u0e35 \" + data.appliedFilters.year : \"\"}<\/div>\r\n        <div style=\"position:relative;height:220px\">\r\n          <canvas id=\"trendChart\" role=\"img\" aria-label=\"\u0e01\u0e23\u0e32\u0e1f\u0e41\u0e17\u0e48\u0e07\u0e08\u0e33\u0e19\u0e27\u0e19\u0e07\u0e32\u0e19\u0e23\u0e32\u0e22\u0e40\u0e14\u0e37\u0e2d\u0e19\"><\/canvas>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"card\">\r\n        <div class=\"card-title\"><span class=\"dot\" style=\"background:#00897B\"><\/span> \u0e2d\u0e31\u0e19\u0e14\u0e31\u0e1a\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23<\/div>\r\n        <div id=\"agencyBars\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"card\">\r\n      <div class=\"card-title\"><span class=\"dot\" style=\"background:#8E24AA\"><\/span> \u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e07\u0e32\u0e19 (${data.totalJobs} \u0e23\u0e32\u0e22\u0e01\u0e32\u0e23)<\/div>\r\n      <div class=\"table-wrap\">\r\n        <table class=\"job-table\">\r\n          <thead>\r\n            <tr>\r\n              <th>\u0e27\u0e31\u0e19\u0e17\u0e35\u0e48\u0e40\u0e23\u0e34\u0e48\u0e21\u0e07\u0e32\u0e19<\/th>\r\n              <th>\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e07\u0e32\u0e19<\/th>\r\n              <th>\u0e27\u0e31\u0e15\u0e16\u0e38\u0e1b\u0e23\u0e30\u0e2a\u0e07\u0e04\u0e4c \/ \u0e0a\u0e37\u0e48\u0e2d\u0e07\u0e32\u0e19<\/th>\r\n              <th>\u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48<\/th>\r\n              <th>\u0e2a\u0e16\u0e32\u0e19\u0e30<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody id=\"jobRows\"><\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n    <\/div>\r\n    ` : `\r\n    <div class=\"card\">\r\n      <div class=\"empty-state\">\r\n        <div class=\"icon\">\ud83d\udd0d<\/div>\r\n        <div>\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a\u0e15\u0e31\u0e27\u0e01\u0e23\u0e2d\u0e07<\/div>\r\n        <div style=\"font-size:0.8rem;margin-top:4px\">\u0e25\u0e2d\u0e07\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e04\u0e33\u0e04\u0e49\u0e19\u0e2b\u0e32 \u0e2b\u0e23\u0e37\u0e2d\u0e01\u0e14 \"\u0e25\u0e49\u0e32\u0e07\u0e15\u0e31\u0e27\u0e01\u0e23\u0e2d\u0e07\"<\/div>\r\n      <\/div>\r\n    <\/div>\r\n    `}\r\n  `;\r\n\r\n  if (!hasData) return;\r\n\r\n  currentJobsData = data.recentJobs;\r\n\r\n  \/\/ Trend chart \u2014 \u0e43\u0e0a\u0e49\u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e41\u0e1a\u0e1a\u0e40\u0e15\u0e47\u0e21\u0e40\u0e1b\u0e47\u0e19 label, \u0e41\u0e1a\u0e1a\u0e22\u0e48\u0e2d\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a axis tick\r\n  const tLabels = data.monthlyData.map(m => m.label);\r\n  const tShortLabels = data.monthlyData.map(m => m.shortLabel || m.label);\r\n  const tData   = data.monthlyData.map(m => m.count);\r\n  const maxVal  = Math.max(...tData, 1);\r\n\r\n  if (trendChartInstance) trendChartInstance.destroy();\r\n  trendChartInstance = new Chart(document.getElementById(\"trendChart\"), {\r\n    type: \"bar\",\r\n    data: {\r\n      labels: tShortLabels,\r\n      datasets: [{\r\n        data: tData,\r\n        backgroundColor: tData.map(v => v === maxVal ? \"#0D47A1\" : \"#90CAF9\"),\r\n        borderRadius: 6,\r\n        borderSkipped: false,\r\n      }]\r\n    },\r\n    options: {\r\n      responsive: true, maintainAspectRatio: false,\r\n      plugins: {\r\n        legend: { display: false },\r\n        tooltip: {\r\n          callbacks: {\r\n            title: ctx => tLabels[ctx[0].dataIndex], \/\/ tooltip header = \u0e0a\u0e37\u0e48\u0e2d\u0e40\u0e14\u0e37\u0e2d\u0e19\u0e41\u0e1a\u0e1a\u0e40\u0e15\u0e47\u0e21\r\n            label: ctx => `${ctx.parsed.y} \u0e07\u0e32\u0e19`\r\n          }\r\n        }\r\n      },\r\n      scales: {\r\n        x: { grid: { display: false }, ticks: { font: { family: \"Sarabun\", size: 11 } } },\r\n        y: { beginAtZero: true, ticks: { stepSize: Math.max(1, Math.ceil(maxVal\/5)), font: { family: \"Sarabun\", size: 11 } },\r\n             grid: { color: \"rgba(0,0,0,0.04)\" } }\r\n      }\r\n    }\r\n  });\r\n\r\n  \/\/ Agency horizontal bars\r\n  const barContainer = document.getElementById(\"agencyBars\");\r\n  const maxCount = Math.max(...data.agencyData.map(a => a.count), 1);\r\n  data.agencyData.forEach((a, i) => {\r\n    const pct = Math.max(8, Math.round((a.count \/ maxCount) * 100));\r\n    const color = BAR_COLORS[i % BAR_COLORS.length];\r\n    const div = document.createElement(\"div\");\r\n    div.className = \"agency-bar\";\r\n    div.innerHTML = `\r\n      <span class=\"agency-name\" title=\"${a.name}\">${a.name}<\/span>\r\n      <div class=\"bar-track\">\r\n        <div class=\"bar-fill\" style=\"width:${pct}%;background:${color}\">${a.count}<\/div>\r\n      <\/div>`;\r\n    barContainer.appendChild(div);\r\n  });\r\n\r\n  \/\/ Jobs table\r\n  const tbody = document.getElementById(\"jobRows\");\r\n  data.recentJobs.forEach((job, idx) => {\r\n    const typeClass = TYPE_CLASS[job.type] || \"type-other\";\r\n    const statusClass = job.status === \"\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e41\u0e25\u0e49\u0e27\" ? \"status-done\" : \"status-pending\";\r\n    const tr = document.createElement(\"tr\");\r\n    tr.innerHTML = `\r\n      <td><span class=\"date-chip\" title=\"${escapeAttr(job.startDateFull || job.startDate)}\">${job.startDate}<\/span><\/td>\r\n      <td><span class=\"type-chip ${typeClass}\">${job.agency}<\/span><\/td>\r\n      <td>\r\n        <div class=\"clickable-cell\" data-job=\"${idx}\" data-field=\"objective\">\r\n          <span class=\"truncate\">${job.objective}<\/span>\r\n          <span class=\"expand-icon\">\u2922<\/span>\r\n        <\/div>\r\n      <\/td>\r\n      <td style=\"font-size:0.78rem;color:#78909C\">\r\n        <div class=\"clickable-cell\" data-job=\"${idx}\" data-field=\"place\">\r\n          <span class=\"truncate\">${job.place}<\/span>\r\n          <span class=\"expand-icon\">\u2922<\/span>\r\n        <\/div>\r\n      <\/td>\r\n      <td><span class=\"${statusClass}\">${job.status}<\/span><\/td>`;\r\n    tbody.appendChild(tr);\r\n  });\r\n\r\n  \/\/ \u0e1c\u0e39\u0e01 event \u0e43\u0e2b\u0e49\u0e40\u0e0b\u0e25\u0e25\u0e4c\u0e17\u0e35\u0e48\u0e04\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 \u0e40\u0e1b\u0e34\u0e14 modal\r\n  tbody.querySelectorAll(\".clickable-cell\").forEach(cell => {\r\n    cell.addEventListener(\"click\", () => {\r\n      const idx = parseInt(cell.getAttribute(\"data-job\"));\r\n      const field = cell.getAttribute(\"data-field\");\r\n      openJobModal(idx, field);\r\n    });\r\n  });\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 \u0e40\u0e1b\u0e34\u0e14 modal \u0e41\u0e2a\u0e14\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e40\u0e15\u0e47\u0e21 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction openJobModal(idx, field) {\r\n  const job = currentJobsData[idx];\r\n  if (!job) return;\r\n\r\n  const isObjective = field === \"objective\";\r\n  const titleLabel = isObjective ? \"\ud83d\udccb \u0e27\u0e31\u0e15\u0e16\u0e38\u0e1b\u0e23\u0e30\u0e2a\u0e07\u0e04\u0e4c \/ \u0e0a\u0e37\u0e48\u0e2d\u0e07\u0e32\u0e19\" : \"\ud83d\udccd \u0e2a\u0e16\u0e32\u0e19\u0e17\u0e35\u0e48\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\";\r\n  const bodyText = isObjective ? job.objective : job.place;\r\n\r\n  const typeClass = TYPE_CLASS[job.type] || \"type-other\";\r\n\r\n  let overlay = document.getElementById(\"jobModalOverlay\");\r\n  if (overlay) overlay.remove();\r\n\r\n  overlay = document.createElement(\"div\");\r\n  overlay.className = \"modal-overlay\";\r\n  overlay.id = \"jobModalOverlay\";\r\n  overlay.innerHTML = `\r\n    <div class=\"modal-box\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${titleLabel}\">\r\n      <div class=\"modal-header\">\r\n        <span class=\"modal-title\">${titleLabel}<\/span>\r\n        <button class=\"modal-close\" aria-label=\"\u0e1b\u0e34\u0e14\">\u2715<\/button>\r\n      <\/div>\r\n      <div class=\"modal-body\">${escapeHtml(bodyText)}<\/div>\r\n      <div class=\"modal-meta\">\r\n        <span class=\"modal-meta-chip\">\ud83d\uddd3\ufe0f ${job.startDateFull || job.startDate}${(job.endDateFull && job.endDateFull !== job.startDateFull) ? \" \u2013 \" + job.endDateFull : \"\"}<\/span>\r\n        <span class=\"modal-meta-chip type-chip ${typeClass}\" style=\"border-radius:8px\">${job.agency}<\/span>\r\n        <span class=\"modal-meta-chip\">\ud83d\udccc ${job.status}<\/span>\r\n      <\/div>\r\n    <\/div>`;\r\n\r\n  document.body.appendChild(overlay);\r\n\r\n  const close = () => overlay.remove();\r\n  overlay.querySelector(\".modal-close\").addEventListener(\"click\", close);\r\n  overlay.addEventListener(\"click\", (e) => { if (e.target === overlay) close(); });\r\n  document.addEventListener(\"keydown\", function escHandler(e) {\r\n    if (e.key === \"Escape\") { close(); document.removeEventListener(\"keydown\", escHandler); }\r\n  });\r\n}\r\n\r\nfunction escapeHtml(s) {\r\n  const div = document.createElement(\"div\");\r\n  div.textContent = String(s);\r\n  return div.innerHTML;\r\n}\r\n\r\nfunction showError(msg) {\r\n  document.getElementById(\"mainContent\").innerHTML = `\r\n    <div style=\"display:flex;justify-content:center;padding:3rem\">\r\n      <div class=\"error-box\">\r\n        <h3>\u26a0\ufe0f \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e14\u0e36\u0e07\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e44\u0e14\u0e49<\/h3>\r\n        <p style=\"margin:0.5rem 0\">${msg}<\/p>\r\n        <p style=\"margin-top:0.75rem;font-size:0.8rem\">\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a <code>APPS_SCRIPT_URL<\/code> \u0e41\u0e25\u0e30\u0e01\u0e32\u0e23 Deploy \u0e43\u0e19 Apps Script<\/p>\r\n      <\/div>\r\n    <\/div>`;\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 Load data from Apps Script (with filters) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nasync function loadData(initial) {\r\n  const container = document.getElementById(\"mainContent\");\r\n  if (!initial) container.classList.add(\"refreshing\");\r\n\r\n  if (!APPS_SCRIPT_URL || APPS_SCRIPT_URL === \"YOUR_APPS_SCRIPT_URL_HERE\") {\r\n    render(filterDemoData(DEMO_DATA), true);\r\n    container.classList.remove(\"refreshing\");\r\n    return;\r\n  }\r\n\r\n  try {\r\n    const qs = new URLSearchParams({\r\n      action: \"dashboard\",\r\n      year: state.year,\r\n      type: state.type,\r\n      q: state.q,\r\n    });\r\n    const res = await fetch(`${APPS_SCRIPT_URL}?${qs.toString()}`);\r\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n    const data = await res.json();\r\n    if (data.error) throw new Error(data.error);\r\n    render(data, false);\r\n  } catch (err) {\r\n    console.error(err);\r\n    if (isFirstLoad) {\r\n      \/\/ fall back to demo on first load if API unreachable\r\n      render(filterDemoData(DEMO_DATA), true);\r\n    } else {\r\n      showError(err.message);\r\n    }\r\n  } finally {\r\n    container.classList.remove(\"refreshing\");\r\n    isFirstLoad = false;\r\n  }\r\n}\r\n\r\n\/\/ \u2500\u2500\u2500 Client-side filter for demo data (\u0e40\u0e21\u0e37\u0e48\u0e2d API \u0e43\u0e0a\u0e49\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction filterDemoData(base) {\r\n  let jobs = base.recentJobs;\r\n  if (state.year !== \"all\") {\r\n    jobs = jobs.filter(j => j.startDate.indexOf(state.year) !== -1);\r\n  }\r\n  if (state.type !== \"all\") {\r\n    jobs = jobs.filter(j => j.type === state.type);\r\n  }\r\n  if (state.q) {\r\n    const q = state.q.toLowerCase();\r\n    jobs = jobs.filter(j =>\r\n      j.agency.toLowerCase().indexOf(q) !== -1 ||\r\n      j.objective.toLowerCase().indexOf(q) !== -1 ||\r\n      j.place.toLowerCase().indexOf(q) !== -1\r\n    );\r\n  }\r\n  return {\r\n    ...base,\r\n    totalJobs: jobs.length,\r\n    recentJobs: jobs,\r\n    appliedFilters: state,\r\n  };\r\n}\r\n\r\nloadData(true);\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u0e01\u0e32\u0e23\u0e02\u0e2d\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c &hellip;&nbsp;<a href=\"https:\/\/www.sakon-pao.go.th\/home\/led-car-service\/\" class=\"\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">\u0e01\u0e32\u0e23\u0e02\u0e2d\u0e43\u0e0a\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23\u0e23\u0e16\u0e1b\u0e23\u0e30\u0e0a\u0e32\u0e2a\u0e31\u0e21\u0e1e\u0e31\u0e19\u0e18\u0e4c LED \u0e2d\u0e1a\u0e08.\u0e2a\u0e01\u0e25\u0e19\u0e04\u0e23<\/span><\/a><\/p>\n","protected":false},"author":12,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/template-pagebuilder-full-width.php","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"off","neve_meta_content_width":100,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"class_list":["post-35658","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/pages\/35658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/comments?post=35658"}],"version-history":[{"count":76,"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/pages\/35658\/revisions"}],"predecessor-version":[{"id":78871,"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/pages\/35658\/revisions\/78871"}],"wp:attachment":[{"href":"https:\/\/www.sakon-pao.go.th\/home\/wp-json\/wp\/v2\/media?parent=35658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}