# ToolbarAction 组件实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 封装 ToolbarAction 可复用组件,将操作按钮从表格操作列移至工具栏,通过勾选行激活操作。
**Architecture:** 新建 `src/components/common/toolbar-action/` 组件,接收 `selected`(已选行)和 `actions`(操作列表),根据选中数量和操作模式(batch/single)自动控制按钮禁用状态。复用现有 `.btn-ghost` 样式。
**Tech Stack:** Vue 3 + TypeScript + Element Plus
---
## 文件结构
| 操作 | 文件 | 职责 |
|------|------|------|
| 创建 | `src/components/common/toolbar-action/types.ts` | ToolbarActionItem 类型定义 |
| 创建 | `src/components/common/toolbar-action/index.vue` | 组件本体(模板 + 逻辑 + scoped 样式) |
| 删除 | `web-admin/demo-action-column.html` | 之前的演示文件 |
---
### Task 1: 创建类型定义
**Files:**
- Create: `src/components/common/toolbar-action/types.ts`
- [ ] **Step 1: 创建类型文件**
```ts
import type { Component } from 'vue'
export interface ToolbarActionItem {
label: string
icon?: Component
handler: (rows: any[]) => void
mode: 'batch' | 'single'
danger?: boolean
disabled?: boolean
visible?: boolean
}
```
---
### Task 2: 创建 ToolbarAction 组件
**Files:**
- Create: `src/components/common/toolbar-action/index.vue`
- Reference: `src/components/common/amount-input/index.vue`(组件结构参考)
- Reference: `src/views/production/consumable/index.vue:46-72`(工具栏按钮布局参考)
- Reference: `src/assets/styles/core/el-ui.scss:987-995`(`.btn-ghost` 样式)
- [ ] **Step 1: 创建组件文件**
组件关键行为:
- 过滤 `visible !== false` 的 actions
- `selected.length === 0`:所有按钮 disabled
- `selected.length === 1`:所有按钮可用
- `selected.length > 1 && mode === 'single'`:disabled + tooltip「请选择单条记录」
- `danger=true`:`type="danger"` 样式
- `disabled=true`(调用方传入):始终禁用
- 非 danger 按钮:`btn-ghost` class
```vue
{{ action.label }}
{{ action.label }}
```
---
### Task 3: 验证构建
**Files:** 无新增修改
- [ ] **Step 1: 运行构建**
Run: `cd web-admin && pnpm build`
Expected: 构建成功
---
### Task 4: 清理演示文件
**Files:**
- Delete: `web-admin/demo-action-column.html`
- [ ] **Step 1: 删除演示文件**
Run: `rm web-admin/demo-action-column.html`
---
## 不在本计划范围
- 改造现有页面的操作列(后续按需逐步替换)
- 全局注册组件(按需 import 即可)
- 修改全局样式(使用 ToolbarAction 的页面移除操作列后,`min-width: 260px` 规则自动失效)