REAL SHOWCASE SOURCEcommand-system
1 个文件 · 106 行 · TypeScript
// ===== showcase/src/examples/components/command_system.ts ===== import { CommandManager, RenderCommandButton, RenderCommandToolbar, RenderPageHeader, RenderStackPanel, RenderText, RenderToolbar, RenderWrapPanel,} from 'ds-ui' export function createCommandSystemExample(): RenderStackPanel { const manager = new CommandManager() const status = new RenderText('命令状态:当前记录有未保存修改。', { role: 'secondary' }) let dirty = true let submitted = false manager.register({ id: 'record.save', title: '保存', description: '保存当前记录', icon: 'document', canExecute: () => dirty, disabledReason: () => '没有未保存内容', execute: () => { dirty = false status.text = '命令状态:记录已保存,现在可以提交。' manager.invalidate() }, }) manager.register({ id: 'record.submit', title: '提交', description: '提交当前记录进入审核', icon: 'chevron-right', canExecute: () => !dirty && !submitted, disabledReason: () => dirty ? '提交前需要先保存' : '记录已经提交', execute: () => { submitted = true status.text = '命令状态:记录已提交,命令入口同步变为不可用。' manager.invalidate() }, }) manager.register({ id: 'record.refresh', title: '刷新', description: '重新加载记录状态', icon: 'refresh', execute: () => { dirty = true submitted = false status.text = '命令状态:刷新完成,重新产生了未保存修改。' manager.invalidate() }, }) const commandToolbar = new RenderCommandToolbar({ commandManager: manager, groups: [{ id: 'record', slot: 'leading', items: [ { kind: 'command', commandId: 'record.save', showLabel: true }, { kind: 'command', commandId: 'record.submit', showLabel: true }, { kind: 'separator', id: 'record-separator' }, { kind: 'command', commandId: 'record.refresh', showLabel: true }, ], }], }) const manualToolbar = new RenderToolbar({ groups: [{ id: 'editing', slot: 'leading', items: [ { id: 'undo', kind: 'button', label: '撤销', icon: 'undo', onClick: () => { status.text = '手工 Toolbar:撤销。' } }, { id: 'redo', kind: 'button', label: '重做', icon: 'redo', onClick: () => { status.text = '手工 Toolbar:重做。' } }, { id: 'separator', kind: 'separator' }, { id: 'insert', kind: 'dropdown', label: '插入', icon: 'plus', items: [{ key: 'table', label: '表格' }, { key: 'image', label: '图片' }, { key: 'section', label: '分节' }], onSelect: key => { status.text = `手工 Toolbar:插入 ${key}。` }, }, ], }], }) const buttons = new RenderWrapPanel({ spacing: 10, runSpacing: 10 }) buttons.addChild(new RenderCommandButton({ commandId: 'record.save', commandManager: manager, variant: 'primary' })) buttons.addChild(new RenderCommandButton({ commandId: 'record.submit', commandManager: manager })) buttons.addChild(new RenderCommandButton({ commandId: 'record.refresh', commandManager: manager })) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 18, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: 'Command 命令系统', description: '同一个 commandId 同步驱动按钮、工具栏、菜单和可用状态。' })) panel.addChild(new RenderText('命令工具栏', { role: 'title', weight: 'semibold' })) panel.addChild(commandToolbar) panel.addChild(new RenderText('独立命令按钮', { role: 'title', weight: 'semibold' })) panel.addChild(buttons) panel.addChild(new RenderText('手工 Toolbar 与下拉菜单', { role: 'title', weight: 'semibold' })) panel.addChild(manualToolbar) panel.addChild(status) panel.padding = 24 return panel}