import { Component, NewState, Util, $, State } from '@apigo.cc/state' import { HTTP } from './http.js' Component.register('AutoForm', container => { if (!container.state.schema) container.state.schema = [] // TRY: 确保 state.data 始终是响应式 Proxy,支持深层嵌套属性的监听 const ensureProxy = v => (v && typeof v === 'object' && !v.__isProxy) ? NewState(v) : v; container.state.__watch('data', v => container.data = ensureProxy(v)); container.data = ensureProxy(container.state.data || {}); container.vertical = container.hasAttribute('vertical') container.inline = container.hasAttribute('inline') container.request = { method: 'POST' } container.response = {} container.result = null // 初始化数据联动:如果处于行编辑模式(inline),监听全局编辑状态 if (container.inline) { State.__watch('editingData', (data) => { container.data = data }) State.__watch('editingSchema', (schema) => { container.state.schema = schema }) } container.form = $(container, 'form') container.submit = (opt = {}) => { if (!container.form.reportValidity()) return globalThis.UI?.toast?.('{#verify failed#}', { type: 'danger' }) if (!container.dispatchEvent(new CustomEvent('submit', { detail: container.data, cancelable: true, bubbles: false }))) return const req = { ...container.request, data: container.data, noui: true, ...opt } let task = null if (container.api) task = container.api.do(req) else if (container.request.url) task = HTTP.request(req) else return console.warn('{#please config .api or .request.url to auto submit#}') task.then(resp => { container.response = resp container.result = resp.result if (typeof resp.result === 'object' && resp.result.error) throw new Error(resp.result.error) container.dispatchEvent(new CustomEvent('response', { detail: resp, bubbles: false })) }).catch(err => { if (globalThis.UI?.toast) UI.toast(err.message, { type: 'danger' }) container.dispatchEvent(new CustomEvent('error', { detail: err, bubbles: true })) }) } }, Util.makeDom(/*html*/`