(function(){ const escapeHtml=value=>{const node=document.createElement('div');node.textContent=value??'';return node.innerHTML;}; async function load(){const response=await fetch('/api/form-fields');const data=await response.json();if(!response.ok)throw new Error(data.message||'扩展字段加载失败');return data.data;} function inputHtml(definition,raw,disabled,preserveIfEmpty=false){ const name=escapeHtml(definition.field_key),value=raw??'',required=definition.is_required&&!preserveIfEmpty?'required':'',off=disabled?'disabled':'',preserve=preserveIfEmpty?'data-preserve-if-empty="true"':'',hint=preserveIfEmpty?`placeholder="原值:${escapeHtml(raw)}(输入新值可替换)"`:''; if(definition.input_type==='long_text')return ``; if(definition.input_type==='boolean')return ``; if(definition.input_type==='select')return ``; const types={number:'number',integer:'number',date:'date',text:'text'};const step=definition.input_type==='number'?'step="any"':definition.input_type==='integer'?'step="1"':''; return ``; } function render(container,definitions,values={},disabled=false){ const section=container.closest('.custom-fields-section'),activeKeys=new Set(definitions.map(item=>item.field_key)); const active=definitions.map(definition=>{const saved=values[definition.field_key],incompatible=saved&&typeof saved==='object'&&saved.compatible===false,raw=saved&&typeof saved==='object'?saved.raw_value:saved,inputValue=incompatible?'':raw,warning=incompatible?`历史值“${escapeHtml(raw)}”与当前类型不兼容;留空会保留原值,填写新值后替换`:'';return ``;}).join(''); const historical=Object.entries(values).filter(([key,value])=>!activeKeys.has(key)&&value&&typeof value==='object').map(([,value])=>`