Files
Dashboard_Exercise/Views/Panel/User.cshtml
2025-08-23 16:13:20 +03:30

332 lines
17 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.

@using boilerplate.Models
@model User
@{
var User = Session["User"] as User;
if (Model == null || User == null) { return; }
ViewBag.Title = Model.User_Id == 0 ? "کاربر جدید" : Model.User_Name + " " + Model.User_Family;
Layout = "~/Views/_PanelSideBar.cshtml";
Functions functions = new Functions();
}
<form autocomplete="off">
<div class="row">
<div class="col-md-8 form-group">
<div class="row">
<div class="col-12 form-group">
<div class="card card-custom">
<div class="card-body">
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="txtName">نام:</label>
</div>
<div class="col-md-10">
<input class="form-control" id="txtName" placeholder="نام ..." value="@Model.User_Name" />
</div>
</div>
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="txtFamily">نام خانوادگی:</label>
</div>
<div class="col-md-10">
<input class="form-control" id="txtFamily" placeholder="نام خانوادگی ..." value="@Model.User_Family" />
</div>
</div>
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="txtPhone">شماره موبایل:</label>
</div>
<div class="col-md-10">
<input class="form-control" id="txtPhone" placeholder="شماره موبایل ..." value="@Model.User_Phone" />
</div>
</div>
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="txtPassword">رمز عبور:</label>
</div>
<div class="col-md-10">
<input class="form-control" id="txtPassword" placeholder="رمز عبور ..." />
</div>
</div>
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="ddlRole">نوع کاربر:</label>
</div>
<div class="col-md-10">
<select class="form-control" id="ddlRole">
<option value="Admin" @(Model.User_Role == "Admin" ? "selected" : "")>مدیر</option>
<option value="User" @(Model.User_Role == "User" ? "selected" : "")>کاربر</option>
</select>
</div>
</div>
<div class="form-group row align-items-center">
<div class="col-md-2">
<label for="fuImage">تصویر:</label>
</div>
<div class="col-md-8">
<input class="form-control" id="fuImage" type="file" accept="image/*" />
</div>
<div class="col-md-2">
<a href="~/Media/User/@Model.User_Image" target="_blank">
<div class="symbol symbol-100 border">
<img src="~/Media/User/@Model.User_Image" id="fuPreview" style="object-fit: cover;">
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4 form-group">
<div class="row">
<div class="col-12 form-group">
<div class="card card-custom">
<div class="card-header bg-secondary-o-100">
<div class="card-title">
<label>انتشار</label>
</div>
</div>
<div class="card-body align-items-center">
<div class="row align-items-center">
<div class="col">
<label for="chkStatus">فعال:</label>
</div>
<div class="col">
<span class="switch switch-outline switch-icon switch-sm switch-success">
<label>
<input type="checkbox" id="chkActive" @(Model.User_Status == 1 ? "checked" : "")>
<span></span>
</label>
</span>
</div>
</div>
</div>
<div class="card-footer">
<div class="row">
@if (Model.User_Id != 0)
{
if (User.User_Id != Model.User_Id && functions.HasAccess(User.User_Access, "ManageDeleteUser"))
{
<div class="col text-center">
<a class="btn btn-danger btn-shadow btn-sm w-100 btns" onclick="Delete()">حذف</a>
</div>
}
}
<div class="col text-center">
<a class="btn btn-success btn-shadow btns @(Model.User_Id != 0 ? $"btn-sm {(User.User_Id == Model.User_Id ? "" : "w-100")}" : "")" onclick="Save()" id="btnSave">@(Model.User_Id == 0 ? "انتشار" : "ذخیره")</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 form-group" id="CategoryBlock">
<div class="card card-custom">
<div class="card-header bg-secondary-o-100">
<div class="card-title">
<label>دسترسی ها</label>
</div>
<div class="card-toolbar">
<a class="btn btn-sm btn-icon btn-primary mx-1" onclick="$(`input[name='chkAccess']`).prop('checked', false)" data-toggle="tooltip" title="عدم علامت همه">
<i class="fa fa-minus"></i>
</a>
<a class="btn btn-sm btn-icon btn-primary mx-1" onclick="$(`input[name='chkAccess']`).prop('checked', true)" data-toggle="tooltip" title="علامت زدن همه">
<i class="fa fa-check"></i>
</a>
</div>
</div>
<div class="card-body align-items-center">
<div class="max-h-250px overflow-auto">
<div class="checkbox-list mb-3">
<label class="checkbox">
<input type="checkbox" value="ManageDashboard" name="chkAccess">
<span></span>
آمار داشبورد
</label>
</div>
<div class="checkbox-list mb-3">
<label class="checkbox">
<input type="checkbox" value="ManageUser" name="chkAccess">
<span></span>
مدیریت کاربران
</label>
</div>
<div class="checkbox-list mb-3">
<label class="checkbox">
<input type="checkbox" value="ManageDeleteUser" name="chkAccess">
<span></span>
مدیریت حذف کاربران
</label>
</div>
<div class="checkbox-list mb-3">
<label class="checkbox">
<input type="checkbox" value="ManageSetting" name="chkAccess">
<span></span>
تنظیمات
</label>
</div>
<div class="checkbox-list mb-3">
<label class="checkbox">
<input type="checkbox" name="chkAccess" value="ManageItems" @(Model.User_Access != null && Model.User_Access.Contains("ManageItems") ? "checked" : "") />
<span></span>
مدیریت دسته‌بندی و تگ
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
@section Script {
<script>
const Id = @Model.User_Id;
$("#UserList").addClass("menu-item-open");
if (Id == 0) { $("#UserMenu").addClass("menu-item-active"); }
const UserAccess = "@Model.User_Access";
if (UserAccess == "All") {
$(`input[name="chkAccess"]`).prop("checked", true);
}
else {
UserAccess.split(',').forEach(item => { $(`input[name="chkAccess"][value="${item}"]`).prop("checked", true); });
}
$(window).bind('keydown', function (event) {
if (event.ctrlKey || event.metaKey) {
switch (String.fromCharCode(event.which).toLowerCase()) {
case 's':
event.preventDefault();
$("#btnSave").click();
break;
}
}
});
$("#fuImage").on("change", function () {
if (this.files.length) {
try {
let Image = this.files[0];
if (Image.type.includes("image/")) {
var reader = new FileReader();
reader.onload = function () {
$("#fuPreview").attr("src", reader.result);
};
reader.readAsDataURL(Image);
}
else {
$(this).val(null);
toastr.error('فایل انتخاب شده پشتیبانی نمی شود !');
}
} catch (e) { }
}
});
function Save() {
// --- ADDED: Client-side validation for image on new users ---
var isNew = (Id === 0);
var fileInput = $("#fuImage")[0];
if (isNew && fileInput.files.length === 0) {
toastr.error("لطفاً یک تصویر برای کاربر انتخاب کنید.");
return; // Stop the function if image is missing
}
let Phone = $("#txtPhone").val().trim();
if (Phone.length) {
let Access = "";
if ($('input[name="chkAccess"]').length == $('input[name="chkAccess"]:checked').length) {
Access = "All";
}
else if ($('input[name="chkAccess"]:checked').length) {
$('input[name="chkAccess"]:checked').each(function () {
if (Access) {
Access += `,${this.value}`;
}
else {
Access = this.value;
}
});
}
$("#btnSave").css("opacity", 0.5);
$("#btnSave").attr("onclick", "");
let model = {
Auth: { UserId: @User.User_Id, Token: "@User.User_Token" },
Id: Id,
Name: $("#txtName").val().trim(),
Family: $("#txtFamily").val().trim(),
Phone: Phone,
Password: $("#txtPassword").val().trim(),
Role: $("#ddlRole").val(),
Status: $("#chkActive").prop("checked") ? 1 : 2,
Access: Access
};
let formData = new FormData();
formData.append("Model", JSON.stringify(model));
formData.append("Image", $("#fuImage")[0].files[0]);
let ajax = new XMLHttpRequest();
ajax.addEventListener("load", function (event) {
$("#btnSave").css("opacity", 1);
let data = JSON.parse(event.target.responseText);
if (data.Status == "Success") {
toastr.success("ذخیره سازی با موفقیت انجام شد");
setTimeout(function () {
location.href = `../Panel/User/${data.Result}`;
}, 1500);
}
else if (data.Status == "DuplicatePhone") {
$("#btnSave").attr("onclick", "Save()"); // Re-enable button
toastr.error("این شماره تلفن قبلاً در سیستم ثبت شده است!");
}
else {
$("#btnSave").attr("onclick", "Save()");
console.log(data);
toastr.warning("خطا هنگام ذخیره سازی اطلاعات");
}
}, false);
ajax.addEventListener("error", function () {
$("#btnSave").css("opacity", 1);
$("#btnSave").attr("onclick", "Save()");
toastr.error("خطا هنگام برقراری ارتباط با سرور");
}, false);
ajax.open("POST", "../api/User/Manage");
ajax.send(formData);
}
else {
toastr.warning("شماره موبایل را وارد کنید");
}
}
function Delete() {
Swal.fire({
title: "آیا از انجام این عملیات مطمئن هستید ؟",
text: "این عملیات قابل برگشت نمی باشد !!!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
cancelButtonText: 'خیر',
confirmButtonText: 'بله'
}).then((result) => {
if (result.value) {
$.post("../api/User/Delete", { Id: Id, UserId: @User.User_Id, Token: "@User.User_Token" }).done(function (data) {
if (data.Status == "Success") {
$(".btns").remove();
toastr.success("حذف با موفقیت انجام شد");
setTimeout(function () {
location.href = "../Panel/Users";
}, 1500);
} else {
toastr.warning("خطا هنگام برقراری ارتباط با سرور");
}
}).fail(function () {
toastr.error("خطا هنگام برقراری ارتباط با سرور");
});
}
});
}
</script>
}