Testing Alpha

This commit is contained in:
2025-05-11 14:14:50 -06:00
parent 988b86a33d
commit a7002701f5
1903 changed files with 77534 additions and 36485 deletions

View File

@ -3,16 +3,12 @@
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
@foreach ($vuexyBreadcrumbs as $breadcrumb)
<li class="breadcrumb-item {{ isset($breadcrumb['active']) && $breadcrumb['active']? 'active': '' }}">
@php
if(isset($breadcrumb['route']) && isset($breadcrumb['link']) == false)
$breadcrumb['link'] = route($breadcrumb['route']);
@endphp
@isset($breadcrumb['link'])
<li class="breadcrumb-item {{ $breadcrumb['active'] ? 'active' : '' }}">
@if(!$breadcrumb['active'] && isset($breadcrumb['link']))
<a href="{{ $breadcrumb['link'] }}">{{ $breadcrumb['name'] }}</a>
@else
{{ $breadcrumb['name'] }}
@endisset
@endif
</li>
@endforeach
</ol>

View File

@ -0,0 +1,36 @@
@php
$meta = $item['_meta'] ?? [];
$slug = $item['_slug'] ?? null;
$icon = $meta['icon'] ?? $item['icon'] ?? null;
$count = $meta['count'] ?? 0;
$url = $item['url'] ?? 'javascript:void(0);';
$label = $meta['label'] ?? $label;
$badge = $meta['badge'] ?? null;
$target = isset($item['target']) ? 'target="'.$item['target'].'"' : '';
$active = $meta['active'] ?? false;
$hasSubmenu = isset($item['submenu']) && is_array($item['submenu']);
$autoId = $meta['auto_id'] ?? null;
$classes = 'menu-item' . ($active ? ' active' : '');
$linkClass = 'menu-link' . ($hasSubmenu ? ' menu-toggle' : '');
@endphp
<li class="{{ $classes }}">
<a href="{{ $url }}" class="{{ $linkClass }}" {!! $target !!}>
@isset($icon)
<i class="menu-icon tf-icons {{ $icon }}"></i>
@endisset
<div>{{ $label }}</div>
@isset($badge)
<div class="badge bg-{{ $badge['level'] ?? 'secondary' }} rounded-pill ms-auto">{{ $badge['label'] ?? '' }}</div>
@endisset
</a>
@if ($hasSubmenu)
<ul class="menu-sub">
@foreach ($item['submenu'] as $subLabel => $subItem)
@include('vuexy-admin::layouts.vuexy.sections.menu._item', ['label' => $subLabel, 'item' => $subItem])
@endforeach
</ul>
@endif
</li>

View File

@ -2,27 +2,12 @@
$configData = Helper::appClasses();
@endphp
<!-- Horizontal Menu -->
<aside id="layout-menu" class="layout-menu-horizontal menu-horizontal menu bg-menu-theme flex-grow-0">
<div class="{{$containerNav}} d-flex h-100">
<div class="{{ $containerNav }} d-flex h-100">
<ul class="menu-inner pb-2 pb-xl-0">
@foreach ($vuexyMenu as $menuName => $menu)
<li class="menu-item {{ isset($menu['active']) && $menu['active'] ? 'active' : '' }}">
<a href="{{ $menu['url'] ?? 'javascript:void(0);' }}" class="menu-link {{ isset($menu['submenu']) ? 'menu-toggle' : '' }}" @if (isset($menu['target']) and !empty($menu['target'])) target="{{ $menu['target'] }}" @endif>
@isset($menu['icon'])
<i class="{{ $menu['icon'] }}"></i>
@endisset
<div>{{ $menuName }}</div>
@isset($menu['badge'])
<div class="badge bg-{{ $menu['badge'][0] }} rounded-pill ms-auto">{{ $menu['badge'][1] }}</div>
@endisset
</a>
@isset($menu['submenu'])
@include('vuexy-admin::layouts.vuexy.sections.menu.submenu', ['menu' => $menu['submenu']])
@endisset
</li>
@foreach ($vuexyMenu as $label => $menu)
@include('vuexy-admin::layouts.vuexy.sections.menu._item', ['label' => $label, 'item' => $menu])
@endforeach
</ul>
</div>
</aside>
<!--/ Horizontal Menu -->

View File

