bmc_hub/static/js/planning-dates.js

53 lines
3.9 KiB
JavaScript
Raw Normal View History

/* Flatpickr is already used by time tracking. Keep API values in their original ISO format. */
(() => {
'use strict';
function reset(scope) {
scope.querySelectorAll('input[data-planning-date-type]').forEach(input=>{
const type=input.dataset.planningDateType;
input._flatpickr?.destroy();input.type=type;delete input.dataset.planningDateType;
});
}
function mount(scope) {
if(typeof window.flatpickr!=='function')return;
scope.querySelectorAll('input[type="date"],input[type="datetime-local"],input[type="time"],input[data-planning-date-type]').forEach(input=>{
if(input._flatpickr){input._flatpickr.setDate(input.value,false);input._flatpickr.altInput.disabled=input.disabled;return;}
const type=input.type,withTime=type!=='date',timeOnly=type==='time';
const label=input.getAttribute('aria-label')||input.labels?.[0]?.textContent.trim()||input.closest('label')?.textContent.trim()||'Vælg dato';
input.dataset.planningDateType=type;
const instance=window.flatpickr(input,{
locale:{...window.flatpickr.l10ns.da,monthAriaLabel:'Måned',yearAriaLabel:'År',hourAriaLabel:'Time',minuteAriaLabel:'Minut'},disableMobile:true,enableTime:withTime,noCalendar:timeOnly,time_24hr:true,
minuteIncrement:5,dateFormat:timeOnly?'H:i':withTime?'Y-m-d\\TH:i':'Y-m-d',
altInput:true,altFormat:timeOnly?'H:i':withTime?'d.m.Y \\k\\l. H:i':'d.m.Y',
allowInput:false,static:!!input.closest('dialog'),monthSelectorType:'dropdown',
ariaDateFormat:'j. F Y',defaultHour:8,
onReady:(_,__,picker)=>{
picker.calendarContainer.classList.add('planning-picker');
picker.altInput.setAttribute('aria-label',label);
picker.altInput.classList.add('planning-date-input');
picker.altInput.required=input.required;picker.altInput.disabled=input.disabled;
picker.altInput.placeholder=timeOnly?'Vælg klokkeslæt':withTime?'Vælg dato og tid':'Vælg dato';
const footer=document.createElement('div');footer.className='planning-picker-footer';
const today=document.createElement('button');today.type='button';today.textContent='I dag';
today.onclick=()=>{picker.setDate(new Date(),true);if(!withTime)picker.close();};
const close=document.createElement('button');close.type='button';close.textContent='Færdig';close.onclick=()=>picker.close();
footer.append(today,close);picker.calendarContainer.append(footer);
},
});
const form=input.form;
if(form&&!form.dataset.planningDateValidation){
form.dataset.planningDateValidation='1';
form.addEventListener('submit',event=>{
const missing=[...form.querySelectorAll('input[data-planning-date-type]')].find(field=>field.required&&!field.disabled&&!field.value);
if(!missing)return;
event.preventDefault();event.stopImmediatePropagation();
let error=form.querySelector('.work-dialog-error,[role="alert"],.planning-date-error');
if(!error){error=document.createElement('p');error.className='planning-date-error text-danger';error.setAttribute('role','alert');form.append(error);}
error.textContent='Vælg en dato i de obligatoriske felter.';missing._flatpickr.open();
},true);
}
if(!input.required){const clear=document.createElement('button');clear.type='button';clear.textContent='Ryd';clear.onclick=()=>instance.clear();instance.calendarContainer.querySelector('.planning-picker-footer').prepend(clear);}
});
}
window.BMCPlanningDates={mount,reset};
})();