@cfmm/umi-plugins-ui-v2 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cjs/components/CrudTable.tpl +224 -18
  2. package/dist/cjs/locales/en-US.d.ts +3 -0
  3. package/dist/cjs/locales/enUS/common.d.ts +3 -0
  4. package/dist/cjs/locales/enUS/common.js +3 -0
  5. package/dist/cjs/locales/enUS/index.d.ts +3 -0
  6. package/dist/cjs/locales/th-TH.d.ts +3 -0
  7. package/dist/cjs/locales/zh-CN.d.ts +3 -0
  8. package/dist/cjs/locales/zh-TW.d.ts +3 -0
  9. package/dist/cjs/locales/zhCN/common.d.ts +3 -0
  10. package/dist/cjs/locales/zhCN/common.js +3 -0
  11. package/dist/cjs/locales/zhCN/index.d.ts +3 -0
  12. package/dist/cjs/locales/zhTW/common.d.ts +3 -0
  13. package/dist/cjs/locales/zhTW/common.js +3 -0
  14. package/dist/cjs/locales/zhTW/index.d.ts +3 -0
  15. package/dist/cjs/types/CrudTableTypes.d.ts +1 -1
  16. package/dist/cjs/types/CrudTableTypes.js +1 -1
  17. package/dist/cjs/utils/excelHelper.tpl +44 -36
  18. package/dist/esm/components/CrudTable.tpl +224 -18
  19. package/dist/esm/locales/en-US.d.ts +3 -0
  20. package/dist/esm/locales/enUS/common.d.ts +3 -0
  21. package/dist/esm/locales/enUS/common.js +3 -0
  22. package/dist/esm/locales/enUS/index.d.ts +3 -0
  23. package/dist/esm/locales/th-TH.d.ts +3 -0
  24. package/dist/esm/locales/zh-CN.d.ts +3 -0
  25. package/dist/esm/locales/zh-TW.d.ts +3 -0
  26. package/dist/esm/locales/zhCN/common.d.ts +3 -0
  27. package/dist/esm/locales/zhCN/common.js +3 -0
  28. package/dist/esm/locales/zhCN/index.d.ts +3 -0
  29. package/dist/esm/locales/zhTW/common.d.ts +3 -0
  30. package/dist/esm/locales/zhTW/common.js +3 -0
  31. package/dist/esm/locales/zhTW/index.d.ts +3 -0
  32. package/dist/esm/types/CrudTableTypes.d.ts +1 -1
  33. package/dist/esm/types/CrudTableTypes.js +1 -1
  34. package/dist/esm/utils/excelHelper.tpl +44 -36
  35. package/package.json +1 -1
@@ -105,65 +105,73 @@ export const setWorksheetHeader = (
105
105
  };
106
106
 
107
107
  /**
108
- * 导出Excel(单级表头)
108
+ * 导出Excel
109
109
  * @param fileName 文件名
110
110
  * @param workSheetName Sheet名
111
- * @param headerColumns 列名数组
112
- * @param genRowFun 创建行的函数
111
+ * @param headerColumns 列名
112
+ * @param genRowFun 创建行,由外部方法执行
113
113
  */
