fix: UI standardization and sidebar improvements
- Fix sidebar menu items requiring double-click (checkbox overlay issue) - Remove jittery scroll animation on sidebar navigation - Remove green search button, use neutral icon instead - Standardize dropdown menus across all pages (btn instead of label, menu-sm) - Fix brand dashboard topPerformer undefined key error - Fix product hashid validation for image routes - Initialize Alpine.js search state from URL params on products page - Update theme colors in tailwind config
This commit is contained in:
@@ -126,6 +126,13 @@
|
||||
.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 {
|
||||
@@ -247,15 +254,15 @@ html:not([data-theme="material"], [data-theme="material-dark"]) {
|
||||
|
||||
/* == Cannabrands Brand Colors ==
|
||||
* DO NOT CHANGE THESE COLORS!
|
||||
* Primary: #4B6FA4 (muted blue)
|
||||
* Success: #4E8D71 (muted green)
|
||||
* Primary: #4E8D71 (green - main action color)
|
||||
* Info: #4B6FA4 (blue - informational)
|
||||
* Error: #E1524D (clean red)
|
||||
* These are the official brand colors. */
|
||||
--color-primary: #4B6FA4;
|
||||
--color-primary: #4E8D71;
|
||||
--color-primary-content: #ffffff;
|
||||
--color-secondary: #4B6FA4;
|
||||
--color-secondary-content: #ffffff;
|
||||
--color-accent: #4B6FA4;
|
||||
--color-accent: #4E8D71;
|
||||
--color-accent-content: #ffffff;
|
||||
--color-neutral: #374151;
|
||||
--color-neutral-content: #ffffff;
|
||||
@@ -302,11 +309,11 @@ html:not([data-theme="material"], [data-theme="material-dark"]) {
|
||||
/* == Cannabrands Brand Colors (Dark) ==
|
||||
* DO NOT CHANGE THESE COLORS!
|
||||
* See light theme for brand color documentation. */
|
||||
--color-primary: #5A7FB4;
|
||||
--color-primary: #5E9D81;
|
||||
--color-primary-content: #ffffff;
|
||||
--color-secondary: #5A7FB4;
|
||||
--color-secondary-content: #ffffff;
|
||||
--color-accent: #5A7FB4;
|
||||
--color-accent: #5E9D81;
|
||||
--color-accent-content: #ffffff;
|
||||
--color-neutral: #9ca3af;
|
||||
--color-neutral-content: #1e2832;
|
||||
|
||||
@@ -5,24 +5,21 @@
|
||||
--}}
|
||||
@php
|
||||
$statusConfig = [
|
||||
// New orders (primary - blue)
|
||||
'new' => ['label' => 'New', 'class' => 'badge-primary'],
|
||||
// All active/in-progress states (neutral - gray)
|
||||
'buyer_modified' => ['label' => 'Modified', 'class' => 'badge-neutral'],
|
||||
'seller_modified' => ['label' => 'Modified', 'class' => 'badge-neutral'],
|
||||
'accepted' => ['label' => 'Accepted', 'class' => 'badge-neutral'],
|
||||
'in_progress' => ['label' => 'In Progress', 'class' => 'badge-neutral'],
|
||||
'ready_for_delivery' => ['label' => 'Buyer Review', 'class' => 'badge-neutral'],
|
||||
'out_for_delivery' => ['label' => 'Delivering', 'class' => 'badge-neutral'],
|
||||
'ready_for_manifest' => ['label' => 'Ready', 'class' => 'badge-neutral'],
|
||||
'approved_for_delivery' => ['label' => 'Ready', 'class' => 'badge-neutral'],
|
||||
'delivered' => ['label' => 'Delivered', 'class' => 'badge-neutral'],
|
||||
'buyer_approved' => ['label' => 'Complete', 'class' => 'badge-neutral'],
|
||||
'completed' => ['label' => 'Complete', 'class' => 'badge-neutral'],
|
||||
|
||||
// Terminal error states only (error - muted red)
|
||||
'cancelled' => ['label' => 'Cancelled', 'class' => 'badge-error'],
|
||||
'rejected' => ['label' => 'Rejected', 'class' => 'badge-error'],
|
||||
// All statuses use ghost (no color) style
|
||||
'new' => ['label' => 'New', 'class' => 'badge-ghost'],
|
||||
'buyer_modified' => ['label' => 'Modified', 'class' => 'badge-ghost'],
|
||||
'seller_modified' => ['label' => 'Modified', 'class' => 'badge-ghost'],
|
||||
'accepted' => ['label' => 'Accepted', 'class' => 'badge-ghost'],
|
||||
'in_progress' => ['label' => 'In Progress', 'class' => 'badge-ghost'],
|
||||
'ready_for_delivery' => ['label' => 'Buyer Review', 'class' => 'badge-ghost'],
|
||||
'out_for_delivery' => ['label' => 'Delivering', 'class' => 'badge-ghost'],
|
||||
'ready_for_manifest' => ['label' => 'Ready', 'class' => 'badge-ghost'],
|
||||
'approved_for_delivery' => ['label' => 'Ready', 'class' => 'badge-ghost'],
|
||||
'delivered' => ['label' => 'Delivered', 'class' => 'badge-ghost'],
|
||||
'buyer_approved' => ['label' => 'Complete', 'class' => 'badge-ghost'],
|
||||
'completed' => ['label' => 'Complete', 'class' => 'badge-ghost'],
|
||||
'cancelled' => ['label' => 'Cancelled', 'class' => 'badge-ghost'],
|
||||
'rejected' => ['label' => 'Rejected', 'class' => 'badge-ghost'],
|
||||
];
|
||||
|
||||
$config = $statusConfig[$status] ?? ['label' => ucfirst(str_replace('_', ' ', $status)), 'class' => 'badge-neutral'];
|
||||
|
||||
@@ -25,20 +25,11 @@
|
||||
<div class="size-full overflow-y-auto"
|
||||
x-data="{
|
||||
init() {
|
||||
// Wait for collapse animations to complete (they take ~300ms)
|
||||
setTimeout(() => {
|
||||
// Scroll the active menu item into view
|
||||
const activeItem = this.$el.querySelector('.menu-item.active');
|
||||
if (activeItem) {
|
||||
activeItem.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
} else {
|
||||
// Fallback to saved scroll position
|
||||
const savedScroll = localStorage.getItem('sidebar-scroll-position');
|
||||
if (savedScroll) {
|
||||
this.$el.scrollTop = parseInt(savedScroll);
|
||||
}
|
||||
}
|
||||
}, 350);
|
||||
// Restore scroll position immediately (no animation)
|
||||
const savedScroll = localStorage.getItem('sidebar-scroll-position');
|
||||
if (savedScroll) {
|
||||
this.$el.scrollTop = parseInt(savedScroll);
|
||||
}
|
||||
}
|
||||
}"
|
||||
@scroll.debounce.150ms="localStorage.setItem('sidebar-scroll-position', $el.scrollTop)">
|
||||
|
||||
@@ -82,9 +82,10 @@
|
||||
name="{{ $searchName }}"
|
||||
value="{{ $searchValue }}"
|
||||
placeholder="{{ $searchPlaceholder }}"
|
||||
class="input input-sm input-bordered w-full pr-8 bg-base-100">
|
||||
<button type="submit" class="absolute right-1.5 top-1/2 -translate-y-1/2 btn btn-ghost btn-xs btn-circle">
|
||||
<span class="icon-[heroicons--magnifying-glass] size-4 text-base-content/30"></span>
|
||||
class="input input-sm input-bordered w-full pr-10 bg-base-100"
|
||||
onkeydown="if(event.key==='Enter'){this.form.submit();}">
|
||||
<button type="submit" class="absolute right-2.5 top-1/2 -translate-y-1/2" title="Search">
|
||||
<span class="icon-[heroicons--magnifying-glass] size-4 text-base-content/30 hover:text-base-content/60"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
</div>
|
||||
|
||||
{{-- Brand Insights Section (Mini Tiles) --}}
|
||||
@if(isset($brandInsights))
|
||||
@if(!empty($brandInsights) && isset($brandInsights['topPerformer']))
|
||||
<div class="space-y-3">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="icon-[heroicons--light-bulb] size-4 text-base-content/50"></span>
|
||||
@@ -348,11 +348,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($brand->products->take(5) as $product)
|
||||
@forelse($brand->products->filter(fn($p) => !empty($p->hashid))->take(5) as $product)
|
||||
<tr class="hover:bg-base-200/30 transition-colors">
|
||||
<td class="pl-5">
|
||||
<div class="flex items-center gap-3">
|
||||
@if($product->image_path)
|
||||
@if($product->image_path && $product->hashid)
|
||||
<div class="avatar">
|
||||
<div class="w-10 h-10 rounded-lg bg-base-200/50">
|
||||
<img src="{{ route('image.product', [$product->hashid, 80]) }}" alt="{{ $product->name }}" class="object-contain" />
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
</a>
|
||||
{{-- Quick Actions Dropdown --}}
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-10 menu p-2 shadow-sm bg-base-100 rounded-lg w-52 border border-base-300">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-52 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.crm.leads.create', $business->slug) }}" class="gap-2">
|
||||
<span class="icon-[heroicons--user-plus] size-4"></span>
|
||||
|
||||
@@ -90,10 +90,10 @@
|
||||
|
||||
{{-- Actions Dropdown --}}
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.crm.automations.show', [$business, $automation]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
</form>
|
||||
@endif
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-5"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-10 menu p-2 shadow bg-base-100 rounded-box w-48">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.crm.calendar.index', $business->slug) }}?date={{ $event->start_at->format('Y-m-d') }}">
|
||||
<span class="icon-[heroicons--calendar] size-4"></span>
|
||||
|
||||
@@ -27,12 +27,10 @@
|
||||
</form>
|
||||
@endif
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a href="{{ route('seller.business.crm.quotes.create', ['business' => $business, 'deal_id' => $deal->id]) }}">Create Quote</a></li>
|
||||
<li>
|
||||
<form method="POST" action="{{ route('seller.business.crm.deals.destroy', [$business, $deal]) }}" onsubmit="return confirm('Delete this deal?')">
|
||||
|
||||
@@ -132,12 +132,12 @@
|
||||
{{ \App\Models\Crm\CrmLead::STATUSES[$lead->status] ?? $lead->status }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-10 menu menu-sm p-2 shadow-lg bg-base-100 rounded-box w-52">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.crm.leads.show', [$business->slug, $lead->hashid]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -127,12 +127,12 @@
|
||||
<span class="text-sm text-base-content/40">-</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-2 text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-sm bg-base-100 rounded-lg w-44 z-[100] border border-base-300 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.crm.quotes.show', [$business, $quote]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -67,12 +67,10 @@
|
||||
|
||||
{{-- Actions dropdown --}}
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
@if($thread->status !== 'closed')
|
||||
<li>
|
||||
<form method="POST" action="{{ route('seller.business.crm.threads.close', [$business, $thread]) }}">
|
||||
|
||||
@@ -149,10 +149,10 @@
|
||||
{{-- Actions --}}
|
||||
<td>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52 border border-base-300">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a><span class="icon-[heroicons--eye] size-4"></span> View Product</a></li>
|
||||
<li><a><span class="icon-[heroicons--pencil] size-4"></span> Edit Product</a></li>
|
||||
<li><a><span class="icon-[heroicons--cube] size-4"></span> Adjust Stock</a></li>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<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-primary btn-sm gap-1">
|
||||
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm gap-1">
|
||||
<span class="icon-[heroicons--plus] size-4"></span>
|
||||
Create Invoice
|
||||
</a>
|
||||
@@ -18,6 +18,7 @@
|
||||
<x-ui.filter-bar
|
||||
form-action="{{ route('seller.business.invoices.index', $business->slug) }}"
|
||||
search-placeholder="Search invoices..."
|
||||
search-name="search"
|
||||
:search-value="request('search')"
|
||||
clear-url="{{ route('seller.business.invoices.index', $business->slug) }}"
|
||||
>
|
||||
@@ -42,7 +43,7 @@
|
||||
<p class="text-xs text-base-content/50 mb-4 max-w-md">
|
||||
Create your first invoice to bill customers and track payment status.
|
||||
</p>
|
||||
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-primary btn-sm">
|
||||
<a href="{{ route('seller.business.invoices.create', $business->slug) }}" class="btn btn-secondary btn-sm">
|
||||
Create Invoice
|
||||
</a>
|
||||
</div>
|
||||
@@ -106,11 +107,11 @@
|
||||
</td>
|
||||
<td class="py-2 align-middle">
|
||||
@if($invoice->payment_status === 'paid')
|
||||
<span class="badge badge-success badge-sm">Paid</span>
|
||||
<span class="badge badge-ghost badge-sm">Paid</span>
|
||||
@elseif($invoice->isOverdue())
|
||||
<span class="badge badge-error badge-sm">Overdue</span>
|
||||
<span class="badge badge-ghost badge-sm">Overdue</span>
|
||||
@else
|
||||
<span class="badge badge-neutral badge-sm">Unpaid</span>
|
||||
<span class="badge badge-ghost badge-sm">Unpaid</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-2 align-middle text-right">
|
||||
|
||||
@@ -117,12 +117,12 @@
|
||||
<td class="text-right">
|
||||
@if($period->isOpen() && $canClosePeriods)
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<span class="icon-[heroicons--lock-closed] size-4"></span>
|
||||
Close
|
||||
<span class="icon-[heroicons--chevron-down] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-48">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<button type="button" onclick="openCloseModal({{ $period->id }}, '{{ $period->period_label }}', 'soft_closed')">
|
||||
<span class="icon-[heroicons--lock-open] size-4 text-warning"></span>
|
||||
|
||||
@@ -133,10 +133,10 @@
|
||||
</td>
|
||||
<td>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-5"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52 z-10">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<button type="button" @click="openEditModal({{ json_encode($vendor) }})">
|
||||
<span class="icon-[heroicons--pencil] size-4"></span>
|
||||
|
||||
@@ -107,12 +107,12 @@
|
||||
<span class="badge badge-ghost badge-sm">Inactive</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-48">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.management.bank-accounts.show', [$business, $account]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -135,10 +135,10 @@
|
||||
<td class="text-sm text-base-content/60">{{ $tx->category_display }}</td>
|
||||
<td>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<button @click="openMatchModal({{ $tx->id }})">
|
||||
<span class="icon-[heroicons--link] size-4"></span>
|
||||
|
||||
@@ -80,10 +80,10 @@
|
||||
Edit
|
||||
</a>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
@if(!$budget->approved_at)
|
||||
<li>
|
||||
<form action="{{ route('seller.business.management.budgets.approve', [$business, $budget]) }}" method="POST">
|
||||
|
||||
@@ -116,10 +116,10 @@
|
||||
View
|
||||
</a>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.management.recurring.edit', [$business, $schedule]) }}">Edit</a>
|
||||
</li>
|
||||
|
||||
@@ -198,12 +198,10 @@
|
||||
|
||||
{{-- Actions Dropdown --}}
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z"></path>
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52 z-10">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a href="{{ route('seller.marketing.broadcasts.show', $broadcast) }}">View Details</a></li>
|
||||
<li><a href="{{ route('seller.marketing.broadcasts.analytics', $broadcast) }}">Analytics</a></li>
|
||||
|
||||
|
||||
@@ -136,12 +136,12 @@
|
||||
<span class="text-base-content/50 text-sm">-</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-2 text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-44 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.marketing.campaigns.show', [$business->slug, $campaign]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -82,10 +82,10 @@
|
||||
<span class="badge badge-neutral badge-sm">Inactive</span>
|
||||
@endif
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.marketing.channels.edit', [$business->slug, $channel]) }}">
|
||||
<span class="icon-[heroicons--pencil] size-4"></span>
|
||||
|
||||
@@ -131,14 +131,12 @@
|
||||
-
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path d="M6 10a2 2 0 11-4 0 2 2 0 014 0zM12 10a2 2 0 11-4 0 2 2 0 014 0zM16 12a2 2 0 100-4 2 2 0 000 4z" />
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a href="{{ route('seller.business.marketing.contacts.edit', [$business, $contact]) }}">Edit</a></li>
|
||||
<li>
|
||||
<form method="POST" action="{{ route('seller.business.marketing.contacts.destroy', [$business, $contact]) }}" onsubmit="return confirm('Delete this contact?')">
|
||||
|
||||
@@ -29,12 +29,10 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path d="M6 10a2 2 0 11-4 0 2 2 0 014 0zM12 10a2 2 0 11-4 0 2 2 0 014 0zM16 12a2 2 0 100-4 2 2 0 000 4z" />
|
||||
</svg>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-40">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a href="{{ route('seller.business.marketing.lists.show', [$business, $list]) }}">View Contacts</a></li>
|
||||
<li><a href="{{ route('seller.business.marketing.lists.edit', [$business, $list]) }}">Edit</a></li>
|
||||
<li>
|
||||
|
||||
@@ -131,12 +131,12 @@
|
||||
<span class="text-base-content/40">-</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-2 text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.marketing.promos.show', [$business->slug, $promo]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -120,12 +120,12 @@
|
||||
<td class="py-2 text-sm whitespace-nowrap">
|
||||
{{ $template->updated_at->diffForHumans() }}
|
||||
</td>
|
||||
<td class="py-2 text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu p-2 shadow-lg bg-base-100 rounded-2xl w-40 z-[100] border border-base-200 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.marketing.templates.show', [$business->slug, $template]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -95,24 +95,24 @@
|
||||
</td>
|
||||
<td class="py-3 text-center">
|
||||
@if($order->workorder_status == 100)
|
||||
<span class="badge badge-neutral badge-sm whitespace-nowrap">Complete</span>
|
||||
<span class="badge badge-success badge-sm whitespace-nowrap">Complete</span>
|
||||
@elseif($order->workorder_status == 0)
|
||||
<span class="badge badge-neutral badge-sm whitespace-nowrap">Not Started</span>
|
||||
<span class="badge badge-success badge-sm whitespace-nowrap">Not Started</span>
|
||||
@elseif($order->workorder_status > 0 && $order->workorder_status < 100)
|
||||
<span class="badge badge-neutral badge-sm whitespace-nowrap">{{ number_format($order->workorder_status, 0) }}%</span>
|
||||
<span class="badge badge-success badge-sm whitespace-nowrap">{{ number_format($order->workorder_status, 0) }}%</span>
|
||||
@else
|
||||
<span class="badge badge-neutral badge-sm whitespace-nowrap">Not Started</span>
|
||||
<span class="badge badge-success badge-sm whitespace-nowrap">Not Started</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="py-3">
|
||||
@include('buyer.orders.partials.status-badge', ['status' => $order->status])
|
||||
</td>
|
||||
<td class="py-3 text-right">
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown {{ $loop->last ? 'dropdown-top' : '' }} dropdown-end">
|
||||
<button tabindex="0" role="button" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-lg shadow-sm w-48 p-2 z-[100] border border-base-300 {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100] {{ $loop->last ? 'mb-1' : '' }}">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.orders.show', [$business->slug, $order]) }}">
|
||||
<span class="icon-[heroicons--eye] size-4"></span>
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
@section('content')
|
||||
<div class="max-w-7xl mx-auto px-6 py-4 space-y-4"
|
||||
x-data="{
|
||||
// State
|
||||
search: '',
|
||||
brandFilter: 'all',
|
||||
statusFilter: 'all',
|
||||
// State - initialize from URL params to sync with server-side filtering
|
||||
search: '{{ request('search', '') }}',
|
||||
brandFilter: '{{ request('brand_id', 'all') ?: 'all' }}',
|
||||
statusFilter: '{{ request('status', 'all') ?: 'all' }}',
|
||||
visibilityFilter: 'all',
|
||||
focusFilter: 'all',
|
||||
viewMode: 'table',
|
||||
@@ -241,14 +241,24 @@
|
||||
<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>
|
||||
</td>
|
||||
<td class="py-2.5" @click.stop>
|
||||
<td class="py-2 align-middle text-right" @click.stop>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4 text-base-content/40"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-1.5 bg-base-100 rounded-lg w-40 border border-base-300">
|
||||
<li><a @click="openInspector(listing)" class="text-sm py-1.5"><span class="icon-[heroicons--information-circle] size-4"></span> Quick View</a></li>
|
||||
<li><a :href="listing.edit_url" class="text-sm py-1.5"><span class="icon-[heroicons--pencil] size-4"></span> Edit</a></li>
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a @click="openInspector(listing)">
|
||||
<span class="icon-[heroicons--information-circle] size-4"></span>
|
||||
Quick View
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a :href="listing.edit_url">
|
||||
<span class="icon-[heroicons--pencil] size-4"></span>
|
||||
Edit
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
@@ -200,10 +200,10 @@
|
||||
|
||||
{{-- Standard actions dropdown --}}
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[lucide--more-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-box z-[1] w-48 p-2 shadow-lg border border-base-200">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a href="{{ route('seller.business.products.edit', [$business->slug, $product->hashid]) }}">
|
||||
<span class="icon-[lucide--eye] size-4"></span>
|
||||
|
||||
@@ -501,14 +501,24 @@
|
||||
<span x-show="listing.status === 'paused'" class="badge badge-warning badge-xs">Paused</span>
|
||||
<span x-show="listing.status === 'draft'" class="badge badge-ghost badge-xs">Draft</span>
|
||||
</td>
|
||||
<td @click.stop>
|
||||
<td class="py-2 align-middle text-right" @click.stop>
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-xs">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow-lg bg-base-100 rounded-box w-52 border border-base-300">
|
||||
<li><a @click="openInspector(listing)"><span class="icon-[heroicons--information-circle] size-4"></span> Quick View</a></li>
|
||||
<li><a :href="listing.edit_url"><span class="icon-[heroicons--pencil] size-4"></span> Edit Product</a></li>
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li>
|
||||
<a @click="openInspector(listing)">
|
||||
<span class="icon-[heroicons--information-circle] size-4"></span>
|
||||
Quick View
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a :href="listing.edit_url">
|
||||
<span class="icon-[heroicons--pencil] size-4"></span>
|
||||
Edit Product
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
@@ -130,12 +130,12 @@
|
||||
<td>
|
||||
<input type="checkbox" class="toggle toggle-success toggle-sm" {{ $webhook['enabled'] ? 'checked' : '' }} onchange="toggleWebhook({{ $webhook['id'] }})" />
|
||||
</td>
|
||||
<td>
|
||||
<td class="py-2 align-middle text-right">
|
||||
<div class="dropdown dropdown-end">
|
||||
<label tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<button tabindex="0" class="btn btn-ghost btn-sm btn-square">
|
||||
<span class="icon-[heroicons--ellipsis-vertical] size-4"></span>
|
||||
</label>
|
||||
<ul tabindex="0" class="dropdown-content z-[1] menu menu-sm p-2 shadow-lg bg-base-100 rounded-box w-48 border border-base-300">
|
||||
</button>
|
||||
<ul tabindex="0" class="dropdown-content menu menu-sm p-2 shadow-sm bg-base-100 rounded-lg w-48 border border-base-300 z-[100]">
|
||||
<li><a class="gap-2"><span class="icon-[heroicons--pencil] size-4"></span> Edit</a></li>
|
||||
<li><a class="gap-2"><span class="icon-[heroicons--paper-airplane] size-4"></span> Test Webhook</a></li>
|
||||
<li><a class="gap-2"><span class="icon-[heroicons--arrow-path] size-4"></span> View History</a></li>
|
||||
|
||||
@@ -29,13 +29,13 @@ export default {
|
||||
themes: [
|
||||
{
|
||||
cannabrands: {
|
||||
"primary": "#4B6FA4",
|
||||
"primary": "#4E8D71",
|
||||
"primary-content": "#ffffff",
|
||||
|
||||
"secondary": "#6B7280",
|
||||
"secondary": "#4B6FA4",
|
||||
"secondary-content": "#ffffff",
|
||||
|
||||
"accent": "#4B6FA4",
|
||||
"accent": "#4E8D71",
|
||||
"accent-content": "#ffffff",
|
||||
|
||||
"success": "#4E8D71",
|
||||
|
||||
Reference in New Issue
Block a user