Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/EssaysController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using manpreetsingh.pro.Services.Markdown;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class EssaysController : Controller
{
private readonly ApplicationDbContext _db; private readonly IMarkdownRenderer _markdown;
public EssaysController(ApplicationDbContext db, IMarkdownRenderer markdown) { _db = db; _markdown = markdown; }
public async Task<IActionResult> Index() => View(await _db.Essays.OrderBy(x => x.SortOrder).ToListAsync());
public IActionResult Create() => View("Edit", new EssayEditViewModel());
[HttpPost, ValidateAntiForgeryToken] public async Task<IActionResult> Create(EssayEditViewModel vm){ if(!ModelState.IsValid) return View("Edit",vm); var e=new Essay(); Map(vm,e); _db.Add(e); await _db.SaveChangesAsync(); return RedirectToAction(nameof(Index)); }
public async Task<IActionResult> Edit(int id){ var e=await _db.Essays.FindAsync(id); if(e==null) return NotFound(); return View(new EssayEditViewModel{Id=e.Id,Slug=e.Slug,Title=e.Title,Summary=e.Summary,MarkdownBody=e.MarkdownBody,ReadTimeMinutes=e.ReadTimeMinutes,Category=e.Category,SeoTitle=e.SeoTitle,SeoDescription=e.SeoDescription,HeroAssetId=e.HeroAssetId,SortOrder=e.SortOrder,IsPublished=e.IsPublished}); }
[HttpPost, ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, EssayEditViewModel vm){ var e=await _db.Essays.FindAsync(id); if(e==null) return NotFound(); Map(vm,e); await _db.SaveChangesAsync(); return RedirectToAction(nameof(Index)); }
[HttpPost, ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){ var e=await _db.Essays.FindAsync(id); if(e!=null){_db.Remove(e); await _db.SaveChangesAsync();} return RedirectToAction(nameof(Index)); }
private void Map(EssayEditViewModel vm, Essay e){ e.Slug=vm.Slug; e.Title=vm.Title; e.Summary=vm.Summary; e.MarkdownBody=vm.MarkdownBody; e.RenderedHtml=_markdown.Render(vm.MarkdownBody); e.ReadTimeMinutes=vm.ReadTimeMinutes; e.Category=vm.Category; e.SeoTitle=vm.SeoTitle; e.SeoDescription=vm.SeoDescription; e.HeroAssetId=vm.HeroAssetId; e.SortOrder=vm.SortOrder; e.IsPublished=vm.IsPublished; e.PublishedOnUtc=vm.IsPublished?DateTime.UtcNow:null; e.UpdatedUtc=DateTime.UtcNow; }
}
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/FrameworkModelsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using manpreetsingh.pro.Services.Markdown;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class FrameworkModelsController : Controller
{
private readonly ApplicationDbContext _db; private readonly IMarkdownRenderer _md;
public FrameworkModelsController(ApplicationDbContext db, IMarkdownRenderer md){_db=db;_md=md;}
public async Task<IActionResult> Index()=>View(await _db.FrameworkModels.OrderBy(x=>x.SortOrder).ToListAsync());
public IActionResult Create()=>View("Edit",new FrameworkModelEditViewModel());
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(FrameworkModelEditViewModel vm){var m=new FrameworkModel();Map(vm,m);_db.Add(m);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
public async Task<IActionResult> Edit(int id){var m=await _db.FrameworkModels.FindAsync(id);if(m==null) return NotFound(); return View(new FrameworkModelEditViewModel{Id=m.Id,Slug=m.Slug,Title=m.Title,Summary=m.Summary,MarkdownBody=m.MarkdownBody,SeoTitle=m.SeoTitle,SeoDescription=m.SeoDescription,DiagramAssetId=m.DiagramAssetId,SortOrder=m.SortOrder,IsPublished=m.IsPublished});}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, FrameworkModelEditViewModel vm){var m=await _db.FrameworkModels.FindAsync(id); if(m==null)return NotFound(); Map(vm,m); await _db.SaveChangesAsync(); return RedirectToAction(nameof(Index));}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var m=await _db.FrameworkModels.FindAsync(id); if(m!=null){_db.Remove(m); await _db.SaveChangesAsync();} return RedirectToAction(nameof(Index));}
void Map(FrameworkModelEditViewModel vm, FrameworkModel m){m.Slug=vm.Slug;m.Title=vm.Title;m.Summary=vm.Summary;m.MarkdownBody=vm.MarkdownBody;m.RenderedHtml=_md.Render(vm.MarkdownBody);m.SeoTitle=vm.SeoTitle;m.SeoDescription=vm.SeoDescription;m.DiagramAssetId=vm.DiagramAssetId;m.SortOrder=vm.SortOrder;m.IsPublished=vm.IsPublished;m.PublishedOnUtc=vm.IsPublished?DateTime.UtcNow:null;m.UpdatedUtc=DateTime.UtcNow;}
}
11 changes: 11 additions & 0 deletions Areas/Admin/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin")]
[Authorize(Roles = "Admin")]
public class HomeController : Controller
{
public IActionResult Index() => View();
}
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/MediaItemsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using manpreetsingh.pro.Services.Markdown;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class MediaItemsController : Controller
{
private readonly ApplicationDbContext _db; private readonly IMarkdownRenderer _md;
public MediaItemsController(ApplicationDbContext db, IMarkdownRenderer md){_db=db;_md=md;}
public async Task<IActionResult> Index()=>View(await _db.MediaItems.OrderBy(x=>x.SortOrder).ToListAsync());
public IActionResult Create()=>View("Edit",new MediaItemEditViewModel());
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(MediaItemEditViewModel vm){var m=new MediaItem();Map(vm,m);_db.Add(m);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
public async Task<IActionResult> Edit(int id){var m=await _db.MediaItems.FindAsync(id);if(m==null)return NotFound();return View(new MediaItemEditViewModel{Id=m.Id,Slug=m.Slug,Title=m.Title,Summary=m.Summary,MarkdownBody=m.MarkdownBody,MediaType=m.MediaType,Duration=m.Duration,VideoAssetId=m.VideoAssetId,ThumbnailAssetId=m.ThumbnailAssetId,SortOrder=m.SortOrder,IsPublished=m.IsPublished});}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, MediaItemEditViewModel vm){var m=await _db.MediaItems.FindAsync(id);if(m==null)return NotFound();Map(vm,m);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var m=await _db.MediaItems.FindAsync(id);if(m!=null){_db.Remove(m);await _db.SaveChangesAsync();}return RedirectToAction(nameof(Index));}
void Map(MediaItemEditViewModel vm, MediaItem m){m.Slug=vm.Slug;m.Title=vm.Title;m.Summary=vm.Summary;m.MarkdownBody=vm.MarkdownBody;m.RenderedHtml=_md.Render(vm.MarkdownBody);m.MediaType=vm.MediaType;m.Duration=vm.Duration;m.VideoAssetId=vm.VideoAssetId;m.ThumbnailAssetId=vm.ThumbnailAssetId;m.SortOrder=vm.SortOrder;m.IsPublished=vm.IsPublished;m.PublishedOnUtc=vm.IsPublished?DateTime.UtcNow:null;m.UpdatedUtc=DateTime.UtcNow;}
}
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/StaticPagesController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using manpreetsingh.pro.Services.Markdown;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class StaticPagesController : Controller
{
private readonly ApplicationDbContext _db; private readonly IMarkdownRenderer _md;
public StaticPagesController(ApplicationDbContext db, IMarkdownRenderer md){_db=db;_md=md;}
public async Task<IActionResult> Index()=>View(await _db.StaticPages.OrderBy(x=>x.Slug).ToListAsync());
public IActionResult Create()=>View("Edit",new StaticPageEditViewModel());
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(StaticPageEditViewModel vm){var p=new StaticPage();Map(vm,p);_db.Add(p);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
public async Task<IActionResult> Edit(int id){var p=await _db.StaticPages.FindAsync(id);if(p==null)return NotFound();return View(new StaticPageEditViewModel{Id=p.Id,Slug=p.Slug,Title=p.Title,MarkdownBody=p.MarkdownBody,SeoTitle=p.SeoTitle,SeoDescription=p.SeoDescription,IsPublished=p.IsPublished});}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, StaticPageEditViewModel vm){var p=await _db.StaticPages.FindAsync(id);if(p==null)return NotFound();Map(vm,p);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var p=await _db.StaticPages.FindAsync(id);if(p!=null){_db.Remove(p);await _db.SaveChangesAsync();}return RedirectToAction(nameof(Index));}
void Map(StaticPageEditViewModel vm, StaticPage p){p.Slug=vm.Slug;p.Title=vm.Title;p.MarkdownBody=vm.MarkdownBody;p.RenderedHtml=_md.Render(vm.MarkdownBody);p.SeoTitle=vm.SeoTitle;p.SeoDescription=vm.SeoDescription;p.IsPublished=vm.IsPublished;p.PublishedOnUtc=vm.IsPublished?DateTime.UtcNow:null;p.UpdatedUtc=DateTime.UtcNow;}
}
24 changes: 24 additions & 0 deletions Areas/Admin/Controllers/ToolQuestionsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class ToolQuestionsController : Controller
{
private readonly ApplicationDbContext _db;
public ToolQuestionsController(ApplicationDbContext db){_db=db;}
public async Task<IActionResult> Index()=>View(await _db.ToolQuestions.Include(x=>x.Tool).OrderBy(x=>x.ToolId).ThenBy(x=>x.SortOrder).ToListAsync());
public async Task<IActionResult> Create(){await LoadTools();return View("Edit",new ToolQuestionEditViewModel());}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(ToolQuestionEditViewModel vm){if(!ModelState.IsValid){await LoadTools();return View("Edit",vm);}var q=new ToolQuestion();Map(vm,q);_db.Add(q);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
public async Task<IActionResult> Edit(int id){var q=await _db.ToolQuestions.FindAsync(id);if(q==null)return NotFound();await LoadTools();return View(new ToolQuestionEditViewModel{Id=q.Id,ToolId=q.ToolId,Prompt=q.Prompt,HelpText=q.HelpText,SortOrder=q.SortOrder,MinScore=q.MinScore,MaxScore=q.MaxScore});}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, ToolQuestionEditViewModel vm){var q=await _db.ToolQuestions.FindAsync(id);if(q==null)return NotFound();Map(vm,q);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var q=await _db.ToolQuestions.FindAsync(id);if(q!=null){_db.Remove(q);await _db.SaveChangesAsync();}return RedirectToAction(nameof(Index));}
async Task LoadTools()=>ViewBag.Tools=new SelectList(await _db.Tools.OrderBy(x=>x.Title).ToListAsync(),"Id","Title");
static void Map(ToolQuestionEditViewModel vm, ToolQuestion q){q.ToolId=vm.ToolId;q.Prompt=vm.Prompt;q.HelpText=vm.HelpText;q.SortOrder=vm.SortOrder;q.MinScore=vm.MinScore;q.MaxScore=vm.MaxScore;q.UpdatedUtc=DateTime.UtcNow;}
}
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/ToolsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Areas.Admin.ViewModels;
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Models.Domain;
using manpreetsingh.pro.Services.Markdown;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class ToolsController : Controller
{
private readonly ApplicationDbContext _db; private readonly IMarkdownRenderer _md;
public ToolsController(ApplicationDbContext db, IMarkdownRenderer md){_db=db;_md=md;}
public async Task<IActionResult> Index()=>View(await _db.Tools.OrderBy(x=>x.SortOrder).ToListAsync());
public IActionResult Create()=>View("Edit",new ToolEditViewModel());
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(ToolEditViewModel vm){var t=new Tool();Map(vm,t);_db.Add(t);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
public async Task<IActionResult> Edit(int id){var t=await _db.Tools.FindAsync(id);if(t==null)return NotFound();return View(new ToolEditViewModel{Id=t.Id,Slug=t.Slug,Title=t.Title,Summary=t.Summary,MarkdownBody=t.MarkdownBody,ToolType=t.ToolType,EstimatedDuration=t.EstimatedDuration,SeoTitle=t.SeoTitle,SeoDescription=t.SeoDescription,SortOrder=t.SortOrder,IsPublished=t.IsPublished});}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Edit(int id, ToolEditViewModel vm){var t=await _db.Tools.FindAsync(id);if(t==null)return NotFound();Map(vm,t);await _db.SaveChangesAsync();return RedirectToAction(nameof(Index));}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var t=await _db.Tools.FindAsync(id);if(t!=null){_db.Remove(t);await _db.SaveChangesAsync();}return RedirectToAction(nameof(Index));}
void Map(ToolEditViewModel vm, Tool t){t.Slug=vm.Slug;t.Title=vm.Title;t.Summary=vm.Summary;t.MarkdownBody=vm.MarkdownBody;t.RenderedHtml=_md.Render(vm.MarkdownBody);t.ToolType=vm.ToolType;t.EstimatedDuration=vm.EstimatedDuration;t.SeoTitle=vm.SeoTitle;t.SeoDescription=vm.SeoDescription;t.SortOrder=vm.SortOrder;t.IsPublished=vm.IsPublished;t.PublishedOnUtc=vm.IsPublished?DateTime.UtcNow:null;t.UpdatedUtc=DateTime.UtcNow;}
}
23 changes: 23 additions & 0 deletions Areas/Admin/Controllers/UploadedAssetsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using manpreetsingh.pro.Data;
using manpreetsingh.pro.Services.Assets;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace manpreetsingh.pro.Areas.Admin.Controllers;

