105 lines
4.1 KiB
Markdown
Raw Normal View History

---
name: list-page-actions
description: This skill standardizes list-page action buttons with permission control and automatic overflow folding. Use it when creating or refactoring ProTable-based list pages that need toolbar buttons or row-level action buttons filtered by `useCurrentPermissions`, especially when more than 3 buttons should collapse into a "更多" dropdown.
---
# List Page Actions
## Overview
This skill provides a reusable architecture for permission-controlled action buttons in ProTable list pages. It replaces scattered `toolBarRender` and `tableRender` boilerplate with two components:
- `MyToolBarActions` — for toolbar buttons (export, add, etc.)
- `MyTableActions` — for row-level buttons with automatic "更多" dropdown when buttons exceed `maxVisible`
Both components encapsulate `useCurrentPermissions` so list pages no longer need to manually call the hook for button rendering.
## When to Use
- Creating a new ProTable list page with permission-controlled buttons
- Refactoring an existing list page that manually calls `useCurrentPermissions` in `toolBarRender` or `tableRender`
- Adding automatic button folding ("更多" dropdown) to row-level actions
- Fixing toolbar buttons that disappear after wrapping them in a helper component
## Core Components
### MyToolBarActions
Renders toolbar buttons filtered by current-page permissions. Returns a plain array so it can be placed directly inside `toolBarRender`.
```tsx
toolBarRender={(action) => [
<MyToolBarActions
key="toolbar"
actions={{
export: <MyExport key="export" item={params} download={Apis.X.Y} />,
add: <MyCreate key="create" reload={action?.reload} />,
}}
/>,
]}
```
**Important:** `MyToolBarActions` returns an array of React nodes. Do not wrap the return value in a `<>...</>` Fragment, or ProTable may fail to render the buttons.
### MyTableActions
Renders row-level buttons filtered by permissions. Automatically moves overflow into an Ant Design `Dropdown` labeled "更多".
```tsx
<MyTableActions
actions={{
view: <MyButtons.View title="详情" />,
update: <MyButtons.Edit title="编辑" />,
delete: <MyButtons.Delete onConfirm={() => {}} />,
}}
maxVisible={3}
/>
```
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `actions` | `Record<string, React.ReactNode>` | required | Permission-key to node map |
| `maxVisible` | `number` | `3` | Buttons shown directly; remainder folded |
| `path` | `string` | current path | Override route for permission lookup |
## Workflow: Creating a New List Page
1. Copy the template from `assets/list-page-template.tsx` into the new page directory.
2. Replace placeholder API paths (`Apis.Module.Resource`) with real ones.
3. Replace placeholder modals (`MyCreate`, `MyUpdate`) with real modal components.
4. Map backend permission keys to the `actions` object keys.
5. Adjust `maxVisible` based on design needs.
## Workflow: Migrating an Existing List Page
1. Remove local `toolBarRender` and `tableRender` functions.
2. Remove any manual `permissionsSpace` / `Others` / `Dropdown` boilerplate.
3. Import `MyToolBarActions` and `MyTableActions` from `@/common`.
4. Replace `toolBarRender` with `MyToolBarActions`.
5. Replace `MyColumns.Option` render body with `MyTableActions`.
6. See `references/migration-guide.md` for detailed before/after examples.
## Special Case: Permission-Controlled Links in Columns
If a column render includes a clickable link (e.g., `AssetInfo`) that should also respect permissions:
```tsx
const getCurrentPermissions = useCurrentPermissions();
const hasInfo = getCurrentPermissions({ info: true }).length > 0;
{
title: '名称',
dataIndex: 'name',
render: (_, item: any) => {
if (!hasInfo) return item?.name;
return <AssetInfo item={{ ...item, type: 'link' }} title={item?.name} />;
},
}
```
## Resources
- `references/component-api.md` — API docs for `MyTableActions` and `MyToolBarActions`
- `references/migration-guide.md` — Step-by-step migration instructions with code diffs
- `assets/list-page-template.tsx` — Complete copy-paste template for new list pages