OWL
inputs
Date Time Picker
Odoo 19 OWL component — Date Time Picker (core)
Live preview
Interactive
Source excerpt
web/static/src/core/datetime/datetime_picker.js
import { Component, onWillRender, onWillUpdateProps, useState } from "@odoo/owl";
import { _t } from "@web/core/l10n/translation";
import { MAX_VALID_DATE, MIN_VALID_DATE, clampDate, isInRange, today } from "../l10n/dates";
import { localization } from "../l10n/localization";
import { ensureArray } from "../utils/arrays";
import { TimePicker } from "@web/core/time_picker/time_picker";
import { Time } from "@web/core/l10n/time";
const { DateTime, Info } = luxon;
/**
* @typedef DateItem
* @property {string} id
* @property {boolean} includesToday
* @property {boolean} isOutOfRange
* @property {boolean} isValid
* @property {string} label
* @property {DateRange} range
* @property {string} extraClass
*
* @typedef {"today" | NullableDateTime} DateLimit
*
* @typedef {[DateTime, DateTime]} DateRange
*
* @typedef {luxon["DateTime"]["prototype"]} DateTime
*
* @typedef DateTimePickerProps
* @property {number} [focusedDateIndex=0]
* @property {boolean} [showWeekNumbers=true]
* @property {DaysOfWeekFormat} [daysOfWeekFormat="narrow"]
* @property {DateLimit} [maxDate]
* @property {PrecisionLevel} [maxPrecision="decades"]
* @property {DateLimit} [minDate]
* @property {PrecisionLevel} [minPrecision="days"]
* @property {() => any} [onReset]
* @property {(value: DateTime | DateRange, unit: "date" | "time") => any} [onSelect]
* @property {() => any} [onToggleRange]
* @property {boolean} [range]
* @property {number} [rounding=5] the rounding in minutes, pass 0 to show seconds, pass 1 to avoid
* rounding minutes without displaying seconds.
* @property {() => boolean} [showRangeToggler]
* @property {{ buttons?: any }} [slots]
* @property {"date" | "datetime"} [type]
* @property {NullableDateTime | NullableDateRange} [value]
* @property {(date: DateTime) => boolean} [isDateValid]
* @property {(date: DateTime) => string} [dayCellClass]
*
* @typedef {DateItem | MonthItem} Item
*
* @typedef MonthItem
* @property {[string, string][]} daysOfWeek
* @property {string} id
* @property {number} number
* @property {WeekItem[]} weeks
*
* @typedef {import("@web/core/l10n/dates").NullableDateTime} NullableDateTime
*
* @typedef {import("@web/core/l10n/dates").NullableDateRange} NullableDateRange
*
* @typedef PrecisionInfo
* @property {(date: DateTime, params: Partial<DateTimePickerProps>) => string} getTitle
* @property {(date: DateTime, params: Partial<DateTimePickerProps>) => Item[]} getItems
* @property {string} mainTitle
* @property {string} nextTitle
* @property {string} prevTitle
* @property {Record<string, number>} step
*
* @typedef {"days" | "months" | "years" | "decades"} PrecisionLevel
*
* @typedef {"short" | "narrow"} DaysOfWeekFormat
*
* @typedef WeekItem
* @property {DateItem[]} days
* @property {number} number
*/
/**
* @param {DateTime} date
*/
const getStartOfDecade = (date) => Math.floor(date.year / 10) * 10;
/**
* @param {DateTime} date
*/
const getStartOfCentury = (date) => Math.floor(date.year / 100) * 100;
/**
* @param {DateTime} date
*/
const getStartOfWeek = (date) => {
const { weekStart } = localization;
return date.set({ weekday: date.weekday < weekStart ? weekStart - 7 : weekStart });
};
/**
* @param {number} min
* @param {number} max
*/
const numberRange = (min, max) => [...Array(max - min)].map((_, i) => i + min);
/**
* @param {NullableDateTime | "today"} value
* @param {NullableDateTime | "today"} defaultValue
*/
const parseLimitDate = (value, defaultValue) =>
clampDate(value === "today" ? today() : value || defaultValue, MIN_VALID_DATE, MAX_VALID_DATE);
/**
* @param {Object} params
* @param {boolean} [params.isOutOfRange=false]
* @param {boolean} [params.isValid=true]
* @param {keyof DateTime} params.label
* @param {string} [params.extraClass]
* @param {[DateTime, DateTime]} params.range
* @returns {DateItem}
*/
const toDateItem = ({ isOutOfRange = false, isValid = true, label, range, extraClass }) => ({
id: range[0].toISODate(),
includesToday: isInRange(today(), range),
isOutOfRange,
Registry / API
- Registry name
DateTimePicker- Category
—- Module
web- Slug
date-time-picker- Nav group
inputs