@ -3,7 +3,7 @@
<li class="menu-item {{ isset($submenu['active']) && $submenu['active'] ? 'active open' : '' }}">
<a href="{{ $submenu['url'] ?? 'javascript:void(0);' }}" class="menu-link {{ isset($submenu['submenu']) ? 'menu-toggle' : '' }}" @if (isset($submenu['target']) and !empty($submenu['target'])) target="{{ $submenu['target'] }}" @endif>
@isset($submenu['icon'])
<i class="{{ $submenu['icon'] }}"></i>
<i class="menu-icon tf-icons {{ $submenu['icon'] }}"></i>
@endisset
<div>{{ $submenuName }}</div>
@isset($submenu['badge'])

View File

@ -7,7 +7,7 @@
<!-- ! Hide app brand if navbar-full -->
@if(!isset($navbarFull))
<div class="app-brand demo">
<a href="{{ route('admin.core.home.index') }}" class="app-brand-link">
<a href="{{ route('admin.core.pages.home.index') }}" class="app-brand-link">
<span class="app-brand-logo demo">
<img src="{{ asset('storage/' . $_admin['image_logo']['small']) }}" alt="{{ $_admin['app_name'] }}" />
</span>
@ -33,7 +33,7 @@
<li class="menu-item {{ isset($menu['active']) && $menu['active'] ? 'active open' : '' }}">
<a href="{{ $menu['url'] ?? 'javascript:void(0);' }}" class="menu-link {{ isset($menu['submenu']) ? 'menu-link menu-toggle' : 'menu-link' }}" @if (isset($menu['target']) and !empty($menu['target'])) target="{{ $menu['target'] }}" @endif>
@isset($menu['icon'])
<i class="{{ $menu['icon'] }}"></i>
<i class="menu-icon tf-icons {{ $menu['icon'] }}"></i>
@endisset
<div>{{ $menuName }}</div>
@isset($menu['badge'])

View File

