Merge pull request 'fix: make seller table pages responsive' (#198) from fix/responsive-tables into develop

Reviewed-on: https://code.cannabrands.app/Cannabrands/hub/pulls/198
This commit is contained in:
kelly
2025-12-11 17:33:41 +00:00
10 changed files with 100 additions and 123 deletions

View File

@@ -126,13 +126,6 @@
.collapse {
input {
@apply min-h-8 p-0;
/* Only cover the collapse-title, not the content */
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2rem; /* Match min-h-8 */
z-index: 1;
}
.collapse-title {

View File

@@ -53,7 +53,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuDashboard" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--bar-chart-3] size-4"></span>
@@ -90,7 +89,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuCommerce" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--shopping-cart] size-4"></span>
@@ -136,7 +134,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuBrands" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--bookmark] size-4"></span>
@@ -167,7 +164,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuInventory" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--package-2] size-4"></span>
@@ -238,7 +234,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuProcessing" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--beaker] size-4"></span>
@@ -259,7 +254,6 @@
aria-label="Solventless submenu"
type="checkbox"
class="peer"
name="sidebar-menu-child-item"
x-model="menuSolventless" />
<div class="collapse-title px-2.5 py-1.5">
<span class="grow text-sm font-semibold">Solventless</span>
@@ -307,7 +301,6 @@
aria-label="BHO submenu"
type="checkbox"
class="peer"
name="sidebar-menu-child-item"
x-model="menuBHO" />
<div class="collapse-title px-2.5 py-1.5">
<span class="grow text-sm font-semibold">BHO</span>
@@ -355,7 +348,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuManufacturing" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--factory] size-4"></span>
@@ -401,7 +393,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuManagement" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--book-open] size-4"></span>
@@ -435,7 +426,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuGrowth" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--megaphone] size-4"></span>
@@ -504,7 +494,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuSales" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--briefcase] size-4"></span>
@@ -565,7 +554,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuInbox" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--inbox] size-4"></span>
@@ -646,7 +634,6 @@
aria-label="Sidemenu item trigger"
type="checkbox"
class="peer"
name="sidebar-menu-parent-item"
x-model="menuReports" />
<div class="collapse-title px-2.5 py-1.5">
<span class="icon-[lucide--file-bar-chart] size-4"></span>

View File

@@ -3,19 +3,20 @@
@section('content')
<div class="max-w-7xl mx-auto px-4 py-4 space-y-4">
{{-- Page Header --}}
<header class="flex items-center justify-between">
<header class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
<div>
<h1 class="text-2xl font-semibold">All Customers</h1>
<p class="text-sm text-base-content/60">Manage your customer relationships and account activity.</p>
</div>
<div class="flex items-center gap-2">
<div class="flex items-center gap-2 self-start sm:self-auto">
<a href="{{ route('seller.business.crm.accounts.create', $business->slug) }}" class="btn btn-primary btn-sm gap-1">
<span class="icon-[heroicons--plus] size-4"></span>
Add Customer
<span class="hidden sm:inline">Add Customer</span>
<span class="sm:hidden">Add</span>
</a>
<a href="{{ route('seller.business.crm.leads.index', $business->slug) }}" class="btn btn-outline btn-sm gap-1">
<span class="icon-[heroicons--user-plus] size-4"></span>
Leads
<span class="hidden sm:inline">Leads</span>
</a>
{{-- Quick Actions Dropdown --}}
<div class="dropdown dropdown-end">
@@ -93,9 +94,9 @@
<thead class="bg-base-200/30">
<tr>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Account</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Primary Contact</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3">Orders</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3">Open Opps</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3 hidden md:table-cell">Primary Contact</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3 hidden lg:table-cell">Orders</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3 hidden lg:table-cell">Open Opps</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Status</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3"></th>
</tr>
@@ -123,7 +124,7 @@
</div>
</div>
</td>
<td class="py-2 align-middle">
<td class="py-2 align-middle hidden md:table-cell">
@php $primaryContact = $account->contacts->where('is_primary', true)->first() ?? $account->contacts->first(); @endphp
@if($primaryContact)
<p class="text-sm font-medium">{{ $primaryContact->getFullName() }}</p>
@@ -134,17 +135,17 @@
<p class="text-sm text-base-content/40">No contact</p>
@endif
</td>
<td class="py-2 align-middle text-right">
<td class="py-2 align-middle text-right hidden lg:table-cell">
<span class="text-sm text-base-content/70">{{ $account->orders_count ?? 0 }}</span>
</td>
<td class="py-2 align-middle text-right">
<td class="py-2 align-middle text-right hidden lg:table-cell">
@if(($account->opportunities_as_buyer_count ?? 0) > 0)
<span class="text-sm font-medium">{{ $account->opportunities_as_buyer_count }}</span>
@else
<span class="text-sm text-base-content/40">0</span>
@endif
</td>
<td class="py-2 align-middle">
<td class="py-2 align-middle hidden sm:table-cell">
@if($account->is_active)
<span class="badge badge-success badge-sm">Active</span>
@else

View File

@@ -3,12 +3,12 @@
@section('content')
<div class="max-w-7xl mx-auto px-4 py-4 space-y-4">
{{-- Page Header --}}
<header class="mb-4 flex items-center justify-between gap-3">
<header class="mb-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
<div>
<h1 class="text-2xl font-semibold mb-0.5">Automations</h1>
<p class="text-sm text-base-content/70">Build workflows that trigger campaigns, tasks, and updates based on buyer activity.</p>
</div>
<div class="flex items-center gap-2">
<div class="flex items-center gap-2 self-start sm:self-auto">
<a href="{{ route('seller.business.crm.automations.create', $business) }}" class="btn btn-primary btn-sm gap-1">
<span class="icon-[heroicons--plus] size-4"></span>
New Automation
@@ -40,10 +40,10 @@
<thead>
<tr>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap">Name</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap">Trigger</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap text-center">Runs</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap hidden md:table-cell">Trigger</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap text-center hidden lg:table-cell">Runs</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap">Status</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap">Last Run</th>
<th class="text-xs font-semibold text-base-content/70 whitespace-nowrap hidden md:table-cell">Last Run</th>
<th class="text-xs font-semibold text-base-content/70 text-right"></th>
</tr>
</thead>
@@ -58,10 +58,10 @@
<p class="text-[11px] text-base-content/60 truncate max-w-xs">{{ $automation->description }}</p>
@endif
</td>
<td class="py-2 text-sm">
<td class="py-2 text-sm hidden md:table-cell">
{{ ucwords(str_replace('_', ' ', $automation->trigger_type)) }}
</td>
<td class="py-2 text-center">
<td class="py-2 text-center hidden lg:table-cell">
<span class="text-sm text-base-content/80">{{ $automation->successful_runs ?? 0 }}</span>
</td>
<td class="py-2">
@@ -76,7 +76,7 @@
@endif
</div>
</td>
<td class="py-2 text-sm whitespace-nowrap">
<td class="py-2 text-sm whitespace-nowrap hidden md:table-cell">
{{ $automation->last_run_at?->diffForHumans() ?? 'Never' }}
</td>
<td class="py-2 text-right">

View File

@@ -3,7 +3,7 @@
@section('content')
<div class="px-4 py-6 max-w-7xl mx-auto">
{{-- Header --}}
<div class="flex items-center justify-between mb-6">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-6">
<div>
<p class="text-lg font-medium flex items-center gap-2">
<span class="icon-[heroicons--user-plus] size-5"></span>
@@ -13,18 +13,11 @@
Prospects and potential customers
</p>
</div>
<div class="flex items-center gap-4">
<div class="flex items-center gap-2 self-start sm:self-auto">
<a href="{{ route('seller.business.crm.leads.create', $business->slug) }}" class="btn btn-primary btn-sm gap-2">
<span class="icon-[heroicons--plus] size-4"></span>
Add Lead
</a>
<div class="breadcrumbs hidden p-0 text-sm sm:inline">
<ul>
<li><a href="{{ route('seller.business.dashboard', $business->slug) }}">Dashboard</a></li>
<li><a href="{{ route('seller.business.crm.accounts.index', $business->slug) }}">Customers</a></li>
<li class="opacity-80">Leads</li>
</ul>
</div>
</div>
</div>
@@ -70,9 +63,9 @@
<thead>
<tr>
<th>Company</th>
<th>Contact</th>
<th>Location</th>
<th>Source</th>
<th class="hidden sm:table-cell">Contact</th>
<th class="hidden lg:table-cell">Location</th>
<th class="hidden md:table-cell">Source</th>
<th>Status</th>
<th></th>
</tr>
@@ -98,7 +91,7 @@
</div>
</div>
</td>
<td>
<td class="hidden sm:table-cell">
<div>
<p class="font-medium text-sm">{{ $lead->contact_name }}</p>
@if($lead->contact_email)
@@ -106,14 +99,14 @@
@endif
</div>
</td>
<td>
<td class="hidden lg:table-cell">
@if($lead->city || $lead->state)
<span class="text-sm">{{ $lead->city }}{{ $lead->state ? ', ' . $lead->state : '' }}</span>
@else
<span class="text-xs text-base-content/40">-</span>
@endif
</td>
<td>
<td class="hidden md:table-cell">
@if($lead->source)
<span class="text-sm">{{ \App\Models\Crm\CrmLead::SOURCES[$lead->source] ?? $lead->source }}</span>
@else

View File

@@ -3,17 +3,17 @@
@section('content')
<div class="container-fluid py-6" x-data="invoiceCreator()">
<!-- Page Header -->
<div class="flex justify-between items-center mb-6">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-6">
<div>
<h1 class="text-3xl font-bold text-base-content flex items-center gap-2">
<span class="icon-[heroicons--document-plus] size-8"></span>
<h1 class="text-2xl sm:text-3xl font-bold text-base-content flex items-center gap-2">
<span class="icon-[heroicons--document-plus] size-6 sm:size-8"></span>
Create Manual Invoice
</h1>
<p class="text-base-content/60 mt-1">Create a new invoice for an existing customer</p>
<p class="text-base-content/60 mt-1 text-sm">Create a new invoice for an existing customer</p>
</div>
<a href="{{ route('seller.business.invoices.index', $business->slug) }}" class="btn btn-ghost">
<span class="icon-[heroicons--arrow-left] size-5"></span>
Back to Invoices
<a href="{{ route('seller.business.invoices.index', $business->slug) }}" class="btn btn-ghost btn-sm self-start sm:self-auto">
<span class="icon-[heroicons--arrow-left] size-4"></span>
Back
</a>
</div>
@@ -225,12 +225,12 @@
<table class="table table-zebra w-full">
<thead>
<tr>
<th class="w-10"></th>
<th class="w-10 hidden sm:table-cell"></th>
<th>Product <span class="text-error">*</span></th>
<th>Quantity <span class="text-error">*</span></th>
<th>Wholesale Unit Price <span class="text-error">*</span></th>
<th>Discount</th>
<th>Notes</th>
<th>Qty <span class="text-error">*</span></th>
<th class="hidden md:table-cell">Price <span class="text-error">*</span></th>
<th class="hidden lg:table-cell">Discount</th>
<th class="hidden xl:table-cell">Notes</th>
<th>Total</th>
<th></th>
</tr>
@@ -239,7 +239,7 @@
<template x-for="(item, index) in lineItems" :key="index">
<tr>
<!-- Product Image -->
<td>
<td class="hidden sm:table-cell">
<div class="avatar" x-show="item.image_url">
<div class="w-10 h-10 rounded">
<img :src="item.image_url" :alt="item.product_name" />
@@ -311,7 +311,7 @@
</td>
<!-- Unit Price -->
<td class="w-32">
<td class="w-32 hidden md:table-cell">
<div class="join w-full">
<span class="join-item btn btn-sm btn-disabled">$</span>
<input
@@ -327,7 +327,7 @@
</td>
<!-- Discount -->
<td class="w-40">
<td class="w-40 hidden lg:table-cell">
<div class="flex gap-1">
<input
type="number"
@@ -350,7 +350,7 @@
</td>
<!-- Notes -->
<td class="w-48">
<td class="w-48 hidden xl:table-cell">
<textarea
:name="'items[' + index + '][notes]'"
class="textarea textarea-bordered textarea-sm w-full h-16 text-xs"
@@ -384,43 +384,46 @@
</tbody>
<tfoot>
<tr>
<td colspan="6" class="text-right font-semibold">Subtotal:</td>
<td colspan="2" class="text-right font-semibold sm:hidden">Subtotal:</td>
<td colspan="6" class="text-right font-semibold hidden sm:table-cell">Subtotal:</td>
<td colspan="2">
<span class="font-semibold" x-text="'$' + calculateSubtotal().toFixed(2)"></span>
</td>
</tr>
<tr x-show="calculateTotalLineDiscounts() > 0">
<td colspan="6" class="text-right font-semibold text-success">Line Discounts:</td>
<td colspan="2" class="text-right font-semibold text-success sm:hidden">Discounts:</td>
<td colspan="6" class="text-right font-semibold text-success hidden sm:table-cell">Line Discounts:</td>
<td colspan="2">
<span class="text-success" x-text="'-$' + calculateTotalLineDiscounts().toFixed(2)"></span>
</td>
</tr>
<tr x-show="calculateTotalLineDiscounts() > 0">
<tr x-show="calculateTotalLineDiscounts() > 0" class="hidden md:table-row">
<td colspan="6" class="text-right font-semibold">Subtotal After Line Discounts:</td>
<td colspan="2">
<span class="font-semibold" x-text="'$' + calculateSubtotalAfterLineDiscounts().toFixed(2)"></span>
</td>
</tr>
<tr x-show="calculateInvoiceDiscount() > 0">
<tr x-show="calculateInvoiceDiscount() > 0" class="hidden md:table-row">
<td colspan="6" class="text-right font-semibold text-success">Invoice Discount:</td>
<td colspan="2">
<span class="text-success" x-text="'-$' + calculateInvoiceDiscount().toFixed(2)"></span>
</td>
</tr>
<tr x-show="calculateInvoiceDiscount() > 0 || calculateTotalLineDiscounts() > 0">
<tr x-show="calculateInvoiceDiscount() > 0 || calculateTotalLineDiscounts() > 0" class="hidden md:table-row">
<td colspan="6" class="text-right font-semibold">Subtotal After All Discounts:</td>
<td colspan="2">
<span class="font-semibold" x-text="'$' + calculateSubtotalAfterAllDiscounts().toFixed(2)"></span>
</td>
</tr>
<tr>
<tr class="hidden md:table-row">
<td colspan="6" class="text-right font-semibold">Tax:</td>
<td colspan="2">
<span class="text-base-content/60" x-text="'$' + calculateTax().toFixed(2)"></span>
</td>
</tr>
<tr class="font-bold text-lg">
<td colspan="6" class="text-right">Grand Total:</td>
<td colspan="2" class="text-right sm:hidden">Total:</td>
<td colspan="6" class="text-right hidden sm:table-cell">Grand Total:</td>
<td colspan="2">
<span class="text-primary" x-text="'$' + calculateTotal().toFixed(2)"></span>
</td>
@@ -496,15 +499,15 @@
</div>
<!-- Form Actions -->
<div class="flex justify-end gap-2">
<a href="{{ route('seller.business.invoices.index', $business->slug) }}" class="btn btn-ghost">
<div class="flex flex-col-reverse sm:flex-row sm:justify-end gap-2">
<a href="{{ route('seller.business.invoices.index', $business->slug) }}" class="btn btn-ghost btn-sm sm:btn-md">
Cancel
</a>
<button
type="submit"
class="btn btn-success"
class="btn btn-success btn-sm sm:btn-md"
:disabled="lineItems.length === 0 || !selectedCustomer || !paymentTerms || !dueDate">
<span class="icon-[heroicons--document-plus] size-5"></span>
<span class="icon-[heroicons--document-plus] size-4 sm:size-5"></span>
Create Invoice
</button>
</div>

View File

@@ -3,12 +3,12 @@
@section('content')
<div class="max-w-7xl mx-auto px-4 py-4 space-y-4">
{{-- Page Header --}}
<header class="flex items-center justify-between">
<header class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
<div>
<h1 class="text-2xl font-semibold">Invoices</h1>
<p class="text-sm text-base-content/60">Manage and track your invoices.</p>
</div>
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm gap-1">
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm gap-1 self-start sm:self-auto">
<span class="icon-[heroicons--plus] size-4"></span>
Create Invoice
</a>
@@ -57,9 +57,9 @@
<thead class="bg-base-200/30">
<tr>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Invoice</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Customer</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Invoice Date</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Due Date</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3 hidden sm:table-cell">Customer</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3 hidden md:table-cell">Invoice Date</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3 hidden lg:table-cell">Due Date</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3">Amount</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap py-3">Status</th>
<th class="text-xs font-medium text-base-content/50 whitespace-nowrap text-right py-3"></th>
@@ -73,7 +73,7 @@
{{ $invoice->invoice_number }}
</a>
</td>
<td class="py-2 align-middle">
<td class="py-2 align-middle hidden sm:table-cell">
<div class="flex items-center gap-3">
<div class="w-8 h-8 rounded-lg bg-base-200/50 text-base-content/50 flex items-center justify-center text-sm font-medium">
{{ strtoupper(mb_substr($invoice->business->name ?? 'C', 0, 1)) }}
@@ -92,10 +92,10 @@
</div>
</div>
</td>
<td class="py-2 align-middle whitespace-nowrap text-sm">
<td class="py-2 align-middle whitespace-nowrap text-sm hidden md:table-cell">
{{ $invoice->invoice_date->format('M j, Y') }}
</td>
<td class="py-2 align-middle whitespace-nowrap text-sm">
<td class="py-2 align-middle whitespace-nowrap text-sm hidden lg:table-cell">
@if($invoice->due_date)
<span class="{{ $invoice->isOverdue() ? 'text-error font-medium' : '' }}">
{{ $invoice->due_date->format('M j, Y') }}

View File

@@ -81,11 +81,11 @@
@change="selected = $event.target.checked ? {{ $contacts->pluck('id') }} : []" />
</th>
<th>Contact</th>
<th>Type</th>
<th>Email</th>
<th>Phone</th>
<th>Subscribed</th>
<th>Tags</th>
<th class="hidden sm:table-cell">Type</th>
<th class="hidden md:table-cell">Email</th>
<th class="hidden lg:table-cell">Phone</th>
<th class="hidden md:table-cell">Subscribed</th>
<th class="hidden lg:table-cell">Tags</th>
<th></th>
</tr>
</thead>
@@ -100,14 +100,14 @@
<div class="font-medium">{{ $contact->display_name }}</div>
<div class="text-xs text-base-content/60">{{ $contact->source }}</div>
</td>
<td>
<td class="hidden sm:table-cell">
<span class="badge badge-sm {{ $contact->type === 'buyer' ? 'badge-primary' : ($contact->type === 'consumer' ? 'badge-secondary' : 'badge-ghost') }}">
{{ $contact->getTypeLabel() }}
</span>
</td>
<td class="text-sm">{{ $contact->email ?? '-' }}</td>
<td class="text-sm">{{ $contact->phone ?? '-' }}</td>
<td>
<td class="text-sm hidden md:table-cell">{{ $contact->email ?? '-' }}</td>
<td class="text-sm hidden lg:table-cell">{{ $contact->phone ?? '-' }}</td>
<td class="hidden md:table-cell">
<div class="flex gap-1">
@if($contact->is_subscribed_email && $contact->email)
<span class="badge badge-xs badge-success">Email</span>
@@ -117,7 +117,7 @@
@endif
</div>
</td>
<td>
<td class="hidden lg:table-cell">
@if($contact->tags)
<div class="flex flex-wrap gap-1">
@foreach(array_slice($contact->tags, 0, 3) as $tag)

View File

@@ -3,7 +3,7 @@
@section('content')
<div class="max-w-7xl mx-auto px-6 py-4 space-y-4">
{{-- Page Header --}}
<header class="flex items-center justify-between">
<header class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2">
<div>
<h1 class="text-2xl font-semibold">Orders</h1>
<p class="text-sm text-base-content/60">Manage and fulfill customer orders</p>
@@ -54,10 +54,10 @@
<tr>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap">Order</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap">Customer</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap">Date</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap text-center">Items</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap hidden md:table-cell">Date</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap text-center hidden lg:table-cell">Items</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap text-right">Total</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap text-center">Fulfillment</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap text-center hidden lg:table-cell">Fulfillment</th>
<th class="text-xs font-medium text-base-content/50 py-3 whitespace-nowrap">Status</th>
<th class="text-xs font-medium text-base-content/50 py-3"></th>
</tr>
@@ -86,17 +86,17 @@
</div>
</div>
</td>
<td class="py-3 whitespace-nowrap">
<td class="py-3 whitespace-nowrap hidden md:table-cell">
<div class="text-sm">{{ $order->created_at->format('M j, Y') }}</div>
<div class="text-[11px] text-base-content/60">{{ $order->created_at->format('g:i A') }}</div>
</td>
<td class="py-3 text-center">
<td class="py-3 text-center hidden lg:table-cell">
<span class="text-sm text-base-content/80">{{ $order->items->count() }}</span>
</td>
<td class="py-3 text-right">
<span class="text-sm font-semibold">${{ number_format($order->total, 2) }}</span>
</td>
<td class="py-3 text-center">
<td class="py-3 text-center hidden lg:table-cell">
@if($order->workorder_status == 100)
<span class="badge badge-success badge-sm whitespace-nowrap">Complete</span>
@elseif($order->workorder_status == 0)

View File

@@ -73,7 +73,7 @@
}">
{{-- Page Header --}}
<div class="flex items-center justify-between">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2">
<div>
<h1 class="text-xl font-semibold text-base-content">Products</h1>
<p class="text-sm text-base-content/50">Manage your product catalog</p>
@@ -131,38 +131,38 @@
</x-ui.filter-bar>
{{-- Filter Chips Row --}}
<div class="flex flex-wrap items-center gap-1.5">
<div class="flex items-center gap-1.5 overflow-x-auto pb-1">
<button @click="setFocusFilter('all')"
:class="focusFilter === 'all' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0">
All
</button>
<button @click="setFocusFilter('low-stock')"
:class="focusFilter === 'low-stock' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0">
Low Stock
</button>
<button @click="setFocusFilter('out-of-stock')"
:class="focusFilter === 'out-of-stock' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0">
Out of Stock
</button>
<button @click="setFocusFilter('missing-images')"
:class="focusFilter === 'missing-images' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0 hidden sm:inline-flex">
Missing Images
</button>
<button @click="setFocusFilter('not-listed')"
:class="focusFilter === 'not-listed' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0 hidden sm:inline-flex">
Not Listed
</button>
<button @click="setFocusFilter('drafts')"
:class="focusFilter === 'drafts' ? 'bg-base-200 text-base-content' : 'text-base-content/50 hover:text-base-content'"
class="btn btn-xs btn-ghost rounded-md px-2.5">
class="btn btn-xs btn-ghost rounded-md px-2.5 whitespace-nowrap flex-shrink-0">
Drafts
</button>
<span class="text-xs text-base-content/40 ml-2">
<span class="text-xs text-base-content/40 ml-2 whitespace-nowrap flex-shrink-0">
<span x-text="filteredListings.length"></span>/<span x-text="pagination.total"></span>
</span>
</div>
@@ -174,11 +174,11 @@
<thead class="bg-base-200/30">
<tr>
<th class="text-xs font-medium text-base-content/50 py-2.5">Product</th>
<th class="text-xs font-medium text-base-content/50 py-2.5">Brand</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 hidden md:table-cell">Brand</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 text-right">Price</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 text-right">Stock</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 text-right">Conv.</th>
<th class="text-xs font-medium text-base-content/50 py-2.5">Status</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 text-right hidden lg:table-cell">Stock</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 text-right hidden xl:table-cell">Conv.</th>
<th class="text-xs font-medium text-base-content/50 py-2.5 hidden sm:table-cell">Status</th>
<th class="text-xs font-medium text-base-content/50 py-2.5"></th>
</tr>
</thead>
@@ -212,16 +212,16 @@
</div>
</div>
</td>
<td class="py-2.5"><span class="text-sm text-base-content/70" x-text="listing.brand"></span></td>
<td class="py-2.5 hidden md:table-cell"><span class="text-sm text-base-content/70" x-text="listing.brand"></span></td>
<td class="py-2.5 text-right font-medium text-sm">$<span x-text="listing.price.toFixed(2)"></span></td>
<td class="py-2.5 text-right">
<td class="py-2.5 text-right hidden lg:table-cell">
<span class="text-sm" x-text="listing.stock"></span>
<span x-show="listing.stock === 0" class="text-xs ml-1 text-error">(Out)</span>
</td>
<td class="py-2.5 text-right">
<td class="py-2.5 text-right hidden xl:table-cell">
<span class="text-sm text-base-content/70" x-text="getConversion(listing) + '%'"></span>
</td>
<td class="py-2.5">
<td class="py-2.5 hidden sm:table-cell">
<span x-show="listing.status === 'active'" class="badge badge-neutral badge-sm">Active</span>
<span x-show="listing.status === 'paused'" class="badge badge-neutral badge-sm">Paused</span>
<span x-show="listing.status === 'draft'" class="badge badge-neutral badge-sm">Draft</span>