stat2025 commited on
Commit
4be4e6c
ยท
verified ยท
1 Parent(s): 26e04ff

Update app.js

Browse files
Files changed (1) hide show
  1. app.js +54 -24
app.js CHANGED
@@ -66,7 +66,6 @@ function normalizeText(s){
66
  function lettersOnly(ar){return(ar||"").replace(/[^A-Za-z\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\s]/g,"").replace(/\s{2,}/g," ").trim()}
67
  function alnumAr(s){return(s||"").replace(/[^0-9A-Za-z\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\s\-\._/]/g,"").replace(/\s{2,}/g," ").trim()}
68
  function digitsOnly(s){return(s||"").replace(/\D+/g,"")}
69
- function todayYMD(){const d=new Date();const y=d.getFullYear();const m=String(d.getMonth()+1).padStart(2,"0");const dd=String(d.getDate()).padStart(2,"0");return`${y}-${m}-${dd}`}
70
 
71
  const LABEL_FIXES=[
72
  [/(^|\n)\s*ู†ูˆุน\s*ุงู„ู…ุดูƒู„ู‡/gi,"$1ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"],
@@ -75,7 +74,7 @@ const LABEL_FIXES=[
75
  [/(^|\n)\s*ุฑู‚ู…\s*ุงู„ู‡ูˆูŠู‡/gi,"$1ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ"],
76
  [/(^|\n)\s*ุงู„ู…ู†ุทู‚ู‡/gi,"$1ุงู„ู…ู†ุทู‚ุฉ"],
77
  [/(^|\n)\s*ุงุณู…\s*ุงู„ู…ู†ุทู‚ุฉ/gi,"$1ุงู„ู…ู†ุทู‚ุฉ"],
78
- [/(^|\n)\s*ุงุณู…\s*ุงู„ู…ุณุญ/gi,"$1ุงู„ู…ุณุญ"],
79
  [/(^|\n)\s*ุงู„ู‡ุงุชู/gi,"$1ุฑู‚ู… ุงู„ุฌูˆุงู„"],
80
  [/(^|\n)\s*ุฌูˆุงู„/gi,"$1ุฑู‚ู… ุงู„ุฌูˆุงู„"]
81
  ];
@@ -104,7 +103,7 @@ function isTimeOnly(t){
104
  return a||b||c;
105
  }
106
  function isRelativeDatePhrase(t){
107
- return/(ุฃู…ุณ|ู…ู†\s*ุฃู…ุณ|ู…ู†\s*ุงู…ุณ|ุงู„ูŠูˆู…|ุบุฏู‹ุง|ุบุฏุง|ุจูƒุฑุฉ|ุจุนุฏ\s*ุจูƒุฑุฉ|ู‚ุจู„\s*\d+\s*(?:ุฏู‚ูŠู‚ุฉ|ุฏู‚ุงูŠู‚|ุณุงุน(?:ุฉ|ุงุช)|ูŠูˆู…|ุฃูŠุงู…)|ุงู„ุขู†|ุงู„ุญูŠู†|ู‚ุจู„\s*ุดูˆูŠ)/i.test(t);
108
  }
109
  function detectHijriDate(str){
110
  const t=normalizeText(str);
@@ -119,7 +118,7 @@ function normalizeDateOnly(raw){
119
  if(isTimeOnly(t)||isRelativeDatePhrase(t))return"";
120
  const hj=detectHijriDate(t);
121
  if(hj){const[gy,gm,gd]=hijriToGregorian(hj.hy,hj.hm,hj.hd);return`${String(gy).padStart(4,"0")}-${String(gm).padStart(2,"0")}-${String(gd).padStart(2,"0")}`}
122
- const m=t.match(/(\d{1,4})[\/\-](\d{1,2})[\/\-](\ุฏ{1,4})/);
123
  if(m){
124
  let a=+m[1],b=+m[2],c=+m[3],y,mo,d;
125
  if(String(m[1]).length===4){y=a;mo=b;d=c}
@@ -128,7 +127,7 @@ function normalizeDateOnly(raw){
128
  else if(c>31){y=c;mo=b;d=a}
129
  else{y=c;mo=b;d=a}
130
  if(y<100)y+=2000;
131
- if(mo>12&&d<=12){const tmp=mo;mo=d;d=tmp}
132
  if(mo<1||mo>12||d<1||d>31)return"";
133
  return`${String(y).padStart(4,"0")}-${String(mo).padStart(2,"0")}-${String(d).padStart(2,"0")}`
134
  }
@@ -154,7 +153,7 @@ function findBlockAfterLabel(text,labels,allLabels=START_LABELS){
154
  const esc=s=>s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');
155
  const lblAlt=labels.map(esc).join("|");
156
  const allAlt=allLabels.map(esc).join("|");
157
- const re=new RegExp(`(?:^|\\n)\\s*(?:${lblAlt})\\s*(?::|๏ผš|\\s)\\s*([\\s\\S]*?)(?=\\n\\s*(?:${allAlt})\\s*(?::|๏ผš|\\s)|$)`,"i");
158
  const m=hay.match(re);
159
  return m?m[1].trim():"";
160
  }
@@ -235,10 +234,11 @@ function parseTicketsWithExtras(raw,agentName,defaultRegion){
235
  if(!dev&&isValidNationalId(id))dev=id;
236
  if(!dev&&!id&&phone)dev=phone;
237
  if(!id&&isValidNationalId(dev))id=dev;
 
238
  return{
239
  "ุงู„ุชุตู†ูŠู":cls,
240
  "ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ":f["ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"]||"",
241
- "ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ":f["ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ"]||"",
242
  "ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ":f["ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ"]||"",
243
  "ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ":id,
244
  "ุฑู‚ู… ุงู„ุฌู‡ุงุฒ":dev,
@@ -247,7 +247,7 @@ function parseTicketsWithExtras(raw,agentName,defaultRegion){
247
  "ุงู„ู…ู†ุทู‚ุฉ":region,
248
  "ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ":agentName||"",
249
  "ุงู„ุญุงู„ุฉ":"ุชู… ุงู„ุญู„",
250
- "ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ":todayYMD()
251
  };
252
  });
253
  }
@@ -264,7 +264,7 @@ function buildTable(rows){
264
  const td=document.createElement("td");
265
  const base=DISPLAY_TO_BASE[col];
266
  td.dataset.base=base;
267
- let val=(col==="ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ")?(r["ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ"]||todayYMD()):(base?(r[base]||""):"");
268
  if(col==="ุงู„ุชุตู†ูŠู"){
269
  const span=document.createElement("span");
270
  span.className=`cat ${catClass(val||"")}`;
@@ -291,7 +291,7 @@ function readTable(){
291
  if(base==="ุงู„ุชุตู†ูŠู"){obj[base]=(td.querySelector("span")?.textContent||td.textContent||"").trim()}
292
  else{obj[base]=(td.textContent||"").trim()}
293
  });
294
- if(!obj["ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ"])obj["ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ"]=todayYMD();
295
  rows.push(obj);
296
  });
297
  return rows;
@@ -326,9 +326,12 @@ function validateCells(){
326
  const digits=val.replace(/\D/g,"");
327
  if(val&&!/^05\d{8}$/.test(digits)){invalid=true;if(!reason)reason="phone"}
328
  }
 
 
 
329
  td.classList.toggle("invalid",invalid);
330
  if(invalid){
331
- const msg=reason==="required"?"ุงู„ุญู‚ู„ ู…ุทู„ูˆุจ":reason==="id"?"ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ูŠุฌุจ ุฃู† ูŠุจุฏุฃ ุจู€ 1 ุฃูˆ 2 ูˆุทูˆู„ู‡ 10 ุฎุงู†ุงุช":reason==="phone"?"ุฑู‚ู… ุงู„ุฌูˆุงู„ ูŠุฌุจ ุฃู† ูŠุจุฏุฃ ุจู€ 05 ูˆุทูˆู„ู‡ 10 ุฎุงู†ุงุช":"ู‚ูŠู…ุฉ ุบูŠุฑ ุตุญูŠุญุฉ";
332
  td.setAttribute("title",msg);
333
  td.dataset.reason=reason;
334
  }else{
@@ -362,7 +365,19 @@ async function exportExcel(){
362
  const TEMPLATE_HEADERS=["ุงู„ุชุตู†ูŠู","ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ","ุงู„ู…ู†ุทู‚ุฉ","ุงุณู… ุงู„ู…ุณุญ","ุงุณู… ุงู„ู…ุดุบู„","ุฑู‚ู… ุงู„ุฌูˆุงู„","ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID","ุฑู‚ู… ุงู„ุฌู‡ุงุฒ","ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ","ุงู„ุญุงู„ุฉ","ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ"];
363
  const rows=readTable();
364
  if(!rows.length){toast("ู„ุง ูŠูˆุฌุฏ ุจูŠุงู†ุงุช ู„ุชุตุฏูŠุฑู‡ุง.");return}
365
- const mapRow=r=>({"ุงู„ุชุตู†ูŠู":r["ุงู„ุชุตู†ูŠู"]||"","ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ":r["ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"]||"","ุงู„ู…ู†ุทู‚ุฉ":r["ุงู„ู…ู†ุทู‚ุฉ"]||"","ุงุณู… ุงู„ู…ุณุญ":r["ุงู„ู…ุณุญ"]||"","ุงุณู… ุงู„ู…ุดุบู„":r["ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ"]||"","ุฑู‚ู… ุงู„ุฌูˆุงู„":(r["ุฑู‚ู… ุงู„ุฌูˆุงู„"]||"").toString(),"ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID":(r["ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ"]||"").toString(),"ุฑู‚ู… ุงู„ุฌู‡ุงุฒ":(r["ุฑู‚ู… ุงู„ุฌู‡ุงุฒ"]||"").toString(),"ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ":r["ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ"]||"","ุงู„ุญุงู„ุฉ":r["ุงู„ุญุงู„ุฉ"]||"ุชู… ุงู„ุญู„","ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ":r["ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ"]||""});
 
 
 
 
 
 
 
 
 
 
 
 
366
  const wb=new ExcelJS.Workbook();
367
  const ws=wb.addWorksheet("ุงู„ุชุฐุงูƒุฑ",{views:[{rightToLeft:true}]});
368
  const colWidths=[16,18,16,18,20,18,18,18,20,14,18];
@@ -377,8 +392,7 @@ async function exportExcel(){
377
  cell.border={top:{style:"thin",color:{argb:"FFCDD2E1"}},bottom:{style:"thin",color:{argb:"FFCDD2E1"}},left:{style:"thin",color:{argb:"FFE5E7EB"}},right:{style:"thin",color:{argb:"FFE5E7EB"}}};
378
  });
379
  const toTextCols=new Set(["ุฑู‚ู… ุงู„ุฌูˆุงู„","ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID","ุฑู‚ู… ุงู„ุฌู‡ุงุฒ"]);
380
- const rawRows=readTable();
381
- rawRows.forEach((r,idx)=>{
382
  const m=mapRow(r);
383
  const vals=TEMPLATE_HEADERS.map(h=>(m[h]??""));
384
  const row=ws.addRow(vals);
@@ -486,16 +500,36 @@ function updateThemeLabel(){
486
 
487
  function isUnlocked(){try{return localStorage.getItem("ticketParser_unlocked")==="1"}catch{return false}}
488
  function markUnlocked(){try{localStorage.setItem("ticketParser_unlocked","1")}catch{}}
 
 
 
 
489
  function showGate(){
490
  if(isUnlocked()){hideGate();return}
491
  const ov=document.getElementById("lockOverlay");
492
- if(ov){ov.style.display="flex";setTimeout(()=>{const p=document.getElementById("lockPass");if(p)p.focus()},0)}
 
 
 
 
493
  }
494
- function hideGate(){const ov=document.getElementById("lockOverlay");if(ov)ov.style.display="none"}
495
  function tryUnlock(){
496
- const p=document.getElementById("lockPass").value||"";
497
- if(ACCESS_PASSWORDS.includes(p)){markUnlocked();hideGate()}
498
- else{const m=document.getElementById("lockMsg");if(m){m.hidden=false;setTimeout(()=>m.hidden=true,1500)}}
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  }
500
 
501
  function init(){
@@ -507,12 +541,11 @@ function init(){
507
  const rawEl=document.getElementById("raw");
508
  const agentEl=document.getElementById("agentName");
509
  const regionEl=document.getElementById("regionDefault");
510
- const lockBtn=document.getElementById("lockBtn");
511
- const lockPass=document.getElementById("lockPass");
512
 
513
  rawEl.placeholder=SAMPLE;
514
 
515
  if(!isUnlocked())showGate();else hideGate();
 
516
 
517
  loadState();
518
 
@@ -548,9 +581,6 @@ function init(){
548
  else if(e.key==="Escape"){e.preventDefault();clearAll()}
549
  });
550
 
551
- lockBtn.addEventListener("click",tryUnlock);
552
- lockPass.addEventListener("keydown",e=>{if(e.key==="Enter")tryUnlock()});
553
-
554
  setButtonsEnabled(!!document.getElementById("tbody")?.children.length);
555
  updateThemeLabel();
556
  }
 
66
  function lettersOnly(ar){return(ar||"").replace(/[^A-Za-z\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\s]/g,"").replace(/\s{2,}/g," ").trim()}
67
  function alnumAr(s){return(s||"").replace(/[^0-9A-Za-z\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\s\-\._/]/g,"").replace(/\s{2,}/g," ").trim()}
68
  function digitsOnly(s){return(s||"").replace(/\D+/g,"")}
 
69
 
70
  const LABEL_FIXES=[
71
  [/(^|\n)\s*ู†ูˆุน\s*ุงู„ู…ุดูƒู„ู‡/gi,"$1ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"],
 
74
  [/(^|\n)\s*ุฑู‚ู…\s*ุงู„ู‡ูˆูŠู‡/gi,"$1ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ"],
75
  [/(^|\n)\s*ุงู„ู…ู†ุทู‚ู‡/gi,"$1ุงู„ู…ู†ุทู‚ุฉ"],
76
  [/(^|\n)\s*ุงุณู…\s*ุงู„ู…ู†ุทู‚ุฉ/gi,"$1ุงู„ู…ู†ุทู‚ุฉ"],
77
+ [/(^|\n)\ุณ*ุงุณู…\s*ุงู„ู…ุณุญ/gi,"$1ุงู„ู…ุณุญ"],
78
  [/(^|\n)\s*ุงู„ู‡ุงุชู/gi,"$1ุฑู‚ู… ุงู„ุฌูˆุงู„"],
79
  [/(^|\n)\s*ุฌูˆุงู„/gi,"$1ุฑู‚ู… ุงู„ุฌูˆุงู„"]
80
  ];
 
103
  return a||b||c;
104
  }
105
  function isRelativeDatePhrase(t){
106
+ return /(ุฃู…ุณ|ู…ู†\s*ุฃู…ุณ|ู…ู†\s*ุงู…ุณ|ุงู„ูŠูˆู…|ุบุฏู‹ุง|ุบุฏุง|ุจูƒุฑุฉ|ุจุนุฏ\s*ุจูƒุฑุฉ|ู‚ุจู„\s*\d+\s*(?:ุฏู‚ูŠู‚ุฉ|ุฏู‚ุงูŠู‚|ุณุงุน(?:ุฉ|ุงุช)|ูŠูˆู…|ุฃูŠุงู…)|ุงู„ุขู†|ุงู„ุญูŠู†|ู‚ุจู„\s*ุดูˆูŠ)/i.test(t);
107
  }
108
  function detectHijriDate(str){
109
  const t=normalizeText(str);
 
118
  if(isTimeOnly(t)||isRelativeDatePhrase(t))return"";
119
  const hj=detectHijriDate(t);
120
  if(hj){const[gy,gm,gd]=hijriToGregorian(hj.hy,hj.hm,hj.hd);return`${String(gy).padStart(4,"0")}-${String(gm).padStart(2,"0")}-${String(gd).padStart(2,"0")}`}
121
+ const m=t.match(/(\d{1,4})[\/\-](\d{1,2})[\/\-](\d{1,4})/);
122
  if(m){
123
  let a=+m[1],b=+m[2],c=+m[3],y,mo,d;
124
  if(String(m[1]).length===4){y=a;mo=b;d=c}
 
127
  else if(c>31){y=c;mo=b;d=a}
128
  else{y=c;mo=b;d=a}
129
  if(y<100)y+=2000;
130
+ if(mo>12&&ุฏ<=12){const tmp=mo;mo=d;d=tmp}
131
  if(mo<1||mo>12||d<1||d>31)return"";
132
  return`${String(y).padStart(4,"0")}-${String(mo).padStart(2,"0")}-${String(d).padStart(2,"0")}`
133
  }
 
153
  const esc=s=>s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');
154
  const lblAlt=labels.map(esc).join("|");
155
  const allAlt=allLabels.map(esc).join("|");
156
+ const re=new RegExp(`(?:^|\\n)\\s*(?:${lblAlt})\\s*(?::|๏ผš|\\s)\\s*([\\ุณ\\S]*?)(?=\\n\\s*(?:${allAlt})\\s*(?::|๏ผš|\\s)|$)`,"i");
157
  const m=hay.match(re);
158
  return m?m[1].trim():"";
159
  }
 
234
  if(!dev&&isValidNationalId(id))dev=id;
235
  if(!dev&&!id&&phone)dev=phone;
236
  if(!id&&isValidNationalId(dev))id=dev;
237
+ const dateOnly=f["ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ"]||"";
238
  return{
239
  "ุงู„ุชุตู†ูŠู":cls,
240
  "ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ":f["ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"]||"",
241
+ "ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ":dateOnly,
242
  "ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ":f["ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ"]||"",
243
  "ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ":id,
244
  "ุฑู‚ู… ุงู„ุฌู‡ุงุฒ":dev,
 
247
  "ุงู„ู…ู†ุทู‚ุฉ":region,
248
  "ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ":agentName||"",
249
  "ุงู„ุญุงู„ุฉ":"ุชู… ุงู„ุญู„",
250
+ "ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ":dateOnly
251
  };
252
  });
253
  }
 
264
  const td=document.createElement("td");
265
  const base=DISPLAY_TO_BASE[col];
266
  td.dataset.base=base;
267
+ let val=(base?(r[base]||""):"");
268
  if(col==="ุงู„ุชุตู†ูŠู"){
269
  const span=document.createElement("span");
270
  span.className=`cat ${catClass(val||"")}`;
 
291
  if(base==="ุงู„ุชุตู†ูŠู"){obj[base]=(td.querySelector("span")?.textContent||td.textContent||"").trim()}
292
  else{obj[base]=(td.textContent||"").trim()}
293
  });
294
+ obj["ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ"]=obj["ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ"]||"";
295
  rows.push(obj);
296
  });