@ -17,7 +17,7 @@ $navbarDetached = ($navbarDetached ?? '');
<!-- Brand demo (display only for navbar-full and hide on below xl) -->
@if(isset($navbarFull))
<div class="navbar-brand app-brand demo d-none d-xl-flex py-0 me-4">
<a href="{{ route('admin.core.home.index') }}" class="app-brand-link">
<a href="{{ route('admin.core.pages.home.index') }}" class="app-brand-link">
<span class="app-brand-logo demo">
<img src="{{ asset('storage/' . $_admin['image_logo']['small']) }}" alt="{{ $_admin['app_name'] }}" />
</span>
@ -43,31 +43,69 @@ $navbarDetached = ($navbarDetached ?? '');
<div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse">
@if(!isset($menuHorizontal))
<!-- Search -->
@if ($vuexySearch)
<div class="navbar-nav align-items-center">
<div class="nav-item navbar-search-wrapper mb-0">
<a class="nav-item nav-link search-toggler d-flex align-items-center px-0" href="javascript:void(0);">
<i class="ti ti-search ti-md me-2 me-lg-4 ti-lg"></i>
<span class="d-none d-md-inline-block text-muted fw-normal">Buscar (Ctrl+/)</span>
</a>
</div>
<div class="navbar-nav align-items-center">
<div class="nav-item navbar-search-wrapper mb-0">
<a class="nav-item nav-link search-toggler d-flex align-items-center px-0" href="javascript:void(0);">
<i class="ti ti-search ti-md me-2 me-lg-4 ti-lg"></i>
<span class="d-none d-md-inline-block text-muted fw-normal">Buscar (Ctrl+/)</span>
</a>
</div>
@endif
</div>
<!-- /Search -->
@endif
<ul class="navbar-nav flex-row align-items-center ms-auto">
@if(isset($menuHorizontal))
<!-- Search -->
@if ($vuexySearch)
<li class="nav-item navbar-search-wrapper">
<a class="nav-link btn btn-text-secondary btn-icon rounded-pill search-toggler" href="javascript:void(0);">
<i class="ti ti-search ti-md"></i>
</a>
</li>
@endif
<li class="nav-item navbar-search-wrapper">
<a class="nav-link btn btn-text-secondary btn-icon rounded-pill search-toggler" href="javascript:void(0);">
<i class="ti ti-search ti-md"></i>
</a>
</li>
<!-- /Search -->
@endif
<!-- Language -->
<li class="nav-item dropdown-language dropdown">
<a class="nav-link btn btn-text-secondary btn-icon rounded-pill dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown">
<i class='ti ti-language rounded-circle ti-md'></i>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item pr-2 {{ app()->getLocale() === 'es' ? 'active' : '' }}" href="{{url('lang/es')}}" data-language="es" data-text-direction="ltr">
<img src="{{ asset('vendor/vuexy-admin/flag-icons/flags/1x1/mx.svg') }}" style="height:16px" class="inline" alt="">
<span class="ml-1">Español México</span>
</a>
</li>
<li>
<li>
<a class="dropdown-item {{ app()->getLocale() === 'co' ? 'active' : '' }}" href="{{url('lang/co')}}" data-language="co" data-text-direction="ltr">
<img src="{{ asset('vendor/vuexy-admin/flag-icons/flags/1x1/co.svg') }}" style="height:16px" class="inline" alt="">
<span class="ml-1">Español Colombia</span>
</a>
</li>
<li>
<a class="dropdown-item {{ app()->getLocale() === 'en' ? 'active' : '' }}" href="{{url('lang/en')}}" data-language="en" data-text-direction="ltr">
<img src="{{ asset('vendor/vuexy-admin/flag-icons/flags/1x1/us.svg') }}" style="height:16px" class="inline" alt="">
<span class="ml-1">English</span>
</a>
</li>
<li>
<a class="dropdown-item {{ app()->getLocale() === 'fr' ? 'active' : '' }}" href="{{url('lang/fr')}}" data-language="fr" data-text-direction="ltr">
<img src="{{ asset('vendor/vuexy-admin/flag-icons/flags/1x1/fr.svg') }}" style="height:16px" class="inline" alt="">
<span class="ml-1">French</span>
</a>
</li>
<li>
<a class="dropdown-item {{ app()->getLocale() === 'de' ? 'active' : '' }}" href="{{url('lang/de')}}" data-language="de" data-text-direction="ltr">
<img src="{{ asset('vendor/vuexy-admin/flag-icons/flags/1x1/de.svg') }}" style="height:16px" class="inline" alt="">
<span class="ml-1">German</span>
</a>
</li>
</ul>
</li>
<!--/ Language -->
@if($configData['hasCustomizer'] == true)
<!-- Style Switcher -->
<li class="nav-item dropdown-style-switcher dropdown">
@ -96,57 +134,23 @@ $navbarDetached = ($navbarDetached ?? '');
@endif
<!-- Quick links -->
@if ($vuexyQuickLinks)
<li class="nav-item dropdown-shortcuts navbar-dropdown dropdown">
<a class="nav-link btn btn-text-secondary btn-icon rounded-pill btn-icon dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
<i class='ti ti-layout-grid-add ti-md'></i>
</a>
<div class="dropdown-menu dropdown-menu-end p-0">
<div class="dropdown-menu-header border-bottom">
<div class="dropdown-header d-flex align-items-center py-3">
<h6 class="mb-0 me-auto">Atajos</h6>
@if($vuexyQuickLinks['current_page_in_list'])
<a href="javascript:void(0)" class="btn btn-text-secondary rounded-pill btn-icon dropdown-shortcuts-remove" data-bs-toggle="tooltip" data-bs-placement="top" title="Remover atajo"><i class="ti ti-trash text-heading"></i></a>
@else
@if($vuexyQuickLinks['totalLinks'] < config('vuexy.custom.maxQuickLinks'))
<a href="javascript:void(0)" class="btn btn-text-secondary rounded-pill btn-icon dropdown-shortcuts-add" data-bs-toggle="tooltip" data-bs-placement="top" title="Agregar atajo"><i class="ti ti-plus text-heading"></i></a>
@endif
@endif
</div>
</div>
<div class="dropdown-shortcuts-list scrollable-container">
@foreach ($vuexyQuickLinks['rows'] as $quickLinksRow)
<div class="row row-bordered overflow-visible g-0">
@foreach ($quickLinksRow as $key => $quickLink)
<div class="dropdown-shortcuts-item col @if($quickLink['route'] === Route::currentRouteName()) active @endif">
<span class="dropdown-shortcuts-icon rounded-circle mb-3">
<i class="ti ti-{{ $quickLink['icon'] }} ti-26px text-heading"></i>
</span>
<a href="{{ $quickLink['url'] }}" class="stretched-link">{{ $quickLink['title'] }}</a>
<small>{{ $quickLink['subtitle'] }}</small>
</div>
@if ($key == 0 && !isset($quickLinksRow[1]))
<div class="dropdown-shortcuts-item col"></div>
@endif
@endforeach
</div>
@endforeach
</div>
</div>
</li>
@endif
@livewire('vuexy-admin::vuexy-quicklinks')
<!-- Quick links -->
<!-- Notification -->
{!! $vuexyNotifications !!}
@if($vuexyNotifications)
@foreach ($vuexyNotifications as $vuexyNotification)
@endforeach
@endif
<!--/ Notification -->
<!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown">
<a class="nav-link dropdown-toggle hide-arrow d-flex align-items-center" href="javascript:void(0);" data-bs-toggle="dropdown">
<a class="nav-link dropdown-toggle hide-arrow d-flex align-items-center ml-2" href="javascript:void(0);" data-bs-toggle="dropdown">
@if (Auth::check())
<div class="user-nav me-2 d-none d-sm-block">
<span class="user-name d-block text-end">{{ Auth::user()->fullname }}</span>
<span class="user-name d-block text-end">{{ Auth::user()->full_name }}</span>
<span class="user-email d-block text-end">{{ Auth::user()->email }}</span>
</div>
@endif
@ -179,14 +183,14 @@ $navbarDetached = ($navbarDetached ?? '');
@endif
@if (Auth::check())
<li>
<a class="dropdown-item" href="{{ route('admin.core.user-profile.index') }}">
<a class="dropdown-item" href="{{ route('admin.core.user.profile.index') }}">
<i class="ti ti-user-cog me-2 ti-sm"></i>
<span class="align-middle">Cuenta de usuario</span>
</a>
</li>
@endif
<li>
<a class="dropdown-item" href="{{ route('admin.core.about.index') }}">
<a class="dropdown-item" href="{{ route('admin.core.pages.about.index') }}">
<i class='ti ti-cat me-2'></i>
<span class="align-middle">Acerca de</span>
</a>
@ -218,14 +222,12 @@ $navbarDetached = ($navbarDetached ?? '');
</ul>
</div>
@if ($vuexySearch)
<!-- Search Small Screens -->
<div class="navbar-search-wrapper search-input-wrapper {{ isset($menuHorizontal) ? $containerNav : '' }} d-none">
<input type="text" class="form-control search-input {{ isset($menuHorizontal) ? '' : $containerNav }} border-0" placeholder="Buscar..." aria-label="Buscar...">
<i class="ti ti-x search-toggler cursor-pointer"></i>
</div>
<!--/ Search Small Screens -->
@endif
<!-- Search Small Screens -->
<div class="navbar-search-wrapper search-input-wrapper {{ isset($menuHorizontal) ? $containerNav : '' }} d-none">
<input type="text" class="form-control search-input {{ isset($menuHorizontal) ? '' : $containerNav }} border-0" placeholder="Search..." aria-label="Search...">
<i class="ti ti-x search-toggler cursor-pointer"></i>
</div>
<!--/ Search Small Screens -->
@if(isset($navbarDetached) && $navbarDetached == '')
</div>
@endif

