source: KernelRecordsMVC.Web/Views/Release/Index.cshtml

main
Last change on this file was 595d2e5, checked in by mmilevski <markomilevski3@…>, 4 weeks ago

Various UI bugfixes.

  • Property mode set to 100644
File size: 8.6 KB
RevLine 
[08aefc6]1@model IEnumerable<KernelRecordsMVC.Models.Release>
2
[fa0fbaf]3@{
4 ViewData["Title"] = "Browse Releases";
5}
[08aefc6]6
[fa0fbaf]7<div class="releases-page">
[08aefc6]8
[fa0fbaf]9 <!-- =====================================================
10 HEADER
11 ===================================================== -->
[08aefc6]12
[fa0fbaf]13 <div class="releases-header">
[08aefc6]14
[fa0fbaf]15 <div>
16 <span class="page-eyebrow">KERNEL RECORDS</span>
[08aefc6]17
[fa0fbaf]18 <h1>Browse Releases</h1>
[08aefc6]19
[fa0fbaf]20 <p>
21 Explore vinyl, CDs and cassettes from our collection.
22 </p>
23 </div>
[08aefc6]24
[fa0fbaf]25 <div class="release-count">
26 @Model.Count() releases
27 </div>
[08aefc6]28
29 </div>
30
31
[fa0fbaf]32 <!-- =====================================================
33 FILTERS
34 ===================================================== -->
[08aefc6]35
[fa0fbaf]36 <form asp-action="Index"
37 method="get"
38 class="release-filters">
[08aefc6]39
[fa0fbaf]40 <div class="filter-search">
[08aefc6]41
[fa0fbaf]42 <label>Search</label>
[08aefc6]43
[fa0fbaf]44 <input type="text"
45 name="search"
46 value="@ViewBag.Search"
47 placeholder="Search by title or artist..." />
[08aefc6]48
[fa0fbaf]49 </div>
[08aefc6]50
51
[fa0fbaf]52 <div>
[08aefc6]53
[fa0fbaf]54 <label>Genre</label>
[08aefc6]55
[fa0fbaf]56 <select name="genre">
[08aefc6]57
[fa0fbaf]58 <option value="">All Genres</option>
[08aefc6]59
[fa0fbaf]60 @foreach (var item in ViewBag.Genres)
61 {
62 <option value="@item"
63 selected="@(ViewBag.Genre == item ? "selected" : null)">
64 @item
65 </option>
66 }
[08aefc6]67
[fa0fbaf]68 </select>
[08aefc6]69
[fa0fbaf]70 </div>
[08aefc6]71
72
[fa0fbaf]73 <div>
[08aefc6]74
[fa0fbaf]75 <label>Format</label>
[08aefc6]76
[fa0fbaf]77 <select name="format">
[08aefc6]78
[fa0fbaf]79 <option value="">All Formats</option>
[08aefc6]80
[fa0fbaf]81 @foreach (var item in ViewBag.Formats)
82 {
83 <option value="@item"
84 selected="@(ViewBag.Format == item ? "selected" : null)">
85 @item
86 </option>
87 }
[08aefc6]88
[fa0fbaf]89 </select>
[08aefc6]90
[fa0fbaf]91 </div>
[08aefc6]92
93
[fa0fbaf]94 <div>
[08aefc6]95
[fa0fbaf]96 <label>Type</label>
[08aefc6]97
[fa0fbaf]98 <select name="type">
[08aefc6]99
[fa0fbaf]100 <option value="">All Types</option>
[08aefc6]101
[fa0fbaf]102 <option value="Album"
103 selected="@(ViewBag.Type == "Album" ? "selected" : null)">
104 Album
105 </option>
[08aefc6]106
[fa0fbaf]107 <option value="Single"
108 selected="@(ViewBag.Type == "Single" ? "selected" : null)">
109 Single
110 </option>
[08aefc6]111
[fa0fbaf]112 </select>
[08aefc6]113
[fa0fbaf]114 </div>
[08aefc6]115
116
[fa0fbaf]117 <div>
[08aefc6]118
[fa0fbaf]119 <label>Sort</label>
[08aefc6]120
[fa0fbaf]121 <select name="sort">
[08aefc6]122
[fa0fbaf]123 <option value="">Title A–Z</option>
124
125 <option value="titleDesc"
126 selected="@(ViewBag.Sort == "titleDesc" ? "selected" : null)">
127 Title Z–A
128 </option>
129
130 <option value="newest"
131 selected="@(ViewBag.Sort == "newest" ? "selected" : null)">
132 Newest
133 </option>
134
135 <option value="oldest"
136 selected="@(ViewBag.Sort == "oldest" ? "selected" : null)">
137 Oldest
138 </option>
139
140 <option value="format"
141 selected="@(ViewBag.Sort == "format" ? "selected" : null)">
142 Format
143 </option>
144
145 <option value="priceAsc"
146 selected="@(ViewBag.Sort == "priceAsc" ? "selected" : null)">
147 Price: Low to High
148 </option>
149
150 <option value="priceDesc"
151 selected="@(ViewBag.Sort == "priceDesc" ? "selected" : null)">
152 Price: High to Low
153 </option>
154
155 </select>
156
157 </div>
[08aefc6]158
159
[fa0fbaf]160 <div class="filter-button">
[08aefc6]161
[fa0fbaf]162 <button type="submit"
163 class="store-button primary">
[08aefc6]164
[fa0fbaf]165 Apply Filters
[08aefc6]166
[fa0fbaf]167 </button>
168
169 </div>
170
171
172 @if (!string.IsNullOrWhiteSpace(ViewBag.Search as string) ||
173 !string.IsNullOrWhiteSpace(ViewBag.Genre as string) ||
174 !string.IsNullOrWhiteSpace(ViewBag.Format as string) ||
175 !string.IsNullOrWhiteSpace(ViewBag.Type as string) ||
176 !string.IsNullOrWhiteSpace(ViewBag.Sort as string))
177 {
178 <div class="clear-filter">
179
180 <a asp-action="Index">
181 Clear all filters
[08aefc6]182 </a>
183
184 </div>
[fa0fbaf]185 }
186
187 </form>
188
189
190 <!-- =====================================================
191 RELEASE GRID
192 ===================================================== -->
193
194 @if (!Model.Any())
195 {
196 <div class="empty-store">
197
198 <div class="empty-store-icon">
199 ♪
200 </div>
201
202 <h2>No releases found</h2>
203
204 <p>
205 Try changing your search or filters.
206 </p>
207
208 <a asp-action="Index"
209 class="store-button primary">
210 View All Releases
211 </a>
[08aefc6]212
213 </div>
[fa0fbaf]214 }
215 else
216 {
217 <div class="release-grid">
[08aefc6]218
[fa0fbaf]219 @foreach (var release in Model)
220 {
221 var isAlbum = release.Album != null;
222 var isSingle = release.SingleRelease != null;
223
224 var releaseType =
225 isAlbum ? "ALBUM" :
226 isSingle ? "SINGLE" :
227 "RELEASE";
228
229 var artists = string.Join(
230 ", ",
231 release.ReleaseArtists
232 .OrderBy(x => x.ReleaseOrdinal)
233 .Select(x => x.Artist.ArtistName)
234 );
235
236 var lowestPrice = release.Products
237 .Select(x => (decimal?)x.Price)
238 .Min();
239
240 <article class="release-card">
241
242 <a asp-action="Details"
243 asp-route-id="@release.ReleaseId"
244 class="release-card-cover">
245
246 @if (!string.IsNullOrWhiteSpace(release.CoverPhoto))
247 {
248 <img src="@release.CoverPhoto"
249 alt="@release.Title" />
250 }
251 else
252 {
253 <div class="release-no-cover">
254 <span>♪</span>
255 </div>
256 }
257
258 <span class="release-type-badge">
259 @releaseType
260 </span>
261
262 </a>
263
264
265 <div class="release-card-body">
266
267 <div class="release-card-meta">
268
269 <span>
270 @release.Genre
271 </span>
272
273 <span>
274 @release.ReleaseDate.ToString("yyyy")
275 </span>
276
277 </div>
278
279
280 <h2>
281
282 <a asp-action="Details"
283 asp-route-id="@release.ReleaseId">
284
285 @release.Title
286
287 </a>
288
289 </h2>
290
291
292 <p class="release-card-artist">
293
294 @artists
295
296 </p>
297
298
299 <div class="format-list">
300
301 @foreach (var product in release.Products
302 .GroupBy(x => x.Format)
303 .Select(x => x.First()))
304 {
305 <span class="format-pill">
306 @product.Format
307 </span>
308 }
309
310 </div>
311
312
313 <div class="release-card-bottom">
314
315 <div class="release-starting">
316
317 Starting at
318
319 <strong>
[595d2e5]320 @(lowestPrice?.ToString("C") ?? "Coming soon!")
[fa0fbaf]321 </strong>
322
323 </div>
324
325
326 <a asp-action="Details"
327 asp-route-id="@release.ReleaseId"
328 class="store-button primary small">
329
330 View
331
332 </a>
333
334 </div>
335
336 </div>
337
338 </article>
339 }
340
341 </div>
342 }
[08aefc6]343
344</div>
Note: See TracBrowser for help on using the repository browser.