mprove UI/UX of the User Area

#496
This commit is contained in:
Hamid Reza Mohammadi 2026-08-05 16:55:42 +03:30
parent 2fee534f11
commit e65652e4dc
7 changed files with 415 additions and 689 deletions

View File

@ -1,201 +1,119 @@
@page @page
@model GanjooRazor.Areas.User.Pages.AwaitingCommentsModel @model GanjooRazor.Areas.User.Pages.AwaitingCommentsModel
@using DNTPersianUtils.Core @using DNTPersianUtils.Core
@{ @{
Layout = "_UserPanelLayout"; Layout = "_UserPanelLayout";
ViewData["Title"] = "حاشیه‌های در انتظار تأیید"; ViewData["Title"] = "حاشیه‌های در انتظار تأیید";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
string color = "gray";
} }
<div class="up-page-header">
<h1>@ViewData["Title"]</h1> <h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
else else
{ {
<p style="text-align:center">
@foreach (var paginationLink in Model.PaginationLinks)
{
if (!string.IsNullOrEmpty(paginationLink.Url))
{
<a href="@paginationLink.Url">@paginationLink.Name</a>
}
else
{
@paginationLink.Name
}
}
</p>
<script> <script>
function deleteAwaitingComment(commentId) { async function deleteAwaitingComment(commentId) {
if (!confirm('آیا از حذف این حاشیه اطمینان دارید؟')) var ok = await upConfirm('آیا از حذف این حاشیه اطمینان دارید؟');
return; if (!ok) return;
var url = '?handler=Comment';
$.ajax({ $.ajax({
type: "DELETE", type: "DELETE",
url: url, url: '?handler=Comment',
data: { data: { id: commentId },
id: commentId error: function (e) {
}, upToast(e.responseText || 'خطا رخ داد.', 'error');
error: function () {
alert('خطا رخ داد.');
}, },
success: function () { success: function () {
var commentBlockId = '#comment-' + commentId; $('#comment-' + commentId).remove();
$(commentBlockId).remove(); upToast('حاشیه حذف شد.', 'success');
}, },
}); });
} }
function publishAwaitingComment(commentId) { async function publishAwaitingComment(commentId) {
if (!confirm('آیا از انتشار این حاشیه اطمینان دارید؟')) var ok = await upConfirm('آیا از انتشار این حاشیه اطمینان دارید؟', { danger: false, okText: 'بله، منتشر شود' });
return; if (!ok) return;
var url = '?handler=Approve';
$.ajax({ $.ajax({
type: "PUT", type: "PUT",
url: url, url: '?handler=Approve',
data: { data: { id: commentId },
id: commentId error: function (e) {
}, upToast(e.responseText || 'خطا رخ داد.', 'error');
error: function () {
alert('خطا رخ داد.');
}, },
success: function () { success: function () {
var commentBlockId = '#comment-' + commentId; $('#comment-' + commentId).remove();
$(commentBlockId).remove(); upToast('حاشیه منتشر شد.', 'success');
}, },
}); });
} }
function switchOption(start) { function switchOption(start) {
if(start == false){
document.getElementById('switch-tracking-button').style.visibility = 'hidden';
document.getElementById('processing').innerHTML = 'در حال پردازش ...';
$.ajax({
type: "POST",
url: '?handler=StopKeeping',
error: function() {
alert('خطا رخ داد.');
location.reload();
},
success: function () {
location.reload();
},
});
return;
}
document.getElementById('switch-tracking-button').style.visibility = 'hidden'; document.getElementById('switch-tracking-button').style.visibility = 'hidden';
document.getElementById('processing').innerHTML = 'در حال پردازش ...'; document.getElementById('processing').innerHTML = 'در حال پردازش ...';
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: '?handler=StartKeeping', url: start ? '?handler=StartKeeping' : '?handler=StopKeeping',
error: function() { error: function () {
alert('خطا رخ داد.'); upToast('خطا رخ داد.', 'error');
location.reload(); location.reload();
}, },
success: function () { success: function () {
location.reload(); location.reload();
}, },
}); });
} }
</script> </script>
<div class="related-images-frame"> <partial name="_Pagination" model="Model.PaginationLinks" />
<div class="up-card">
@if (Model.KeepFirstTimeUsersComments) @if (Model.KeepFirstTimeUsersComments)
{ {
<p style="text-align:center; color: green"> <div class="up-alert up-alert--success up-text-center">نگه داشتن حاشیه‌های حاشیه‌گذاران بدون سابقه فعال است.</div>
نگه داشتن حاشیه‌های حاشیه‌گذاران بدون سابقه فعال است. <div class="up-form-actions" style="justify-content:center;">
</p> <a role="button" onclick="switchOption(false)" id="switch-tracking-button" class="up-btn up-btn--ghost">غیرفعال کردن</a>
</div>
<p>
<a role="button" onclick="switchOption(false)" id="switch-tracking-button" class="pagebutton">غیرفعال کردن</a>
</p>
<p id="processing">
</p>
} }
else else
{ {
<p> <p class="up-text-center">نگه داشتن حاشیه‌های حاشیه‌گذاران بدون سابقه غیرفعال است.</p>
نگه داشتن حاشیه‌های حاشیه‌گذاران بدون سابقه غیرفعال است. <div class="up-form-actions" style="justify-content:center;">
</p> <a role="button" onclick="switchOption(true)" id="switch-tracking-button" class="up-btn up-btn--success">فعال کردن</a>
</div>
<p>
<a role="button" onclick="switchOption(true)" id="switch-tracking-button" class="pagebutton">فعال کردن</a>
</p>
<p id="processing">
</p>
} }
<p id="processing" class="up-text-center"></p>
</div> </div>
@if (Model.Comments.Count == 0) @if (Model.Comments.Count == 0)
{ {
<p> <partial name="_EmptyState" model="@("موردی وجود ندارد.")" />
موردی وجود ندارد.
</p>
} }
else
@foreach (var comment in Model.Comments)
{ {
if (color == "gray") <div class="up-list">
color = "lightsteelblue"; @foreach (var comment in Model.Comments)
else {
color = "gray"; <div class="up-list-item" id="comment-@comment.Id">
<div id="comment-text-@comment.Id">
<div style="background-color:@color" id="comment-@comment.Id"> @Html.Raw(comment.HtmlComment)
<blockquote> </div>
<div id="comment-text-@comment.Id"> <div class="up-list-item__meta">
@Html.Raw(comment.HtmlComment) <a href="/Admin/ExamineUser?id=@comment.UserId">@comment.AuthorName</a> در @comment.CommentDate.ToFriendlyPersianDateTextify() دربارهٔ <a href="@comment.Poem.UrlSlug#comment-@comment.Id">@comment.Poem.Title</a>
</div>
<div class="up-list-item__actions">
<a role="button" onclick="deleteAwaitingComment(@comment.Id)" class="up-icon-btn" title="حذف حاشیه" aria-label="حذف این حاشیه"><i class="noindent-info-button delete-icon"></i></a>
<a role="button" onclick="publishAwaitingComment(@comment.Id)" class="up-icon-btn" title="انتشار حاشیه" aria-label="انتشار این حاشیه"><i class="noindent-info-button done-icon"></i></a>
</div>
</div> </div>
<p> }
@comment.AuthorName <small>در @comment.CommentDate.ToFriendlyPersianDateTextify()</small> دربارهٔ <a href="@comment.Poem.UrlSlug#comment-@comment.Id">@comment.Poem.Title</a>
</p>
<p>
<a href="/Admin/ExamineUser?id=@comment.UserId">#</a>
</p>
</blockquote>
<p>
<a role="button" onclick="deleteAwaitingComment(@comment.Id)" class="actionlink" title="حذف حاشیه"><i class="noindent-info-button delete-icon"></i></a>
<a role="button" onclick="publishAwaitingComment(@comment.Id)" class="actionlink" title="انتشار حاشیه"><i class="noindent-info-button done-icon"></i></a>
</p>
</div> </div>
<hr />
} }
<p style="text-align:center"> <partial name="_Pagination" model="Model.PaginationLinks" />
@foreach (var paginationLink in Model.PaginationLinks)
{
if (!string.IsNullOrEmpty(paginationLink.Url))
{
<a href="@paginationLink.Url">@paginationLink.Name</a>
}
else
{
@paginationLink.Name
}
}
</p>
} }