114
114
  export const genExcel = (
115
115
  fileName: string,
116
116
  workSheetName: string,
117
117
  headerColumns: string[],
118
- genRowFun: DataRowGenerator,
119
- ): void => {
120
- // 参数验证
121
- if (!fileName || !workSheetName || !headerColumns.length) {
122
- console.error('genExcel: 缺少必要参数');
123
- return;
118
+ genRowFun: any,
119
+ /**
120
+ * @description 可选其他配置项
121
+ * prependRowsOptions:在表头上方插入的行(例如 dataIndex 行)
122
+ * */
123
+ options?: {
124
+ prependRowsOptions?: {
125
+ prependRows: any[][],
126
+ prependRowsIndex?: number,
127
+ },
128
+ /** 所有行添加完成后的回调,可在此处对单元格做额外处理(如设置超链接样式) */
129
+ afterAddRows?: (workSheet: ExcelJS.Worksheet) => void;
124
130
  }
131
+ ) => {
132
+ let workBook = new ExcelJS.Workbook();
125
133
 
126
- const workBook = new ExcelJS.Workbook();
127
-
128
- // 设置工作簿元数据
129
134
  workBook.created = new Date();
130
135
  workBook.modified = new Date();
131
136
  workBook.lastPrinted = new Date();
132
137
 
133
- const workSheet = workBook.addWorksheet(workSheetName, {
134
- properties: { tabColor: { argb: 'FF00FF00' } },
135
- });
138
+ let workSheet = workBook.addWorksheet(workSheetName, { properties: { tabColor: { argb: 'FF00FF00' } } });
136
139
 
137
140
  setWorksheetHeader(workSheet, headerColumns)
138
141
  .then(() => {
139
- // 调用外部方法,生成数据行
142
+ const { prependRowsOptions } = options || {};
143
+ const { prependRows, prependRowsIndex = 1 } = prependRowsOptions || {};
144
+ // 如果需要在表头上方插入一行/多行(会把表头向下顶一行)
145
+ if (Array.isArray(prependRows) && prependRows.length > 0) {
146
+ // 从第一行开始依次插入,保持传入顺序
147
+ prependRows.forEach((row) => {
148
+ workSheet.spliceRows(prependRowsIndex, 0, row);
149
+ });
150
+ }
151
+ //调用外部方法,生成数据行
140
152
  return genRowFun();
141
153
  })
142
154
  .then((newRows: any[]) => {
143
- try {
144
- // 批量添加数据行
145
- if (newRows?.length > 0) {
146
- newRows.forEach((row) => {
147
- workSheet.addRow(row);
148
- });
149
- }
150
- return true;
151
- } catch (error) {
152
- console.error('添加数据行时发生错误:', error);
153
- throw error;
154
- }
155
+ //加入行数据至worksheet
156
+ newRows.forEach((row) => {
157
+ workSheet.addRow(row);
158
+ });
159
+
160
+ options?.afterAddRows?.(workSheet);
161
+
162
+ return true;
155
163
  })
156
164
  .then(() => {
157
- // 调用xlsx的方法写成文件
165
+ /**
166
+ * 调用xlsx的方法写成文件
167
+ */
158
168
  return workBook.xlsx.writeBuffer();
159
169
  })
160
- .then((buffer: any) => {
161
- // 下载文件
162
- fileDownloadFromBlob(fileName, buffer);
163
- })
164
- .catch((error) => {
165
- console.error('生成Excel文件时发生错误:', error);
166
- // 可以在这里添加用户友好的错误提示
170
+ .then((blob: Blob) => {
171
+ /**
172
+ * 下载文件
173
+ */
174
+ fileDownloadFromBlob(fileName, blob);
167
175
  });
168
176
  };
169
177
 
@@ -1,7 +1,7 @@
1
- import { CloudDownloadOutlined, PlusOutlined, UploadOutlined } from '@ant-design/icons';
2
- import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
3
- import { cfmmUtils, ImportExecl, useIntl } from '@umijs/max';
4
- import { Button, Dropdown, MenuProps, Modal } from 'antd';
1
+ import { CloudDownloadOutlined, DownloadOutlined, PlusOutlined, UploadOutlined } from '@ant-design/icons';
2
+ import { ActionType, ColumnsState, ProColumns, ProTable } from '@ant-design/pro-components';
3
+ import { cfmmUtils, ImportExecl, useFormatLocale, useIntl, useModel } from '@umijs/max';
4
+ import { Button, Dropdown, MenuProps, message, Modal, Progress } from 'antd';
5
5
  import React, { ForwardedRef, forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';
6
6
  import useAction from '../hooks/useAction';
7
7
  import useAuthority from '../hooks/useAuthority';
@@ -14,9 +14,9 @@ import DropdownButton from './DropdownButton';
14
14
  import EditMultiLangForm from './EditMultiLangForm';
15
15
  import MyFooterToolbar from './MyFooterToolbar';
16
16
  import ViewTableItemDrawer from './ViewTableItemDrawer';
17
- import { genExcelAdvanced } from '../utils/excelHelper';
17
+ import { genExcel, genExcelAdvanced, getExportColumns, getExportValueForColumns } from '../utils/excelHelper';
18
18
  import { importMultiLangList, queryLangInfoExprotList } from '../services';
19
- import { handleImportList } from '../utils/importHelper';
19
+ import { handleImportList, showCheckErrorTips } from '../utils/importHelper';
20
20
 
21
21
  const { confirm } = Modal;
22
22
  export const TABLE_SCROLL = { x: 'max-content' };
@@ -38,6 +38,9 @@ const generateDefaultAuthCodes = (localCode: string | undefined) => {
38
38
  remove: `${baseCode}_remove`,
39
39
  record: `${baseCode}_record`,
40
40
  lang: `${baseCode}_lang`,
41
+ templateDownload: `${baseCode}_templateDownload`,
42
+ import: `${baseCode}_import`,
43
+ exprot: `${baseCode}_exprot`,
41
44
  };
42
45
  };
43
46
 
@@ -58,6 +61,7 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
58
61
  createConfig = {},
59
62
  updateConfig = {},
60
63
  actionColumnConfig = {} as CrudTableConfig['actionColumnConfig'],
64
+ downloadTemplate = {},
61
65
  onAdd,
62
66
  onAfterSearch,
63
67
  onBeforeEdit,
@@ -65,6 +69,7 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
65
69
  onAfterDelete,
66
70
  onBeforeAction,
67
71
  onAfterAction,
72
+ onAfterImport,
68
73
  } = props;
69
74
 
70
75
  const defaultAuthCodes = {
@@ -74,8 +79,13 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
74
79
 
75
80
  const { formatMessage } = useIntl();
76
81
  const { getAuthorityFn } = useAuthority();
82
+ const {
83
+ templateDownloadModalOpenChange,
84
+ handleTemplateDownloadModalSearchParamsChange,
85
+ } = window.__POWERED_BY_QIANKUN__ ? useModel('@@qiankunStateFromMaster') : useModel('global');
77
86
  const actionRef = useRef<ActionType>();
78
87
  const updateDrawerRef = useRef<RefDrawerFormRefType>();
88
+ const timer = useRef<NodeJS.Timeout>();
79
89
 
80
90
  // 状态管理
81
91
  const [tableList, setTableList] = useState<T[]>([]);
@@ -90,9 +100,18 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
90
100
  const [editLangModalOpen, setEditLangModalOpen] = useState<boolean>(false);
91
101
  const [currentLangInfo, setCurrentLangInfo] = useState<LangInfoItem | undefined>();
92
102
 
103
+ // 导出execl
104
+ const [loading, setLoading] = useState<boolean>(false);
105
+ const [percent, setPercent] = useState<number>(0);
106
+ const [downloadButtonLoading, setDownloadButtonLoading] = useState<boolean>(false);
107
+ const [columnsStateMap, setColumnsStateMap] = useState<Record<string, ColumnsState>>({});
108
+ // 用于导出查询,不能使用formRef,会造成与表格数据不一致
109
+ const [tableSearchParams, setTableSearchParams] = useState<any>({});
110
+
93
111
  // Hooks
94
112
  const { queryList } = useQueryTableList(baseLocalCode ? { baseLocalCode, baseLocalName } : undefined);
95
113
  const { doAction, loading: actionLoading } = useAction(baseLocalCode ? { baseLocalCode, baseLocalName } : undefined);
114
+ const { getLocalDate } = useFormatLocale();
96
115
 
97
116
  /**
98
117
  * 处理多语言字段点击
@@ -114,9 +133,9 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
114
133
  });
115
134
 
116
135
  const queryMultiLangData = useMemoizedFn(async (tableName: string, columnName: string): Promise<ExprotMultiLangListItem[]> => {
117
- if(!multiLang) return [];
136
+ if (!multiLang) return [];
118
137
 
119
- if(multiLang.multiLangList) {
138
+ if (multiLang.multiLangList) {
120
139
  return multiLang.multiLangList;
121
140
  }
122
141
 
@@ -135,7 +154,7 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
135
154
  });
136
155
 
137
156
  const handleExportMultiLang = useMemoizedFn(async () => {
138
- if(multiLang?.exportMultiLangData) {
157
+ if (multiLang?.exportMultiLangData) {
139
158
  return await multiLang.exportMultiLangData();
140
159
  }
141
160
 
@@ -150,8 +169,8 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
150
169
 
151
170
  const { tableName, columnName } = multiLang.fields[0];
152
171
  const data = await queryMultiLangData(tableName, columnName);
153
-
154
- if(!data.length) return;
172
+
173
+ if (!data.length) return;
155
174
 
156
175
  const handleData = data.map(item => [item.dataId, item.columnValue, item.zh_CN, item.zh_TW, item.en_US, item.th_TH]);
157
176
 
@@ -174,14 +193,14 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
174
193
 
175
194
  // 导入多语言数据
176
195
  const importMultiLang = useMemoizedFn(async (list: any[]) => {
177
- if(!multiLang?.fields) return;
196
+ if (!multiLang?.fields) return;
178
197
 
179
198
  const { tableName, columnName } = multiLang.fields[0];
180
199
 
181
- if(multiLang.importMultiLangData) {
200
+ if (multiLang.importMultiLangData) {
182
201
  return await multiLang.importMultiLangData(list, tableName, columnName);
183
202
  }
184
-
203
+
185
204
  // 处理导入数据,正确赋值字段以及转格式
186
205
  const newList = handleImportList<ExprotMultiLangListItem>(list, { needHandleUnderline: false });
187
206
 
@@ -192,7 +211,7 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
192
211
  // return Promise.resolve({ success: false });
193
212
  // }
194
213
 
195
- const result = await doAction('IMPORT', {
214
+ const result = await doAction('IMPORT', {
196
215
  tableName: tableName,
197
216
  columnName: columnName,
198
217
  i18nDataList: newList.filter(item => item.en_US || item.zh_CN || item.zh_TW || item.th_TH),
@@ -207,6 +226,42 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
207
226
  return result;
208
227
  });
209
228
 
229
+ /**
230
+ * 查询导出数据
231
+ * @param params
232
+ * @returns
233
+ */
234
+ const handleSearchAll = async () => {
235
+ if (loading) return { success: false } as API.Result_TableListType<T>;
236
+
237
+ // 请求前拦截器
238
+ let processedParams = { ...tableSearchParams };
239
+ if (interceptors.query?.request) {
240
+ processedParams = interceptors.query.request(processedParams);
241
+ }
242
+
243
+ setLoading(true);
244
+ const result = await queryList<T[]>(tableSearchParams, {
245
+ queryFn: apis.query,
246
+ });
247
+ setLoading(false);
248
+
249
+ if (!result.success && result.error?.response?.status === 504) {
250
+ message.error(
251
+ formatMessage({ id: 'pages.File.export.timeOut.help', defaultMessage: '数据量过大,请联系工作人员帮助导出' }),
252
+ );
253
+ }
254
+
255
+ // 请求后拦截器
256
+ let processedResult = result;
257
+ if (interceptors.query?.response) {
258
+ processedResult = interceptors.query.response(result);
259
+ }
260
+
261
+ setTableList(processedResult.data);
262
+ return processedResult;
263
+ };
264
+
210
265
  /**
211
266
  * 查询表格数据
212
267
  */
@@ -338,6 +393,118 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
338
393
  });
339
394
  });
