598 lines
23 KiB
Plaintext
598 lines
23 KiB
Plaintext
[1mdiff --git a/Dockerfile b/Dockerfile[m
|
||
[1mindex af83013..b506a23 100644[m
|
||
[1m--- a/Dockerfile[m
|
||
[1m+++ b/Dockerfile[m
|
||
[36m@@ -14,6 +14,7 @@[m [mRUN apt-get update && apt-get install -y \[m
|
||
[m
|
||
# PHP Extensions[m
|
||
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd[m
|
||
[32m+[m[32mRUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache[m[41m
|
||
[m
|
||
[m
|
||
# Install Composer[m
|
||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer[m
|
||
[1mdiff --git a/dashboard/bootstrap/app.php b/dashboard/bootstrap/app.php[m
|
||
[1mindex c3928c5..9f5e292 100644[m
|
||
[1m--- a/dashboard/bootstrap/app.php[m
|
||
[1m+++ b/dashboard/bootstrap/app.php[m
|
||
[36m@@ -6,13 +6,15 @@[m
|
||
[m
|
||
return Application::configure(basePath: dirname(__DIR__))[m
|
||
->withRouting([m
|
||
[31m- web: __DIR__.'/../routes/web.php',[m
|
||
[31m- api: __DIR__.'/../routes/api.php',[m
|
||
[31m- commands: __DIR__.'/../routes/console.php',[m
|
||
[32m+[m[32m web: __DIR__ . '/../routes/web.php',[m
|
||
[32m+[m[32m api: __DIR__ . '/../routes/api.php',[m
|
||
[32m+[m[32m commands: __DIR__ . '/../routes/console.php',[m
|
||
health: '/up',[m
|
||
)[m
|
||
->withMiddleware(function (Middleware $middleware): void {[m
|
||
[31m- //[m
|
||
[32m+[m[32m $middleware->alias([[m
|
||
[32m+[m[32m 'role' => \App\Http\Middleware\RoleMiddleware::class,[m
|
||
[32m+[m[32m ]);[m
|
||
})[m
|
||
->withExceptions(function (Exceptions $exceptions): void {[m
|
||
//[m
|
||
[1mdiff --git a/dashboard/composer.json b/dashboard/composer.json[m
|
||
[1mindex 52a3a8a..aad37ad 100644[m
|
||
[1m--- a/dashboard/composer.json[m
|
||
[1m+++ b/dashboard/composer.json[m
|
||
[36m@@ -12,6 +12,7 @@[m
|
||
},[m
|
||
"require-dev": {[m
|
||
"fakerphp/faker": "^1.23",[m
|
||
[32m+[m[32m "laravel/breeze": "^2.4",[m
|
||
"laravel/pail": "^1.2.2",[m
|
||
"laravel/pint": "^1.24",[m
|
||
"laravel/sail": "^1.41",[m
|
||
[1mdiff --git a/dashboard/composer.lock b/dashboard/composer.lock[m
|
||
[1mindex 7ba63ad..23b4e2e 100644[m
|
||
[1m--- a/dashboard/composer.lock[m
|
||
[1m+++ b/dashboard/composer.lock[m
|
||
[36m@@ -4,7 +4,7 @@[m
|
||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",[m
|
||
"This file is @generated automatically"[m
|
||
],[m
|
||
[31m- "content-hash": "c514d8f7b9fc5970bdd94287905ef584",[m
|
||
[32m+[m[32m "content-hash": "18c3a10710e6e4641721ddfbd649de8d",[m
|
||
"packages": [[m
|
||
{[m
|
||
"name": "brick/math",[m
|
||
[36m@@ -6195,6 +6195,67 @@[m
|
||
},[m
|
||
"time": "2025-04-30T06:54:44+00:00"[m
|
||
},[m
|
||
[32m+[m[32m {[m
|
||
[32m+[m[32m "name": "laravel/breeze",[m
|
||
[32m+[m[32m "version": "v2.4.1",[m
|
||
[32m+[m[32m "source": {[m
|
||
[32m+[m[32m "type": "git",[m
|
||
[32m+[m[32m "url": "https://github.com/laravel/breeze.git",[m
|
||
[32m+[m[32m "reference": "28cefeaf6af20177ddf5cc7b93e87e4ad79d533f"[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "dist": {[m
|
||
[32m+[m[32m "type": "zip",[m
|
||
[32m+[m[32m "url": "https://api.github.com/repos/laravel/breeze/zipball/28cefeaf6af20177ddf5cc7b93e87e4ad79d533f",[m
|
||
[32m+[m[32m "reference": "28cefeaf6af20177ddf5cc7b93e87e4ad79d533f",[m
|
||
[32m+[m[32m "shasum": ""[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "require": {[m
|
||
[32m+[m[32m "illuminate/console": "^11.0|^12.0|^13.0",[m
|
||
[32m+[m[32m "illuminate/filesystem": "^11.0|^12.0|^13.0",[m
|
||
[32m+[m[32m "illuminate/support": "^11.0|^12.0|^13.0",[m
|
||
[32m+[m[32m "illuminate/validation": "^11.0|^12.0|^13.0",[m
|
||
[32m+[m[32m "php": "^8.2.0",[m
|
||
[32m+[m[32m "symfony/console": "^7.0|^8.0"[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "require-dev": {[m
|
||
[32m+[m[32m "laravel/framework": "^11.0|^12.0|^13.0",[m
|
||
[32m+[m[32m "orchestra/testbench-core": "^9.0|^10.0|^11.0",[m
|
||
[32m+[m[32m "phpstan/phpstan": "^2.0"[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "type": "library",[m
|
||
[32m+[m[32m "extra": {[m
|
||
[32m+[m[32m "laravel": {[m
|
||
[32m+[m[32m "providers": [[m
|
||
[32m+[m[32m "Laravel\\Breeze\\BreezeServiceProvider"[m
|
||
[32m+[m[32m ][m
|
||
[32m+[m[32m }[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "autoload": {[m
|
||
[32m+[m[32m "psr-4": {[m
|
||
[32m+[m[32m "Laravel\\Breeze\\": "src/"[m
|
||
[32m+[m[32m }[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "notification-url": "https://packagist.org/downloads/",[m
|
||
[32m+[m[32m "license": [[m
|
||
[32m+[m[32m "MIT"[m
|
||
[32m+[m[32m ],[m
|
||
[32m+[m[32m "authors": [[m
|
||
[32m+[m[32m {[m
|
||
[32m+[m[32m "name": "Taylor Otwell",[m
|
||
[32m+[m[32m "email": "taylor@laravel.com"[m
|
||
[32m+[m[32m }[m
|
||
[32m+[m[32m ],[m
|
||
[32m+[m[32m "description": "Minimal Laravel authentication scaffolding with Blade and Tailwind.",[m
|
||
[32m+[m[32m "keywords": [[m
|
||
[32m+[m[32m "auth",[m
|
||
[32m+[m[32m "laravel"[m
|
||
[32m+[m[32m ],[m
|
||
[32m+[m[32m "support": {[m
|
||
[32m+[m[32m "issues": "https://github.com/laravel/breeze/issues",[m
|
||
[32m+[m[32m "source": "https://github.com/laravel/breeze"[m
|
||
[32m+[m[32m },[m
|
||
[32m+[m[32m "time": "2026-03-10T19:59:01+00:00"[m
|
||
[32m+[m[32m },[m
|
||
{[m
|
||
"name": "laravel/pail",[m
|
||
"version": "v1.2.6",[m
|
||
[1mdiff --git a/dashboard/package.json b/dashboard/package.json[m
|
||
[1mindex 7686b29..2ea7e1d 100644[m
|
||
[1m--- a/dashboard/package.json[m
|
||
[1m+++ b/dashboard/package.json[m
|
||
[36m@@ -7,11 +7,15 @@[m
|
||
"dev": "vite"[m
|
||
},[m
|
||
"devDependencies": {[m
|
||
[32m+[m[32m "@tailwindcss/forms": "^0.5.2",[m
|
||
"@tailwindcss/vite": "^4.0.0",[m
|
||
[32m+[m[32m "alpinejs": "^3.4.2",[m
|
||
[32m+[m[32m "autoprefixer": "^10.4.2",[m
|
||
"axios": "^1.11.0",[m
|
||
"concurrently": "^9.0.1",[m
|
||
"laravel-vite-plugin": "^2.0.0",[m
|
||
[31m- "tailwindcss": "^4.0.0",[m
|
||
[32m+[m[32m "postcss": "^8.4.31",[m
|
||
[32m+[m[32m "tailwindcss": "^3.1.0",[m
|
||
"vite": "^7.0.7"[m
|
||
}[m
|
||
}[m
|
||
[1mdiff --git a/dashboard/resources/css/app.css b/dashboard/resources/css/app.css[m
|
||
[1mindex 3e6abea..b5c61c9 100644[m
|
||
[1m--- a/dashboard/resources/css/app.css[m
|
||
[1m+++ b/dashboard/resources/css/app.css[m
|
||
[36m@@ -1,11 +1,3 @@[m
|
||
[31m-@import 'tailwindcss';[m
|
||
[31m-[m
|
||
[31m-@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';[m
|
||
[31m-@source '../../storage/framework/views/*.php';[m
|
||
[31m-@source '../**/*.blade.php';[m
|
||
[31m-@source '../**/*.js';[m
|
||
[31m-[m
|
||
[31m-@theme {[m
|
||
[31m- --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',[m
|
||
[31m- 'Segoe UI Symbol', 'Noto Color Emoji';[m
|
||
[31m-}[m
|
||
[32m+[m[32m@tailwind base;[m
|
||
[32m+[m[32m@tailwind components;[m
|
||
[32m+[m[32m@tailwind utilities;[m
|
||
[1mdiff --git a/dashboard/resources/js/app.js b/dashboard/resources/js/app.js[m
|
||
[1mindex e59d6a0..a8093be 100644[m
|
||
[1m--- a/dashboard/resources/js/app.js[m
|
||
[1m+++ b/dashboard/resources/js/app.js[m
|
||
[36m@@ -1 +1,7 @@[m
|
||
import './bootstrap';[m
|
||
[32m+[m
|
||
[32m+[m[32mimport Alpine from 'alpinejs';[m
|
||
[32m+[m
|
||
[32m+[m[32mwindow.Alpine = Alpine;[m
|
||
[32m+[m
|
||
[32m+[m[32mAlpine.start();[m
|
||
[1mdiff --git a/dashboard/resources/views/layouts/app.blade.php b/dashboard/resources/views/layouts/app.blade.php[m
|
||
[1mindex e086ead..0a471a4 100644[m
|
||
[1m--- a/dashboard/resources/views/layouts/app.blade.php[m
|
||
[1m+++ b/dashboard/resources/views/layouts/app.blade.php[m
|
||
[36m@@ -1,305 +1,36 @@[m
|
||
<!DOCTYPE html>[m
|
||
[31m-<html>[m
|
||
[31m-[m
|
||
[31m-<head>[m
|
||
[31m- <title>NRML Dashboard</title>[m
|
||
[31m- <meta name="viewport" content="width=device-width, initial-scale=1">[m
|
||
[31m-[m
|
||
[31m- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">[m
|
||
[31m- <script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1"></script>[m
|
||
[31m- <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0"></script>[m
|
||
[31m- <script src="https://cdn.jsdelivr.net/npm/html-to-image@1.11.11/dist/html-to-image.min.js"></script>[m
|
||
[31m- <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>[m
|
||
[31m- <script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>[m
|
||
[31m-[m
|
||
[31m- <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />[m
|
||
[31m- <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>[m
|
||
[31m-[m
|
||
[31m- <script src="/js/dashboard/filter.js"></script>[m
|
||
[31m- <script src="/js/dashboard/charts.js"></script>[m
|
||
[31m- <script src="/js/dashboard/export.js"></script>[m
|
||
[31m-[m
|
||
[31m- <style>[m
|
||
[31m- body {[m
|
||
[31m- margin: 0;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .top-navbar {[m
|
||
[31m- height: 60px;[m
|
||
[31m- background: #0B8F3C;[m
|
||
[31m- color: white;[m
|
||
[31m- display: flex;[m
|
||
[31m- align-items: center;[m
|
||
[31m- padding: 0 25px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .brand-title {[m
|
||
[31m- font-weight: 600;[m
|
||
[31m- font-size: 18px;[m
|
||
[31m- color: #f8f9fa;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .nav-bar {[m
|
||
[31m- display: flex;[m
|
||
[31m- background: white;[m
|
||
[31m- border-bottom: 1px solid #dcdcdc;[m
|
||
[31m- padding: 0 20px;[m
|
||
[31m- position: sticky;[m
|
||
[31m- top: 0;[m
|
||
[31m- z-index: 1000;[m
|
||
[31m- }[m
|
||
[31m- .btn{[m
|
||
[31m- border-radius: 0 !important;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .btn-theme-outline {[m
|
||
[31m- background-color: #fff;[m
|
||
[31m- color: #0B8F3C;[m
|
||
[31m- border: 1px solid #0B8F3C;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .btn-theme-outline:hover {[m
|
||
[31m- background-color: #cce0d4;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .nav-item {[m
|
||
[31m- padding: 12px 18px;[m
|
||
[31m- text-decoration: none;[m
|
||
[31m- color: #262626;[m
|
||
[31m- font-weight: 500;[m
|
||
[31m- border-bottom: 3px solid transparent;[m
|
||
[31m- font-size: 14px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .nav-item:hover {[m
|
||
[31m- background: #cce0d4;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .active-tab {[m
|
||
[31m- color: #0B8F3C;[m
|
||
[31m- border-bottom: 3px solid #0B8F3C;[m
|
||
[31m- background: #e5efe8;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .content-area {[m
|
||
[31m- padding: 20px;[m
|
||
[31m- background: #f8f9fa;[m
|
||
[31m- min-height: calc(100vh - 110px);[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .card {[m
|
||
[31m- border-radius: 0px !important;[m
|
||
[31m- border: 1px solid #E5E7EB;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .form-select {[m
|
||
[31m- border-radius: 0px !important;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .shadow-sm {[m
|
||
[31m- box-shadow: none !important;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .card h3 {[m
|
||
[31m- color: #0B8F3C;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m-[m
|
||
[31m- .export-control {[m
|
||
[31m- position: relative;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- #exportItems {[m
|
||
[31m- display: flex;[m
|
||
[31m- gap: 8px;[m
|
||
[31m- opacity: 0;[m
|
||
[31m- transform: translateX(-10px);[m
|
||
[31m- pointer-events: none;[m
|
||
[31m- width: 0;[m
|
||
[31m- overflow: hidden;[m
|
||
[31m- transition: all 0.2s ease;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- #exportItems.show {[m
|
||
[31m- opacity: 1;[m
|
||
[31m- transform: translateX(0);[m
|
||
[31m- pointer-events: auto;[m
|
||
[31m- width: auto;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .export-modal {[m
|
||
[31m- display: none;[m
|
||
[31m- position: fixed;[m
|
||
[31m- inset: 0;[m
|
||
[31m- background: rgba(0, 0, 0, 0.4);[m
|
||
[31m- z-index: 10000;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .export-content {[m
|
||
[31m- background: white;[m
|
||
[31m- padding: 20px;[m
|
||
[31m- width: 400px;[m
|
||
[31m- margin: 10% auto;[m
|
||
[31m- border-radius: 10px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- /* SLIDE FEATURE (from master) */[m
|
||
[31m- .slide-wrapper {[m
|
||
[31m- position: relative;[m
|
||
[31m- overflow: hidden;[m
|
||
[31m- height: 100%;[m
|
||
[31m- min-height: 400px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .slide {[m
|
||
[31m- position: absolute;[m
|
||
[31m- width: 100%;[m
|
||
[31m- top: 0;[m
|
||
[31m- left: 100%;[m
|
||
[31m- opacity: 0;[m
|
||
[31m- transition: all 0.5s ease-in-out;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .slide.active {[m
|
||
[31m- left: 0;[m
|
||
[31m- opacity: 1;[m
|
||
[31m- z-index: 2;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .slide.prev {[m
|
||
[31m- left: -100%;[m
|
||
[31m- opacity: 0;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .slide-btn {[m
|
||
[31m- position: absolute;[m
|
||
[31m- top: 10%;[m
|
||
[31m- transform: translateY(-50%);[m
|
||
[31m- background: rgba(0, 128, 0, 0.43);[m
|
||
[31m- color: white;[m
|
||
[31m- border: none;[m
|
||
[31m- padding: 8px 15px;[m
|
||
[31m- cursor: pointer;[m
|
||
[31m- z-index: 10;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .prev-btn {[m
|
||
[31m- right: 75px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .next-btn {[m
|
||
[31m- right: 25px;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .slide-btn:hover {[m
|
||
[31m- background: rgba(7, 120, 24, 0.8);[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- @media print {[m
|
||
[31m- #floatingExport {[m
|
||
[31m- display: none !important;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .nav-bar,[m
|
||
[31m- .top-navbar {[m
|
||
[31m- display: none !important;[m
|
||
[31m- }[m
|
||
[31m-[m
|
||
[31m- .card {[m
|
||
[31m- page-break-inside: avoid;[m
|
||
[31m- }[m
|
||
[31m- }[m
|
||
[31m- </style>[m
|
||
[31m-</head>[m
|
||
[31m-[m
|
||
[31m-<body>[m
|
||
[31m-[m
|
||
[31m- <div class="top-navbar">[m
|
||
[31m- <div class="brand-title">[m
|
||
[31m- National Reference Medical Laboratory Surveillance Dashboard[m
|
||
[31m- </div>[m
|
||
[31m- <div class="ms-auto small">[m
|
||
[31m- Last update: 12:05 | 2026-03-15[m
|
||
[31m- </div>[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- <div class="nav-bar">[m
|
||
[31m-[m
|
||
[31m- <a href="/dashboard" class="nav-item {{ request()->is('dashboard') ? 'active-tab' : '' }}">[m
|
||
[31m- Overview[m
|
||
[31m- </a>[m
|
||
[31m-[m
|
||
[31m- @foreach($programs as $program)[m
|
||
[31m- @if($program->code === 'SEQ')[m
|
||
[31m- <a href="/dashboard/seq" class="nav-item {{ request()->is('dashboard/seq') ? 'active-tab' : '' }}">[m
|
||
[31m- SEQ[m
|
||
[31m- </a>[m
|
||
[31m- @else[m
|
||
[31m- <a href="/dashboard/{{ strtolower($program->code) }}"[m
|
||
[31m- class="nav-item {{ request()->is('dashboard/' . strtolower($program->code)) ? 'active-tab' : '' }}">[m
|
||
[31m- {{ $program->code }}[m
|
||
[31m- </a>[m
|
||
[31m- @endif[m
|
||
[31m- @endforeach[m
|
||
[31m-[m
|
||
[31m- <div class="ms-auto d-flex align-items-center gap-2 pe-3">[m
|
||
[31m-[m
|
||
[31m- <button onclick="reloadDataSource()" class="btn btn-sm btn-theme-outline">[m
|
||
[31m- Refresh Data[m
|
||
[31m- </button>[m
|
||
[31m-[m
|
||
[31m- <div id="exportControl" class="d-flex align-items-center gap-2">[m
|
||
[31m-[m
|
||
[31m- <button id="exportToggle" class="btn btn-sm btn-theme-outline">[m
|
||
[31m- Export ▸[m
|
||
[31m- </button>[m
|
||
[31m-[m
|
||
[31m- <div id="exportItems" class="align-items-center gap-2">[m
|
||
[31m- <button class="btn btn-sm btn-light" onclick="openChartSelector()">Charts</button>[m
|
||
[31m- <button class="btn btn-sm btn-light" onclick="exportFullDashboard()">Screen</button>[m
|
||
[31m- <button class="btn btn-sm btn-light" onclick="window.print()">Print</button>[m
|
||
[31m- <button class="btn btn-sm btn-outline-secondary" id="exportClose">✕</button>[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- <div id="chartModal" class="export-modal">[m
|
||
[31m- <div class="export-content">[m
|
||
[31m- <h5>Select Charts</h5>[m
|
||
[31m- <div id="chartList"></div>[m
|
||
[31m-[m
|
||
[31m- <div class="mt-3 d-flex justify-content-end gap-2">[m
|
||
[31m- <button onclick="closeChartSelector()">Cancel</button>[m
|
||
[31m- <button onclick="exportSelectedCharts()">Download PDF</button>[m
|
||
[31m- </div>[m
|
||
[32m+[m[32m<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">[m
|
||
[32m+[m[32m <head>[m
|
||
[32m+[m[32m <meta charset="utf-8">[m
|
||
[32m+[m[32m <meta name="viewport" content="width=device-width, initial-scale=1">[m
|
||
[32m+[m[32m <meta name="csrf-token" content="{{ csrf_token() }}">[m
|
||
[32m+[m
|
||
[32m+[m[32m <title>{{ config('app.name', 'Laravel') }}</title>[m
|
||
[32m+[m
|
||
[32m+[m[32m <!-- Fonts -->[m
|
||
[32m+[m[32m <link rel="preconnect" href="https://fonts.bunny.net">[m
|
||
[32m+[m[32m <link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />[m
|
||
[32m+[m
|
||
[32m+[m[32m <!-- Scripts -->[m
|
||
[32m+[m[32m @vite(['resources/css/app.css', 'resources/js/app.js'])[m
|
||
[32m+[m[32m </head>[m
|
||
[32m+[m[32m <body class="font-sans antialiased">[m
|
||
[32m+[m[32m <div class="min-h-screen bg-gray-100 dark:bg-gray-900">[m
|
||
[32m+[m[32m @include('layouts.navigation')[m
|
||
[32m+[m
|
||
[32m+[m[32m <!-- Page Heading -->[m
|
||
[32m+[m[32m @isset($header)[m
|
||
[32m+[m[32m <header class="bg-white dark:bg-gray-800 shadow">[m
|
||
[32m+[m[32m <div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">[m
|
||
[32m+[m[32m {{ $header }}[m
|
||
</div>[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- </div>[m
|
||
[32m+[m[32m </header>[m
|
||
[32m+[m[32m @endisset[m
|
||
[m
|
||
[31m- <div class="main-wrapper">[m
|
||
[31m- <div class="content-area">[m
|
||
[31m- @yield('content')[m
|
||
[32m+[m[32m <!-- Page Content -->[m
|
||
[32m+[m[32m <main>[m
|
||
[32m+[m[32m {{ $slot }}[m
|
||
[32m+[m[32m </main>[m
|
||
</div>[m
|
||
[31m- </div>[m
|
||
[31m-[m
|
||
[31m- @yield('scripts')[m
|
||
[31m-[m
|
||
[31m- <script>[m
|
||
[31m- window.addEventListener("click", (e) => {[m
|
||
[31m- const modal = document.getElementById("chartModal");[m
|
||
[31m- if (e.target === modal) modal.style.display = "none";[m
|
||
[31m- });[m
|
||
[31m-[m
|
||
[31m- function reloadDataSource() {[m
|
||
[31m- fetch(`/api/dashboard/reload`)[m
|
||
[31m- .then(res => res.json())[m
|
||
[31m- .then(() => location.reload());[m
|
||
[31m- }[m
|
||
[31m- </script>[m
|
||
[31m-[m
|
||
[31m-</body>[m
|
||
[31m-[m
|
||
[32m+[m[32m </body>[m
|
||
</html>[m
|
||
[1mdiff --git a/dashboard/routes/web.php b/dashboard/routes/web.php[m
|
||
[1mindex 4bcbea0..69ac7ac 100644[m
|
||
[1m--- a/dashboard/routes/web.php[m
|
||
[1m+++ b/dashboard/routes/web.php[m
|
||
[36m@@ -1,17 +1,40 @@[m
|
||
<?php[m
|
||
[m
|
||
[31m-[m
|
||
[31m-use Illuminate\Support\Facades\Route;[m
|
||
[32m+[m[32muse App\Http\Controllers\ProfileController;[m
|
||
use App\Http\Controllers\DashboardController;[m
|
||
[32m+[m[32muse Illuminate\Support\Facades\Route;[m
|
||
[m
|
||
Route::get('/', function () {[m
|
||
[31m- return view('welcome');[m
|
||
[32m+[m
|
||
[32m+[m[32m return auth()->check()[m
|
||
[32m+[m[32m ? redirect()->route('dashboard')[m
|
||
[32m+[m[32m : redirect()->route('login');[m
|
||
[32m+[m
|
||
});[m
|
||
[m
|
||
[32m+[m[32mRoute::get('/dashboard', function () {[m
|
||
[32m+[m[32m return view('dashboard');[m
|
||
[32m+[m[32m})->middleware(['auth', 'verified'])->name('dashboard');[m
|
||
[32m+[m
|
||
[32m+[m[32mRoute::middleware('auth')->group(function () {[m
|
||
[32m+[m[32m Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');[m
|
||
[32m+[m[32m Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');[m
|
||
[32m+[m[32m Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');[m
|
||
[32m+[m[32m Route::get('/dashboard', [DashboardController::class, 'overview'])[m
|
||
[32m+[m[32m ->name('dashboard');[m
|
||
[32m+[m[32m Route::get('/dashboard/{code}', [DashboardController::class, 'detail'])[m
|
||
[32m+[m[32m ->name('dashboard.detail');[m
|
||
[32m+[m[32m});[m
|
||
[32m+[m[32mRoute::middleware(['auth', 'role:admin'])->group(function () {[m
|
||
[32m+[m
|
||
[32m+[m[32m Route::get('/admin/users', function () {[m
|
||
[32m+[m[32m return view('admin.users');[m
|
||
[32m+[m[32m });[m
|
||
[32m+[m
|
||
[32m+[m[32m Route::get('/admin/settings', function () {[m
|
||
[32m+[m[32m return view('admin.settings');[m
|
||
[32m+[m[32m });[m
|
||
[m
|
||
[31m-Route::get('/dashboard/seq', function () {[m
|
||
[31m- return view('dashboard.sequencing');[m
|
||
});[m
|
||
[31m-Route::get('/dashboard', [DashboardController::class, 'overview']);[m
|
||
[31m-Route::get('/dashboard/{code}', [DashboardController::class, 'detail']);[m
|
||
[m
|
||
[32m+[m[32mrequire __DIR__ . '/auth.php';[m
|
||
[1mdiff --git a/dashboard/vite.config.js b/dashboard/vite.config.js[m
|
||
[1mindex f35b4e7..421b569 100644[m
|
||
[1m--- a/dashboard/vite.config.js[m
|
||
[1m+++ b/dashboard/vite.config.js[m
|
||
[36m@@ -1,6 +1,5 @@[m
|
||
import { defineConfig } from 'vite';[m
|
||
import laravel from 'laravel-vite-plugin';[m
|
||
[31m-import tailwindcss from '@tailwindcss/vite';[m
|
||
[m
|
||
export default defineConfig({[m
|
||
plugins: [[m
|
||
[36m@@ -8,11 +7,5 @@[m [mexport default defineConfig({[m
|
||
input: ['resources/css/app.css', 'resources/js/app.js'],[m
|
||
refresh: true,[m
|
||
}),[m
|
||
[31m- tailwindcss(),[m
|
||
],[m
|
||
[31m- server: {[m
|
||
[31m- watch: {[m
|
||
[31m- ignored: ['**/storage/framework/views/**'],[m
|
||
[31m- },[m
|
||
[31m- },[m
|
||
});[m
|