'use strict'; pageInfo.households=['家庭与场所','家庭、办公室或工厂,分别组织,各自授权。']; const scopeKind=h=>({home:'家庭',office:'办公场所',factory:'工厂'}[h.kind||'home']||'家庭'); function renderHouseholds(){ const homes=state.households||[]; setOptions($('#household-filter'),homes.map(h=>``).join('')); $('#household-filter').value=state.familyId||''; if(activePage!=='households')return; $('#household-list').innerHTML=homes.map(h=>`
${h.id===state.familyId?'当前归属 · ':''}${scopeKind(h)}

${esc(h.name)}

${esc(h.note||'区域与设备归属独立管理')}

${!h.kind||h.kind==='home'?'一家之主':'主要负责人'}
${esc(h.ownerName||'待指定')}
备用负责人
${esc(h.successorName||'待指定')}
账号 / 空间
${h.members} 个 / ${h.sites} 处
${!h.successorId?'

尚未指定备用负责人,建议提前安排可信人员接管。

':''}
${h.canAssignOwner?``:''}
${h.leadershipHistory?.length?`
交接记录${h.leadershipHistory.slice().reverse().map(r=>`

${esc(new Date(r.at).toLocaleString())} · ${esc(r.actor)}
${esc(r.reason)}

`).join('')}
`:''}
`).join(''); } async function switchHousehold(id){ if(!isPlatformAdmin()||!id||id===state.familyId)return; const user=currentUser; // Invalidate outstanding API responses, video players and dialogs before changing scope. clearPrivateView(); householdScope=id;currentUser=user;loggedIn=true; await auth(); } function openHousehold(id){ if(!isAdmin())return; const item=(state.households||[]).find(h=>h.id===id); if(!item&&!isPlatformAdmin())return; fillForm($('#household-form'),item||{});$('#household-dialog').showModal(); } async function openLeadership(id){ try{ if(id!==state.familyId)await switchHousehold(id); const home=(state.households||[]).find(h=>h.id===id); if(!home?.canAssignOwner)return; const result=await api('/api/users'); const candidates=result.users.filter(u=>u.role==='family_admin'&&!u.disabled); const f=$('#leadership-form'),options=candidates.map(u=>``).join(''); f.elements.ownerId.innerHTML=''+options; f.elements.successorId.innerHTML=''+options; fillForm(f,{id:home.id,revision:home.leadershipRevision||0,ownerId:home.ownerId||'',successorId:home.successorId||''}); $('#leadership-dialog').showModal(); }catch(error){if(!error.stale)toast(error.message);} } $('#leadership-form').addEventListener('submit',async e=>{ e.preventDefault();const f=e.currentTarget,b=f.querySelector('[type=submit]');b.disabled=true; try{const d=formValues(f);d.revision=Number(d.revision);await api('/api/households/leadership',d);f.closest('dialog').close();await refresh();showPage('households');toast('负责人已更新,交接记录已保存');} catch(error){if(!error.stale)f.querySelector('.form-error').textContent=error.message;}finally{b.disabled=false;} }); $('#household-filter').onchange=e=>switchHousehold(e.target.value); $('#new-household').onclick=()=>openHousehold(); $('#household-form').addEventListener('submit',async e=>{ e.preventDefault();const f=e.currentTarget,b=f.querySelector('[type=submit]');b.disabled=true; try{await api('/api/households',formValues(f));f.closest('dialog').close();await refresh();toast('归属档案已保存');} catch(error){if(!error.stale)f.querySelector('.form-error').textContent=error.message;} finally{b.disabled=false;} }); document.addEventListener('click',async e=>{ const b=e.target.closest('button');if(!b)return; if(b.dataset.editHousehold)openHousehold(b.dataset.editHousehold); if(b.dataset.leadership)await openLeadership(b.dataset.leadership); if(b.dataset.enterHousehold){await switchHousehold(b.dataset.enterHousehold);if(loggedIn)showPage('users');} });