Prepare modules

This commit is contained in:
2025-03-22 12:41:56 -06:00
parent 04f5e973d7
commit 3916c62935
74 changed files with 4431 additions and 194 deletions

View File

@ -0,0 +1,7 @@
<x-vuexy-admin::table.bootstrap.manager :tagName="$tagName" :datatableConfig="$bt_datatable">
<x-slot name="tools">
<div class="mb-4 pr-2">
<x-vuexy-admin::button.index-offcanvas :label="$singularName" :tagName="$tagName" />
</div>
</x-slot>
</x-vuexy-admin::table.bootstrap.manager>

View File

@ -0,0 +1,12 @@
<form id="css-form">
<div class="row">
<div class="col-md-6">
<div class="card">
<h5 class="card-header">Imagenes</h5>
<div class="card-body">
</div>
</div>
</div>
</div>
</form>

View File

@ -0,0 +1,70 @@
<div>
<x-vuexy-admin::form.form id="website-legal-notices-settings-card" class="form-custom-listener mb-4" wire:ignore.self>
<x-vuexy-admin::card.basic title="Avisos Legales" class="mb-2">
{{-- Selector de sección --}}
<ul class="nav nav-pills" role="tablist">
@foreach($legalVars as $key => $section)
<li class="nav-item">
<button
type="button"
class="nav-link @if($currentSection === $key) active @endif"
onclick="@this.currentSection = '{{ $key }}';"
role="tab"
data-bs-toggle="tab"
data-bs-target="#{{ $key }}-nav"
aria-controls="{{ $key }}-nav"
aria-selected="@if($currentSection === $key) true @else false @endif">
{{ $section['title'] }}
</button>
</li>
@endforeach
</ul>
<div class="tab-content">
@foreach($legalVars as $key => $section)
<div class="tab-pane fade @if($currentSection === $key) show active @endif" id="{{ $key }}-nav" role="tabpanel">
{{-- Habilitar sección --}}
<x-vuexy-admin::form.checkbox
model="legalVars.{{ $key }}.enabled"
label="Habilitar sección"
switch />
{{-- Editor de contenido --}}
<x-vuexy-admin::form.textarea
model="legalVars.{{ $key }}.content"
label="Contenido"
switch
required />
</div>
@endforeach
</div>
</x-vuexy-admin::card.basic>
{{-- Botones de acción --}}
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="loadSettings"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
{{-- Contenedor para notificaciones --}}
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,22 @@
<div>
<h2>Gestión del Sitemap</h2>
<input type="text" wire:model="newUrl" placeholder="Nueva URL">
<select wire:model="changefreq">
<option value="daily">Diario</option>
<option value="weekly">Semanal</option>
<option value="monthly">Mensual</option>
</select>
<input type="number" step="0.1" wire:model="priority" min="0.1" max="1.0">
<button wire:click="addUrl">Agregar</button>
<ul>
@foreach($urls as $url)
<li>{{ $url->url }} ({{ $url->changefreq }}, {{ $url->priority }})
<button wire:click="deleteUrl({{ $url->id }})"></button>
</li>
@endforeach
</ul>
<button wire:click="$emit('generateSitemap')">Regenerar Sitemap</button>
</div>

View File

