From 8125804bac8a5fa20a60796123711b98b52c89d4 Mon Sep 17 00:00:00 2001 From: pbao9 Date: Mon, 2 Feb 2026 17:27:33 +0700 Subject: [PATCH] update --- .../Controllers/admin/LoginController.php | 2 +- app/Http/Controllers/admin/MainController.php | 2 +- .../Controllers/admin/SettingController.php | 4 +- .../Controllers/admin/SupportController.php | 4 +- .../Controllers/admin/package/Network.php | 2 +- .../Controllers/admin/package/OsVersion.php | 42 +- .../Requests/Package/OsVersionRequest.php | 2 - app/Models/Os.php | 3 - package.json | 1 + resources/css/components/micromodal.css | 241 ++++++++++++ resources/js/bootstrap-vite.js | 4 + resources/js/components/micromodal.js | 300 ++++++++++++++ .../administrator/layout/master.blade.php | 16 + .../pages/customer/info.blade.php | 321 ++++++++------- .../pages/package/folder/index.blade.php | 2 +- .../pages/package/group/index.blade.php | 2 +- .../pages/package/network/index.blade.php | 2 +- .../package/version/datatable/modal.blade.php | 69 ++++ .../pages/package/version/index.blade.php | 28 +- routes/administrator.php | 2 +- vite.config.js | 372 ++++++++---------- yarn.lock | 5 + 22 files changed, 1047 insertions(+), 379 deletions(-) create mode 100644 resources/css/components/micromodal.css create mode 100644 resources/js/components/micromodal.js create mode 100644 resources/views/administrator/pages/package/version/datatable/modal.blade.php diff --git a/app/Http/Controllers/admin/LoginController.php b/app/Http/Controllers/admin/LoginController.php index ba7a2c4..9705a34 100644 --- a/app/Http/Controllers/admin/LoginController.php +++ b/app/Http/Controllers/admin/LoginController.php @@ -13,7 +13,7 @@ class LoginController extends Controller // public function index() { - return view("administrator.pages.s.auth.login"); + return view("administrator.pages.auth.login"); } public function store(Request $request) { diff --git a/app/Http/Controllers/admin/MainController.php b/app/Http/Controllers/admin/MainController.php index 72020e6..9b9a389 100644 --- a/app/Http/Controllers/admin/MainController.php +++ b/app/Http/Controllers/admin/MainController.php @@ -147,7 +147,7 @@ class MainController extends Controller ); $title = 'System Activity Log'; - return view('administrator.pages.s.log', compact('title', 'logs')); + return view('administrator.pages.log', compact('title', 'logs')); } public function ClearCache() diff --git a/app/Http/Controllers/admin/SettingController.php b/app/Http/Controllers/admin/SettingController.php index c0c1d02..43a5aa5 100644 --- a/app/Http/Controllers/admin/SettingController.php +++ b/app/Http/Controllers/admin/SettingController.php @@ -23,14 +23,14 @@ class SettingController extends Controller { $title = 'General Setting'; - return view('administrator.pages.setting', compact('title')); + return view('administrator.pagesetting', compact('title')); } public function smtp() { $title = 'SMTP Setting'; - return view('administrator.pages.smtp', compact('title')); + return view('administrator.pagesmtp', compact('title')); } public function store(Request $request) diff --git a/app/Http/Controllers/admin/SupportController.php b/app/Http/Controllers/admin/SupportController.php index d2da05b..8e9dd28 100644 --- a/app/Http/Controllers/admin/SupportController.php +++ b/app/Http/Controllers/admin/SupportController.php @@ -23,7 +23,7 @@ class SupportController extends Controller $tickets = $this->ticketRepository->filter($request->merge(['page' => $request->get('1') ?? 1])->all()); $title = "All Support Ticket"; - return view('administrator.pages.support.index', compact('title', 'tickets')); + return view('administrator.pagesupport.index', compact('title', 'tickets')); } public function edit(int $ticket_num = 0) @@ -40,7 +40,7 @@ class SupportController extends Controller $title = "Ticket #" . $ticket_num; - return view("administrator.pages.support.view", compact('title', 'ticket')); + return view("administrator.pagesupport.view", compact('title', 'ticket')); } public function reply(int $id = 0, TicketReplyRequest $request) diff --git a/app/Http/Controllers/admin/package/Network.php b/app/Http/Controllers/admin/package/Network.php index 928d8e1..4d0036e 100644 --- a/app/Http/Controllers/admin/package/Network.php +++ b/app/Http/Controllers/admin/package/Network.php @@ -43,7 +43,7 @@ class Network extends Controller { $title = 'Add Network'; - return view('administrator.pages.s.package.network.add', compact('title')); + return view('administrator.pages.package.network.add', compact('title')); } public function store(NetworkRequest $request) { diff --git a/app/Http/Controllers/admin/package/OsVersion.php b/app/Http/Controllers/admin/package/OsVersion.php index fb95fdc..cd14c29 100644 --- a/app/Http/Controllers/admin/package/OsVersion.php +++ b/app/Http/Controllers/admin/package/OsVersion.php @@ -42,8 +42,7 @@ class OsVersion extends Controller { $validatedData = $request->validated(); - // Remove unnecessary fields - unset($validatedData['vcenter_id'], $validatedData['module_datacenter_id']); + unset($validatedData['module_datacenter_id']); DB::beginTransaction(); try { @@ -88,22 +87,21 @@ class OsVersion extends Controller } return redirect()->route('package.version.index')->with('success', 'Update successfully'); } - public function destroy(Request $request) + public function destroy($id) { - $validator = Validator::make($request->all(), [ - 'oid' => 'numeric' - ]); - if ($validator->fails()) { - return back()->withErrors($validator->getMessageBag()); - } + try { + $version = $this->osRepository->find($id); + if (!$version) { + return back()->withErrors('Can\'t find version os by ID #' . $id); + } - $version = Os::find($request->oid); - if (! $version) { - return back()->withErrors('Can\'t find version os by ID #' . $request->oid); - } - $version->delete(); + $version->delete(); - return back()->with('success', 'Delete success'); + return redirect()->route('package.version.index') + ->with('success', 'OS Version deleted successfully'); + } catch (\Exception $error) { + return back()->withErrors('Failed to delete OS Version: ' . $error->getMessage()); + } } public function datatable(Request $request) @@ -124,10 +122,18 @@ class OsVersion extends Controller return $d->getStatus(); }) ->addColumn('action', function ($d) { - return ' - Edit + $editBtn = ' + '; + + $deleteBtn = ''; + + return '
' . $editBtn . $deleteBtn . '
'; }) ->filterColumn('host', function ($query, $keyword) { $query->whereHas('host', function ($q) use ($keyword) { diff --git a/app/Http/Requests/Package/OsVersionRequest.php b/app/Http/Requests/Package/OsVersionRequest.php index 75f9c46..ad4a661 100644 --- a/app/Http/Requests/Package/OsVersionRequest.php +++ b/app/Http/Requests/Package/OsVersionRequest.php @@ -23,9 +23,7 @@ class OsVersionRequest extends FormRequest { return [ 'version' => 'required', - 'module_host_id' => 'required', 'os_group_id' => 'required', - 'os_id' => 'required', 'template_id' => 'nullable', 'status' => 'required' ]; diff --git a/app/Models/Os.php b/app/Models/Os.php index 2ae2732..5db5ac7 100644 --- a/app/Models/Os.php +++ b/app/Models/Os.php @@ -13,11 +13,8 @@ class Os extends Model protected $fillable = [ 'version', - 'os_id', - 'module_host_id', 'os_group_id', 'template_id', - 'vcenter_id', 'status' ]; diff --git a/package.json b/package.json index 61cf035..f235647 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "animate.css": "^4.1.1", "flyonui": "^2.1.0", "laravel-echo": "^1.16.1", + "micromodal": "^0.6.1", "socket.io-client": "^4.7.5" } } diff --git a/resources/css/components/micromodal.css b/resources/css/components/micromodal.css new file mode 100644 index 0000000..a99993d --- /dev/null +++ b/resources/css/components/micromodal.css @@ -0,0 +1,241 @@ +/* MicroModal Global Styles */ +.modal { + display: none; +} + +.modal.is-open { + display: block; +} + +.modal__overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + display: flex; + justify-content: center; + align-items: center; + z-index: 1050; + backdrop-filter: blur(2px); +} + +.modal__container { + background-color: #fff; + border-radius: 0.75rem; + max-height: 90vh; + overflow-y: auto; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); + position: relative; + margin: 1rem; +} + +/* Modal Sizes */ +.modal--xs { + max-width: 300px; + width: 90%; +} + +.modal--sm { + max-width: 400px; + width: 90%; +} + +.modal--md { + max-width: 600px; + width: 90%; +} + +.modal--lg { + max-width: 800px; + width: 90%; +} + +.modal--xl { + max-width: 1000px; + width: 90%; +} + +/* Modal Header */ +.modal__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 1.25rem; + color: white; +} + +.modal__title { + margin: 0; + font-size: 1.1rem; + font-weight: 600; + display: flex; + align-items: center; +} + +.modal__close { + background: transparent; + border: none; + color: inherit; + cursor: pointer; + padding: 0.5rem; + border-radius: 0.375rem; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; +} + + +.modal__close:focus { + outline: 2px solid rgba(255, 255, 255, 0.5); + outline-offset: 2px; +} + +/* Modal Content */ +.modal__content { + padding: 1.5rem; + max-height: 60vh; + overflow-y: auto; +} + +.modal__content::-webkit-scrollbar { + width: 6px; +} + +.modal__content::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 3px; +} + +.modal__content::-webkit-scrollbar-thumb { + background: #c1c1c1; + border-radius: 3px; +} + +.modal__content::-webkit-scrollbar-thumb:hover { + background: #a1a1a1; +} + +/* Modal Footer */ +.modal__footer { + padding: 1rem 1.25rem; + border-top: 1px solid #dee2e6; + background-color: #f8f9fa; + border-radius: 0 0 0.75rem 0.75rem; + display: flex; + justify-content: flex-end; + gap: 0.5rem; +} + +.modal__footer.justify-content-center { + justify-content: center; +} + +.modal__footer.justify-content-start { + justify-content: flex-start; +} + +/* Animations */ +.micromodal-slide { + display: none; +} + +.micromodal-slide.is-open { + display: block; +} + +.micromodal-slide .modal__overlay { + animation: mmfadeIn 0.3s cubic-bezier(0.0, 0.0, 0.2, 1); +} + +.micromodal-slide .modal__container { + animation: mmslideIn 0.3s cubic-bezier(0, 0, 0.2, 1); +} + +.micromodal-slide.is-closing .modal__overlay { + animation: mmfadeOut 0.3s cubic-bezier(0.0, 0.0, 0.2, 1); +} + +.micromodal-slide.is-closing .modal__container { + animation: mmslideOut 0.3s cubic-bezier(0, 0, 0.2, 1); +} + +/* Keyframes */ +@keyframes mmfadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes mmfadeOut { + from { opacity: 1; } + to { opacity: 0; } +} + +@keyframes mmslideIn { + from { + transform: translateY(-15%) scale(0.95); + opacity: 0; + } + to { + transform: translateY(0) scale(1); + opacity: 1; + } +} + +@keyframes mmslideOut { + from { + transform: translateY(0) scale(1); + opacity: 1; + } + to { + transform: translateY(-15%) scale(0.95); + opacity: 0; + } +} + +/* Responsive */ +@media (max-width: 768px) { + .modal__container { + margin: 0.5rem; + max-height: 95vh; + } + + .modal__header { + padding: 0.75rem 1rem; + } + + .modal__content { + padding: 1rem; + } + + .modal__footer { + padding: 0.75rem 1rem; + flex-direction: column; + } + + .modal__footer .btn { + width: 100%; + margin-bottom: 0.5rem; + } + + .modal__footer .btn:last-child { + margin-bottom: 0; + } +} + +/* Dark mode support */ +@media (prefers-color-scheme: dark) { + .modal__container { + background-color: #2d3748; + color: #f7fafc;; + } + + .modal__footer { + background-color: #1a202c; + border-color: #4a5568; + } +} \ No newline at end of file diff --git a/resources/js/bootstrap-vite.js b/resources/js/bootstrap-vite.js index b056587..57d2e7f 100644 --- a/resources/js/bootstrap-vite.js +++ b/resources/js/bootstrap-vite.js @@ -6,6 +6,10 @@ window.axios = axios; window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; +// Import MicroModal +import MicroModal from 'micromodal'; +window.MicroModal = MicroModal; + import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; diff --git a/resources/js/components/micromodal.js b/resources/js/components/micromodal.js new file mode 100644 index 0000000..039c895 --- /dev/null +++ b/resources/js/components/micromodal.js @@ -0,0 +1,300 @@ +/** + * MicroModal Global Utilities + * Provides helper functions for MicroModal management + */ + +class ModalManager { + constructor() { + this.initialized = false; + this.modals = new Map(); + this.init(); + } + + /** + * Initialize MicroModal with default settings + */ + init() { + if (typeof MicroModal === 'undefined') { + console.warn('MicroModal is not loaded'); + return; + } + + if (this.initialized) { + return; + } + + MicroModal.init({ + onShow: (modal) => { + this.onModalShow(modal); + }, + onClose: (modal) => { + this.onModalClose(modal); + }, + openTrigger: 'data-micromodal-trigger', + closeTrigger: 'data-micromodal-close', + openClass: 'is-open', + disableScroll: true, + disableFocus: false, + awaitOpenAnimation: false, + awaitCloseAnimation: false, + debugMode: false + }); + + this.initialized = true; + console.log('MicroModal initialized'); + } + + /** + * Called when modal is shown + */ + onModalShow(modal) { + // Re-initialize Lucide icons when modal opens + if (typeof lucide !== 'undefined') { + lucide.createIcons(); + } + + // Add body class to prevent scrolling + document.body.classList.add('modal-open'); + + // Execute custom show callback if exists + if (modal && this.modals.has(modal.id)) { + const config = this.modals.get(modal.id); + if (config.onShow && typeof config.onShow === 'function') { + config.onShow(modal); + } + } + } + + /** + * Called when modal is closed + */ + onModalClose(modal) { + // Remove body class + document.body.classList.remove('modal-open'); + + // Execute custom close callback if exists + if (modal && this.modals.has(modal.id)) { + const config = this.modals.get(modal.id); + if (config.onClose && typeof config.onClose === 'function') { + config.onClose(modal); + } + } + } + + /** + * Show modal with optional data + */ + show(modalId, data = {}) { + if (typeof MicroModal === 'undefined') { + console.error('MicroModal is not available'); + return; + } + + // Update modal content if data is provided + if (Object.keys(data).length > 0) { + this.updateModalContent(modalId, data); + } + + MicroModal.show(modalId); + } + + /** + * Close modal + */ + close(modalId) { + if (typeof MicroModal === 'undefined') { + console.error('MicroModal is not available'); + return; + } + + MicroModal.close(modalId); + } + + /** + * Register a modal with custom configuration + */ + register(modalId, config = {}) { + this.modals.set(modalId, config); + } + + /** + * Update modal content dynamically + */ + updateModalContent(modalId, data) { + const modal = document.getElementById(modalId); + if (!modal) { + console.error(`Modal ${modalId} not found`); + return; + } + + // Update text content for elements with data-modal-* attributes + Object.keys(data).forEach(key => { + const element = modal.querySelector(`[data-modal-${key}]`); + if (element) { + if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') { + element.value = data[key]; + } else { + element.textContent = data[key]; + } + } + + // Also support getElementById for backward compatibility + const elementById = modal.querySelector(`#${key}`); + if (elementById) { + if (elementById.tagName === 'INPUT' || elementById.tagName === 'TEXTAREA') { + elementById.value = data[key]; + } else { + elementById.textContent = data[key]; + } + } + }); + + // Update form action if provided + if (data.formAction) { + const form = modal.querySelector('form'); + if (form) { + form.action = data.formAction; + } + } + } + + /** + * Create a confirmation modal dynamically + */ + showConfirmation(options = {}) { + const defaults = { + modalId: 'confirmationModal', + title: 'Confirm Action', + message: 'Are you sure?', + confirmText: 'Confirm', + cancelText: 'Cancel', + confirmClass: 'btn btn-primary btn-sm', + cancelClass: 'btn btn-outline-secondary btn-sm', + onConfirm: null, + onCancel: null + }; + + const config = { ...defaults, ...options }; + + // Create modal HTML if it doesn't exist + let modal = document.getElementById(config.modalId); + if (!modal) { + modal = this.createConfirmationModal(config); + document.body.appendChild(modal); + } else { + // Update existing modal + this.updateConfirmationModal(modal, config); + } + + // Register callbacks + this.register(config.modalId, { + onShow: () => { + const confirmBtn = modal.querySelector('.modal__confirm'); + const cancelBtn = modal.querySelector('.modal__cancel'); + + // Remove existing event listeners + confirmBtn.replaceWith(confirmBtn.cloneNode(true)); + cancelBtn.replaceWith(cancelBtn.cloneNode(true)); + + // Add new event listeners + modal.querySelector('.modal__confirm').addEventListener('click', (e) => { + if (config.onConfirm && typeof config.onConfirm === 'function') { + config.onConfirm(e); + } + this.close(config.modalId); + }); + + modal.querySelector('.modal__cancel').addEventListener('click', (e) => { + if (config.onCancel && typeof config.onCancel === 'function') { + config.onCancel(e); + } + this.close(config.modalId); + }); + } + }); + + this.show(config.modalId); + } + + /** + * Create confirmation modal HTML + */ + createConfirmationModal(config) { + const modalHtml = ` + + `; + + const div = document.createElement('div'); + div.innerHTML = modalHtml; + return div.firstElementChild; + } + + /** + * Update existing confirmation modal + */ + updateConfirmationModal(modal, config) { + modal.querySelector('.modal__title').textContent = config.title; + modal.querySelector('.modal__content p').textContent = config.message; + modal.querySelector('.modal__confirm').textContent = config.confirmText; + modal.querySelector('.modal__cancel').textContent = config.cancelText; + + // Update button classes + modal.querySelector('.modal__confirm').className = `modal__confirm ${config.confirmClass}`; + modal.querySelector('.modal__cancel').className = `modal__cancel ${config.cancelClass}`; + } +} + +// Global instance +window.ModalManager = new ModalManager(); + +// Helper functions for backward compatibility +window.showModal = (modalId, data = {}) => { + window.ModalManager.show(modalId, data); +}; + +window.closeModal = (modalId) => { + window.ModalManager.close(modalId); +}; + +window.showConfirmation = (options) => { + window.ModalManager.showConfirmation(options); +}; + +// Auto-initialize when DOM is loaded +document.addEventListener('DOMContentLoaded', function() { + // Initialize Lucide icons + if (typeof lucide !== 'undefined') { + lucide.createIcons(); + } + + console.log('Modal utilities loaded'); +}); + +// Export for ES modules +if (typeof module !== 'undefined' && module.exports) { + module.exports = ModalManager; +} \ No newline at end of file diff --git a/resources/views/administrator/layout/master.blade.php b/resources/views/administrator/layout/master.blade.php index e578edb..494e91d 100644 --- a/resources/views/administrator/layout/master.blade.php +++ b/resources/views/administrator/layout/master.blade.php @@ -44,6 +44,9 @@ @vite(['resources/sass/app.scss']) + + + @vite(['resources/css/components/micromodal.css']) @@ -77,6 +80,9 @@ @vite(['resources/js/pages/template.js']) + + + @vite(['resources/js/components/micromodal.js']) @@ -88,6 +94,16 @@ height: "100%", }); }; + + // Global ModalManager initialization + document.addEventListener('DOMContentLoaded', function() { + if (typeof ModalManager !== 'undefined') { + ModalManager.init(); + console.log('ModalManager initialized globally'); + } else { + console.warn('ModalManager not loaded'); + } + }); @include('administrator.layout.partials.toast') diff --git a/resources/views/administrator/pages/customer/info.blade.php b/resources/views/administrator/pages/customer/info.blade.php index e04bdd6..5c07928 100644 --- a/resources/views/administrator/pages/customer/info.blade.php +++ b/resources/views/administrator/pages/customer/info.blade.php @@ -13,61 +13,64 @@

