1import{m as ye,s as he}from"./runtime-dom.esm-bundler-9q51YtTy.js";import{a as we,h as xe,l as _e,r as A}from"./index.esm-A6bOPKe3.js";import{a as I,S as w}from"./bootstrap-icons-C1NuXDaz.js";import{d as Z}from"./debounce-Bx-Cpha9.js";import Se from"./StatsHeader-D7mNXmRy.js";import Ce from"./Filters-DT01N9f7.js";import Be from"./CustomerList-Egpej-G0.js";import{M as Pe}from"./ModernPagination-e-jaSroL.js";import{U as Te}from"./UsageBadge-BeIpi9Kv.js";import{aJ as r,o as $e,bi as Ae,at as Ie,ay as je,aB as l,r as i,z as N,b8 as Q,s as t,bp as Me,F as L,aL as X,a$ as v,y as m,q as d,p as ee,ak as q,am as te,bn as Oe,x as Ee}from"./runtime-core.esm-bundler-CCYdSbkE.js";import"./debounce-BLd03f-U.js";import"./MobileFilterSheet-Cgx1Qe8p.js";import"./dayjs.min-D1twRVhq.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const Ue={class:"container-fluid p-3 p-md-4"},Fe={class:"d-flex justify-content-between align-items-center mb-2"},Ve=["value"],Ne={class:"card border-0 shadow-sm"},De={class:"card-header bg-white border-0 py-2 mx-2"},ze={key:0,class:"alert alert-warning d-flex align-items-center mb-3 text-dark shadow-sm",role:"alert"},Le={class:"d-flex flex-column flex-md-row justify-content-between align-items-start gap-3"},Re={class:"flex-grow-1"},Ye={class:"mb-2 mb-md-0"},He={class:"d-flex flex-wrap align-items-center gap-2 w-100 w-md-auto justify-content-start justify-content-md-end"},Ke={class:"fw-bold text-dark me-2 d-flex align-items-center",style:{"font-size":"0.8rem","letter-spacing":"0.5px"}},qe={key:0,class:"fw-bold text-white ms-auto",style:{"font-size":"0.6rem","user-select":"none","margin-right":"2px"}},Ge={key:1,class:"fw-bold text-white me-auto",style:{"font-size":"0.6rem","user-select":"none","margin-left":"2px"}},Je=["disabled"],We={key:1,class:"d-flex align-items-center gap-2 flex-wrap flex-fill flex-md-grow-0"},Ze={class:"badge bg-primary rounded-pill px-3 py-2 border",style:{"font-size":"0.8rem"}},Qe={class:"dropdown"},Xe={class:"dropdown-menu shadow border-0"},et={key:0},tt={key:1},at={key:2},nt={key:3},st={key:4},lt={key:5},it={key:2,class:"d-flex gap-2 align-items-center flex-fill flex-md-grow-0 justify-content-end"},ot={key:1,disabled:"",class:"btn btn-primary btn-sm fw-bold px-3 opacity-50 w-100",style:{color:"#ffffff !important",cursor:"not-allowed",height:"32px",display:"inline-flex","align-items":"center","justify-content":"center"},title:"Limit customer tercapai. Upgrade plan Anda."},rt={class:"card-body"},ut={class:"modal-dialog modal-lg"},dt={class:"modal-content"},ct={class:"modal-header"},mt={class:"modal-body"},ft={key:0},pt={class:"mb-3"},gt={class:"d-flex justify-content-between align-items-center mt-3"},vt=["disabled"],bt={key:0,class:"spinner-border spinner-border-sm me-1"},kt={key:1},yt={class:"alert alert-success py-2 mb-3 d-flex justify-content-between align-items-center"},ht={key:0,class:"badge bg-danger"},wt={class:"table-responsive",style:{"max-height":"300px"}},xt={class:"table table-sm table-bordered"},_t={key:0,class:"badge bg-success"},St=["title"],Ct={class:"d-flex justify-content-between align-items-center mt-3"},Bt=["disabled"],Pt={key:0,class:"spinner-border spinner-border-sm me-1"},Lt={__name:"Index",props:{initialCustomers:[Object,Array],initialStats:Object,packages:Array,routers:Array,areas:Array,limit_info:Object},setup(u){const T=r(!0),ae=async(a,e)=>{T.value=e;try{await I.post(x("settings.update"),{mikrotik_webhook_enabled:e?1:0}),w.fire({toast:!0,position:"top-end",icon:"success",title:`Realtime updates ${e?"Diaktifkan":"Dinonaktifkan"}`,showConfirmButton:!1,timer:2e3})}catch(n){console.error("Failed to update webhook toggle",n)}},G=we(),S=$e(()=>G.props.auth?.user?.can||{}),x=(a,e={})=>{try{if(typeof window<"u"&&window.route)return window.route(a,e);const n=G.props.ziggy;if(!n||!n.routes||!n.routes[a])return console.warn(`Route ${a} not found in Ziggy`),"#";let o=n.routes[a].uri;return Object.keys(e).forEach(f=>{o=o.replace(`{${f}}`,e[f]),o=o.replace(`{${f}?}`,e[f]||"")}),(n.url||"")+"/"+o.replace(/^\//,"")}catch(n){return console.error(`Error resolving route ${a}:`,n),"#"}},ne=u,D=r([]),se=r(!0),j=r(!1),y=r(1),R=r(1),M=r({from:0,to:0,total:0}),z=r(15);let C=null;const Y=r(ne.initialStats||{total:0,online:0,offline:0,suspended:0,terminated:0,free:0}
1),s=r({search:"",status:"",online_status:"",type:"",package_id:"",router_id:"",area_id:"",date_from:"",date_to:"",sort:""}),O=r(!1),E=r(1),U=r(null),b=r(null),B=r(!1);r([]),r(null);const le=r(null),p=r([]),ie=a=>{p.value=a},F=a=>{if(p.value.length===0)return;let e="",n="",o="",f="#0d6efd";a==="delete"?(e="Hapus Pelanggan Terpilih?",n=`Anda yakin ingin menghapus ${p.value.length} pelanggan secara permanen dari database dan MikroTik?`,o="Ya, Hapus Semua!",f="#dc3545"):a==="active"?(e="Aktifkan Pelanggan Terpilih?",n=`Anda yakin ingin mengaktifkan ${p.value.length} pelanggan terpilih?`,o="Ya, Aktifkan!",f="#198754"):a==="free"?(e="Set Pelanggan Terpilih ke Status Free?",n=`Anda yakin ingin mengubah ${p.value.length} pelanggan terpilih menjadi status Free (Fasum/Keluarga)? Pelanggan ini akan dikecualikan dari tagihan bulanan namun koneksi internet tetap aktif.`,o="Ya, Set Free!",f="#0dcaf0"):a==="terminated"?(e="Nonaktifkan Pelanggan Terpilih?",n=`Anda yakin ingin me-nonaktifkan ${p.value.length} pelanggan terpilih? (Akun Secret di router MikroTik akan dihapus & tagihan dihentikan)`,o="Ya, Nonaktifkan!",f="#212529"):a==="suspended"&&(e="Isolir Pelanggan Terpilih?",n=`Anda yakin ingin meng-isolir ${p.value.length} pelanggan terpilih pada MikroTik?`,o="Ya, Isolir!",f="#ffc107"),w.fire({title:e,text:n,icon:a==="delete"?"warning":"question",showCancelButton:!0,confirmButtonColor:f,cancelButtonColor:"#6c757d",confirmButtonText:o,cancelButtonText:"Batal"}).then(k=>{k.isConfirmed&&A.post(x("customers.bulk-action"),{ids:p.value,action:a},{preserveScroll:!0,onSuccess:()=>{p.value=[],g(y.value),$()}})})},g=async(a=1)=>{if(!j.value){C&&(clearInterval(C),C=null),j.value=!0;try{const e=await I.get(x("customers.ajax.list"),{params:{page:a,status:s.value.status,online_status:s.value.online_status,type:s.value.type,search:s.value.search,package_id:s.value.package_id,router_id:s.value.router_id,area_id:s.value.area_id,date_from:s.value.date_from,date_to:s.value.date_to,sort:s.value.sort,per_page:z.value}});if(e.data&&e.data.data&&(D.value=e.data.data,p.value=[],e.data.pagination)){const n=e.data.pagination;y.value=n.current_page,R.value=n.last_page,M.value={from:n.from||0,to:n.to||0,total:n.total||0}}}catch(e){console.error("Fetch customers error:",e)}finally{j.value=!1,$(),ke()}}},oe=a=>{a>=1&&a<=R.value&&g(a)},re=a=>{z.value=a,g(1)},ue=a=>{a.type==="clear"?(s.value.status="",s.value.online_status=""):a.type==="online_status"?(s.value.online_status=a.value,s.value.status=""):a.type==="status"&&(s.value.status=a.value,s.value.online_status=""),g(1)},de=async a=>{confirm(`â ï¸ Hapus customer: ${a.name} (${a.customer_code})? 2 3Customer akan dihapus dari database dan Mikrotik.`)&&await A.post("/customers/"+a.id,{_method:"DELETE"},{preserveScroll:!0,onSuccess:()=>{g(y.value)},onError:e=>{alert("Gagal menghapus customer: "+JSON.stringify(e))}})},ce=async a=>{const{value:e}=await w.fire({title:"Suspend Customer",text:`Masukkan alasan isolir untuk ${a.name}`,input:"select",inputOptions:{Maintenance:"Maintenance (Perbaikan/Gangguan)",Moving:"Moving (Pindah Alamat)","Customer Request":"Permintaan Customer","Payment Issues":"Keterlambatan Pembayaran",Other:"Lainnya"},inputPlaceholder:"Pilih alasan suspend",showCancelButton:!0,confirmButtonColor:"#ffc107",cancelButtonColor:"#6c757d",confirmButtonText:"Ya, Suspend!",cancelButtonText:"Batal",inputValidator:n=>{if(!n)return"Anda harus memilih alasan suspend!"}});e&&A.post(`/customers/${a.id}/suspend`,{suspend_reason:e},{preserveScroll:!0,onSuccess:()=>{g(y.value)}})},me=async a=>{let e="Aktifkan Customer?",n=`Apakah Anda yakin ingin mengaktifkan kembali internet ${a.name}?`,o="Ya, Aktifkan!",f="#198754",k=!1;if(a.latest_unpaid_invoice?(e="Bayar & Aktifkan Customer?",n=`Customer memiliki tagihan belum lunas (${a.latest_unpaid_invoice.invoice_number} - Rp ${Number(a.latest_unpaid_invoice.total_amount).toLocaleString("id-ID")}). 4 5Aksi ini akan menandai invoice LUNAS dan mengaktifkan internet pelanggan.`,o="Ya, Bayar & Aktifkan!"):a.status==="terminated"&&(e="Aktifkan Kembali Pelanggan Nonaktif?",n="Pelanggan ini berstatus Nonaktif (Terminated). Mengaktifkan kembali akan membuat ulang Secret & Profil di router MikroTik.",k=!0),k){const h=await w.fire({title:e,text:n,icon:"question",showCancelButton:!0,showDenyButton:!0,confirmButtonColor:f,denyButtonColor:"#0dcaf0",cancelButtonColor:"#6c757d",confirmButtonText:"Aktifkan + Restore MikroTik",denyButtonText:"Aktifkan Billing Saja",cancelButtonText:"Batal"});h.isConfirmed?A.post(`/customers/${a.id}/activate`,{},{preserveScroll:!0,onSuccess:()=>g(y.value)}):h.isDenied&&A.post(`/customers/${a.id}/activate-billing`,{},{preserveScroll:!0,onSuccess:()=>g(y.value)})}else(await w.fire({title:e,text:n,icon:a.latest_unpaid_invoice?"warning":"question",showCancelButton:!0,confirmButtonColor:f,cancelButtonColor:"#6c757d",confirmButtonText:o,cancelButtonText:"Batal"})).isConfirmed&&A.post(`/customers/${a.id}/activate`,{},{preserveScroll:!0,onSuccess:()=>g(y.value)})},fe=()=>{window.location.href=x("customers.export.csv",s.value)},pe=a=>{U.value=a.target.files[0]},ge=async()=>
5{if(!U.value)return;B.value=!0;const a=new FormData;a.append("file",U.value);try{const e=await I.post(x("customers.import.preview"),a,{headers:{"Content-Type":"multipart/form-data"}});e.data&&e.data.success?(b.value=e.data,E.value=2):w.fire("Error",e.data.message||"Gagal membaca file CSV","error")}catch(e){w.fire("Error",e.response?.data?.message||"Terjadi kesalahan saat upload","error")}finally{B.value=!1}},ve=async()=>{if(!(!b.value||!b.value.temp_key)){B.value=!0;try{const a=await I.post(x("customers.import.process"),{temp_key:b.value.temp_key});a.data&&a.data.success?(w.fire({icon:"success",title:"Import Berhasil!",text:`${a.data.imported_count||0} customer berhasil diimport.`,confirmButtonColor:"#198754"}),O.value=!1,g(1),$(),E.value=1,U.value=null,b.value=null):w.fire("Gagal",a.data.message||"Import gagal","error")}catch(a){w.fire("Error",a.response?.data?.message||"Terjadi kesalahan saat import","error")}finally{B.value=!1}}};Ae(s,Z(()=>{try{const a=Object.fromEntries(Object.entries(s.value).filter(([,e])=>e!==""));Object.keys(a).length>0?(sessionStorage.setItem("customer_filters",JSON.stringify(s.value)),sessionStorage.setItem("customer_page",y.value)):(sessionStorage.removeItem("customer_filters"),sessionStorage.removeItem("customer_page"))}catch{}g(1)},300),{deep:!0});let V=null;const $=async()=>{try{const a=await I.get(x("customers.ajax.stats"),{params:{search:s.value.search,status:s.value.status,online_status:s.value.online_status,type:s.value.type,package_id:s.value.package_id,router_id:s.value.router_id,area_id:s.value.area_id}});if(a.data&&(a.data.stats||a.data.data)){const e=a.data.stats||a.data.data;e&&(Y.value={total:e.total||0,online:e.online||0,offline:e.offline||0,suspended:e.suspended||0,terminated:e.terminated||0,free:e.free||0,online_percentage:e.online_percentage||0,offline_percentage:e.offline_percentage||0,suspended_percentage:e.suspended_percentage||0,terminated_percentage:e.terminated_percentage||0,free_percentage:e.free_percentage||0})}}catch(a){console.error("Stats polling error",a)}},be=Z($,3e3),ke=()=>{C&&clearInterval(C),V&&clearInterval(V),C=setInterval(()=>{j.value||I.get(x("customers.ajax.list"),{params:{page:y.value,status:s.value.status,online_status:s.value.online_status,type:s.value.type,search:s.value.search,package_id:s.value.package_id,router_id:s.value.router_id,area_id:s.value.area_id,sort:s.value.sort,per_page:z.value}}).then(a=>{a.data&&a.data.data&&(D.value=a.data.data,a.data.pagination&&(M.value.total=a.data.pagination.total))}).catch(a=>console.error("Polling error",a))},15e3),V=setInterval(()=>{$()},6e4)},J=a=>{const e=a.detail;if(!e)return;be();const n=e.is_online,o=D.value,k=(h=>{const _=h.pppoe_username?String(h.pppoe_username).toLowerCase():null,c=_?_.split("@")[0]:null;return o.find(P=>{if(h.customer_id&&String(P.id)==String(h.customer_id))return!0;if(_){const H=W=>{if(!W)return!1;const K=String(W).toLowerCase();return K===_||K===c||K.split("@")[0]===c};return H(P.customer_mikrotik_username)||H(P.username)||H(P.pppoe_username)}return!1})})(e);if(k){const h=k.is_online===1,_=!!n;if(k.is_online=_?1:0,_?k.offline_since=null:k.offline_since||(k.offline_since=new Date().toISOString()),h!==_){const c=Y.value;_?(c.online=Math.max(0,(c.online||0)+1),c.offline=Math.max(0,(c.offline||0)-1)):(c.online=Math.max(0,(c.online||0)-1),c.offline=Math.max(0,(c.offline||0)+1));const P=c.total||1;c.online_percentage=Math.round(c.online/P*1e3)/10,c.offline_percentage=Math.round(c.offline/P*1e3)/10}}};return Ie(()=>{try{const a=sessionStorage.getItem("customer_filters");if(a){const e=JSON.parse(a);Object.assign(s.value,e)}}catch{}g(),$(),window.addEventListener("customer-status-changed",J)}),je(()=>{C&&clearInterval(C),V&&clearInterval(V),window.removeEventListener("customer-status-changed",J)}),(a,e)=>(l(),i(L,null,[N(Q(xe),{title:"Customers"}),t("div",Ue,[t("div",Fe,[e[15]||(e[15]=t("div",null,[t("h4",{class:"text-dark fw-bold mb-0",style:{"font-size":"1.25rem","line-height":"1.3"}},"Customers"),t("p",{class:"text-muted mb-0",style:{"font-size":"0.8rem",opacity:"0.7"}},"Manage your PPPoE & Hotspot customers")],-1)),Me(t("select",{class:"form-select form-select-sm fw-semibold","onUpdate:modelValue":e[0]||(e[0]=n=>s.value.router_id=n),onChange:e[1]||(e[1]=n=>g(1)),style:{"max-width":"180px",height:"36px","font-size":"0.85rem"}},[e[14]||(e[14]=t("option",{value:""},"ð Semua Router",-1)),(l(!0),i(L,null,X(u.routers,n=>(l(),i("option",{key:n.id,value:n.id},v(n.name),9,Ve))),128))],544),[[ye,s.value.router_id]])]),N(Se,{stats:Y.value,onFilterStatus:ue},null,8,["stats"]),t("div",Ne,[t("div",De,[u.limit_info&&u.limit_info.customers.remaining<=0?(l(),i("div",ze,[e[17]||(e[17]=t("i",{class:"bi bi-exclamation-triangle-fill flex-shrink-0 me-2 text-warning"},null,-1)),t("div",null,[t("strong",null,"Limit customer plan Anda sudah penuh ("+v(u.limit_info.customers.usage)+"/"+v(u.limit_info.customers.max)+").",1),e[16]||(e[16]=t("span",{class:"ms-1"},[m("Upgrade plan untuk menambah customer. "),t("a",{href:"/subscription",class:"alert-link text-decoration-underline"},"Upgrade Sekarang")],-1))])])):d("",!0),t("div",Le,[t("div",Re,[e[18]||(e[18]=t("h6",{class:"mb-1 fw-bold text-primary",style:{"font-size":"0.9rem"}},[t("i",{class:"bi bi-people me-2"}),m("Daftar Customer ")],-1)),t("div",Ye,[u.limit_info&&u.limit_info.customers?(l(),ee(Te,{key:0,t
5ype:"customers",label:"Customers","limit-info":u.limit_info.customers},null,8,["limit-info"])):d("",!0)])]),t("div",He,[t("div",{class:"d-flex align-items-center rounded-pill px-3 py-1 me-2",style:{"background-color":"#adb5bd",height:"32px",cursor:"pointer"},onClick:e[2]||(e[2]=n=>ae(null,!T.value))},[t("span",Ke,[e[19]||(e[19]=m(" REALTIME ",-1)),t("i",{class:q(["bi",se.value?"bi-lightning-charge-fill text-warning":"bi-exclamation-triangle-fill text-danger"]),style:{"margin-left":"3px"}},null,2)]),t("div",{class:"rounded-pill position-relative d-flex align-items-center justify-content-between px-1 shadow-sm",style:te({width:"50px",height:"22px",backgroundColor:T.value?"#198754":"#dc3545",transition:"all 0.3s ease"})},[T.value?d("",!0):(l(),i("span",qe,"OFF")),T.value?(l(),i("span",Ge,"ON")):d("",!0),t("div",{class:"bg-white rounded-circle position-absolute",style:te({width:"16px",height:"16px",top:"3px",left:T.value?"31px":"3px",transition:"all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1)"})},null,4)],4)]),S.value.create_customer?(l(),i("button",{key:0,type:"button",onClick:e[3]||(e[3]=n=>O.value=!0),class:q(["btn btn-info btn-sm fw-bold px-3 flex-fill flex-md-grow-0",{"opacity-50":u.limit_info&&u.limit_info.customers.remaining<=0}]),disabled:u.limit_info&&u.limit_info.customers.remaining<=0,style:{color:"#ffffff !important"}},[...e[20]||(e[20]=[t("i",{class:"bi bi-upload me-1"},null,-1),t("span",{class:"d-none d-sm-inline"},"Import",-1)])],10,Je)):d("",!0),t("button",{type:"button",onClick:fe,class:"btn btn-success btn-sm fw-bold px-3 flex-fill flex-md-grow-0",style:{color:"#ffffff !important"}},[...e[21]||(e[21]=[t("i",{class:"bi bi-download me-1"},null,-1),t("span",{class:"d-none d-sm-inline"},"Export",-1)])]),p.value.length>0?(l(),i("div",We,[t("span",Ze,v(p.value.length)+" Terpilih ",1),t("div",Qe,[e[28]||(e[28]=t("button",{class:"btn btn-secondary btn-sm dropdown-toggle fw-bold",type:"button","data-bs-toggle":"dropdown","aria-expanded":"false",style:{height:"32px"}}," Tindakan Massal ",-1)),t("ul",Xe,[S.value.activate_customer?(l(),i("li",et,[t("button",{onClick:e[4]||(e[4]=n=>F("active")),class:"dropdown-item py-2 text-success fw-semibold"},[...e[22]||(e[22]=[t("i",{class:"bi bi-check-circle-fill me-2"},null,-1),m("Aktifkan ",-1)])])])):d("",!0),S.value.activate_customer?(l(),i("li",tt,[t("button",{onClick:e[5]||(e[5]=n=>F("free")),class:"dropdown-item py-2 text-info fw-semibold"},[...e[23]||(e[23]=[t("i",{class:"bi bi-gift-fill me-2"},null,-1),m("Set ke Free (Fasum/Keluarga) ",-1)])])])):d("",!0),S.value.activate_customer?(l(),i("li",at,[t("button",{onClick:e[6]||(e[6]=n=>F("terminated")),class:"dropdown-item py-2 text-dark fw-semibold"},[...e[24]||(e[24]=[t("i",{class:"bi bi-x-circle-fill me-2"},null,-1),m("Nonaktifkan (Terminated) ",-1)])])])):d("",!0),S.value.suspend_customer?(l(),i("li",nt,[t("button",{onClick:e[7]||(e[7]=n=>F("suspended")),class:"dropdown-item py-2 text-warning fw-semibold"},[...e[25]||(e[25]=[t("i",{class:"bi bi-pause-circle-fill me-2"},null,-1),m("Isolir (Suspend) ",-1)])])])):d("",!0),S.value.delete_customer?(l(),i("li",st,[...e[26]||(e[26]=[t("hr",{class:"dropdown-divider"},null,-1)])])):d("",!0),S.value.delete_customer?(l(),i("li",lt,[t("button",{onClick:e[8]||(e[8]=n=>F("delete")),class:"dropdown-item py-2 text-danger fw-semibold"},[...e[27]||(e[27]=[t("i",{class:"bi bi-trash-fill me-2"},null,-1),m("Hapus Permanen ",-1)])])])):d("",!0)])]),t("button",{onClick:e[9]||(e[9]=n=>p.value=[]),class:"btn btn-outline-secondary btn-sm fw-bold",style:{height:"32px"}}," Batal ")])):(l(),i("div",it,[S.value.create_customer?(l(),i(L,{key:0},[u.limit_info&&u.limit_info.customers.remaining<=0?(l(),i("button",ot,[...e[30]||(e[30]=[t("i",{class:"bi bi-lock-fill me-1"},null,-1),m("Limit ",-1)])])):(l(),ee(Q(_e),{key:0,href:x("customers.create"),class:"btn btn-primary btn-sm fw-bold px-3 w-100",style:{color:"#ffffff !important",height:"32px",display:"inline-flex","align-items":"center","justify-content":"center"}},{default:Oe(()=>[...e[29]||(e[29]=[t("i",{class:"bi bi-plus-lg me-1"},null,-1),t("span",{class:"d-none d-sm-inline"},"Tambah",-1),t("span",{class:"d-inline d-sm-none"},"Add",-1)])]),_:1},8,["href"]))],64)):d("",!0)]))])])]),t("div",rt,[N(Ce,{modelValue:s.value,"onUpdate:modelValue":e[10]||(e[10]=n=>s.value=n),packages:u.packages,routers:u.routers,areas:u.areas},null,8,["modelValue","packages","routers","areas"]),N(Be,{customers:D.value,loading:j.value,selected:p.value,"onUpdate:selected":ie,onDelete:de,onSuspend:ce,onActivate:me},null,8,["customers","loading","selected"]),N(Pe,{"current-page":y.value,"total-pages":R.value,from:M.value.from,to:M.value.to,total:M.value.total,"show-per-page":!0,"per-page":z.value,onPageChange:oe,onPerPageChange:re},null,8,["current-page","total-pages","from","to","total","per-page"])])]),O.value?(l(),i("div",{key:0,class:"modal fade show d-block",tabindex:"-1",style:{"background-color":"rgba(0,0,0,0.5)"},onClick:e[13]||(e[13]=he(n=>O.value=!1,["self"]))},[t("div",ut,[t("div",dt,[t("div",ct,[e[31]||(e[31]=t("h5",{class:"modal-title"},[t("i",{class:"bi bi-upload me-2"}),m("Import Customer dari CSV ")],-1)),t("button",{type:"button",class:"btn-close",onClick:e[11]||(e[11]=n=>O.value=!1)})]),t("div",mt,[E.value===1?(l(),i("div",ft,[t("div",pt,[e[32]||(e[32]=t("label",{class:"form-label fw-bold"},"Pilih File CSV",-1)),t("input",{type:"file",class:"form-control",ref_key:"fileInput",ref:le,accept:".csv",onChange:pe},null,544),e[33]||(e[33]=t("small",{class:"text-muted"},"Format yang didukung: CSV (Comma Separated Values)",-1))]),e[37]||(e[37]=Ee('<div class="alert alert-info"><h6><i class="bi bi-info-circle me-2"></i>Petunjuk Import:</h6><ul class="mb-0 ps-3"><li>Unduh template CSV terlebih dahulu untuk melihat format kolom yang benar.</li><li>Kolom wajib: <strong>Name, Status, Connection Type</strong>.</li><li>Untuk PPPoE, pastikan mengisi <strong>Username PPPoE</strong>.</li><li>Untuk Hotspot, pastikan mengisi <strong>Username Hotspot</strong>.</li></ul></div>',1)),t("div",gt,[e[36]||(e[36]=t("a",{href:"/customers/download-template",class:"btn btn-outline-secondary btn-sm"},[t("i",{class:"bi bi-download me-1"}),m("Unduh Template CSV ")],-1)),t("button",{class:"btn btn-primary btn-sm",disabled:!U.value||B.value,onClick:ge},[B.value?(l(),i("span",bt)):d("",!0),e[34]||(e[34]=m(" Preview Data ",-1)),e[35]||(e[35]=t("i",{class:"bi bi-arrow-right ms-1"},null,-1))],8,vt)])])):d("",!0),E.value===2&&b.value?(l(),i("div",kt,[t("div",yt,[t("span",null,[e[38]||(e[38]=m("Total Data Valid: ",-1)),t("strong",null,v(b.value.valid_count||0),1),m(" dari "+v(b.value.total||0)+" baris",1)]),b.value.invali
5d_count>0?(l(),i("span",ht,v(b.value.invalid_count)+" Error",1)):d("",!0)]),t("div",wt,[t("table",xt,[e[39]||(e[39]=t("thead",{class:"table-light"},[t("tr",null,[t("th",null,"#"),t("th",null,"Nama"),t("th",null,"Phone"),t("th",null,"Tipe"),t("th",null,"Username"),t("th",null,"Status")])],-1)),t("tbody",null,[(l(!0),i(L,null,X(b.value.rows,(n,o)=>(l(),i("tr",{key:o,class:q({"table-danger":!n.valid})},[t("td",null,v(o+1),1),t("td",null,v(n.name),1),t("td",null,v(n.phone||"-"),1),t("td",null,v(n.connection_type),1),t("td",null,v(n.username_pppoe||n.username_hotspot||"-"),1),t("td",null,[n.valid?(l(),i("span",_t,"Valid")):(l(),i("span",{key:1,class:"badge bg-danger",title:n.error},v(n.error),9,St))])],2))),128))])])]),t("div",Ct,[t("button",{class:"btn btn-outline-secondary btn-sm",onClick:e[12]||(e[12]=n=>E.value=1)},[...e[40]||(e[40]=[t("i",{class:"bi bi-arrow-left me-1"},null,-1),m("Kembali ",-1)])]),t("button",{class:"btn btn-success btn-sm",disabled:B.value||b.value.valid_count===0,onClick:ve},[B.value?(l(),i("span",Pt)):d("",!0),e[41]||(e[41]=m(" Proses Import Data ",-1))],8,Bt)])])):d("",!0)])])])])):d("",!0)])],64))}};export{Lt as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.