source: KernelRecordsMVC.Web/Views/Shared/_Layout.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: 13.9 KB
RevLine 
[fa0fbaf]1@using Microsoft.AspNetCore.Http
[595d2e5]2@using Microsoft.EntityFrameworkCore
3@using KernelRecordsMVC.Infrastructure.Data
4@using KernelRecordsMVC.Domain.Enums
5@inject KernelRecordsContext DbContext
[fa0fbaf]6
[595d2e5]7@{
8 long cartCount = 0;
9
10 var sessionUserId = Context.Session.GetInt32("UserId");
11
12 if (sessionUserId.HasValue)
13 {
14 var userId = (long)sessionUserId.Value;
[fa0fbaf]15
[595d2e5]16 cartCount = await DbContext.OrderProducts
17 .Where(op =>
18 op.Order.UserId == userId &&
19 op.Order.Status == OrderStatusType.PENDING)
20 .SumAsync(op => (long?)op.Quantity) ?? 0;
21 }
22}
23
24<!DOCTYPE html>
[08aefc6]25<html lang="en">
26<head>
[fa0fbaf]27 <meta charset="utf-8" />
28 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
29
[595d2e5]30 <title>@ViewData["Title"] - Kernel Records</title>
[fa0fbaf]31
[595d2e5]32 <link rel="stylesheet"
33 href="~/css/site.css"
34 asp-append-version="true" />
[08aefc6]35</head>
[fa0fbaf]36
[08aefc6]37<body>
[fa0fbaf]38
39<header class="site-header">
40
[595d2e5]41 <!-- =====================================================
42 MAIN NAVBAR
43 ===================================================== -->
[fa0fbaf]44
[595d2e5]45 <nav class="navbar">
[fa0fbaf]46
[595d2e5]47 <div class="navbar-container">
[fa0fbaf]48
[595d2e5]49 <!-- LOGO -->
[fa0fbaf]50
[595d2e5]51 <a asp-controller="Home"
52 asp-action="Index"
53 class="navbar-brand logo-brand">
[fa0fbaf]54
[595d2e5]55 <img src="~/images/logo.png"
56 asp-append-version="true"
57 alt="Kernel Records"
58 class="site-logo" />
[fa0fbaf]59
[595d2e5]60 </a>
[fa0fbaf]61
62
[595d2e5]63 <!-- MOBILE MENU BUTTON -->
[fa0fbaf]64
[595d2e5]65 <button class="mobile-menu-button"
66 type="button"
67 aria-label="Toggle navigation"
68 onclick="toggleMobileMenu()">
69 ☰
70 </button>
[fa0fbaf]71
72
[595d2e5]73 <!-- NAVBAR CONTENT -->
[fa0fbaf]74
[595d2e5]75 <div class="navbar-content"
76 id="navbarContent">
[fa0fbaf]77
[595d2e5]78 <!-- =================================================
79 MAIN NAVIGATION
80 ================================================= -->
[fa0fbaf]81
[595d2e5]82 <ul class="nav-links">
[fa0fbaf]83
[595d2e5]84 <li>
[fa0fbaf]85 <a asp-controller="Release"
[595d2e5]86 asp-action="Index">
87 Browse
[fa0fbaf]88 </a>
[595d2e5]89 </li>
[fa0fbaf]90
[595d2e5]91 <li>
92 <a asp-controller="TopSellers"
93 asp-action="Index">
94 Top Sellers
[fa0fbaf]95 </a>
[595d2e5]96 </li>
[fa0fbaf]97
[595d2e5]98 <li>
99 <a asp-controller="Artist"
[fa0fbaf]100 asp-action="Index">
[595d2e5]101 Artists
[fa0fbaf]102 </a>
[595d2e5]103 </li>
[fa0fbaf]104
[595d2e5]105 <li class="nav-dropdown">
[fa0fbaf]106
[595d2e5]107 <a href="#"
108 class="dropdown-toggle">
109 Genres
110 <span class="arrow">⌄</span>
111 </a>
[fa0fbaf]112
[595d2e5]113 <div class="dropdown-menu">
[fa0fbaf]114
[595d2e5]115 <a asp-controller="Release"
116 asp-action="Index"
117 asp-route-genre="Rock">
118 Rock
119 </a>
[fa0fbaf]120
[595d2e5]121 <a asp-controller="Release"
122 asp-action="Index"
123 asp-route-genre="Pop">
124 Pop
125 </a>
[fa0fbaf]126
[595d2e5]127 <a asp-controller="Release"
128 asp-action="Index"
129 asp-route-genre="Hip-Hop">
130 Hip-Hop
131 </a>
[fa0fbaf]132
[595d2e5]133 <a asp-controller="Release"
134 asp-action="Index"
135 asp-route-genre="Jazz">
136 Jazz
137 </a>
[fa0fbaf]138
[595d2e5]139 <a asp-controller="Release"
140 asp-action="Index"
141 asp-route-genre="Electronic">
142 Electronic
143 </a>
[fa0fbaf]144
[595d2e5]145 <a asp-controller="Release"
146 asp-action="Index">
147 All Genres
148 </a>
[fa0fbaf]149
[595d2e5]150 </div>
[fa0fbaf]151
[595d2e5]152 </li>
[fa0fbaf]153
[595d2e5]154 <li>
155 <a asp-controller="Sale"
156 asp-action="Index"
157 class="nav-sale">
158 Sale
159 </a>
160 </li>
[fa0fbaf]161
[595d2e5]162 </ul>
[fa0fbaf]163
164
165 <!-- =================================================
[595d2e5]166 SEARCH
[fa0fbaf]167 ================================================= -->
168
[595d2e5]169 <form class="navbar-search"
170 asp-controller="Release"
171 asp-action="Index"
172 method="get">
[fa0fbaf]173
[595d2e5]174 <input type="text"
175 name="search"
176 placeholder="Search releases..."
177 autocomplete="off" />
[fa0fbaf]178
[595d2e5]179 <button type="submit"
180 aria-label="Search">
181 <span>⌕</span>
182 </button>
[fa0fbaf]183
[595d2e5]184 </form>
[fa0fbaf]185
186
187 <!-- =================================================
[595d2e5]188 RIGHT SIDE ACTIONS
[fa0fbaf]189 ================================================= -->
190
[595d2e5]191 <div class="navbar-actions">
[fa0fbaf]192
[595d2e5]193 <!-- WISHLIST -->
[fa0fbaf]194
[595d2e5]195 <a class="nav-icon"
196 asp-controller="Wishlist"
197 asp-action="Index"
198 title="Wishlist">
[fa0fbaf]199
[595d2e5]200 <span class="icon">♡</span>
[fa0fbaf]201
[595d2e5]202 <span class="icon-label">
203 Wishlist
204 </span>
[fa0fbaf]205
[595d2e5]206 </a>
[fa0fbaf]207
208
[595d2e5]209 <!-- CART -->
[fa0fbaf]210
[595d2e5]211 <a class="nav-icon nav-cart-link"
212 asp-controller="Order"
213 asp-action="Cart"
214 title="Shopping Cart">
[fa0fbaf]215
[595d2e5]216 <span class="nav-cart-icon-wrap">
[fa0fbaf]217
[595d2e5]218 <span class="icon cart-icon">
219 🛒
[fa0fbaf]220 </span>
221
[595d2e5]222 @if (cartCount > 0)
223 {
224 <span class="nav-cart-count"
225 aria-label="@cartCount item(s) in cart">
226 @(cartCount > 99 ? "99+" : cartCount.ToString())
[fa0fbaf]227 </span>
[595d2e5]228 }
[fa0fbaf]229
[595d2e5]230 </span>
[fa0fbaf]231
[595d2e5]232 <span class="icon-label">
233 Cart
234 </span>
[fa0fbaf]235
[595d2e5]236 </a>
[fa0fbaf]237
238
[595d2e5]239 <!-- ACCOUNT -->
[fa0fbaf]240
[595d2e5]241 @if (Context.Session.GetInt32("UserId") != null)
242 {
243 <div class="account-dropdown">
[fa0fbaf]244
[595d2e5]245 <button class="account-button"
246 type="button">
[fa0fbaf]247
[595d2e5]248 <span class="user-icon">●</span>
[fa0fbaf]249
[595d2e5]250 <span class="account-name">
251 @Context.Session.GetString("Username")
[fa0fbaf]252 </span>
253
[595d2e5]254 <span class="arrow">⌄</span>
[fa0fbaf]255
[595d2e5]256 </button>
[fa0fbaf]257
[595d2e5]258 <div class="account-menu">
[fa0fbaf]259
[595d2e5]260 <a asp-controller="Account"
261 asp-action="Profile">
262 <span>👤</span>
263 My Profile
[fa0fbaf]264 </a>
265
[595d2e5]266 <a asp-controller="Order"
267 asp-action="Cart">
268 <span>📦</span>
269 My Orders
270 </a>
[fa0fbaf]271
[595d2e5]272 <a asp-controller="Wishlist"
273 asp-action="Index">
274 <span>♡</span>
275 My Wishlist
276 </a>
[fa0fbaf]277
[595d2e5]278 @if (Context.Session.GetString("Role") == "Admin")
279 {
280 <div class="menu-divider"></div>
[fa0fbaf]281
[595d2e5]282 <a asp-controller="Admin"
283 asp-action="Index"
284 class="admin-link">
285 <span>⚙</span>
286 Admin Dashboard
287 </a>
288 }
[fa0fbaf]289
[595d2e5]290 <div class="menu-divider"></div>
[fa0fbaf]291
[595d2e5]292 <form asp-controller="Account"
293 asp-action="Logout"
294 method="post">
[fa0fbaf]295
[595d2e5]296 @Html.AntiForgeryToken()
[fa0fbaf]297
[595d2e5]298 <button type="submit"
299 class="logout-button">
300 <span>↪</span>
301 Logout
302 </button>
[fa0fbaf]303
[595d2e5]304 </form>
[fa0fbaf]305
[595d2e5]306 </div>
[fa0fbaf]307
308 </div>
[595d2e5]309 }
310 else
311 {
312 <div class="auth-buttons">
[fa0fbaf]313
[595d2e5]314 <a asp-controller="Account"
315 asp-action="Login"
316 class="login-button">
317 Login
318 </a>
[fa0fbaf]319
[595d2e5]320 <a asp-controller="Account"
321 asp-action="Register"
322 class="register-button">
323 Register
324 </a>
[fa0fbaf]325
[595d2e5]326 </div>
327 }
[fa0fbaf]328
[595d2e5]329 </div>
[fa0fbaf]330
[08aefc6]331 </div>
[fa0fbaf]332
[08aefc6]333 </div>
[fa0fbaf]334
[595d2e5]335 </nav>
[fa0fbaf]336
337
[595d2e5]338 <!-- =====================================================
339 ANNOUNCEMENT BAR
340 ===================================================== -->
[fa0fbaf]341
[595d2e5]342 <div class="announcement-bar">
[fa0fbaf]343
[595d2e5]344 <span>
345 FREE SHIPPING ON ORDERS OVER $100
346 </span>
[08aefc6]347
[595d2e5]348 </div>
349
[fa0fbaf]350
351</header>
352
[595d2e5]353
[fa0fbaf]354<!-- =========================================================
355 MAIN CONTENT
356 ========================================================= -->
357
358<main class="main-content">
[595d2e5]359 @RenderBody()
[fa0fbaf]360</main>
361
[595d2e5]362
[fa0fbaf]363<!-- =========================================================
364 FOOTER
365 ========================================================= -->
366
367<footer class="site-footer">
368
[595d2e5]369 <div class="footer-container">
[fa0fbaf]370
[595d2e5]371 <div class="footer-brand">
[fa0fbaf]372
[595d2e5]373 <div class="footer-logo">
374 KERNEL RECORDS
375 </div>
[fa0fbaf]376
[595d2e5]377 <p>
378 Your destination for vinyl, CDs and cassettes.
379 </p>
[fa0fbaf]380
381 </div>
382
383
[595d2e5]384 <div class="footer-column">
[fa0fbaf]385
[595d2e5]386 <h4>Shop</h4>
[fa0fbaf]387
[595d2e5]388 <a asp-controller="Release"
389 asp-action="Index">
390 Releases
[fa0fbaf]391 </a>
392
[595d2e5]393 <a asp-controller="Release"
394 asp-action="Index">
395 New Releases
[fa0fbaf]396 </a>
397
[595d2e5]398 <a asp-controller="Artist"
[fa0fbaf]399 asp-action="Index">
[595d2e5]400 Artists
[fa0fbaf]401 </a>
402
[595d2e5]403 </div>
[fa0fbaf]404
405
[595d2e5]406 <div class="footer-column">
[fa0fbaf]407
[595d2e5]408 <h4>Account</h4>
[fa0fbaf]409
[595d2e5]410 @if (Context.Session.GetInt32("UserId") != null)
411 {
412 <a asp-controller="Account"
413 asp-action="Profile">
414 My Profile
415 </a>
[fa0fbaf]416
[595d2e5]417 <a asp-controller="Order"
418 asp-action="Cart">
419 My Orders
420 </a>
[fa0fbaf]421
[595d2e5]422 <a asp-controller="Wishlist"
423 asp-action="Index">
424 Wishlist
425 </a>
426 }
427 else
428 {
429 <a asp-controller="Account"
430 asp-action="Login">
431 Login
432 </a>
[fa0fbaf]433
[595d2e5]434 <a asp-controller="Account"
435 asp-action="Register">
436 Register
437 </a>
438 }
[fa0fbaf]439
[595d2e5]440 </div>
[fa0fbaf]441
442
[595d2e5]443 <div class="footer-column">
[fa0fbaf]444
[595d2e5]445 <h4>Help</h4>
[fa0fbaf]446
[595d2e5]447 <a href="#">
448 Shipping
449 </a>
[fa0fbaf]450
[595d2e5]451 <a href="#">
452 Returns
453 </a>
[fa0fbaf]454
[595d2e5]455 <a href="#">
456 Contact
457 </a>
[fa0fbaf]458
[595d2e5]459 </div>
[fa0fbaf]460
461 </div>
462
463
[595d2e5]464 <div class="footer-bottom">
[fa0fbaf]465
[595d2e5]466 <span>
467 © @DateTime.Now.Year Kernel Records
468 </span>
[fa0fbaf]469
[595d2e5]470 <span>
471 All rights reserved.
472 </span>
[fa0fbaf]473
[595d2e5]474 </div>
[fa0fbaf]475
[08aefc6]476</footer>
[fa0fbaf]477
[595d2e5]478
[fa0fbaf]479<!-- =========================================================
480 MOBILE NAVIGATION SCRIPT
481 ========================================================= -->
482
483<script>
484 function toggleMobileMenu()
485 {
486 const menu =
487 document.getElementById("navbarContent");
488
489 menu.classList.toggle("mobile-open");
490 }
491
492 document.addEventListener("click", function (event)
493 {
494 const menu =
495 document.getElementById("navbarContent");
496
497 const button =
498 document.querySelector(".mobile-menu-button");
499
[595d2e5]500 if (!menu || !button)
501 return;
[fa0fbaf]502
503 if (!menu.contains(event.target) &&
504 !button.contains(event.target))
505 {
506 menu.classList.remove("mobile-open");
507 }
508 });
509</script>
510
511@await RenderSectionAsync(
[595d2e5]512 "Scripts",
513 required: false)
[fa0fbaf]514
[08aefc6]515</body>
[fa0fbaf]516</html>
Note: See TracBrowser for help on using the repository browser.