Clients Information

- - - - - +
+
First Name{{ $customer->firstname }}
+ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
First Name{{ $customer->firstname }}
Last Name{{ $customer->lastname }}
Company{{ $customer->company }}
Email{{ $customer->email }}
Address{{ $customer->address }}
City{{ $customer->city }}
Country{{ $customer->country }}
Phone Number{{ $customer->phone }}
+ + + Last Name + {{ $customer->lastname }} + + + Company + {{ $customer->company }} + + + Email + {{ $customer->email }} + + + Address + {{ $customer->address }} + + + City + {{ $customer->city }} + + + Country + {{ $customer->country }} + + + Phone Number + {{ $customer->phone }} + + + +
-
- +
+ @@ -77,50 +80,61 @@

Invoices/Billing

- - - - - +
+
Invoice Paid{{ $customer->invoices_status_count_1 }} - (@money($customer->invoices_status_1) - đ) -
+ + + + - - - - - - - - - - -
Invoice Paid + {{ $customer->invoices_status_count_1 }} + (@money($customer->invoices_status_1) đ) +
Invoice UnPaid{{ $customer->invoices_status_count_0 }} - (@money($customer->invoices_status_0) - đ) -
Total@money($customer->invoices_status_0 + $customer->invoices_status_1) đ
+ + + Invoice UnPaid + + {{ $customer->invoices_status_count_0 }} + (@money($customer->invoices_status_0) đ) + + + + Total + @money($customer->invoices_status_0 + $customer->invoices_status_1) đ + + + +

