feat: InputExcel组件支持autoFill

This commit is contained in:
lurunze1226 2023-10-20 11:10:05 +08:00
parent 60b1253b8d
commit 4ab14f9331
3 changed files with 86 additions and 6 deletions

View File

@ -242,6 +242,40 @@ order: 14
} }
``` ```
## 解析文件名称
> `3.5.0`及以上版本
文件解析成功后,可以使用`autoFill`属性,在当前组件所在的数据域中填充值,`input-excel`组件特有的保留字段请查看下方定义,`InputExcelData`中的字段可以用变量获取。通常可以利用这个属性为`input-excel`所在的表单追加文件名称。
```typescript
interface InputExcelData {
/* 文件名称 */
filename: string;
}
```
```schema: scope="body"
{
"type": "form",
"api": "/api/mock2/form/saveForm",
"debug": true,
"body": [
{
"type": "input-excel",
"name": "excel",
"label": "上传 Excel",
"autoFill": {
"operator": "amis",
"time": "${DATETOSTR(NOW(), 'YYYY-MM-DD HH:mm:ss')}",
"fileName": "${filename}"
}
}
]
}
```
## 属性表 ## 属性表
| 属性名 | 类型 | 默认值 | 说明 | 版本 | | 属性名 | 类型 | 默认值 | 说明 | 版本 |
@ -251,6 +285,7 @@ order: 14
| includeEmpty | `boolean` | true | 是否包含空值 | | includeEmpty | `boolean` | true | 是否包含空值 |
| plainText | `boolean` | true | 是否解析为纯文本 | | plainText | `boolean` | true | 是否解析为纯文本 |
| placeholder | `string` | `"拖拽 Excel 到这,或点击上传"` | 占位文本提示 | `2.8.1` | | placeholder | `string` | `"拖拽 Excel 到这,或点击上传"` | 占位文本提示 | `2.8.1` |
| autoFill | `Record<string, string>` | | 自动填充 | `3.5.0` |
## 事件表 ## 事件表

View File

@ -1450,6 +1450,8 @@ order: 2
## 自动填充 autoFill ## 自动填充 autoFill
> 支持该配置项的有ButtonGroup、List、NestedSelect、Picker、Radios、Select、InputFile、InputImage、InputExcel
一些选择器组件,支持配置`autoFill`,将当前已选中的选项的某个字段的值,自动填充到表单中某个表单项中,支持[数据映射](../../../docs/concepts/data-mapping) 一些选择器组件,支持配置`autoFill`,将当前已选中的选项的某个字段的值,自动填充到表单中某个表单项中,支持[数据映射](../../../docs/concepts/data-mapping)
```schema: scope="body" ```schema: scope="body"
@ -1556,8 +1558,6 @@ order: 2
} }
``` ```
支持该配置项的有ButtonGroup、List、NestedSelect、Picker、Radios、Select。
## 控制选项高度 ## 控制选项高度
> 1.10.0 及以上版本 > 1.10.0 及以上版本

View File

@ -1,8 +1,18 @@
import React from 'react'; import React from 'react';
import Dropzone from 'react-dropzone'; import Dropzone from 'react-dropzone';
import {autobind, createObject, isObject, resolveEventData} from 'amis-core'; import omit from 'lodash/omit';
import {FormItem, FormControlProps, FormBaseControl} from 'amis-core'; import merge from 'lodash/merge';
import {FormBaseControlSchema} from '../../Schema'; import isEmpty from 'lodash/isEmpty';
import isPlainObject from 'lodash/isPlainObject';
import {
FormItem,
FormControlProps,
autobind,
isObject,
resolveEventData,
dataMapping
} from 'amis-core';
import {FormBaseControlSchema, SchemaTokenizeableString} from '../../Schema';
import type {CellValue, CellRichTextValue} from 'exceljs'; import type {CellValue, CellRichTextValue} from 'exceljs';
/** /**
@ -47,6 +57,13 @@ export interface InputExcelControlSchema extends FormBaseControlSchema {
* *
*/ */
placeholder?: string; placeholder?: string;
/**
*
*/
autoFill?: {
[propName: string]: SchemaTokenizeableString;
};
} }
export interface ExcelProps export interface ExcelProps
@ -87,6 +104,28 @@ export default class ExcelControl extends React.PureComponent<
} }
} }
@autobind
syncAutoFill(filename: string) {
const {autoFill, onBulkChange, data, name} = this.props;
if (autoFill?.hasOwnProperty('api') || !isObject(autoFill)) {
return;
}
const excludeSelfAutoFill = name ? omit(autoFill, name) : autoFill;
if (!isEmpty(excludeSelfAutoFill) && onBulkChange) {
const toSync = dataMapping(excludeSelfAutoFill, {filename});
Object.keys(toSync).forEach(key => {
if (isPlainObject(toSync[key]) && isPlainObject(data[key])) {
toSync[key] = merge({}, data[key], toSync[key]);
}
});
onBulkChange(toSync);
}
}
@autobind @autobind
handleDrop(files: File[]) { handleDrop(files: File[]) {
const excel = files[0]; const excel = files[0];
@ -116,7 +155,7 @@ export default class ExcelControl extends React.PureComponent<
} }
processExcelFile(excelData: ArrayBuffer | string, fileName: string) { processExcelFile(excelData: ArrayBuffer | string, fileName: string) {
const {allSheets, onChange, parseImage} = this.props; const {allSheets, onChange, parseImage, autoFill} = this.props;
import('exceljs').then(async (ExcelJS: any) => { import('exceljs').then(async (ExcelJS: any) => {
this.ExcelJS = ExcelJS; this.ExcelJS = ExcelJS;
const workbook = new ExcelJS.Workbook(); const workbook = new ExcelJS.Workbook();
@ -161,7 +200,13 @@ export default class ExcelControl extends React.PureComponent<
if (dispatcher?.prevented) { if (dispatcher?.prevented) {
return; return;
} }
onChange(sheetsResult); onChange(sheetsResult);
if (autoFill) {
this.syncAutoFill(fileName);
}
this.setState({filename: fileName}); this.setState({filename: fileName});
}); });
} }