182 خطوط
4.7 KiB
JavaScript
182 خطوط
4.7 KiB
JavaScript
let documents = [];
|
||
|
||
const searchInput = document.getElementById("searchInput");
|
||
const results = document.getElementById("results");
|
||
const status = document.getElementById("status");
|
||
|
||
// آدرس فایل CSV
|
||
|
||
const CSV_URL = "https://git.sadentel.net/f.taghipour/Document/raw/branch/main/SadenTel_Documents.csv";
|
||
|
||
// یکسانسازی متن و اعداد
|
||
function normalize(value) {
|
||
return String(value ?? "")
|
||
.toLowerCase()
|
||
.trim()
|
||
.replace(/[۰-۹]/g, digit =>
|
||
"۰۱۲۳۴۵۶۷۸۹".indexOf(digit)
|
||
)
|
||
.replace(/[٠-٩]/g, digit =>
|
||
"٠١٢٣٤٥٦٧٨٩".indexOf(digit)
|
||
)
|
||
.replace(/ي/g, "ی")
|
||
.replace(/ك/g, "ک");
|
||
}
|
||
|
||
// پردازش CSV
|
||
function parseCSV(text) {
|
||
const rows = [];
|
||
let row = [];
|
||
let field = "";
|
||
let insideQuotes = false;
|
||
|
||
for (let i = 0; i < text.length; i++) {
|
||
const char = text[i];
|
||
|
||
if (char === '"') {
|
||
if (insideQuotes && text[i + 1] === '"') {
|
||
field += '"';
|
||
i++;
|
||
} else {
|
||
insideQuotes = !insideQuotes;
|
||
}
|
||
} else if (char === "," && !insideQuotes) {
|
||
row.push(field);
|
||
field = "";
|
||
} else if (
|
||
(char === "\n" || char === "\r") &&
|
||
!insideQuotes
|
||
) {
|
||
if (char === "\r" && text[i + 1] === "\n") {
|
||
i++;
|
||
}
|
||
|
||
row.push(field);
|
||
|
||
if (row.some(value => value.trim() !== "")) {
|
||
rows.push(row);
|
||
}
|
||
|
||
row = [];
|
||
field = "";
|
||
} else {
|
||
field += char;
|
||
}
|
||
}
|
||
|
||
row.push(field);
|
||
|
||
if (row.some(value => value.trim() !== "")) {
|
||
rows.push(row);
|
||
}
|
||
|
||
return rows;
|
||
}
|
||
|
||
// دریافت اطلاعات CSV
|
||
async function loadDocuments() {
|
||
try {
|
||
searchInput.disabled = true;
|
||
status.textContent = "در حال دریافت اسناد...";
|
||
|
||
const response = await fetch(CSV_URL, {
|
||
cache: "no-store"
|
||
});
|
||
|
||
if (!response.ok) {
|
||
throw new Error(`HTTP Error: ${response.status}`);
|
||
}
|
||
|
||
const text = await response.text();
|
||
const rows = parseCSV(text);
|
||
|
||
documents = rows.slice(1).map(columns => ({
|
||
row: columns[0]?.trim(),
|
||
title: columns[1]?.trim(),
|
||
id: columns[2]?.trim()
|
||
})).filter(doc => doc.title && doc.id);
|
||
|
||
status.textContent =
|
||
`${documents.length} سند با موفقیت بارگذاری شد.`;
|
||
|
||
searchInput.disabled = false;
|
||
|
||
} catch (error) {
|
||
status.textContent =
|
||
"خطا در دریافت اطلاعات. مسیر فایل CSV را بررسی کنید.";
|
||
|
||
console.error("Loading error:", error);
|
||
}
|
||
}
|
||
|
||
// جستوجوی اسناد
|
||
function searchDocuments() {
|
||
const query = normalize(searchInput.value);
|
||
|
||
results.innerHTML = "";
|
||
|
||
if (!query) {
|
||
status.textContent =
|
||
`${documents.length} سند ثبت شده است.`;
|
||
return;
|
||
}
|
||
|
||
const matches = documents.filter(doc => {
|
||
const titleWords =
|
||
normalize(doc.title).match(/[\p{L}\p{N}]+/gu) || [];
|
||
|
||
const id = normalize(doc.id);
|
||
|
||
// فقط تطابق کامل کلمه یا شناسه
|
||
return titleWords.includes(query) || id === query;
|
||
});
|
||
|
||
status.textContent =
|
||
`${matches.length} نتیجه پیدا شد.`;
|
||
|
||
if (matches.length === 0) {
|
||
results.innerHTML =
|
||
'<div class="empty">سندی با این مشخصات پیدا نشد.</div>';
|
||
return;
|
||
}
|
||
|
||
matches.forEach(doc => {
|
||
const item = document.createElement("div");
|
||
item.className = "result";
|
||
|
||
const title = document.createElement("h3");
|
||
title.textContent = doc.title;
|
||
|
||
const rowInfo = document.createElement("div");
|
||
rowInfo.className = "info";
|
||
|
||
const rowLabel = document.createElement("span");
|
||
rowLabel.textContent = "ردیف";
|
||
|
||
const rowValue = document.createElement("span");
|
||
rowValue.textContent = doc.row;
|
||
|
||
rowInfo.append(rowLabel, rowValue);
|
||
|
||
const idInfo = document.createElement("div");
|
||
idInfo.className = "info";
|
||
|
||
const idLabel = document.createElement("span");
|
||
idLabel.textContent = "شناسه داخلی سند";
|
||
|
||
const idValue = document.createElement("span");
|
||
idValue.textContent = doc.id;
|
||
|
||
idInfo.append(idLabel, idValue);
|
||
|
||
item.append(title, rowInfo, idInfo);
|
||
results.appendChild(item);
|
||
});
|
||
}
|
||
|
||
// جستوجوی لحظهای
|
||
searchInput.addEventListener("input", searchDocuments);
|
||
|
||
// بارگذاری اولیه
|
||
loadDocuments();
|