View File

@ -0,0 +1,26 @@
@php
$notifications = collect([
session('vuexy_notification') ? ['channel' => 'vuexy', 'data' => session('vuexy_notification')] : null,
session('vuexy_toastr') ? ['channel' => 'toastr', 'data' => session('vuexy_toastr')] : null,
session('vuexy_notyf') ? ['channel' => 'notyf', 'data' => session('vuexy_notyf')] : null,
session('vuexy_swal') ? ['channel' => 'sweetalert', 'data' => session('vuexy_swal')] : null,
session('vuexy_pnotify') ? ['channel' => 'pnotify', 'data' => session('vuexy_pnotify')] : null,
])->filter();
@endphp
@if ($notifications->isNotEmpty())
<script>
document.addEventListener('DOMContentLoaded', async function () {
const notifications = @json($notifications);
for (const n of notifications) {
try {
const { NotifyChannelService } = await import('/build/js/notify-channel-service.js');
await NotifyChannelService.notify({ channel: n.channel, ...n.data });
} catch (e) {
console.error('❌ Error al enviar notificación por canal: ' + n.channel, e);
}
}
});
</script>
@endif

View File

@ -2,19 +2,22 @@
@vite([
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/jquery/jquery.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/popper/popper.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/toastr/toastr.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/notyf/notyf.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/js/bootstrap.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/node-waves/node-waves.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/hammer/hammer.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/typeahead-js/typeahead.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/js/menu.js',
'vendor/koneko/laravel-vuexy-admin/resources/assets/js/notifications/notify-loader.js'
])
@yield('vendor-script')
<!-- END: Page Vendor JS-->
<!-- BEGIN: Theme JS-->
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/js/main.js')
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/js/layout/main.js')
<!-- END: Theme JS-->
@vite('vendor/koneko/laravel-vuexy-admin/resources/js/app.js')