View File

@ -1,4 +1,4 @@
@page @page
@model GanjooRazor.Areas.User.Pages.FAQItemsModel @model GanjooRazor.Areas.User.Pages.FAQItemsModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{ @{
@ -6,104 +6,99 @@
ViewData["Title"] = "پرسش‌های متداول"; ViewData["Title"] = "پرسش‌های متداول";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
} }
<div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
@if (!string.IsNullOrEmpty(Model.LastMessage)) @if (!string.IsNullOrEmpty(Model.LastMessage))
{ {
<p> <div class="up-alert up-alert--info">@Model.LastMessage</div>
@Model.LastMessage
</p>
} }
else else
{ {
<script> <script>
function editCategory(){ function editCategory() {
location.href = '/User/FAQCatEdit?id=' + String(document.getElementById('cat').value); location.href = '/User/FAQCatEdit?id=' + String(document.getElementById('cat').value);
} }
function newItem(){ function newItem() {
location.href = '/User/FAQItemEdit?catId=' + String(document.getElementById('cat').value); location.href = '/User/FAQItemEdit?catId=' + String(document.getElementById('cat').value);
} }
function deleteCategory() {
function faqItemRow(item) {
return '<div class="up-list-item">' +
'<a href="/User/FAQItemEdit?id=' + String(item.id) + '">' + item.question + '</a>' +
'<div class="up-list-item__actions">' +
'<a role="button" onclick="deleteItem(' + String(item.id) + ')" class="up-icon-btn" title="حذف" aria-label="حذف این پرسش"><i class="noindent-info-button delete-icon"></i></a>' +
'</div>' +
'</div>';
}
async function deleteCategory() {
var sel = document.getElementById('cat'); var sel = document.getElementById('cat');
var text= sel.options[sel.selectedIndex].text; var text = sel.options[sel.selectedIndex].text;
if (!confirm('آیا از حذف '+text+' اطمینان دارید؟')) var ok = await upConfirm('آیا از حذف ' + text + ' اطمینان دارید؟');
return; if (!ok) return;
$.ajax({ $.ajax({
type: "DELETE", type: "DELETE",
url: '', url: '',
data: { data: { id: sel.value },
id: sel.value
},
error: function (e) { error: function (e) {
if (e.responseText == null) upToast(e.responseText || 'خطا رخ داد.', 'error');
alert(e);
else
alert(e.responseText);
}, },
success: function () { success: function () {
location.reload(); location.reload();
}, },
}); });
} }
function deleteItem(id) {
if (!confirm('آیا از حذف این پرسش اطمینان دارید؟')) async function deleteItem(id) {
return; var ok = await upConfirm('آیا از حذف این پرسش اطمینان دارید؟');
if (!ok) return;
$.ajax({ $.ajax({
type: "DELETE", type: "DELETE",
url: '?Handler=Item', url: '?Handler=Item',
data: { data: { id: id },
id: id
},
error: function (e) { error: function (e) {
if (e.responseText == null) upToast(e.responseText || 'خطا رخ داد.', 'error');
alert(e);
else
alert(e.responseText);
}, },
success: function () { success: function () {
location.reload(); location.reload();
}, },
}); });
} }
function onSelectedCatChanged(){
function onSelectedCatChanged() {
var sel = document.getElementById('cat'); var sel = document.getElementById('cat');
if(sel.selectedIndex >= 0){ if (sel.selectedIndex >= 0) {
document.getElementById('catItems').innerHTML = 'در حال بارگذاری ...'; document.getElementById('catItems').innerHTML = 'در حال بارگذاری ...';
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: '?Handler=CategoryItems', url: '?Handler=CategoryItems',
data: { data: { id: sel.value },
id: sel.value error: function (e) {
}, document.getElementById('catItems').innerHTML = '';
error: function (e) { upToast(e.responseText || 'خطا رخ داد.', 'error');
document.getElementById('catItems').innerHTML = ''; },
if (e.responseText == null) success: function (items) {
alert(e); var s = '';
else for (var i = 0; i < items.length; i++) {
alert(e.responseText); s += faqItemRow(items[i]);
}, }
success: function (items) { document.getElementById('catItems').innerHTML = s || '<p class="up-text-muted">پرسشی در این دسته نیست.</p>';
var s = ''; },
for(var i=0; i<items.length; i++){ });
s += ('<p><a href="/User/FAQItemEdit?id='+String(items[i].id)+'">' + '<p>' + items[i].question + '</a></p>');
s += ('<a role="button" onclick="deleteItem('+String(items[i].id)+')" class="actionlink" title="حذف"><i class="noindent-info-button delete-icon"></i></a>');
}
document.getElementById('catItems').innerHTML = s;
},
});
} }
} }
</script> </script>
<table>
<tr> <div class="up-card">
<td>دسته‌بندی پرسش‌ها:</td> <div class="up-field">
<td> <label for="cat">دسته‌بندی پرسش‌ها</label>
<select name="cat" id="cat" onchange="onSelectedCatChanged()"> <div class="up-form-actions">
<select name="cat" id="cat" onchange="onSelectedCatChanged()" style="flex:1;">
@foreach (var category in Model.Categories) @foreach (var category in Model.Categories)
{ {
@if (category.Id == Model.CatId) @if (category.Id == Model.CatId)
@ -116,31 +111,32 @@ else
} }
} }
</select> </select>
<a role="button" onclick="editCategory()" class="actionlink" title="ویرایش"><i class="noindent-info-button edit-poem-button"></i></a> <a role="button" onclick="editCategory()" class="up-icon-btn" title="ویرایش" aria-label="ویرایش دسته"><i class="noindent-info-button edit-poem-button"></i></a>
<a role="button" onclick="deleteCategory()" class="actionlink" title="حذف"><i class="noindent-info-button delete-icon"></i></a> <a role="button" onclick="deleteCategory()" class="up-icon-btn" title="حذف" aria-label="حذف دسته"><i class="noindent-info-button delete-icon"></i></a>
</td> </div>
</tr> </div>
<tr> <a role="button" href="/User/FAQCatEdit" class="up-btn up-btn--ghost" title="جدید">دستهٔ جدید</a>
<td colspan="2"> </div>
<a role="button" href="/User/FAQCatEdit" class="pagebutton" title="جدید">دستهٔ جدید</a>
</td>
</tr>
</table>
<h2>پرسش‌های دستهٔ جاری</h2> <div class="up-page-header">
<p> <h2>پرسش‌های دستهٔ جاری</h2>
<a role="button" onclick="newItem()" class="pagebutton">پرسش جدید</a> </div>
</p> <div class="up-form-actions" style="margin-bottom:var(--up-space-3);">
<div id="catItems"> <a role="button" onclick="newItem()" class="up-btn up-btn--success">پرسش جدید</a>
</div>
<div id="catItems" class="up-list">
@if (Model.CategoryItems != null) @if (Model.CategoryItems != null)
{ {
@foreach (var item in Model.CategoryItems) @foreach (var item in Model.CategoryItems)
{ {
<p><a href="/User/FAQItemEdit?id=@item.Id">@item.Question</a></p> <div class="up-list-item">
<a role="button" onclick="deleteItem(@item.Id)" class="actionlink" title="حذف"><i class="noindent-info-button delete-icon"></i></a> <a href="/User/FAQItemEdit?id=@item.Id">@item.Question</a>
<div class="up-list-item__actions">
<a role="button" onclick="deleteItem(@item.Id)" class="up-icon-btn" title="حذف" aria-label="حذف این پرسش"><i class="noindent-info-button delete-icon"></i></a>
</div>
</div>
} }
} }
</div> </div>
} }

