@ctzy-web-client/data-model 1.0.0
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.
- package/package.json +33 -0
- package/src/SimpleOrm.js +123 -0
- package/src/abstract/DataColumn.js +164 -0
- package/src/abstract/DataForm.js +342 -0
- package/src/abstract/DataModel.js +327 -0
- package/src/abstract/DataModelAdapter.js +241 -0
- package/src/abstract/DataTable.js +627 -0
- package/src/abstract/FilterColumn.js +60 -0
- package/src/abstract/FilterPanel.js +678 -0
- package/src/abstract/FormColumn.js +63 -0
- package/src/abstract/TableColumn.js +83 -0
- package/src/abstract/where/CombineCondition.js +115 -0
- package/src/abstract/where/Condition.js +3 -0
- package/src/abstract/where/SingleCondition.js +22 -0
- package/src/abstract/where/Where.js +22 -0
- package/src/decorator/constant.js +13 -0
- package/src/decorator/dataForm.js +35 -0
- package/src/decorator/dataTable.js +38 -0
- package/src/decorator/filterColumn.js +29 -0
- package/src/decorator/formColumn.js +60 -0
- package/src/decorator/tableColumn.js +42 -0
- package/src/factory.js +25 -0
- package/src/index.js +26 -0
- package/src/utils/index.js +16 -0
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ctzy-web-client/data-model",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"module": "es/index.mjs",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"require": "./lib/index.js",
|
|
10
|
+
"import": "./es/index.mjs"
|
|
11
|
+
},
|
|
12
|
+
"./src": "./src/index.js",
|
|
13
|
+
"./src/*": "./src/*",
|
|
14
|
+
"./es": "./es/index.mjs",
|
|
15
|
+
"./lib": "./lib/index.js",
|
|
16
|
+
"./es/*": "./es/*",
|
|
17
|
+
"./lib/*": "./lib/*"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [],
|
|
20
|
+
"author": "",
|
|
21
|
+
"license": "ISC",
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@types/lodash": "^4.14.188",
|
|
24
|
+
"@ctzy-web-client/ioc": "^1.0.0",
|
|
25
|
+
"@ctzy-web-client/ioc-annotations": "^1.0.0",
|
|
26
|
+
"@ctzy-web-client/support": "^1.0.0",
|
|
27
|
+
"lodash": "^4.17.21",
|
|
28
|
+
"rxjs": "^7.6.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/SimpleOrm.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { inject } from '@ctzy-web-client/ioc-annotations';
|
|
2
|
+
import { InstantiationService } from '@ctzy-web-client/ioc';
|
|
3
|
+
import DataModelAdapter from './abstract/DataModelAdapter';
|
|
4
|
+
import DataTable from './abstract/DataTable';
|
|
5
|
+
import DataForm from './abstract/dataForm';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 请求类
|
|
9
|
+
*/
|
|
10
|
+
export default class SimpleOrm {
|
|
11
|
+
@inject(DataModelAdapter)
|
|
12
|
+
adapter = null;
|
|
13
|
+
|
|
14
|
+
@inject(InstantiationService)
|
|
15
|
+
instantiationService = null;
|
|
16
|
+
|
|
17
|
+
createDataTable(model, options = {}) {
|
|
18
|
+
return this.instantiationService.createInstance(DataTable, {
|
|
19
|
+
args: [{ model }],
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
createDataForm(model, options = {}) {
|
|
24
|
+
return this.instantiationService.createInstance(DataForm, {
|
|
25
|
+
args: [{ model }],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 填充数据模型 最大请求1w条数据可以指定翻页参数修改填充的最大记录
|
|
31
|
+
* @template T
|
|
32
|
+
* @param {T} classType 模型定义
|
|
33
|
+
* @param {Object} params 参数
|
|
34
|
+
* @param {Number} maxRecCount 最大填充记录数
|
|
35
|
+
* @returns {Promise<InstanceType<T>[]>}
|
|
36
|
+
*/
|
|
37
|
+
async fill(classType, params, maxRecCount = 10000) {
|
|
38
|
+
const dataTable = this.createDataForm(classType);
|
|
39
|
+
return dataTable.adapter
|
|
40
|
+
.loadDataListHandle(
|
|
41
|
+
dataTable,
|
|
42
|
+
Object.assign(
|
|
43
|
+
{
|
|
44
|
+
[dataTable.adapter.pagerNumParamName]: 1,
|
|
45
|
+
[dataTable.adapter.recCountParamName]: maxRecCount,
|
|
46
|
+
},
|
|
47
|
+
params
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
.then((res) => {
|
|
51
|
+
//创建
|
|
52
|
+
return res.data.map((dataItem) => {
|
|
53
|
+
let modelInstance = new classType();
|
|
54
|
+
|
|
55
|
+
dataTable.getColumns().forEach((column) => {
|
|
56
|
+
modelInstance[column.attrName] = dataItem[column.name];
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return modelInstance;
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 请求一条记录直接填充到模型的实例
|
|
66
|
+
* @template T
|
|
67
|
+
* @param {T} classType 模型定义
|
|
68
|
+
* @param {Object} params 参数
|
|
69
|
+
* @returns {Promise<InstanceType<T>>}
|
|
70
|
+
*/
|
|
71
|
+
async first(classType, params) {
|
|
72
|
+
return this.fill(classType, params, 1).then((data) => {
|
|
73
|
+
return data[0] || null;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 根据recid请求一条实例填充到模型
|
|
79
|
+
* @template T
|
|
80
|
+
* @param {T} classType 模型定义
|
|
81
|
+
* @param {String|Number} recId 主记录id
|
|
82
|
+
* @returns {Promise<InstanceType<T>>}
|
|
83
|
+
*/
|
|
84
|
+
async firstByRecId(classType, recId) {
|
|
85
|
+
const dataTable = this.createDataTable(classType);
|
|
86
|
+
return this.adapter
|
|
87
|
+
.loadDataByRecIdHandle(
|
|
88
|
+
dataTable,
|
|
89
|
+
Object.assign(
|
|
90
|
+
{
|
|
91
|
+
[this.primaryKey]: recId,
|
|
92
|
+
},
|
|
93
|
+
params
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
.then((data) => {
|
|
97
|
+
const result = Array.isArray(data.data) ? data.data[0] : data.data;
|
|
98
|
+
|
|
99
|
+
if (result) {
|
|
100
|
+
let modelInstance = new classType();
|
|
101
|
+
|
|
102
|
+
dataTable.getColumns().forEach((column) => {
|
|
103
|
+
modelInstance[column.attrName] = result[column.name];
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return modelInstance;
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 提交数据
|
|
114
|
+
* @template T
|
|
115
|
+
* @param {T} classType
|
|
116
|
+
* @param {Object} data 提交的数据
|
|
117
|
+
*/
|
|
118
|
+
submit(classType, data) {
|
|
119
|
+
const dataForm = this.createDataForm(classType);
|
|
120
|
+
dataForm.adapter = this.adapter;
|
|
121
|
+
return dataForm.submit(data);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 数据列定义
|
|
5
|
+
*/
|
|
6
|
+
export default class DataColumn {
|
|
7
|
+
/**
|
|
8
|
+
* 标题
|
|
9
|
+
* @type {String}
|
|
10
|
+
*/
|
|
11
|
+
title = '';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 名称
|
|
15
|
+
* @type {String}
|
|
16
|
+
*/
|
|
17
|
+
name = '';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 映射的类属性名称
|
|
21
|
+
* @type {String}
|
|
22
|
+
*/
|
|
23
|
+
attrName = '';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 完整的属性名称
|
|
27
|
+
* @type {String}
|
|
28
|
+
*/
|
|
29
|
+
fullAttrName = '';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 默认值
|
|
33
|
+
* @type {undefined}
|
|
34
|
+
*/
|
|
35
|
+
default = undefined;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 是否显示列
|
|
39
|
+
* @type {Boolean}
|
|
40
|
+
*/
|
|
41
|
+
_visible = true;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 字段在组件里面渲染的所用到的组件,可以是组件对象,字符串,或者方法,工厂方法必然返回vnode 默认:无
|
|
45
|
+
* @type {undefined}
|
|
46
|
+
*/
|
|
47
|
+
component = undefined;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 是否是扩展字段
|
|
51
|
+
* @type {Boolean}
|
|
52
|
+
*/
|
|
53
|
+
isExtend = false;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 组件标题
|
|
57
|
+
* @type {String}
|
|
58
|
+
*/
|
|
59
|
+
componentTitle = '';
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 字段在组件中渲染所需要的配置参数,如果是函数的话函数的第一个参数会返回当前数据列对象和当前行数据,此时可动态返回所需参数
|
|
63
|
+
* @type {undefined}
|
|
64
|
+
*/
|
|
65
|
+
componentProps = undefined;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 可观察的是否可见的主题
|
|
69
|
+
* @type {BehaviorSubject}
|
|
70
|
+
*/
|
|
71
|
+
_visibleSubject = null;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* DataColumn构造函数
|
|
75
|
+
* @param {Object} options - DataColumn的选项
|
|
76
|
+
* @param {String} options.title - DataColumn的标题
|
|
77
|
+
* @param {String} options.name - DataColumn的名称
|
|
78
|
+
* @param {String} options.attrName - DataColumn的映射的类属性名称
|
|
79
|
+
* @param {undefined} options.default - DataColumn的默认值
|
|
80
|
+
* @param {Boolean} options.visible - DataColumn是否可见
|
|
81
|
+
* @param {undefined} options.component - DataColumn的组件
|
|
82
|
+
* @param {String} options.componentTitle - DataColumn的组件标题
|
|
83
|
+
* @param {undefined} options.componentProps - DataColumn的组件参数
|
|
84
|
+
* @param {Boolean} options.isExtend - DataColumn是否是扩展字段
|
|
85
|
+
* @param {String} options.fullAttrName - DataColumn的完整属性名称
|
|
86
|
+
*/
|
|
87
|
+
constructor(options) {
|
|
88
|
+
this.title = options?.title ?? this.title;
|
|
89
|
+
this.name = options?.name ?? this.name;
|
|
90
|
+
this.attrName = options?.attrName ?? this.attrName;
|
|
91
|
+
this.default = options?.default ?? this.default;
|
|
92
|
+
this._visible = options?.visible ?? this._visible;
|
|
93
|
+
this.component = options?.component ?? this.component;
|
|
94
|
+
this.componentTitle = options?.componentTitle ?? this.componentTitle;
|
|
95
|
+
this.componentProps = options?.componentProps ?? this.componentProps;
|
|
96
|
+
this.isExtend = options?.isExtend ?? this.isExtend;
|
|
97
|
+
this.fullAttrName = this.isExtend ? options?.fullAttrName : this.attrName;
|
|
98
|
+
|
|
99
|
+
this._visibleSubject = new BehaviorSubject(this._visible);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 获取是否可见
|
|
104
|
+
* @returns {Boolean} 是否可见
|
|
105
|
+
*/
|
|
106
|
+
get visible() {
|
|
107
|
+
return this._visible;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* 设置是否可见
|
|
112
|
+
* @param {Boolean} visible - 是否可见
|
|
113
|
+
*/
|
|
114
|
+
set visible(visible) {
|
|
115
|
+
if (visible) {
|
|
116
|
+
this.show();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.hide();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* 获取可观察的是否可见的主题
|
|
125
|
+
* @returns {BehaviorSubject} 可观察的是否可见的主题
|
|
126
|
+
*/
|
|
127
|
+
getVisibleSubject() {
|
|
128
|
+
return this._visibleSubject;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 显示
|
|
133
|
+
*/
|
|
134
|
+
show() {
|
|
135
|
+
if (this._visible) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this._visible = true;
|
|
139
|
+
this._visibleSubject.next(this._visible);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 隐藏
|
|
144
|
+
*/
|
|
145
|
+
hide() {
|
|
146
|
+
if (!this._visible) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this._visible = false;
|
|
150
|
+
this._visibleSubject.next(this._visible);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 切换是否可见
|
|
155
|
+
*/
|
|
156
|
+
toggleVisible() {
|
|
157
|
+
if (this._visible) {
|
|
158
|
+
this.hide();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
this.show();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import get from 'lodash/get';
|
|
2
|
+
import { DATA_FORM, DATA_FORM_COLUMNS } from '../decorator/constant';
|
|
3
|
+
import { sortColumn } from '../utils';
|
|
4
|
+
import DataModel from './DataModel';
|
|
5
|
+
import FormColumn from './FormColumn';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @class
|
|
9
|
+
* @classdesc 表单数据
|
|
10
|
+
* @extends DataModel
|
|
11
|
+
*/
|
|
12
|
+
export default class DataForm extends DataModel {
|
|
13
|
+
/**
|
|
14
|
+
* @type {Boolean} 表单数据是否发生改变
|
|
15
|
+
*/
|
|
16
|
+
changed = false;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @type {Boolean} 锁定中 (主要是加载表单数据和提交表单的时候需要锁定避免操作带来的异常)
|
|
20
|
+
*/
|
|
21
|
+
locking = false;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @type {Boolean} 是否禁用
|
|
25
|
+
*/
|
|
26
|
+
disabled = false;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @type {Object} 表单数据
|
|
30
|
+
*/
|
|
31
|
+
data = {};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @type {{ validate: () => Promise<boolean> }[]}
|
|
35
|
+
*/
|
|
36
|
+
formValivators = [];
|
|
37
|
+
|
|
38
|
+
_loadCallbacks = [];
|
|
39
|
+
|
|
40
|
+
_inited = false;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @constructor
|
|
44
|
+
* @param {Object} option 配置
|
|
45
|
+
* @param {String} option.name 表格名称
|
|
46
|
+
* @param {String} option.title 表格标题
|
|
47
|
+
* @param {String} option.primaryKey 主键字段名
|
|
48
|
+
*/
|
|
49
|
+
constructor(option) {
|
|
50
|
+
super(option);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
*
|
|
55
|
+
* @param {Object} options 配置
|
|
56
|
+
* @param {Object} options.model 模型
|
|
57
|
+
*/
|
|
58
|
+
setOptions(options) {
|
|
59
|
+
if (!options.model) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
super.setOptions({ ...options.model[DATA_FORM], model: options.model });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
*
|
|
68
|
+
* @desc 禁用
|
|
69
|
+
*/
|
|
70
|
+
disable() {
|
|
71
|
+
this.disabled = true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
*
|
|
76
|
+
* @desc 启用
|
|
77
|
+
*/
|
|
78
|
+
enable() {
|
|
79
|
+
this.disabled = false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* @desc 初始化
|
|
85
|
+
*/
|
|
86
|
+
init() {
|
|
87
|
+
super.init();
|
|
88
|
+
|
|
89
|
+
const model = this.model;
|
|
90
|
+
if (!model) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (this.extendField) {
|
|
95
|
+
return;
|
|
96
|
+
} else {
|
|
97
|
+
const columns = (model[DATA_FORM_COLUMNS] || []).map(
|
|
98
|
+
(columnConfig) => new FormColumn(columnConfig)
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
for (const column of columns) {
|
|
102
|
+
this.addColumn(column);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
model.formColumns = this.getColumns().map((column) => column.attrName);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this.setData(null);
|
|
109
|
+
|
|
110
|
+
this._inited = true
|
|
111
|
+
|
|
112
|
+
this.emit('init-completed');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
setExtendFieldInfos(extendFieldInfos) {
|
|
116
|
+
if (this._inited) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.extendFieldInfos = extendFieldInfos;
|
|
121
|
+
|
|
122
|
+
const formColumns = extendFieldInfos.map(
|
|
123
|
+
(extendField) =>
|
|
124
|
+
new FormColumn({
|
|
125
|
+
name: extendField.name,
|
|
126
|
+
title: extendField.title,
|
|
127
|
+
attrName: extendField.name,
|
|
128
|
+
submitName: extendField.name,
|
|
129
|
+
default: extendField.defaultValue || '',
|
|
130
|
+
isExtend: !extendField.type,
|
|
131
|
+
required: !!extendField.isRequired,
|
|
132
|
+
component: extendField.component,
|
|
133
|
+
componentProps: extendField.extendInfo ?? {},
|
|
134
|
+
fullAttrName: `${this.extendField}.${extendField.name}`,
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
this.setColumns(formColumns);
|
|
139
|
+
|
|
140
|
+
this.setData(null);
|
|
141
|
+
|
|
142
|
+
this._inited = true;
|
|
143
|
+
|
|
144
|
+
for (const callback of this._loadCallbacks) {
|
|
145
|
+
callback();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
this.emit('init-completed');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
*
|
|
153
|
+
* @desc 设置表单数据
|
|
154
|
+
* @param {Object} data 表单数据
|
|
155
|
+
*/
|
|
156
|
+
setData(data) {
|
|
157
|
+
if (data) {
|
|
158
|
+
this.data = data;
|
|
159
|
+
} else {
|
|
160
|
+
this.reset();
|
|
161
|
+
}
|
|
162
|
+
this.ready = true;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
*
|
|
167
|
+
* @desc 重置表单数据
|
|
168
|
+
*/
|
|
169
|
+
reset() {
|
|
170
|
+
this.setData(this.formatData({}));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @desc 根据id获取编辑数据
|
|
176
|
+
* @param {String|Number} params 记录id
|
|
177
|
+
* @returns
|
|
178
|
+
*/
|
|
179
|
+
async loadDataByRecId(params) {
|
|
180
|
+
if (!this._inited) {
|
|
181
|
+
return new Promise((resolve, reject) => {
|
|
182
|
+
this._loadCallbacks.push(() => {
|
|
183
|
+
this.loadDataByRecId(params).then(resolve, reject);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
//获取正式数据
|
|
189
|
+
this.locking = true;
|
|
190
|
+
|
|
191
|
+
if (typeof params !== 'object') {
|
|
192
|
+
params = {
|
|
193
|
+
[this.primaryKey]: params,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
//加载参数
|
|
198
|
+
params = {
|
|
199
|
+
...this.defaultParams,
|
|
200
|
+
...params,
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
//加载完成
|
|
204
|
+
this.emit('before-load', params);
|
|
205
|
+
|
|
206
|
+
//加载
|
|
207
|
+
return this.adapter
|
|
208
|
+
.loadDataByRecIdHandle(this, params)
|
|
209
|
+
.then((res) => {
|
|
210
|
+
//加载完成
|
|
211
|
+
const data = this.formatData(
|
|
212
|
+
Array.isArray(res.data) ? res.data[0] : res.data
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
//设置数据
|
|
216
|
+
this.setData(data);
|
|
217
|
+
|
|
218
|
+
this.emit('load-successfully', res);
|
|
219
|
+
|
|
220
|
+
return res;
|
|
221
|
+
})
|
|
222
|
+
.catch((e) => {
|
|
223
|
+
this.emit('load-failed', e);
|
|
224
|
+
return Promise.reject(e);
|
|
225
|
+
})
|
|
226
|
+
.finally(() => {
|
|
227
|
+
//解锁
|
|
228
|
+
this.locking = false;
|
|
229
|
+
|
|
230
|
+
this.emit('load-complete');
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
*
|
|
236
|
+
* @desc 格式化提交数据
|
|
237
|
+
* @param {Object} data 表单数据
|
|
238
|
+
* @returns {Object} 格式化后的数据
|
|
239
|
+
*/
|
|
240
|
+
formatSubmitData(data) {
|
|
241
|
+
return this._format(data, 'submitName');
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
*
|
|
246
|
+
* @desc 排序列
|
|
247
|
+
* @param {Array} columns 列
|
|
248
|
+
* @returns {Array} 排序后的列
|
|
249
|
+
*/
|
|
250
|
+
sortColumns(columns) {
|
|
251
|
+
return sortColumn(columns, this.model.formColumns || []);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async validate() {
|
|
255
|
+
if (!this.formValivators.length) {
|
|
256
|
+
return Promise.resolve(false);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const validateResults = await Promise.all(
|
|
260
|
+
this.formValivators.map((validator) =>
|
|
261
|
+
validator.validate().then(
|
|
262
|
+
() => true,
|
|
263
|
+
() => false
|
|
264
|
+
)
|
|
265
|
+
)
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
return validateResults.reduce((result, item) => result && item, true);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
*
|
|
273
|
+
* @desc 提交表单
|
|
274
|
+
* @param {Object} data 表单数据
|
|
275
|
+
* @returns
|
|
276
|
+
*/
|
|
277
|
+
async submit(data = {}) {
|
|
278
|
+
if (this.disabled) {
|
|
279
|
+
throw new Error('禁用状态不能保存');
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (this.locking) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (!(await this.validate())) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
//获取正式数据
|
|
291
|
+
this.locking = true;
|
|
292
|
+
|
|
293
|
+
const submitData = {};
|
|
294
|
+
|
|
295
|
+
for (let column of this.getColumns().filter((column) => !column.isExtend)) {
|
|
296
|
+
submitData[column.submitName] = this.data[column.attrName];
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (this.extendField) {
|
|
300
|
+
let extendObject = {};
|
|
301
|
+
for (let column of this.getColumns().filter(
|
|
302
|
+
(column) => column.isExtend
|
|
303
|
+
)) {
|
|
304
|
+
extendObject[column.attrName] = get(this.data, column.fullAttrName);
|
|
305
|
+
}
|
|
306
|
+
submitData[this.extendField] = extendObject;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
Object.assign(submitData, data);
|
|
310
|
+
|
|
311
|
+
this.emit('before-submit', data);
|
|
312
|
+
|
|
313
|
+
//处理
|
|
314
|
+
return this.adapter
|
|
315
|
+
.submitHandle(this, submitData)
|
|
316
|
+
.then((res) => {
|
|
317
|
+
this.emit('submit-successfully', res);
|
|
318
|
+
return res;
|
|
319
|
+
})
|
|
320
|
+
.catch((e) => {
|
|
321
|
+
this.emit('submit-failed', e);
|
|
322
|
+
return Promise.reject(e);
|
|
323
|
+
})
|
|
324
|
+
.finally(() => {
|
|
325
|
+
this.emit('submit-complete');
|
|
326
|
+
//解锁
|
|
327
|
+
this.locking = false;
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
setDisplayColumns(displayColumns) {
|
|
332
|
+
const displayColumnNames = displayColumns.map(
|
|
333
|
+
(column) => column.fullAttrName
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
this._displayColumns = this.getColumns().filter((column) =>
|
|
337
|
+
displayColumnNames.includes(column.fullAttrName)
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
this.getDisplayColumnsSubject().next(this.getDisplayColumns());
|
|
341
|
+
}
|
|
342
|
+
}
|