docs: #347 UI for transfering meters

This commit is contained in:
Hamid Reza Mohammadi 2022-07-15 10:58:57 +04:30
parent 74ffcb4633
commit 726578ff17
3 changed files with 255 additions and 34 deletions

View File

@ -0,0 +1,120 @@
@page
@model GanjooRazor.Areas.Admin.Pages.TransferMeterModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using DNTPersianUtils.Core
@{
Layout = "_AdminLayout";
ViewData["Title"] = "انتقال وزن";
}
<h1>@ViewData["Title"]</h1>
@if (!string.IsNullOrEmpty(Model.FatalError))
{
<p>@Model.FatalError</p>
}
else
{
<table>
<tr>
<td>
وزنی که حذف می‌شود:
</td>
</tr>
<tr>
<td>
<label for="select-search">جستجوی وزن:</label><br />
<input type="text" id="select-search" value="" oninput="doSearchInRhythmsCombo('select-search', 'rhythm-new')" list="inputRhythms" autocomplete="off" size="50" />
<datalist id="inputRhythms">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</td>
</tr>
<tr>
<td>
<select id="rhythm-new" name="rhythm-new">
@foreach (var rhythm in Model.RhythmsAlphabetically)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</select>
<a role="button" onclick="resetRhythm('rhythm-new')" class="pagebutton">پاک کردن وزن</a>
</td>
</tr>
<tr>
<td>
وزن مقصد:
</td>
</tr>
<tr>
<td>
<label for="select-search2">جستجوی وزن (دوم):</label><br />
<input type="text" id="select-search2" value="" oninput="doSearchInRhythmsCombo('select-search2', 'rhythm-new2')" list="inputRhythms" autocomplete="off" size="50" />
<datalist id="inputRhythms2">
@if (Model.RhythmsByVerseCount != null)
@foreach (var rhythm in Model.RhythmsByVerseCount)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</datalist>
</td>
</tr>
<tr>
<td>
<label for="rhythm-new2">وزن (دوم) انتخاب شده:</label><br /><select id="rhythm-new2" name="rhythm-new2">
@foreach (var rhythm in Model.RhythmsAlphabetically)
{
<option value="@rhythm.Rhythm">@rhythm.Rhythm</option>
}
</select>
<a role="button" onclick="resetRhythm('rhythm-new2')" class="pagebutton">پاک کردن وزن</a>
<br />
<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) {
alert('وزن پیشنهادی تکراری است.');
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);
alert('وزن پیشنهادی به انتهای لیست وزن‌ها اضافه شده. لطفاً از لیست آن را انتخاب کنید.');
}
}
</script>
<a role="button" onclick="newRhythm()" class="pagebutton">پیشنهاد وزن جدید</a>
</td>
</tr>
</table>
}

View File

@ -0,0 +1,99 @@
using GanjooRazor.Utils;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using RMuseum.Models.Ganjoor;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
namespace GanjooRazor.Areas.Admin.Pages
{
[IgnoreAntiforgeryToken(Order = 1001)]
public class TransferMeterModel : PageModel
{
/// <summary>
/// rhythms alphabetically
/// </summary>
public GanjoorMetre[] RhythmsAlphabetically { get; set; }
/// <summary>
/// rhythms by frequency
/// </summary>
public GanjoorMetre[] RhythmsByVerseCount { get; set; }
/// <summary>
/// fatal error
/// </summary>
public string FatalError { get; set; }
/// <summary>
/// can edit
/// </summary>
public bool CanEdit { get; set; }
/// <summary>
/// get
/// </summary>
/// <returns></returns>
public async Task<IActionResult> OnGetAsync()
{
if (string.IsNullOrEmpty(Request.Cookies["Token"]))
return Redirect("/");
FatalError = "";
CanEdit = Request.Cookies["CanEdit"] == "True";
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
var rhythmResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/rhythms?sortOnVerseCount=true");
if (!rhythmResponse.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await rhythmResponse.Content.ReadAsStringAsync());
return Page();
}
RhythmsByVerseCount = JsonConvert.DeserializeObject<GanjoorMetre[]>(await rhythmResponse.Content.ReadAsStringAsync());
List<GanjoorMetre> rhythmsByVerseCount = new List<GanjoorMetre>(RhythmsByVerseCount);
rhythmsByVerseCount.Sort((a, b) => a.Rhythm.CompareTo(b.Rhythm));
rhythmsByVerseCount.Insert(0, new GanjoorMetre()
{
Rhythm = "null"
}
);
rhythmsByVerseCount.Insert(0, new GanjoorMetre()
{
Rhythm = ""
}
);
RhythmsAlphabetically = rhythmsByVerseCount.ToArray();
var pageUrlResponse = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/pageurl?id={Request.Query["id"]}");
if (!pageUrlResponse.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await pageUrlResponse.Content.ReadAsStringAsync());
return Page();
}
var pageUrl = JsonConvert.DeserializeObject<string>(await pageUrlResponse.Content.ReadAsStringAsync());
var pageQuery = await secureClient.GetAsync($"{APIRoot.Url}/api/ganjoor/page?url={pageUrl}");
if (!pageQuery.IsSuccessStatusCode)
{
FatalError = JsonConvert.DeserializeObject<string>(await pageQuery.Content.ReadAsStringAsync());
return Page();
}
}
else
{
FatalError = "لطفا از گنجور خارج و مجددا به آن وارد شوید.";
}
}
return Page();
}
}
}

