332 lines
17 KiB
Plaintext
332 lines
17 KiB
Plaintext
@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>
|
||
}
|