View File

@ -1,4 +1,4 @@
@page @page
@model GanjooRazor.Areas.User.Pages.FinalizeImagesModel @model GanjooRazor.Areas.User.Pages.FinalizeImagesModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{ @{
@ -6,50 +6,49 @@
ViewData["Title"] = "نهایی‌سازی تصاویر پیشنهادی"; ViewData["Title"] = "نهایی‌سازی تصاویر پیشنهادی";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
} }
<h1>@ViewData["Title"]</h1> <div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
@if (Model.MainImage == null)
@if (Model.MainImage != null)
{ {
<table style="width:100%" class="noborder"> <partial name="_EmptyState" model="@("تصویری برای نهایی‌سازی وجود ندارد.")" />
<tr> }
<td colspan="2"> else
<a href="@Model.MainImage.GanjoorUrl" target="_blank">@Model.MainImage.GanjoorTitle</a> {
</td> <div class="up-card">
</tr> <p><a href="@Model.MainImage.GanjoorUrl" target="_blank">@Model.MainImage.GanjoorTitle</a></p>
<tr>
<td> <div style="display:flex;gap:var(--up-space-3);flex-wrap:wrap;">
<img src="@Model.MainImage.ExternalNormalSizeImageUrl" /> <div>
</td> <p class="up-hint">تصویر پیشنهادی</p>
<td> <img src="@Model.MainImage.ExternalNormalSizeImageUrl" style="max-width:100%;" />
</div>
@if (Model.PreviouslyLinkedImage != null) @if (Model.PreviouslyLinkedImage != null)
{ {
<img src="@Model.PreviouslyLinkedImage.ExternalNormalSizeImageUrl" /> <div>
<p class="up-hint">تصویر فعلی</p>
<img src="@Model.PreviouslyLinkedImage.ExternalNormalSizeImageUrl" style="max-width:100%;" />
</div>
} }
</td> </div>
</tr>
<tr> <form method="post" class="up-form">
<td colspan="2"> <input type="hidden" asp-for="ImageLinkFinalizeModel.Id" />
<form method="post"> <div class="up-field">
<input type="hidden" asp-for="ImageLinkFinalizeModel.Id" /> <label asp-for="ImageLinkFinalizeModel.DisplayOnPage"></label>
<input asp-for="ImageLinkFinalizeModel.DisplayOnPage" /> <input asp-for="ImageLinkFinalizeModel.DisplayOnPage" />
<button type="submit" name="approve" id="approve" style="width:100%;color:white;background-color:green">تأیید</button> </div>
</form> <div class="up-form-actions">
</td> <button type="submit" name="approve" id="approve" class="up-btn up-btn--success">تأیید</button>
</tr> </div>
<tr> </form>
<td>
تعداد کل: <p class="up-hint">تعداد کل: @Model.TotalCount</p>
</td> </div>
<td> }
@Model.TotalCount
</td>
</tr>
</table>
}

