Refactor bug report pages to use string identifiers and improve styling

This commit is contained in:
2025-12-13 18:26:01 +03:30
parent 339cea998a
commit 370feca81e
10 changed files with 27 additions and 1669 deletions

View File

@@ -92,12 +92,17 @@ public class CameraBugReport
public string StackTrace { get; private set; } public string StackTrace { get; private set; }
[BsonElement("status")] [BsonElement("status")]
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
public CameraBugReportStatus Status { get; private set; } public CameraBugReportStatus Status { get; private set; }
[BsonElement("priority")] [BsonElement("priority")]
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
public CameraBugPriority Priority { get; private set; } public CameraBugPriority Priority { get; private set; }
[BsonElement("type")] [BsonElement("type")]
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
public CameraBugReportType Type { get; private set; } public CameraBugReportType Type { get; private set; }
[BsonElement("flavor")] [BsonElement("flavor")]

View File

@@ -1,4 +1,4 @@
@page "{id:long}" @page
@model ServiceHost.Areas.AdminNew.Pages.BugReport.DeleteModel @model ServiceHost.Areas.AdminNew.Pages.BugReport.DeleteModel
@{ @{

View File

@@ -1,4 +1,4 @@
@page "{id:long}" @page
@model ServiceHost.Areas.AdminNew.Pages.BugReport.DetailsModel @model ServiceHost.Areas.AdminNew.Pages.BugReport.DetailsModel
@{ @{

View File

@@ -8,9 +8,10 @@ public class DetailsModel : BugReportPageModel
{ {
} }
public void OnGet(Guid id) public void OnGet(string id)
{ {
BugReportDetails = GetBugReportDetails(id); var guid = Guid.Parse(id);
BugReportDetails = GetBugReportDetails(guid);
if (BugReportDetails == null) if (BugReportDetails == null)
{ {
TempData["ErrorMessage"] = "گزارش خرابی یافت نشد"; TempData["ErrorMessage"] = "گزارش خرابی یافت نشد";

View File

@@ -1,4 +1,4 @@
@page "{id:long}" @page
@model ServiceHost.Areas.AdminNew.Pages.BugReport.EditModel @model ServiceHost.Areas.AdminNew.Pages.BugReport.EditModel
@{ @{

View File

@@ -3,6 +3,21 @@
@{ @{
ViewData["Title"] = "مدیریت گزارش‌های خرابی"; ViewData["Title"] = "مدیریت گزارش‌های خرابی";
<style>
.table-hover tbody tr:hover {
background-color: #f5f5f5;
}
.badge {
padding: 0.35rem 0.65rem;
font-size: 0.875rem;
}
.btn-sm {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
}
</style>
} }
<div class="container-fluid mt-4"> <div class="container-fluid mt-4">
@@ -141,7 +156,7 @@
<small>@report.CreationDate.ToString("yyyy-MM-dd HH:mm")</small> <small>@report.CreationDate.ToString("yyyy-MM-dd HH:mm")</small>
</td> </td>
<td> <td>
<a href="./Details?id=@report.Id.ToString()" class="btn btn-sm btn-info">مشاهده</a> <a asp-page="./Details" asp-route-id="@report.Id" fdsf="@report.Id" class="btn btn-sm btn-info">مشاهده</a>
<a asp-page="./Edit" asp-route-id="@report.Id" class="btn btn-sm btn-warning">ویرایش</a> <a asp-page="./Edit" asp-route-id="@report.Id" class="btn btn-sm btn-warning">ویرایش</a>
<a asp-page="./Delete" asp-route-id="@report.Id" class="btn btn-sm btn-danger" onclick="return confirm('آیا مطمئن هستید؟');">حذف</a> <a asp-page="./Delete" asp-route-id="@report.Id" class="btn btn-sm btn-danger" onclick="return confirm('آیا مطمئن هستید؟');">حذف</a>
</td> </td>
@@ -163,19 +178,5 @@
</div> </div>
</div> </div>
<style>
.table-hover tbody tr:hover {
background-color: #f5f5f5;
}
.badge {
padding: 0.35rem 0.65rem;
font-size: 0.875rem;
}
.btn-sm {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
}
</style>

View File

@@ -1,212 +0,0 @@
@model AccountManagement.Application.Contracts.Task.EditTask
@using AccountManagement.Application.Contracts.Media
@using Version = _0_Framework.Application.Version
@{
MediaViewModel voice = new();
}
@{
<script src="~/AssetsClient/js/jquery-ui.js"></script>
<link href="~/assetsadminnew/tasks/css/task-manager-create.css?ver=@Version.AdminVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css?ver=@Version.AdminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/tasks/css/detailmodal.css?ver=@Version.AdminVersion" rel="stylesheet" />
}
<div class="modal-content">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
@{
if (Model.IsDone)
{
<h5 class="modal-title" id="assignToLabel">جزئیات وظیفه</h5>
}
else
{
<h5 class="modal-title" id="assignToLabel">جزئیات</h5>
}
}
</div>
<div class="modal-body detailTask">
<div class="container-fluid">
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">طرف حساب: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.ContractingPartyName</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">عنوان وظیفه: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.Title</div>
</div>
</div>
<div class="row mb-1">
<div class="col-6">
<div class="row">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">تاریخ انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center">@Model.EndTaskDate</div>
</div>
</div>
</div>
<div class="col-6">
<div class="row">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">ساعت انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center"> @Model.EndTaskTime</div>
</div>
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">توضیحات: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.Description)</p>
</div>
</div>
@if (!string.IsNullOrWhiteSpace(Model.CompleteDescription))
{
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">توضیحات تکمیلی: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.CompleteDescription)</p>
</div>
</div>
}
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">فایل: </div>
</div>
<div class="col-12 col-sm-9" id="upload-container">
<div class="d-block d-md-flex align-items-center">
@foreach (var item in Model.medias)
{
if (item.Category == "فایل")
{
<div class="d-flex justify-content-between align-items-center mx-1">
<div class="upload-box empty">
@if (item.Path.EndsWith(".jpg") || item.Path.EndsWith(".jpeg") || item.Path.EndsWith(".png") || item.Path.EndsWith(".gif") || item.Path.EndsWith(".webp"))
{
<section class="gallery">
<section class="container">
<div class="row p-0">
<div class="lightbox_img_wrap">
<img class="lightbox-enabled min-img" src="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" data-imgsrc="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" id="@Model.Id" />
</div>
</div>
</section>
</section>
<section class="lightbox-container">
<span class="material-symbols-outlined material-icons lightbox-btn left" id="left">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5" />
</svg>
</span>
<span class="material-symbols-outlined material-icons lightbox-btn right" id="right">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
</span>
<span id="close" class="close material-icons material-symbols-outlined">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg>
</span>
<div class="lightbox-image-wrapper">
<img alt="lightboximage" class="lightbox-image">
</div>
</section>
}
else
{
<a href="@Url.Page("./Index", "GetFile", new { filePath = item.Path ,id=Model.Id})">دانلود</a>
}
</div>
</div>
}
}
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">پیام صوتی: </div>
</div>
<div class="col-12 col-sm-9 overflow-hidden" id="upload-container-voice">
@foreach (var item in Model.medias)
{
if (item.Category == "صوت")
{
voice = item;
<div class="audio-player border rounded">
<div id="waveform" class="waveform"></div>
<button id="play-pause" class="player-btn play"></button>
</div>
@* <div class="controls">
<span id="current-time">0:00</span>
<span id="duration">0:00</span>
</div> *@
@* <audio controls style="width: 100%; height: 30px">
<source src='@Url.Page("./Index", "ShowVoice", new { filePath = item.Path })' type="audio/ogg">
Your browser does not support the audio element.
</audio> *@
}
}
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-center align-items-center">
<div class="row">
<div class="col-12 text-end">
<button type="button" class="btn-cancel2" data-bs-dismiss="modal">بستن</button>
</div>
@* <div class="col-6 text-start">
<button id="save" type="button" class="btn-register text-white">ثبت</button>
<button style="display: none;" type="submit" id="saveFinaly"></button>
</div> *@
</div>
</div>
</div>
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>
<script src="~/assetsclient/js/site.js"></script>
<script src="~/admintheme/js/jquery.mask_1.14.16.min.js"></script>
<script src="~/AssetsAdminNew/libs/wavesurfer/wavesurfer.min.js"></script>
<script>
var antiForgeryToken = $('@Html.AntiForgeryToken()').val()
var createSaveTaskAjax = '@Url.Page("/Company/Task/Create", "CreateSaveTask")';
var voiceSrc = '@Url.Page("./Index", "ShowVoice", new { filePath = voice.Path })';
</script>
<script src="~/assetsadminnew/tasks/js/detailmodal.js"></script>

View File

@@ -1,579 +0,0 @@
@model AccountManagement.Application.Contracts.Task.OperationModalViewModel
@using Version = _0_Framework.Application.Version
@{
<script src="~/AssetsClient/js/jquery-ui.js"></script>
<link href="~/assetsadminnew/tasks/css/task-manager-create.css?ver=@Version.AdminVersion" rel="stylesheet" />
<link href="~/AssetsClient/css/select2.css?ver=@Version.AdminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/tasks/css/operationrequestmodal.css?ver=@Version.AdminVersion" rel="stylesheet" />
<link href="~/assetsadminnew/tasks/css/detailmodal.css?ver=@Version.AdminVersion" rel="stylesheet" />
}
@{
<input type="hidden" value="@Model.TaskId" id="TaskId" />
switch (Model.Type)
{
case "request_time":
<div class="modal-content tm-create">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<h5 class="modal-title" id="assignToLabel">جزئیات درخواست مهلت</h5>
</div>
<div class="modal-body detailTask">
<div class="container-fluid">
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">طرف حساب: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.ContractingPartyName</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">عنوان وظیفه: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.Title</div>
</div>
</div>
<div class="row mb-1">
<div class="col-6">
<div class="row">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">تاریخ انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center">@Model.TaskDetails.EndTaskDate</div>
</div>
</div>
</div>
<div class="col-6">
<div class="row ms-1">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">ساعت انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center"> @Model.TaskDetails.EndTaskTime</div>
</div>
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">توضیحات: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.TaskDetails.Description)</p>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">تاریخ درخواست: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.ModalTaskRequest.RequestTaskDate</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle"> توضیحات درخواست: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.ModalTaskRequest.TimeRequestDescription)</p>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">فایل: </div>
</div>
<div class="col-12 col-sm-9" id="upload-container">
<div class="d-block d-md-flex align-items-center">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "فایل")
{
<div class="d-flex justify-content-between align-items-center mx-1">
<div class="upload-box empty">
@if (item.Path.EndsWith(".jpg") || item.Path.EndsWith(".jpeg") || item.Path.EndsWith(".png") || item.Path.EndsWith(".gif") || item.Path.EndsWith(".webp"))
{
<section class="gallery">
<section class="container">
<div class="row p-0">
<div class="lightbox_img_wrap">
<img class="lightbox-enabled" src="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" data-imgsrc="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" id="@Model.TaskDetails.Id" />
</div>
</div>
</section>
</section>
<section class="lightbox-container">
<span class="material-symbols-outlined material-icons lightbox-btn left" id="left">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5" />
</svg>
</span>
<span class="material-symbols-outlined material-icons lightbox-btn right" id="right">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
</span>
<span id="close" class="close material-icons material-symbols-outlined">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg>
</span>
<div class="lightbox-image-wrapper">
<img alt="lightboximage" class="lightbox-image">
</div>
</section>
}
else
{
<a href="@Url.Page("./Index", "GetFile", new { filePath = item.Path ,id=Model.TaskDetails.Id})">دانلود</a>
}
</div>
</div>
}
}
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">پیام صوتی: </div>
</div>
<div class="col-12 col-sm-9 overflow-hidden" id="upload-container-voice">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "صوت")
{
<audio controls style="width: 100%; height: 30px">
<source src='@Url.Page("./Index", "ShowVoice", new { filePath = item.Path })' type="audio/ogg">
Your browser does not support the audio element.
</audio>
}
}
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="row justify-content-center align-items-center d-flex mb-3" permission="90123">
<div class="col-3 col-sm-3">
<div class="justify-content-center align-items-center d-flex">
<label class="label-time-request" for="checkActiveDate">تغییر تاریخ</label>
<input type="checkbox" class="form-check-custom mx-1" id="checkActiveDate"/>
</div>
</div>
<div class="col-9 col-sm-9">
<div class="d-flex align-items-center justify-content-between">
<input type="text" class="form-control mx-1 date disable" value="" id="inputChangeDate" disabled/>
<button id="saveChangeTimeRequest" type="button" class="btn-change-date disable" disabled>ثبت</button>
</div>
</div>
</div>
<div class="row">
<div class="col-12 text-center">
<button permission="90122" type="button" class="btn-rejectTo" id="saveRejectTimeRequest">
رد
</button>
<button permission="90122" type="button" class="btn-register" id="saveAcceptTimeRequest" style="width: auto">
تائید
</button>
</div>
</div>
</div>
<div class="modal-footer justify-content-center align-items-center">
<div class="row">
<div class="col-12 text-end">
<button type="button" class="btn-cancel2" data-bs-dismiss="modal">بستن</button>
</div>
</div>
</div>
</div>
break;
case "cancel_request":
<div class="modal-content tm-create">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<h5 class="modal-title" id="assignToLabel">درخواست انصراف وظیفه</h5>
</div>
<div class="modal-body detailTask">
<div class="container-fluid">
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">طرف حساب: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.ContractingPartyName</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3">
<div class="detailTitle">عنوان وظیفه: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.Title</div>
</div>
</div>
<div class="row mb-1">
<div class="col-6">
<div class="row">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">تاریخ انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center">@Model.TaskDetails.EndTaskDate</div>
</div>
</div>
</div>
<div class="col-6">
<div class="row ms-1">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">ساعت انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center"> @Model.TaskDetails.EndTaskTime</div>
</div>
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">توضیحات: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.TaskDetails.Description)</p>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle"> توضیحات درخواست: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.ModalTaskRequest.CancelDescription)</p>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">فایل: </div>
</div>
<div class="col-12 col-sm-9" id="upload-container">
<div class="d-block d-md-flex align-items-center">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "فایل")
{
<div class="d-flex justify-content-between align-items-center mx-1">
<div class="upload-box empty">
@if (item.Path.EndsWith(".jpg") || item.Path.EndsWith(".jpeg") || item.Path.EndsWith(".png") || item.Path.EndsWith(".gif") || item.Path.EndsWith(".webp"))
{
<section class="gallery">
<section class="container">
<div class="row p-0">
<div class="lightbox_img_wrap">
<img class="lightbox-enabled" src="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" data-imgsrc="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" id="@Model.TaskDetails.Id" />
</div>
</div>
</section>
</section>
<section class="lightbox-container">
<span class="material-symbols-outlined material-icons lightbox-btn left" id="left">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5" />
</svg>
</span>
<span class="material-symbols-outlined material-icons lightbox-btn right" id="right">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5" />
</svg>
</span>
<span id="close" class="close material-icons material-symbols-outlined">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg>
</span>
<div class="lightbox-image-wrapper">
<img alt="lightboximage" class="lightbox-image">
</div>
</section>
}
else
{
<a href="@Url.Page("./Index", "GetFile", new { filePath = item.Path ,id=Model.TaskDetails.Id})">دانلود</a>
}
</div>
</div>
}
}
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">پیام صوتی: </div>
</div>
<div class="col-12 col-sm-9 overflow-hidden" id="upload-container-voice">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "صوت")
{
<audio controls style="width: 100%; height: 30px">
<source src='@Url.Page("./Index", "ShowVoice", new { filePath = item.Path })' type="audio/ogg">
Your browser does not support the audio element.
</audio>
}
}
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="row">
<div class="col-12 text-center">
<button permission="90122" type="button" class="btn-rejectTo" id="saveRejectCancelRequest">
رد
</button>
<button permission="90122" type="button" class="btn-register" id="saveAcceptCancelRequest" style="width: auto">
تائید
</button>
</div>
</div>
</div>
<div class="modal-footer justify-content-center align-items-center">
<div class="row">
<div class="col-12 text-end">
<button type="button" class="btn-cancel2" data-bs-dismiss="modal">بستن</button>
</div>
</div>
</div>
</div>
break;
case "complete_request":
<div class="modal-content tm-create">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<h5 class="modal-title" id="assignToLabel">درخواست تائید وظیفه</h5>
</div>
<div class="modal-body detailTask">
<div class="container-fluid">
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">طرف حساب: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.ContractingPartyName</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">عنوان وظیفه: </div>
</div>
<div class="col-12 col-sm-9 border rounded">
<div class="detailTitleText">@Model.TaskDetails.Title</div>
</div>
</div>
<div class="row mb-1">
<div class="col-6">
<div class="row">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">تاریخ انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center">@Model.TaskDetails.EndTaskDate</div>
</div>
</div>
</div>
<div class="col-6">
<div class="row ms-1">
<div class="col-12 col-sm-6 text-end">
<div class="detailTitle">ساعت انجام: </div>
</div>
<div class="col-12 col-sm-6 border rounded">
<div class="detailTitleText text-center"> @Model.TaskDetails.EndTaskTime</div>
</div>
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">توضیحات: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.TaskDetails.Description)</p>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle"> توضیحات درخواست: </div>
</div>
<div class="col-12 col-sm-9 border rounded p-2 overflow-auto">
<p class="">@Html.Raw(Model.ModalTaskRequest.IsDoneDescription)</p>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">فایل: </div>
</div>
<div class="col-12 col-sm-9" id="upload-container">
<div class="d-block d-md-flex align-items-center">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "فایل")
{
<div class="d-flex justify-content-between align-items-center mx-1">
<div class="upload-box empty">
@if (item.Path.EndsWith(".jpg") || item.Path.EndsWith(".jpeg") || item.Path.EndsWith(".png") || item.Path.EndsWith(".gif") || item.Path.EndsWith(".webp"))
{
<section class="gallery">
<section class="container">
<div class="row p-0">
<div class="lightbox_img_wrap">
<img class="lightbox-enabled" src="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" data-imgsrc="@Url.Page("./Index", "ShowPicture", new { filePath = item.Path })" id="@Model.TaskDetails.Id"/>
</div>
</div>
</section>
</section>
<section class="lightbox-container">
<span class="material-symbols-outlined material-icons lightbox-btn left" id="left">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 19.5 8.25 12l7.5-7.5"/>
</svg>
</span>
<span class="material-symbols-outlined material-icons lightbox-btn right" id="right">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"/>
</svg>
</span>
<span id="close" class="close material-icons material-symbols-outlined">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/>
</svg>
</span>
<div class="lightbox-image-wrapper">
<img alt="lightboximage" class="lightbox-image">
</div>
</section>
}
else
{
<a href="@Url.Page("./Index", "GetFile", new { filePath = item.Path, id = Model.TaskDetails.Id })">دانلود</a>
}
</div>
</div>
}
}
</div>
</div>
</div>
<div class="row mb-1">
<div class="col-12 col-sm-3 text-end">
<div class="detailTitle">پیام صوتی: </div>
</div>
<div class="col-12 col-sm-9 overflow-hidden" id="upload-container-voice">
@foreach (var item in Model.TaskDetails.medias)
{
if (item.Category == "صوت")
{
<audio controls style="width: 100%; height: 30px">
<source src='@Url.Page("./Index", "ShowVoice", new { filePath = item.Path })' type="audio/ogg">
Your browser does not support the audio element.
</audio>
}
}
</div>
</div>
</div>
</div>
<div class="modal-footer d-block">
<div class="row">
<div class="col-12 text-center">
<button permission="90122" type="button" class="btn-rejectTo" id="saveRejectCompleteRequest">
رد
</button>
<button permission="90122" type="button" class="btn-register" id="saveAcceptCompleteRequest" style="width: auto">
تائید
</button>
</div>
</div>
</div>
<div class="modal-footer justify-content-center align-items-center">
<div class="row">
<div class="col-12 text-end">
<button type="button" class="btn-cancel2" data-bs-dismiss="modal">بستن</button>
</div>
</div>
</div>
</div>
break;
}
}
<script src="~/assetsclient/libs/jalaali-js/jalaali.js"></script>
<script src="~/assetsclient/js/site.js"></script>
<script src="~/admintheme/js/jquery.mask_1.14.16.min.js"></script>
<script>
var antiForgeryToken = $('@Html.AntiForgeryToken()').val();
var createSaveTaskAjax = '@Url.Page("/Company/Task/Create", "CreateSaveTask")';
var AntiForgeryToken = $('@Html.AntiForgeryToken()').val();
var changeTime = '@Url.Page("./Index", "ChangeTime")';
var AcceptTimeRequest = '@Url.Page("./Index", "AcceptTimeRequest")';
var RejectTimeRequest = '@Url.Page("./Index", "RejectTimeRequest")';
var RejectCancel = '@Url.Page("./Index", "RejectCancel")';
var AcceptCancel = '@Url.Page("./Index", "AcceptCancel")';
var RejectComplete = '@Url.Page("./Index", "RejectComplete")';
var AcceptComplete = '@Url.Page("./Index", "AcceptComplete")';
</script>
<script src="~/assetsadminnew/tasks/js/operationrequestmodal.js"></script>
<script src="~/assetsadminnew/tasks/js/detailmodal.js?ver=@Version.AdminVersion"></script>

