Prepare modules
This commit is contained in:
73
resources/js/chat-settings-card.js
Normal file
73
resources/js/chat-settings-card.js
Normal file
@ -0,0 +1,73 @@
|
||||
import '@vuexy-admin/notifications/LivewireNotification.js';
|
||||
import FormCustomListener from '@vuexy-admin/forms/formCustomListener';
|
||||
import registerLivewireHookOnce from '@vuexy-admin/livewire/registerLivewireHookOnce';
|
||||
|
||||
// Inicializar formularios de ajustes de chat
|
||||
window.ChatSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-chat-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
chat_whatsapp_number: {
|
||||
validators: {
|
||||
callback: {
|
||||
message: 'Por favor, introduce un número de teléfono válido para México.',
|
||||
callback: function (input) {
|
||||
// Obtener el proveedor directamente dentro de la validación
|
||||
const provider = document.querySelector('#chat_provider')?.value;
|
||||
|
||||
// Validar solo si el proveedor es WhatsApp
|
||||
if (provider !== 'whatsapp') return true;
|
||||
|
||||
const cleanValue = input.value.replace(/\D/g, '');
|
||||
const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
|
||||
|
||||
return regex.test(cleanValue);
|
||||
}
|
||||
},
|
||||
notEmpty: {
|
||||
message: 'El número de teléfono es obligatorio.',
|
||||
enabled: () => {
|
||||
// Obtener el proveedor directamente dentro de la validación
|
||||
const provider = document.querySelector('#chat_provider')?.value;
|
||||
|
||||
return provider === 'whatsapp'; // Habilita solo si es WhatsApp
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
chat_whatsapp_message: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 500,
|
||||
message: 'El mensaje no puede exceder los 500 caracteres.'
|
||||
},
|
||||
notEmpty: {
|
||||
message: 'El mensaje es obligatorio.',
|
||||
enabled: () => {
|
||||
// Obtener el proveedor directamente dentro de la validación
|
||||
const provider = document.querySelector('#chat_provider')?.value;
|
||||
|
||||
return provider === 'whatsapp'; // Habilita solo si es WhatsApp
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::chat-settings', (component) => {
|
||||
ChatSettingsForm.reloadValidation();
|
||||
});
|
86
resources/js/contact-form-settings-card.js
Normal file
86
resources/js/contact-form-settings-card.js
Normal file
@ -0,0 +1,86 @@
|
||||
import '@vuexy-admin/notifications/LivewireNotification.js';
|
||||
import FormCustomListener from '@vuexy-admin/forms/formCustomListener';
|
||||
import registerLivewireHookOnce from '@vuexy-admin/livewire/registerLivewireHookOnce';
|
||||
|
||||
// Inicializar formularios de ajustes de Formularios de contacto
|
||||
window.ContactFormSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-contact-form-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
// Validación para correo electrónico de recepción
|
||||
to_email: {
|
||||
validators: {
|
||||
emailAddress: {
|
||||
message: 'Por favor, introduce un correo electrónico válido.'
|
||||
},
|
||||
notEmpty: {
|
||||
message: 'El correo electrónico es obligatorio.'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para correo electrónico con copia
|
||||
to_email_cc: {
|
||||
validators: {
|
||||
emailAddress: {
|
||||
message: 'Por favor, introduce un correo electrónico válido.'
|
||||
},
|
||||
// Validación personalizada para comparar ambos correos electrónicos
|
||||
callback: {
|
||||
message: 'Los correos electrónicos deben ser diferentes.',
|
||||
callback: function (input) {
|
||||
const email = document.querySelector('[name="to_email"]').value.trim();
|
||||
const emailCC = input.value.trim();
|
||||
|
||||
// Si ambos correos son iguales, la validación falla
|
||||
if (email === emailCC) {
|
||||
return false; // Los correos son iguales, por lo que la validación falla
|
||||
}
|
||||
|
||||
return true; // Si son diferentes, la validación pasa
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para el asunto del formulario de contacto
|
||||
subject: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 60,
|
||||
message: 'El título del correo no puede exceder los 60 caracteres.'
|
||||
},
|
||||
notEmpty: {
|
||||
message: 'El título del correo es obligatorio.'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para el mensaje de envío
|
||||
submit_message: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 250,
|
||||
message: 'El mensaje no puede exceder los 250 caracteres.'
|
||||
},
|
||||
notEmpty: {
|
||||
message: 'El mensaje de envío es obligatorio.'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::contact-form-settings', (component) => {
|
||||
ContactFormSettingsForm.reloadValidation();
|
||||
});
|
213
resources/js/contact-info-settings-card.js
Normal file
213
resources/js/contact-info-settings-card.js
Normal file
@ -0,0 +1,213 @@
|
||||
import '@vuexy-admin/notifications/LivewireNotification.js';
|
||||
import FormCustomListener from '@vuexy-admin/forms/formCustomListener';
|
||||
import registerLivewireHookOnce from '@vuexy-admin/livewire/registerLivewireHookOnce';
|
||||
|
||||
// Inicializar formularios de ajustes de información de contacto
|
||||
window.ContactInfoSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-contact-info-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
// Validación para número telefónico
|
||||
phone_number: {
|
||||
validators: {
|
||||
callback: {
|
||||
message: 'Por favor, introduce un número de teléfono válido para México.',
|
||||
callback: function (input) {
|
||||
// Si el campo está vacío, no hacemos validación
|
||||
if (input.value.trim() === '') {
|
||||
return true; // Permitir vacío
|
||||
}
|
||||
|
||||
// Si no está vacío, validamos el formato del número
|
||||
const cleanValue = input.value.replace(/\D/g, '');
|
||||
const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
|
||||
|
||||
return regex.test(cleanValue); // Valida solo si hay un número
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para extensión telefónica (opcional, pero solo si phone_number tiene valor)
|
||||
phone_number_ext: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 10,
|
||||
message: 'La extensión no debe exceder los 10 caracteres.'
|
||||
},
|
||||
callback: {
|
||||
message: 'La extensión requiere de ingresar un número telefónico.',
|
||||
callback: function (input) {
|
||||
// Obtener el valor de 'phone_number'
|
||||
const phoneNumber = document.querySelector('[name="phone_number"]')?.value.trim();
|
||||
|
||||
// Si el número telefónico tiene valor, entonces la extensión es obligatoria
|
||||
if (phoneNumber !== '') {
|
||||
// Si la extensión está vacía, la validación falla
|
||||
return true; // Permitir vacío
|
||||
}
|
||||
|
||||
// Si no se ha ingresado un número telefónico, la extensión no debe tener valor
|
||||
return input.value.trim() === '';
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para número telefónico
|
||||
phone_number_2: {
|
||||
validators: {
|
||||
callback: {
|
||||
message: 'Por favor, introduce un número de teléfono válido para México.',
|
||||
callback: function (input) {
|
||||
// Si el campo está vacío, no hacemos validación
|
||||
if (input.value.trim() === '') {
|
||||
return true; // Permitir vacío
|
||||
}
|
||||
|
||||
// Si no está vacío, validamos el formato del número
|
||||
const cleanValue = input.value.replace(/\D/g, '');
|
||||
const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
|
||||
|
||||
return regex.test(cleanValue); // Valida solo si hay un número
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para extensión telefónica (opcional, pero solo si phone_number tiene valor)
|
||||
phone_number_2_ext: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 10,
|
||||
message: 'La extensión no debe exceder los 10 caracteres.'
|
||||
},
|
||||
callback: {
|
||||
message: 'La extensión requiere de ingresar un número telefónico.',
|
||||
callback: function (input) {
|
||||
// Obtener el valor de 'phone_number'
|
||||
const phoneNumber = document.querySelector('[name="phone_number_2"]')?.value.trim();
|
||||
|
||||
// Si el número telefónico tiene valor, entonces la extensión es obligatoria
|
||||
if (phoneNumber !== '') {
|
||||
// Si la extensión está vacía, la validación falla
|
||||
return true; // Permitir vacío
|
||||
}
|
||||
|
||||
// Si no se ha ingresado un número telefónico, la extensión no debe tener valor
|
||||
return input.value.trim() === '';
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para correo electrónico de contacto (opcional)
|
||||
email: {
|
||||
validators: {
|
||||
emailAddress: {
|
||||
message: 'Por favor, introduce un correo electrónico válido.'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para horario (No obligatorio, máximo 160 caracteres)
|
||||
horario: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 160,
|
||||
message: 'El horario no puede exceder los 160 caracteres.'
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::contact-info-settings', (component) => {
|
||||
ContactInfoSettingsForm.reloadValidation();
|
||||
});
|
||||
|
||||
// Inicializar formularios de ajustes de ubicación
|
||||
window.LocationSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-location-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
// Validación para dirección (No obligatorio, máximo 160 caracteres)
|
||||
direccion: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 160,
|
||||
message: 'La dirección no puede exceder los 160 caracteres.'
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para latitud (No obligatorio, pero debe ser un número si se ingresa)
|
||||
location_lat: {
|
||||
validators: {
|
||||
numeric: {
|
||||
message: 'La latitud debe ser un número.'
|
||||
},
|
||||
callback: {
|
||||
message: 'La latitud es obligatoria si se ingresa longitud.',
|
||||
callback: function (input) {
|
||||
// Obtener el valor de longitud
|
||||
const longitude = document.querySelector('[name="location_lng"]')?.value.trim();
|
||||
|
||||
// Si longitud tiene un valor, entonces latitud es obligatorio
|
||||
if (longitude !== '') {
|
||||
return input.value.trim() !== ''; // La latitud no puede estar vacía
|
||||
}
|
||||
|
||||
return true; // Si longitud está vacío, no se valida latitud
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
// Validación para longitud (No obligatorio, pero debe ser un número si se ingresa)
|
||||
location_lng: {
|
||||
validators: {
|
||||
numeric: {
|
||||
message: 'La longitud debe ser un número.'
|
||||
},
|
||||
callback: {
|
||||
message: 'La longitud es obligatoria si se ingresa latitud.',
|
||||
callback: function (input) {
|
||||
// Obtener el valor de latitud
|
||||
const latitude = document.querySelector('[name="location_lat"]')?.value.trim();
|
||||
|
||||
// Si latitud tiene un valor, entonces longitud es obligatorio
|
||||
if (latitude !== '') {
|
||||
return input.value.trim() !== ''; // La longitud no puede estar vacía
|
||||
}
|
||||
|
||||
return true; // Si latitud está vacío, no se valida longitud
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::location-settings', (component) => {
|
||||
LocationSettingsForm.reloadValidation();
|
||||
});
|
41
resources/js/google-analytics-settings-card.js
Normal file
41
resources/js/google-analytics-settings-card.js
Normal file
@ -0,0 +1,41 @@
|
||||
import '@vuexy-admin/notifications/LivewireNotification.js';
|
||||
import FormCustomListener from '@vuexy-admin/forms/formCustomListener';
|
||||
import registerLivewireHookOnce from '@vuexy-admin/livewire/registerLivewireHookOnce';
|
||||
|
||||
// Inicializar formularios de ajustes de análisis de datos
|
||||
window.AnalyticsSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-analytics-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
google_analytics_id: {
|
||||
validators: {
|
||||
callback: {
|
||||
message: 'ID de medición de Google Analytics no tienen un formato válido.',
|
||||
callback: function (input) {
|
||||
if (document.getElementById('google_analytics_enabled').checked) {
|
||||
return input.value.trim() !== '';
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::analytics-index', (component) => {
|
||||
AnalyticsSettingsForm.reloadValidation();
|
||||
});
|
133
resources/js/website-settings-card.js
Normal file
133
resources/js/website-settings-card.js
Normal file
@ -0,0 +1,133 @@
|
||||
import '@vuexy-admin/notifications/LivewireNotification.js';
|
||||
import FormCustomListener from '@vuexy-admin/forms/formCustomListener';
|
||||
import registerLivewireHookOnce from '@vuexy-admin/livewire/registerLivewireHookOnce';
|
||||
|
||||
// Inicializar formularios de ajustes de social media
|
||||
window.SocialSettingsForm = new FormCustomListener({
|
||||
formSelector: '#website-social-settings-card',
|
||||
buttonSelectors: ['.btn-save', '.btn-cancel'],
|
||||
callbacks: [() => {}],
|
||||
dispatchOnSubmit: 'save',
|
||||
validationConfig: {
|
||||
fields: {
|
||||
social_whatsapp: {
|
||||
validators: {
|
||||
callback: {
|
||||
message: 'Por favor, introduce un número de teléfono válido para México.',
|
||||
callback: function (input) {
|
||||
// Si el campo está vacío, no hacemos validación
|
||||
if (input.value.trim() === '') {
|
||||
return true; // Permitir vacío
|
||||
}
|
||||
|
||||
// Si no está vacío, validamos el formato del número
|
||||
const cleanValue = input.value.replace(/\D/g, '');
|
||||
const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
|
||||
|
||||
return regex.test(cleanValue); // Valida solo si hay un número
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
social_whatsapp_message: {
|
||||
validators: {
|
||||
stringLength: {
|
||||
max: 500,
|
||||
message: 'El mensaje no puede exceder los 500 caracteres.'
|
||||
},
|
||||
callback: {
|
||||
message: 'El mensaje es obligatorio.',
|
||||
callback: function (input) {
|
||||
// Obtener el valor de 'social_whatsapp'
|
||||
const whatsappNumber = document.querySelector('#social_whatsapp').value.trim();
|
||||
|
||||
// Si 'social_whatsapp' tiene un valor, entonces el mensaje es obligatorio
|
||||
if (whatsappNumber !== '') {
|
||||
return input.value.trim() !== ''; // El mensaje no puede estar vacío
|
||||
}
|
||||
|
||||
return true; // Si 'social_whatsapp' está vacío, no validamos 'social_whatsapp_message'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
social_facebook: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_instagram: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_linkedin: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_tiktok: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_x_twitter: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_google: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_pinterest: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_youtube: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
},
|
||||
social_vimeo: {
|
||||
validators: {
|
||||
uri: {
|
||||
message: 'Por favor, introduce una URL válida.'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
trigger: new FormValidation.plugins.Trigger(),
|
||||
bootstrap5: new FormValidation.plugins.Bootstrap5({
|
||||
eleValidClass: '',
|
||||
rowSelector: '.fv-row',
|
||||
messageContainer: '.fv-message'
|
||||
}),
|
||||
submitButton: new FormValidation.plugins.SubmitButton(),
|
||||
autoFocus: new FormValidation.plugins.AutoFocus()
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
registerLivewireHookOnce('morphed', 'vuexy-website-admin::social-media-settings', (component) => {
|
||||
SocialSettingsForm.reloadValidation();
|
||||
});
|
29
resources/views/chat/index.blade.php
Normal file
29
resources/views/chat/index.blade.php
Normal file
@ -0,0 +1,29 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Chat')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-website-admin/resources/js/chat-settings-card.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@livewire('vuexy-website-admin::chat-settings')
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
29
resources/views/contact-form/index.blade.php
Normal file
29
resources/views/contact-form/index.blade.php
Normal file
@ -0,0 +1,29 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Formulario de Contacto')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-website-admin/resources/js/contact-form-settings-card.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@livewire('vuexy-website-admin::contact-form-settings')
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
32
resources/views/contact-info/index.blade.php
Normal file
32
resources/views/contact-info/index.blade.php
Normal file
@ -0,0 +1,32 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Información de Contacto')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-website-admin/resources/js/contact-info-settings-card.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@livewire('vuexy-website-admin::contact-info-settings')
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
@livewire('vuexy-website-admin::location-settings')
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
23
resources/views/faq/index.blade.php
Normal file
23
resources/views/faq/index.blade.php
Normal file
@ -0,0 +1,23 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Preguntas Frecuentes')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/fonts/bootstrap-icons.scss',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/js/bootstrap-table/bootstrapTableManager.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/js/forms/formConvasHelper.js',
|
||||
])
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
@livewire('vuexy-website-admin::faq-index')
|
||||
@endsection
|
20
resources/views/general-settings/index.blade.php
Normal file
20
resources/views/general-settings/index.blade.php
Normal file
@ -0,0 +1,20 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Ajustes Generales')
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-admin/resources/js/pages/admin-settings-scripts.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-lg-5">
|
||||
@livewire('vuexy-website-admin::website-description-settings')
|
||||
@livewire('vuexy-website-admin::website-favicon-settings')
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
@livewire('vuexy-website-admin::logo-on-light-bg-settings')
|
||||
@livewire('vuexy-website-admin::logo-on-dark-bg-settings')
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
29
resources/views/google-analytics/index.blade.php
Normal file
29
resources/views/google-analytics/index.blade.php
Normal file
@ -0,0 +1,29 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Google Analytics')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-website-admin/resources/js/google-analytics-settings-card.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@livewire('vuexy-website-admin::google-analytics-settings')
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
11
resources/views/images/index.blade.php
Normal file
11
resources/views/images/index.blade.php
Normal file
@ -0,0 +1,11 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Galería de Imágenes')
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-admin/resources/js/pages/admin-settings-scripts.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
@livewire('vuexy-website-admin::images-index')
|
||||
@endsection
|
7
resources/views/legal-notices/index.blade.php
Normal file
7
resources/views/legal-notices/index.blade.php
Normal file
@ -0,0 +1,7 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Avisos Legales')
|
||||
|
||||
@section('content')
|
||||
@livewire('vuexy-website-admin::legal-notices-index')
|
||||
@endsection
|
28
resources/views/legal-notices/legal-index.blade.php
Normal file
28
resources/views/legal-notices/legal-index.blade.php
Normal file
@ -0,0 +1,28 @@
|
||||
@extends('admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Avisos legales')
|
||||
|
||||
<!-- Vendor Styles -->
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'modules/Admin/Resources/assets/vendor/libs/quill/typography.scss',
|
||||
//'modules/Admin/Resources/assets/vendor/libs/quill/katex.scss',
|
||||
'modules/Admin/Resources/assets/vendor/libs/quill/editor.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
<!-- Vendor Scripts -->
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
//'modules/Admin/Resources/assets/vendor/libs/quill/katex.js',
|
||||
'modules/Admin/Resources/assets/vendor/libs/quill/quill.js'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('page-script')
|
||||
@vite('modules/Admin/Resources/js/website-settings/legal-settings-scripts.js')
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
@livewire('website-legal-settings')
|
||||
@endsection
|
7
resources/views/livewire/faq/index.blade.php
Normal file
7
resources/views/livewire/faq/index.blade.php
Normal 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>
|
12
resources/views/livewire/images/index.blade.php
Normal file
12
resources/views/livewire/images/index.blade.php
Normal 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>
|
70
resources/views/livewire/legal-notices/index.blade.php
Normal file
70
resources/views/livewire/legal-notices/index.blade.php
Normal 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>
|
22
resources/views/livewire/sitemap-manager/index.blade.php
Normal file
22
resources/views/livewire/sitemap-manager/index.blade.php
Normal 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>
|
34
resources/views/livewire/vuexy/analytics-settings.blade.php
Normal file
34
resources/views/livewire/vuexy/analytics-settings.blade.php
Normal 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>
|
58
resources/views/livewire/vuexy/chat-settings.blade.php
Normal file
58
resources/views/livewire/vuexy/chat-settings.blade.php
Normal 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>
|
@ -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>
|
@ -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>
|
34
resources/views/livewire/vuexy/location-settings.blade.php
Normal file
34
resources/views/livewire/vuexy/location-settings.blade.php
Normal 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>
|
@ -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>
|
@ -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>
|
@ -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>
|
49
resources/views/livewire/vuexy/template-settings.blade.php
Normal file
49
resources/views/livewire/vuexy/template-settings.blade.php
Normal 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>
|
@ -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>
|
@ -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>
|
7
resources/views/sitemap-manager/index.blade.php
Normal file
7
resources/views/sitemap-manager/index.blade.php
Normal file
@ -0,0 +1,7 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Mapa del Sitio')
|
||||
|
||||
@section('content')
|
||||
@livewire('vuexy-website-admin::sitemap-manager-index')
|
||||
@endsection
|
25
resources/views/social-media/index.blade.php
Normal file
25
resources/views/social-media/index.blade.php
Normal file
@ -0,0 +1,25 @@
|
||||
@extends('vuexy-admin::layouts.vuexy.layoutMaster')
|
||||
|
||||
@section('title', 'Redes Sociales')
|
||||
|
||||
@section('vendor-style')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
|
||||
])
|
||||
@endsection
|
||||
|
||||
@section('vendor-script')
|
||||
@vite([
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
|
||||
'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js',
|
||||
])
|
||||
@endsection
|
||||
|
||||
@push('page-script')
|
||||
@vite('vendor/koneko/laravel-vuexy-website-admin/resources/js/website-settings-card.js')
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
@livewire('vuexy-website-admin::social-media-settings')
|
||||
@endsection
|
Reference in New Issue
Block a user