View File

@ -0,0 +1,79 @@
@php
$menuCollapsed = ($configData['menuCollapsed'] === 'layout-menu-collapsed') ? json_encode(true) : false;
@endphp
<!-- Laravel Helper Functions -->
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/js/helpers.js')
@if ($configData['hasCustomizer'])
<!--! Template customizer & Theme config files -->
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/js/template-customizer.js')
@endif
<!-- Config File -->
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/js/config.js')
<!-- Notificaciones Vuexy (alerts tipo Bootstrap) -->
@if (session('vuexy_notification'))
<script>
document.addEventListener('DOMContentLoaded', function () {
const notification = @json(session('vuexy_notification'));
if (window.vuexyNotify) {
window.vuexyNotify.flash(notification);
} else {
console.warn('⚠️ VuexyNotify no encontrado');
}
});
</script>
@endif
<!-- Notificaciones Toastr (tipo push) -->
@if (session('vuexy_toastr'))
<script>
document.addEventListener('DOMContentLoaded', function () {
const toastrData = @json(session('vuexy_toastr'));
if (window.toastr) {
toastr.options.timeOut = toastrData.delay || 5000;
toastr.options.positionClass = "toast-top-right";
toastr[toastrData.type](toastrData.message);
} else {
console.warn('⚠️ Toastr no encontrado');
}
});
</script>
@endif
@if ($configData['hasCustomizer'])
<script type="module">
window.templateCustomizer = new TemplateCustomizer({
cssPath: '',
themesPath: '',
defaultStyle: "{{ $configData['styleOpt'] }}",
defaultShowDropdownOnHover: "{{ $configData['showDropdownOnHover'] }}", // true/false (for horizontal layout only)
displayCustomizer: "{{ $configData['displayCustomizer'] }}",
lang: '{{ app()->getLocale() }}',
pathResolver: function(path) {
var resolvedPaths = {
// Core stylesheets
@foreach (['core'] as $name)
'{{ $name }}.scss': '{{ Vite::asset('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/scss'.$configData["rtlSupport"].'/'.$name.'.scss') }}',
'{{ $name }}-dark.scss': '{{ Vite::asset('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/scss'.$configData["rtlSupport"].'/'.$name.'-dark.scss') }}',
@endforeach
// Themes
@foreach (['default', 'bordered', 'semi-dark'] as $name)
'theme-{{ $name }}.scss': '{{ Vite::asset('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/scss'.$configData["rtlSupport"].'/theme-'.$name.'.scss') }}',
'theme-{{ $name }}-dark.scss': '{{ Vite::asset('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/scss'.$configData["rtlSupport"].'/theme-'.$name.'-dark.scss') }}',
@endforeach
};
return resolvedPaths[path] || path;
},
'controls': <?php echo json_encode($configData['customizerControls']); ?>,
});
</script>
@endif

View File

@ -11,7 +11,7 @@
@endif
<!-- Config File -->
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/js/config.js')
@vite('vendor/koneko/laravel-vuexy-admin/resources/assets/js/layout/config.js')
@if ($configData['hasCustomizer'])
<script type="module">

View File

@ -5,7 +5,6 @@
<link href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
@vite([
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/fonts/tabler-icons.scss',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/fonts/fontawesome.scss',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/node-waves/node-waves.scss',
])
@ -22,6 +21,7 @@
@vite([
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/typeahead-js/typeahead.scss',
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/toastr/toastr.scss',
])
@yield('vendor-style')