Recent Emails

@if($customer->mail->count()) - - - @foreach($customer->mail->take(4)->all() as $item) - - - - @endforeach - -
- {{ $item->created_at }} - - {{ $item->subject }} -
+
+ + + @foreach($customer->mail->take(4)->all() as $item) + + + + @endforeach + +
+ +
+ {{ $item->created_at }} + {{ $item->subject }} +
+
+
+
@else -

No recent Email

+
+ +

No recent Email

+
@endif
@@ -132,26 +146,36 @@

Products/Services

- - - - - - - - - - - - - - - - - - - -
VPS/Server{{ $customer->vps_count}}
Hosting{{ $customer->hosting_count }}
Domain{{ $customer->domain_count }}
Support Tickets{{ $customer->ticket_count }}
+
+ + + + + + + + + + + + + + + + + + + +
VPS/Server + {{ $customer->vps_count}} +
Hosting + {{ $customer->hosting_count }} +
Domain + {{ $customer->domain_count }} +
Support Tickets + {{ $customer->ticket_count }} +
+
@@ -159,46 +183,58 @@

Files

@if($customer->file->count()) - - - @foreach($customer->file->all() as $item) - - - - - @endforeach - -
- {{ $item->filename }} - - -
+
+ + + @foreach($customer->file->all() as $item) + + + + + @endforeach + +
+ + + {{ $item->filename }} + + + +
+
@else -

