'use strict'; function resetFamilyEvents(purge=false){ for(const id of ['family-event-person','family-event-year','family-event-search','event-person-search'])$('#'+id).value=''; if(purge){$('#family-event-person').replaceChildren();$('#family-event-year').replaceChildren();} $('#family-event-relatives').checked=false;$('#family-event-state').value='published';$('#family-event-order').value='desc'; for(const id of ['family-timeline','event-detail-content','event-person-choices','family-event-count'])$('#'+id).replaceChildren(); } function eventStatus(e){return e.archived?'已归档':e.status==='draft'?'草稿':'已发布';} function eventPeople(e){return e.personIds.map(id=>personName(id)).join('、')||'全家记事';} function filteredFamilyEvents(){ const person=$('#family-event-person').value,year=$('#family-event-year').value,term=$('#family-event-search').value.trim().toLowerCase(); const status=family.canEdit?$('#family-event-state').value:'published',ids=new Set(person?[person]:[]); if(person&&$('#family-event-relatives').checked)for(const e of family.links.filter(e=>e.active)){if(e.fromId===person)ids.add(e.toId);if(e.toId===person)ids.add(e.fromId);} return (family.events||[]).filter(e=>(status==='all'||(status==='archived'?e.archived:!e.archived&&e.status===status))&&(!year||e.eventDate.startsWith(year+'-'))&&(!person||e.personIds.some(id=>ids.has(id)))&&[e.title,e.summary,e.body,e.sourceName].join(' ').toLowerCase().includes(term)).sort((a,b)=>($('#family-event-order').value==='asc'?1:-1)*a.eventDate.localeCompare(b.eventDate)||a.id.localeCompare(b.id)); } function renderFamilyEvents(){ setOptions($('#family-event-person'),''+peopleOptions(false)); const years=[...new Set((family.events||[]).map(e=>e.eventDate.slice(0,4)))].sort().reverse(); setOptions($('#family-event-year'),''+years.map(y=>``).join('')); $('#family-new-event').hidden=!family.canEdit;$('#family-event-state-label').hidden=!family.canEdit; $('#family-event-relatives').disabled=!$('#family-event-person').value; const events=filteredFamilyEvents();$('#family-event-count').textContent=`${events.length} 条记事`+($('#family-event-person').value?' · '+personName($('#family-event-person').value)+($('#family-event-relatives').checked?'及相关亲人':''):' · 全家'); let year=''; $('#family-timeline').innerHTML=events.map(e=>{ const next=e.eventDate.slice(0,4),heading=next!==year?`
尚无已发布的相关记事。
':'')}${esc(e.summary)}
`:''}资料来源:${esc(e.sourceName)}
`:''}最近整理:${esc(new Date(e.updatedAt).toLocaleString())}
${family.canEdit?``:''}`; $('#event-detail-dialog').showModal(); } function editFamilyEvent(id,personId=''){ if(!family.canEdit)return; const e=(family.events||[]).find(e=>e.id===id),f=$('#event-form'); fillForm(f,{...(e||{}),revision:family.revision}); $('#event-editor-title').textContent=e?'编辑家族记事':'写一则家族记事'; const selected=new Set(e?.personIds||(personId?[personId]:[])); $('#event-person-choices').innerHTML=family.people.map(p=>``).join('')||'家谱尚无人名,此条记事将记为全家记事。
'; $('#event-person-search').value='';f.querySelector('[value=published]').textContent=e?.status==='published'?'保存已发布内容':'发布记事'; initDateFields(f);if($('#event-detail-dialog').open)$('#event-detail-dialog').close();$('#event-dialog').showModal(); } $('#event-form').addEventListener('submit',async e=>{ e.preventDefault();const f=e.currentTarget,buttons=[...f.querySelectorAll('[type=submit]')];buttons.forEach(b=>b.disabled=true); try{syncDateFields(true,f);const data=formValues(f);data.revision=Number(data.revision);data.personIds=[...f.querySelectorAll('[name=personIds]:checked')].map(el=>el.value);data.archived=f.elements.archived.checked;data.status=e.submitter?.value||'draft'; const result=await api('/api/family/event',data);$('#event-dialog').close();await loadFamily();familyView='timeline';renderFamily(); $('#family-event-person').value='';$('#family-event-year').value='';$('#family-event-search').value='';$('#family-event-state').value=data.archived?'archived':data.status;renderFamilyEvents();openFamilyEvent(result.item.id);toast(data.archived?'记事已归档,可在“已归档”中恢复':data.status==='published'?'记事已发布到家族时间线':'草稿已保存'); }catch(err){f.querySelector('.form-error').textContent=err.message;}finally{buttons.forEach(b=>b.disabled=false);} }); $('#family-view-timeline').onclick=()=>{familyView='timeline';renderFamily();}; $('#family-new-event').onclick=()=>editFamilyEvent(); for(const id of ['family-event-person','family-event-year','family-event-order','family-event-relatives','family-event-state'])$('#'+id).onchange=renderFamilyEvents; $('#family-event-search').oninput=renderFamilyEvents; $('#event-person-search').oninput=()=>{const term=$('#event-person-search').value.trim().toLowerCase();$('#event-person-choices').querySelectorAll('label').forEach(l=>l.hidden=!l.textContent.toLowerCase().includes(term));}; $('#family-event-clear').onclick=()=>{resetFamilyEvents();renderFamilyEvents();}; document.addEventListener('click',e=>{ const b=e.target.closest('button');if(!b)return; if(b.dataset.viewEvent)openFamilyEvent(b.dataset.viewEvent); if(b.dataset.editEvent)editFamilyEvent(b.dataset.editEvent); if(b.dataset.newPersonEvent)editFamilyEvent('',b.dataset.newPersonEvent); if(b.dataset.personEvents)showPersonEvents(b.dataset.personEvents); if(b.dataset.eventPerson){$('#event-detail-dialog').close();selectFamilyPerson(b.dataset.eventPerson,true);} });