340
395
 
396
+ // 将导入的列表数据提交给后端
397
+ const submitListData = async (list: T[]) => {
398
+ return await doAction('IMPORT', list, {
399
+ actionFn: apis.importData,
400
+ showMsg: false,
401
+ });
402
+ };
403
+
404
+ // 导入物料
405
+ const importListData = useMemoizedFn(async (list: T[]) => {
406
+ if(!apis.importData && !interceptors.importData?.submitImportListData) return;
407
+
408
+ // 处理导入数据,正确赋值字段以及转格式
409
+ const newList = interceptors.importData?.request?.(list) ?? handleImportList<T>(list);
410
+
411
+ // 导入校验提示
412
+ const errorMessageList = interceptors.importData?.checkImportExecl?.(newList) || [];
413
+
414
+ if (errorMessageList.length) {
415
+ interceptors.importData?.showCheckErrorTips?.(errorMessageList) || showCheckErrorTips(errorMessageList);
416
+ return Promise.resolve({ success: false });
417
+ }
418
+
419
+ const resutl = await interceptors.importData?.submitImportListData?.(newList) || await submitListData(newList);
420
+
421
+ onAfterImport?.(resutl);
422
+
423
+ if (resutl.success) {
424
+ actionRef.current?.reload();
425
+ }
426
+ return resutl;
427
+ });
428
+
429
+ const handlePercentChange = (value: number) => {
430
+ setPercent(value);
431
+ };
432
+
433
+ /**
434
+ * 下载数据为Excel
435
+ */
436
+ const handleDownloadExcel = async () => {
437
+ const result = await handleSearchAll();
438
+ if (!result.success || result.error || !result.data) {
439
+ return;
440
+ }
441
+
442
+ const MAX_DOWNLOAD = cfmmUtils?.MAX_DOWNLOAD || 65536;
443
+
444
+ setDownloadButtonLoading(true);
445
+
446
+ const exportColums = getExportColumns<T>({ columns, columnsStateMap });
447
+
448
+ //固定列名
449
+ let columnsName: any[] = exportColums.map((item) => item.title).filter(Boolean);
450
+ //文件名根据多语言形成
451
+ const fileName = formatMessage({
452
+ id: `${baseLocalCode}.title`,
453
+ defaultMessage: '数据列表',
454
+ });
455
+
456
+ //创建导出Excel
457
+ genExcel(fileName + '.xlsx', 'sheet1', columnsName, function () {
458
+ //生成数据
459
+ return new Promise((resolve) => {
460
+ //所有数据行
461
+ getExportValueForColumns({
462
+ columns: exportColums,
463
+ data: result.data,
464
+ getLocalDate,
465
+ handlePercentChange,
466
+ })
467
+ .then((allRows) => {
468
+ if (allRows.length > MAX_DOWNLOAD) {
469
+ Modal.warning({
470
+ title: formatMessage({ id: 'common.download.exceed.max.title', defaultMessage: `下载数据过大提醒` }),
471
+ content: formatMessage(
472
+ {
473
+ id: 'common.download.exceed.max.tips',
474
+ defaultMessage: `超出最大下载数据 ${MAX_DOWNLOAD} 条,超出部分请重新下载`,
475
+ },
476
+ {
477
+ count: MAX_DOWNLOAD,
478
+ },
479
+ ),
480
+ onOk: () => resolve(allRows.slice(0, MAX_DOWNLOAD)),
481
+ });
482
+ } else {
483
+ resolve(allRows);
484
+ }
485
+ })
486
+ .catch((err) => console.log('err', err))
487
+ .finally(() => {
488
+ timer.current = setTimeout(() => {
489
+ setDownloadButtonLoading(false);
490
+ setPercent(0);
491
+ }, 2000);
492
+ });
493
+ });
494
+ });
495
+ };
496
+
497
+ /**
498
+ * 下载模板
499
+ */
500
+ const handleDownloadTemplate = () => {
501
+ handleTemplateDownloadModalSearchParamsChange({
502
+ templateTypeCode: downloadTemplate.templateTypeCode,
503
+ moduleCode: downloadTemplate.moduleCode,
504
+ });
505
+ templateDownloadModalOpenChange(true);
506
+ };
507
+
341
508
  /**
342
509
  * 增强的列配置(添加操作列)
343
510
  */
