| HTML |
|---|
<!-- فونت وزیر --> <link href="https://cdn.jsdelivr.net/gh/rastikerdar/vazir-font@v30.1.0/dist/font-face.css" rel="stylesheet" type="text/css" /> <!-- فیلترهای زیبا --> <h2 style="text-align:center; font-family:Vazir,Tahoma; color:#333; font-weight:600;">آرشیو مستندات اعتباربخشی</h2> <div id="search-filters" style=" display:flex; justify-content:center;flex-end; flex-wrap:wrap; gap:10px; margin:25px 0; direction:rtl;"> <select id="filterAxis" onchange="updateSubAxis(); filterTable()" style="flex:0 1 160px; padding:10px 15px; border-radius:25px; border:1px solid #ccc; font-family:Vazir, Tahoma; font-size:14px; background:#fff; cursor:pointer;"> <option value="">انتخاب محور</option> <option value="modiriyatرهبری و مدیریت">رهبری و مدیریت</option> <option value="moredمراقبت و درمان">مراقبت و درمان</option> <option value="hemayatحمایت از گیرنده خدمت">حمایت از گیرنده خدمت</option> </select> <select id="filterSubAxis" onchange="filterTable()" style="flex:0 1 160px; padding:10px 15px; border-radius:25px; border:1px solid #ccc; font-family:Vazir, Tahoma; font-size:14px; background:#fff; cursor:pointer;"> <option value="">انتخاب زیرمحور</option> </select> <table </div> <div id="archiveTable" border="1archive-loading" style="width:100%font-family:Vazir,Tahoma; border-collapsedirection:collapsertl; text-align:center; padding:15px; color:#007bff;"> در <thead> حال بارگذاری آرشیو... </div> <table id="archiveTable" style="display:none;"> <thead> <tr> <th>محور</th> <th>زیرمحور</th> <th>کمیته</th> <th>عنوان سند</th> <th>نوع سند</th> <th>تاریخ ثبت اولیه</th> <th>تاریخ آخرین بازنگری</th> <th>تاریخ ویرایش</th> <th>کد ویرایش</th> <th>فایل / <th>فایل<صفحه</th> </tr> </thead> <tbody id="archiveBody"></tbody> </table> <!-- CSS جدول زیبا --> <style> #myTable<div id="archive-empty" style="display:none; font-family:Vazir,Tahoma; direction:rtl; text-align:center; padding:15px; color:#00A9C3; font-weight:600;"> موردی برای نمایش وجود ندارد. </div> <style> @font-face { border-collapse: separate; border-spacing: 0; font-family: "IRANSans"; src: url("/download/attachments/85045557/IRANSansXVF.woff2") format("woff2"); } @font-face { font-family: "Vazir"; src: url("/download/attachments/85045557/Vazir-Regular.woff2") format("woff2"); } #archiveTable { width: 100%; border-collapse: separate; border-spacing: 0; font-family: Vazir, Tahoma; direction: rtl; border-radius: 12px; overflow: hidden; box-shadow: 0 2px4px 8px12px rgba(0,0,0,0.1)08); } #archiveTable thead { background-color: #4facfe; color: #fff; borderfont-radiusweight: 10px600; overflowtext-align: hiddencenter; } #myTable#archiveTable thead th { background-color: #f2f2f2 #00A9C3; color: #fff; padding: 12px 10px; fontborder-weightbottom: 600 1px solid rgba(255,255,255,0.3); textwhite-alignspace: centernowrap; } #archiveTable thead border-bottom: 1px solid #dddtr:hover th { background-color: #00A9C3; } #myTable#archiveTable tbody td { padding: 12px 10px; text-align: center; border-bottom: 1px solid #eee #f0f0f0; background-color: #fff; transition: background-color 0.3s; vertical-align:middle; } #myTable #archiveTable tbody tr:nth-child(even) td { background-color: #fafafa#f9f9f9; } #myTable#archiveTable tbody tr:hover td { background-color: #e6f7ff#e0f7ff; } #archiveTable tbody transition: background-color 0.3s; } #myTable thead tr:first-child th:first-child { border-top-right-radius: 10px; } #myTable thead tr:first-child th:last-child { border-top-left-radius: 10px; } #myTable tbody tr:last-child td:first-child { border-bottom-right-radius: 10px; } #myTable tbody tr:last-child td:last-child { border-bottom-left-radius: 10px; } #search-filters select { transition: all 0.3s; } #search-filters select:hover { box-shadow: 0 2px 6px rgba(0,0,0,0.15); } </style> <script> <script> // نگاشت محورها به فارسی const axisMap = { modiriyat: "رهبری و مدیریت", mored: "مراقبت و درمان", hemayat: "حمایت از گیرنده خدمت" }; // وقتی محور انتخاب شد، زیرمحورها و جدول را آپدیت میکنیم function updateSubAxis() { const axisSelect = document.getElementById('filterAxis'); const subAxisSelect = document.getElementById('filterSubAxis'); // مقدار انتخاب شده (کد محور) const selectedAxis = axisSelect.value; // پر کردن زیرمحورها متناسب با محور subAxisSelect.innerHTML = '<option value="">انتخاب زیرمحور</option>'; // میتوانید یک map برای زیرمحورها هم بسازید اگر لازم باشد } // فیلتر کردن جدول function filterTable() { const axisSelect = document.getElementById('filterAxis'); const subAxisSelect = document.getElementById('filterSubAxis'); const tbody = document.getElementById('archiveBody'); const selectedAxis = axisSelect.value; const selectedSubAxis = subAxisSelect.value; Array.from(tbody.rows).forEach(rowtr td a, .archive-link { color: #007bff; text-decoration: none; font-weight: 600; cursor:pointer; } #archiveTable tbody tr td a:hover, .archive-link:hover { text-decoration: underline; } </style> <script> const zirmohvarOptions = { "رهبری و مدیریت": [ "رهبری و مدیریت کیفیت", "مدیریت خطر، حوادث و بلایا", "مدیریت منابع انسانی و سلامت حرفهای", "مدیریت خدمات پرستاری", "فناوری و مدیریت اطلاعات سلامت", "بهداشت محیط", "مدیریت تجهیزات پزشکی" ], "مراقبت و درمان": [ "مراقبتهای عمومی بالینی", "مراقبتهای حاد و اورژانس", "مراقبتهای جراحی و بیهوشی", "مراقبتهای مادر و نوزاد", "پیشگیری و کنترل عفونت", "مدیریت دارویی", "خدمات تصویربرداری", "خدمات آزمایشگاه", "طب انتقال خون", "خدمات سرپایی" ], "حمایت از گیرنده خدمت": [ "تأمین تسهیلات برای گیرنده خدمت", "احترام به حقوق گیرنده خدمت" ] }; function cleanText(v) { return String(v || "").replace(/\u00a0/g, " ").replace(/\u200c/g, " ").replace(/\s+/g, " ").trim(); } function safeText(v) { return String(v || "") .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">"); } function toAbsoluteUrl(url) { url = String(url || "").trim(); if (!url) return ""; if (/^https?:\/\//i.test(url)) return url; if (url.startsWith("/")) return location.origin + url; return location.origin + "/" + url; } function updateSubAxis() { const filterAxis = document.getElementById("filterAxis"); const filterSubAxis = document.getElementById("filterSubAxis"); const selectedAxis = filterAxis.value; filterSubAxis.innerHTML = `<option value="">انتخاب زیرمحور</option>`; if (selectedAxis && zirmohvarOptions[selectedAxis]) { zirmohvarOptions[selectedAxis].forEach(sub => { const opt = document.createElement("option"); opt.value = sub; opt.textContent = sub; filterSubAxis.appendChild(opt); }); } filterSubAxis.value = ""; filterTable(); } function filterTable() { const axis = cleanText(document.getElementById("filterAxis").value); const subAxis = cleanText(document.getElementById("filterSubAxis").value); const rows = document.querySelectorAll("#archiveBody tr"); let visibleCount = 0; rows.forEach(row => { const rowAxis = cleanText(row.cells[0].textContent); const rowSub = cleanText(row.cells[1].textContent); let show = true; if (axis && rowAxis !== axis) show = false; if (subAxis && rowSub !== subAxis) show = false; row.style.display = show ? "" : "none"; if (show) visibleCount++; }); document.getElementById("archive-empty").style.display = visibleCount ? "none" : "block"; } async function loadArchive() { const pageIdArchive = "85045557"; const archiveName = "archive.json"; const res = await fetch(`/rest/api/content/${pageIdArchive}/child/attachment?filename=${encodeURIComponent(archiveName)}&cb=${Date.now()}`, { credentials: "include", headers: { Accept: "application/json" }, cache: "no-store" }); if (!res.ok) throw new Error("خطا در خواندن attachment آرشیو: " + res.status); const data = await res.json(); if (!data.results || !data.results.length) return []; const downloadUrl = toAbsoluteUrl(data.results[0]._links.download); const joiner = downloadUrl.includes("?") ? "&" : "?"; const txt = await fetch(downloadUrl + joiner + "cb=" + Date.now(), { credentials: "include", cache: "no-store" }).then(r => r.text()); const arr = JSON.parse(txt || "[]"); return Array.isArray(arr) ? arr : []; } function openBase64File(base64Data, fileName) { try { const arr = String(base64Data || "").split(","); const mime = arr[0] && arr[0].match(/:(.*?);/) ? arr[0].match(/:(.*?);/)[1] : "application/octet-stream"; const bstr = atob(arr[1] || ""); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } const blob = new Blob([u8arr], { type: mime }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = fileName || "file"; a.click(); setTimeout(() => URL.revokeObjectURL(url), 60000); } catch (e) { console.error(e); alert("فایل قدیمی Base64 قابل باز شدن نیست."); } } function createFileCell(record) { const wrap = document.createElement("div"); const fileUrl = cleanText(record.fileUrl || record.file_url || record.downloadUrl || record.download_url || ""); const pageUrl = cleanText(record.pageUrl || record.page_url || ""); const pageId = cleanText(record.pageId || record.page_id || ""); const oldBase64 = cleanText(record.file || record.file_base64 || ""); const fileName = cleanText(record.file_name || record.document_file_name || record.document_name || "file"); if (fileUrl) { const a = document.createElement("a"); a.href = toAbsoluteUrl(fileUrl); a.target = "_blank"; a.textContent = "دانلود فایل"; wrap.appendChild(a); return wrap; } if (pageUrl || pageId) { const a = document.createElement("a"); a.href = pageUrl ? toAbsoluteUrl(pageUrl) : (location.origin + "/pages/viewpage.action?pageId=" + encodeURIComponent(pageId)); a.target = "_blank"; a.textContent = "مشاهده صفحه"; wrap.appendChild(a); return wrap; } if (oldBase64) { const btn = document.createElement("span"); btn.className = "archive-link"; btn.textContent = "دانلود فایل"; btn.onclick = function () { openBase64File(oldBase64, fileName); }; wrap.appendChild(btn); return wrap; } wrap.textContent = "-"; return wrap; } async function populateArchiveTable() { const tbody = document.getElementById("archiveBody"); const loading = document.getElementById("archive-loading"); const table = document.getElementById("archiveTable"); const empty = document.getElementById("archive-empty"); try { loading.style.display = "block"; table.style.display = "none"; empty.style.display = "none"; tbody.innerHTML = ""; const archive = await loadArchive(); archive .slice() .reverse() .forEach(r => { const mahvarCelltr = row.cells[0].textContent; // ستون محور فارسی document.createElement("tr"); tr.innerHTML = ` <td>${safeText(r.mahvar || "-")}</td> const zirmohvarCell = row.cells[1].textContent; <td>${safeText(r.zirmohvar || "-")}</td> <td>${safeText(r.komiteh || "-")}</td> <td>${safeText(r.document_name || "-")}</td> <td>${safeText(r.noe_sanad || "-")}</td> <td>${safeText(r.date_last_edit || "-")}</td> چک کردن تطابق با محور و زیرمحور <td>${safeText(r.date_revision || "-")}</td> <td>${safeText(r.date_update || "-")}</td> const show = (!selectedAxis<td>${safeText(r.edit_code || axisMap[selectedAxis] === mahvarCell) "00")}</td> <td></td> `; tr.cells[9].appendChild(createFileCell(r)); && (!selectedSubAxis || selectedSubAxis === zirmohvarCelltbody.appendChild(tr); }); loading.style.display = "none"; rowtable.style.display = showarchive.length ? ''"table" : 'none';"none"; empty.style.display = archive.length ? "none" : "block"; filterTable(); } catch (e) { console.error(e); } // وقتی DOM آماده شد جدول را پر میکنیم loading.style.display = "none"; empty.style.display = "block"; empty.textContent = "خطا در بارگذاری آرشیو: " + e.message; } } document.addEventListener("DOMContentLoaded", populateArchiveTable); </script> |
...