View File

@ -1,112 +1,83 @@
@page @page
@model GanjooRazor.Areas.User.Pages.ReportedCommentsModel @model GanjooRazor.Areas.User.Pages.ReportedCommentsModel
@using DNTPersianUtils.Core @using DNTPersianUtils.Core
@{ @{
Layout = "_UserPanelLayout"; Layout = "_UserPanelLayout";
ViewData["Title"] = "حاشیه‌های گزارش شده"; ViewData["Title"] = "حاشیه‌های گزارش شده";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
string color = "gray";
} }
<h1>@ViewData["Title"]</h1> <div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
else else
{ {
<script> <script>
function moderateReportedComment(reportId) { async function moderateReportedComment(reportId) {
if (!confirm('آیا از حذف این حاشیه اطمینان دارید؟')) var ok = await upConfirm('آیا از حذف این حاشیه اطمینان دارید؟');
return; if (!ok) return;
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: '?handler=ModerateComment', url: '?handler=ModerateComment',
data: { data: { id: reportId },
id: reportId, error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
}, },
success: function () { success: function () {
var commentBlockId = '#report-' + reportId; $('#report-' + reportId).remove();
$(commentBlockId).remove(); upToast('حاشیه حذف شد.', 'success');
}, },
}); });
} }
function deleteReport(reportId) { function deleteReport(reportId) {
$.ajax({ $.ajax({
type: "DELETE", type: "DELETE",
url: '?handler=Report', url: '?handler=Report',
data: { data: { id: reportId },
id: reportId error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
}, },
success: function () { success: function () {
var commentBlockId = '#report-' + reportId; $('#report-' + reportId).remove();
$(commentBlockId).remove(); upToast('گزارش حذف شد.', 'success');
}, },
}); });
} }
</script> </script>
<p style="text-align:center"> <partial name="_Pagination" model="Model.PaginationLinks" />
@foreach (var paginationLink in Model.PaginationLinks)
{
if (!string.IsNullOrEmpty(paginationLink.Url))
{
<a href="@paginationLink.Url">@paginationLink.Name</a>
}
else
{
@paginationLink.Name
}
}
</p>
@foreach (var report in Model.Reports) @if (Model.Reports.Count == 0)
{ {
if (color == "gray") <partial name="_EmptyState" model="@("گزارش رسیدگی‌نشده‌ای وجود ندارد.")" />
color = "lightsteelblue"; }
else else
color = "gray"; {
<div class="up-list">
<div style="background-color:@color" id="report-@report.Id"> @foreach (var report in Model.Reports)
<p style="color:red"> {
@report.ReasonCode <div class="up-list-item" id="report-@report.Id">
</p> <span class="up-badge up-badge--danger">@report.ReasonCode</span>
<hr /> <p>@report.ReasonText</p>
<p style="color:red"> <blockquote>
@report.ReasonText @Html.Raw(report.Comment.HtmlComment)
</p> <div class="up-list-item__meta">
<hr /> @report.Comment.AuthorName در @report.Comment.CommentDate.ToFriendlyPersianDateTextify() دربارهٔ <a href="@report.Comment.Poem.UrlSlug#comment-@report.Comment.Id">@report.Comment.Poem.Title</a>
<blockquote> </div>
@Html.Raw(report.Comment.HtmlComment) </blockquote>
<p> <div class="up-list-item__actions">
@report.Comment.AuthorName <small>در @report.Comment.CommentDate.ToFriendlyPersianDateTextify()</small> دربارهٔ <a href="@report.Comment.Poem.UrlSlug#comment-@report.Comment.Id">@report.Comment.Poem.Title</a> <a role="button" onclick="moderateReportedComment(@report.Id)" class="up-btn up-btn--danger up-btn--sm" title="تأیید و حذف حاشیه">✓ درست می‌گوید</a>
</p> <a role="button" onclick="deleteReport(@report.Id)" class="up-btn up-btn--ghost up-btn--sm" title="حذف گزارش">گزارش نابجا ❌</a>
</blockquote> </div>
<a role="button" onclick="moderateReportedComment(@report.Id)" class="actionlink" style="color:green" title="تأیید و حذف حاشیه">✓ درست می‌گوید</a> </div>
&nbsp;&nbsp;&nbsp; }
<a role="button" onclick="deleteReport(@report.Id, @report.Comment.Id)" class="actionlink" style="color:red" title="حذف گزارش">گزارش نابجا ❌</a> </div>
</div>
<hr />
} }
<p style="text-align:center"> <partial name="_Pagination" model="Model.PaginationLinks" />
@foreach (var paginationLink in Model.PaginationLinks) }
{
if (!string.IsNullOrEmpty(paginationLink.Url))
{
<a href="@paginationLink.Url">@paginationLink.Name</a>
}
else
{
@paginationLink.Name
}
}
</p>
}

