Files
ucvl-home-vision/web/date-fields.js
T

39 lines
2.8 KiB
JavaScript

'use strict';
function dateHint(field,strict=false){
const input=field.querySelector('[data-date-value]'),hint=field.querySelector('[data-date-hint]'),hidden=field.querySelector('input[type=hidden]');
const mode=field.querySelector('[data-calendar]').value,value=input.value.trim(),leap=field.querySelector('[data-date-leap]').checked;
field.querySelector('[data-leap-label]').hidden=mode!=='lunar';input.setCustomValidity('');
if(!value){hidden.value='';hint.textContent=input.required?'请选择事情发生的日期':'日期不详可留空';return;}
try{
const solar=mode==='solar'?(ZhaoCalendar.solarDate(value),value):ZhaoCalendar.solar(value,leap);
hidden.value=solar;
if(mode==='lunar')hint.textContent='公历 '+solar;
else{try{const l=ZhaoCalendar.lunar(solar);hint.textContent=`农历 ${l.year}年${l.leap?'闰':''}${l.month}月${l.day}日`;}catch(e){hint.textContent=e.message;}}
}catch(e){hidden.value='';input.setCustomValidity(e.message);hint.textContent=e.message;if(strict)throw e;}
}
function syncLifeStatus(){
const deceased=$('#person-form').elements.lifeStatus.value==='deceased',field=$('[data-date-field="deathDate"]');field.hidden=!deceased;
field.querySelectorAll('input,select').forEach(e=>e.disabled=!deceased);
if(!deceased)field.querySelector('[data-date-value]').setCustomValidity('');
}
function initDateFields(scope=$('#person-form')){
for(const field of scope.querySelectorAll('[data-date-field]')){
field.querySelector('[data-calendar]').value='solar';field.querySelector('[data-date-leap]').checked=false;
field.querySelector('[data-date-value]').value=field.querySelector('input[type=hidden]').value;dateHint(field);
}if(scope.id==='person-form')syncLifeStatus();
}
function syncDateFields(strict=false,scope=$('#person-form')){
if(scope.id==='person-form')syncLifeStatus();for(const field of scope.querySelectorAll('[data-date-field]'))if(!field.hidden)dateHint(field,strict);
if(scope.id==='person-form'&&$('[data-date-field="deathDate"]').hidden)scope.elements.deathDate.value='';
}
for(const field of $$('[data-date-field]')){
field.querySelector('[data-date-value]').addEventListener('input',()=>dateHint(field));
field.querySelector('[data-date-leap]').addEventListener('change',()=>dateHint(field));
field.querySelector('[data-calendar]').addEventListener('change',()=>{
const hidden=field.querySelector('input[type=hidden]'),input=field.querySelector('[data-date-value]'),mode=field.querySelector('[data-calendar]');
if(hidden.value){try{if(mode.value==='solar')input.value=hidden.value;else{const l=ZhaoCalendar.lunar(hidden.value);input.value=ZhaoCalendar.iso(l);field.querySelector('[data-date-leap]').checked=l.leap;}}catch(e){mode.value='solar';toast(e.message);}}
dateHint(field);
});
}
$('#person-form').elements.lifeStatus.addEventListener('change',syncLifeStatus);