The UI Toolkit Date Time Picker has options for the minimum / maximum date and, on newer toolkits, a disabled-dates option; where the option is missing, the underlying date library (Bootstrap datetimepicker on the UI Toolkit, Dojo on the old control) exposes a disabled dates / days setting you can reach in the control's load event:
// Date Time Picker "Delivery" > Events > On load (BPM UI Toolkit: bootstrap-datetimepicker underneath)
var $el = $(me.context.element).find(".input-group, input").first().closest("[data-DateTimePicker], .date");
var picker = $el.data("DateTimePicker") || $(me.context.element).find("input").data("DateTimePicker");
if (picker) {
picker.daysOfWeekDisabled([0, 6]); // weekends
picker.disabledDates([moment("2025-12-25"), moment("2025-12-26"), moment("2026-01-01")]); // holidays (moment.js is bundled)
picker.minDate(moment().startOf("day")); // no past dates
}// holidays from the server: environment variable "holidays" = "2025-12-25,2025-12-26,2026-01-01" mapped into a coach variable tw.local.holidays
var list = (${HolidaysHidden}.getData() || "").split(",").filter(function (s) { return s; }).map(function (s) { return moment(s, "YYYY-MM-DD"); });
picker.disabledDates(list);Old Dojo date control (Coaches toolkit): set widget.constraints = { min: ..., max: ... } and widget.isDisabledDate = function(d) { return d.getDay() == 0 || d.getDay() == 6; } in the load event (get the widget with dijit.registry.byNode). Whatever the control does, validate again server-side (coach validation) - typed dates bypass the calendar.
References