54 lines
5.8 KiB
JavaScript
54 lines
5.8 KiB
JavaScript
'use strict';
|
||
let heritageKind='culture',heritageData={entries:[],canEdit:false},heritageGeneration=0,heritageSelection='';
|
||
pageInfo['heritage-records']=['传承档案','记录资料来源、物品来历与交接意愿。'];
|
||
function resetHeritage(){heritageGeneration++;heritageData={entries:[],canEdit:false};heritageSelection='';$('#heritage-list').replaceChildren();$('#heritage-detail').replaceChildren();$('#heritage-detail').hidden=true;$('#heritage-error').textContent='';$('#heritage-new').hidden=true;}
|
||
async function loadHeritage(){
|
||
const generation=++heritageGeneration,kind=heritageKind;
|
||
$('#heritage-list').replaceChildren();$('#heritage-detail').hidden=true;$('#heritage-new').hidden=true;
|
||
$('#heritage-records-title').textContent=kind==='culture'?'文化与家风':'家庭物品与财产档案';
|
||
$('#heritage-error').textContent='正在读取…';
|
||
try{
|
||
const data=await api('/api/heritage');
|
||
if(generation!==heritageGeneration||activePage!=='heritage-records'||kind!==heritageKind)return;
|
||
heritageData=data;$('#heritage-error').textContent='';renderHeritageRecords();
|
||
}catch(e){if(!e.stale&&generation===heritageGeneration&&activePage==='heritage-records'){$('#heritage-error').textContent=e.message;heritageData={entries:[],canEdit:false};}}
|
||
}
|
||
function renderHeritageRecords(){
|
||
$('#heritage-new').hidden=!heritageData.canEdit;
|
||
const q=$('#heritage-search').value.trim().toLowerCase();
|
||
const rows=heritageData.entries.filter(r=>r.kind===heritageKind&&(!r.archived||$('#heritage-archived').checked)&&(!q||[r.name,r.content,r.contributor,r.ownerName,r.custodianName,r.successorName].join(' ').toLowerCase().includes(q)));
|
||
$('#heritage-list').innerHTML=rows.length?rows.map(r=>`<article class="site-card"><span class="badge">${r.archived?'已归档':r.kind==='culture'?'文化资料':'财产档案'}</span><h3><button class="device-title" data-heritage-detail="${esc(r.id)}">${esc(r.name)} ›</button></h3><p class="description">${esc((r.content||'尚未填写详细内容').slice(0,120))}</p><small>${esc(r.date||'日期待记')} · ${esc(r.contributor||r.updatedBy||'')}</small></article>`).join(''):empty('从一份档案开始','记录来历、故事与相关人员,资料仅向获授权的本家庭成员开放。');
|
||
}
|
||
function showHeritageRecord(id){
|
||
const r=heritageData.entries.find(x=>x.id===id);if(!r)return;
|
||
heritageSelection=id;const device=ZhaoDevices.catalog(state).find(d=>d.id===r.deviceId&&d.source===r.deviceSource);
|
||
const fields=[['相关日期',r.date],['讲述 / 整理',r.contributor],...(r.kind==='asset'?[['所有人 / 共有说明',r.ownerName],['保管人',r.custodianName],['意向接收人',r.successorName]]:[])];
|
||
$('#heritage-detail').hidden=false;
|
||
$('#heritage-detail').innerHTML=`<div class="section-head"><h2>${esc(r.name)}</h2>${heritageData.canEdit?`<button data-heritage-edit="${esc(r.id)}">编辑档案</button>`:''}<button class="quiet" id="heritage-detail-close">收起详情</button></div><dl>${fields.map(([k,v])=>`<div><dt>${esc(k)}</dt><dd>${esc(v||'未填写')}</dd></div>`).join('')}</dl><div class="heritage-prose">${esc(r.content||'')}</div>${r.sourceUrl?`<p><a href="${esc(r.sourceUrl)}" target="_blank" rel="noopener noreferrer">打开相关资料或报道 ↗</a></p>`:''}${device?`<button class="quiet" data-view-device="${esc(device.id)}" data-device-source="${device.source}">查看关联设备:${esc(device.name)}</button>`:''}${r.kind==='asset'?`<h3>交接意愿与说明</h3><div class="heritage-prose">${esc(r.handoverNote||'尚未记录')}</div><p class="description">档案中的交接意愿不自动改变所有权、保管安排或账号权限。</p>`:''}<p class="description">最近整理:${esc(r.updatedBy)} · ${esc(new Date(r.updatedAt).toLocaleString('zh-CN'))} · 版本 ${r.revision}</p>`;
|
||
}
|
||
function openHeritage(id){
|
||
if(!heritageData.canEdit)return;
|
||
const r=heritageData.entries.find(x=>x.id===id)||{kind:heritageKind,revision:0};
|
||
const f=$('#heritage-form');
|
||
f.elements.deviceReference.innerHTML='<option value="">不关联设备</option>'+ZhaoDevices.catalog(state).map(d=>`<option value="${d.source}:${esc(d.id)}">${esc(d.name+' · '+siteName(d.siteId))}</option>`).join('');
|
||
fillForm(f,r);f.elements.deviceReference.value=r.deviceId?r.deviceSource+':'+r.deviceId:'';
|
||
$('#heritage-form-title').textContent=r.kind==='culture'?'文化资料':'物品与财产档案';
|
||
$$('[data-heritage-asset]').forEach(el=>el.hidden=r.kind!=='asset');
|
||
$('#heritage-dialog').showModal();
|
||
}
|
||
$('#heritage-form').addEventListener('submit',async e=>{
|
||
e.preventDefault();const f=e.currentTarget,b=f.querySelector('[type=submit]');b.disabled=true;f.querySelector('.form-error').textContent='';
|
||
try{const data=formValues(f),[source,id]=(data.deviceReference||'').split(':');delete data.deviceReference;
|
||
data.revision=Number(data.revision);data.archived=f.elements.archived.checked;data.deviceSource=source||'';data.deviceId=id||'';
|
||
await api('/api/heritage',data);f.closest('dialog').close();await loadHeritage();toast('档案已保存');
|
||
}catch(e){if(!e.stale)f.querySelector('.form-error').textContent=e.message;}finally{b.disabled=false;}
|
||
});
|
||
$('#heritage-new').onclick=()=>openHeritage();$('#heritage-reload').onclick=loadHeritage;
|
||
$('#heritage-search').oninput=renderHeritageRecords;$('#heritage-archived').onchange=renderHeritageRecords;
|
||
document.addEventListener('click',e=>{const b=e.target.closest('button');if(!b)return;
|
||
if(b.dataset.heritageKind){resetHeritage();heritageKind=b.dataset.heritageKind;$('#heritage-search').value='';$('#heritage-archived').checked=false;showPage('heritage-records');}
|
||
if(b.dataset.heritageDetail)showHeritageRecord(b.dataset.heritageDetail);
|
||
if(b.dataset.heritageEdit)openHeritage(b.dataset.heritageEdit);
|
||
if(b.id==='heritage-detail-close'){$('#heritage-detail').hidden=true;heritageSelection='';}
|
||
});
|