From 5e8b735ea9b31908b708f2ef52bb34c2a4aa8056 Mon Sep 17 00:00:00 2001 From: muamars Date: Tue, 17 Mar 2026 12:39:02 +0700 Subject: [PATCH] update: fixing PWA config --- .../SpjDriverUpstController/AuthController.cs | 22 +++ .../SpjDriverUpstController/HomeController.cs | 8 ++ Services/DetailPenjemputanService.cs | 7 +- .../Transport/SpjDriverUpst/Home/Index.cshtml | 8 +- .../SpjDriverUpst/Home/Kosong.cshtml | 10 +- appsettings.json | 2 +- wwwroot/driver/css/watch.css | 129 +++++++++++------- wwwroot/driver/images/logo_upst_white.svg | 76 +++++++++++ wwwroot/driver/images/upst_main.svg | 76 +++++++++++ wwwroot/driver/serviceworker.js | 27 +++- 10 files changed, 298 insertions(+), 67 deletions(-) create mode 100644 Controllers/SpjDriverUpstController/AuthController.cs create mode 100644 wwwroot/driver/images/logo_upst_white.svg create mode 100644 wwwroot/driver/images/upst_main.svg diff --git a/Controllers/SpjDriverUpstController/AuthController.cs b/Controllers/SpjDriverUpstController/AuthController.cs new file mode 100644 index 0000000..a975304 --- /dev/null +++ b/Controllers/SpjDriverUpstController/AuthController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Mvc; + +namespace eSPJ.Controllers.SpjDriverUpstController; + +[Route("upst")] +public class AuthController : Controller +{ + private readonly IConfiguration _configuration; + + public AuthController(IConfiguration configuration) + { + _configuration = configuration; + } + + [HttpPost("logout")] + [HttpGet("logout")] + public IActionResult Logout() + { + var logoutUrl = _configuration["SSO:LogoutUrl"] ?? "/upst/mulai"; + return Redirect(logoutUrl); + } +} diff --git a/Controllers/SpjDriverUpstController/HomeController.cs b/Controllers/SpjDriverUpstController/HomeController.cs index dc39beb..77f1e67 100644 --- a/Controllers/SpjDriverUpstController/HomeController.cs +++ b/Controllers/SpjDriverUpstController/HomeController.cs @@ -13,11 +13,19 @@ public class HomeController : Controller { _logger = logger; } + [HttpGet("")] public IActionResult Index() { return View("~/Views/Admin/Transport/SpjDriverUpst/Home/Index.cshtml"); } + + [HttpGet("mulai")] + public IActionResult Mulai() + { + return Redirect("https://pesapakawan.dinaslhdki.id"); + } + [HttpGet("kosong")] public IActionResult Kosong() { diff --git a/Services/DetailPenjemputanService.cs b/Services/DetailPenjemputanService.cs index aafd265..75ad9a4 100644 --- a/Services/DetailPenjemputanService.cs +++ b/Services/DetailPenjemputanService.cs @@ -114,7 +114,10 @@ namespace eSPJ.Services }; } - var uploadPath = Path.Combine(_env.ContentRootPath, "uploads", "penjemputan", DateTime.Now.ToString("yyyy-MM-dd")); + var now = DateTime.Now; + var datePart = now.ToString("yyyy-MM-dd"); + var uploadPath = Path.Combine(_env.ContentRootPath, "uploads", "penjemputan", datePart); + var uploadBaseUrl = $"/uploads/penjemputan/{datePart}"; if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); @@ -150,7 +153,7 @@ namespace eSPJ.Services } // Save foto timbangan - if (request.BeratTimbangan != null && request.JenisSampahList != null) + if (request.FotoTimbangan != null && request.BeratTimbangan != null && request.JenisSampahList != null) { for (int i = 0; i < request.FotoTimbangan.Count; i++) { diff --git a/Views/Admin/Transport/SpjDriverUpst/Home/Index.cshtml b/Views/Admin/Transport/SpjDriverUpst/Home/Index.cshtml index d251c38..9557ac1 100644 --- a/Views/Admin/Transport/SpjDriverUpst/Home/Index.cshtml +++ b/Views/Admin/Transport/SpjDriverUpst/Home/Index.cshtml @@ -25,11 +25,9 @@ diff --git a/Views/Admin/Transport/SpjDriverUpst/Home/Kosong.cshtml b/Views/Admin/Transport/SpjDriverUpst/Home/Kosong.cshtml index e063f1b..65a1450 100644 --- a/Views/Admin/Transport/SpjDriverUpst/Home/Kosong.cshtml +++ b/Views/Admin/Transport/SpjDriverUpst/Home/Kosong.cshtml @@ -23,12 +23,10 @@ diff --git a/appsettings.json b/appsettings.json index 3bb270f..c918331 100644 --- a/appsettings.json +++ b/appsettings.json @@ -6,7 +6,7 @@ } }, "SSO": { - "LoginUrl": "https://akun.dinaslhdki.id/Identity/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%3Fclient_id%3Dwebdinas%26redirect_uri%3Dhttps%253A%252F%252Flingkunganhidup.jakarta.go.id%252Fsignin-oidc%26response_type%3Dcode%26scope%3Dopenid%2520profile%2520email%2520roles%26code_challenge%3Df9YuMeOzpB-egjQlGp4Pqrthdewj6YeINPhz7wgbL-k%26code_challenge_method%3DS256%26response_mode%3Dform_post%26nonce%3D638893657991954291.YTQ5OGU1NWEtOGU0Yi00NjI2LWFkOGEtZjI0YzliMWE5ZGJmYzk1NWFmM2QtOTA3YS00YmU4LWIwYmYtMjBhODc3M2Q1Mjll%26state%3DCfDJ8MtdNDKU3ypIhY_fd6D9SIg-h4wZ5PTm8sXsF0Qt60PKRgGw0d3i7fDi1lkDFBBsDPqzCl_2wM0_cfa16rr1BLmzplWuTtyIwTeTQKD6L-hhysUTyV94E2A1nocB5y-bM1hor2UaCtT9qs7LbdkFPGgUjV6ijoL0HcjilJtVzWYIo6aSsmiEUti9Q8n7XNEEGaZIVLDUH_qfykx51FMn5RCO2j-FkuSA98WBt8KyiN4-jimbr_LTkJVFClnKy_ClAfTS1vlC2a2hu-dDOdCYqlnf6QfuSCvZBf_2D4geBWnlRIHM5m8PfmtYm_WgYyQMuqYf9zkxn2_FTcrMFl4dC5ypMX5yWm0GaeMJlpUt_QYGRyMX6blGcqw5VW9YIexCX9FDuD3xSIjCqnVn6digGLBkDZ8TghO6_KJ5Jkyg8hws%26x-client-SKU%3DID_NET9_0%26x-client-ver%3D8.0.1.0%26prompt%3D" + "LogoutUrl": "https://pesapakawan.dinaslhdki.id/logout" }, "OpenRouter": { "OCRkey": "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" diff --git a/wwwroot/driver/css/watch.css b/wwwroot/driver/css/watch.css index d75fb2a..233f056 100644 --- a/wwwroot/driver/css/watch.css +++ b/wwwroot/driver/css/watch.css @@ -146,6 +146,7 @@ --blur-md: 12px; --blur-lg: 16px; --blur-xl: 24px; + --blur-3xl: 64px; --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); @@ -358,6 +359,9 @@ .-top-4 { top: calc(var(--spacing) * -4); } + .-top-24 { + top: calc(var(--spacing) * -24); + } .top-0 { top: calc(var(--spacing) * 0); } @@ -400,6 +404,9 @@ .-right-6 { right: calc(var(--spacing) * -6); } + .-right-24 { + right: calc(var(--spacing) * -24); + } .right-0 { right: calc(var(--spacing) * 0); } @@ -427,9 +434,6 @@ .right-full { right: 100%; } - .-bottom-0 { - bottom: calc(var(--spacing) * -0); - } .-bottom-0\.5 { bottom: calc(var(--spacing) * -0.5); } @@ -439,6 +443,9 @@ .-bottom-6 { bottom: calc(var(--spacing) * -6); } + .-bottom-32 { + bottom: calc(var(--spacing) * -32); + } .bottom-0 { bottom: calc(var(--spacing) * 0); } @@ -466,12 +473,12 @@ .bottom-100 { bottom: calc(var(--spacing) * 100); } + .-left-32 { + left: calc(var(--spacing) * -32); + } .left-0 { left: calc(var(--spacing) * 0); } - .left-1 { - left: calc(var(--spacing) * 1); - } .left-1\/2 { left: calc(1/2 * 100%); } @@ -787,9 +794,6 @@ .-mr-16 { margin-right: calc(var(--spacing) * -16); } - .mr-1 { - margin-right: calc(var(--spacing) * 1); - } .mr-1\.5 { margin-right: calc(var(--spacing) * 1.5); } @@ -880,15 +884,15 @@ .aspect-square { aspect-ratio: 1 / 1; } - .h-0 { - height: calc(var(--spacing) * 0); - } .h-0\.5 { height: calc(var(--spacing) * 0.5); } .h-1 { height: calc(var(--spacing) * 1); } + .h-1\.5 { + height: calc(var(--spacing) * 1.5); + } .h-2 { height: calc(var(--spacing) * 2); } @@ -961,9 +965,15 @@ .h-64 { height: calc(var(--spacing) * 64); } + .h-72 { + height: calc(var(--spacing) * 72); + } .h-75 { height: calc(var(--spacing) * 75); } + .h-96 { + height: calc(var(--spacing) * 96); + } .h-100 { height: calc(var(--spacing) * 100); } @@ -991,6 +1001,9 @@ .w-1 { width: calc(var(--spacing) * 1); } + .w-1\.5 { + width: calc(var(--spacing) * 1.5); + } .w-1\/3 { width: calc(1/3 * 100%); } @@ -1066,9 +1079,15 @@ .w-64 { width: calc(var(--spacing) * 64); } + .w-72 { + width: calc(var(--spacing) * 72); + } .w-75 { width: calc(var(--spacing) * 75); } + .w-96 { + width: calc(var(--spacing) * 96); + } .w-100 { width: calc(var(--spacing) * 100); } @@ -1087,6 +1106,9 @@ .w-max { width: max-content; } + .max-w-\[260px\] { + max-width: 260px; + } .max-w-full { max-width: 100%; } @@ -1144,10 +1166,6 @@ .border-collapse { border-collapse: collapse; } - .-translate-x-1 { - --tw-translate-x: calc(var(--spacing) * -1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } .-translate-x-1\/2 { --tw-translate-x: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); @@ -1160,10 +1178,6 @@ --tw-translate-x: calc(var(--spacing) * 16); translate: var(--tw-translate-x) var(--tw-translate-y); } - .-translate-y-1 { - --tw-translate-y: calc(var(--spacing) * -1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } .-translate-y-1\/2 { --tw-translate-y: calc(calc(1/2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); @@ -1290,13 +1304,6 @@ .gap-6 { gap: calc(var(--spacing) * 6); } - .space-y-0 { - :where(& > :not(:last-child)) { - --tw-space-y-reverse: 0; - margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse)); - margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse))); - } - } .space-y-0\.5 { :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; @@ -1583,9 +1590,6 @@ .border-gray-400 { border-color: var(--color-gray-400); } - .border-gray-500 { - border-color: var(--color-gray-500); - } .border-green-100 { border-color: var(--color-green-100); } @@ -1676,6 +1680,9 @@ .border-t-transparent { border-top-color: transparent; } + .border-t-white { + border-top-color: var(--color-white); + } .bg-amber-400 { background-color: var(--color-amber-400); } @@ -1733,9 +1740,6 @@ .bg-blue-600 { background-color: var(--color-blue-600); } - .bg-cyan-400 { - background-color: var(--color-cyan-400); - } .bg-cyan-400\/10 { background-color: color-mix(in srgb, oklch(78.9% 0.154 211.53) 10%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1799,9 +1803,6 @@ .bg-indigo-300 { background-color: var(--color-indigo-300); } - .bg-lime-500 { - background-color: var(--color-lime-500); - } .bg-lime-500\/15 { background-color: color-mix(in srgb, oklch(76.8% 0.233 130.85) 15%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1823,9 +1824,6 @@ .bg-orange-500 { background-color: var(--color-orange-500); } - .bg-orange-700 { - background-color: var(--color-orange-700); - } .bg-orange-700\/30 { background-color: color-mix(in srgb, oklch(55.3% 0.195 38.402) 30%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1868,9 +1866,6 @@ .bg-slate-900 { background-color: var(--color-slate-900); } - .bg-slate-950 { - background-color: var(--color-slate-950); - } .bg-slate-950\/60 { background-color: color-mix(in srgb, oklch(12.9% 0.042 264.695) 60%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1895,18 +1890,18 @@ background-color: color-mix(in oklab, var(--color-white) 10%, transparent); } } - .bg-white\/15 { - background-color: color-mix(in srgb, #fff 15%, transparent); - @supports (color: color-mix(in lab, red, red)) { - background-color: color-mix(in oklab, var(--color-white) 15%, transparent); - } - } .bg-white\/20 { background-color: color-mix(in srgb, #fff 20%, transparent); @supports (color: color-mix(in lab, red, red)) { background-color: color-mix(in oklab, var(--color-white) 20%, transparent); } } + .bg-white\/30 { + background-color: color-mix(in srgb, #fff 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 30%, transparent); + } + } .bg-white\/70 { background-color: color-mix(in srgb, #fff 70%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -2506,6 +2501,10 @@ --tw-tracking: 0.24em; letter-spacing: 0.24em; } + .tracking-\[0\.28em\] { + --tw-tracking: 0.28em; + letter-spacing: 0.28em; + } .tracking-tight { --tw-tracking: var(--tracking-tight); letter-spacing: var(--tracking-tight); @@ -2691,6 +2690,18 @@ .text-white { color: var(--color-white); } + .text-white\/30 { + color: color-mix(in srgb, #fff 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-white) 30%, transparent); + } + } + .text-white\/40 { + color: color-mix(in srgb, #fff 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-white) 40%, transparent); + } + } .text-white\/70 { color: color-mix(in srgb, #fff 70%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -2763,6 +2774,9 @@ .opacity-60 { opacity: 60%; } + .opacity-70 { + opacity: 70%; + } .opacity-75 { opacity: 75%; } @@ -2823,15 +2837,18 @@ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .shadow-black\/20 { + --tw-shadow-color: color-mix(in srgb, #000 20%, transparent); + @supports (color: color-mix(in lab, red, red)) { + --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent); + } + } .shadow-gray-200 { --tw-shadow-color: oklch(92.8% 0.006 264.531); @supports (color: color-mix(in lab, red, red)) { --tw-shadow-color: color-mix(in oklab, var(--color-gray-200) var(--tw-shadow-alpha), transparent); } } - .ring-black { - --tw-ring-color: var(--color-black); - } .ring-black\/5 { --tw-ring-color: color-mix(in srgb, #000 5%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -2870,6 +2887,10 @@ --tw-blur: blur(8px); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } + .blur-3xl { + --tw-blur: blur(var(--blur-3xl)); + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } .drop-shadow { --tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.1))) drop-shadow(0 1px 1px var(--tw-drop-shadow-color, rgb(0 0 0 / 0.06))); --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow( 0 1px 1px rgb(0 0 0 / 0.06)); @@ -3520,6 +3541,12 @@ scale: var(--tw-scale-x) var(--tw-scale-y); } } + .active\:shadow-md { + &:active { + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } .disabled\:cursor-not-allowed { &:disabled { cursor: not-allowed; diff --git a/wwwroot/driver/images/logo_upst_white.svg b/wwwroot/driver/images/logo_upst_white.svg new file mode 100644 index 0000000..8dae8e0 --- /dev/null +++ b/wwwroot/driver/images/logo_upst_white.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wwwroot/driver/images/upst_main.svg b/wwwroot/driver/images/upst_main.svg new file mode 100644 index 0000000..4338d95 --- /dev/null +++ b/wwwroot/driver/images/upst_main.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wwwroot/driver/serviceworker.js b/wwwroot/driver/serviceworker.js index fba86a9..704d7ff 100644 --- a/wwwroot/driver/serviceworker.js +++ b/wwwroot/driver/serviceworker.js @@ -31,6 +31,19 @@ self.addEventListener("activate", (event) => { self.clients.claim(); }); +const AUTH_PATHS = [ + "/signin-oidc", + "/signout-callback-oidc", + "/signout-oidc", + "/connect/", + "/Identity/", + "/.well-known/", +]; + +function isAuthPath(url) { + return AUTH_PATHS.some((path) => url.pathname.startsWith(path)); +} + self.addEventListener("fetch", (event) => { const { request } = event; const url = new URL(request.url); @@ -39,12 +52,22 @@ self.addEventListener("fetch", (event) => { return; } + if (url.origin !== self.location.origin) { + return; + } + + if (isAuthPath(url)) { + return; + } + if (request.mode === "navigate") { event.respondWith( fetch(request) .then((response) => { - const responseClone = response.clone(); - caches.open(CACHE_NAME).then((cache) => cache.put(request, responseClone)); + if (url.pathname.startsWith("/upst")) { + const responseClone = response.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(request, responseClone)); + } return response; }) .catch(async () => {