(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])=>`
已停用字段 · ${escapeHtml(value.label)}${escapeHtml(value.display_value||value.raw_value||'未填写')}${value.compatible===false?'历史格式':''}
`).join(''); container.innerHTML=active+historical;section.hidden=!definitions.length&&!historical; } function collect(form){const result={};form.querySelectorAll('[data-custom-key]').forEach(input=>{if(input.value===''&&input.dataset.preserveIfEmpty==='true')return;result[input.dataset.customKey]=input.value===''?null:input.value;});return result;} window.DynamicFields={load,render,collect}; })();