Details.cshtml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. @model Recepie.Models.Recipe
  2. @{
  3. ViewData["Title"] = "Recipe Details";
  4. }
  5. <style>
  6. .step-content {
  7. line-height: 1.6;
  8. margin-bottom: 0.5rem;
  9. }
  10. .ingredient-item {
  11. padding: 0.5rem;
  12. background-color: #f8f9fa;
  13. border-radius: 0.25rem;
  14. margin-bottom: 0.5rem;
  15. }
  16. .ingredient-amount {
  17. font-weight: bold;
  18. color: #007bff;
  19. }
  20. </style>
  21. <div class="container mt-4">
  22. <div class="row">
  23. <div class="col-md-8">
  24. <div class="card">
  25. <div class="card-header">
  26. <h2>@Model.Title</h2>
  27. </div>
  28. <div class="card-body">
  29. <p class="lead">@Model.Description</p>
  30. @* Temporarily disabled for main page performance
  31. @if (Model.RecipeImage?.ImageData != null)
  32. {
  33. <div class="mb-4">
  34. <h5><i class="fas fa-camera"></i> Recipe Image</h5>
  35. <div class="text-center">
  36. <img src="@Url.Action("GetImage", "Recipe", new { recipeId = Model.Id })"
  37. class="img-fluid rounded shadow"
  38. alt="@Model.Title"
  39. style="max-height: 400px; object-fit: cover;" />
  40. </div>
  41. </div>
  42. }
  43. *@
  44. <div class="mb-4">
  45. <h5><i class="fas fa-camera"></i> Recipe Image</h5>
  46. <div class="text-center">
  47. <img src="@Url.Action("GetImage", "Recipe", new { recipeId = Model.Id })"
  48. class="img-fluid rounded shadow"
  49. alt="@Model.Title"
  50. style="max-height: 400px; object-fit: cover;"
  51. onerror="this.style.display='none'" />
  52. </div>
  53. </div>
  54. @if (!string.IsNullOrEmpty(Model.Difficulty))
  55. {
  56. <div class="mb-3">
  57. <strong>Difficulty:</strong> <span class="badge bg-info">@Model.Difficulty</span>
  58. </div>
  59. }
  60. @if (!string.IsNullOrEmpty(Model.Time))
  61. {
  62. <div class="mb-3">
  63. <strong>Time:</strong> @Model.Time
  64. </div>
  65. }
  66. @if (Model.RecipeIngredients.Any())
  67. {
  68. <div class="mb-4">
  69. <h5><i class="fas fa-list"></i> Ingredients</h5>
  70. <div class="card">
  71. <div class="card-body">
  72. <ul class="list-unstyled mb-0">
  73. @foreach (var recipeIngredient in Model.RecipeIngredients.OrderBy(ri =>
  74. ri.Ingredient.Name))
  75. {
  76. <li class="ingredient-item d-flex align-items-center">
  77. <i class="fas fa-check text-success me-2"></i>
  78. <span class="ingredient-amount me-2">
  79. @if (!string.IsNullOrEmpty(recipeIngredient.Amount))
  80. {
  81. @recipeIngredient.Amount
  82. }
  83. @if (!string.IsNullOrEmpty(recipeIngredient.Measurement))
  84. {
  85. <text> @recipeIngredient.Measurement</text>
  86. }
  87. </span>
  88. <span>@recipeIngredient.Ingredient?.Name</span>
  89. </li>
  90. }
  91. </ul>
  92. </div>
  93. </div>
  94. </div>
  95. }
  96. @if (Model.RecipeSteps.Any())
  97. {
  98. <div class="mb-4">
  99. <h5><i class="fas fa-clipboard-list"></i> Instructions</h5>
  100. <div class="card">
  101. <div class="card-body">
  102. <ol class="mb-0">
  103. @foreach (var step in Model.RecipeSteps.OrderBy(s => s.StepNumber))
  104. {
  105. <li class="mb-3">
  106. <div class="step-content">
  107. @step.Text
  108. </div>
  109. </li>
  110. }
  111. </ol>
  112. </div>
  113. </div>
  114. </div>
  115. }
  116. @if (!string.IsNullOrEmpty(Model.Url))
  117. {
  118. <div class="mb-3">
  119. <strong>Recipe URL:</strong>
  120. <a href="@Model.Url" target="_blank" class="btn btn-outline-primary btn-sm">
  121. <i class="fas fa-external-link-alt"></i> View Original Recipe
  122. </a>
  123. </div>
  124. }
  125. </div>
  126. </div>
  127. </div>
  128. <div class="col-md-4">
  129. <div class="card">
  130. <div class="card-header">
  131. <h5>Actions</h5>
  132. </div>
  133. <div class="card-body">
  134. <div class="d-grid gap-2">
  135. @if (!string.IsNullOrEmpty(Model.Url))
  136. {
  137. <a href="@Model.Url" target="_blank" class="btn btn-success">
  138. <i class="fas fa-external-link-alt"></i> View Recipe
  139. </a>
  140. }
  141. <a href="@Url.Action("Edit", new { id = Model.Id })" class="btn btn-warning">
  142. <i class="fas fa-edit"></i> Edit Recipe
  143. </a>
  144. <a href="@Url.Action("Delete", new { id = Model.Id })" class="btn btn-danger">
  145. <i class="fas fa-trash"></i> Delete Recipe
  146. </a>
  147. <a href="@Url.Action("Index")" class="btn btn-secondary">
  148. <i class="fas fa-arrow-left"></i> Back to List
  149. </a>
  150. </div>
  151. </div>
  152. </div>
  153. @if (Model.IngredientNames.Any())
  154. {
  155. <div class="card mt-3">
  156. <div class="card-header">
  157. <h6>Quick Filter by Ingredients</h6>
  158. </div>
  159. <div class="card-body">
  160. <div class="d-grid gap-1">
  161. @foreach (var ingredient in Model.IngredientNames.Take(5))
  162. {
  163. <a href="@Url.Action("Index", new { includeIngredients = ingredient })"
  164. class="btn btn-outline-primary btn-sm">
  165. Find recipes with @ingredient
  166. </a>
  167. }
  168. </div>
  169. </div>
  170. </div>
  171. }
  172. </div>
  173. </div>
  174. </div>