{"id":2511,"date":"2026-07-23T16:28:49","date_gmt":"2026-07-23T09:28:49","guid":{"rendered":"https:\/\/pandaigadai.com\/blog\/?page_id=2511"},"modified":"2026-07-23T16:30:16","modified_gmt":"2026-07-23T09:30:16","slug":"tiktok-branch-tracker","status":"publish","type":"page","link":"https:\/\/pandaigadai.com\/blog\/tiktok-branch-tracker\/","title":{"rendered":"Tiktok Branch Tracker"},"content":{"rendered":"<!DOCTYPE html>\r\n<html lang=\"id\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\r\n<title>Dashboard TikTok Cabang \u2014 Views & Engagement \u2014 Pandai Gadai<\/title>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Rubik:wght@400;500;600;700;800;900&display=swap\">\r\n<style>\r\n#pg-page *, #pg-page *::before, #pg-page *::after{box-sizing:border-box;margin:0;padding:0}\r\nhtml,body{margin:0;padding:0;background:#f0f2f8}\r\n#pg-page{\r\n  --radius:0.625rem;--background:#ffffff;--foreground:#021431;--card:#ffffff;\r\n  --primary:#02439F;--primary-deep:#011455;--primary-bright:#0255CA;--primary-foreground:#f8fafc;\r\n  --accent:#ffcd05;--accent-foreground:#021431;--secondary:#f3f5fb;--muted:#f0f2f8;\r\n  --muted-foreground:#6b7280;--destructive:#dc2626;--success:#047857;--border:#e2e6f0;\r\n  --footer-bg:#02439f;--shadow-card:0 2px 8px -2px rgba(2,20,49,0.08);\r\n  --shadow-elegant:0 10px 30px -12px rgba(2,67,159,0.35);\r\n  --gradient-hero:linear-gradient(135deg,#011455,#0255CA);\r\n}\r\n#pg-page{font-family:\"Rubik\",system-ui,-apple-system,\"Segoe UI\",sans-serif;background:var(--muted);color:var(--foreground);line-height:1.6;-webkit-font-smoothing:antialiased}\r\n#pg-page h1,#pg-page h2,#pg-page h3,#pg-page h4{letter-spacing:-0.02em}\r\n#pg-page p{margin:0}#pg-page a{text-decoration:none;color:inherit}#pg-page img{display:block;max-width:100%}\r\n#pg-page ul{list-style:none}#pg-page .section-container{max-width:78rem;margin:0 auto;padding:0 1rem}\r\n#pg-page .site-header{position:sticky;top:0;z-index:100;background:var(--background);border-bottom:1px solid var(--border)}\r\n#pg-page .header-inner{max-width:78rem;margin:0 auto;display:flex;height:5rem;align-items:center;justify-content:space-between;padding:0 1rem}\r\n#pg-page .header-nav{display:flex;align-items:center;gap:.75rem}\r\n#pg-page .btn-header{display:inline-flex;align-items:center;gap:.375rem;border-radius:calc(var(--radius) - 2px);background:var(--accent);padding:.5rem .875rem;font-size:.875rem;font-weight:700;color:var(--accent-foreground);box-shadow:0 1px 2px rgba(0,0,0,.05);transition:filter .15s}\r\n#pg-page .btn-header:hover{filter:brightness(.95)}\r\n#pg-page .dash-hero{background:var(--gradient-hero);color:var(--primary-foreground);position:relative;overflow:hidden}\r\n#pg-page .dash-hero-overlay{position:absolute;inset:0;opacity:.3;background:radial-gradient(ellipse at top right,rgba(255,205,5,.35),transparent 60%);pointer-events:none}\r\n#pg-page .dash-hero-inner{position:relative;max-width:78rem;margin:0 auto;padding:2rem 1rem 2.25rem}\r\n#pg-page .dash-hero .eyebrow{display:inline-flex;align-items:center;gap:.4rem;font-size:.7rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;background:rgba(255,255,255,.15);padding:.3rem .7rem;border-radius:999px}\r\n#pg-page .dash-hero h1{font-size:1.6rem;font-weight:800;margin:.7rem 0 .25rem}\r\n#pg-page .dash-hero p{font-size:.9rem;color:rgba(255,255,255,.85)}\r\n@media(min-width:768px){#pg-page .dash-hero h1{font-size:2rem}}\r\n#pg-page .dash-body{max-width:78rem;margin:0 auto;padding:1.25rem 1rem 2.5rem}\r\n#pg-page .controls{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;background:var(--card);border:1px solid var(--border);border-radius:calc(var(--radius)+4px);padding:.75rem .9rem;box-shadow:var(--shadow-card);margin-bottom:1rem}\r\n#pg-page .ctl-label{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted-foreground)}\r\n#pg-page .seg{display:inline-flex;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);overflow:hidden}\r\n#pg-page .seg button{padding:.4rem .85rem;border:none;background:var(--card);color:var(--foreground);font-family:inherit;font-size:.8125rem;font-weight:600;cursor:pointer;border-right:1px solid var(--border)}\r\n#pg-page .seg button:last-child{border-right:none}\r\n#pg-page .seg button.active{background:var(--primary);color:#fff}\r\n#pg-page select,#pg-page input[type=text],#pg-page input[type=number]{font-family:inherit;padding:.42rem .55rem;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);font-size:.8125rem;color:var(--foreground);background:var(--card);outline:none}\r\n#pg-page input:focus,#pg-page select:focus{border-color:var(--primary)}\r\n#pg-page .btn-accent{display:inline-flex;align-items:center;gap:.4rem;border-radius:calc(var(--radius) - 2px);background:var(--accent);padding:.5rem 1.1rem;font-family:inherit;font-size:.8125rem;font-weight:700;color:var(--accent-foreground);border:none;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.05);transition:filter .15s}\r\n#pg-page .btn-accent:hover{filter:brightness(.95)}\r\n#pg-page .tabs{display:flex;gap:.2rem;border-bottom:2px solid var(--border);margin:.25rem 0 1.15rem;overflow-x:auto}\r\n#pg-page .tabs button{border:none;background:none;font-family:inherit;font-size:.9rem;font-weight:700;color:var(--muted-foreground);padding:.6rem .95rem;cursor:pointer;border-bottom:3px solid transparent;margin-bottom:-2px;display:inline-flex;align-items:center;gap:.4rem;white-space:nowrap}\r\n#pg-page .tabs button:hover{color:var(--foreground)}\r\n#pg-page .tabs button.active{color:var(--primary);border-bottom-color:var(--primary)}\r\n#pg-page .tabs button .cnt{font-size:.68rem;font-weight:800;background:var(--secondary);color:var(--primary);padding:.05rem .45rem;border-radius:999px}\r\n#pg-page .tabs button.warn .cnt{background:#fef2f2;color:var(--destructive)}\r\n#pg-page .status{font-size:.82rem;padding:.6rem .8rem;border-radius:calc(var(--radius) - 2px);margin-bottom:1rem;line-height:1.5}\r\n#pg-page .status.info{background:var(--secondary);color:var(--primary-deep);border:1px solid var(--border)}\r\n#pg-page .status.ok{background:#ecfdf5;color:var(--success);border:1px solid #a7f3d0}\r\n#pg-page .status.err{background:#fef2f2;color:var(--destructive);border:1px solid #fca5a5}\r\n#pg-page .scorecards{display:grid;grid-template-columns:repeat(5,1fr);gap:.75rem;margin-bottom:1.25rem}\r\n#pg-page .sc{background:var(--card);border:1px solid var(--border);border-radius:calc(var(--radius)+4px);padding:.9rem 1rem;box-shadow:var(--shadow-card);border-top:3px solid var(--primary)}\r\n#pg-page .sc.accent{border-top-color:var(--accent)}#pg-page .sc.green{border-top-color:var(--success)}\r\n#pg-page .sc.amber{border-top-color:#f59e0b}#pg-page .sc.red{border-top-color:var(--destructive)}\r\n#pg-page .sc .lbl{font-size:.66rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted-foreground)}\r\n#pg-page .sc .val{font-size:1.55rem;font-weight:800;color:var(--primary);line-height:1.1;margin-top:.3rem}\r\n#pg-page .sc.accent .val{color:var(--primary-deep)}#pg-page .sc.green .val{color:var(--success)}\r\n#pg-page .sc.amber .val{color:#b45309}#pg-page .sc.red .val{color:var(--destructive)}\r\n#pg-page .sc .sub{font-size:.7rem;color:var(--muted-foreground);margin-top:.2rem}\r\n@media(max-width:1000px){#pg-page .scorecards{grid-template-columns:repeat(2,1fr)}}\r\n@media(max-width:560px){#pg-page .scorecards{grid-template-columns:1fr 1fr}#pg-page .sc .val{font-size:1.35rem}}\r\n#pg-page .panel{background:var(--card);border:1px solid var(--border);border-radius:calc(var(--radius)+4px);padding:1rem 1.15rem;box-shadow:var(--shadow-card);margin-bottom:1.25rem}\r\n#pg-page .panel-head{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.9rem;flex-wrap:wrap}\r\n#pg-page .panel-title{font-size:1rem;font-weight:800;color:var(--foreground)}\r\n#pg-page .panel-sub{font-size:.72rem;color:var(--muted-foreground);font-weight:600}\r\n#pg-page .tbl-wrap{overflow:auto;max-height:min(66vh,620px);border-radius:calc(var(--radius) - 2px);border:1px solid var(--border)}\r\n#pg-page table{width:100%;border-collapse:collapse;font-size:.82rem}\r\n#pg-page thead th{position:sticky;top:0;z-index:4;background:var(--secondary);color:var(--primary-deep);font-size:.68rem;text-transform:uppercase;letter-spacing:.04em;font-weight:800;padding:.6rem .65rem;text-align:right;cursor:pointer;user-select:none;white-space:nowrap;border-bottom:2px solid var(--border)}\r\n#pg-page thead th.l,#pg-page tbody td.l{text-align:left}\r\n#pg-page thead th.sorted{color:var(--primary);background:#e8eefb}\r\n#pg-page tbody td{padding:.5rem .65rem;text-align:right;border-bottom:1px solid var(--border);white-space:nowrap;font-variant-numeric:tabular-nums}\r\n#pg-page tbody tr:hover{background:var(--secondary)}\r\n#pg-page td.branch{font-weight:700;color:var(--foreground)}\r\n#pg-page td.branch a{color:var(--foreground)} #pg-page td.branch a:hover{color:var(--primary)}\r\n#pg-page .rank{color:var(--muted-foreground);font-weight:700}\r\n#pg-page .bar-cell{position:relative}\r\n#pg-page .bar-fill{position:absolute;left:0;top:3px;bottom:3px;background:#e8eefb;border-radius:4px;z-index:0}\r\n#pg-page .bar-val{position:relative;z-index:1;font-weight:800}\r\n#pg-page table.pivot th.stick,#pg-page table.pivot td.stick{position:sticky;left:0;z-index:3;background:var(--card);text-align:left;box-shadow:1px 0 0 var(--border)}\r\n#pg-page table.pivot thead th.stick{z-index:6;background:var(--secondary)}\r\n#pg-page table.pivot td.heat{font-weight:700}\r\n#pg-page table.pivot td.zero{color:#c3c9d6}\r\n#pg-page .muted{color:var(--muted-foreground)}\r\n#pg-page .badge{display:inline-block;font-size:.66rem;font-weight:800;padding:.15rem .5rem;border-radius:999px;letter-spacing:.02em;text-transform:uppercase}\r\n#pg-page .badge.aktif{background:#ecfdf5;color:var(--success);border:1px solid #a7f3d0}\r\n#pg-page .badge.kurang{background:#fffbeb;color:#b45309;border:1px solid #fde68a}\r\n#pg-page .badge.pasif{background:#fef2f2;color:var(--destructive);border:1px solid #fca5a5}\r\n#pg-page .er-cell{font-weight:800}\r\n#pg-page .er-high{color:var(--success)}#pg-page .er-mid{color:#b45309}#pg-page .er-low{color:var(--destructive)}\r\n#pg-page .banner{display:flex;align-items:center;gap:1rem;background:linear-gradient(135deg,#fff,#fef2f2);border:1px solid #fca5a5;border-left:4px solid var(--destructive);border-radius:calc(var(--radius)+4px);padding:1rem 1.15rem;margin-bottom:1.15rem}\r\n#pg-page .banner .big{font-size:2.1rem;font-weight:800;color:var(--destructive);line-height:1;font-variant-numeric:tabular-nums}\r\n#pg-page .banner .txt{font-size:.86rem;color:var(--foreground)}\r\n#pg-page .banner.ok{background:linear-gradient(135deg,#fff,#ecfdf5);border-color:#a7f3d0;border-left-color:var(--success)}\r\n#pg-page .banner.ok .big{color:var(--success)}\r\n#pg-page .toplist{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(5,auto);grid-auto-flow:column;gap:.1rem .9rem}\r\n@media(max-width:640px){#pg-page .toplist{grid-template-columns:1fr;grid-template-rows:none;grid-auto-flow:row}}\r\n#pg-page .toprow{display:flex;align-items:center;gap:.6rem;padding:.4rem .2rem;border-bottom:1px solid var(--border);font-size:.85rem}\r\n#pg-page .toprow .medal2{font-size:1rem;width:1.4rem;text-align:center;flex-shrink:0}\r\n#pg-page .toprow .nm{font-weight:700;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n#pg-page .toprow .n{font-weight:800;color:var(--primary);flex-shrink:0}\r\n#pg-page details{margin-bottom:1rem}\r\n#pg-page summary{cursor:pointer;font-size:.8rem;font-weight:700;color:var(--muted-foreground);padding:.3rem 0}\r\n#pg-page .hint{font-size:.72rem;color:var(--muted-foreground);margin-top:.5rem;line-height:1.55}\r\n#pg-page .settings-grid{display:flex;flex-wrap:wrap;gap:.75rem;margin-top:.6rem}\r\n#pg-page .fld{display:flex;flex-direction:column;gap:.25rem}\r\n#pg-page .fld label{font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted-foreground)}\r\n#pg-page .site-footer{background:var(--footer-bg);color:#fff}\r\n#pg-page .footer-grid{display:grid;grid-template-columns:1fr;gap:2.5rem;max-width:78rem;margin:0 auto;padding:3rem 1rem}\r\n#pg-page .footer-bottom{border-top:1px solid rgba(255,255,255,.15)}\r\n#pg-page .footer-bottom-inner{display:flex;flex-direction:column-reverse;align-items:center;justify-content:space-between;gap:.75rem;max-width:78rem;margin:0 auto;padding:1.25rem 1rem;font-size:.75rem;color:rgba(255,255,255,.8)}\r\n#pg-page .social-link{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:9999px;background:rgba(255,255,255,.1);transition:background .15s,color .15s;color:#fff}\r\n#pg-page .social-link:hover{background:var(--accent);color:var(--accent-foreground)}\r\n#pg-page .footer-nav-link{color:rgba(255,255,255,.85);transition:color .15s}\r\n#pg-page .footer-nav-link:hover{color:var(--accent)}\r\n@media(min-width:640px){#pg-page .footer-bottom-inner{flex-direction:row}}\r\n@media(min-width:768px){#pg-page .footer-grid{grid-template-columns:5fr 3fr 4fr}}\r\n#pg-page .dash-hero h1,#pg-page .dash-hero p,#pg-page .dash-hero .eyebrow{color:#fff!important}\r\n#pg-page .dash-hero p{color:rgba(255,255,255,.85)!important}\r\n#pg-page .site-footer h1,#pg-page .site-footer h2,#pg-page .site-footer h3,#pg-page .site-footer h4{color:#fff!important}\r\n#pg-page .site-footer p,#pg-page .site-footer a,#pg-page .site-footer li{color:rgba(255,255,255,.85)!important}\r\n#pg-page .footer-bottom-inner,#pg-page .footer-bottom-inner span{color:rgba(255,255,255,.8)!important}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div id=\"pg-page\">\r\n\r\n<div class=\"site-header\">\r\n  <div class=\"header-inner\">\r\n    <a href=\"https:\/\/pandaigadai.com\" style=\"display:flex;align-items:center\">\r\n      <img decoding=\"async\" src=\"https:\/\/pandaigadai.com\/blog\/wp-content\/uploads\/2026\/01\/cropped-panda-1.webp\" alt=\"Pandai Gadai\" style=\"height:3rem;width:auto\">\r\n    <\/a>\r\n    <nav class=\"header-nav\">\r\n      <a href=\"https:\/\/pandaigadai.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"btn-header\">pandaigadai.com<\/a>\r\n    <\/nav>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"dash-hero\">\r\n  <div class=\"dash-hero-overlay\"><\/div>\r\n  <div class=\"dash-hero-inner\">\r\n    <span class=\"eyebrow\">\ud83c\udfb5 TikTok Cabang Activity Tracker<\/span>\r\n    <h1>Ranking Views & Engagement TikTok Cabang<\/h1>\r\n    <p>Pantau performa TikTok tiap cabang: views, engagement rate, dan jumlah post, per bulan.<\/p>\r\n    <p style=\"margin-top:.5rem;font-size:.8rem;color:rgba(255,255,255,.75)\">\ud83d\udcc5 Penarikan data terakhir: <b>23 Juli 2026<\/b><\/p>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"dash-body\">\r\n\r\n  <div id=\"status\" class=\"status info\">Memuat data\u2026<\/div>\r\n\r\n  <div class=\"controls\">\r\n    <button class=\"btn-accent\" onclick=\"TT.load()\">\u27f3 Muat \/ Refresh<\/button>\r\n    <span class=\"ctl-label\">Bulan:<\/span>\r\n    <select id=\"sel-month\" onchange=\"TT.setMonth(this.value)\" disabled><option value=\"\">Memuat\u2026<\/option><\/select>\r\n  <\/div>\r\n\r\n  <details style=\"display:none\">\r\n    <summary>\u2699\ufe0f Pengaturan sumber data (isi sekali, otomatis keinget)<\/summary>\r\n    <div class=\"settings-grid\">\r\n      <div class=\"fld\" style=\"flex:1;min-width:280px\"><label>Sheet ID (Google Sheet TikTok Tracker)<\/label><input type=\"text\" id=\"cfg-id\" value=\"17K2k6GnMwarDiYBbFfKq0pGFnjS99DeT\"><\/div>\r\n      <div class=\"fld\"><label>Nama tab Master Cabang<\/label><input type=\"text\" id=\"cfg-master\" value=\"Master Cabang\" style=\"width:180px\"><\/div>\r\n      <div class=\"fld\"><label>Nama tab Data<\/label><input type=\"text\" id=\"cfg-data\" value=\"Data\" style=\"width:140px\"><\/div>\r\n      <div class=\"fld\" style=\"flex:1;min-width:280px\"><label>Sheet ID Form Brief Konten<\/label><input type=\"text\" id=\"cfg-brief-id\" value=\"1XWF4oUOlTsFx21DaA6M4johw7QHWdJBDA_aIkw9pr3w\"><\/div>\r\n      <div class=\"fld\"><label>Nama tab Form Brief Konten<\/label><input type=\"text\" id=\"cfg-brief-tab\" value=\"Form Responses 1\" style=\"width:200px\"><\/div>\r\n      <div class=\"fld\"><label>Nama tab Master AM<\/label><input type=\"text\" id=\"cfg-am-tab\" value=\"Master AM\" style=\"width:160px\"><\/div>\r\n    <\/div>\r\n    <div class=\"hint\">Sheet ID cuma perlu diisi <b>sekali<\/b>, browser otomatis inget buat kunjungan berikutnya (gak perlu diketik ulang, gak perlu edit kode). Tab <b>Data<\/b> itu satu tab yang terus lo tambahin tiap bulan (paste hasil Apify baru di bawah baris lama), bukan bikin tab baru tiap bulan. Sheet harus dibagikan <b>\"Siapa saja yang memiliki link \u2192 Pelihat\"<\/b>. Kolom wajib di tab Data (nama header persis, field asli Apify): <code>authorMeta\/name<\/code>, <code>id<\/code>, <code>createTimeISO<\/code>, <code>playCount<\/code>, <code>diggCount<\/code>, <code>commentCount<\/code>, <code>shareCount<\/code>, <code>webVideoUrl<\/code>. Kolom wajib di tab Master Cabang: <code>Nama Cabang<\/code>, <code>Area<\/code>, <code>Username_Key<\/code>, <code>Status<\/code>.<\/div>\r\n  <\/details>\r\n\r\n  <div class=\"tabs\" id=\"tabs\" style=\"display:none\">\r\n    <button data-tab=\"ringkasan\" class=\"active\" onclick=\"TT.setTab('ringkasan')\">\ud83d\udcca Ringkasan<\/button>\r\n    <button data-tab=\"ranking\" onclick=\"TT.setTab('ranking')\">\ud83c\udfc6 Ranking Cabang<\/button>\r\n    <button data-tab=\"video\" onclick=\"TT.setTab('video')\">\ud83c\udfac Tabel Video<\/button>\r\n    <button data-tab=\"brief\" onclick=\"TT.setTab('brief')\">\ud83c\udfaf Ranking Program Branch Content - MKT<\/button>\r\n    <button data-tab=\"amsummary\" onclick=\"TT.setTab('amsummary')\">\ud83d\udc64 Ringkasan AM<\/button>\r\n  <\/div>\r\n\r\n  <section class=\"tabpane\" id=\"pane-ringkasan\" style=\"display:none\">\r\n    <div class=\"scorecards\" id=\"scorecards\">\r\n      <div class=\"sc\"><div class=\"lbl\">Cabang aktif<\/div><div class=\"val\" id=\"k-branches\">\u2014<\/div><div class=\"sub\">punya akun TikTok<\/div><\/div>\r\n      <div class=\"sc accent\"><div class=\"lbl\">Total views<\/div><div class=\"val\" id=\"k-views\">\u2014<\/div><div class=\"sub\" id=\"k-views-sub\">rentang terpilih<\/div><\/div>\r\n      <div class=\"sc\"><div class=\"lbl\">Total post<\/div><div class=\"val\" id=\"k-videos\">\u2014<\/div><div class=\"sub\">rentang terpilih<\/div><\/div>\r\n      <div class=\"sc green\"><div class=\"lbl\">Rata-rata ER<\/div><div class=\"val\" id=\"k-er\">\u2014<\/div><div class=\"sub\">(like+komen+share)\/views<\/div><\/div>\r\n      <div class=\"sc red\"><div class=\"lbl\">Tidak Ada Postingan<\/div><div class=\"val\" id=\"k-pasif\">\u2014<\/div><div class=\"sub\">0 post di rentang ini<\/div><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83e\udd47 Top 10 cabang \u2014 views<\/div>\r\n        <div class=\"panel-sub\" id=\"top-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\" style=\"max-height:420px\">\r\n        <table><thead><tr>\r\n          <th class=\"l\">#<\/th><th class=\"l\">Cabang<\/th><th class=\"l\">Link Akun<\/th><th>Views<\/th><th>ER<\/th><th>Total Post Konten<\/th>\r\n        <\/tr><\/thead><tbody id=\"tbody-topbranch\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83d\udd25 Top 10 video terbanyak views<\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\" style=\"max-height:420px\">\r\n        <table><thead><tr>\r\n          <th class=\"l\">#<\/th><th class=\"l\">Cabang<\/th><th>Views<\/th><th>Likes<\/th><th>Comment<\/th><th>ER<\/th><th class=\"l\">Buka<\/th>\r\n        <\/tr><\/thead><tbody id=\"tbody-topvid\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"tabpane\" id=\"pane-ranking\" style=\"display:none\">\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\" id=\"rank-panel-title\">\ud83c\udfc6 Ranking cabang<\/div>\r\n        <div style=\"display:flex;gap:.6rem;align-items:center;flex-wrap:wrap\">\r\n          <div class=\"seg\" id=\"seg-rank-metric\" style=\"display:none\">\r\n            <button data-rm=\"views\" onclick=\"TT.setRankMetric('views')\">Views<\/button>\r\n            <button data-rm=\"videos\" onclick=\"TT.setRankMetric('videos')\">Total Post<\/button>\r\n          <\/div>\r\n          <div class=\"seg\" id=\"seg-rank-view\">\r\n            <button data-rv=\"ringkasan\" onclick=\"TT.setRankView('ringkasan')\">Ringkasan<\/button>\r\n            <button data-rv=\"timeline\" onclick=\"TT.setRankView('timeline')\">Timeline<\/button>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"panel-sub\" id=\"ranking-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-rank\"><thead><tr id=\"rank-thead\"><\/tr><\/thead><tbody id=\"rank-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n      <div class=\"hint\" id=\"ranking-hint\">Views = total playCount video yang di-post dalam bulan terpilih. ER rata-rata = rata-rata ER semua video cabang tsb di bulan ini. Klik judul kolom untuk mengurutkan.<\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"tabpane\" id=\"pane-video\" style=\"display:none\">\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83c\udfac Semua video \u2014 rentang terpilih<\/div>\r\n        <div class=\"panel-sub\" id=\"video-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-video\"><thead><tr id=\"video-thead\"><\/tr><\/thead><tbody id=\"video-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n      <div class=\"hint\">ER = (likes+comments+shares) \/ views per video. Klik judul kolom untuk mengurutkan.<\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"tabpane\" id=\"pane-brief\" style=\"display:none\">\r\n    <div class=\"controls\">\r\n      <span class=\"ctl-label\">Batch:<\/span>\r\n      <div class=\"seg\" id=\"seg-batch\"><\/div>\r\n    <\/div>\r\n    <div id=\"brief-status\" class=\"status info\">Memuat\u2026<\/div>\r\n    <div class=\"scorecards\" id=\"brief-scorecards\">\r\n      <div class=\"sc\"><div class=\"lbl\">Cabang Submit<\/div><div class=\"val\" id=\"bk-cabang\">\u2014<\/div><div class=\"sub\">batch terpilih<\/div><\/div>\r\n      <div class=\"sc accent\"><div class=\"lbl\">Total Views<\/div><div class=\"val\" id=\"bk-views\">\u2014<\/div><div class=\"sub\">batch terpilih<\/div><\/div>\r\n      <div class=\"sc\"><div class=\"lbl\">Total Submission<\/div><div class=\"val\" id=\"bk-submit\">\u2014<\/div><div class=\"sub\">batch terpilih<\/div><\/div>\r\n      <div class=\"sc amber\"><div class=\"lbl\">Perlu Cek Nama<\/div><div class=\"val\" id=\"bk-cekamna\">\u2014<\/div><div class=\"sub\">gak ke-match Master Cabang<\/div><\/div>\r\n      <div class=\"sc red\"><div class=\"lbl\">Belum Submit<\/div><div class=\"val\" id=\"bk-belum\">\u2014<\/div><div class=\"sub\">cabang aktif<\/div><\/div>\r\n    <\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\" id=\"brief-title\">\ud83c\udfaf Ranking Program Branch Content - MKT<\/div>\r\n        <div class=\"panel-sub\" id=\"brief-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-brief\"><thead><tr id=\"brief-thead\"><\/tr><\/thead><tbody id=\"brief-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"tabpane\" id=\"pane-amsummary\" style=\"display:none\">\r\n    <div class=\"panel-title\" style=\"margin-bottom:.6rem\">\ud83d\udcca AM \u2014 Tracker Utama <span class=\"panel-sub\" id=\"am-month-label\" style=\"font-weight:600\"><\/span><\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83d\udc64 Ringkasan AM \u2014 Keaktifan Cabang<\/div>\r\n        <div class=\"panel-sub\" id=\"am1-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-am1\"><thead><tr id=\"am1-thead\"><\/tr><\/thead><tbody id=\"am1-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83c\udfc6 Ranking AM \u2014 Total Views<\/div>\r\n        <div class=\"panel-sub\" id=\"am2-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-am2\"><thead><tr id=\"am2-thead\"><\/tr><\/thead><tbody id=\"am2-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"panel-title\" style=\"margin:1.5rem 0 .6rem\">\ud83c\udfaf AM \u2014 Program Branch Content<\/div>\r\n    <div class=\"controls\">\r\n      <span class=\"ctl-label\">Batch:<\/span>\r\n      <div class=\"seg\" id=\"seg-batch-2\"><\/div>\r\n    <\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83d\udc64 Ringkasan AM \u2014 Keaktifan Submit<\/div>\r\n        <div class=\"panel-sub\" id=\"bam1-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-bam1\"><thead><tr id=\"bam1-thead\"><\/tr><\/thead><tbody id=\"bam1-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"panel\">\r\n      <div class=\"panel-head\">\r\n        <div class=\"panel-title\">\ud83c\udfc6 Ranking AM \u2014 Total Views<\/div>\r\n        <div class=\"panel-sub\" id=\"bam2-sub\"><\/div>\r\n      <\/div>\r\n      <div class=\"tbl-wrap\">\r\n        <table id=\"tbl-bam2\"><thead><tr id=\"bam2-thead\"><\/tr><\/thead><tbody id=\"bam2-tbody\"><\/tbody><\/table>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <div class=\"hint\" id=\"footer-note\" style=\"display:none\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"site-footer\">\r\n  <div class=\"footer-grid\">\r\n    <div>\r\n      <img decoding=\"async\" src=\"https:\/\/pandaigadai.com\/blog\/wp-content\/uploads\/2026\/01\/cropped-panda-1.webp\" alt=\"Pandai Gadai\" style=\"height:3.5rem;width:auto\">\r\n      <p style=\"margin-top:1.25rem;font-size:.875rem;color:rgba(255,255,255,0.85)\">Berizin dan Diawasi Otoritas Jasa Keuangan<\/p>\r\n      <p style=\"margin-top:.5rem;font-size:.875rem;font-weight:600\">Nomor Izin: KEP-180\/PL.02\/2023<\/p>\r\n    <\/div>\r\n    <div>\r\n      <h3 style=\"font-size:1rem;font-weight:700\">Navigasi<\/h3>\r\n      <ul style=\"margin-top:1rem;display:flex;flex-direction:column;gap:.625rem;font-size:.875rem;color:rgba(255,255,255,0.85)\">\r\n        <li><a href=\"https:\/\/pandaigadai.com\/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"footer-nav-link\">pandaigadai.com<\/a><\/li>\r\n      <\/ul>\r\n    <\/div>\r\n    <div>\r\n      <h3 style=\"font-size:1rem;font-weight:700\">Layanan Pengaduan Kantor Pusat<\/h3>\r\n      <p style=\"margin-top:1rem;font-size:.875rem;color:rgba(255,255,255,0.85)\">\r\n        Telepon: <a href=\"tel:085715322146\" class=\"footer-nav-link\">0857-1532-2146<\/a><br>\r\n        Email: <a href=\"mailto:hello@pandaigadai.com\" class=\"footer-nav-link\">hello@pandaigadai.com<\/a>\r\n      <\/p>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"footer-bottom\">\r\n    <div class=\"footer-bottom-inner\">\r\n      <span>&copy; Copyright PT Solusi Gadai Pintar 2026 All Rights Reserved<\/span>\r\n      <div style=\"display:flex;align-items:center;gap:.75rem\">\r\n        <a href=\"https:\/\/www.instagram.com\/pandaigadai\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Instagram\" class=\"social-link\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"height:1rem;width:1rem\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"\/><path d=\"M16 11.37A4 4 0 1112.63 8 4 4 0 0116 11.37z\"\/><line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"\/><\/svg><\/a>\r\n        <a href=\"https:\/\/www.tiktok.com\/@pandaigadai.id\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"TikTok\" class=\"social-link\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"height:1rem;width:1rem\"><path d=\"M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-5.2 1.74 2.89 2.89 0 012.31-4.64 2.93 2.93 0 01.88.13V9.4a6.84 6.84 0 00-1-.05A6.33 6.33 0 005.8 20.1a6.34 6.34 0 0010.86-4.43V8.92a8.16 8.16 0 004.77 1.52V7A4.86 4.86 0 0119.59 6.69z\"\/><\/svg><\/a>\r\n        <a href=\"https:\/\/www.facebook.com\/pandaigadai\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Facebook\" class=\"social-link\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"height:1rem;width:1rem\"><path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\"\/><\/svg><\/a>\r\n        <a href=\"https:\/\/www.youtube.com\/@PandaiGadai\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"YouTube\" class=\"social-link\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"height:1rem;width:1rem\"><path d=\"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814z\"\/><\/svg><\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n'use strict';\r\nvar $=function(id){return document.getElementById(id);};\r\nvar LS='tt_dash_pg_v2';\r\nvar DAY=86400000;\r\nvar state={tab:'ringkasan',selectedMonth:null,rankView:'ringkasan',rankMetric:'views',allVideos:[],master:{},masterByName:{},anchor:Date.now(),\r\n sortRank:{key:'views',dir:-1},sortVideo:{key:'views',dir:-1},sortArea:{key:'views',dir:-1},\r\n briefRows:[],briefBatches:[],briefBatch:null,sortBrief:{key:'views',dir:-1}};\r\n\r\nfunction savePrefs(){try{localStorage.setItem(LS,JSON.stringify({tab:state.tab,selectedMonth:state.selectedMonth}));}catch(e){}}\r\nfunction loadPrefs(){try{var p=JSON.parse(localStorage.getItem(LS)||'{}');\r\n  if(p.tab)state.tab=p.tab;if(p.selectedMonth)state.selectedMonth=p.selectedMonth;\r\n }catch(e){}}\r\n\/\/ Catatan: Sheet ID \/ nama tab Master Cabang \/ nama tab Data SENGAJA tidak disimpan di\r\n\/\/ localStorage, biar nilai yang ada di source HTML selalu jadi acuan (hindari config basi\r\n\/\/ nyangkut di browser lama). Kalau mau ganti sheet, edit langsung value= di HTML.\r\n\r\nfunction setStatus(m,c){var s=$('status');s.style.display='block';s.className='status '+(c||'info');s.innerHTML=m;}\r\nfunction nf(n){return isFinite(n)?Math.round(n).toLocaleString('id-ID'):'\u2014';}\r\nfunction pf(n){return isFinite(n)?(n*100).toFixed(2)+'%':'\u2014';}\r\nfunction esc(s){return String(s==null?'':s).replace(\/[&<>\"']\/g,function(c){return{'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c];});}\r\nfunction clip(s,n){s=String(s||'');return s.length>n?s.slice(0,n-1)+'\u2026':s;}\r\nfunction dmy(t){return new Date(t).toLocaleDateString('id-ID',{day:'numeric',month:'short',year:'numeric'});}\r\nfunction normUser(s){s=String(s||'').trim().toLowerCase();s=s.replace(\/^https?:\\\/\\\/\/,'').replace(\/^www\\.\/,'').replace(\/^tiktok\\.com\\\/\/,'');s=s.split('?')[0].replace(\/\\\/$\/,'');s=s.replace(\/^@\/,'');return s.replace(\/\\s+\/g,'');}\r\nfunction tiktokUrl(u){return 'https:\/\/www.tiktok.com\/@'+u;}\r\n\r\nfunction parseCSV(text){var rows=[],row=[],cur='',i=0,q=false;while(i<text.length){var c=text[i];\r\n if(q){if(c==='\"'){if(text[i+1]==='\"'){cur+='\"';i++;}else q=false;}else cur+=c;}\r\n else{if(c==='\"')q=true;else if(c===','){row.push(cur);cur='';}else if(c==='\\n'){row.push(cur);rows.push(row);row=[];cur='';}else if(c==='\\r'){}else cur+=c;}\r\n i++;}\r\n if(cur.length||row.length){row.push(cur);rows.push(row);}return rows;}\r\n\r\nfunction cbucket(){return Math.floor(Date.now()\/300000);}\r\nfunction gvizUrl(sheetName){var id=$('cfg-id').value.trim();\r\n return 'https:\/\/docs.google.com\/spreadsheets\/d\/'+id+'\/gviz\/tq?tqx=out:csv&sheet='+encodeURIComponent(sheetName)+'&_cb='+cbucket();}\r\n\r\nfunction fetchCsv(url){return fetch(url,{credentials:'omit'}).then(function(r){\r\n if(!r.ok)throw new Error('HTTP '+r.status);var ct=r.headers.get('content-type')||'';return r.text().then(function(t){\r\n  if(\/text\\\/html\/i.test(ct)||new RegExp('<'+'html','i').test(t.slice(0,200)))throw new Error('html\/blocked');\r\n  var rows=parseCSV(t).filter(function(x){return x.length>1||(x.length===1&&x[0]!=='');});\r\n  if(rows.length<1)throw new Error('empty');return rows;});});}\r\n\r\nfunction findHdr(hdr){var norm=hdr.map(function(h){return String(h).trim();});\r\n return function(){for(var a=0;a<arguments.length;a++){var i=norm.indexOf(arguments[a]);if(i>=0)return i;}return -1;};}\r\n\r\n\/* ---- Master Cabang ---- *\/\r\nfunction normBranchName(s){s=String(s||'').trim().toLowerCase();\r\n var prev;do{prev=s;\r\n  s=s.replace(\/^pandai\\s*gadai\\.?\\s*\/,'');s=s.replace(\/^pg\\.?\\s+\/,'');s=s.replace(\/^cabang\\s+\/,'');\r\n }while(s!==prev); \/\/ ulang sampe gak ada prefix lagi, biar \"Cabang Pandai Gadai X\" ke-strip abis\r\n s=s.replace(\/\\.\/g,''); \/\/ titik diabaikan, \"KH. Mas Mansyur\" = \"KH Mas Mansyur\"\r\n s=s.replace(\/['\\u2018\\u2019\\u02BC`]\/g,''); \/\/ smart quote vs straight quote, \"Mas'ud\" = \"Mas'ud\" = \"Masud\"\r\n s=s.replace(\/\\s+\/g,''); \/\/ spasi diabaikan total, \"H. Usa\" = \"H.USA\" = \"HUsa\"\r\n return s;}\r\n\r\n\/\/ alias manual buat kasus yang penulisannya beda struktur (bukan cuma titik\/angka\/quote), TIDAK diubah di sheet\r\n\/\/ manapun biar Master Cabang tetap cocok sama isian Google Form, dan Master AM tetap cocok sama copy-an dari Janu.\r\nvar BRANCH_AM_ALIAS={'bantargabang':'bantargebang','patriot':'patriotbekasi','kotabaru':'kotabarubekasi',\r\n 'kincanraya':'kincanrayabekasi','margonda':'margondaraya'};\r\n\r\n\/\/ cabang pertama di satu area kadang gak dikasih angka di Master AM (mis. \"Tarumajaya\" = \"Tarumajaya 1\").\r\n\/\/ kalau exact match gagal dan nama berakhiran angka, coba lagi tanpa angkanya. Terakhir, coba alias manual.\r\nfunction findAM(amMap,nama){\r\n var key=normBranchName(nama);\r\n if(amMap[key]!=null)return amMap[key];\r\n var stripped=key.replace(\/\\d+$\/,'');\r\n if(stripped!==key&&amMap[stripped]!=null)return amMap[stripped];\r\n if(BRANCH_AM_ALIAS[key]&&amMap[BRANCH_AM_ALIAS[key]]!=null)return amMap[BRANCH_AM_ALIAS[key]];\r\n return '';\r\n}\r\n\r\nfunction loadMaster(){\r\n return fetchCsv(gvizUrl($('cfg-master').value.trim()||'Master Cabang')).then(function(rows){\r\n  var f=findHdr(rows[0]);\r\n  var ni=f('Nama Cabang'),ai=f('Area'),ui=f('Username_Key'),si=f('Status');\r\n  var map={},byName={},allRecs=[];\r\n  for(var r=1;r<rows.length;r++){var row=rows[r];if(!row)continue;\r\n   var nama=ni>=0?(row[ni]||'').trim():'';\r\n   var rec={nama:nama||(ui>=0?row[ui]:''),area:ai>=0?(row[ai]||'').trim():'',status:si>=0?(row[si]||'').trim():'Aktif',am:''};\r\n   var u=ui>=0?normUser(row[ui]):'';if(u)map[u]=rec;\r\n   if(nama)byName[normBranchName(nama)]=rec;\r\n   allRecs.push(rec);}\r\n  \/\/ cabang bernomor (mis. \"Tarumajaya 1\"\/\"Tarumajaya 2\") sering ditulis polos tanpa angka di Google Form.\r\n  \/\/ alias nama polos -> varian pertama yang ketemu, supaya tetep ke-match (dipakai kalau AM-nya sama juga).\r\n  Object.keys(byName).forEach(function(key){\r\n   var bare=key.replace(\/\\d+$\/,'');\r\n   if(bare!==key&&!byName[bare])byName[bare]=byName[key];});\r\n  state.master=map;state.masterByName=byName;state.masterRecs=allRecs;return map;});}\r\n\r\nfunction loadAMMap(){\r\n var tab=$('cfg-am-tab').value.trim();if(!tab)return Promise.resolve({});\r\n return fetchCsv(gvizUrl(tab)).then(function(rows){\r\n  var f=findHdr(rows[0]);\r\n  var bi=f('BRANCH','Branch','Nama Cabang','branch'),\r\n      ami=f('Area Manager \\nName','Area Manager\\nName','Area Manager Name','Area Manager','AM','Nama AM');\r\n  var map={};\r\n  if(bi<0)return map;\r\n  for(var r=1;r<rows.length;r++){var row=rows[r];if(!row)continue;\r\n   var branch=(row[bi]||'').trim();if(!branch)continue;\r\n   map[normBranchName(branch)]=ami>=0?(row[ami]||'').trim():'';}\r\n  return map;\r\n }).catch(function(){return {};});\r\n}\r\n\r\nfunction usernameFromUrl(url){var m=String(url||'').match(\/tiktok\\.com\\\/@([^\\\/?]+)\/i);return m?m[1].toLowerCase():'';}\r\n\r\n\/* ---- Data (satu tab, terus tumbuh, dedup by videoId ambil MAX playCount) ---- *\/\r\nfunction loadData(){\r\n return fetchCsv(gvizUrl($('cfg-data').value.trim()||'Data')).then(function(rows){\r\n  var f=findHdr(rows[0]);\r\n  var ci=f('authorMeta\/name'),idi=f('id'),di=f('createTimeISO'),vi=f('playCount'),\r\n      li=f('diggCount'),cmi=f('commentCount'),shi=f('shareCount'),ui2=f('webVideoUrl'),txi=f('text');\r\n  if(idi<0||di<0||vi<0||ui2<0)throw new Error('missing-cols');\r\n  var byId={};\r\n  for(var r=1;r<rows.length;r++){var row=rows[r];if(!row)continue;\r\n   var vid=idi>=0?(row[idi]||'').trim():'';\r\n   var uname=ci>=0&&row[ci]?normUser(row[ci]):'';\r\n   if(!uname)uname=usernameFromUrl(row[ui2]); \/\/ fallback: authorMeta gak ke-flatten, ambil dari URL video\r\n   if(!vid||!uname)continue;\r\n   var dt=Date.parse((row[di]||'').trim());if(isNaN(dt))continue;\r\n   var views=parseFloat(row[vi])||0;\r\n   var mInfo=state.master[uname]||null;\r\n   var rec={videoId:vid,username:uname,branch:mInfo?mInfo.nama:uname,area:mInfo?mInfo.area:'',am:mInfo?mInfo.am:'',\r\n    postDate:dt,views:views,likes:li>=0?(parseFloat(row[li])||0):0,comments:cmi>=0?(parseFloat(row[cmi])||0):0,\r\n    shares:shi>=0?(parseFloat(row[shi])||0):0,url:ui2>=0?(row[ui2]||'').trim():'',caption:txi>=0?(row[txi]||'').trim():''};\r\n   if(!byId[vid]||views>byId[vid].views)byId[vid]=rec;\r\n  }\r\n  var list=Object.keys(byId).map(function(k){return byId[k];});\r\n  var maxDate=list.reduce(function(m,v){return v.postDate>m?v.postDate:m;},0);\r\n  state.allVideos=list;state.anchor=maxDate||Date.now();\r\n  return list;});}\r\n\r\n\/\/ typo yang gak bisa di-generalize aman (nama beda total, bukan typo huruf), dikonfirmasi manual sama Julia\r\nvar BRANCH_NAME_TYPO_ALIAS={'pekapuran':'fatmawati'};\r\n\r\nfunction levenshtein(a,b){\r\n var m=a.length,n=b.length;\r\n var dp=new Array(m+1);for(var i=0;i<=m;i++)dp[i]=new Array(n+1).fill(0);\r\n for(i=0;i<=m;i++)dp[i][0]=i;for(var j=0;j<=n;j++)dp[0][j]=j;\r\n for(i=1;i<=m;i++)for(j=1;j<=n;j++)dp[i][j]=Math.min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+(a[i-1]===b[j-1]?0:1));\r\n return dp[m][n];\r\n}\r\n\r\nfunction findMasterByName(nama){\r\n var key=normBranchName(nama);\r\n if(state.masterByName[key])return state.masterByName[key];\r\n if(BRANCH_NAME_TYPO_ALIAS[key]&&state.masterByName[BRANCH_NAME_TYPO_ALIAS[key]])return state.masterByName[BRANCH_NAME_TYPO_ALIAS[key]];\r\n if(key.length<4)return null; \/\/ kunci kependekan, matching apapun gak aman\r\n \/\/ fallback 1: nama resmi di Master Cabang adalah AWALAN dari yang diketik (mis. staff nambahin \"Bekasi\"\/\"Raya\"\/\"Joglo\"\r\n \/\/ di belakang), dan cuma ADA SATU kandidat.\r\n var candidates=[],seen={};\r\n Object.keys(state.masterByName).forEach(function(k){\r\n  if(k.length>=4&&key.indexOf(k)===0){var rec=state.masterByName[k];if(!seen[rec.nama]){seen[rec.nama]=1;candidates.push(rec);}}});\r\n if(candidates.length===1)return candidates[0];\r\n \/\/ fallback 2: typo huruf kecil (jarak edit <=2), HANYA dipakai kalau kandidat terdekatnya cuma satu (gak ada yang seri).\r\n var bestDist=99,bestRecs=[];\r\n Object.keys(state.masterByName).forEach(function(k){\r\n  if(k.length<4)return;\r\n  var d=levenshtein(key,k);\r\n  if(d<bestDist){bestDist=d;bestRecs=[state.masterByName[k]];}\r\n  else if(d===bestDist){var rec=state.masterByName[k];if(bestRecs.indexOf(rec)<0)bestRecs.push(rec);}});\r\n if(bestDist<=2&&bestRecs.length===1)return bestRecs[0];\r\n return null;\r\n}\r\n\r\n\/* ---- Ranking Program Branch Content - MKT (self-reported views dari Google Form) ---- *\/\r\nfunction parseClaimedViews(raw){\r\n if(raw==null)return null;\r\n var s=String(raw).trim().toLowerCase();\r\n s=s.replace(\/views?\/g,'').trim().replace(\/\\s+\/g,'');\r\n if(!s)return null;\r\n if(\/^\\d+$\/.test(s))return{value:parseInt(s,10),ambiguous:false};\r\n if(\/^\\d{1,3}([.,]\\d{3})+$\/.test(s))return{value:parseInt(s.replace(\/[.,]\/g,''),10),ambiguous:false};\r\n var digits=s.replace(\/[^\\d]\/g,'');\r\n if(!digits)return null;\r\n return{value:parseInt(digits,10),ambiguous:true,raw:raw};\r\n}\r\n\r\nfunction loadBrief(){\r\n var id=$('cfg-brief-id').value.trim(),tab=$('cfg-brief-tab').value.trim()||'Form Responses 1';\r\n if(!id)return Promise.resolve([]);\r\n var url='https:\/\/docs.google.com\/spreadsheets\/d\/'+id+'\/gviz\/tq?tqx=out:csv&sheet='+encodeURIComponent(tab)+'&_cb='+cbucket();\r\n return fetchCsv(url).then(function(rows){\r\n  var f=findHdr(rows[0]);\r\n  var tsi=f('Timestamp'),ni=f('Nama Cabang'),ami=f('Nama AM'),ui=f('Nama Akun TikTok Cabang'),\r\n      li=f('Link Content Upload'),vi=f('Jumlah Views Saat Submit Gform');\r\n  \/\/ cari kolom penanda batch (header kosong, isinya pola \"#...\" di beberapa baris)\r\n  var markerCol=-1;\r\n  for(var c=0;c<rows[0].length;c++){for(var r=1;r<Math.min(rows.length,200);r++){\r\n   if(rows[r][c]&&\/^#\/.test(rows[r][c].trim())){markerCol=c;break;}}if(markerCol>=0)break;}\r\n  var curBatch='Semua',batches=[];\r\n  var out=[];\r\n  for(var r=1;r<rows.length;r++){var row=rows[r];if(!row)continue;\r\n   var nama=(ni>=0?(row[ni]||''):'').trim();if(!nama)continue;\r\n   var marker=markerCol>=0?(row[markerCol]||'').trim():'';\r\n   if(marker){curBatch=marker;if(batches.indexOf(marker)<0)batches.push(marker);}\r\n   var mInfo=findMasterByName(nama);\r\n   var vp=parseClaimedViews(vi>=0?row[vi]:null);\r\n   out.push({batch:curBatch,namaRaw:nama,branch:mInfo?mInfo.nama:nama,area:mInfo?mInfo.area:'',matched:!!mInfo,\r\n    am:ami>=0?(row[ami]||'').trim():'',username:ui>=0?(row[ui]||'').trim():'',\r\n    url:li>=0?(row[li]||'').trim():'',views:vp?vp.value:0,ambiguous:vp?vp.ambiguous:false,\r\n    ts:tsi>=0?(row[tsi]||'').trim():''});\r\n  }\r\n  state.briefRows=out;state.briefBatches=batches;\r\n  if(!state.briefBatch||batches.indexOf(state.briefBatch)<0)state.briefBatch=batches.length?batches[batches.length-1]:'Semua';\r\n  return out;});\r\n}\r\n\r\nfunction load(){\r\n if(location.protocol==='file:'){setStatus('Dashboard ini gak bisa narik data kalau file-nya dibuka langsung (double-click) dari folder. Perlu dibuka lewat server\/web (http\/https) \u2014 contoh: paste ke Custom HTML block di WordPress, sama kayak dashboard lainnya.','err');return;}\r\n if(!$('cfg-id').value.trim()){setStatus('Isi Sheet ID di pengaturan sumber data dulu (cukup sekali).','err');return;}\r\n setStatus('Memuat data\u2026','info');savePrefs();\r\n loadMaster().then(function(){return loadAMMap();}).then(function(amMap){\r\n  (state.masterRecs||[]).forEach(function(rec){rec.am=findAM(amMap,rec.nama);});\r\n  return loadData();\r\n }).then(function(list){\r\n  $('tabs').style.display='flex';\r\n  if(!list.length){setStatus('Belum ada data untuk ditampilkan.','err');return[];}\r\n  var noMatch=list.filter(function(v){return !state.master[v.username];}).length;\r\n  if(noMatch){var badU=Array.from(new Set(list.filter(function(v){return !state.master[v.username];}).map(function(v){return v.username;})));\r\n   console.warn('[TikTok Tracker] '+noMatch+' dari '+list.length+' video tidak ketemu di Master Cabang. Username yang gak match:',badU);}\r\n  setStatus('\u2713 Data termuat, terbaru: <b>'+dmy(state.anchor)+'<\/b>.','ok');\r\n  return loadBrief();\r\n }).then(function(briefRows){\r\n  briefRows=briefRows||[];\r\n  var unmatched=briefRows.filter(function(x){return !x.matched;});\r\n  if(unmatched.length)console.warn('[Ranking Brief Konten] '+unmatched.length+' baris gak ke-match ke Master Cabang:',unmatched.map(function(x){return x.namaRaw;}));\r\n  var ambiguous=briefRows.filter(function(x){return x.ambiguous;});\r\n  if(ambiguous.length)console.warn('[Ranking Brief Konten] '+ambiguous.length+' angka views ambigu, cek manual:',ambiguous.map(function(x){return{cabang:x.namaRaw,raw:x.views};}));\r\n  render();\r\n }).catch(function(err){\r\n  var msg=String(err&&err.message||err);\r\n  if(msg==='missing-cols')setStatus('Kolom wajib gak lengkap di tab Data. Pastikan header persis: id, createTimeISO, playCount, webVideoUrl.','err');\r\n  else setStatus('Gagal memuat data. Coba klik Refresh lagi sebentar lagi.','err');\r\n });\r\n}\r\n\r\n\/* ---- rolling window (client-side, gak perlu refetch) ---- *\/\r\nfunction availableMonths(){\r\n var set={};\r\n state.allVideos.forEach(function(v){var d=new Date(v.postDate);set[d.getUTCFullYear()+'-'+String(d.getUTCMonth()+1).padStart(2,'0')]=1;});\r\n return Object.keys(set).sort();\r\n}\r\nfunction monthLabel(ym){if(!ym)return'';var p=ym.split('-');return new Date(+p[0],+p[1]-1,1).toLocaleDateString('id-ID',{month:'long',year:'numeric'});}\r\nfunction monthRange(ym){var p=ym.split('-'),y=+p[0],m=+p[1];\r\n return{start:Date.UTC(y,m-1,1),end:Date.UTC(y,m,1)-1};}\r\n\r\nfunction videosInMonth(){\r\n if(!state.selectedMonth)return state.allVideos.slice();\r\n var r=monthRange(state.selectedMonth);\r\n return state.allVideos.filter(function(v){return v.postDate>=r.start&&v.postDate<=r.end;});}\r\n\r\nfunction aggregateByBranch(videos){\r\n var agg={};\r\n Object.keys(state.master).forEach(function(u){var m=state.master[u];if(m.status!=='Aktif')return;\r\n  agg[u]={username:u,branch:m.nama,area:m.area,am:m.am||'',videos:0,views:0,likes:0,comments:0,shares:0};});\r\n videos.forEach(function(v){\r\n  if(!agg[v.username])agg[v.username]={username:v.username,branch:v.branch,area:v.area,am:v.am||'',videos:0,views:0,likes:0,comments:0,shares:0};\r\n  var a=agg[v.username];a.videos++;a.views+=v.views;a.likes+=v.likes;a.comments+=v.comments;a.shares+=v.shares;});\r\n return Object.keys(agg).map(function(k){var a=agg[k];a.engSum=a.likes+a.comments+a.shares;a.er=a.views>0?(a.engSum\/a.views):0;return a;});\r\n}\r\n\r\nfunction erClass(er){if(er>=0.03)return'er-high';if(er>=0.02)return'er-mid';return'er-low';}\r\n\r\n\/* ================= RENDER ================= *\/\r\nfunction render(){\r\n syncControls();\r\n var months=availableMonths();\r\n var sel=$('sel-month');sel.disabled=false;\r\n var optHtml=months.slice().reverse().map(function(m){return '<option value=\"'+m+'\">'+esc(monthLabel(m))+'<\/option>';}).join('');\r\n if(sel.innerHTML!==optHtml)sel.innerHTML=optHtml;\r\n if(!state.selectedMonth||months.indexOf(state.selectedMonth)<0)state.selectedMonth=months.length?months[months.length-1]:null;\r\n sel.value=state.selectedMonth||'';\r\n var videos=videosInMonth();\r\n var branches=aggregateByBranch(videos);\r\n var totalViews=0,totalEng=0,totalVideos=0,pasif=0;\r\n branches.forEach(function(b){totalViews+=b.views;totalEng+=b.engSum;totalVideos+=b.videos;if(b.videos===0)pasif++;});\r\n var avgER=totalViews>0?(totalEng\/totalViews):0;\r\n var rangeLabel=monthLabel(state.selectedMonth)||'\u2014';\r\n $('am-month-label').textContent='('+rangeLabel+')';\r\n\r\n $('k-branches').textContent=branches.length;\r\n $('k-views').textContent=nf(totalViews);\r\n $('k-views-sub').textContent=rangeLabel;\r\n $('k-videos').textContent=nf(totalVideos);\r\n $('k-er').textContent=pf(avgER);\r\n $('k-pasif').textContent=pasif+' cabang';\r\n\r\n renderTopList(branches,rangeLabel);\r\n renderTopVideos(videos);\r\n renderRanking(branches,rangeLabel);\r\n renderVideoTable(videos,rangeLabel);\r\n renderAMMain(branches,rangeLabel);\r\n renderBrief();\r\n\r\n $('footer-note').style.display='block';\r\n $('footer-note').innerHTML='Rentang: '+esc(rangeLabel)+' \u2022 '+branches.length+' cabang \u2022 '+nf(totalVideos)+' video \u2022 diperbarui '+new Date().toLocaleString('id-ID');\r\n}\r\n\r\nfunction renderTopList(branches,rangeLabel){\r\n var arr=branches.filter(function(b){return b.views>0;}).sort(function(a,b){return b.views-a.views;}).slice(0,10);\r\n var tb=$('tbody-topbranch');\r\n $('top-sub').textContent=rangeLabel;\r\n tb.innerHTML='';\r\n if(!arr.length){tb.innerHTML='<tr><td colspan=\"6\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada data views di rentang ini.<\/td><\/tr>';return;}\r\n arr.forEach(function(b,i){var cls=erClass(b.er);\r\n  tb.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+esc(b.branch)+'<\/td>'+\r\n   '<td class=\"l\">'+(b.username?'<a href=\"'+esc(tiktokUrl(b.username))+'\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--primary);font-weight:700\">@'+esc(b.username)+' \u2197<\/a>':'\u2014')+'<\/td>'+\r\n   '<td style=\"font-weight:800\">'+nf(b.views)+'<\/td>'+\r\n   '<td class=\"er-cell '+cls+'\">'+pf(b.er)+'<\/td>'+\r\n   '<td style=\"font-weight:700\">'+nf(b.videos)+'<\/td><\/tr>');\r\n });\r\n}\r\n\r\nfunction renderTopVideos(videos){\r\n var arr=videos.slice().sort(function(a,b){return b.views-a.views;}).slice(0,10);\r\n var tb=$('tbody-topvid');tb.innerHTML='';\r\n if(!arr.length){tb.innerHTML='<tr><td colspan=\"7\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada video di rentang ini.<\/td><\/tr>';return;}\r\n arr.forEach(function(v,i){var er=v.views>0?((v.likes+v.comments+v.shares)\/v.views):0;var cls=erClass(er);\r\n  tb.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+esc(clip(v.branch,20))+'<\/td>'+\r\n   '<td style=\"font-weight:800\">'+nf(v.views)+'<\/td>'+\r\n   '<td class=\"muted\">'+nf(v.likes)+'<\/td>'+\r\n   '<td class=\"muted\">'+nf(v.comments)+'<\/td>'+\r\n   '<td class=\"er-cell '+cls+'\">'+pf(er)+'<\/td>'+\r\n   '<td class=\"l\">'+(v.url?'<a href=\"'+esc(v.url)+'\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--primary);font-weight:700\">TikTok \u2197<\/a>':'\u2014')+'<\/td><\/tr>');\r\n });\r\n}\r\n\r\nvar RANKCOLS=[{k:'rank',t:'#',l:true,s:false},{k:'branch',t:'Cabang',l:true,s:true},{k:'link',t:'Link Akun',l:true,s:false},\r\n {k:'views',t:'Views',s:true},{k:'er',t:'ER',s:true},{k:'videos',t:'Total Post Konten',s:true}];\r\n\r\nfunction renderRanking(branches,rangeLabel){\r\n var sr1=document.querySelectorAll('#seg-rank-view button');for(var i=0;i<sr1.length;i++)sr1[i].classList.toggle('active',sr1[i].getAttribute('data-rv')===state.rankView);\r\n var sr2=document.querySelectorAll('#seg-rank-metric button');for(i=0;i<sr2.length;i++)sr2[i].classList.toggle('active',sr2[i].getAttribute('data-rm')===state.rankMetric);\r\n $('seg-rank-metric').style.display=state.rankView==='timeline'?'inline-flex':'none';\r\n if(state.rankView==='timeline'){$('rank-panel-title').textContent='\ud83c\udfc6 Ranking cabang \u2014 timeline';renderRankingTimeline();}\r\n else{$('rank-panel-title').textContent='\ud83c\udfc6 Ranking cabang';renderRankingSummary(branches,rangeLabel);}\r\n}\r\n\r\nfunction bucketLabelMonth(k){var p=k.split('-');return new Date(+p[0],+p[1]-1,1).toLocaleDateString('id-ID',{month:'short',year:'numeric'});}\r\n\r\nfunction buildRankingTimeline(){\r\n var months=availableMonths(),MAXCOLS=12,capped=months.length>MAXCOLS,shownMonths=months.slice(-MAXCOLS);\r\n var byBranch={};\r\n Object.keys(state.master).forEach(function(u){var m=state.master[u];if(m.status!=='Aktif')return;\r\n  byBranch[u]={username:u,branch:m.nama,net:{},totalViews:0,totalPosts:0};});\r\n state.allVideos.forEach(function(v){\r\n  if(!byBranch[v.username])byBranch[v.username]={username:v.username,branch:v.branch,net:{},totalViews:0,totalPosts:0};\r\n  var d=new Date(v.postDate),key=d.getUTCFullYear()+'-'+String(d.getUTCMonth()+1).padStart(2,'0');\r\n  var b=byBranch[v.username];if(!b.net[key])b.net[key]={views:0,posts:0};\r\n  b.net[key].views+=v.views;b.net[key].posts+=1;b.totalViews+=v.views;b.totalPosts+=1;});\r\n return{months:shownMonths,capped:capped,branches:Object.keys(byBranch).map(function(k){return byBranch[k];})};\r\n}\r\n\r\nfunction renderRankingTimeline(){\r\n $('ranking-sub').textContent='seluruh histori data (bukan bulan terpilih)';\r\n var data=buildRankingTimeline(),metric=state.rankMetric,field=metric==='views'?'views':'posts';\r\n var sorted=data.branches.slice().sort(function(a,b){return metric==='views'?(b.totalViews-a.totalViews):(b.totalPosts-a.totalPosts);});\r\n var maxCell=1;sorted.forEach(function(r){data.months.forEach(function(k){var v=(r.net[k]||{})[field]||0;if(v>maxCell)maxCell=v;});});\r\n $('tbl-rank').className='pivot';\r\n var th=$('rank-thead'),h='<th class=\"l stick\">Cabang<\/th><th>Total '+(metric==='views'?'Views':'Post')+'<\/th>';\r\n data.months.forEach(function(k){h+='<th>'+esc(bucketLabelMonth(k))+'<\/th>';});\r\n th.innerHTML=h;\r\n var tb=$('rank-tbody');tb.innerHTML='';\r\n if(!sorted.length){tb.innerHTML='<tr><td colspan=\"'+(2+data.months.length)+'\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada data.<\/td><\/tr>';return;}\r\n sorted.forEach(function(r){\r\n  var row='<td class=\"l stick branch\">'+esc(r.branch)+'<\/td><td style=\"font-weight:800;color:var(--primary)\">'+nf(metric==='views'?r.totalViews:r.totalPosts)+'<\/td>';\r\n  data.months.forEach(function(k){var v=(r.net[k]||{})[field]||0;\r\n   if(!v){row+='<td class=\"zero\">\u00b7<\/td>';}\r\n   else{var ratio=v\/maxCell,al=(0.10+0.72*ratio).toFixed(2),col=ratio>0.55?'#fff':'#02439F';\r\n    row+='<td class=\"heat\" style=\"background:rgba(2,67,159,'+al+');color:'+col+'\">'+nf(v)+'<\/td>';}});\r\n  tb.insertAdjacentHTML('beforeend','<tr>'+row+'<\/tr>');});\r\n $('ranking-hint').innerHTML='Sel = total '+(metric==='views'?'views':'post')+' per bulan (warna makin pekat = makin banyak).'+(data.capped?' Menampilkan 12 bulan terakhir.':'');\r\n}\r\n\r\nfunction renderRankingSummary(branches,rangeLabel){\r\n $('tbl-rank').className='';\r\n $('ranking-hint').innerHTML='Views = total playCount video yang di-post dalam bulan terpilih. ER rata-rata = rata-rata ER semua video cabang tsb di bulan ini. Klik judul kolom untuk mengurutkan.';\r\n $('ranking-sub').textContent=rangeLabel;\r\n var sk=state.sortRank.key,sd=state.sortRank.dir;\r\n var sorted=branches.slice().sort(function(a,b){var x=a[sk],y=b[sk];\r\n  if(sk==='link'){x=a.username;y=b.username;}\r\n  if(typeof x==='string')return sd*x.localeCompare(y);return sd*((x||0)-(y||0));});\r\n var th=$('rank-thead');th.innerHTML='';\r\n RANKCOLS.forEach(function(c){var el=document.createElement('th');\r\n  el.textContent=c.t+(state.sortRank.key===c.k?(sd<0?' \u25bc':' \u25b2'):'');\r\n  el.className=(c.l?'l':'')+(state.sortRank.key===c.k?' sorted':'');\r\n  if(c.s)el.onclick=function(){if(state.sortRank.key===c.k)state.sortRank.dir*=-1;else{state.sortRank.key=c.k;state.sortRank.dir=(c.k==='branch')?1:-1;}render();};\r\n  th.appendChild(el);});\r\n var maxViews=Math.max.apply(null,branches.map(function(b){return b.views;}))||1;\r\n var body=$('rank-tbody');body.innerHTML='';\r\n sorted.forEach(function(b,i){var barW=Math.round((b.views||0)\/maxViews*100);var cls=erClass(b.er);\r\n  body.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+esc(b.branch)+'<\/td>'+\r\n   '<td class=\"l\">'+(b.username?'<a href=\"'+esc(tiktokUrl(b.username))+'\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--primary);font-weight:700\">@'+esc(b.username)+' \u2197<\/a>':'\u2014')+'<\/td>'+\r\n   '<td class=\"bar-cell\"><span class=\"bar-fill\" style=\"width:'+barW+'%\"><\/span><span class=\"bar-val\">'+nf(b.views)+'<\/span><\/td>'+\r\n   '<td class=\"er-cell '+cls+'\">'+pf(b.er)+'<\/td>'+\r\n   '<td style=\"font-weight:700\">'+nf(b.videos)+'<\/td><\/tr>');\r\n });\r\n}\r\n\r\nvar VIDCOLS=[{k:'rank',t:'#',l:true,s:false},{k:'branch',t:'Cabang',l:true,s:true},{k:'postDate',t:'Tgl Post',s:true},\r\n {k:'views',t:'Views',s:true},{k:'likes',t:'Likes',s:true},{k:'comments',t:'Komen',s:true},{k:'shares',t:'Share',s:true},\r\n {k:'er',t:'ER',s:true},{k:'url',t:'Buka',l:true,s:false}];\r\n\r\nfunction renderVideoTable(videos,rangeLabel){\r\n $('video-sub').textContent=rangeLabel+' \u2022 '+videos.length+' video';\r\n var withEr=videos.map(function(v){return Object.assign({},v,{er:v.views>0?((v.likes+v.comments+v.shares)\/v.views):0});});\r\n var sk=state.sortVideo.key,sd=state.sortVideo.dir;\r\n var sorted=withEr.sort(function(a,b){var x=a[sk],y=b[sk];\r\n  if(typeof x==='string')return sd*x.localeCompare(y);return sd*((x||0)-(y||0));});\r\n var th=$('video-thead');th.innerHTML='';\r\n VIDCOLS.forEach(function(c){var el=document.createElement('th');\r\n  el.textContent=c.t+(state.sortVideo.key===c.k?(sd<0?' \u25bc':' \u25b2'):'');\r\n  el.className=(c.l?'l':'')+(state.sortVideo.key===c.k?' sorted':'');\r\n  if(c.s)el.onclick=function(){if(state.sortVideo.key===c.k)state.sortVideo.dir*=-1;else{state.sortVideo.key=c.k;state.sortVideo.dir=(c.k==='branch')?1:-1;}render();};\r\n  th.appendChild(el);});\r\n var body=$('video-tbody');body.innerHTML='';\r\n if(!sorted.length){body.innerHTML='<tr><td colspan=\"9\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada video di rentang ini.<\/td><\/tr>';return;}\r\n sorted.forEach(function(v,i){var cls=erClass(v.er);\r\n  body.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+esc(clip(v.branch,22))+'<\/td>'+\r\n   '<td class=\"muted\">'+dmy(v.postDate)+'<\/td>'+\r\n   '<td style=\"font-weight:700\">'+nf(v.views)+'<\/td>'+\r\n   '<td class=\"muted\">'+nf(v.likes)+'<\/td>'+\r\n   '<td class=\"muted\">'+nf(v.comments)+'<\/td>'+\r\n   '<td class=\"muted\">'+nf(v.shares)+'<\/td>'+\r\n   '<td class=\"er-cell '+cls+'\">'+pf(v.er)+'<\/td>'+\r\n   '<td class=\"l\">'+(v.url?'<a href=\"'+esc(v.url)+'\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--primary);font-weight:700\">TikTok \u2197<\/a>':'\u2014')+'<\/td><\/tr>');\r\n });\r\n}\r\n\r\nvar BRIEFCOLS=[{k:'rank',t:'#',l:true,s:false},{k:'branch',t:'Cabang',l:true,s:true},{k:'am',t:'AM',l:true,s:true},\r\n {k:'views',t:'Views',s:true},{k:'url',t:'Link Content',l:true,s:false}];\r\n\r\nfunction renderBrief(){\r\n var segIds=['seg-batch','seg-batch-2'];\r\n if(!state.briefBatches.length){\r\n  segIds.forEach(function(id){var el=$(id);if(el)el.innerHTML='<span class=\"hint\" style=\"margin:0\">Belum ada data batch.<\/span>';});\r\n  $('brief-status').className='status info';$('brief-status').innerHTML='Belum ada submission form, atau Sheet ID Form Brief Konten belum diisi.';\r\n  ['bk-cabang','bk-views','bk-submit','bk-cekamna','bk-belum'].forEach(function(id){$(id).textContent='\u2014';});\r\n  $('brief-tbody').innerHTML='';$('brief-thead').innerHTML='';return;}\r\n var segHtml=state.briefBatches.map(function(b){return '<button data-batch=\"'+esc(b)+'\" class=\"'+(b===state.briefBatch?'active':'')+'\" onclick=\"TT.setBriefBatch(\\''+esc(b).replace(\/'\/g,\"\\\\'\")+'\\')\">'+esc(b)+'<\/button>';}).join('');\r\n segIds.forEach(function(id){var el=$(id);if(el)el.innerHTML=segHtml;});\r\n\r\n var rows=state.briefRows.filter(function(x){return x.batch===state.briefBatch;});\r\n var unmatched=rows.filter(function(x){return !x.matched;}).length;\r\n var ambiguous=rows.filter(function(x){return x.ambiguous;}).length;\r\n $('brief-status').className='status '+(unmatched||ambiguous?'info':'ok');\r\n $('brief-status').innerHTML='\u2713 '+rows.length+' submission di batch <b>'+esc(state.briefBatch)+'<\/b>.'+(unmatched?(' '+unmatched+' nama cabang perlu cek manual.'):'')+(ambiguous?(' '+ambiguous+' angka views ambigu (lihat console).'):'');\r\n $('brief-sub').textContent=state.briefBatch;\r\n\r\n var submittedKeys={};\r\n rows.forEach(function(x){submittedKeys[normBranchName(x.matched?x.branch:x.namaRaw)]=1;});\r\n var totalViewsBrief=rows.reduce(function(s,x){return s+(x.views||0);},0);\r\n var activeBranches=Object.keys(state.masterByName).filter(function(k){return state.masterByName[k].status==='Aktif';});\r\n var belumSubmit=activeBranches.filter(function(k){return !submittedKeys[k];}).length;\r\n $('bk-cabang').textContent=Object.keys(submittedKeys).length;\r\n $('bk-views').textContent=nf(totalViewsBrief);\r\n $('bk-submit').textContent=rows.length;\r\n $('bk-cekamna').textContent=unmatched;\r\n $('bk-belum').textContent=belumSubmit;\r\n\r\n \/\/ satu cabang bisa submit form berkali-kali di batch yang sama; buat ranking, ambil views TERBESAR aja per cabang (unique).\r\n var byBranch={};\r\n rows.forEach(function(x){var key=x.matched?normBranchName(x.branch):('#unmatched#'+normBranchName(x.namaRaw));\r\n  if(!byBranch[key]||x.views>byBranch[key].views)byBranch[key]=x;});\r\n var uniqueRows=Object.keys(byBranch).map(function(k){return byBranch[k];});\r\n\r\n var sk=state.sortBrief.key,sd=state.sortBrief.dir;\r\n var sorted=uniqueRows.slice().sort(function(a,b){var x=a[sk],y=b[sk];\r\n  if(typeof x==='string')return sd*x.localeCompare(y);return sd*((x||0)-(y||0));});\r\n var th=$('brief-thead');th.innerHTML='';\r\n BRIEFCOLS.forEach(function(c){var el=document.createElement('th');el.textContent=c.t+(state.sortBrief.key===c.k?(sd<0?' \u25bc':' \u25b2'):'');\r\n  el.className=(c.l?'l':'')+(state.sortBrief.key===c.k?' sorted':'');\r\n  if(c.s)el.onclick=function(){if(state.sortBrief.key===c.k)state.sortBrief.dir*=-1;else{state.sortBrief.key=c.k;state.sortBrief.dir=(c.k==='branch'||c.k==='am')?1:-1;}renderBrief();};\r\n  th.appendChild(el);});\r\n var tb=$('brief-tbody');tb.innerHTML='';\r\n if(!sorted.length){tb.innerHTML='<tr><td colspan=\"5\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada submission di batch ini.<\/td><\/tr>';renderAMBrief();return;}\r\n sorted.forEach(function(x,i){\r\n  tb.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+esc(x.branch)+'<\/td>'+\r\n   '<td class=\"l\">'+(x.matched?('<span class=\"muted\">'+esc(x.am||'\u2014')+'<\/span>'):'<span style=\"color:var(--destructive);font-weight:800\">NAMA AM TIDAK TERDETEKSI, FL SALAH INPUT \/ TYPO<\/span>')+'<\/td>'+\r\n   '<td style=\"font-weight:800\">'+nf(x.views)+(x.ambiguous?' <span class=\"muted\" title=\"format angka ambigu di form\">\u26a0<\/span>':'')+'<\/td>'+\r\n   '<td class=\"l\">'+(x.url?'<a href=\"'+esc(x.url)+'\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--primary);font-weight:700\">Buka \u2197<\/a>':'\u2014')+'<\/td><\/tr>');\r\n });\r\n renderAMBrief();\r\n}\r\n\r\n\/* ---- AM summary (dua tabel): 1) keaktifan (Aktif\/Pasif per AM) 2) ranking views per AM ---- *\/\r\nvar AM_WARN='NAMA AM TIDAK TERDETEKSI, FL SALAH INPUT \/ TYPO';\r\nfunction amCell(am){return am===AM_WARN?('<span style=\"color:var(--destructive);font-weight:800\">'+esc(am)+'<\/span>'):esc(am);}\r\n\r\nfunction groupByAM(items,getAm,getViews,getEng,isActive){\r\n var agg={};\r\n items.forEach(function(x){var am=(getAm(x)||'').trim()||AM_WARN;\r\n  if(!agg[am])agg[am]={am:am,n:0,active:0,pasif:0,views:0,eng:0};\r\n  var g=agg[am];g.n++;g.views+=getViews(x);g.eng+=getEng(x);\r\n  if(isActive(x))g.active++;else g.pasif++;});\r\n return Object.keys(agg).map(function(k){var g=agg[k];g.er=g.views>0?(g.eng\/g.views):0;g.pctPasif=g.n?Math.round(g.pasif\/g.n*100):0;return g;});\r\n}\r\n\r\nfunction renderAMTablePair(arrKeaktifan,arrViews,rangeLabel,ids,showER){\r\n var sub1=$(ids.sub1);if(sub1)sub1.textContent=rangeLabel;\r\n var arr1=arrKeaktifan.slice().sort(function(a,b){return b.pasif-a.pasif||b.n-a.n;});\r\n var th1=$(ids.thead1);th1.innerHTML='<th class=\"l\">AM<\/th><th>Jml Cabang<\/th><th>Post<\/th><th>Pasif<\/th><th>% Pasif<\/th>';\r\n var tb1=$(ids.tbody1);tb1.innerHTML='';\r\n if(!arr1.length){tb1.innerHTML='<tr><td colspan=\"5\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada data.<\/td><\/tr>';}\r\n arr1.forEach(function(g){var pc=g.pctPasif>=30?'style=\"color:var(--destructive);font-weight:800\"':(g.pctPasif>0?'style=\"color:#b45309;font-weight:700\"':'class=\"muted\"');\r\n  tb1.insertAdjacentHTML('beforeend','<tr><td class=\"l branch\">'+amCell(g.am)+'<\/td>'+\r\n   '<td style=\"font-weight:700\">'+nf(g.n)+'<\/td>'+\r\n   '<td style=\"color:var(--success);font-weight:700\">'+nf(g.active)+'<\/td>'+\r\n   '<td style=\"color:var(--destructive);font-weight:800\">'+nf(g.pasif)+'<\/td>'+\r\n   '<td '+pc+'>'+g.pctPasif+'%<\/td><\/tr>');});\r\n\r\n var sub2=$(ids.sub2);if(sub2)sub2.textContent=rangeLabel;\r\n var arr2=arrViews.slice().sort(function(a,b){return b.views-a.views;});\r\n var th2=$(ids.thead2);th2.innerHTML='<th class=\"l\">#<\/th><th class=\"l\">AM<\/th><th>Total Views<\/th>'+(showER?'<th>Rata\u00b2 ER<\/th>':'');\r\n var tb2=$(ids.tbody2);tb2.innerHTML='';\r\n if(!arr2.length){tb2.innerHTML='<tr><td colspan=\"'+(showER?4:3)+'\" class=\"muted\" style=\"padding:1rem;text-align:center\">Belum ada data.<\/td><\/tr>';}\r\n arr2.forEach(function(g,i){var cls=erClass(g.er);\r\n  tb2.insertAdjacentHTML('beforeend','<tr><td class=\"l rank\">'+(i+1)+'<\/td>'+\r\n   '<td class=\"l branch\">'+amCell(g.am)+'<\/td>'+\r\n   '<td style=\"font-weight:800\">'+nf(g.views)+'<\/td>'+\r\n   (showER?('<td class=\"er-cell '+cls+'\">'+pf(g.er)+'<\/td>'):'')+'<\/tr>');});\r\n}\r\n\r\nfunction renderAMMain(branches,rangeLabel){\r\n var arr=groupByAM(branches,function(b){return b.am;},function(b){return b.views;},function(b){return b.engSum;},function(b){return b.videos>0;});\r\n renderAMTablePair(arr,arr,rangeLabel,{sub1:'am1-sub',thead1:'am1-thead',tbody1:'am1-tbody',sub2:'am2-sub',thead2:'am2-thead',tbody2:'am2-tbody'},true);\r\n}\r\n\r\nfunction renderAMBrief(){\r\n var rows=state.briefRows.filter(function(x){return x.batch===state.briefBatch;});\r\n \/\/ dedup: satu cabang yang submit berkali-kali cuma keitung sekali (views terbesar), biar gak dobel di ranking AM.\r\n var byBranch={};\r\n rows.forEach(function(x){var key=x.matched?normBranchName(x.branch):('#unmatched#'+normBranchName(x.namaRaw));\r\n  if(!byBranch[key]||x.views>byBranch[key].views)byBranch[key]=x;});\r\n var uniqueRows=Object.keys(byBranch).map(function(k){return byBranch[k];});\r\n \/\/ Tabel 1 (keaktifan submit): dari roster Master AM, biar 'belum submit' akurat (bukan cuma yg keitung dari baris submit)\r\n var submittedKeys={};\r\n uniqueRows.forEach(function(x){if(x.matched)submittedKeys[normBranchName(x.branch)]=1;});\r\n var roster=(state.masterRecs||[]).filter(function(r){return r.status==='Aktif';});\r\n var arr1=groupByAM(roster,function(r){return r.am;},function(){return 0;},function(){return 0;},\r\n  function(r){return !!submittedKeys[normBranchName(r.nama)];});\r\n \/\/ Tabel 2 (ranking views): AM ditarik dari Master AM juga (via nama cabang yg matched), bukan dari kolom \"Nama AM\" isian form\r\n var arr2=groupByAM(uniqueRows,function(x){\r\n   if(!x.matched)return AM_WARN;\r\n   var mRec=state.masterByName[normBranchName(x.branch)];\r\n   return mRec?(mRec.am||AM_WARN):AM_WARN;\r\n  },function(x){return x.views;},function(){return 0;},function(){return true;});\r\n renderAMTablePair(arr1,arr2,state.briefBatch||'',{sub1:'bam1-sub',thead1:'bam1-thead',tbody1:'bam1-tbody',sub2:'bam2-sub',thead2:'bam2-thead',tbody2:'bam2-tbody'},false);\r\n}\r\n\r\nfunction syncControls(){\r\n var tabs=document.querySelectorAll('#tabs button');for(var i=0;i<tabs.length;i++)tabs[i].classList.toggle('active',tabs[i].getAttribute('data-tab')===state.tab);\r\n ['ringkasan','ranking','video','brief','amsummary'].forEach(function(p){var el=$('pane-'+p);if(el)el.style.display=(state.tab===p)?'block':'none';});\r\n if(state.selectedMonth&&$('sel-month').value!==state.selectedMonth)$('sel-month').value=state.selectedMonth;\r\n}\r\n\r\nwindow.TT={\r\n load:load,\r\n render:function(){savePrefs();if(state.allVideos.length)render();else syncControls();},\r\n setTab:function(t){state.tab=t;savePrefs();syncControls();},\r\n setMonth:function(ym){state.selectedMonth=ym;savePrefs();if(state.allVideos.length)render();else syncControls();},\r\n setRankView:function(v){state.rankView=v;if(state.allVideos.length)renderRanking(aggregateByBranch(videosInMonth()),monthLabel(state.selectedMonth));},\r\n setRankMetric:function(m){state.rankMetric=m;if(state.allVideos.length)renderRanking(aggregateByBranch(videosInMonth()),monthLabel(state.selectedMonth));},\r\n setBriefBatch:function(b){state.briefBatch=b;renderBrief();}\r\n};\r\n\r\nloadPrefs();syncControls();load();\r\n})();\r\n<\/script>\r\n<\/body>\r\n<\/html>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"disabled","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"disabled","ast-disable-related-posts":"disabled","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2511","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Julia Afildah","author_link":"https:\/\/pandaigadai.com\/blog\/author\/julia-afildah\/"},"uagb_comment_info":0,"uagb_excerpt":null,"_links":{"self":[{"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/pages\/2511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/comments?post=2511"}],"version-history":[{"count":2,"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/pages\/2511\/revisions"}],"predecessor-version":[{"id":2513,"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/pages\/2511\/revisions\/2513"}],"wp:attachment":[{"href":"https:\/\/pandaigadai.com\/blog\/wp-json\/wp\/v2\/media?parent=2511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}