divan/GanjooRazor/Pages/Shared/_AdminLayout.cshtml
2026-08-06 21:55:47 +03:30

486 lines
18 KiB
Plaintext

<!DOCTYPE html>
<html lang="fa-IR" dir="rtl">
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
@Html.Raw(ViewData["Title"])
</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
<link href="/dist/skin/blue.monday/css/jplayer.blue.monday.min.css" rel="stylesheet" type="text/css" />
<link href="/css/p8.css?version=86" rel="stylesheet" type="text/css" />
<link href="/css/user-panel.css?version=2" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="/favicon.ico?version=1" type="image/x-icon" />
<link rel="search" type="application/opensearchdescription+xml" title="گنجور" href="https://ganjoor.net/search.xml" />
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="/lib/diff.js"></script>
<script src="/lib/tinymce/tinymce.min.js"></script>
<script>
tinymce.init({
selector: 'textarea.editor',
language: 'fa_IR',
menubar: false,
plugins: 'link paste image',
contextmenu: false,
toolbar: 'undo redo | alignleft aligncenter alignright alignjustify | link',
paste_auto_cleanup_on_paste: true,
paste_remove_styles: true,
paste_remove_styles_if_webkit: true,
paste_strip_class_attributes: true,
smart_paste: false,
a11y_advanced_options: true,
skin: (window.matchMedia("(prefers-color-scheme: dark)").matches && localStorage.getItem("scheme") != "light" ? "oxide-dark" : localStorage.getItem("scheme") == "dark" ? "oxide-dark" : ""),
content_css: (window.matchMedia("(prefers-color-scheme: dark)").matches && localStorage.getItem("scheme") != "light" ? "dark" : localStorage.getItem("scheme") == "dark" ? "dark" : ""),
});
</script>
<script src="/js/bk.js?version=88"></script>
<script>
function editBanner(bannerId) {
var url = '?handler=Edit';
var altInput = '#alt-' + bannerId.toString();
var urlInput = '#url-' + bannerId.toString();
var activeInput = '#active-' + bannerId.toString();
$.ajax({
type: "PUT",
url: url,
data: {
id: bannerId,
alt: $(altInput).val(),
url: $(urlInput).val(),
active: $(activeInput).is(":checked")
},
error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
},
success: function() {
upToast('آگاهی به درستی ویرایش شد.', 'success');
},
});
}
async function deleteBanner(bannerId) {
var ok = await upConfirm('آیا از حذف این آگاهی اطمینان دارید؟');
if (!ok) return;
$.ajax({
type: "DELETE",
url: '',
data: {
id: bannerId
},
error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
},
success: function() {
var bannerIdBlockId = '#tr-' + bannerId;
$(bannerIdBlockId).remove();
},
});
}
async function rebuildDonationsPage() {
var ok = await upConfirm('آیا از بازسازی صفحهٔ کمک‌ها اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildPage';
$.ajax({
type: "POST",
url: url,
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('صفحه به درستی بازسازی شد.', 'success');
},
});
}
async function deleteItem(itemId, itemName) {
var ok = await upConfirm('آیا از حذف این ' + itemName + ' اطمینان دارید؟');
if (!ok) return;
$.ajax({
type: "DELETE",
url: '',
data: {
id: itemId
},
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
location.reload();
return false;
},
});
}
async function rebuildSitemap() {
var ok = await upConfirm('آیا از بازسازی نقشهٔ سایت اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildSitemap';
$.ajax({
type: "POST",
url: url,
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('فرایند بازسازی نقشهٔ سایت شروع شد.', 'success');
},
});
}
async function rebuildTajikSitemap() {
var ok = await upConfirm('آیا از بازسازی نقشهٔ سایت تاجیکی اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildTajikSitemap';
$.ajax({
type: "POST",
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی نقشهٔ سایت تاجیکی شروع شد.', 'success');
},
});
}
async function rebuildStats() {
var ok = await upConfirm('آیا از بازسازی صفحات آمار اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildStats';
$.ajax({
type: "POST",
url: url,
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('فرایند بازسازی صفحات آمار شروع شد.', 'success');
},
});
}
async function refillCoupletCounts() {
var ok = await upConfirm('آیا از بازشماری تعداد ابیات قطعات اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RefillSectionsCoupletCounts';
$.ajax({
type: "POST",
url: url,
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('فرایند بازشماری تعداد ابیات قطعات شروع شد.', 'success');
},
});
}
async function rebuildRelatedPages() {
var ok = await upConfirm('آیا از بازسازی محتوای صفحات استقبال‌ها اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildRelatedPages';
$.ajax({
type: "POST",
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی صفحات آمار شروع شد.', 'success');
},
});
}
async function rebuildDigitalSourcesStats() {
var ok = await upConfirm('آیا از بازسازی آمار منابع دیجیتال اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildDigitalSourcesStats';
$.ajax({
type: "POST",
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی شروع شد.', 'success');
},
});
}
async function transilerate() {
var ok = await upConfirm('آیا از شروع برگردان تاجیکی اطمینان دارید؟');
if (!ok) return;
var url = '?handler=Transilerate';
$.ajax({
type: "POST",
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند شروع شد.', 'success');
},
});
}
async function rebuildRebuildWordCounts(poetId) {
var onlyCurrentPoet = await upConfirm('فقط شاعر جاری؟', { danger: false });
if (!onlyCurrentPoet) {
poetId = 0;
}
var ok = await upConfirm('آیا از شمارش واژگان برای شاعر جاری با کد ' + poetId.toString() + ' اطمینان دارید؟');
if (!ok) return;
var url = '?handler=RebuildWordCounts';
$.ajax({
type: "POST",
data: {
poetId: poetId
},
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی شروع شد.', 'success');
},
});
}
function discoverNaskbanPaperSources(poetId) {
var username = window.prompt('username:');
var password = window.prompt('password:');
var url = '?handler=ImportNaskbanPaperSources';
$.ajax({
type: "POST",
data: {
poetId: poetId,
username: username,
password: password,
},
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی شروع شد.', 'success');
},
});
}
function discoverMusuemPaperSources(poetId) {
var url = '?handler=ImportMuseumPaperSources';
$.ajax({
type: "POST",
data: {
poetId: poetId,
},
url: url,
error: function () {
upToast('خطا رخ داد.', 'error');
},
success: function () {
upToast('فرایند بازسازی شروع شد.', 'success');
},
});
}
async function exportAll() {
var ok = await upConfirm('آیا از تولید مجدد همهٔ فایلهای گنجور رومیزی اطمینان دارید؟');
if (!ok) return;
var url = '?handler=ExportAll';
$.ajax({
type: "POST",
url: url,
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('فرایند تولید مجدد همهٔ فایلهای گنجور رومیزی شروع شد.', 'success');
},
});
}
async function cleanCache(id) {
var ok = await upConfirm('آیا از حذف کش این صفحه اطمینان دارید؟');
if (!ok) return;
var url = '?handler=CleanCache';
$.ajax({
type: "POST",
url: url,
data: {
id: id
},
error: function() {
upToast('خطا رخ داد.', 'error');
},
success: function() {
upToast('کش صفحه پاک شد.', 'success');
},
});
}
function compareCorrectionBlocks(originalElemenyId, editedElementId, resultElementId) {
var a = document.getElementById(originalElemenyId);
var b = document.getElementById(editedElementId);
var result = document.getElementById(resultElementId);
var diff = JsDiff.diffChars(a.textContent, b.textContent);
var fragment = document.createDocumentFragment();
for (var i = 0; i < diff.length; i++) {
if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
var swap = diff[i];
diff[i] = diff[i + 1];
diff[i + 1] = swap;
}
var node;
if (diff[i].removed) {
node = document.createElement('del');
node.style.color = 'red';
node.appendChild(document.createTextNode(diff[i].value));
} else if (diff[i].added) {
node = document.createElement('span');
node.style.color = 'white';
node.style.backgroundColor = 'green';
node.appendChild(document.createTextNode(diff[i].value));
} else {
node = document.createTextNode(diff[i].value);
}
fragment.appendChild(node);
}
result.textContent = '';
result.appendChild(fragment);
}
</script>
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index" title="گنجور"><img src="/image/gdapk.png" alt="گنجور" style="width:auto;margin:auto;" /></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item dropdown">
<a class="nav-link text-dark dropdown-toggle" href="#" id="adminReviewDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">بررسی و تأیید</a>
<div class="dropdown-menu" aria-labelledby="adminReviewDropdown">
<a class="dropdown-item" asp-area="Admin" asp-page="ReviewEdits">ویرایش‌ها</a>
<a class="dropdown-item" asp-area="Admin" asp-page="ReviewPartEdits">ویرایش‌های قطعات</a>
<a class="dropdown-item" asp-area="Admin" asp-page="ReviewCatEdits">ویرایش‌های زندگینامه‌ها</a>
<a class="dropdown-item" asp-area="Admin" asp-page="ReviewQuoteds">مشق‌ها</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Admin" asp-page="Poets">سخنوران</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link text-dark dropdown-toggle" href="#" id="adminSiteDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">مالی و سایت</a>
<div class="dropdown-menu" aria-labelledby="adminSiteDropdown">
<a class="dropdown-item" asp-area="Admin" asp-page="Banners">آگاهی‌ها</a>
<a class="dropdown-item" asp-area="Admin" asp-page="Donations">کمک‌های مالی</a>
<a class="dropdown-item" asp-area="Admin" asp-page="Expenses">هزینه‌ها</a>
<a class="dropdown-item" asp-area="Admin" asp-page="LongRunningJobs">کارها</a>
</div>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container up-shell @(ViewData["WideShell"] is true ? "up-shell--wide" : "")">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<partial name="_Toasts" />
<partial name="_ConfirmModal" />
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<script src="/js/user-panel.js?version=2"></script>
@await RenderSectionAsync("Scripts", required: false)
<script>
applyPreferredColorScheme(getPreferredColorScheme());
</script>
</body>
</html>