Files
WMS/resources/views/layouts/app/sidebar.blade.php
T

347 lines
24 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
<head>
@include('partials.head')
</head>
<body class="min-h-screen bg-white text-zinc-950 antialiased dark:bg-zinc-950 dark:text-zinc-100">
<div class="wms-app-shell" data-wms-shell>
<div class="wms-mobile-overlay" data-wms-mobile-close></div>
<aside class="wms-sidebar" data-wms-sidebar aria-label="{{ __('Main navigation') }}">
<div class="wms-sidebar-header">
<a href="{{ auth()->user()?->isMpbaPlatformAdmin() && Route::has('platform.dashboard') ? route('platform.dashboard') : route('dashboard') }}" wire:navigate class="wms-brand" aria-label="{{ __('Warehouse Management System') }}">
<span class="wms-brand-mark" data-wms-brand-toggle title="{{ __('Expand sidebar') }}"><span class="wms-brand-mark-inner">W</span></span>
<span class="wms-brand-copy" data-wms-sidebar-label>
<span class="wms-brand-title">{{ __('Warehouse Management System') }}</span>
<span class="wms-brand-subtitle">MPBA</span>
</span>
</a>
<button type="button" class="wms-sidebar-toggle" data-wms-sidebar-toggle aria-label="{{ __('Collapse sidebar') }}" aria-expanded="true">
<span class="wms-toggle-expanded">‹</span>
</button>
<button type="button" class="wms-mobile-close" data-wms-mobile-close aria-label="{{ __('Close navigation') }}">×</button>
</div>
<nav class="wms-sidebar-nav" aria-label="{{ __('Main navigation') }}">
<div class="wms-sidebar-group">
<div class="wms-sidebar-heading" data-wms-sidebar-label>{{ __('Platform') }}</div>
@if(auth()->user()?->isMpbaPlatformAdmin() && Route::has('platform.dashboard'))
<a href="{{ route('platform.dashboard') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('platform.dashboard')) is-active @endif" title="{{ __('Platform') }}">
<i class="fa-solid fa-screwdriver-wrench wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Platform') }}</span>
</a>
@elseif(Route::has('dashboard'))
<a href="{{ route('dashboard') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('dashboard')) is-active @endif" title="{{ __('Dashboard') }}">
<i class="fa-solid fa-gauge-high wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Dashboard') }}</span>
</a>
@endif
</div>
<div class="wms-sidebar-group">
<div class="wms-sidebar-heading" data-wms-sidebar-label>{{ __('Operations') }}</div>
@if(Route::has('analytics.index'))
<a href="{{ route('analytics.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('analytics.*')) is-active @endif" title="{{ __('Analytics') }}">
<i class="fa-solid fa-chart-line wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Analytics') }}</span>
</a>
@endif
@if(Route::has('inventory-management.index'))
<a href="{{ route('inventory-management.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('inventory-management.*')) is-active @endif" title="{{ __('Inventory') }}">
<i class="fa-solid fa-boxes-stacked wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Inventory') }}</span>
</a>
@endif
@if(Route::has('replenishment.index'))
<a href="{{ route('replenishment.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('replenishment.*')) is-active @endif" title="{{ __('Replenishment') }}">
<i class="fa-solid fa-arrows-rotate wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Replenishment') }}</span>
</a>
@endif
@if(Route::has('shipping.index'))
<a href="{{ route('shipping.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('shipping.*')) is-active @endif" title="{{ __('Shipping') }}">
<i class="fa-solid fa-truck-fast wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Shipping') }}</span>
</a>
@endif
@if(Route::has('transportation.index'))
<a href="{{ route('transportation.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('transportation.*')) is-active @endif" title="{{ __('Transportation') }}">
<i class="fa-solid fa-truck-ramp-box wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Transportation') }}</span>
</a>
@endif
@if(Route::has('carrier-management.index'))
<a href="{{ route('carrier-management.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('carrier-management.*')) is-active @endif" title="{{ __('Carriers') }}">
<i class="fa-solid fa-route wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Carriers') }}</span>
</a>
@endif
</div>
<div class="wms-sidebar-group">
<div class="wms-sidebar-heading" data-wms-sidebar-label>{{ __('Integration & Reporting') }}</div>
@if(Route::has('m3-integration.index'))
<a href="{{ route('m3-integration.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('m3-integration.*')) is-active @endif" title="{{ __('M3 Integration') }}">
<i class="fa-solid fa-plug-circle-bolt wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('M3 Integration') }}</span>
</a>
@endif
@if(Route::has('sentinel-integration.index'))
<a href="{{ route('sentinel-integration.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('sentinel-integration.*')) is-active @endif" title="{{ __('Sentinel') }}">
<i class="fa-solid fa-satellite-dish wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Sentinel') }}</span>
</a>
@endif
@if(Route::has('document-archive.index'))
<a href="{{ route('document-archive.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('document-archive.*')) is-active @endif" title="{{ __('Documents') }}">
<i class="fa-solid fa-box-archive wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Documents') }}</span>
</a>
@endif
@if(Route::has('reporting.index'))
<a href="{{ route('reporting.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('reporting.*')) is-active @endif" title="{{ __('Reporting') }}">
<i class="fa-solid fa-file-lines wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Reporting') }}</span>
</a>
@endif
</div>
<div class="wms-sidebar-group">
<div class="wms-sidebar-heading" data-wms-sidebar-label>{{ __('Administration') }}</div>
@if(Route::has('warehouses.index'))
<a href="{{ route('warehouses.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('warehouses.*')) is-active @endif" title="{{ __('Warehouses') }}">
<i class="fa-solid fa-warehouse wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Warehouses') }}</span>
</a>
@endif
@if(Route::has('warehouse-rules.index'))
<a href="{{ route('warehouse-rules.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('warehouse-rules.*')) is-active @endif" title="{{ __('Validation Rules') }}">
<i class="fa-solid fa-shield-halved wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Validation Rules') }}</span>
</a>
@endif
@if(auth()->user()?->isMpbaPlatformAdmin() && Route::has('platform.prices.index'))
<a href="{{ route('platform.prices.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('platform.prices.*')) is-active @endif" title="{{ __('Prices') }}">
<i class="fa-solid fa-tags wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Prices') }}</span>
</a>
@endif
@if(Route::has('configuration.index'))
<a href="{{ route('configuration.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('configuration.*')) is-active @endif" title="{{ __('Configuration') }}">
<i class="fa-solid fa-sliders wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Configuration') }}</span>
</a>
@endif
@if(Route::has('security.index'))
<a href="{{ route('security.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('security.*')) is-active @endif" title="{{ __('Security') }}">
<i class="fa-solid fa-user-shield wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Security') }}</span>
</a>
@endif
@if(Route::has('audit.index'))
<a href="{{ route('audit.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('audit.*')) is-active @endif" title="{{ __('Audit') }}">
<i class="fa-solid fa-clipboard-check wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Audit') }}</span>
</a>
@endif
</div>
@if(auth()->user()?->isMpbaPlatformAdmin())
<div class="wms-sidebar-group">
<div class="wms-sidebar-heading" data-wms-sidebar-label>{{ __('Platform Administration') }}</div>
@if(Route::has('platform.companies.index'))
<a href="{{ route('platform.companies.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('platform.companies.*')) is-active @endif" title="{{ __('Companies') }}">
<i class="fa-solid fa-building wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Companies') }}</span>
</a>
@endif
@if(Route::has('platform.licenses.index'))
<a href="{{ route('platform.licenses.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('platform.licenses.*')) is-active @endif" title="{{ __('Licences') }}">
<i class="fa-solid fa-key wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Licences') }}</span>
</a>
@endif
@if(Route::has('platform.payments.index'))
<a href="{{ route('platform.payments.index') }}" wire:navigate class="wms-sidebar-link @if(request()->routeIs('platform.payments.*')) is-active @endif" title="{{ __('Payments') }}">
<i class="fa-solid fa-credit-card wms-sidebar-icon" aria-hidden="true"></i>
<span data-wms-sidebar-label>{{ __('Payments') }}</span>
</a>
@endif
</div>
@endif
</nav>
<div class="wms-sidebar-footer">
<flux:dropdown position="top" align="start">
<button type="button" class="wms-user-card wms-user-card-button" data-wms-sidebar-label>
<div class="wms-user-avatar">{{ auth()->user()?->initials() ?? 'U' }}</div>
<div class="wms-user-copy">
<div class="wms-user-name">{{ auth()->user()?->name ?? __('User') }}</div>
<div class="wms-user-email">{{ auth()->user()?->email ?? '' }}</div>
</div>
<i class="fa-solid fa-chevron-up wms-user-chevron" aria-hidden="true"></i>
</button>
<flux:menu>
<flux:menu.radio.group>
<div class="p-0 text-sm font-normal">
<div class="flex items-center gap-2 px-1 py-1.5 text-start text-sm">
<flux:avatar :name="auth()->user()?->name ?? 'User'" :initials="auth()->user()?->initials() ?? 'U'" />
<div class="grid flex-1 text-start text-sm leading-tight">
<flux:heading class="truncate">{{ auth()->user()?->name ?? __('User') }}</flux:heading>
<flux:text class="truncate">{{ auth()->user()?->email ?? '' }}</flux:text>
</div>
</div>
</div>
</flux:menu.radio.group>
<flux:menu.separator />
<flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>{{ __('Settings') }}</flux:menu.item>
<flux:menu.separator />
<form method="POST" action="{{ route('logout') }}" class="w-full">
@csrf
<flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle" class="w-full cursor-pointer" data-test="logout-button">{{ __('Log out') }}</flux:menu.item>
</form>
</flux:menu>
</flux:dropdown>
<flux:dropdown position="top" align="start">
<button type="button" class="wms-user-rail-button" title="{{ __('Account') }}">{{ auth()->user()?->initials() ?? 'U' }}</button>
<flux:menu>
<flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>{{ __('Settings') }}</flux:menu.item>
<flux:menu.separator />
<form method="POST" action="{{ route('logout') }}" class="w-full">
@csrf
<flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle" class="w-full cursor-pointer">{{ __('Log out') }}</flux:menu.item>
</form>
</flux:menu>
</flux:dropdown>
</div>
</aside>
<div class="wms-main-panel">
@php
$pageTitle = $title ?? __('Warehouse Management System');
$pageDescription = match (true) {
request()->routeIs('platform.dashboard') => __('Manage tenant companies, licences, payments, warehouses and internal API operations from one resilient control plane.'),
request()->routeIs('platform.companies.*') => __('Manage tenant companies, ownership, users and the warehouse records attached to each organisation.'),
request()->routeIs('platform.licenses.*') => __('Review licence allocation, account status and platform access across MPBA tenants.'),
request()->routeIs('platform.payments.*') => __('Track payment activity, paid totals and tenant billing status from one administration screen.'),
request()->routeIs('warehouses.*') => __('Maintain warehouse locations, operational details and company ownership records.'),
request()->routeIs('inventory-management.*') => __('Monitor inventory activity, stock positions and warehouse item control.'),
request()->routeIs('analytics.*') => __('Review operational insight, warehouse trends and management reporting.'),
default => __('Manage tenant companies, licences, payments, warehouses and internal API operations from one resilient control plane.'),
};
@endphp
<main class="wms-content">
<section class="wms-page-hero" aria-labelledby="wms-page-title">
<div class="wms-page-hero-copy">
<div class="wms-page-hero-kicker">{{ __('MPBA WMS') }}</div>
<h1 id="wms-page-title" class="wms-page-hero-title">{{ $pageTitle }}</h1>
<p class="wms-page-hero-description">{{ $pageDescription }}</p>
</div>
<div class="wms-page-hero-actions">
<button type="button" class="wms-hero-mobile-menu" data-wms-mobile-open aria-label="{{ __('Open navigation') }}">
<i class="fa-solid fa-bars" aria-hidden="true"></i>
</button>
<div class="wms-page-hero-stat">
<span>{{ __('System status') }}</span>
<strong><i class="fa-solid fa-heart-pulse" aria-hidden="true"></i> {{ __('OK') }}</strong>
</div>
<div class="wms-page-hero-stat">
<span>{{ __('Paid £') }}</span>
<strong>0.00</strong>
</div>
</div>
</section>
{{ $slot }}
</main>
</div>
</div>
@persist('toast')
<flux:toast.group><flux:toast /></flux:toast.group>
@endpersist
@fluxScripts
<script>
(function () {
const STORAGE_KEY = 'wms-sidebar-state';
function applySidebarState() {
const root = document.documentElement;
const saved = localStorage.getItem(STORAGE_KEY) || 'expanded';
root.dataset.wmsSidebar = saved === 'collapsed' ? 'collapsed' : 'expanded';
document.querySelectorAll('[data-wms-sidebar-toggle]').forEach((button) => {
const expanded = root.dataset.wmsSidebar !== 'collapsed';
button.setAttribute('aria-expanded', expanded ? 'true' : 'false');
button.setAttribute('aria-label', expanded ? '{{ __('Collapse sidebar') }}' : '{{ __('Expand sidebar') }}');
});
}
function closeMobileSidebar() { document.documentElement.dataset.wmsMobileSidebar = 'closed'; }
function openMobileSidebar() { document.documentElement.dataset.wmsMobileSidebar = 'open'; }
function bindSidebarControls() {
applySidebarState();
document.querySelectorAll('[data-wms-sidebar-toggle]').forEach((button) => {
if (button.dataset.wmsBound === '1') return;
button.dataset.wmsBound = '1';
button.addEventListener('click', function () {
const root = document.documentElement;
const next = root.dataset.wmsSidebar === 'collapsed' ? 'expanded' : 'collapsed';
root.dataset.wmsSidebar = next;
localStorage.setItem(STORAGE_KEY, next);
applySidebarState();
});
});
document.querySelectorAll('[data-wms-brand-toggle]').forEach((button) => {
if (button.dataset.wmsBound === '1') return;
button.dataset.wmsBound = '1';
button.addEventListener('click', function (event) {
const root = document.documentElement;
if (root.dataset.wmsSidebar !== 'collapsed') return;
event.preventDefault();
event.stopPropagation();
root.dataset.wmsSidebar = 'expanded';
localStorage.setItem(STORAGE_KEY, 'expanded');
applySidebarState();
});
});
document.querySelectorAll('[data-wms-mobile-open]').forEach((button) => {
if (button.dataset.wmsBound === '1') return;
button.dataset.wmsBound = '1';
button.addEventListener('click', openMobileSidebar);
});
document.querySelectorAll('[data-wms-mobile-close]').forEach((button) => {
if (button.dataset.wmsBound === '1') return;
button.dataset.wmsBound = '1';
button.addEventListener('click', closeMobileSidebar);
});
document.querySelectorAll('.wms-sidebar-link[wire\\:navigate]').forEach((link) => {
if (link.dataset.wmsMobileBound === '1') return;
link.dataset.wmsMobileBound = '1';
link.addEventListener('click', closeMobileSidebar);
});
}
document.addEventListener('DOMContentLoaded', bindSidebarControls);
document.addEventListener('livewire:navigated', bindSidebarControls);
})();
</script>
</body>
</html>