View File

@@ -1,698 +0,0 @@
@model AccountManagement.Application.Contracts.Ticket.EditTicket
@{
}
<div class="modal-content">
<div class="modal-header d-block text-center">
<button type="button" class="btn-close position-absolute text-start" data-bs-dismiss="modal" aria-label="Close"></button>
<h5 class="modal-title" id="ticketModalLabel">پشتیبانی @Model.TicketNumber</h5>
</div>
<div class="modal-body">
<div class="container-fluid">
<div class="row ">
<div class="col-12">
<div class="d-flex align-items-center justify-content-between">
<span class="textTitle1">@Model.ContractingPartyName</span>
<span class="textTitle1">@Model.WorkshopName </span>
</div>
<div class="textTitle2">شماره تماس: @Model.Sender.Mobile</div>
</div>
<div class="col-12 col-lg-12">
<div class="ticket-message-container" id="messageContent">
</div>
<div class="footer-message-container mt-2">
<div class="col-6">
<input type="hidden" asp-for="Id"/>
<div class="message-input-div">
<textarea id="Response" class="form-control" rows="2"> </textarea>
<button type="button" class="btn-send loadingButton" id="saveClientResponseTicket">
<span>ارسال</span>
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</button>
</div>
</div>
<div class="col-3">
<button class="upload-file" id="upload-voice-ticket-table">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="9" y="3" width="6" height="11" rx="3" fill="#29B4B4" stroke="white" stroke-width="1.2" stroke-linejoin="round"/>
<path d="M5.4 11C5.4 12.7504 6.09536 14.4292 7.3331 15.6669C8.57084 16.9046 10.2496 17.6 12 17.6C13.7504 17.6 15.4292 16.9046 16.6669 15.6669C17.9046 14.4292 18.6 12.7504 18.6 11" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 21V19" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>پیام صوتی</span>
</button>
<input type="file" class="d-none" id="Command_Voice">
</div>
<div class="col-3">
<div class="d-flex justify-content-between align-items-center position-relative">
<button class="upload-file" id="upload-doc-msg" type="submit">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 5C5 3.89543 5.89543 3 7 3H11.75C11.8881 3 12 3.11193 12 3.25V8C12 9.10457 12.8954 10 14 10H18.75C18.8881 10 19 10.1119 19 10.25V19C19 20.1046 18.1046 21 17 21H7C5.89543 21 5 20.1046 5 19V5Z" fill="white" />
<path d="M13 8V3.60355C13 3.38083 13.2693 3.26929 13.4268 3.42678L18.5732 8.57322C18.7307 8.73071 18.6192 9 18.3964 9H14C13.4477 9 13 8.55228 13 8Z" fill="#29B4B4" />
<path d="M12 11.5V17.5" stroke="#29B4B4" stroke-linecap="round" />
<path d="M9 14.5H15" stroke="#29B4B4" stroke-linecap="round" />
</svg>
<span>بارگذاری تصاویر</span>
</button>
<input type="file" class="d-none" id="Command_Document1" accept=".pdf,.doc,.docx,.txt, image/*">
<input type="file" class="d-none" id="Command_Document2" accept=".pdf,.doc,.docx,.txt, image/*">
<input type="file" class="d-none" id="Command_Document3" accept=".pdf,.doc,.docx,.txt, image/*">
<input type="file" class="d-none" id="Command_Document4" accept=".pdf,.doc,.docx,.txt, image/*">
<div class="d-flex justify-content-between align-items-center mx-1 posistion-absolute" id="upload-container-doc">
</div>
</div>
</div>
<div id="fileItems" style="display: none"></div>
<div id="voiceItem" style="display: none"></div>
</div>
<div class="d-flex justify-content-between align-items-center mx-1" id="upload-container-voice">
<div class="upload-box-voice loadingButton" id="msg_box_ticket_table">
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer justify-content-center">
<div class="row">
<div class="col-12">
<button type="button" class="btn-cancel2" data-bs-dismiss="modal">انصراف</button>
</div>
</div>
</div>
</div>
</div>
<script>
var antiForgeryToken = $('@Html.AntiForgeryToken()').val();
var sendMsgTicketAjax = '@Url.Page("/Company/Ticket/Index", "SaveClientResponseTicket")';
var uploadFileTicketAjax = '@Url.Page("/Company/Ticket/Index", "UploadFile")';
var deleteFileTicketAjax = '@Url.Page("/Company/Ticket/Index", "DeleteFile")';
var deleteAllFilesTicketAjax = '@Url.Page("/Company/Ticket/Index", "RemoveAllTempFiles")';
$(document).ready(function () {
loadMessages();
setTimeout(function () {
$('#messageContent').animate({
scrollTop: $('#messageContent').get(0).scrollHeight
}, 1200);
}, 900);
});
// برای اینتر زدن که پیام مستقیم ارسال میشود
// $('#Response').keypress(function (e) {
// var key = e.which;
// if(key == 13)
// {
// $('#saveClientResponseTicket').click();
// return false;
// }
// });
// برای اینتر زدن که پیام مستقیم ارسال میشود
$('#saveClientResponseTicket').on('click', function (e) {
e.preventDefault();
var TicketId = $('#Id').val();
var Response = $('#Response').val();
// var textArea = $('#Description');
// var content = textArea.val();
//content = content.replace(/\n/g, '<br>');
// textArea.val(content);
// console.log(Response);
// return;
var files = document.querySelectorAll('input[name*=UploadedFileIds]');
var textVoiceId = document.querySelector('input[name=VoiceId]');
var formData = new FormData();
formData.append('TicketId', TicketId);
formData.append('Response', Response);
if (files.length > 0) {
for (var i = 0; i < files.length; i++)
formData.append('UploadedFileIds', files[i].value);
}
if (textVoiceId) {
formData.append('VoiceId', textVoiceId.value);
}
// var data = new FormData(this.form);
$('#saveClientResponseTicket').prop('disabled', true);
$.ajax({
async: false,
dataType: 'json',
processData: false,
contentType: false,
type: 'POST',
url: sendMsgTicketAjax,
headers: { "RequestVerificationToken": antiForgeryToken },
data: formData,
success: function (response) {
console.log(response);
if (response.isSuccedd) {
loadMessages();
$('#saveClientResponseTicket').prop('disabled', false);
$('#Response').val('');
$('input[name*=UploadedFileIds]').remove();
$('input[name=VoiceId]').remove();
$('.upload-box').remove();
$('#Command_Document1').val('');
$('#Command_Document2').val('');
$('#Command_Document3').val('');
$('#Command_Document4').val('');
$('#Command_Voice').val('');
msg_box.innerHTML = lang.press_to_start;
button.classList.remove('recording');
btn_status = 'inactive';
audio.src = '';
} else {
$('.alert-msg').show();
$('.alert-msg p').text(response.message);
setTimeout(function () {
$('.alert-msg').hide();
$('.alert-msg p').text('');
}, 3500);
$('#saveClientResponseTicket').prop('disabled', false);
}
},
error: function (err) {
console.log(err);
}
});
});
function loadMessages() {
var TicketId = $('#Id').val();
var html = '';
$.ajax({
async: false,
dataType: 'json',
type: 'GET',
url: `@Url.Page("/Company/Ticket/Index", "ShowDetailTicketMessagesAjax")`,
headers: { "RequestVerificationToken": antiForgeryToken },
data: { ticketID: TicketId },
success: function (response) {
var responseTickets = response.ticketDetail;
console.log(response.ticketDetail);
html += `<div class="ticket-message-sender">
<div class="header-message">
<span>${responseTickets.sender.fullname}</span>
<span>${responseTickets.creationDateStr}</span>
</div>
<p>
${responseTickets.description === '$GOzaReshgirMediaVoIce@@' ? '' : responseTickets.description}
</p>`;
var inBox = "inBox";
html += `<div class="footer-message-attachment ${inBox}">`;
$.each(responseTickets.mediaViewModels, function (i, item) {
if (item.category == 'اسکرین شات') {
if (item.path.endsWith(".jpg") || item.path.endsWith(".jpeg") || item.path.endsWith(".png") || item.path.endsWith(".gif") || item.path.endsWith(".webp")) {
var urlPage1 = `/Client/Company/Ticket/Index?handler=ShowPicture&filePath=${item.path}`;
html += `<img class="file-attach lightbox-enabled" src="${urlPage1}" id="${responseTickets.id}" />`;
}
}
if (item.category == "فایل") {
if (item.path.endsWith(".jpg") || item.path.endsWith(".jpeg") || item.path.endsWith(".png") || item.path.endsWith(".gif") || item.path.endsWith(".webp")) {
var urlPage1 = `/Client/Company/Ticket/Index?handler=ShowPicture&filePath=${item.path}`;
html += `<img class="file-attach lightbox-enabled" src="${urlPage1}" id="${responseTickets.id}" />`;
} else {
var urlPage2 = `/Client/Company/Ticket/Index?handler=GetFile&filePath=${item.path}&id=${TicketId}`;
html += `<a href="${urlPage2}">دانلود</a>`;
}
}
if (item.category == "صوت") {
voice = item;
html += `<div class="audio-player border rounded">
<div id="waveform" class="waveform">sss</div>
<button id="play-pause" class="player-btn play"></button>
</div>`;
}
});
html += `</div></div>`;
responseTickets.responseViewModels.forEach(function (itemResponse) {
if (itemResponse.isClient) {
html += `
<div class="ticket-message-sender">
<div class="header-message">
<span>${responseTickets.sender.fullname}</span>
<span>${itemResponse.creationDateStr}</span>
</div>
<p>
${itemResponse.responseMessage === '$GOzaReshgirMediaVoIce@@' ? '' : itemResponse.responseMessage}
</p>`;
var inBox1 = "inBox";
html += `<div class="footer-message-attachment ${inBox1}">`;
itemResponse.mediaViewModels.forEach(function (file) {
if (file.category == "فایل")
{
if (file.path.endsWith(".jpg") || file.path.endsWith(".jpeg") || file.path.endsWith(".png") || file.path.endsWith(".gif") || file.path.endsWith(".webp"))
{
var urlPage1 = `/Client/Company/Ticket/Index?handler=ShowPicture&filePath=${file.path}`;
html += `<img class="file-attach lightbox-enabled" src="${urlPage1}" id="${responseTickets.id}" />`;
}
else {
var urlPage2 = `/Client/Company/Ticket/Index?handler=GetFile&filePath=${file.path}&id=${TicketId}`;
html += `<a href="${urlPage2}">دانلود</a>`;
}
}
if (file.category == "صوت") {
voice = file;
html += `<div class="audio-player border rounded">
<div id="waveform" class="waveform">sss</div>
<button id="play-pause" class="player-btn play"></button>
</div>`;
}
});
html += `</div>`;
@* <div class="footer-message-attachment">
<div class="file-attach"></div>
</div> *@
html += `</div>`;
}
if (itemResponse.isAdmin) {
html += `<div class="ticket-message-reciever">
<div class="header-message">
<span>پشتیبانی</span>
<span>${itemResponse.creationDateStr}</span>
</div>
<p>${itemResponse.responseMessage}</p>
</div>`;
var inBox2 = "inBox";
html += `<div class="footer-message-attachment ${inBox2}">`;
itemResponse.mediaViewModels.forEach(function (fileAdmin) {
if (fileAdmin.category == "فایل")
{
if (fileAdmin.path.endsWith(".jpg") || fileAdmin.path.endsWith(".jpeg") || fileAdmin.path.endsWith(".png") || fileAdmin.path.endsWith(".gif") || fileAdmin.path.endsWith(".webp")) {
var urlPage1 = `/Client/Company/Ticket/Index?handler=ShowPicture&filePath=${fileAdmin.path}`;
html += `<img class="file-attach lightbox-enabled" src="${urlPage1}" id="${responseTickets.id}" />`;
}
else {
var urlPage2 = `/Client/Company/Ticket/Index?handler=GetFile&filePath=${fileAdmin.path}&id=${TicketId}`;
html += `<a href="${urlPage2}">دانلود</a>`;
}
}
if (fileAdmin.category == "صوت") {
voice = fileAdmin;
html += `<div class="audio-player border rounded">
<div id="waveform" class="waveform">sss</div>
<button id="play-pause" class="player-btn play"></button>
</div>`;
}
});
html += `</div>`;
}
});
$('#messageContent').html(html);
$('#messageContent').animate({
scrollTop: $('#messageContent').get(0).scrollHeight
}, 1200);
},
error: function (err) {
console.log(err);
}
});
}
$(document).ready(function () {
$(document).on('click', '#upload-doc-msg', function (event) {
event.preventDefault();
let files = [
document.getElementById("Command_Document1"),
document.getElementById("Command_Document2"),
document.getElementById("Command_Document3"),
document.getElementById("Command_Document4")
];
for (let i = 0; i < files.length; i++) {
if (files[i].files.length == 0) {
attachFileChangeHandler(files[i], i + 1, '.inBox' + (i + 1));
$('#' + files[i].id).click();
break;
}
}
});
});
function attachFileChangeHandler(fileInput, id, boxClass) {
$('#' + fileInput.id).off('change').on('change', function (e) {
e.preventDefault();
var fileInputFile = fileInput.files[0];
if (fileInputFile) {
uploadFile(fileInputFile, id, boxClass);
}
});
}
var indexCount = 0;
var activeUploads = 0;
function uploadFile(file, id, boxClass) {
var htmlUploadBox = `<div class="upload-box inBox${id} me-2 loadingButton">
<div class="spinner-loading loading" style="display: none">
<span class="spinner-border spinner-border-sm loading text-white" role="status" aria-hidden="true"></span>
</div>
</div>`;
$('#upload-container-doc').append(htmlUploadBox);
var formData = new FormData();
formData.append('media', file);
var loading = $(boxClass).find('.spinner-loading');
loading.show();
activeUploads++;
$('#saveClientResponseTicket').prop('disabled', true).addClass('disable');
$.ajax({
dataType: 'json',
type: 'POST',
processData: false,
contentType: false,
url: uploadFileTicketAjax,
headers: { "RequestVerificationToken": antiForgeryToken },
data: formData,
success: function (response) {
console.log(response);
if (response.isSuccedded) {
if (file) {
var reader = new FileReader();
reader.onload = function (e) {
var img = $('<img class="min-img b' + id + '">').attr('src', e.target.result);
var box = $(boxClass);
if (box.length) {
var deleteBtn = $('<div class="b' + id + '" style="cursor: pointer;" onclick="remove(' + id + ',' + response.id + ')"><svg width="16" height="16" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="10" height="10" rx="5" fill="#FF4A4A"/><path d="M7 7L3 3" stroke="#FFFEFE" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 7L7 3" stroke="#FFFEFE" stroke-linecap="round" stroke-linejoin="round"/></svg></div>');
$('.b' + id).remove();
box.append(img);
box.append(deleteBtn);
}
};
reader.readAsDataURL(file);
}
var inputItems = `<input type="hidden" value="${response.id}" name="UploadedFileIds[${indexCount}]"/>"`;
$('#fileItems').append(inputItems);
indexCount++;
// showAlertMessage('.alert-success-msg', response.message, 1500);
} else {
showAlertMessage('.alert-msg', response.message, 3500);
$('#Command_Document' + id).val('');
$('.inBox' + id).remove();
}
loading.hide();
activeUploads--;
if (activeUploads === 0) {
$('#saveClientResponseTicket').prop('disabled', false).removeClass('disable');
}
},
error: function (err) {
console.log(err);
loading.hide();
activeUploads--;
if (activeUploads === 0) {
$('#saveClientResponseTicket').prop('disabled', false).removeClass('disable');
}
}
});
}
function remove(id, resId) {
$('#Command_Document' + id).val('');
$('.inBox' + id).remove();
var loading = $('.inBox' + id + ' .spinner-loading');
loading.show();
// Remove from hidden inputs
$(`#fileItems input[value='${resId}']`).remove();
indexCount--;
activeUploads++;
$('#saveClientResponseTicket').prop('disabled', true).addClass('disable');
var formData = new FormData();
formData.append('mediaId', resId);
$.ajax({
dataType: 'json',
type: 'POST',
processData: false,
contentType: false,
url: deleteFileTicketAjax,
data: formData,
headers: { "RequestVerificationToken": antiForgeryToken },
success: function (response) {
if (response.isSuccedded) {
// showAlertMessage('.alert-success-msg', response.message, 1500);
} else {
showAlertMessage('.alert-msg', response.message, 3500);
}
loading.hide();
activeUploads--;
if (activeUploads === 0) {
$('#saveClientResponseTicket').prop('disabled', false).removeClass('disable');
}
},
error: function (err) {
console.log(err);
loading.hide();
activeUploads--;
if (activeUploads === 0) {
$('#saveClientResponseTicket').prop('disabled', false).removeClass('disable');
}
}
});
}
$('#cancelSendTicket').on('click', function () {
$('#MainModal').modal('toggle');
});
function showAlertMessage(selector, message, timeout) {
$(selector).show();
$(selector + ' p').text(message);
setTimeout(function () {
$(selector).hide();
$(selector + ' p').text('');
}, timeout);
}
// صدا
var msg_box = document.getElementById('msg_box_ticket_table'),
button = document.getElementById('upload-voice-ticket-table'),
lang = {
'mic_error': 'خطا! به میکروفون دسترسی ندارد.',
'press_to_start': 'برای ضبط صدا، پیام صوتی را کلیک نمائید',
'recording': 'در حال ضبط پیام صوتی ...',
'play': 'پخش',
'stop': 'متوقف',
'download': 'دانلود',
'use_https': 'This application is not working over an insecure connection. Try to use HTTPS'
},
time,
btn_status = 'inactive',
mediaRecorder,
chunks = [],
audio = new Audio(),
blob,
audioSrc;
msg_box.innerHTML = lang.press_to_start;
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
button.onclick = function () {
if (btn_status === 'inactive') {
startRecording();
} else if (btn_status === 'recording') {
stopRecording();
}
};
} else {
msg_box.innerHTML = lang.mic_error;
button.disabled = true;
}
function parseTime(sec) {
var h = parseInt(sec / 3600);
var m = parseInt(sec / 60);
sec = sec - (h * 3600 + m * 60);
h = h === 0 ? '' : h + ':';
sec = sec < 10 ? '0' + sec : sec;
return h + m + ':' + sec;
}
function startRecording() {
console.log('start');
navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) {
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start();
button.classList.add('recording');
btn_status = 'recording';
msg_box.innerHTML = lang.recording;
if (navigator.vibrate) navigator.vibrate(150);
time = Math.ceil(new Date().getTime() / 1000);
mediaRecorder.ondataavailable = function (event) {
chunks.push(event.data);
};
mediaRecorder.onstop = function () {
stream.getTracks().forEach(function (track) { track.stop(); });
blob = new Blob(chunks, { type: 'audio/ogg; codecs=opus' });
audioSrc = window.URL.createObjectURL(blob);
audio.src = audioSrc;
chunks = [];
saveToInput(blob);
};
}).catch(function (error) {
msg_box.innerHTML = lang.mic_error + (location.protocol !== 'https:' ? '<br>' + lang.use_https : '');
button.disabled = true;
});
}
function stopRecording() {
console.log('stop');
mediaRecorder.stop();
button.classList.remove('recording');
btn_status = 'inactive';
if (navigator.vibrate) navigator.vibrate([200, 100, 200]);
var now = Math.ceil(new Date().getTime() / 1000);
var t = parseTime(now - time);
msg_box.innerHTML = '<a href="#" onclick="play(); return false;" class="txt_btn">' + lang.play + ' (' + t + 's)</a><br>' +
'<a href="#" id="saveToInput" onclick="save(); return false;" class="txt_btn">' + lang.download + '</a>';
}
function play() {
audio.play();
msg_box.innerHTML = '<a href="#" onclick="pause(); return false;" class="txt_btn">' + lang.stop + '</a><br>' +
'<a href="#" onclick="save(); return false;" class="txt_btn">' + lang.download + '</a>';
}
function pause() {
audio.pause();
audio.currentTime = 0;
msg_box.innerHTML = '<a href="#" onclick="play(); return false;" class="txt_btn">' + lang.play + '</a><br>' +
'<a href="#" onclick="save(); return false;" class="txt_btn">' + lang.download + '</a>';
}
function saveToInput(blob) {
const myFile = new File([blob], 'record.ogg', {
type: 'audio/ogg',
lastModified: new Date(),
});
let fileVoice = document.getElementById("Command_Voice");
const dataTransfer = new DataTransfer();
dataTransfer.items.add(myFile);
fileVoice.files = dataTransfer.files;
var formData = new FormData();
formData.append('media', myFile);
var loading = $('.upload-box-voice').find('.spinner-loading');
loading.show();
$.ajax({
dataType: 'json',
type: 'POST',
processData: false,
contentType: false,
url: uploadFileTicketAjax,
headers: { "RequestVerificationToken": antiForgeryTokenLayout },
data: formData,
success: function (response) {
if (response.isSuccedded) {
var inputVoice = `<input type="hidden" value="${response.id}" name="VoiceId" />"`;
$('#voiceItem').append(inputVoice);
} else {
showAlertMessage('.alert-msg', response.message, 3500);
$('#Command_Voice').val('');
}
loading.hide();
},
error: function (err) {
console.log(err);
loading.hide();
}
});
}
function save() {
console.log(audioSrc);
var a = document.createElement('a');
a.download = 'record.ogg';
a.href = audioSrc;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
// صدا
</script>

View File

@@ -1,160 +0,0 @@
@using Microsoft.AspNetCore.Razor.Language.Intermediate
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A fully featured admin theme which can be used to build CRM, CMS, etc.">
<meta name="author" content="Coderthemes">
<link rel="shortcut icon" href="images/favicon_1.ico">
<title>@ViewData["Title"] | دادمهر گستر </title>
<!-- Base Css Files -->
<link href="~/AdminTheme/assets/css/bootstrap.min.css" rel="stylesheet" />
<!-- Font Icons -->
<!--<link href="~/AdminTheme/assets/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
<link href="~/AdminTheme/assets/ionicon/css/ionicons.min.css" rel="stylesheet" />
<link href="~/AdminTheme/assets/css/material-design-iconic-font.min.css" rel="stylesheet">-->
<!-- animate css -->
<!--<link href="~/AdminTheme/assets/css/animate.css" rel="stylesheet" />-->
<!-- Waves-effect -->
<!--<link href="~/AdminTheme/assets/css/waves-effect.css" rel="stylesheet">-->
<!-- sweet alerts -->
@*<link href="~/AdminTheme/assets/sweet-alert/sweet-alert.min.css" rel="stylesheet">*@
<!-- Custom Files -->
<link href="~/AdminTheme/assets/css/persian-datepicker.min.css" rel="stylesheet" />
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
@*<link href="~/AdminTheme/assets/datatables/jquery.dataTables.min.css" rel="stylesheet" type="text/css" />*@
<link href="~/AdminTheme/assets/css/helper.css" rel="stylesheet" type="text/css" />
<link href="~/AdminTheme/assets/css/style.css" rel="stylesheet" type="text/css" />
<script src="~/AdminTheme/assets/js/modernizr.min.js"></script>
</head>
<body class="fixed-left">
<!-- Begin page -->
<div id="wrapper">
<!-- Top Bar Start -->
<!-- Top Bar End -->
<!-- ========== Right Sidebar Start ========== -->
<!-- Right Sidebar End -->
<!-- ============================================================== -->
<!-- Start Left Content here -->
<!-- ============================================================== -->
<!-- Start content -->
<div class="content">
<div class="container">
@RenderBody()
</div> <!-- container -->
</div> <!-- content -->
<footer class="footer text-right" style="position: fixed; text-align: center; background-color: #646464; height: 50px; color: #ddd;">
2021 © Dadmehr Gostar.
</footer>
<!-- ============================================================== -->
<!-- End Left content here -->
</div>
<!-- END wrapper -->
@*<script>
var resizefunc = [];
</script>*@
@*<div id="MainModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<div class="modal-dialog">
<div class="modal-content" id="ModalContent">
</div>
</div>
</div>*@
<!-- jQuery -->
@*<script src="~/lib/jquery/dist/jquery.min.js"></script>*@
@*<script src="~/AdminTheme/assets/js/jquery.min.js"></script>
<script src="~/AdminTheme/assets/js/bootstrap.min.js"></script>
<script src="~/AdminTheme/assets/js/waves.js"></script>
<script src="~/AdminTheme/assets/js/wow.min.js"></script>
<script src="~/AdminTheme/assets/js/jquery.nicescroll.js" type="text/javascript"></script>
<script src="~/AdminTheme/assets/js/jquery.scrollTo.min.js"></script>
<script src="~/AdminTheme/assets/chat/moment-2.2.1.js"></script>
<script src="~/AdminTheme/assets/jquery-sparkline/jquery.sparkline.min.js"></script>
<script src="~/AdminTheme/assets/jquery-detectmobile/detect.js"></script>
<script src="~/AdminTheme/assets/fastclick/fastclick.js"></script>
<script src="~/AdminTheme/assets/jquery-slimscroll/jquery.slimscroll.js"></script>
<script src="~/AdminTheme/assets/jquery-blockui/jquery.blockUI.js"></script>*@
<!-- sweet alerts -->
<!--<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.min.js"></script>
<script src="~/AdminTheme/assets/sweet-alert/sweet-alert.init.js"></script>-->
<!-- Counter-up -->
<!--<script src="~/AdminTheme/assets/counterup/waypoints.min.js" type="text/javascript"></script>
<script src="~/AdminTheme/assets/counterup/jquery.counterup.min.js" type="text/javascript"></script>-->
<!-- CUSTOM JS -->
<!--<script src="~/lib/jquery/dist/jquery.app.js"></script>-->
<!-- Dashboard -->
<!--<script src="~/AdminTheme/js/jquery.dashboard.js"></script>-->
<!-- Chat -->
<!--<script src="~/AdminTheme/assets/js/jquery.chat.js"></script>-->
@*<script src="~/AdminTheme/assets/js/site.js"></script>-->*@
@*<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>*@
@*<script src="~/AdminTheme/assets/js/site.js"></script>
<script src="~/AdminTheme/assets/js/persian-date.min.js"></script>
<script src="~/AdminTheme/assets/js/persian-datepicker.min.js"></script>*@
@RenderSection("Script", false)
</body>
</html>