From 57bea7b54c318965c3647ce8ff1ab5106a65ef03 Mon Sep 17 00:00:00 2001 From: Tai Date: Wed, 11 Jun 2025 13:06:08 +0200 Subject: [PATCH] Meal updates --- Aberwyn/Controllers/MealController.cs | 6 +- Aberwyn/Controllers/MealMenuApiController.cs | 5 +- Aberwyn/Data/MenuService.cs | 30 +++++- Aberwyn/Models/MenuViewModel.cs | 35 ++++-- Aberwyn/Views/Meal/Index.cshtml | 48 +++++++++ Aberwyn/wwwroot/css/meal-gallery.css | 107 +++++++++++++++++++ Aberwyn/wwwroot/images/fallback.jpg | Bin 0 -> 31239 bytes 7 files changed, 218 insertions(+), 13 deletions(-) create mode 100644 Aberwyn/Views/Meal/Index.cshtml create mode 100644 Aberwyn/wwwroot/css/meal-gallery.css create mode 100644 Aberwyn/wwwroot/images/fallback.jpg diff --git a/Aberwyn/Controllers/MealController.cs b/Aberwyn/Controllers/MealController.cs index 9272520..c677423 100644 --- a/Aberwyn/Controllers/MealController.cs +++ b/Aberwyn/Controllers/MealController.cs @@ -18,7 +18,11 @@ namespace Aberwyn.Controllers _configuration = configuration; _env = env; } - + [HttpGet("/meal")] + public IActionResult Index() + { + return View("Index"); + } [HttpGet] public IActionResult View(int? id, bool edit = false) { diff --git a/Aberwyn/Controllers/MealMenuApiController.cs b/Aberwyn/Controllers/MealMenuApiController.cs index 57b7956..02d7d17 100644 --- a/Aberwyn/Controllers/MealMenuApiController.cs +++ b/Aberwyn/Controllers/MealMenuApiController.cs @@ -30,11 +30,12 @@ namespace Aberwyn.Controllers [HttpGet("getMeals")] public IActionResult GetMeals() { - var meals = _menuService.GetMealsDetailed(); // Hämtar med ImageData - var mealDtos = meals.Select(MealDto.FromMeal).ToList(); + var meals = _menuService.GetMealsSlim(true); + var mealDtos = meals.Select(m => MealDto.FromMeal(m, includeThumbnail: true)).ToList(); // 👈 fix return Ok(mealDtos); } + [HttpGet("getWeeklyMenu")] public IActionResult GetWeeklyMenu(int weekNumber, int year) { diff --git a/Aberwyn/Data/MenuService.cs b/Aberwyn/Data/MenuService.cs index 4ba0483..e0d071c 100644 --- a/Aberwyn/Data/MenuService.cs +++ b/Aberwyn/Data/MenuService.cs @@ -165,9 +165,35 @@ public class MenuService _context.SaveChanges(); return updatedCount; } - - public List GetAllWeeklyMenus() +public List GetMealsSlim(bool includeThumbnail = false) { + if (includeThumbnail) + { + return _context.Meals + .Select(m => new Meal + { + Id = m.Id, + Name = m.Name, + Description = m.Description, + ThumbnailData = m.ThumbnailData + }) + .ToList(); + } + else + { + return _context.Meals + .Select(m => new Meal + { + Id = m.Id, + Name = m.Name, + Description = m.Description + }) + .ToList(); + } +} + + public List GetAllWeeklyMenus() + { var menus = _context.WeeklyMenus.ToList(); var allMeals = _context.Meals.ToDictionary(m => m.Id, m => m.Name); diff --git a/Aberwyn/Models/MenuViewModel.cs b/Aberwyn/Models/MenuViewModel.cs index 335cd0e..449763e 100644 --- a/Aberwyn/Models/MenuViewModel.cs +++ b/Aberwyn/Models/MenuViewModel.cs @@ -104,20 +104,39 @@ public class WeeklyMenu public string? ImageData { get; set; } // base64 public string? ImageMimeType { get; set; } - public static MealDto FromMeal(Meal meal) + public static MealListDto FromMeal(Meal meal, bool includeThumbnail = false) { - return new MealDto + return new MealListDto { Id = meal.Id, Name = meal.Name, - Category = meal.Category, - IsAvailable = meal.IsAvailable, - ImageUrl = meal.ImageUrl, - ImageMimeType = meal.ImageMimeType, - ImageData = meal.ImageData != null ? Convert.ToBase64String(meal.ImageData) : null + Description = meal.Description, + ThumbnailData = includeThumbnail && meal.ThumbnailData != null + ? Convert.ToBase64String(meal.ThumbnailData) + : null }; } - } + } + public class MealListDto + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string? Description { get; set; } + public string? ThumbnailData { get; set; } + + public static MealListDto FromMeal(Meal meal, bool includeThumbnail = false) + { + return new MealListDto + { + Id = meal.Id, + Name = meal.Name, + Description = meal.Description, + ThumbnailData = includeThumbnail && meal.ThumbnailData != null + ? Convert.ToBase64String(meal.ThumbnailData) + : null + }; + } + } } diff --git a/Aberwyn/Views/Meal/Index.cshtml b/Aberwyn/Views/Meal/Index.cshtml new file mode 100644 index 0000000..2ba182a --- /dev/null +++ b/Aberwyn/Views/Meal/Index.cshtml @@ -0,0 +1,48 @@ + + + + + Måltider + + + + + + + + + + + + + + diff --git a/Aberwyn/wwwroot/css/meal-gallery.css b/Aberwyn/wwwroot/css/meal-gallery.css new file mode 100644 index 0000000..6601d7a --- /dev/null +++ b/Aberwyn/wwwroot/css/meal-gallery.css @@ -0,0 +1,107 @@ +body { + background-color: #f7f7f7; + font-family: 'Segoe UI', sans-serif; + color: #222; + margin: 0; + } + + .meal-gallery-container { + max-width: 1200px; + margin: 0 auto; + padding: 2rem 1rem; + } + + .meal-gallery-header { + text-align: center; + margin-bottom: 2rem; + } + + .meal-gallery-header h1 { + font-size: 2.4rem; + font-weight: 600; + } + + .search-container { + margin-top: 1rem; + position: relative; + max-width: 400px; + margin-inline: auto; + } + + .search-container input { + width: 100%; + padding: 10px 38px 10px 12px; + border-radius: 25px; + border: 1px solid #ccc; + font-size: 1rem; + } + + .search-container i { + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + color: #888; + } + + .meal-gallery-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: 24px; + } + + .meal-card { + background: white; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0,0,0,0.05); + transition: transform 0.2s ease, box-shadow 0.2s ease; + display: flex; + flex-direction: column; + } + + .meal-card:hover { + transform: scale(1.015); + box-shadow: 0 4px 12px rgba(0,0,0,0.1); + } + + .meal-card img { + width: 100%; + height: 200px; + object-fit: cover; + } + + .meal-card-content { + padding: 16px; + display: flex; + flex-direction: column; + flex-grow: 1; + } + + .meal-card-content h3 { + margin: 0 0 8px; + font-size: 1.2rem; + color: #111; + } + + .meal-card-content p { + flex-grow: 1; + font-size: 0.95rem; + color: #555; + } + + .btn-readmore { + align-self: flex-start; + background: #007d36; + color: white; + padding: 8px 12px; + border-radius: 6px; + text-decoration: none; + font-size: 0.95rem; + margin-top: 12px; + } + + .btn-readmore:hover { + background: #005c27; + } + \ No newline at end of file diff --git a/Aberwyn/wwwroot/images/fallback.jpg b/Aberwyn/wwwroot/images/fallback.jpg new file mode 100644 index 0000000000000000000000000000000000000000..042b1104373d6c7ea935c0ac8de1cb7714c6f0be GIT binary patch literal 31239 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 F{|7WL@;?9o literal 0 HcmV?d00001