View File

@ -2,7 +2,7 @@
<html lang="fa-IR" dir="rtl">
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex, nofollow" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
@Html.Raw(ViewData["Title"])
@ -16,21 +16,23 @@
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="/lib/diff.js"></script>
<script src="/lib/tinymce/tinymce.min.js"></script>
<script>
<script>
tinymce.init({
selector: 'textarea.editor',
language: 'fa_IR',
menubar: false,
plugins: 'link paste image',
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
});
selector: 'textarea.editor',
language: 'fa_IR',
menubar: false,
plugins: 'link paste image',
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
});
</script>
<script src="/js/bk.js?version=33"></script>
<script>
function editBanner(bannerId) {
var url = '?handler=Edit';
@ -47,7 +49,7 @@
url: $(urlInput).val(),
active: $(activeInput).is(":checked")
},
success: function () {
success: function() {
alert('آگاهی به درستی ویرایش شد.')
},
@ -66,7 +68,7 @@
data: {
id: bannerId
},
success: function () {
success: function() {
var bannerIdBlockId = '#tr-' + bannerId;
$(bannerIdBlockId).remove();
},
@ -82,10 +84,10 @@
$.ajax({
type: "POST",
url: url,
error: function () {
error: function() {
alert('خطا رخ داد.')
},
success: function () {
success: function() {
alert('صفحه به درستی بازسازی شد.')
},
@ -105,10 +107,10 @@
data: {
id: itemId
},
error: function () {
error: function() {
alert('خطا رخ داد.');
},
success: function () {
success: function() {
location.reload();
return false;
},
@ -122,10 +124,10 @@
data: {
id: poemId
},
error: function () {
error: function() {
alert('خطا رخ داد.');
},
success: function (rhyme) {
success: function(rhyme) {
$(elementId).val(rhyme);
return false;
},
@ -141,10 +143,10 @@
$.ajax({
type: "POST",
url: url,
error: function () {
error: function() {
alert('خطا رخ داد.')
},
success: function () {
success: function() {
alert('فرایند بازسازی نقشهٔ سایت شروع شد.')
},
@ -161,10 +163,10 @@
$.ajax({
type: "POST",
url: url,
error: function () {
error: function() {
alert('خطا رخ داد.')
},
success: function () {
success: function() {
alert('فرایند بازسازی صفحات آمار شروع شد.')
},
@ -184,17 +186,17 @@
$.ajax({
type: "POST",
url: url,
error: function () {
error: function() {
alert('خطا رخ داد.')
},
success: function () {
success: function() {
alert('فرایند تولید مجدد همهٔ فایلهای گنجور رومیزی شروع شد.')
},
});
}
function cleanCache(id) {
@ -209,10 +211,10 @@
data: {
id: id
},
error: function () {
error: function() {
alert('خطا رخ داد.')
},
success: function () {
success: function() {
alert('کش صفحه پاک شد.')
},
@ -255,7 +257,7 @@
result.appendChild(fragment);
}
</script>
</head>
@ -275,7 +277,7 @@
</li>
</ul>
</div>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Admin" asp-page="ReviewPartEdits">ویرایش‌های قطعات</a>
@ -339,7 +341,7 @@
</div>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>