View File

@ -1,4 +1,4 @@
@page @page
@model GanjooRazor.Areas.User.Pages.ReviewSongsModel @model GanjooRazor.Areas.User.Pages.ReviewSongsModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using DNTPersianUtils.Core @using DNTPersianUtils.Core
@ -7,266 +7,187 @@
ViewData["Title"] = "آهنگ‌های پیشنهادی"; ViewData["Title"] = "آهنگ‌های پیشنهادی";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
} }
<h1>@ViewData["Title"]</h1> <div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
else if (@Model.PoemMusicTrackViewModel == null) else if (@Model.PoemMusicTrackViewModel == null)
{ {
<p>پیشنهادی وجود ندارد.</p> <partial name="_EmptyState" model="@("پیشنهادی وجود ندارد.")" />
} }
else if (@Model.Poem == null) else if (@Model.Poem == null)
{ {
<p>شعر مرتبط یافت نشد!</p> <div class="up-alert up-alert--warning">شعر مرتبط یافت نشد!</div>
} }
else else
{ {
<div class="up-card">
<form method="post" class="up-form">
<div class="up-field">
<form method="post"> <label>شعر</label>
<table style="width:100%" class="noborder"> <div>
<tr>
<td>
<span class="inputlabel">شعر: </span>
</td>
<td>
<a href="@Html.Raw(Model.Poem.FullUrl)" target="_blank">@Model.Poem.FullTitle</a> <a href="@Html.Raw(Model.Poem.FullUrl)" target="_blank">@Model.Poem.FullTitle</a>
<input type="hidden" asp-for="PoemMusicTrackViewModel.Id" /> <input type="hidden" asp-for="PoemMusicTrackViewModel.Id" />
<input type="hidden" asp-for="PoemMusicTrackViewModel.PoemId" /> <input type="hidden" asp-for="PoemMusicTrackViewModel.PoemId" />
<input type="hidden" asp-for="PoemMusicTrackViewModel.GolhaTrackId" /> <input type="hidden" asp-for="PoemMusicTrackViewModel.GolhaTrackId" />
<input type="hidden" asp-for="PoemMusicTrackViewModel.TrackType" /> <input type="hidden" asp-for="PoemMusicTrackViewModel.TrackType" />
</td> </div>
</tr> </div>
<tr>
<td> <div class="up-field">
<span class="inputlabel">پیشنهاد دهنده: </span> <label>پیشنهاد دهنده</label>
</td> <div><a href="/hashieha/?userid=@Model.PoemMusicTrackViewModel.SuggestedById" target="_blank">@Model.PoemMusicTrackViewModel.SuggestedByNickName</a></div>
<td> </div>
<a href="/hashieha/?userid=@Model.PoemMusicTrackViewModel.SuggestedById" target="_blank">@Model.PoemMusicTrackViewModel.SuggestedByNickName</a>
</td>
</tr>
@if (Model.UserSongSuggestionsHistory != null && (Model.UserSongSuggestionsHistory.Approved + Model.UserSongSuggestionsHistory.Rejected) > 0) @if (Model.UserSongSuggestionsHistory != null && (Model.UserSongSuggestionsHistory.Approved + Model.UserSongSuggestionsHistory.Rejected) > 0)
{ {
<tr> <div class="up-form-actions">
<td> @if (Model.UserSongSuggestionsHistory.Approved > 0)
@if (Model.UserSongSuggestionsHistory.Approved > 0) {
{ <span class="up-badge up-badge--success">@Model.UserSongSuggestionsHistory.Approved.ToPersianNumbers() پیشنهاد تأیید شده</span>
<span style="color:green"><strong>@Model.UserSongSuggestionsHistory.Approved.ToPersianNumbers()</strong> پیشنهاد تأیید شده</span> }
} @if (Model.UserSongSuggestionsHistory.Rejected > 0)
{
</td> <span class="up-badge up-badge--danger">@Model.UserSongSuggestionsHistory.Rejected.ToPersianNumbers() پیشنهاد رد شده</span>
<td> }
@if (Model.UserSongSuggestionsHistory.Rejected > 0) </div>
{
<span style="color:red"><strong>@Model.UserSongSuggestionsHistory.Rejected.ToPersianNumbers()</strong> پیشنهاد رد شده</span>
}
</td>
</tr>
} }
<tr> <div>
<td colspan="2"> @{
@{ switch (Model.PoemMusicTrackViewModel.TrackType)
switch (Model.PoemMusicTrackViewModel.TrackType) {
{ case RMuseum.Models.Ganjoor.PoemMusicTrackType.Spotify:
case RMuseum.Models.Ganjoor.PoemMusicTrackType.Spotify: <img src="/image/spotify.png" alt="اسپاتیفای" height="32" />
<img src="/image/spotify.png" alt="اسپاتیفای" height="32" /> break;
break; case RMuseum.Models.Ganjoor.PoemMusicTrackType.Golha:
case RMuseum.Models.Ganjoor.PoemMusicTrackType.Golha: <img src="/image/golha.png" alt="گلها" height="32" />
<img src="/image/golha.png" alt="گلها" height="32" /> break;
break; default:
default: <img src="/image/beeptunes.png" alt="بیپ‌تونز" height="32" />
<img src="/image/beeptunes.png" alt="بیپ‌تونز" height="32" /> break;
break;
}
} }
</td> }
</tr> </div>
<tr>
<td>
<span class="inputlabel">خواننده: </span>
</td>
<td>
<input style="width:100%" asp-for="PoemMusicTrackViewModel.ArtistName" /><br />
</td>
</tr>
<tr>
<td>
<span class="inputlabel"><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.ArtistUrl)">نشانی خواننده:</a></span>
</td>
<td>
<input style="width:100%;text-align:left;direction:ltr;" asp-for="PoemMusicTrackViewModel.ArtistUrl" />
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
<span class="inputlabel">آلبوم:</span>
</td>
<td>
<input style="width:100%" asp-for="PoemMusicTrackViewModel.AlbumName" /><br />
</td>
</tr>
<tr>
<td>
<span class="inputlabel"><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.AlbumUrl)">نشانی آلبوم:</a></span>
</td>
<td>
<input style="width:100%;text-align:left;direction:ltr;" asp-for="PoemMusicTrackViewModel.AlbumUrl" />
</td>
</tr>
<tr>
<td>
<span class="inputlabel">آهنگ:</span>
</td>
<td>
<input style="width:100%" asp-for="PoemMusicTrackViewModel.TrackName" />
</td>
</tr>
<tr>
<td>
<span class="inputlabel"><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.TrackUrl)">نشانی آهنگ:</a></span>
</td>
<td>
<input style="width:100%;text-align:left;direction:ltr;" asp-for="PoemMusicTrackViewModel.TrackUrl" />
</td>
</tr>
<tr>
<td>
<span class="inputlabel">توضیح: </span>
</td>
<td>
<input style="width:100%" asp-for="PoemMusicTrackViewModel.Description" /><br />
</td>
</tr>
<tr>
<td>
<button type="submit" name="approve" id="approve" style="width:100%;color:white;background-color:green">
@if (Model.EditMode)
{
<text>اصلاح</text>
}
else
{
<text>تأیید</text>
}
</button>
</td>
<td>
<table style="width:100%" class="noborder">
@if (Model.EditMode)
{
<tr>
<td>
<button type="submit" name="delsong" id="delsong" style="width:100%;color:white;background-color:darkred">حذف</button>
</td>
</tr> <div class="up-field">
<label asp-for="PoemMusicTrackViewModel.ArtistName">خواننده</label>
<input asp-for="PoemMusicTrackViewModel.ArtistName" />
</div>
<div class="up-field up-field--ltr">
<label><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.ArtistUrl)">نشانی خواننده</a></label>
<input asp-for="PoemMusicTrackViewModel.ArtistUrl" />
</div>
} <div class="up-field">
else <label asp-for="PoemMusicTrackViewModel.AlbumName">آلبوم</label>
{ <input asp-for="PoemMusicTrackViewModel.AlbumName" />
<tr> </div>
<td> <div class="up-field up-field--ltr">
<button type="submit" name="reject1" id="reject1" style="width:100%;color:white;background-color:darkred">در آهنگ این شعر خوانده نشده</button> <label><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.AlbumUrl)">نشانی آلبوم</a></label>
</td> <input asp-for="PoemMusicTrackViewModel.AlbumUrl" />
</div>
</tr> <div class="up-field">
<tr> <label asp-for="PoemMusicTrackViewModel.TrackName">آهنگ</label>
<td> <input asp-for="PoemMusicTrackViewModel.TrackName" />
<button type="submit" name="reject2" id="reject2" style="width:100%;color:white;background-color:darkred">لینک یا اطلاعات آهنگ ایراد دارد</button> </div>
</td> <div class="up-field up-field--ltr">
</tr> <label><a target="_blank" href="@Html.Raw(Model.PoemMusicTrackViewModel.TrackUrl)">نشانی آهنگ</a></label>
<tr> <input asp-for="PoemMusicTrackViewModel.TrackUrl" />
<td> </div>
<button type="submit" name="reject3" id="reject3" style="width:100%;color:white;background-color:darkred">رد به دلیل دیگر:</button>
</td>
<td>
<input style="width:100%" asp-for="PoemMusicTrackViewModel.RejectionCause" /><br />
</td>
</tr>
<tr>
<td>
<button type="submit" name="next" id="next" style="width:100%;color:white;background-color:orange">بعدی</button>
</td>
</tr>
}
</table>
</td> <div class="up-field">
</tr> <label asp-for="PoemMusicTrackViewModel.Description">توضیح</label>
<tr> <input asp-for="PoemMusicTrackViewModel.Description" />
<td> </div>
تعداد کل:
</td>
<td>
@Model.TotalCount
</td>
</tr>
</table>
</form> <div class="up-form-actions">
<button type="submit" name="approve" id="approve" class="up-btn up-btn--success">
@if (Model.EditMode)
{
<text>اصلاح</text>
}
else
{
<text>تأیید</text>
}
</button>
@if (Model.EditMode)
{
<button type="submit" name="delsong" id="delsong" class="up-btn up-btn--danger">حذف</button>
}
else
{
<button type="submit" name="reject1" id="reject1" class="up-btn up-btn--danger">در آهنگ این شعر خوانده نشده</button>
<button type="submit" name="reject2" id="reject2" class="up-btn up-btn--danger">لینک یا اطلاعات آهنگ ایراد دارد</button>
<button type="submit" name="next" id="next" class="up-btn up-btn--ghost">بعدی</button>
}
</div>
@if (!Model.EditMode)
{
<div class="up-field">
<label asp-for="PoemMusicTrackViewModel.RejectionCause">رد به دلیل دیگر</label>
<div class="up-form-actions">
<input asp-for="PoemMusicTrackViewModel.RejectionCause" style="flex:1;" />
<button type="submit" name="reject3" id="reject3" class="up-btn up-btn--danger">رد</button>
</div>
</div>
}
<p class="up-hint">تعداد کل: @Model.TotalCount</p>
</form>
</div>
} }
@if (ViewData.ContainsKey("ganjoor-songrevu")) @if (ViewData.ContainsKey("ganjoor-songrevu"))
{ {
<a class="nav-link text-dark" asp-area="User" asp-page="/AddSong">اضافه کردن آهنگ از منبع دلخواه</a> <div class="up-form-actions">
<a class="up-btn up-btn--ghost" asp-area="User" asp-page="/AddSong">اضافه کردن آهنگ از منبع دلخواه</a>
</div>
} }
<script> <script>
function rebuildMundex() { async function rebuildMundex() {
if (!confirm('آیا از بازسازی صفحات نمایهٔ موسیقی اطمینان دارید؟')) var ok = await upConfirm('آیا از بازسازی صفحات نمایهٔ موسیقی اطمینان دارید؟');
return; if (!ok) return;
var url = '?handler=RebuildMundex';
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: url, url: '?handler=RebuildMundex',
error: function () { error: function () {
alert('خطا رخ داد.') upToast('خطا رخ داد.', 'error');
}, },
success: function () { success: function () {
alert('فرایند بازسازی صفحات نمایهٔ موسیقی شروع شد.') upToast('فرایند بازسازی صفحات نمایهٔ موسیقی شروع شد.', 'success');
}, },
}); });
} }
function cleanMundexCache() { async function cleanMundexCache() {
if (!confirm('آیا از حذف کش صفحات موسیقی اطمینان دارید؟')) var ok = await upConfirm('آیا از حذف کش صفحات موسیقی اطمینان دارید؟');
return; if (!ok) return;
var url = '?handler=CleanMundexCache';
$.ajax({ $.ajax({
type: "POST", type: "POST",
url: url, url: '?handler=CleanMundexCache',
error: function () { error: function () {
alert('خطا رخ داد.') upToast('خطا رخ داد.', 'error');
}, },
success: function () { success: function () {
alert('کش صفخات پاک شد.') upToast('کش صفحات پاک شد.', 'success');
}, },
}); });
} }
</script> </script>
<p><a role="button" onclick="rebuildMundex()" class="actionlink" title="بازسازی صفحات نمایهٔ موسیقی">بازسازی صفحات نمایهٔ موسیقی</a></p> <div class="up-form-actions">
<a role="button" onclick="rebuildMundex()" class="up-btn up-btn--ghost" title="بازسازی صفحات نمایهٔ موسیقی">بازسازی صفحات نمایهٔ موسیقی</a>
<p><a role="button" onclick="cleanMundexCache()" class="actionlink" title="حذف کش صفحات نمایهٔ موسیقی">حذف کش صفحات نمایهٔ موسیقی</a></p> <a role="button" onclick="cleanMundexCache()" class="up-btn up-btn--ghost" title="حذف کش صفحات نمایهٔ موسیقی">حذف کش صفحات نمایهٔ موسیقی</a>
</div>