[Area("Admin"), Authorize(Roles = "Admin")]
public class UploadedAssetsController : Controller
{
private readonly ApplicationDbContext _db; private readonly IAssetService _assets;
public UploadedAssetsController(ApplicationDbContext db, IAssetService assets){_db=db;_assets=assets;}
public async Task<IActionResult> Index()=>View(await _db.UploadedAssets.OrderByDescending(x=>x.CreatedUtc).ToListAsync());
[HttpGet] public IActionResult Create()=>View();
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Create(IFormFile file, string? altText, string? caption, string assetKind="image")
{
if (file == null || file.Length == 0){ModelState.AddModelError("file","File is required."); return View();}
await _assets.SaveAsync(file, altText, caption, assetKind);
return RedirectToAction(nameof(Index));
}
[HttpPost,ValidateAntiForgeryToken] public async Task<IActionResult> Delete(int id){var a=await _db.UploadedAssets.FindAsync(id);if(a!=null){_db.Remove(a);await _db.SaveChangesAsync();}return RedirectToAction(nameof(Index));}
}
17 changes: 17 additions & 0 deletions Areas/Admin/ViewModels/EssayEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class EssayEditViewModel
{
public int? Id { get; set; }
public string Slug { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Summary { get; set; } = string.Empty;
public string MarkdownBody { get; set; } = string.Empty;
public int ReadTimeMinutes { get; set; }
public string Category { get; set; } = string.Empty;
public string? SeoTitle { get; set; }
public string? SeoDescription { get; set; }
public int? HeroAssetId { get; set; }
public int SortOrder { get; set; }
public bool IsPublished { get; set; }
}
15 changes: 15 additions & 0 deletions Areas/Admin/ViewModels/FrameworkModelEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class FrameworkModelEditViewModel
{
public int? Id { get; set; }
public string Slug { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Summary { get; set; } = string.Empty;
public string MarkdownBody { get; set; } = string.Empty;
public string? SeoTitle { get; set; }
public string? SeoDescription { get; set; }
public int? DiagramAssetId { get; set; }
public int SortOrder { get; set; }
public bool IsPublished { get; set; }
}
16 changes: 16 additions & 0 deletions Areas/Admin/ViewModels/LoginViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;

namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class LoginViewModel
{
[Required]
public string Username { get; set; } = string.Empty;

[Required]
[DataType(DataType.Password)]
public string Password { get; set; } = string.Empty;

public bool RememberMe { get; set; }
public string? ReturnUrl { get; set; }
}
16 changes: 16 additions & 0 deletions Areas/Admin/ViewModels/MediaItemEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class MediaItemEditViewModel
{
public int? Id { get; set; }
public string Slug { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Summary { get; set; } = string.Empty;
public string MarkdownBody { get; set; } = string.Empty;
public string MediaType { get; set; } = string.Empty;
public string? Duration { get; set; }
public int? VideoAssetId { get; set; }
public int? ThumbnailAssetId { get; set; }
public int SortOrder { get; set; }
public bool IsPublished { get; set; }
}
12 changes: 12 additions & 0 deletions Areas/Admin/ViewModels/StaticPageEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class StaticPageEditViewModel
{
public int? Id { get; set; }
public string Slug { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string MarkdownBody { get; set; } = string.Empty;
public string? SeoTitle { get; set; }
public string? SeoDescription { get; set; }
public bool IsPublished { get; set; }
}
16 changes: 16 additions & 0 deletions Areas/Admin/ViewModels/ToolEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class ToolEditViewModel
{
public int? Id { get; set; }
public string Slug { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Summary { get; set; } = string.Empty;
public string MarkdownBody { get; set; } = string.Empty;
public string ToolType { get; set; } = string.Empty;
public string EstimatedDuration { get; set; } = string.Empty;
public string? SeoTitle { get; set; }
public string? SeoDescription { get; set; }
public int SortOrder { get; set; }
public bool IsPublished { get; set; }
}
12 changes: 12 additions & 0 deletions Areas/Admin/ViewModels/ToolQuestionEditViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace manpreetsingh.pro.Areas.Admin.ViewModels;

public class ToolQuestionEditViewModel
{
public int? Id { get; set; }
public int ToolId { get; set; }
public string Prompt { get; set; } = string.Empty;
public string? HelpText { get; set; }
public int SortOrder { get; set; }
public int MinScore { get; set; }
public int MaxScore { get; set; }
}
2 changes: 2 additions & 0 deletions Areas/Admin/Views/Essays/Edit.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@model EssayEditViewModel
<h2>Essay</h2><form method="post">@Html.AntiForgeryToken()<input asp-for="Slug" placeholder="slug"/><input asp-for="Title"/><input asp-for="Summary"/><textarea asp-for="MarkdownBody"></textarea><input asp-for="ReadTimeMinutes"/><input asp-for="Category"/><input asp-for="HeroAssetId"/><input asp-for="SortOrder"/><label>Publish<input asp-for="IsPublished"/></label><button type="submit">Save</button></form>
Loading