Recetas
Ejemplos de BookingJs listos para copiar para necesidades habituales – patrones completos que combinan varios conceptos de BookingJs y son comprobables en el navegador.
Esta página reúne ejemplos completos y copiables que combinan varios conceptos de BookingJs. Puede probar y modificar directamente en el navegador los ejemplos en directo enlazados.
Personalizar las fuentes de forma global y por componente
Define una nueva fuente predeterminada para todo el widget y fuentes propias para botones y enlaces (PRO).
<div id="bookingjs" style="margin: 32px"></div>
<script type="module">
import * as timum from 'https://cdn.timum.de/bookingjs/1/booking.js';
timum.init(
{ ref: 'booking-widget-demo-resource@timum' },
{
typography: {
// Fuente predeterminada para todo el widget
fontFamily: '"Ysabeau Office", Roboto, Helvetica, Arial',
// Orígenes de las fuentes, cargados mediante <link rel="stylesheet">
fontSource: [
'https://fonts.googleapis.com/css2?family=Tangerine:wght@400;700&family=Ysabeau+Office:ital,wght@0,1..1000;1,1..1000&display=swap',
],
},
components: {
// Sobrescribir la fuente solo para los botones
MuiButton: {
styleOverrides: {
root: { fontFamily: '"Tangerine", Roboto, Helvetica, Arial' },
},
},
// Sobrescribir la fuente solo para los enlaces
MuiLink: {
styleOverrides: {
root: { fontFamily: '"Tangerine", Roboto, Helvetica, Arial' },
},
},
},
},
);
</script>
Ejemplo en directo en jsFiddle
Reserva solo para clientes invitados
Muestra BookingJs solo cuando el visitante llega mediante un enlace de invitación personal con ref e invitee. La identificación se realiza mediante pData frente a su plataforma CRM (p. ej. onOffice).
<div id="bookingjs" style="margin: 32px"></div>
<script type="module">
import * as timum from 'https://cdn.timum.de/bookingjs/1/booking.js';
// Ocultar el contenedor del widget
const hideBookingJs = () => {
const el = document.getElementById('bookingjs');
if (el) el.style.display = 'none';
};
// Leer parámetros de la URL
const url = new URL(window.location.href);
const ref = url.searchParams.get('ref');
const inviteeId = url.searchParams.get('invitee');
// Sin parámetros de invitación: no inicializar
if (!ref || !inviteeId) {
hideBookingJs();
} else {
timum.init({
ref: ref,
// Transmitir el ID de cliente para verificación mediante pData
pData: {
platform: 'onoffice',
personId: inviteeId,
},
callbacks: {
// Ocultar si no se encuentran citas reservables
fetchingBookablesSucceeded: (bookables) => {
const hasBookables = bookables && Object.values(bookables).length > 0;
if (!hasBookables) hideBookingJs();
},
fetchingBookablesFailed: () => hideBookingJs(),
},
});
}
</script>
Ocultar el widget cuando no hay citas disponibles
Oculta el contenedor cuando la consulta de citas resulta vacía o falla – por ejemplo, para mostrar en su lugar un mensaje propio.
<div id="bookingjs" style="margin: 32px"></div>
<script type="module">
import * as timum from 'https://cdn.timum.de/bookingjs/1/booking.js';
// Ocultar el contenedor del widget
const hideBookingJs = () => {
const el = document.getElementById('bookingjs');
if (el) el.style.display = 'none';
};
timum.init({
ref: 'ihre-ressourcen-referenz',
callbacks: {
// Consulta exitosa, pero sin citas
fetchingBookablesSucceeded: (bookables) => {
const hasBookables = bookables && Object.values(bookables).length > 0;
if (!hasBookables) hideBookingJs();
},
// Consulta fallida (p. ej. error del servidor)
fetchingBookablesFailed: () => hideBookingJs(),
},
});
</script>
Modo multi-recurso para la CondensedView
Muestra citas superpuestas de varios recursos codificadas por color una junto a otra – ideal cuando la cita importa más que el recurso concreto. Con un solo recurso o sin solapamientos, el modo vuelve automáticamente a la vista estándar.
import { TimumBooking } from '@timum/booking';
<TimumBooking
appConfig={{
ref: ['resource-1@provider', 'resource-2@provider'],
calendarFrontend: 'condensedView', // o detailsCondensedView
calendarFrontendOptions: {
condensedView: {
multiResourceMode: true, // Activar la vista multi-recurso
},
},
}}
/>;
Campo obligatorio personalizado con validación y traducción
Elimina los campos mobile y message, añade un campo obligatorio "Género" como campo de selección y traduce la etiqueta y el mensaje de validación (PRO).
<div id="bookingjs" style="margin: 32px"></div>
<script type="module">
import * as timum from 'https://cdn.timum.de/bookingjs/1/booking.js';
timum.init({
ref: 'booking-widget-demo-resource@timum',
fields: {
// Establecer los campos explícitamente en undefined para eliminarlos
message: undefined,
mobile: undefined,
// Campo de selección con validación obligatoria
gender: {
index: 3,
title: 'fields.gender.title',
type: 'select',
validation: timum.yup.string().required('validation.gender_field_required'),
options: [
{ key: 'm', title: 'fields.gender.male' },
{ key: 'w', title: 'fields.gender.female' },
{ key: 'd', title: 'fields.gender.other' },
],
},
},
// Necesario para transmitir los valores de campos personalizados como mensaje
sendCustomValuesInMessage: true,
localization: {
de: {
validation: { gender_field_required: 'Bitte wählen.' },
fields: {
gender: { title: 'Geschlecht', male: 'Männlich', female: 'Weiblich', other: 'Divers' },
},
},
en: {
validation: { gender_field_required: 'Please select an option.' },
fields: {
gender: { title: 'Gender', male: 'Male', female: 'Female', other: 'Others' },
},
},
},
callbacks: {
// Procesar el valor introducido en el callback
createBookingStarted: ({ data }) => {
console.log(data.gender);
},
},
});
</script>
Ejemplo en directo en jsFiddle
