diff --git a/README.md b/README.md index 31397d0..03f075b 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ Then open the URL printed in the console (e.g. http://localhost:5020). | `/Account/Profile` | پروفایل: شیفت‌ها/موقعیت‌های ذخیره‌شده و اعلام تمایل‌ها | | `/Admin` | پنل مدیریت (نقش Admin): صف آگهی‌های خام | | `/Admin/Review/{id}` | بررسی خودکار (پارسر) و انتشار آگهی به‌صورت شیفت یا استخدام | +| `/Admin/Facilities` | تأیید/لغو تأیید مراکز درمانی (نشان «تأیید شده») | | `/Employer` | **پنل کارفرما**: مراکز من + شمار شیفت/استخدام/متقاضی | | `/Employer/RegisterFacility` | ثبت مرکز درمانی (خودسرویس → نقش FacilityAdmin) | | `/Employer/PostShift`، `/PostJob` | انتشار شیفت یا موقعیت استخدامی | diff --git a/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml b/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml new file mode 100644 index 0000000..2182f18 --- /dev/null +++ b/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml @@ -0,0 +1,74 @@ +@page +@model JobsMedical.Web.Pages.Admin.FacilitiesModel +@{ + ViewData["Title"] = "مدیریت مراکز درمانی"; + string TypeLabel(FacilityType t) => t switch + { + FacilityType.Hospital => "بیمارستان", + FacilityType.Clinic => "کلینیک", + _ => "درمانگاه", + }; +} + +
+
+

تأیید مراکز درمانی

+

+ ← صف آگهی‌ها + · @JalaliDate.ToPersianDigits(Model.Pending.Count.ToString()) مرکز در انتظار تأیید +

+
+
+ +
+

در انتظار تأیید

+ @if (Model.Pending.Count == 0) + { +
مرکزی در انتظار تأیید نیست.
+ } + else + { + foreach (var f in Model.Pending) + { +
+
+
+ @f.Name — @TypeLabel(f.Type) +
+ 📍 @f.City?.Name@(f.District is not null ? "، " + f.District.Name : "") + @if (f.OwnerUser is not null) { · مالک: @JalaliDate.ToPersianDigits(f.OwnerUser.Phone) } + @if (!string.IsNullOrEmpty(f.Phone)) { · تلفن: @JalaliDate.ToPersianDigits(f.Phone) } +
+ @if (!string.IsNullOrEmpty(f.Address)) {
@f.Address
} +
+
+ +
+
+
+ } + } + +

مراکز تأییدشده

+ @if (Model.Verified.Count == 0) + { +
هنوز مرکزی تأیید نشده.
+ } + else + { + foreach (var f in Model.Verified) + { +
+
+
+ @f.Name ✓ تأیید شده +
📍 @f.City?.Name — @TypeLabel(f.Type)
+
+
+ +
+
+
+ } + } +
diff --git a/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml.cs b/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml.cs new file mode 100644 index 0000000..731b1fb --- /dev/null +++ b/src/JobsMedical.Web/Pages/Admin/Facilities.cshtml.cs @@ -0,0 +1,41 @@ +using JobsMedical.Web.Data; +using JobsMedical.Web.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore; + +namespace JobsMedical.Web.Pages.Admin; + +[Authorize(Roles = "Admin")] +public class FacilitiesModel : PageModel +{ + private readonly AppDbContext _db; + public FacilitiesModel(AppDbContext db) => _db = db; + + public List Pending { get; private set; } = new(); + public List Verified { get; private set; } = new(); + + public async Task OnGetAsync() => await LoadAsync(); + + public async Task OnPostVerifyAsync(int id) => await SetVerified(id, true); + public async Task OnPostUnverifyAsync(int id) => await SetVerified(id, false); + + private async Task SetVerified(int id, bool value) + { + var f = await _db.Facilities.FindAsync(id); + if (f is null) return NotFound(); + f.IsVerified = value; + await _db.SaveChangesAsync(); + return RedirectToPage(); + } + + private async Task LoadAsync() + { + var all = await _db.Facilities + .Include(f => f.City).Include(f => f.District).Include(f => f.OwnerUser) + .OrderBy(f => f.Name).ToListAsync(); + Pending = all.Where(f => !f.IsVerified).ToList(); + Verified = all.Where(f => f.IsVerified).ToList(); + } +} diff --git a/src/JobsMedical.Web/Pages/Admin/Index.cshtml b/src/JobsMedical.Web/Pages/Admin/Index.cshtml index b70a8bd..4671dac 100644 --- a/src/JobsMedical.Web/Pages/Admin/Index.cshtml +++ b/src/JobsMedical.Web/Pages/Admin/Index.cshtml @@ -10,6 +10,7 @@

آگهی‌های جمع‌آوری‌شده از کانال‌ها را اینجا بررسی، ساختارمند و منتشر کن. (@JalaliDate.ToPersianDigits(Model.Queue.Count.ToString()) در انتظار بررسی) + · تأیید مراکز درمانی