skyline-console/docs/zh/develop/3-7-ModalAction-introduction.md
zhuyue bd501ba416 fix: Fix for docs link address
fix for docs link address

Change-Id: I8539ba5a546621e543b2c4c83066489b98e308c5
2021-08-27 17:28:20 +08:00

389 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

简体中文 | [English](../../en/develop/3-7-ModalAction-introduction.md)
# 用途
![弹窗型表单](../../zh/develop/images/form/modal.png)
- 操作按钮点击后,弹窗显示表单
- 点击`确认`按钮后,会根据请求的发送情况,展示`loading`状态
- 点击`取消`按钮后,弹窗消失
- 如果请求发送成功,会在右上角展示操作成功的提示信息,该提示信息几秒后可自动消失
- 如果请求发送失败,会在表单页的右上角展示错误信息,该提示信息只有点击关闭按钮后才可消失
- 支持批量操作,在表格中选中多个条目后,可点击表格上方的操作按钮,进行批量操作
# ModalAction 代码文件
- `src/containers/Action/ModalAction/index.jsx`
# ModalAction 属性与函数定义介绍
- 弹窗型表单都继承于 ModalAction 组件
- 代码位置:`pages/xxxx/containers/XXXX/actions/xxx.jsx`
- 对于表单内容比较少的情况,通常是使用弹窗型的表单形式
- 只需要复写部分函数即可完成页面的开发
- 属性与函数分为以下四种,
- 必须复写的属性与函数,主要包含:
- 操作的 ID
- 操作的标题
- 操作对应的权限
- 对是否禁用操作的判定
- 表单项的配置
- 发送请求的函数
- 按需复写的函数与属性,主要包含:
- 表单的默认值
- 表单的尺寸
- 表单中右侧标题与左侧表单主题的布局
- 是否是异步操作
- 资源的名称
- 请求结果提示语中是否要展示资源名称
- 操作按钮上的文字
- 无需复写的函数与属性,主要包含:
- 当前页是否是管理平台页面
- 基类中的基础函数,主要包含:
- 渲染页面
- 对请求状态的展示
- 对请求结果的展示
- 更详细与全面的介绍见下
## 必须复写的属性与函数
- `id`
- 静态属性
- 资源操作的 ID
- 需要具有唯一性,只针对资源的`actions`中的所有操作具有唯一性即可
- 必须复写该属性
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
static id = 'attach-volume';
```
- `title`
- 静态属性
- 资源操作的标题
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
static title = t('Attach Volume');
```
- `name`
- 该操作对应的名称
- 在请求后提示语中使用该名称
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
get name() {
return t('Attach volume');
}
```
- `policy`
- 静态属性
- 操作对应的权限,如果权限验证不通过,则不会在资源列表页面显示该操作按钮
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
static policy = 'os_compute_api:os-volumes-attachments:create';
```
- `allowed`
- 静态函数
- 判定操作是否需要被禁用
- 返回`Promise`
- 不需用禁用的按钮,直接写作
```javascript
static allowed() {
return Promise.resolve(true);
}
```
- 参数`item`,资源列表中的条目数据,一般用在资源列表中的条目的操作判定
- 参数`containerProps`,父级 container(即按钮所在资源列表页面)的`props`属性,一般用在详情页下相关资源的操作判定
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
- 管理平台不展示该操作按钮
- 当云主机满足:运行中、不处于删除中、未锁定、不是裸机 时,才会展示按操作按钮
```javascript
static allowed = (item, containerProps) => {
const { isAdminPage } = containerProps;
return Promise.resolve(
!isAdminPage &&
isActive(item) &&
isNotDeleting(item) &&
isNotLocked(item) &&
!isIronicInstance(item)
);
};
```
- `formItems`
- 该操作表单对应的表单项配置列表
- 每个表单项的配置信息可参考[3-10-FormItem 介绍](3-10-FormItem-introduction.md)
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
- 表单项包含:云主机的名称展示、云硬盘的选择
```javascript
get formItems() {
return [
{
name: 'instance',
label: t('Instance'),
type: 'label',
iconType: 'instance',
},
{
name: 'volume',
label: t('Volume'),
type: 'volume-select-table',
tip: multiTip,
isMulti: false,
required: true,
serverId: this.item.id,
disabledFunc: (record) => {
const diskFormat = _get(
record,
'origin_data.volume_image_metadata.disk_format'
);
return diskFormat === 'iso';
},
},
];
}
```
- `onSubmit`
- 该操作的请求函数
- 操作请求成功后,弹窗会消失,并显示成功提示,几秒后提示会消失
- 操作失败后,弹窗会消失,并显示错误提示,需要手动关闭提示,提示才会消失
- 返回`Promise`
- 返回表单对应的`store`中的函数
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
onSubmit = (values) => {
const { volume } = values;
const { id } = this.item;
const volumeId = volume.selectedRowKeys[0];
const body = {
volumeAttachment: {
volumeId,
},
};
return this.store.attachVolume({ id, body });
};
```
## 按需复写的属性与函数
- `init`
- 初始化操作
- 在其中定义`this.store``loading`状态的展示是基于`this.store.isSubmitting`
- 在其中调用获取表单所需其他数据的函数
- 对`this.state`中属性的更新
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
- 定义了操作对应的`store`
```javascript
init() {
this.store = globalServerStore;
}
```
- `defaultValue`
- 表单的初始值
- 默认值是`{}`
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
- 设置了表单中,云主机名称的初始值
```javascript
get defaultValue() {
const { name } = this.item;
const value = {
instance: name,
};
return value;
}
```
- `nameForStateUpdate`
- 表单项内容变动时,更新到`this.state`中的表单键值对
- 这些存储到`this.state`中的键值对往往会影响表单项的展示,需要配合`get formItems`中的代码使用
- 如展开、隐藏更多配置项
- 如某些表单项必填性的变动
- 默认对`radio`, `more`类型的表单项的变动保存到`this.state`中
- 以云主机挂载网卡`src/pages/compute/containers/Instance/actions/AttachInterface.jsx`为例
- 表单中的网络的选中变更后,会更新子网列表的内容
- 但表单中子网的选中变更后,会更新输入 IP 的判定等
```javascript
get nameForStateUpdate() {
return ['network', 'ipType', 'subnet'];
}
```
- `instanceName`
- 请求发送后,提示信息中的资源名称
- 默认值为`this.values.name`
- 以编辑浮动 IP`src/pages/network/containers/FloatingIp/actions/Edit.jsx`为例
- 提示的名称是浮动 IP 的地址
```javascript
get instanceName() {
return this.item.floating_ip_address;
}
```
- `isAsyncAction`
- 当前操作是否是异步操作
- 默认是`false`
- 如果是异步操作,提示语为:`xxx指令已下发实例名称xxx 您可等待几秒关注列表数据的变更或是手动刷新数据,以获取最终展示结果。`
- 如果是同步操作,提示语为:`xxx成功实例名称xxx。`
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
```javascript
get isAsyncAction() {
return true;
}
```
- `messageHasItemName`
- 请求结果的提示语中,是否要包含实例名称
- 默认值为`true`
- 有些资源,不存在名称,则可设置该值为`false`
- 以创建 `SNAT` `src/pages/network/containers/Router/Snat/actions/Create.jsx` 为例
```javascript
get messageHasItemName() {
return false;
}
```
- `buttonText`
- 静态属性
- 当操作按钮上的文字与弹窗的标题不一致时,需要复用该属性
- 以编辑镜像`src/pages/compute/containers/Image/actions/Edit.jsx`为例
```javascript
static buttonText = t('Edit');
```
- `buttonType`
- 静态属性
- 按钮的类型,支持`primary`、`danger`
- 当按钮要强调操作危险性时,按钮或按钮上的文字一般为红色,使用`danger`
- 以禁止 Cinder 服务`src/pages/configuration/containers/SystemInfo/CinderService/actions/Disable.jsx`为例
```javascript
static buttonType = 'danger';
```
- `modalSize`
- 静态函数
- 标识弹出框的宽度:值为`small`、`middle`、`large`
- 值与宽度的对应为:
- `small`: 520
- `middle`: 720
- `large`: 1200
- 与`getModalSize`配合使用
- 默认值为`small`,即弹窗的宽度是 520px
```javascript
static get modalSize() {
return 'small';
}
```
- 以挂载云硬盘`src/pages/compute/containers/Instance/actions/AttachVolume.jsx`为例
- 表单的大小是`large`
```javascript
static get modalSize() {
return 'large';
}
getModalSize() {
return 'large';
}
```
- `getModalSize`
- 标识弹出框的宽度
- 值为`small`、`middle`、`large`
- `labelCol`
- 配置表单左侧标签的布局
- 默认值为
```javascript
get labelCol() {
const size = this.getModalSize();
if (size === 'large') {
return {
xs: { span: 6 },
sm: { span: 4 },
};
}
return {
xs: { span: 8 },
sm: { span: 6 },
};
}
```
- 以编辑域`src/pages/identity/containers/Domain/actions/Edit.jsx`为例
```javascript
get labelCol() {
return {
xs: { span: 6 },
sm: { span: 5 },
};
}
```
- `wrapperCol`
- 配置表单右侧内容的布局
- 默认值为
```javascript
get wrapperCol() {
return {
xs: { span: 16 },
sm: { span: 16 },
};
}
```
- 以管理云主机类型元数据`src/pages/compute/containers/Flavor/actions/ManageMetadata.jsx`为例
```javascript
get wrapperCol() {
return {
xs: { span: 18 },
sm: { span: 20 },
};
}
```
## 不需要复写的属性与函数
- `isAdminPage`
- 当前页面是否是“管理平台”的页面
- `successText`
- 请求后生成的成功提示语
- `errorText`
- 请求失败后生成的报错提示语
- `containerProps`
- 获取来源于按钮所在父级组件的`props`
- `item`
- 获取操作对应的数据
- `items`
- 获取批量操作对应的数据
## 基类中的基础函数
- `ModalAction`继承于`BaseForm`
- 建议查看代码理解,`src/components/Form/index.jsx`