]> acesimba.cloud Git - StationBuilder.git/commitdiff
领域方案库:修复创建失败与设备模版选择抖动
authorwang.yu <wang.yu@advantech.com>
Wed, 19 Aug 2026 06:21:34 +0000 (14:21 +0800)
committerwang.yu <wang.yu@advantech.com>
Wed, 19 Aug 2026 06:21:34 +0000 (14:21 +0800)
- CreateTemplate: domain_id 在 domains 异步加载后自动默认到首个领域,
  并加兜底校验,避免提交 domain_id=0 被后端拒(创建失败/列表不显示)
- DomainDetail.load 增加 silent 模式;DeviceTemplatePicker 勾选后静默刷新,
  不再触发全屏「加载中」导致的页面抖动

app/page.tsx

index a5b25c11c43bbf40b012301ba756c50700e719df..fdf663755890ff740406506f4cf8ad8d0940aa56 100644 (file)
@@ -1076,7 +1076,8 @@ function CreateTemplate({doms,notify,onCreated}:{doms:any[];notify:(m:string)=>v
   const [domain_id,setDomainId]=useState<number>(doms[0]?.id||0);
   const [name,setName]=useState(""); const [description,setDesc]=useState("");
   const [status,setStatus]=useState("available"); const [version,setVersion]=useState("1.0"); const [creator,setCreator]=useState(CURRENT_USER_EMAIL);
-  const save=async()=>{ try{ const r:any=await fetchDb("/domain-templates",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain_id,name,description,status,version,creator})}); notify("已创建"); onCreated(r.id); }catch(e:any){ notify("创建失败:"+e.message); } };
+  useEffect(()=>{ if(doms.length && !domain_id) setDomainId(doms[0].id); },[doms]);
+  const save=async()=>{ if(!domain_id){ notify("请选择所属领域"); return; } try{ const r:any=await fetchDb("/domain-templates",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain_id,name,description,status,version,creator})}); notify("已创建"); onCreated(r.id); }catch(e:any){ notify("创建失败:"+e.message); } };
   return <Panel title="新增领域方案"><div className="form-grid">
     <label>所属领域<select value={domain_id} onChange={e=>setDomainId(Number(e.target.value))}>{doms.map(d=><option key={d.id} value={d.id}>{d.name}</option>)}</select></label>
     <label>方案名称<input value={name} onChange={e=>setName(e.target.value)} placeholder="如:自来水厂标准方案"/></label>
@@ -1248,7 +1249,7 @@ function DomainDetail({id,go,notify,onBack,onCreated}:{id:number|null;go:(p:Page
   const [loading,setLoading]=useState(false);
   const [m,setM]=useState<any>(null);
   const loadDoms=async()=>{ try{ setDoms(await fetchDb("/domains") as any); }catch{} };
-  const load=async()=>{ if(id==null){ setT(null); return; } setLoading(true); try{ setT(await fetchDb(`/domain-templates/${id}`) as any); }catch(e:any){ notify("加载失败:"+e.message); } finally{ setLoading(false); } };
+  const load=async(silent=false)=>{ if(id==null){ setT(null); return; } if(!silent) setLoading(true); try{ setT(await fetchDb(`/domain-templates/${id}`) as any); }catch(e:any){ notify("加载失败:"+e.message); } finally{ if(!silent) setLoading(false); } };
   useEffect(()=>{ loadDoms(); load(); },[id]);
   useEffect(()=>{ if(t) setM({domain_id:t.domain_id,name:t.name,description:t.description||"",status:t.status,version:t.version,creator:t.creator||""}); },[t?.id]);
   if(id==null) return <CreateTemplate doms={doms} notify={notify} onCreated={onCreated}/>;
@@ -1272,7 +1273,7 @@ function DomainDetail({id,go,notify,onBack,onCreated}:{id:number|null;go:(p:Page
       <div style={{gridColumn:"1 / -1"}}><Button onClick={saveMeta}>保存模板信息</Button></div>
     </div></Panel>
     <Panel title={`选用设备模版(${t.devices.length})`}>
-      <DeviceTemplatePicker tmplId={id} go={go} selectedIds={t.devices.map((d:any)=>d.id)} notify={notify} onChange={load}/>
+      <DeviceTemplatePicker tmplId={id} go={go} selectedIds={t.devices.map((d:any)=>d.id)} notify={notify} onChange={()=>load(true)}/>
     </Panel>
     <Panel title={`领域页面(${t.pages.length})`}><div className="page-list">
       {t.pages.map((p:any)=><PageRow key={p.id} p={p} notify={notify} onChange={load}/>)}