@ -0,0 +1,34 @@
<div x-data="{ googleanalyticsEnabled: @entangle('google_analytics_enabled') }">
<x-vuexy-admin::form.form id="website-analytics-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Google Analytics" class="mb-2">
<div class="mb-6">
<a href="https://analytics.google.com/analytics/web/">https://analytics.google.com/analytics/web/</a>
</div>
<x-vuexy-admin::form.checkbox model="google_analytics_enabled" label="Habilitar Google Analytics" switch />
<x-vuexy-admin::form.input model="google_analytics_id" label="ID de medición de Google Analytics" icon="fab fa-google" placeholder="XX-12345678901" x-bind:disabled='!googleanalyticsEnabled' />
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2 waves-effect waves-light"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2 waves-effect waves-light"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,58 @@
<div x-data="{ chatProvider: @entangle('chat_provider') }">
<x-vuexy-admin::form.form id="website-chat-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Configuración del Chat" class="mb-2">
{{-- Proveedor --}}
<div class="mb-4 fv-row">
<label for="chat_provider" class="form-label">Proveedor</label>
<select id="chat_provider" name="chat_provider" x-model="chatProvider" wire:model="chat_provider" class="form-select">
<option value="">Deshabilitar Chat</option>
<option value="whatsapp">WhatsApp</option>
</select>
</div>
{{-- Configuración de WhatsApp --}}
<div x-show="chatProvider === 'whatsapp'" class="mt-5">
<h5>WhatsApp</h5>
<x-vuexy-admin::form.input
model="chat_whatsapp_number"
label="Número telefónico"
placeholder="Número telefónico"
required />
<x-vuexy-admin::form.input
model="chat_whatsapp_message"
label="Mensaje de saludo"
placeholder="Mensaje de saludo"
required />
</div>
</x-vuexy-admin::card.basic>
{{-- Botones de acción --}}
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
{{-- Contenedor para notificaciones --}}
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,33 @@
<div>
<x-vuexy-admin::form.form id="website-contact-form-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Configuración del Formulario" class="mb-2">
<x-vuexy-admin::form.input model="to_email" label="Correo principal" type="email" icon="ti ti-mail" placeholder="Email donde se enviarán los mensajes" required />
<x-vuexy-admin::form.input model="to_email_cc" label="Correo CC" type="email" icon="ti ti-mail-forward" placeholder="Email adicional para copia" helperText="Email adicional que recibirá una copia de los mensajes" />
<x-vuexy-admin::form.input model="subject" label="Asunto del correo" placeholder="Asunto predeterminado del email" required />
<x-vuexy-admin::form.textarea model="submit_message" label="Mensaje de Confirmación" placeholder="Mensaje que se mostrará al usuario cuando envíe el formulario" required />
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,41 @@
<div>
<x-vuexy-admin::form.form id="website-contact-info-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Información de contacto" class="mb-2">
<div class="row">
<x-vuexy-admin::form.input model="phone_number" label="Número telefónico" icon="ti ti-phone" placeholder="Número telefónico" parentClass="col-md-8" />
<x-vuexy-admin::form.input model="phone_number_ext" label="Extención telefónica" icon="ti ti-phone-plus" placeholder="Ext. núm." parentClass="col-md-4" />
</div>
<div class="row">
<x-vuexy-admin::form.input model="phone_number_2" label="Número telefónico alternativo" icon="ti ti-phone" placeholder="Número telefónico alternativo" parentClass="col-md-8" />
<x-vuexy-admin::form.input model="phone_number_2_ext" label="Extención telefónica²" icon="ti ti-phone-plus" placeholder="Ext. núm.²" parentClass="col-md-4" />
</div>
<x-vuexy-admin::form.input model="email" label="Correo electrónico" icon="ti ti-mail" type="email" placeholder="Correo electrónico" />
<x-vuexy-admin::form.input model="horario" label="Horario" icon="ti ti-clock" placeholder="Horario" />
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,34 @@
<div>
<x-vuexy-admin::form.form id="website-location-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Ubicación y Horarios" class="mb-2">
<x-vuexy-admin::form.input model="direccion" label="Dirección" icon="ti ti-map-pin" placeholder="Dirección" />
<div class="row">
<x-vuexy-admin::form.input type="number" step="0.00000" model="location_lat" label="Latitud" icon="ti ti-map-pin-2" placeholder="Latitud" parentClass="col-6" align="center" />
<x-vuexy-admin::form.input type="number" step="0.00000" model="location_lng" label="Longitud" icon="ti ti-map-pin-2" placeholder="Longitud" parentClass="col-6" align="center" />
</div>
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves
data-loading-text="Guardando..." />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,39 @@
<div>
<div id="logo-on-dark-bg-settings-card" class="mb-4">
<x-vuexy-admin::card.basic title="Logotipo sobre fondo oscuro" class="mb-2">
<x-vuexy-admin::form.input
type="file"
label="Logotipo sobre fondo oscuro"
model="upload_image_logo_dark"
accept="image/*" />
<div class="mb-3 text-center align-items-center">
<div class="justify-content-center align-items-center bg-slate-800 p-4">
<img src="{{ $upload_image_logo_dark ? $upload_image_logo_dark->temporaryUrl() : asset('storage/' . $website_image_logo_dark) }}">
</div>
</div>
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
variant="primary"
size="sm"
icon="ti ti-device-floppy"
disabled="{{ $upload_image_logo_dark === null }}"
label="Guardar cambios"
wire:click="save"
class="btn-save mt-2 mr-2"
waves />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
disabled="{{ $upload_image_logo_dark === null }}"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</div>
</div>