297
  return rows;
 
326
  const digits=val.replace(/\D/g,"");
327
  if(val&&!/^05\d{8}$/.test(digits)){invalid=true;if(!reason)reason="phone"}
328
  }
329
+ if(base==="ุชุงุฑูŠุฎ ุงู„ูŠูˆู… ุจุงู„ู…ูŠู„ุงุฏูŠ"){
330
+ if(val&&!/^\d{4}-\d{2}-\d{2}$/.test(val)){invalid=true;reason="date"}
331
+ }
332
  td.classList.toggle("invalid",invalid);
333
  if(invalid){
334
+ const msg=reason==="required"?"ุงู„ุญู‚ู„ ู…ุทู„ูˆุจ":reason==="id"?"ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ูŠุฌุจ ุฃู† ูŠุจุฏุฃ ุจู€ 1 ุฃูˆ 2 ูˆุทูˆู„ู‡ 10 ุฎุงู†ุงุช":reason==="phone"?"ุฑู‚ู… ุงู„ุฌูˆุงู„ ูŠุฌุจ ุฃู† ูŠุจุฏุฃ ุจู€ 05 ูˆุทูˆู„ู‡ 10 ุฎุงู†ุงุช":"ุฃุฏุฎู„ ุชุงุฑูŠุฎ ุจุตูŠุบุฉ YYYY-MM-DD";
335
  td.setAttribute("title",msg);
336
  td.dataset.reason=reason;
337
  }else{
 
365
  const TEMPLATE_HEADERS=["ุงู„ุชุตู†ูŠู","ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ","ุงู„ู…ู†ุทู‚ุฉ","ุงุณู… ุงู„ู…ุณุญ","ุงุณู… ุงู„ู…ุดุบู„","ุฑู‚ู… ุงู„ุฌูˆุงู„","ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID","ุฑู‚ู… ุงู„ุฌู‡ุงุฒ","ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ","ุงู„ุญุงู„ุฉ","ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ"];
366
  const rows=readTable();
367
  if(!rows.length){toast("ู„ุง ูŠูˆุฌุฏ ุจูŠุงู†ุงุช ู„ุชุตุฏูŠุฑู‡ุง.");return}
368
+ const mapRow=r=>({
369
+ "ุงู„ุชุตู†ูŠู":r["ุงู„ุชุตู†ูŠู"]||"",
370
+ "ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ":r["ู†ูˆุน ุงู„ู…ุดูƒู„ุฉ"]||"",
371
+ "ุงู„ู…ู†ุทู‚ุฉ":r["ุงู„ู…ู†ุทู‚ุฉ"]||"",
372
+ "ุงุณู… ุงู„ู…ุณุญ":r["ุงู„ู…ุณุญ"]||"",
373
+ "ุงุณู… ุงู„ู…ุดุบู„":r["ุงุณู… ุตุงุญุจ ุงู„ู…ุดูƒู„ุฉ"]||"",
374
+ "ุฑู‚ู… ุงู„ุฌูˆุงู„":(r["ุฑู‚ู… ุงู„ุฌูˆุงู„"]||"").toString(),
375
+ "ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID":(r["ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ"]||"").toString(),
376
+ "ุฑู‚ู… ุงู„ุฌู‡ุงุฒ":(r["ุฑู‚ู… ุงู„ุฌู‡ุงุฒ"]||"").toString(),
377
+ "ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ":r["ูˆู‚ุช ุญุฏูˆุซ ุงู„ู…ุดูƒู„ุฉ"]||"",
378
+ "ุงู„ุญุงู„ุฉ":r["ุงู„ุญุงู„ุฉ"]||"ุชู… ุงู„ุญู„",
379
+ "ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ":r["ุงุณู… ุงู„ุฏุนู… ุงู„ูู†ูŠ"]||""
380
+ });
381
  const wb=new ExcelJS.Workbook();
382
  const ws=wb.addWorksheet("ุงู„ุชุฐุงูƒุฑ",{views:[{rightToLeft:true}]});
383
  const colWidths=[16,18,16,18,20,18,18,18,20,14,18];
 
392
  cell.border={top:{style:"thin",color:{argb:"FFCDD2E1"}},bottom:{style:"thin",color:{argb:"FFCDD2E1"}},left:{style:"thin",color:{argb:"FFE5E7EB"}},right:{style:"thin",color:{argb:"FFE5E7EB"}}};
393
  });
