feat(academy): prepare AI Academy v1 for production enablement

This commit is contained in:
2026-05-03 19:59:27 +02:00
parent 90e93f0d42
commit a3cfc6c17f
131 changed files with 60702 additions and 135850 deletions

View File

@@ -198,7 +198,14 @@ export default function DateTimePicker({
const [viewYear, setViewYear] = useState(initialDate.getFullYear())
const [viewMonth, setViewMonth] = useState(initialDate.getMonth())
const [draftDate, setDraftDate] = useState(initial.date)
const [draftTime, setDraftTime] = useState(initial.time || '12:00')
// default to current local time (HH:MM), clamped to min/max bounds when present
const nowTime = `${pad(today.getHours())}:${pad(today.getMinutes())}`
const defaultDraftTime = (function () {
const baseDate = initial.date || toISODate(initialDate)
const candidate = initial.time || nowTime
return clampTimeToBounds(baseDate, candidate, minDateTime, maxDateTime)
})()
const [draftTime, setDraftTime] = useState(defaultDraftTime)
const effectivePlaceholder = placeholder || (mode === 'date' ? 'Pick a date' : 'Pick a date and time')
const triggerRef = useRef(null)
@@ -208,7 +215,15 @@ export default function DateTimePicker({
useEffect(() => {
const next = splitDateTime(value)
setDraftDate(next.date)
setDraftTime(next.time || '12:00')
// prefer explicit time, otherwise use current time clamped to bounds for the chosen date
const fallbackTime = (() => {
const candidate = next.time || `${pad(new Date().getHours())}:${pad(new Date().getMinutes())}`
const dateForClamp = next.date || toISODate(initialDate)
return clampTimeToBounds(dateForClamp, candidate, minDateTime, maxDateTime)
})()
setDraftTime(next.time || fallbackTime)
const nextDate = parseDatePart(next.date)
if (nextDate) {
@@ -294,8 +309,9 @@ export default function DateTimePicker({
const clearValue = (event) => {
event.stopPropagation()
const now = `${pad(new Date().getHours())}:${pad(new Date().getMinutes())}`
setDraftDate('')
setDraftTime('12:00')
setDraftTime(now)
onChange?.('')
}