This commit is contained in:
pbao9
2026-02-07 16:18:39 +07:00
parent e7b9ce7485
commit 3dc19ccb83
11 changed files with 222 additions and 38 deletions
@@ -1,6 +1,9 @@
@if(auth()->guard('admins')->user()->can("manager product"))
<x-button-crm type="button" variant="primary" size="sm" route="products.create" icon="plus-circle">Add
Product</x-button-crm>
<x-button-crm type="button" variant="info" size="sm" route="products.group.create" icon="plus-circle">Add
Group</x-button-crm>
<x-button-crm type="button" variant="outline-primary" size="sm" route="products.create" icon="plus-circle">Thêm sản
phẩm</x-button-crm>
<x-button-crm type="button" variant="outline-info" size="sm" route="products.group.create" icon="plus-circle">Thêm
nhóm
SP</x-button-crm>
<x-button-crm type="button" variant="outline-danger" size="sm" route="products.group.trash" icon="trash">Thùng
rác</x-button-crm>
@endif
@@ -1,6 +1,8 @@
<div class="d-flex gap-2">
<x-button-crm type="button" variant="primary" size="sm" route="products.group.edit" :params="['id' => $row->id]" icon="pencil">Edit</x-button-crm>
<x-button-crm type="button" variant="danger" size="sm" icon="trash" data-micromodal-trigger="deleteModal-{{ $row->id }}">Delete</x-button-crm>
<x-button-crm type="button" variant="outline-primary" size="sm" route="products.group.edit" :params="['id' => $row->id]"
icon="pencil">Edit</x-button-crm>
<x-button-crm type="button" variant="outline-danger" size="sm" icon="trash"
data-micromodal-trigger="deleteModal-{{ $row->id }}">Delete</x-button-crm>
</div>
@include('administrator.pages.product.categories.datatable.modal', [
@@ -0,0 +1,12 @@
<div class="d-flex gap-2">
<x-button-crm type="button" variant="success" size="sm" route="products.group.restore" :params="['id' => $row->id]" icon="rotate-ccw">Restore</x-button-crm>
<x-button-crm type="button" variant="danger" size="sm" icon="trash-2" data-micromodal-trigger="forceDeleteModal-{{ $row->id }}">Force Delete</x-button-crm>
</div>
@include('administrator.pages.product.categories.datatable.modal', [
'deleteRoute' => 'products.group.forceDelete',
'itemLabel' => 'Product Group',
'itemId' => $row->id,
'itemName' => $row->name,
'modalId' => 'forceDeleteModal-' . $row->id
])
@@ -0,0 +1,98 @@
@extends('administrator.layout.master')
@push('plugin-styles')
@foreach (config('assets.datatable.css') as $datatable)
<link href="{{ asset($datatable) }}" rel="stylesheet" />
@endforeach
@endpush
@section('breadcrumb')
@php
$breadcrumbItems = [
['label' => 'Product'],
['label' => 'Product Group', 'route' => route('products.group.index')],
['label' => 'Trash List', 'active' => true]
];
@endphp
<x-admin-breadcrumb :items="$breadcrumbItems" />
@endsection
@section('tab')
@php
$tabs = [
[
'label' => 'Product',
'route' => 'products.index',
'icon' => 'server',
],
[
'label' => 'Product Group',
'route' => 'products.group.index',
'icon' => 'server',
],
];
@endphp
<x-admin-tab :items="$tabs" />
@endsection
@section('content')
@if (auth()->guard('admins')->user()->can('manager product'))
<div class="card card-primary card-outline">
<div class="card-header d-flex justify-content-end gap-2">
<x-button-crm type="button" variant="secondary" size="sm" route="products.group.index" icon="arrow-left">Back to List</x-button-crm>
</div>
<div class="card-body">
<x-datatable id="productTable" ajax="{{ route('products.group.datatable', ['trashed' => 1]) }}" :columns="[
['key' => 'name', 'label' => 'Group'],
['key' => 'slug', 'label' => 'Slug'],
['key' => 'deleted_at', 'label' => 'Deleted At'],
['key' => 'action', 'label' => 'Action', 'searchable' => false],
]" />
</div>
</div>
@else
<div class="alert alert-danger alert-dismissible">
<h5 class="mb-0"><i class="icon fas fa-ban"></i> Access Denied - You are not assigned to any Product
management department</h5>
</div>
@endif
@endsection
@push('plugin-scripts')
@foreach (config('assets.datatable.js') as $datatable)
<script src="{{ asset($datatable) }}"></script>
@endforeach
@endpush
@push('custom-scripts')
<script>
document.addEventListener('DOMContentLoaded', function () {
// Function to initialize MicroModal
function initMicroModal() {
if (typeof MicroModal !== 'undefined') {
MicroModal.init({
onShow: modal => console.info(`${modal.id} is shown`),
onClose: modal => console.info(`${modal.id} is hidden`),
openTrigger: 'data-micromodal-trigger',
closeTrigger: 'data-micromodal-close',
disableScroll: true,
disableFocus: false,
awaitOpenAnimation: false,
awaitCloseAnimation: false,
debugMode: true
});
}
}
// Initialize on page load
initMicroModal();
// Re-initialize after DataTable draws (when action column renders)
$('#productTable').on('draw.dt', function() {
setTimeout(function() {
initMicroModal();
// Re-initialize Lucide icons for modal content
if (typeof lucide !== 'undefined') {
lucide.createIcons();
}
}, 100);
});
});
</script>
@endpush
@@ -20,46 +20,53 @@
$tag = 'a';
}
$baseClasses = 'd-inline-flex gap-2 align-items-center justify-content-center text-white px-3 py-2 rounded-3 transition-all border-0';
$variants = [
'primary' => 'bg-primary',
'secondary' => 'bg-secondary',
'outline' => 'bg-outline',
'ghost' => 'bg-ghost',
'link' => 'bg-link',
'danger' => 'bg-danger',
'destructive' => 'bg-destructive',
'success' => 'bg-success',
'warning' => 'bg-warning',
'info' => 'bg-info'
'primary' => 'btn-primary',
'secondary' => 'btn-secondary',
'outline' => 'btn-outline-primary',
'outline-primary' => 'btn-outline-primary',
'outline-secondary' => 'btn-outline-secondary',
'outline-success' => 'btn-outline-success',
'outline-danger' => 'btn-outline-danger',
'outline-warning' => 'btn-outline-warning',
'outline-info' => 'btn-outline-info',
'ghost' => 'btn-light',
'link' => 'btn-link',
'danger' => 'btn-danger',
'destructive' => 'btn-danger',
'success' => 'btn-success',
'warning' => 'btn-warning',
'info' => 'btn-info',
'light' => 'btn-light',
'dark' => 'btn-dark',
];
$sizes = [
'default' => 'h-10',
'sm' => 'h-6',
'lg' => 'h-12',
'icon' => 'h-10',
'default' => '',
'sm' => 'btn-sm',
'lg' => 'btn-lg',
'xs' => 'btn-xs',
'icon' => 'btn-icon',
];
$variantClass = $variants[$variant ?? 'primary'] ?? $variants['primary'];
$sizeClass = $sizes[$size ?? 'md'] ?? $sizes['default'];
$sizeClass = $sizes[$size ?? 'default'] ?? '';
$classes = "{$baseClasses} {$variantClass} {$sizeClass}";
$classes = "btn {$variantClass} {$sizeClass}";
@endphp
@if($tag === 'a')
<a href="{{ $href }}" {{ $attributes->merge(['class' => $classes]) }}>
@if($icon)
<i data-lucide="{{ $icon }}" class="mr-2" style="height: 15px; width: 15px"></i>
@endif
{{ $slot }}
</a>
@else
<button type="{{ $buttonType }}" {{ $attributes->merge(['class' => $classes]) }}>
@if($tag === 'a')
<a href="{{ $href }}" {{ $attributes->merge(['class' => $classes]) }}>
@if($icon)
<i data-lucide="{{ $icon }}" class="mr-2" style="height: 15px; width: 15px"></i>
<i data-lucide="{{ $icon }}" class="me-1" style="height: 14px; width: 14px"></i>
@endif
{{ $slot }}
</button>
@endif
</a>
@else
<button type="{{ $buttonType }}" {{ $attributes->merge(['class' => $classes]) }}>
@if($icon)
<i data-lucide="{{ $icon }}" class="me-1" style="height: 14px; width: 14px"></i>
@endif
{{ $slot }}
</button>
@endif