394
  const toTextCols=new Set(["ุฑู‚ู… ุงู„ุฌูˆุงู„","ุฑู‚ู… ุงู„ู‡ูˆูŠุฉ ID","ุฑู‚ู… ุงู„ุฌู‡ุงุฒ"]);
395
+ rows.forEach((r,idx)=>{
 
396
  const m=mapRow(r);
397
  const vals=TEMPLATE_HEADERS.map(h=>(m[h]??""));
398
  const row=ws.addRow(vals);
 
500
 
501
  function isUnlocked(){try{return localStorage.getItem("ticketParser_unlocked")==="1"}catch{return false}}
502
  function markUnlocked(){try{localStorage.setItem("ticketParser_unlocked","1")}catch{}}
503
+
504
+ function getLockBtn(){return document.getElementById("lockBtn")||document.getElementById("unlockBtn")||document.querySelector('[data-action="unlock"]')}
505
+ function getLockInput(){return document.getElementById("lockPass")||document.querySelector('input[type="password"][name="lock"]')}
506
+
507
  function showGate(){
508
  if(isUnlocked()){hideGate();return}
509
  const ov=document.getElementById("lockOverlay");
510
+ if(ov){ov.style.display="flex";setTimeout(()=>{const p=getLockInput();if(p)p.focus()},0)}
511
+ }
512
+ function hideGate(){
513
+ const ov=document.getElementById("lockOverlay");
514
+ if(ov)ov.style.display="none";
515
  }
 
516
  function tryUnlock(){
517
+ const inp=getLockInput();
518
+ const raw=inp?(inp.value||""):"";
519
+ const normalized=raw.replace(/[ู -ูฉ]/g,d=>arabicDigitsMap[d]).trim();
520
+ if(ACCESS_PASSWORDS.includes(normalized)){markUnlocked();hideGate()}
521
+ else{
522
+ const m=document.getElementById("lockMsg");
523
+ if(m){m.hidden=false;setTimeout(()=>m.hidden=true,1500)}
524
+ }
525
+ }
526
+
527
+ function wireLock(){
528
+ const btn=getLockBtn();
529
+ const inp=getLockInput();
530
+ if(btn)btn.addEventListener("click",tryUnlock);
531
+ if(inp)inp.addEventListener("keydown",e=>{if(e.key==="Enter")tryUnlock()});
532
+ document.addEventListener("click",e=>{const t=e.target;if(t&&t.closest&&t.closest("#lockBtn, #unlockBtn, [data-action='unlock']"))tryUnlock()},{once:true});
533
  }
534
 
535
  function init(){
 
541
  const rawEl=document.getElementById("raw");
542
  const agentEl=document.getElementById("agentName");
543
  const regionEl=document.getElementById("regionDefault");
 
 
544
 
545
  rawEl.placeholder=SAMPLE;
546
 
547
  if(!isUnlocked())showGate();else hideGate();
548
+ wireLock();
549
 
550
  loadState();
551
 
 
581
  else if(e.key==="Escape"){e.preventDefault();clearAll()}
582
  });
583
 
 
 
 
584
  setButtonsEnabled(!!document.getElementById("tbody")?.children.length);
585
  updateThemeLabel();
586
  }