View File

@ -0,0 +1,39 @@
<div>
<div id="logo-on-light-bg-settings-card" class="mb-4">
<x-vuexy-admin::card.basic title="Logotipo sobre fondo claro" class="mb-2">
<x-vuexy-admin::form.input
type="file"
label="Logotipo sobre fondo claro"
model="upload_image_logo"
accept="image/*" />
<div class="mb-3 text-center align-items-center">
<div class="justify-content-center align-items-center bg-slate-100 p-4">
<img src="{{ $upload_image_logo ? $upload_image_logo->temporaryUrl() : asset('storage/' . $website_image_logo) }}">
</div>
</div>
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
variant="primary"
size="sm"
icon="ti ti-device-floppy"
disabled="{{ $upload_image_logo === null }}"
label="Guardar cambios"
wire:click="save"
class="btn-save mt-2 mr-2"
waves />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
disabled="{{ $upload_image_logo === null }}"
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</div>
</div>

View File

@ -0,0 +1,47 @@
<div>
<x-vuexy-admin::form.form id="website-social-settings-card" class="form-custom-listener mb-4" whitOutId whitOutMode>
<x-vuexy-admin::card.basic title="Redes sociales" class="mb-2">
<div class="row">
<div class="col-md-6">
<x-vuexy-admin::form.input model="social_whatsapp" label="WhatsApp" icon="ti ti-brand-whatsapp" placeholder="Enlace de WhatsApp" />
<x-vuexy-admin::form.input model="social_whatsapp_message" placeholder="Mensaje de saludo WhatsApp" />
<x-vuexy-admin::form.input model="social_facebook" label="Facebook" icon="ti ti-brand-facebook" placeholder="Enlace de Facebook" />
<x-vuexy-admin::form.input model="social_instagram" label="Instagram" icon="ti ti-brand-instagram" placeholder="Enlace de Instagram" />
<x-vuexy-admin::form.input model="social_linkedin" label="LinkedIn" icon="ti ti-brand-linkedin" placeholder="Enlace de LinkedIn" />
<x-vuexy-admin::form.input model="social_tiktok" label="TikTok" icon="ti ti-brand-tiktok" placeholder="Enlace de TikTok" />
</div>
<div class="col-md-6">
<x-vuexy-admin::form.input model="social_x_twitter" label="X (Twitter)" icon="ti ti-brand-twitter" placeholder="Enlace de X (Twitter)" />
<x-vuexy-admin::form.input model="social_google" label="Google" icon="ti ti-brand-google" placeholder="Enlace de Google" />
<x-vuexy-admin::form.input model="social_pinterest" label="Pinterest" icon="ti ti-brand-pinterest" placeholder="Enlace de Pinterest" />
<x-vuexy-admin::form.input model="social_youtube" label="YouTube" icon="ti ti-brand-youtube" placeholder="Enlace de YouTube" />
<x-vuexy-admin::form.input model="social_vimeo" label="Vimeo" icon="ti ti-brand-vimeo" placeholder="Enlace de Vimeo" />
</div>
</div>
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
type="submit"
variant="primary"
size="sm"
icon="ti ti-device-floppy"
data-loading-text="Guardando..."
label="Guardar cambios"
disabled
class="btn-save mt-2 mr-2"
waves />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
disabled
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</x-vuexy-admin::form.form>
</div>

View File