View File

@ -1,4 +1,4 @@
@page @page
@model GanjooRazor.Areas.User.Pages.SuggestedPoetPhotosModel @model GanjooRazor.Areas.User.Pages.SuggestedPoetPhotosModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{ @{
@ -6,106 +6,61 @@
ViewData["Title"] = "تصاویر پیشنهادی برای تصاویر سخنوران"; ViewData["Title"] = "تصاویر پیشنهادی برای تصاویر سخنوران";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
} }
<div class="up-page-header">
<h1>@ViewData["Title"]</h1> <h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
else else
{ {
<form method="post"> <div class="up-card">
<table style="width:100%" class="noborder"> <form method="post" class="up-form">
<tr> <div class="up-field">
<td> <label>سخنور</label>
<span class="inputlabel">سخنور: </span> <div>
</td>
<td>
<a href="/photos?p=@Model.Poet.FullUrl.Substring(1)" target="_blank">@Model.Poet.Nickname</a> <a href="/photos?p=@Model.Poet.FullUrl.Substring(1)" target="_blank">@Model.Poet.Nickname</a>
<input type="hidden" asp-for="Suggestion.Id" /> <input type="hidden" asp-for="Suggestion.Id" />
<input type="hidden" asp-for="Suggestion.PoetId" /> <input type="hidden" asp-for="Suggestion.PoetId" />
<input type="hidden" asp-for="Suggestion.SuggestedById" /> <input type="hidden" asp-for="Suggestion.SuggestedById" />
</td> </div>
</tr> </div>
<tr>
<td>
<span class="inputlabel">پیشنهاد دهنده: </span>
</td>
<td>
<a href="/hashieha/?userid=@Model.Suggestion.SuggestedById" target="_blank">@Model.Suggestion.SuggestedById</a>
</td>
</tr>
<tr> <div class="up-field">
<td colspan="2"> <label>پیشنهاد دهنده</label>
<img src="@Model.Suggestion.ImageUrl" /> <div><a href="/hashieha/?userid=@Model.Suggestion.SuggestedById" target="_blank">@Model.Suggestion.SuggestedById</a></div>
</td> </div>
</tr>
<tr> <img src="@Model.Suggestion.ImageUrl" style="max-width:100%;" />
<td>
<span class="inputlabel">عنوان: </span>
</td>
<td>
<input asp-for="Suggestion.Title" />
</td>
</tr>
<tr> <div class="up-field">
<td> <label asp-for="Suggestion.Title">عنوان</label>
<span class="inputlabel">توضیحات: </span> <input asp-for="Suggestion.Title" />
</td> </div>
<td>
<textarea asp-for="Suggestion.Description" class="editor"></textarea>
</td>
</tr>
<tr>
<td>
<span class="inputlabel">ترتیب: </span>
</td>
<td>
<input asp-for="Suggestion.PicOrder" />
</td>
</tr>
<tr>
<td>
<button type="submit" name="approve" id="approve" style="width:100%;color:white;background-color:green">تأیید</button>
</td>
<td>
<table style="width:100%" class="noborder">
<tr>
<td>
<span class="inputlabel">علت رد: </span>
<input asp-for="Suggestion.RejectionCause" />
</td>
</tr>
<tr>
<td>
<button type="submit" name="reject" id="reject" style="width:100%;color:white;background-color:darkred">رد</button>
</td>
</tr>
<tr>
<td>
<button type="submit" name="next" id="next" style="width:100%;color:white;background-color:orange">بعدی</button>
</td>
</tr>
</table>
</td> <div class="up-field">
</tr> <label asp-for="Suggestion.Description">توضیحات</label>
<textarea asp-for="Suggestion.Description" class="editor"></textarea>
</div>
<tr> <div class="up-field">
<td> <label asp-for="Suggestion.PicOrder">ترتیب</label>
تعداد کل: <input asp-for="Suggestion.PicOrder" />
</td> </div>
<td>
@Model.TotalCount
</td>
</tr>
<div class="up-field">
<label asp-for="Suggestion.RejectionCause">علت رد (در صورت رد)</label>
<input asp-for="Suggestion.RejectionCause" />
</div>
</table> <div class="up-form-actions">
<button type="submit" name="approve" id="approve" class="up-btn up-btn--success">تأیید</button>
</form> <button type="submit" name="reject" id="reject" class="up-btn up-btn--danger">رد</button>
<button type="submit" name="next" id="next" class="up-btn up-btn--ghost">بعدی</button>
</div>
<p class="up-hint">تعداد کل: @Model.TotalCount</p>
</form>
</div>
} }