@@ -489,16 +656,48 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
489
656
  </ImportExecl>
490
657
  ),
491
658
  },
659
+ {
660
+ auth: getAuthorityFn(defaultAuthCodes.templateDownload),
661
+ key: 'templateDownload',
662
+ label: (
663
+ <a onClick={handleDownloadTemplate} key="templateDownload">
664
+ <DownloadOutlined style={{ marginRight: 6 }} />
665
+ {formatMessage({ id: 'cfmmUI.common.button.importData', defaultMessage: '下载模板' })}
666
+ </a>
667
+ ),
668
+ },
669
+ {
670
+ auth: getAuthorityFn(defaultAuthCodes.import) && (apis.importData || interceptors.importData?.submitImportListData),
671
+ key: 'import',
672
+ label: (
673
+ <ImportExecl key="importMaterial" rangeStart={{ c: 0, r: 2 }} onChange={importListData}>
674
+ <div style={{ color: !actionLoading ? 'rgba(0, 0, 0, 0.88)' : 'rgba(0, 0, 0, 0.25)' }}>
675
+ <UploadOutlined style={{ marginRight: 8 }} />
676
+ {formatMessage({ id: 'cfmmUI.common.button.importData', defaultMessage: '导入数据' })}
677
+ </div>
678
+ </ImportExecl>
679
+ ),
680
+ },
681
+ {
682
+ auth: getAuthorityFn(defaultAuthCodes.exprot),
683
+ key: 'exprot',
684
+ disabled: !tableList.length || loading,
685
+ label: <a onClick={handleDownloadExcel} key="exprot">
686
+ <CloudDownloadOutlined style={{ marginRight: 6 }} />
687
+ {formatMessage({ id: 'cfmmUI.common.button.exprotData', defaultMessage: '导出数据' })}
688
+ </a>
689
+ },
492
690
  ];
