divan/GanjooRazor/Areas/Admin/Pages/ReviewPartEdits.cshtml
2026-09-27 14:03:38 +03:30

527 lines
27 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@page
@model GanjooRazor.Areas.Admin.Pages.ReviewPartEditsModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using DNTPersianUtils.Core
@{
Layout = "_AdminLayout";
}
@if (Model.DeletedUserSections)
{
ViewData["Title"] = "وزن‌های نیافته";
}
else
{
ViewData["Title"] = "بازبینی ویرایش‌های قطعات";
}
<div class="up-page-header">
<h1>@ViewData["Title"]</h1>
</div>
<div class="up-form-actions" style="margin-bottom:var(--up-space-3);">
@if (Model.DeletedUserSections == false)
{
<a role="button" href="/Admin/ReviewPartEdits/?deletedUserSections=true" class="up-btn up-btn--ghost">وزن‌های نیافته</a>
}
else
{
<a role="button" href="/Admin/ReviewPartEdits" class="up-btn up-btn--ghost">پیشنهادهای عادی</a>
}
</div>
@if (!string.IsNullOrEmpty(Model.FatalError))
{
<div class="up-alert up-alert--danger">@Model.FatalError</div>
}
else if (Model.Correction == null)
{
<partial name="_EmptyState" model="@("ویرایشی وجود ندارد.")" />
}
else if (Model.DeletedUserSections)
{
<div class="up-card">
<p class="up-hint">تعداد کل: @Model.TotalCount</p>
<p><a role="button" target="_blank" href="@Model.PageInformation.FullUrl" class="up-btn up-btn--ghost up-btn--sm">@Model.PageInformation.FullTitle</a></p>
<div>@Html.Raw(Model.PoemSection.HtmlText)</div>
<div class="up-field">
<label for="select-search">جستجوی وزن</label>
<input type="text" id="select-search" value="" oninput="doSearchInRhythmsCombo('select-search', 'rhythm-new')" list="inputRhythms" autocomplete="off" autofocus />
<datalist id="inputRhythms">
@if (Model.RhythmsByVerseCount != null)
{
foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
}
</datalist>
</div>
<script>
function suggestRhythmForDeletedUser(id, correctionId) {
var rhythm_new = $('#rhythm-new').val();
$('#savecorrections').hide();
$('#saving').text('در حال ذخیره ...');
var url = '?handler=SuggestRhythm';
$.ajax({
type: "POST",
url: url,
data: {
sectionId: id,
correctionId: correctionId,
rhythm: rhythm_new
},
success: function () {
location.reload(true);
},
error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
$('#savecorrections').show();
$('#saving').text('');
}
});
}
</script>
<div class="up-field">
<label for="rhythm-new">وزن انتخاب شده</label>
<select id="rhythm-new" name="rhythm-new">
@foreach (var rhythm in Model.RhythmsAlphabetically)
{
<option value="@rhythm.Rhythm">@(rhythm.Rhythm == "" ? "هیچکدام" : rhythm.Rhythm == "null" ? "وزن‌یابی نشده" : rhythm.Rhythm)</option>
}
</select>
<div class="up-form-actions" style="margin-top:var(--up-space-2);">
<a role="button" onclick="resetRhythm('rhythm-new')" class="up-btn up-btn--ghost up-btn--sm">پاک کردن وزن</a>
<a role="button" onclick="newRhythm()" class="up-btn up-btn--ghost up-btn--sm">پیشنهاد وزن جدید</a>
</div>
</div>
<script>
function newRhythm() {
var rhythm = prompt("پیشنهاد وزن جدید", "");
if (rhythm != null) {
var select = document.getElementById('rhythm-new');
var options = select.options;
for (let i = 0; i < options.length; i++) {
if (options[i].value == rhythm) {
upToast('وزن پیشنهادی تکراری است.', 'error');
return;
}
}
var opt = document.createElement('option');
opt.value = rhythm;
opt.innerHTML = rhythm;
select.appendChild(opt);
var opt2 = document.createElement('option');
opt2.value = rhythm;
opt2.innerHTML = rhythm;
document.getElementById('rhythm-new2').appendChild(opt2);
upToast('وزن پیشنهادی به انتهای لیست وزن‌ها اضافه شده. لطفاً از لیست آن را انتخاب کنید.', 'success');
}
}
</script>
<div class="up-form-actions">
<a role="button" id="savecorrections" class="up-btn up-btn--success" onclick="suggestRhythmForDeletedUser(@Model.PoemSection.Id, @Model.Correction.Id)">ذخیره</a>
</div>
</div>
}
else
{
<script>
function moderateSectionCorrections(correctionId, verseCount) {
$('#moderatecorrections').hide();
$('#saving').text('در حال بررسی ...');
var breakFromVIndices = [];
for (var i = 0; i <= verseCount; i++) {
var checkVIndex = '#break-from-' + i.toString();
if ($(checkVIndex).is(":checked")) {
breakFromVIndices.push(i);
}
}
if (breakFromVIndices.length > 10) {
upToast('حداکثر از ۱۰ محل می‌توانید قطعه را بشکنید.', 'error');
return;
}
var rhythmReviewResult = 'DontCare';
if ($('#rhythm_review_result_Approved').length > 0) {
rhythmReviewResult = $('input[name=rhythm_review_result]:checked').val()
}
var rhymeReviewResult = 'DontCare';
if ($('#rhyme_review_result_Approved').length > 0) {
rhymeReviewResult = $('input[name=rhyme_review_result]:checked').val()
}
var languageReviewResult = 'DontCare';
if ($('#language_review_result_Approved').length > 0) {
languageReviewResult = $('input[name=language_review_result]:checked').val()
}
var poemformatReviewResult = 'DontCare';
if ($('#poemformat_review_result_Approved').length > 0) {
poemformatReviewResult = $('input[name=poemformat_review_result]:checked').val()
}
var url = '?handler=SendCorrectionsModeration';
$.ajax({
type: "POST",
url: url,
data: {
correctionId: correctionId,
rhythmReviewResult: rhythmReviewResult,
rhymeReviewResult: rhymeReviewResult,
breakFromVIndices: breakFromVIndices,
titleReviewNote: $('#title_review_note') == null ? null : $('#title_review_note').val(),
languageReviewResult: languageReviewResult,
languageReviewNote: $('#language_review_note') == null ? null : $('#language_review_note').val(),
poemformatReviewResult: poemformatReviewResult,
poemformatReviewNote: $('#poemformat_review_note') == null ? null : $('#poemformat_review_note').val(),
reviewNote: $('#review_note').val()
},
success: function () {
location.reload(true);
},
error: function (e) {
upToast(e.responseText || 'خطا رخ داد.', 'error');
$('#moderatecorrections').show();
$('#saving').text('');
}
});
}
function checkAllNotCorrect(verseCount) {
var breakFromVIndices = [];
for (var i = 0; i <= verseCount; i++) {
var checkVIndex = '#break-from-' + i.toString();
if ($(checkVIndex).is(":checked")) {
$(checkVIndex).prop("checked", false);
}
}
var allNotCorrect = document.getElementsByClassName("radio-notcorrect");
for (var i = 0; i < allNotCorrect.length; i++) {
allNotCorrect[i].checked = true;
}
}
</script>
<p><a role="button" target="_blank" href="@Model.PageInformation.FullUrl" class="up-btn up-btn--ghost up-btn--sm">@Model.PageInformation.FullTitle</a></p>
<p><a href="/User/AllPoemSections?id=@Model.PageInformation.Id" class="up-btn up-btn--ghost up-btn--sm">همهٔ قطعات شعر</a></p>
<div class="up-card">
<div class="up-field">
<label>پیشنهاد دهنده</label>
<div class="up-field-static"><a href="/hashieha/?userid=@Model.Correction.UserId" target="_blank">@Model.Correction.UserNickname</a></div>
</div>
<div class="up-field">
<label>زمان</label>
<div class="up-field-static">@Model.Correction.Date.ToFriendlyPersianDateTextify()</div>
</div>
<p class="up-hint">تعداد کل: @Model.TotalCount</p>
<div class="up-field">
<label>شکستن</label>
@if (Model.Correction.BreakFromVerse1VOrder != null)
{
<span class="up-badge up-badge--danger">دارد</span>
}
else
{
<span class="up-badge">ندارد</span>
}
</div>
<div class="up-form-actions">
<a role="button" onclick="checkAllNotCorrect(@Model.Verses.Count)" class="up-btn up-btn--ghost up-btn--sm">درست نیست</a>
</div>
<p id="saving" class="up-hint">&nbsp;</p>
@if (Model.TextSourceImage != null)
{
<div class="related-images">
<div class="related-image-container">
<a target="_blank" href="@Html.Raw(Model.TextSourceImage.TargetPageUrl)">
<img src="@Html.Raw(Model.TextSourceImage.ThumbnailImageUrl)" alt="@Model.TextSourceImage.AltText" loading="lazy" width="200" class="related-image">
</a>
</div>
</div>
}
@if (Model.Correction.Rhythm != null)
{
<h2 class="up-card__title">وزن</h2>
<div>@Html.Raw(Model.PoemSection.HtmlText)</div>
<div class="up-field">
<label>متن اولیه</label>
<p class="red-color">@Model.Correction.OriginalRhythm</p>
</div>
<div class="up-field">
<label>پیشنهاد</label>
<p class="green-color">@Model.Correction.Rhythm</p>
</div>
<div class="up-field">
@if (Model.Correction.RhythmResult == RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged)
{
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_Approved" name="rhythm_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved">
<label for="rhythm_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_NotChanged" name="rhythm_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged" checked="checked">
<label for="rhythm_review_result_NotChanged">تغییری نکرده</label>
</div>
}
else
{
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_Approved" name="rhythm_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved" checked="checked">
<label for="rhythm_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_NotChanged" name="rhythm_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged">
<label for="rhythm_review_result_NotChanged">تغییری نکرده</label>
</div>
}
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_RejectedBecauseWrong" name="rhythm_review_result" class="radio-notcorrect" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseWrong">
<label for="rhythm_review_result_RejectedBecauseWrong">درست نیست</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhythm_review_result_RejectedBecauseVariant" name="rhythm_review_result" class="radio-variant" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseVariant">
<label for="rhythm_review_result_Rejected">به دلیل دیگری رد می‌شود</label>
</div>
<input type="text" id="title_review_note" name="title_review_note" value="" placeholder="یادداشت بررسی" />
</div>
}
@if (Model.Correction.RhymeLetters != null)
{
<h2 class="up-card__title">قافیه</h2>
@if (Model.Correction.Rhythm == null)
{
<div>@Html.Raw(Model.PoemSection.HtmlText)</div>
}
<div class="up-field">
<label>متن اولیه</label>
<p class="red-color">@Model.PoemSection.RhymeLetters</p>
</div>
<div class="up-field">
<label>پیشنهاد</label>
<p class="green-color">@Model.Correction.RhymeLetters</p>
</div>
<div class="up-field">
@if (Model.Correction.RhymeLettersReviewResult == RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged)
{
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_Approved" name="rhyme_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved">
<label for="rhyme_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_NotChanged" name="rhyme_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged" checked="checked">
<label for="rhyme_review_result_NotChanged">تغییری نکرده</label>
</div>
}
else
{
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_Approved" name="rhyme_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved" checked="checked">
<label for="rhyme_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_NotChanged" name="rhyme_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged">
<label for="rhyme_review_result_NotChanged">تغییری نکرده</label>
</div>
}
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_RejectedBecauseWrong" name="rhyme_review_result" class="radio-notcorrect" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseWrong">
<label for="rhyme_review_result_RejectedBecauseWrong">درست نیست</label>
</div>
<div class="up-radio-option">
<input type="radio" id="rhyme_review_result_RejectedBecauseVariant" name="rhyme_review_result" class="radio-variant" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseVariant">
<label for="rhyme_review_result_Rejected">به دلیل دیگری رد می‌شود</label>
</div>
<input type="text" id="title_review_note" name="title_review_note" value="" placeholder="یادداشت بررسی" />
</div>
}
@if (Model.Correction.Language != null)
{
<h2 class="up-card__title">زبان</h2>
<div class="up-field">
<label>متن اولیه</label>
<p id="original-language" class="red-color">@Model.Correction.OriginalLanguage</p>
</div>
<div class="up-field">
<label>پیشنهاد</label>
<p id="edited-language" class="green-color">@Model.Correction.Language</p>
</div>
<div class="up-field">
@if (Model.Correction.LanguageReviewResult == RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged)
{
<div class="up-radio-option">
<input type="radio" id="language_review_result_Approved" name="language_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved">
<label for="language_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="language_review_result_NotChanged" name="language_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged" checked="checked">
<label for="language_review_result_NotChanged">تغییری نکرده</label>
</div>
}
else
{
<div class="up-radio-option">
<input type="radio" id="language_review_result_Approved" name="language_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved" checked="checked">
<label for="language_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="language_review_result_NotChanged" name="language_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged">
<label for="language_review_result_NotChanged">تغییری نکرده</label>
</div>
}
<div class="up-radio-option">
<input type="radio" id="language_review_result_RejectedBecauseWrong" name="language_review_result" class="radio-notcorrect" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseWrong">
<label for="language_review_result_RejectedBecauseWrong">درست نیست</label>
</div>
<div class="up-radio-option">
<input type="radio" id="language_review_result_RejectedBecauseVariant" name="language_review_result" class="radio-variant" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseVariant">
<label for="language_review_result_RejectedBecauseUnnecessaryChange">تغییر سلیقه‌ای یا بی دلیل است</label>
</div>
<div class="up-radio-option">
<input type="radio" id="language_review_result_Rejected" name="language_review_result" class="radio-rejected" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Rejected">
<label for="language_review_result_Rejected">به دلیل دیگری رد می‌شود</label>
</div>
<input type="text" id="language_review_note" name="language_review_note" value="" placeholder="یادداشت بررسی" />
</div>
}
@if (Model.Correction.PoemFormat != null)
{
<h2 class="up-card__title">قالب شعری</h2>
<div class="up-field">
<label>متن اولیه</label>
<p id="original-poemformat" class="red-color">@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.Correction.OriginalPoemFormat)</p>
</div>
<div class="up-field">
<label>پیشنهاد</label>
<p id="edited-poemformat" class="green-color">@RMuseum.Services.Implementation.GanjoorPoemFormatConvertor.GetString(Model.Correction.PoemFormat)</p>
</div>
<div class="up-field">
@if (Model.Correction.PoemFormatReviewResult == RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged)
{
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_Approved" name="poemformat_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved">
<label for="poemformat_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_NotChanged" name="poemformat_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged" checked="checked">
<label for="poemformat_review_result_NotChanged">تغییری نکرده</label>
</div>
}
else
{
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_Approved" name="poemformat_review_result" class="radio-approved" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Approved" checked="checked">
<label for="poemformat_review_result_Approved">تأیید می‌شود</label>
</div>
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_NotChanged" name="poemformat_review_result" class="radio-notchanged" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.NotChanged">
<label for="poemformat_review_result_NotChanged">تغییری نکرده</label>
</div>
}
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_RejectedBecauseWrong" name="poemformat_review_result" class="radio-notcorrect" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseWrong">
<label for="poemformat_review_result_RejectedBecauseWrong">درست نیست</label>
</div>
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_RejectedBecauseVariant" name="poemformat_review_result" class="radio-variant" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.RejectedBecauseVariant">
<label for="poemformat_review_result_RejectedBecauseUnnecessaryChange">تغییر سلیقه‌ای یا بی دلیل است</label>
</div>
<div class="up-radio-option">
<input type="radio" id="poemformat_review_result_Rejected" name="poemformat_review_result" class="radio-rejected" value="@RMuseum.Models.Ganjoor.CorrectionReviewResult.Rejected">
<label for="poemformat_review_result_Rejected">به دلیل دیگری رد می‌شود</label>
</div>
<input type="text" id="poemformat_review_note" name="poemformat_review_note" value="" placeholder="یادداشت بررسی" />
</div>
}
@if (!string.IsNullOrEmpty(Model.Correction.Note))
{
<div class="up-field">
<label>یادداشت</label>
<div class="up-field-static">@Model.Correction.Note</div>
</div>
}
<div class="up-field">
<label>ابیات</label>
@for (int v = 0; v < Model.Verses.Count; v++)
{
if (
Model.Correction.BreakFromVerse1VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse2VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse3VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse4VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse5VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse6VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse7VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse8VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse9VOrder == Model.Verses[v].VOrder
||
Model.Correction.BreakFromVerse10VOrder == Model.Verses[v].VOrder
)
{
<div class="up-radio-option">
<input type="checkbox" name="break-from-@v" id="break-from-@v" checked />
<label for="break-from-@v">@Model.Verses[v].Text</label>
</div>
}
else
{
<p>@Model.Verses[v].Text</p>
}
}
</div>
<div class="up-field">
<label for="review_note">یادداشت بررسی</label>
<input type="text" id="review_note" name="review_note" value="" />
</div>
@if (Model.PoemSection != null)
{
<p><a role="button" href=@($"/User/Section?poemId={Model.PoemSection.PoemId}&index={Model.PoemSection.Index}") class="up-btn up-btn--ghost up-btn--sm" target="_blank">خودم ویرایش کنم</a></p>
}
<div class="up-form-actions">
<a role="button" id="moderatecorrections" class="up-btn up-btn--success" onclick="moderateSectionCorrections(@Model.Correction.Id, @Model.Verses.Count)">بررسی</a>
<form method="post">
@Html.AntiForgeryToken()
<button type="submit" name="next" id="next" class="up-btn up-btn--ghost">بعدی</button>
</form>
</div>
</div>
}