diff --git a/Services/Implemnetation/BannerRepository.cs b/Services/Implemnetation/BannerRepository.cs index d7051ff..da47504 100644 --- a/Services/Implemnetation/BannerRepository.cs +++ b/Services/Implemnetation/BannerRepository.cs @@ -52,6 +52,11 @@ namespace Services.Implemnetation return await _context.Banners.AsNoTracking().ToListAsync(); } + public List GetBannersForPage() + { + return _context.Banners.AsNoTracking().ToList(); + } + public void Update(Banner banner) { _context.Banners.Update(banner); diff --git a/Services/Interaces/IBannerRepository.cs b/Services/Interaces/IBannerRepository.cs index 01aea70..9b2415f 100644 --- a/Services/Interaces/IBannerRepository.cs +++ b/Services/Interaces/IBannerRepository.cs @@ -10,6 +10,8 @@ namespace Services.Interaces public interface IBannerRepository { Task> GetBanners(); + + List GetBannersForPage(); List GetAllBanners(); Banner GetBannerById(int id); diff --git a/Web/Areas/Admin/Controllers/PageController.cs b/Web/Areas/Admin/Controllers/PageController.cs new file mode 100644 index 0000000..664e933 --- /dev/null +++ b/Web/Areas/Admin/Controllers/PageController.cs @@ -0,0 +1,207 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Model; +using Services.Interaces; +using Services.SlugServices; +using Web.ViewModel.PageVM; + +namespace Web.Areas.Admin.Controllers +{ + public class PageController : Controller + { + private readonly IPageRepository _pageRepository; + private readonly IBannerRepository _bannerRepository; + + public PageController(IPageRepository pageRepository,IBannerRepository bannerRepository) + { + _pageRepository = pageRepository; + _bannerRepository = bannerRepository; + } + public IActionResult Index() + { + var pages = _pageRepository.GetPageWithBanner(); + + List result = new List(); + + foreach (var page in pages) + { + result.Add(new PageViewModel { Id = page.Id, Title = page.Title, Slug = page.Slug, banner = page.banner }); + } + + return View(result); + } + + [HttpGet] + public IActionResult Create() + { + ViewBag.DropDownData=GetSidebarsForDropDownList(); + + return View(); + } + + + + + [HttpPost] + public async Task Create(PageViewModel viewmodel) + { + if(!ModelState.IsValid) + { + ViewBag.DropDownData = GetSidebarsForDropDownList(); + return View(viewmodel); + } + + string slug; + + if (string.IsNullOrEmpty(viewmodel.Slug)) + slug = SlugService.Create(true, viewmodel.Title); + else + slug = SlugService.Create(true, viewmodel.Slug); + + + + if(_pageRepository.SlugExists(slug)) + { + ModelState.AddModelError("", "Title or slug exists"); + ViewBag.DropDownData = GetSidebarsForDropDownList(); + return View(viewmodel); + } + + Page page = new Page(); + + page.Title = viewmodel.Title; + page.Slug = slug; + page.Content = viewmodel.Content; + page.banner = viewmodel.banner; + page.BannerId = viewmodel.BannerId; + + + _pageRepository.Add(page); + await _pageRepository.commitAsync(); + TempData["Success"] = "page created successfully"; + + return RedirectToAction(nameof(Index)); + } + + [HttpGet] + public IActionResult Edit(int id) + { + var pageFromdb=_pageRepository.GetPageById(id); + + var viewmodel = new PageViewModel + { + Id = pageFromdb.Id, + Title = pageFromdb.Title, + Slug = pageFromdb.Slug, + Content=pageFromdb.Content, + banner=pageFromdb.banner, + BannerId=pageFromdb.BannerId, + + + }; + ViewBag.DropDownData = GetSidebarsForDropDownList(); + + + return View(viewmodel); + } + + [HttpPost] + public async Task Edit(PageViewModel viewmodel) + { + if(!ModelState.IsValid) + { + + ViewBag.DropDownData = GetSidebarsForDropDownList(); + return View(viewmodel); + + } + + string slug; + + if (string.IsNullOrEmpty(viewmodel.Slug)) + slug = SlugService.Create(true, viewmodel.Title); + else + slug = SlugService.Create(true, viewmodel.Slug); + + if(_pageRepository.SlugExists(slug,viewmodel.Id)) + { + + ModelState.AddModelError("", "Title or slug exists"); + ViewBag.DropDownData = GetSidebarsForDropDownList(); + return View(viewmodel); + } + + Page page = _pageRepository.GetPageById(viewmodel.Id); + + page.Title = viewmodel.Title; + page.Slug = slug; + page.Content = viewmodel.Content; + page.banner = viewmodel.banner; + page.BannerId = viewmodel.BannerId; + + + _pageRepository.Update(page); + + await _pageRepository.commitAsync(); + + TempData["Success"] = "page updated successfully"; + + + return RedirectToAction(nameof(Index)); + + } + + + [HttpGet] + public IActionResult Delete(int id) + { + var pageFromdb = _pageRepository.GetPageById(id); + + var viewmodel = new PageViewModel + { + Id = pageFromdb.Id, + Title = pageFromdb.Title, + Slug = pageFromdb.Slug, + Content = pageFromdb.Content, + banner = pageFromdb.banner, + BannerId = pageFromdb.BannerId, + + + }; + ViewBag.DropDownData = GetSidebarsForDropDownList(); + + + return View(viewmodel); + } + + + [HttpPost] + [ActionName("Delete")] + public async Task DeleteConfirm(int id) + { + + + _pageRepository.Delete(id); + await _pageRepository.commitAsync(); + TempData["Success"] = "page Deleted successfully"; + + return RedirectToAction(nameof(Index)); + + } + private List GetSidebarsForDropDownList() + { + var banners = _bannerRepository.GetBannersForPage(); + + List dropDown = new List(); + + foreach (var item in banners) + { + dropDown.Add(new SelectListItem { Text = item.Title, Value = item.Id.ToString() }); + } + + return dropDown; + } + + + } +} diff --git a/Web/Areas/Admin/Views/Page/Create.cshtml b/Web/Areas/Admin/Views/Page/Create.cshtml new file mode 100644 index 0000000..d4b9ec5 --- /dev/null +++ b/Web/Areas/Admin/Views/Page/Create.cshtml @@ -0,0 +1,67 @@ +@model PageViewModel + +@{ + ViewData["Title"] = "Create"; +} + + + + + + + +
+
+
+
Create page
+ +
+ + +
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + +
+ +
+ | Back to list +
+ +
+
+
+
+
+ + +@section Scripts { + + + + @{ + + } +} + diff --git a/Web/Areas/Admin/Views/Page/Delete.cshtml b/Web/Areas/Admin/Views/Page/Delete.cshtml new file mode 100644 index 0000000..4e660a4 --- /dev/null +++ b/Web/Areas/Admin/Views/Page/Delete.cshtml @@ -0,0 +1,60 @@ +@model PageViewModel + +@{ + ViewData["Title"] = "Delete"; +} + +
+
+
+
Delete page
+
Are you sure you want to delete the @Model.Title
+ +
+ + +
+
+ +
+ + + +
+
+ + + +
+ + + +
+
+ + + + +
+ +
+ | Back to list +
+ + +
+
+
+
+ + +@section Scripts { + + + + @{ + + } +} diff --git a/Web/Areas/Admin/Views/Page/Edit.cshtml b/Web/Areas/Admin/Views/Page/Edit.cshtml new file mode 100644 index 0000000..52027b2 --- /dev/null +++ b/Web/Areas/Admin/Views/Page/Edit.cshtml @@ -0,0 +1,68 @@ +@model Web.ViewModel.PageVM.PageViewModel + +@{ + ViewData["Title"] = "Edit"; +} + + +
+
+
+
Create page
+ +
+ + +
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + +
+ +
+ | Back to list +
+ +
+
+
+
+
+ + +@section Scripts { + + + + @{ + + } +} + + + + + + + diff --git a/Web/Areas/Admin/Views/Page/Index.cshtml b/Web/Areas/Admin/Views/Page/Index.cshtml new file mode 100644 index 0000000..9322c93 --- /dev/null +++ b/Web/Areas/Admin/Views/Page/Index.cshtml @@ -0,0 +1,57 @@ +@model IEnumerable + +@{ + ViewData["Title"] = "Index"; +} + + + + +
+ + + +
+
Pages
+
+

Page list

+

+ Create New page +

+ + + + + + + + + + + + + + @foreach (var item in Model) + { + + + + + + + + + } + + + +
IdTitleSlugBannerAction
@item.Id @item.Title@item.Slug@item.banner?.Title + Delete | + Edit +
+ +
+
+
+ + diff --git a/Web/Areas/Admin/Views/_ViewImports.cshtml b/Web/Areas/Admin/Views/_ViewImports.cshtml index a5c3cd7..951b8aa 100644 --- a/Web/Areas/Admin/Views/_ViewImports.cshtml +++ b/Web/Areas/Admin/Views/_ViewImports.cshtml @@ -7,4 +7,5 @@ @using Web.ViewModel.FooterVm @using Web.ViewModel.SocialMediaVM @using Web.ViewModel.QuestionnaireVM +@using Web.ViewModel.PageVM @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/Web/ViewModel/PageVM/PageViewModel.cs b/Web/ViewModel/PageVM/PageViewModel.cs new file mode 100644 index 0000000..caae9a0 --- /dev/null +++ b/Web/ViewModel/PageVM/PageViewModel.cs @@ -0,0 +1,24 @@ +using Model; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Web.ViewModel.PageVM +{ + public class PageViewModel + { + public int Id { get; set; } + [Required] + public string? Title { get; set; } + public string? Slug { get; set; } + [Required] + public string? Content { get; set; } + + + [DisplayName("Banner")] + public int BannerId { get; set; } + + [ForeignKey("BannerId")] + public Banner? banner { get; set; } + } +}