493
691
 
494
692
  // 过滤有权限的按钮,并移除 auth 属性避免传递到 DOM
495
693
  return allButtons
496
694
  .filter((button) => button.auth)
497
695
  .map(({ auth, ...rest }) => rest);
498
- }, []);
696
+ }, [tableList, loading, columnsStateMap]);
499
697
 
500
698
  return (
501
699
  <>
700
+ {downloadButtonLoading ? <Progress percent={percent} size="small" /> : null}
502
701
  <ProTable<T>
503
702
  headerTitle={formatMessage({
504
703
  id: `${baseLocalCode}.title`,
@@ -510,9 +709,9 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
510
709
  search={cfmmUtils?.getTableSearchFormLayout()}
511
710
  scroll={cfmmUtils?.TABLE_SCROLL ?? TABLE_SCROLL}
512
711
  toolBarRender={useMemoizedFn(() => {
513
- if(!getBarButtons?.length) return [];
712
+ if (!getBarButtons?.length) return [];
514
713
  return [
515
- <Dropdown.Button type="primary" loading={actionLoading} menu={{ items: getBarButtons.slice(1) }}>
714
+ <Dropdown.Button type="primary" loading={actionLoading || downloadButtonLoading} menu={{ items: getBarButtons.slice(1) }}>
516
715
  {getBarButtons[0].icon}
517
716
  {getBarButtons[0].label}
518
717
  </Dropdown.Button>
@@ -520,10 +719,17 @@ function CrudTable<T extends Record<string, any>, U = {}, C = {}>(
520
719
  })}
521
720
  request={useMemoizedFn(async (params, sorter) => {
522
721
  const { current, pageIndex = params.current, pageSize, ...otherParams } = params;
722
+
723
+ setTableSearchParams({ ...otherParams, orderBy: { ...sorter } });
724
+
523
725
  const result = await handleSearch({ pageIndex, pageSize, orderBy: { ...sorter }, ...otherParams });
524
726
  return result;
525
727
  })}
526
728
  columns={enhancedColumns}
729
+ columnsState={{
730
+ value: columnsStateMap,
731
+ onChange: setColumnsStateMap,
732
+ }}
527
733
  rowSelection={useMemo(
528
734
  () => ({
529
735
  onChange: (selectedRowKeys, selectedRows) => {
@@ -111,6 +111,9 @@ declare const _default: {
111
111
  'cfmmUI.common.button.back': string;
112
112
  'cfmmUI.common.button.exportMultiLang': string;
113
113
  'cfmmUI.common.button.importMultiLang': string;
114
+ "cfmmUI.common.button.templateDownload": string;
115
+ "cfmmUI.common.button.importData": string;
116
+ "cfmmUI.common.button.exportData": string;
114
117
  'cfmmUI.common.button.exportMultiLang.notice': string;
115
118
  'cfmmUI.action.create.waitingMessage': string;
116
119
  'cfmmUI.action.update.waitingMessage': string;
@@ -22,6 +22,9 @@ declare const _default: {
22
22
  'cfmmUI.common.button.back': string;
23
23
  'cfmmUI.common.button.exportMultiLang': string;
24
24
  'cfmmUI.common.button.importMultiLang': string;
25
+ "cfmmUI.common.button.templateDownload": string;
26
+ "cfmmUI.common.button.importData": string;
27
+ "cfmmUI.common.button.exportData": string;
25
28
  'cfmmUI.common.button.exportMultiLang.notice': string;
26
29
  'cfmmUI.action.create.waitingMessage': string;
27
30
  'cfmmUI.action.update.waitingMessage': string;
@@ -24,6 +24,9 @@ export default {
24
24
  'cfmmUI.common.button.back': 'Back',
25
25
  'cfmmUI.common.button.exportMultiLang': 'Export Multi Language',
26
26
  'cfmmUI.common.button.importMultiLang': 'Import Multi Language',
27
+ "cfmmUI.common.button.templateDownload": "Template Download",
28
+ "cfmmUI.common.button.importData": "Import Data",
29
+ "cfmmUI.common.button.exportData": "Export Data",
27
30
  'cfmmUI.common.button.exportMultiLang.notice': 'Please do not modify the table structure',
28
31
  //操作提示
29
32
  'cfmmUI.action.create.waitingMessage': 'Being Added',
@@ -111,6 +111,9 @@ declare const _default: {
111
111
  'cfmmUI.common.button.back': string;
112
112
  'cfmmUI.common.button.exportMultiLang': string;
113
113
  'cfmmUI.common.button.importMultiLang': string;
114
+ "cfmmUI.common.button.templateDownload": string;
115
+ "cfmmUI.common.button.importData": string;
116
+ "cfmmUI.common.button.exportData": string;
114
117
  'cfmmUI.common.button.exportMultiLang.notice': string;
115
118
  'cfmmUI.action.create.waitingMessage': string;
116
119
  'cfmmUI.action.update.waitingMessage': string;
@@ -111,6 +111,9 @@ declare const _default: {
111
111
  'cfmmUI.common.button.back': string;
112
112
  'cfmmUI.common.button.exportMultiLang': string;
113
113
  'cfmmUI.common.button.importMultiLang': string;
114
+ "cfmmUI.common.button.templateDownload": string;
115
+ "cfmmUI.common.button.importData": string;
116
+ "cfmmUI.common.button.exportData": string;
114
117
  'cfmmUI.common.button.exportMultiLang.notice': string;
115
118
  'cfmmUI.action.create.waitingMessage': string;
116
119
  'cfmmUI.action.update.waitingMessage': string;
@@ -111,6 +111,9 @@ declare const _default: {
111
111
  "cfmmUI.common.button.back": string;
112
112
  "cfmmUI.common.button.exportMultiLang": string;
113
113
  "cfmmUI.common.button.importMultiLang": string;
114
+ "cfmmUI.common.button.templateDownload": string;
115
+ "cfmmUI.common.button.importData": string;
116
+ "cfmmUI.common.button.exportData": string;
114
117
  "cfmmUI.common.button.exportMultiLang.notice": string;
115
118
  "cfmmUI.action.create.waitingMessage": string;
116
119
  "cfmmUI.action.update.waitingMessage": string;
@@ -110,6 +110,9 @@ declare const _default: {
110
110
  "cfmmUI.common.button.back": string;
111
111
  "cfmmUI.common.button.exportMultiLang": string;
112
112
  "cfmmUI.common.button.importMultiLang": string;
113
+ "cfmmUI.common.button.templateDownload": string;
114
+ "cfmmUI.common.button.importData": string;
115
+ "cfmmUI.common.button.exportData": string;
113
116
  "cfmmUI.common.button.exportMultiLang.notice": string;
114
117
  "cfmmUI.action.create.waitingMessage": string;
115
118
  "cfmmUI.action.update.waitingMessage": string;
@@ -22,6 +22,9 @@ declare const _default: {
22
22
  "cfmmUI.common.button.back": string;
23
23
  "cfmmUI.common.button.exportMultiLang": string;
24
24
  "cfmmUI.common.button.importMultiLang": string;
25
+ "cfmmUI.common.button.templateDownload": string;
26
+ "cfmmUI.common.button.importData": string;
27
+ "cfmmUI.common.button.exportData": string;
25
28
  "cfmmUI.common.button.exportMultiLang.notice": string;
26
29
  "cfmmUI.action.create.waitingMessage": string;
27
30
  "cfmmUI.action.update.waitingMessage": string;
@@ -24,6 +24,9 @@ export default {
24
24
  "cfmmUI.common.button.back": "返回",
25
25
  "cfmmUI.common.button.exportMultiLang": "导出多语言",
26
26
  "cfmmUI.common.button.importMultiLang": "导入多语言",
27
+ "cfmmUI.common.button.templateDownload": "模板下载",
28
+ "cfmmUI.common.button.importData": "导入数据",
29
+ "cfmmUI.common.button.exportData": "导出数据",
27
30
  "cfmmUI.common.button.exportMultiLang.notice": "请勿修改表格结构",
28
31
  //操作提示
29
32
  "cfmmUI.action.create.waitingMessage": "正在新增",
@@ -111,6 +111,9 @@ declare const _default: {
111
111
  "cfmmUI.common.button.back": string;
112
112
  "cfmmUI.common.button.exportMultiLang": string;
113
113
  "cfmmUI.common.button.importMultiLang": string;
114
+ "cfmmUI.common.button.templateDownload": string;
115
+ "cfmmUI.common.button.importData": string;
116
+ "cfmmUI.common.button.exportData": string;
114
117
  "cfmmUI.common.button.exportMultiLang.notice": string;
115
118
  "cfmmUI.action.create.waitingMessage": string;
116
119
  "cfmmUI.action.update.waitingMessage": string;
@@ -22,6 +22,9 @@ declare const _default: {
22
22
  "cfmmUI.common.button.back": string;
23
23
  "cfmmUI.common.button.exportMultiLang": string;
24
24
  "cfmmUI.common.button.importMultiLang": string;
25
+ "cfmmUI.common.button.templateDownload": string;
26
+ "cfmmUI.common.button.importData": string;
27
+ "cfmmUI.common.button.exportData": string;
25
28
  "cfmmUI.common.button.exportMultiLang.notice": string;
26
29
  "cfmmUI.action.create.waitingMessage": string;
27
30
  "cfmmUI.action.update.waitingMessage": string;
@@ -24,6 +24,9 @@ export default {
24
24
  "cfmmUI.common.button.back": "返回",
25
25
  "cfmmUI.common.button.exportMultiLang": "導出多語言",
26
26
  "cfmmUI.common.button.importMultiLang": "導入多語言",
27
+ "cfmmUI.common.button.templateDownload": "模板下載",
28
+ "cfmmUI.common.button.importData": "導入數據",
29
+ "cfmmUI.common.button.exportData": "導出數據",
27
30
  "cfmmUI.common.button.exportMultiLang.notice": "請勿修改表格結構",
28
31
  //操作提示
29
32
  "cfmmUI.action.create.waitingMessage": "正在新增",
@@ -110,6 +110,9 @@ declare const _default: {
110
110
  "cfmmUI.common.button.back": string;
111
111
  "cfmmUI.common.button.exportMultiLang": string;
112
112
  "cfmmUI.common.button.importMultiLang": string;
113
+ "cfmmUI.common.button.templateDownload": string;
114
+ "cfmmUI.common.button.importData": string;
115
+ "cfmmUI.common.button.exportData": string;
113
116
  "cfmmUI.common.button.exportMultiLang.notice": string;
114
117
  "cfmmUI.action.create.waitingMessage": string;
115
118
  "cfmmUI.action.update.waitingMessage": string;