Skip to content

Conflicts and States

Conflict customization is separate from general event rendering so products can apply a consistent warning/error treatment without replacing event content.

grid.eventScheduler = {
view: 'resourceTimeline',
weekStartDate: '2026-06-08',
customization: {
conflicts: {
className: ({ severity }) => `booking-conflict booking-conflict--${severity}`,
properties: ({ conflictTypes }) => ({
'data-conflict-types': conflictTypes.join(' '),
}),
indicator: (h, { severity }) =>
h('span', { class: 'booking-conflict__badge' }, severity === 'error' ? 'Blocked' : 'Review'),
tooltip: ({ label }) => `Planning issue: ${label}`,
},
},
};

The scheduler still adds built-in conflict classes, data attributes, and severity attributes to event blocks. Custom conflict hooks run only for conflicted segments.

Remote mode and local empty states can use product-specific wording and markup through labels, emptyStateText, and customization.emptyState.

grid.eventScheduler = {
view: 'resourceTimeline',
weekStartDate: '2026-06-08',
emptyStateText: 'No resources match this view.',
labels: {
remoteLoading: 'Loading bookings...',
remoteError: 'Bookings could not be loaded.',
remoteEmpty: 'No bookings in this range.',
},
customization: {
emptyState: {
template: ({ kind, label }) =>
kind === 'error' ? `Action needed: ${label}` : label,
properties: ({ kind }) => ({
class: `booking-scheduler-state booking-scheduler-state--${kind}`,
}),
},
},
};

The template can return a string or a DOM node. Property hooks can add classes, style variables, ARIA attributes, and data attributes to the overlay element.