REAL SHOWCASE SOURCEdata-views

1 个文件 · 81 行 · TypeScript

// ===== showcase/src/examples/components/data_views.ts ===== import {  RenderGridPanel,  RenderListView,  RenderPageHeader,  RenderPropertyGrid,  RenderStackPanel,  RenderTable,  RenderText,  RenderTreeView,  gridFr,  type ListViewItem,  type TableColumn,  type TreeNode,} from 'ds-ui' interface ProjectRow { name: string; owner: string; status: string; updated: string } export function createDataViewsExample(): RenderStackPanel {  const status = new RenderText('选择树节点、列表项或表格行,查看不同数据视图的交互模型。', { role: 'secondary' })  const roots: TreeNode[] = [{    key: 'workspace', label: '工作区', icon: '📁', children: [      { key: 'components', label: '组件', icon: '📁', children: [{ key: 'data-grid', label: 'DataGrid' }, { key: 'tree-view', label: 'TreeView' }] },      { key: 'guides', label: '指南', icon: '📁', children: [{ key: 'quick-start', label: '快速开始' }, { key: 'architecture', label: '架构' }] },    ],  }]  const tree = new RenderTreeView({ roots, defaultExpandedKeys: ['workspace', 'components'], onSelect: node => { status.text = `TreeView:${node.label}` } })   const items: ListViewItem[] = [    { key: 'inbox', label: '待处理', icon: 'bell', trailingText: '12' },    { key: 'today', label: '今日任务', icon: 'calendar', trailingText: '6' },    { key: 'done', label: '已完成', icon: 'check', trailingText: '28' },    { key: 'archive', label: '归档', disabled: true },  ]  const list = new RenderListView({ items, defaultSelectedItem: items[0], onSelect: item => { status.text = `ListView:${item.label}` } })   const rows: ProjectRow[] = [    { name: '门诊工作台', owner: '周医生', status: '进行中', updated: '10:42' },    { name: '病历编辑器', owner: '李医生', status: '待审核', updated: '09:18' },    { name: '检验查询', owner: '王医生', status: '已完成', updated: '昨天' },    { name: '护理记录', owner: '陈护士', status: '进行中', updated: '昨天' },  ]  const columns: TableColumn<ProjectRow>[] = [    { key: 'name', title: '项目', sortable: true },    { key: 'owner', title: '负责人', width: 110 },    { key: 'status', title: '状态', width: 100, sortable: true },    { key: 'updated', title: '更新时间', width: 90 },  ]  const table = new RenderTable({ columns, rows, height: 190, onRowClick: row => { status.text = `Table:${row.name} / ${row.status}` } })   const properties = new RenderPropertyGrid({    showDescriptionPanel: true,    selectedRowId: 'title',    rows: [      { id: 'title', group: '基础', name: '标题', value: '门诊工作台', editable: true, editor: 'text', description: '当前页面在标签、导航和窗口标题中显示的名称。' },      { id: 'visible', group: '基础', name: '可见', value: 'true', editable: true, editor: 'boolean', description: '控制当前对象是否参与布局和绘制。' },      { id: 'width', group: '布局', name: '宽度', value: '960', editable: true, editor: 'number', unit: 'px', description: '设计器画布中的目标宽度。' },      { id: 'theme', group: '外观', name: '主题', value: 'Light', editable: true, editor: 'enum', enumItems: [{ value: 'Light', label: 'Light' }, { value: 'Dark', label: 'Dark' }], description: '组件树使用的主题方案。' },    ],    onValueCommit: (row, value) => { status.text = `PropertyGrid:${row.name} = ${String(value)}`; return true },  })   const upper = new RenderGridPanel({ columns: [gridFr(), gridFr()], columnGap: 14, rowGap: 14 })  tree.height = 220  list.height = 220  upper.addChild(tree, { row: 0, column: 0 })  upper.addChild(list, { row: 0, column: 1 })  const lower = new RenderGridPanel({ columns: [gridFr(1.35), gridFr()], columnGap: 14, rowGap: 14 })  lower.addChild(table, { row: 0, column: 0 })  properties.height = 260  lower.addChild(properties, { row: 0, column: 1 })   const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 16, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({ title: '数据视图选择', description: '树、列表、轻量表格和属性表分别服务不同的数据结构与编辑边界。' }))  panel.addChild(upper)  panel.addChild(lower)  panel.addChild(status)  panel.padding = 24  return panel}