No files uploaded

+
+ +

No files uploaded

+
@endif
-
- - Add File Add File - -
-
-
-
- - +
+ +
+
+
+
+ + +
+
+ +
- -
@@ -213,13 +249,20 @@
@else
-
Access Denied - You are not assigned to any Customer +
Access Denied - You are not assigned to any Customer management department
@endif @endsection @push('scripts') +@endpush diff --git a/resources/views/administrator/pages/package/version/index.blade.php b/resources/views/administrator/pages/package/version/index.blade.php index 8f31efb..56fbd56 100644 --- a/resources/views/administrator/pages/package/version/index.blade.php +++ b/resources/views/administrator/pages/package/version/index.blade.php @@ -17,14 +17,15 @@ @if (auth()->guard('admins')->user()->can('manager package module'))
@@ -33,12 +34,33 @@
@else
-
Access Denied - You are not assigned to any Module Package +
Access Denied - You are not assigned to any Module Package management department
@endif + + + @include('administrator.pages.package.version.datatable.modal') @endsection +@push('scripts') + +@endpush + @push('plugin-scripts') diff --git a/routes/administrator.php b/routes/administrator.php index 6fabc1f..ec433bf 100644 --- a/routes/administrator.php +++ b/routes/administrator.php @@ -9,6 +9,6 @@ Route::prefix('administrator-v2')->group(function () { Route::get('/login', function () { - return view('administrator.pages.s.auth.login'); + return view('administrator.pages.auth.login'); }); }); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index c2e56db..94c94d8 100644 --- a/vite.config.js +++ b/vite.config.js @@ -6,248 +6,219 @@ export default defineConfig({ plugins: [ laravel({ input: [ - "resources/sass/app.scss", - "resources/css/custom.css", - "resources/rtl-css/app-rtl.css", - "resources/rtl-css/custom-rtl.css", - "resources/js/app-vite.js", // Using app-vite.js - "resources/js/pages/template.js", - "resources/js/pages/ace.js", - "resources/js/pages/apexcharts.js", - "resources/js/pages/bootstrap-maxlength.js", - "resources/js/pages/chartjs.js", - "resources/js/pages/chat.js", - "resources/js/pages/color-modes.js", - "resources/js/pages/cropper.js", - "resources/js/pages/dashboard.js", - "resources/js/pages/data-table.js", - "resources/js/pages/demo.js", - "resources/js/pages/dropify.js", - "resources/js/pages/dropzone.js", - "resources/js/pages/easymde.js", - "resources/js/pages/email.js", - "resources/js/pages/flatpickr.js", - "resources/js/pages/form-validation.js", - "resources/js/pages/fullcalendar.js", - "resources/js/pages/inputmask.js", - "resources/js/pages/jquery-steps.js", - "resources/js/pages/jquery.flot.js", - "resources/js/pages/owl-carousel.js", - "resources/js/pages/peity.js", - "resources/js/pages/pickr.js", - "resources/js/pages/select2.js", - "resources/js/pages/sortablejs.js", - "resources/js/pages/sparkline.js", - "resources/js/pages/sweet-alert.js", - "resources/js/pages/tags-input.js", - "resources/js/pages/tinymce.js", - "resources/js/pages/typeahead.js", + 'resources/sass/app.scss', + 'resources/css/custom.css', + 'resources/css/components/micromodal.css', + 'resources/rtl-css/app-rtl.css', + 'resources/rtl-css/custom-rtl.css', + 'resources/js/app-vite.js', // Using app-vite.js + 'resources/js/components/micromodal.js', + 'resources/js/pages/template.js', + 'resources/js/pages/ace.js', + 'resources/js/pages/apexcharts.js', + 'resources/js/pages/bootstrap-maxlength.js', + 'resources/js/pages/chartjs.js', + 'resources/js/pages/chat.js', + 'resources/js/pages/color-modes.js', + 'resources/js/pages/cropper.js', + 'resources/js/pages/dashboard.js', + 'resources/js/pages/data-table.js', + 'resources/js/pages/demo.js', + 'resources/js/pages/dropify.js', + 'resources/js/pages/dropzone.js', + 'resources/js/pages/easymde.js', + 'resources/js/pages/email.js', + 'resources/js/pages/flatpickr.js', + 'resources/js/pages/form-validation.js', + 'resources/js/pages/fullcalendar.js', + 'resources/js/pages/inputmask.js', + 'resources/js/pages/jquery-steps.js', + 'resources/js/pages/jquery.flot.js', + 'resources/js/pages/owl-carousel.js', + 'resources/js/pages/peity.js', + 'resources/js/pages/pickr.js', + 'resources/js/pages/select2.js', + 'resources/js/pages/sortablejs.js', + 'resources/js/pages/sparkline.js', + 'resources/js/pages/sweet-alert.js', + 'resources/js/pages/tags-input.js', + 'resources/js/pages/tinymce.js', + 'resources/js/pages/typeahead.js', ], refresh: true, }), viteStaticCopy({ targets: [ { - src: "resources/images", - dest: "", + src: 'resources/images', + dest: '', }, { - src: ["node_modules/@mdi/font/*"], - dest: "plugins/@mdi", + src: ['node_modules/@mdi/font/*'], + dest: 'plugins/@mdi', }, { - src: ["node_modules/ace-builds/src-min/*"], - dest: "plugins/ace-builds", + src: ['node_modules/ace-builds/src-min/*'], + dest: 'plugins/ace-builds', }, { - src: ["node_modules/animate.css/animate.min.css"], - dest: "plugins/animate-css", + src: ['node_modules/animate.css/animate.min.css'], + dest: 'plugins/animate-css', }, { - src: ["node_modules/apexcharts/dist/apexcharts.min.js"], - dest: "plugins/apexcharts", + src: ['node_modules/apexcharts/dist/apexcharts.min.js'], + dest: 'plugins/apexcharts', + }, + { + src: ['node_modules/bootstrap/dist/js/bootstrap.bundle.min.js'], + dest: 'plugins/bootstrap', + }, + { + src: ['node_modules/bootstrap-maxlength/dist/bootstrap-maxlength.min.js'], + dest: 'plugins/bootstrap-maxlength', + }, + { + src: ['node_modules/chart.js/dist/chart.umd.js'], + dest: 'plugins/chartjs', + }, + { + src: ['node_modules/clipboard/dist/clipboard.min.js'], + dest: 'plugins/clipboard', + }, + { + src: ['node_modules/cropperjs/dist/cropper.min.js', 'node_modules/cropperjs/dist/cropper.min.css'], + dest: 'plugins/cropperjs', + }, + { + src: ['node_modules/datatables.net/js/dataTables.min.js'], + dest: 'plugins/datatables.net', }, { src: [ - "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js", + 'node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js', + 'node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css', ], - dest: "plugins/bootstrap", + dest: 'plugins/datatables.net-bs5', + }, + { + src: ['node_modules/dropify/dist/*'], + dest: 'plugins/dropify', + }, + { + src: ['node_modules/dropzone/dist/dropzone-min.js', 'node_modules/dropzone/dist/dropzone.css'], + dest: 'plugins/dropzone', + }, + { + src: ['node_modules/easymde/dist/easymde.min.js', 'node_modules/easymde/dist/easymde.min.css'], + dest: 'plugins/easymde', + }, + { + src: ['node_modules/flag-icons/css', 'node_modules/flag-icons/flags'], + dest: 'plugins/flag-icons', }, { src: [ - "node_modules/bootstrap-maxlength/dist/bootstrap-maxlength.min.js", + 'node_modules/flatpickr/dist/flatpickr.min.js', + 'node_modules/flatpickr/dist/flatpickr.min.css', ], - dest: "plugins/bootstrap-maxlength", + dest: 'plugins/flatpickr', }, { - src: ["node_modules/chart.js/dist/chart.umd.js"], - dest: "plugins/chartjs", + src: ['node_modules/fullcalendar/index.global.min.js'], + dest: 'plugins/fullcalendar', }, { - src: ["node_modules/clipboard/dist/clipboard.min.js"], - dest: "plugins/clipboard", + src: ['node_modules/inputmask/dist/jquery.inputmask.min.js'], + dest: 'plugins/inputmask', + }, + { + src: ['node_modules/jquery-mousewheel/jquery.mousewheel.js'], + dest: 'plugins/jquery-mousewheel', + }, + { + src: ['node_modules/jquery/dist/jquery.min.js'], + dest: 'plugins/jquery', }, { src: [ - "node_modules/cropperjs/dist/cropper.min.js", - "node_modules/cropperjs/dist/cropper.min.css", + 'node_modules/jquery-steps/build/jquery.steps.min.js', + 'node_modules/jquery-steps/demo/css/jquery.steps.css', ], - dest: "plugins/cropperjs", + dest: 'plugins/jquery-steps', }, { - src: ["node_modules/datatables.net/js/dataTables.min.js"], - dest: "plugins/datatables.net", + src: ['node_modules/jquery-tags-input/dist/*'], + dest: 'plugins/jquery-tags-input', + }, + { + src: ['node_modules/jquery-validation/dist/jquery.validate.min.js'], + dest: 'plugins/jquery-validation', + }, + { + src: ['node_modules/jquery.flot/*'], + dest: 'plugins/jquery.flot', + }, + { + src: ['node_modules/jquery-sparkline/jquery.sparkline.min.js'], + dest: 'plugins/jquery-sparkline', + }, + { + src: ['node_modules/lucide/dist/umd/lucide.min.js'], + dest: 'plugins/lucide', + }, + { + src: ['node_modules/moment/min/moment.min.js'], + dest: 'plugins/moment', + }, + { + src: ['node_modules/owl.carousel/dist/*'], + dest: 'plugins/owl-carousel', + }, + { + src: ['node_modules/peity/jquery.peity.min.js'], + dest: 'plugins/peity', + }, + { + src: ['node_modules/perfect-scrollbar/dist/*', 'node_modules/perfect-scrollbar/css/*'], + dest: 'plugins/perfect-scrollbar', + }, + { + src: ['node_modules/@simonwep/pickr/dist/*'], + dest: 'plugins/pickr', + }, + { + src: ['node_modules/prismjs/prism.js'], + dest: 'plugins/prismjs', + }, + { + src: ['node_modules/prism-themes/themes/prism-coldark-dark.css'], + dest: 'plugins/prism-themes', }, { src: [ - "node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js", - "node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css", + 'node_modules/select2/dist/js/select2.min.js', + 'node_modules/select2/dist/css/select2.min.css', ], - dest: "plugins/datatables.net-bs5", + dest: 'plugins/select2', }, { - src: ["node_modules/dropify/dist/*"], - dest: "plugins/dropify", + src: ['node_modules/sortablejs/Sortable.min.js'], + dest: 'plugins/sortablejs', }, { src: [ - "node_modules/dropzone/dist/dropzone-min.js", - "node_modules/dropzone/dist/dropzone.css", + 'node_modules/sweetalert2/dist/sweetalert2.min.js', + 'node_modules/sweetalert2/dist/sweetalert2.min.css', ], - dest: "plugins/dropzone", + dest: 'plugins/sweetalert2', }, { - src: [ - "node_modules/easymde/dist/easymde.min.js", - "node_modules/easymde/dist/easymde.min.css", - ], - dest: "plugins/easymde", + src: ['node_modules/tinymce/*'], + dest: 'plugins/tinymce', }, { - src: [ - "node_modules/flag-icons/css", - "node_modules/flag-icons/flags", - ], - dest: "plugins/flag-icons", - }, - { - src: [ - "node_modules/flatpickr/dist/flatpickr.min.js", - "node_modules/flatpickr/dist/flatpickr.min.css", - ], - dest: "plugins/flatpickr", - }, - { - src: ["node_modules/fullcalendar/index.global.min.js"], - dest: "plugins/fullcalendar", - }, - { - src: [ - "node_modules/inputmask/dist/jquery.inputmask.min.js", - ], - dest: "plugins/inputmask", - }, - { - src: [ - "node_modules/jquery-mousewheel/jquery.mousewheel.js", - ], - dest: "plugins/jquery-mousewheel", - }, - { - src: ["node_modules/jquery/dist/jquery.min.js"], - dest: "plugins/jquery", - }, - { - src: [ - "node_modules/jquery-steps/build/jquery.steps.min.js", - "node_modules/jquery-steps/demo/css/jquery.steps.css", - ], - dest: "plugins/jquery-steps", - }, - { - src: ["node_modules/jquery-tags-input/dist/*"], - dest: "plugins/jquery-tags-input", - }, - { - src: [ - "node_modules/jquery-validation/dist/jquery.validate.min.js", - ], - dest: "plugins/jquery-validation", - }, - { - src: ["node_modules/jquery.flot/*"], - dest: "plugins/jquery.flot", - }, - { - src: [ - "node_modules/jquery-sparkline/jquery.sparkline.min.js", - ], - dest: "plugins/jquery-sparkline", - }, - { - src: ["node_modules/lucide/dist/umd/lucide.min.js"], - dest: "plugins/lucide", - }, - { - src: ["node_modules/moment/min/moment.min.js"], - dest: "plugins/moment", - }, - { - src: ["node_modules/owl.carousel/dist/*"], - dest: "plugins/owl-carousel", - }, - { - src: ["node_modules/peity/jquery.peity.min.js"], - dest: "plugins/peity", - }, - { - src: [ - "node_modules/perfect-scrollbar/dist/*", - "node_modules/perfect-scrollbar/css/*", - ], - dest: "plugins/perfect-scrollbar", - }, - { - src: ["node_modules/@simonwep/pickr/dist/*"], - dest: "plugins/pickr", - }, - { - src: ["node_modules/prismjs/prism.js"], - dest: "plugins/prismjs", - }, - { - src: [ - "node_modules/prism-themes/themes/prism-coldark-dark.css", - ], - dest: "plugins/prism-themes", - }, - { - src: [ - "node_modules/select2/dist/js/select2.min.js", - "node_modules/select2/dist/css/select2.min.css", - ], - dest: "plugins/select2", - }, - { - src: ["node_modules/sortablejs/Sortable.min.js"], - dest: "plugins/sortablejs", - }, - { - src: [ - "node_modules/sweetalert2/dist/sweetalert2.min.js", - "node_modules/sweetalert2/dist/sweetalert2.min.css", - ], - dest: "plugins/sweetalert2", - }, - { - src: ["node_modules/tinymce/*"], - dest: "plugins/tinymce", - }, - { - src: [ - "node_modules/typeahead.js/dist/typeahead.bundle.min.js", - ], - dest: "plugins/typeahead-js", + src: ['node_modules/typeahead.js/dist/typeahead.bundle.min.js'], + dest: 'plugins/typeahead-js', }, ], }), @@ -256,13 +227,8 @@ export default defineConfig({ devSourcemap: true, preprocessorOptions: { scss: { - silenceDeprecations: [ - "mixed-decls", - "color-functions", - "global-builtin", - "import", - ], - api: "modern-compiler", + silenceDeprecations: ['mixed-decls', 'color-functions', 'global-builtin', 'import'], + api: 'modern-compiler', }, }, }, diff --git a/yarn.lock b/yarn.lock index d437a31..ed789e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4829,6 +4829,11 @@ micromatch@^4.0.2, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" +micromodal@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/micromodal/-/micromodal-0.6.1.tgz#2558c1802317a53e89f7913652a1eb8b91454738" + integrity sha512-rw1fOptxQe3XGDm9xil9hBC2ylPb1kKZyYv4FlK54R/7L+KG+D8SQxPL5L8OlEXAhBDHckeoULYxWSYU9rg/RA== + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"