@ -0,0 +1,49 @@
<div>
<form id="website-template-settings-card" novalidate="novalidate">
<div class="card">
<div class="card-body">
<h5>Porto Template 12.0.0</h5>
<div class="mb-4">
<x-form.checkbox
name='website_tpl_style_switcher'
wire:model.defer='website_tpl_style_switcher'
parent_class='form-switch'>
Mostrar personalizador de estilos
</x-form.checkbox>
</div>
<div class="mb-4 fv-row">
<label for="website_tpl_footer_text" class="form-label">Titulo de pie de página</label>
<input type="text" id="website_tpl_footer_text" name="website_tpl_footer_text" wire:model='website_tpl_footer_text' class="form-control" placeholder="Titulo de pie de página">
@error("website_tpl_footer_text")
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div>
{{-- Botones --}}
<div class="row my-4">
<div class="col-lg-12 text-end">
<button
type="submit"
class="btn btn-primary btn-save btn-sm mt-2 mr-2 waves-effect waves-light"
disabled
data-loading-text="Guardando...">
<i class="ti ti-device-floppy mr-2"></i>
Guardar cambios
</button>
<button
type="button"
wire:click="loadSettings"
class="btn btn-secondary btn-cancel btn-sm mt-2 mr-2 waves-effect waves-light"
disabled>
<i class="ti ti-rotate-2 mr-2"></i>
Cancelar
</button>
</div>
</div>
{{-- Notifications --}}
<div class="notification-container" wire:ignore></div>
</div>
</form>
</div>

View File

@ -0,0 +1,31 @@
<div>
<div id="website-description-settings-card" class="form-custom-listener mb-4">
<x-vuexy-admin::card.basic title="Datos de la aplicación" class="mb-2">
<x-vuexy-admin::form.input model="title" label="Titulo del sitio web" />
<x-vuexy-admin::form.textarea model="description" label="Descripción del sitio web" />
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
disabled
wire:click="save"
class="btn-save mt-2 mr-2"
waves />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
disabled
label="Cancelar"
wire:click="resetForm"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</div>
</div>

View File

@ -0,0 +1,84 @@
<div>
<div id="website-favicon-settings-card" class="mb-4">
<x-vuexy-admin::card.basic title="Favicon" class="mb-2">
<x-vuexy-admin::form.input
type="file"
label="Icono de navegador"
model="upload_image_favicon"
accept="image/*" />
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-16x16 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_16x16) }}">
</div>
<span class="text-muted mt-1">Navegadores web (16x16)</span>
</div>
</div>
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-76x76 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_76x76) }}">
</div>
<span class="text-muted mt-1">iPad sin Retina (76x76)</span>
</div>
</div>
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-120x120 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_120x120) }}">
</div>
<span class="text-muted mt-1">iPhone (120x120)</span>
</div>
</div>
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-152x152 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_152x152) }}">
</div>
<span class="text-muted mt-1">iPad (152x152)</span>
</div>
</div>
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-180x180 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_180x180) }}">
</div>
<span class="text-muted mt-1">iPhone con Retina HD (180x180)</span>
</div>
</div>
<div class="text-center flex flex-col items-center">
<div class="mb-3 text-center d-flex flex-column align-items-center">
<div class="image-wrapper-192x192 d-flex justify-content-center align-items-center">
<img src="{{ $upload_image_favicon ? $upload_image_favicon->temporaryUrl() : asset('storage/' . $website_favicon_192x192) }}">
</div>
<span class="text-muted mt-1">Android y otros dispositivos móviles (192x192)</span>
</div>
</div>
</div>
</x-vuexy-admin::card.basic>
<div class="row">
<div class="col-lg-12 text-end">
<x-vuexy-admin::button.basic
variant="primary"
size="sm"
icon="ti ti-device-floppy"
label="Guardar cambios"
wire:click="save"
:disabled="$upload_image_favicon === null"
class="btn-save mt-2 mr-2"
waves />
<x-vuexy-admin::button.basic
variant="secondary"
size="sm"
icon="ti ti-rotate-2"
label="Cancelar"
wire:click="resetForm"
:disabled="$upload_image_favicon === null"
class="btn-cancel mt-2 mr-2"
waves />
</div>
</div>
<div class="notification-container pt-4" wire:ignore></div>
</div>
</div>