View File

@ -1,4 +1,4 @@
@page @page
@model GanjooRazor.Areas.User.Pages.SuggestedPoetSpecLinesModel @model GanjooRazor.Areas.User.Pages.SuggestedPoetSpecLinesModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{ @{
@ -6,84 +6,50 @@
ViewData["Title"] = "نکات پیشنهادی برای تصاویر سخنوران"; ViewData["Title"] = "نکات پیشنهادی برای تصاویر سخنوران";
await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData); await GanjooRazor.Utils.GanjoorSessionChecker.ApplyPermissionsToViewData(Request, Response, ViewData);
} }
<div class="up-page-header">
<h1>@ViewData["Title"]</h1> <h1>@ViewData["Title"]</h1>
</div>
@if (Model.LastError != "") @if (Model.LastError != "")
{ {
<h2>@Model.LastError</h2> <div class="up-alert up-alert--danger">@Model.LastError</div>
} }
else else
{ {
<form method="post"> <div class="up-card">
<table style="width:100%" class="noborder"> <form method="post" class="up-form">
<tr> <div class="up-field">
<td> <label>سخنور</label>
<span class="inputlabel">سخنور: </span> <div>
</td>
<td>
<a href="/photos?p=@Model.Poet.FullUrl.Substring(1)" target="_blank">@Model.Poet.Nickname</a> <a href="/photos?p=@Model.Poet.FullUrl.Substring(1)" target="_blank">@Model.Poet.Nickname</a>
<input type="hidden" asp-for="Suggestion.Id" /> <input type="hidden" asp-for="Suggestion.Id" />
<input type="hidden" asp-for="Suggestion.PoetId" /> <input type="hidden" asp-for="Suggestion.PoetId" />
<input type="hidden" asp-for="Suggestion.LineOrder" /> <input type="hidden" asp-for="Suggestion.LineOrder" />
<input type="hidden" asp-for="Suggestion.SuggestedById" /> <input type="hidden" asp-for="Suggestion.SuggestedById" />
</td> </div>
</tr> </div>
<tr>
<td>
<span class="inputlabel">پیشنهاد دهنده: </span>
</td>
<td>
<a href="/hashieha/?userid=@Model.Suggestion.SuggestedById" target="_blank">@Model.Suggestion.SuggestedById</a>
</td>
</tr>
<tr> <div class="up-field">
<td> <label>پیشنهاد دهنده</label>
<span class="inputlabel">نکته: </span> <div><a href="/hashieha/?userid=@Model.Suggestion.SuggestedById" target="_blank">@Model.Suggestion.SuggestedById</a></div>
</td> </div>
<td>
<textarea asp-for="Suggestion.Contents" class="editor"></textarea>
</td>
</tr>
<tr>
<td>
<button type="submit" name="approve" id="approve" style="width:100%;color:white;background-color:green">تأیید</button>
</td>
<td>
<table style="width:100%" class="noborder">
<tr>
<td>
<span class="inputlabel">علت رد: </span>
<input asp-for="Suggestion.RejectionCause" />
</td>
</tr>
<tr>
<td>
<button type="submit" name="reject" id="reject" style="width:100%;color:white;background-color:darkred">رد</button>
</td>
</tr>
<tr>
<td>
<button type="submit" name="next" id="next" style="width:100%;color:white;background-color:orange">بعدی</button>
</td>
</tr>
</table>
</td> <div class="up-field">
</tr> <label asp-for="Suggestion.Contents">نکته</label>
<textarea asp-for="Suggestion.Contents" class="editor"></textarea>
</div>
<tr> <div class="up-field">
<td> <label asp-for="Suggestion.RejectionCause">علت رد (در صورت رد)</label>
تعداد کل: <input asp-for="Suggestion.RejectionCause" />
</td> </div>
<td>
@Model.TotalCount
</td>
</tr>
<div class="up-form-actions">
<button type="submit" name="approve" id="approve" class="up-btn up-btn--success">تأیید</button>
<button type="submit" name="reject" id="reject" class="up-btn up-btn--danger">رد</button>
<button type="submit" name="next" id="next" class="up-btn up-btn--ghost">بعدی</button>
</div>
</table> <p class="up-hint">تعداد کل: @Model.TotalCount</p>
</form>
</form> </div>
}
}