REAL SHOWCASE SOURCEentry-grid-form
1 个文件 · 138 行 · TypeScript
// ===== showcase/src/examples/components/entry_grid.ts ===== import { RenderButton, RenderComboBox, RenderDatePicker, RenderEntryGrid, RenderFieldPresenter, RenderNumberInput, RenderPageHeader, RenderStackPanel, RenderText, RenderTextArea, RenderTextBox, RenderWrapPanel, fieldTrack,} from 'ds-ui' export function createEntryGridExample(): RenderStackPanel { const status = new RenderText('填写完成后点击“保存接诊记录”,错误会集中显示在对应行下方。', { role: 'secondary' }) const patientName = new RenderTextBox({ value: '李安然', placeholder: '输入患者姓名' }) const outpatientNo = new RenderTextBox({ value: 'MZ20260717018', placeholder: '输入门诊号' }) const temperature = new RenderNumberInput({ value: 36.8, min: 34, max: 43, step: 0.1 }) const complaint = new RenderTextArea({ value: '间断胸闷两天,活动后加重。', placeholder: '记录主诉与持续时间', minLines: 3, maxLines: 5, }) const patientField = new RenderFieldPresenter({ label: '患者姓名', required: true, child: patientName, }) const outpatientField = new RenderFieldPresenter({ label: '门诊号', required: true, child: outpatientNo, }) const complaintField = new RenderFieldPresenter({ label: '主诉', required: true, child: complaint, }) const grid = new RenderEntryGrid({ columns: [fieldTrack(), fieldTrack(), fieldTrack(), fieldTrack()], columnGap: 14, rowGap: 12, validationPresentation: 'row-feedback', enterNavigation: 'next-focusable', }) grid.addChild(patientField) grid.addChild(outpatientField) grid.addChild(new RenderFieldPresenter({ label: '就诊日期', required: true, child: new RenderDatePicker({ value: '2026-07-17', clearable: true }), })) grid.addChild(new RenderFieldPresenter({ label: '接诊科室', child: new RenderComboBox({ value: 'cardiology', options: [ { value: 'cardiology', label: '心内科' }, { value: 'respiratory', label: '呼吸内科' }, { value: 'emergency', label: '急诊医学科' }, ], }), })) grid.addChild(new RenderFieldPresenter({ label: '体温', unit: '℃', child: temperature })) grid.addChild(new RenderFieldPresenter({ label: '分诊级别', child: new RenderComboBox({ value: 'normal', options: [ { value: 'urgent', label: '紧急' }, { value: 'priority', label: '优先' }, { value: 'normal', label: '普通' }, ], }), })) grid.addChild(new RenderFieldPresenter({ label: '接诊医生', child: new RenderComboBox({ value: 'doctor-lin', options: [ { value: 'doctor-lin', label: '林医生' }, { value: 'doctor-chen', label: '陈医生' }, { value: 'doctor-wang', label: '王医生' }, ], }), })) grid.addChild(new RenderFieldPresenter({ label: '联系电话', child: new RenderTextBox({ value: '138 0000 1268', placeholder: '输入手机号' }), })) grid.addChild(complaintField, { columnSpan: 2 }) grid.addChild(new RenderFieldPresenter({ label: '初步诊断', child: new RenderTextArea({ value: '胸闷待查', minLines: 3, maxLines: 5 }), }), { columnSpan: 2 }) const validate = (): void => { patientField.status = patientName.value.trim() ? 'default' : 'error' patientField.message = patientField.status === 'error' ? '患者姓名不能为空' : '' outpatientField.status = outpatientNo.value.trim() ? 'default' : 'error' outpatientField.message = outpatientField.status === 'error' ? '门诊号不能为空' : '' complaintField.status = complaint.value.trim() ? 'default' : 'warning' complaintField.message = complaintField.status === 'warning' ? '建议填写主诉,便于后续诊断与质控' : '' status.text = patientField.status === 'error' || outpatientField.status === 'error' ? '保存失败:请处理行级校验提示。' : '接诊记录已保存;可继续按 Enter 在可聚焦字段之间移动。' } const actions = new RenderWrapPanel({ spacing: 10, runSpacing: 10 }) actions.addChild(new RenderButton({ label: '触发校验', onClick: () => { patientName.value = '' complaint.value = '' validate() }, })) actions.addChild(new RenderButton({ label: '保存接诊记录', variant: 'primary', onClick: validate })) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 16, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: 'EntryGrid 接诊录入', description: '四列紧凑医疗表单,演示字段跨度、行级校验反馈和 Enter 焦点导航。', })) panel.addChild(grid) panel.addChild(actions) panel.addChild(status) panel.padding = 24 return panel}