REAL SHOWCASE SOURCEform-panel
1 个文件 · 59 行 · TypeScript
// ===== showcase/src/examples/components/form_panel.ts ===== import { RenderButton, RenderComboBox, RenderDatePicker, RenderFieldPresenter, RenderFormPanel, RenderNumberInput, RenderPageHeader, RenderSearchBox, RenderStackPanel, RenderSwitch, RenderText, RenderTextBox, RenderWrapPanel,} from 'ds-ui' export function createFormPanelExample(): RenderStackPanel { const status = new RenderText('FormPanel 负责排列字段,FieldPresenter 负责标签、必填和校验反馈') const form = new RenderFormPanel({ columns: 3, minColumnWidth: 220, labelWidth: 82, adaptive: true, columnGap: 16, rowGap: 12 }) form.addField(new RenderFieldPresenter({ label: '患者姓名', required: true, child: new RenderTextBox({ value: '李安然', placeholder: '输入姓名', onChange: value => { status.text = `患者姓名:${value}` } }), })) form.addField(new RenderFieldPresenter({ label: '年龄', unit: '岁', child: new RenderNumberInput({ value: 36, min: 0, max: 150 }), })) form.addField(new RenderFieldPresenter({ label: '性别', child: new RenderComboBox({ options: [{ value: 'F', label: '女' }, { value: 'M', label: '男' }], value: 'F' }), })) form.addField(new RenderFieldPresenter({ label: '就诊日期', required: true, child: new RenderDatePicker({ value: '2026-07-17', clearable: true }), })) form.addField(new RenderFieldPresenter({ label: '接诊医生', child: new RenderSearchBox({ value: '', placeholder: '输入姓名或工号', onSearch: value => { status.text = `搜索医生:${value || '空'}` } }), }), { columnSpan: 2 }) form.addField(new RenderFieldPresenter({ label: '病历标题', required: true, status: 'error', message: '标题至少需要 4 个字符', validationDisplay: 'inline', child: new RenderTextBox({ value: '复诊', placeholder: '输入病历标题' }), }), { columnSpan: 2 }) form.addField(new RenderFieldPresenter({ label: '自动保存', child: new RenderSwitch({ checked: true, label: '启用' }) })) const actions = new RenderWrapPanel({ spacing: 10, runSpacing: 10 }) actions.addChild(new RenderButton({ label: '保存草稿', onClick: () => { status.text = '草稿已保存' } })) actions.addChild(new RenderButton({ label: '提交表单', variant: 'primary', onClick: () => { status.text = '提交前应由业务层完成字段校验' } })) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 18, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: 'FormPanel 响应式表单', description: '三列桌面布局会根据可用宽度自动降为两列或单列。' })) panel.addChild(form) panel.addChild(actions) panel.addChild(status) panel.padding = 24 return panel}