@steedos/service-plugin-amis 2.2.52-beta.7 → 2.2.52
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/.scripts/build.tailwind.js +31 -0
- package/LICENSE.txt +2 -5
- package/main/default/client/tailwind.client.js +16 -70
- package/main/default/services/metadata/listviews.service.js +6 -0
- package/main/default/services/utils/fields/index.js +63 -1
- package/main/default/services/utils/graphql.js +97 -5
- package/main/default/services/utils/object-record.js +100 -1
- package/package.json +5 -3
- package/public/tailwind/tailwind.css +1 -0
- package/public/tailwind/tailwind.js +17786 -0
- package/src/tailwind.js +70 -0
|
@@ -252,15 +252,19 @@ module.exports = {
|
|
|
252
252
|
operators: getFieldOperators(field.type)
|
|
253
253
|
});
|
|
254
254
|
break;
|
|
255
|
+
// 以下date 、datetime、time 不能作为amis 表单项的格式 . filters 对此格式做个特殊兼容,
|
|
255
256
|
case 'date':
|
|
257
|
+
// 华炎魔方中日期字段存的是utc的0点
|
|
256
258
|
fields.push({
|
|
257
259
|
label: field.label,
|
|
258
260
|
type: field.type,
|
|
259
261
|
name: field.name,
|
|
262
|
+
format: "YYYY-MM-DDT00:00:00+00:00",
|
|
260
263
|
operators: getFieldOperators(field.type)
|
|
261
264
|
});
|
|
262
265
|
break;
|
|
263
266
|
case 'datetime':
|
|
267
|
+
// 即amis中日期时间控件的format默认值为"YYYY-MM-DDTHH:mm+08:00"正好满足需求
|
|
264
268
|
fields.push({
|
|
265
269
|
label: field.label,
|
|
266
270
|
type: field.type,
|
|
@@ -269,10 +273,12 @@ module.exports = {
|
|
|
269
273
|
});
|
|
270
274
|
break;
|
|
271
275
|
case 'time':
|
|
276
|
+
// 华炎魔方中时间字段存的是1970-01-01的utc时间
|
|
272
277
|
fields.push({
|
|
273
278
|
label: field.label,
|
|
274
279
|
type: field.type,
|
|
275
280
|
name: field.name,
|
|
281
|
+
format: "1970-01-01THH:mm+00:00",
|
|
276
282
|
operators: getFieldOperators(field.type)
|
|
277
283
|
});
|
|
278
284
|
break;
|
|
@@ -5,6 +5,8 @@ const Lookup = require('./lookup');
|
|
|
5
5
|
const AmisFormInputs = [
|
|
6
6
|
'text',
|
|
7
7
|
'date',
|
|
8
|
+
'file',
|
|
9
|
+
'image',
|
|
8
10
|
'datetime',
|
|
9
11
|
'time',
|
|
10
12
|
'number',
|
|
@@ -205,6 +207,7 @@ function convertSFieldToAmisField(field, readonly) {
|
|
|
205
207
|
joinValues: false,
|
|
206
208
|
options: getSelectFieldOptions(field),
|
|
207
209
|
extractValue: true,
|
|
210
|
+
clearable: true,
|
|
208
211
|
labelField: 'label',
|
|
209
212
|
valueField: 'value',
|
|
210
213
|
tpl: readonly ? Tpl.getSelectTpl(field) : null
|
|
@@ -313,7 +316,66 @@ function convertSFieldToAmisField(field, readonly) {
|
|
|
313
316
|
}
|
|
314
317
|
break;
|
|
315
318
|
case 'image':
|
|
316
|
-
|
|
319
|
+
rootUrl = Meteor.absoluteUrl('/api/files/images/');
|
|
320
|
+
convertData = {
|
|
321
|
+
type: getAmisStaticFieldType('image', readonly),
|
|
322
|
+
receiver: {
|
|
323
|
+
method: "post",
|
|
324
|
+
url: "${context.rootUrl}/s3/images",
|
|
325
|
+
adaptor: `
|
|
326
|
+
var rootUrl = ${JSON.stringify(rootUrl)};
|
|
327
|
+
payload = {
|
|
328
|
+
status: response.status == 200 ? 0 : response.status,
|
|
329
|
+
msg: response.statusText,
|
|
330
|
+
data: {
|
|
331
|
+
value: payload._id,
|
|
332
|
+
filename: payload.original.name,
|
|
333
|
+
url: rootUrl + payload._id,
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return payload;
|
|
337
|
+
`,
|
|
338
|
+
headers: {
|
|
339
|
+
Authorization: "Bearer ${context.tenantId},${context.authToken}"
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if(field.multiple){
|
|
344
|
+
convertData.multiple = true;
|
|
345
|
+
convertData.joinValues = false;
|
|
346
|
+
convertData.extractValue = true;
|
|
347
|
+
}
|
|
348
|
+
break;
|
|
349
|
+
case 'file':
|
|
350
|
+
rootUrl = Meteor.absoluteUrl('/api/files/files/');
|
|
351
|
+
convertData = {
|
|
352
|
+
type: getAmisStaticFieldType('file', readonly),
|
|
353
|
+
receiver: {
|
|
354
|
+
method: "post",
|
|
355
|
+
url: "${context.rootUrl}/s3/files",
|
|
356
|
+
adaptor: `
|
|
357
|
+
var rootUrl = ${JSON.stringify(rootUrl)};
|
|
358
|
+
payload = {
|
|
359
|
+
status: response.status == 200 ? 0 : response.status,
|
|
360
|
+
msg: response.statusText,
|
|
361
|
+
data: {
|
|
362
|
+
value: payload._id,
|
|
363
|
+
name: payload.original.name,
|
|
364
|
+
url: rootUrl + payload._id,
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return payload;
|
|
368
|
+
`,
|
|
369
|
+
headers: {
|
|
370
|
+
Authorization: "Bearer ${context.tenantId},${context.authToken}"
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if(field.multiple){
|
|
375
|
+
convertData.multiple = true;
|
|
376
|
+
convertData.joinValues = false;
|
|
377
|
+
convertData.extractValue = true;
|
|
378
|
+
}
|
|
317
379
|
break;
|
|
318
380
|
case 'formula':
|
|
319
381
|
//TODO
|
|
@@ -20,7 +20,7 @@ function getFieldsTemplate(fields, expand){
|
|
|
20
20
|
fieldsName.push(`${field.name}`)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean' || field.type == 'select'){
|
|
23
|
+
if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean' || field.type == 'select' || field.type == 'file'){
|
|
24
24
|
displayFields.push(`${field.name}`)
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -67,16 +67,108 @@ function getSaveQuery(object, recordId, fields, options){
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
/*
|
|
71
|
+
img字段值移除URL前缀使其保存时正常保存id,而不是url。
|
|
72
|
+
*/
|
|
73
|
+
function getScriptForRemoveUrlPrefixForImgFields(fields){
|
|
74
|
+
let imgFieldsKeys = [];
|
|
75
|
+
let imgFields = {};
|
|
76
|
+
fields.forEach((item)=>{
|
|
77
|
+
if(item.type === 'image'){
|
|
78
|
+
imgFieldsKeys.push(item.name);
|
|
79
|
+
imgFields[item.name] = {
|
|
80
|
+
name: item.name,
|
|
81
|
+
multiple: item.multiple
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
if(!imgFieldsKeys.length){
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
return `
|
|
89
|
+
let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};
|
|
90
|
+
let imgFields = ${JSON.stringify(imgFields)};
|
|
91
|
+
imgFieldsKeys.forEach((item)=>{
|
|
92
|
+
let imgFieldValue = formData[item];
|
|
93
|
+
if(imgFieldValue && imgFieldValue.length){
|
|
94
|
+
// 因为表单初始化接口的接收适配器中为image字段值添加了url前缀(为了字段编辑时正常显示图片),所以保存时移除(为了字段值保存时正常保存id,而不是url)。
|
|
95
|
+
if(imgFields[item].multiple){
|
|
96
|
+
if(imgFieldValue instanceof Array){
|
|
97
|
+
formData[item] = imgFieldValue.map((value)=>{
|
|
98
|
+
let itemValue = value?.split('/');
|
|
99
|
+
return itemValue[itemValue.length - 1];
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}else{
|
|
103
|
+
let imgValue = imgFieldValue.split('/');
|
|
104
|
+
formData[item] = imgValue[imgValue.length - 1];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
`
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
file字段值重写使其保存时正常保存id。
|
|
113
|
+
*/
|
|
114
|
+
function getScriptForSimplifiedValueForFileFields(fields){
|
|
115
|
+
let fileFieldsKeys = [];
|
|
116
|
+
let fileFields = {};
|
|
117
|
+
fields.forEach((item)=>{
|
|
118
|
+
if(item.type === 'file'){
|
|
119
|
+
fileFieldsKeys.push(item.name);
|
|
120
|
+
fileFields[item.name] = {
|
|
121
|
+
name: item.name,
|
|
122
|
+
multiple: item.multiple
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
if(!fileFieldsKeys.length){
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
return `
|
|
130
|
+
let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};
|
|
131
|
+
let fileFields = ${JSON.stringify(fileFields)};
|
|
132
|
+
fileFieldsKeys.forEach((item)=>{
|
|
133
|
+
let fileFieldValue = formData[item];
|
|
134
|
+
if(fileFieldValue){
|
|
135
|
+
// 因为表单初始化接口的接收适配器中为file字段值重写了值及格式(为了字段编辑时正常显示附件名、点击附件名正常下载),所以保存时还原(为了字段值保存时正常保存id)。
|
|
136
|
+
if(fileFields[item].multiple){
|
|
137
|
+
if(fileFieldValue instanceof Array && fileFieldValue.length){
|
|
138
|
+
formData[item] = fileFieldValue.map((value)=>{
|
|
139
|
+
if(typeof value === 'object'){
|
|
140
|
+
return value.value;
|
|
141
|
+
}else{
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}else{
|
|
147
|
+
formData[item] = typeof fileFieldValue === 'object' ? fileFieldValue.value : fileFieldValue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
})
|
|
151
|
+
`
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function getSaveDataTpl(fields){
|
|
71
155
|
return `
|
|
72
156
|
const formData = api.data.$;
|
|
157
|
+
for (key in formData){
|
|
158
|
+
// image、select等字段清空值后保存的空字符串转换为null。
|
|
159
|
+
if(formData[key] === ''){
|
|
160
|
+
formData[key] = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
73
163
|
const objectName = api.data.objectName;
|
|
74
164
|
const fieldsName = Object.keys(formData);
|
|
75
165
|
delete formData.created;
|
|
76
166
|
delete formData.created_by;
|
|
77
167
|
delete formData.modified;
|
|
78
168
|
delete formData.modified_by;
|
|
79
|
-
|
|
169
|
+
delete formData._display;
|
|
170
|
+
${getScriptForRemoveUrlPrefixForImgFields(fields)}
|
|
171
|
+
${getScriptForSimplifiedValueForFileFields(fields)}
|
|
80
172
|
let query = \`mutation{record: \${objectName}__insert(doc: {__saveData}){_id}}\`;
|
|
81
173
|
if(formData.recordId){
|
|
82
174
|
query = \`mutation{record: \${objectName}__update(id: "\${formData.recordId}", doc: {__saveData}){_id}}\`;
|
|
@@ -86,9 +178,9 @@ function getSaveDataTpl(){
|
|
|
86
178
|
`
|
|
87
179
|
}
|
|
88
180
|
|
|
89
|
-
function getSaveRequestAdaptor(){
|
|
181
|
+
function getSaveRequestAdaptor(fields){
|
|
90
182
|
return `
|
|
91
|
-
${getSaveDataTpl()}
|
|
183
|
+
${getSaveDataTpl(fields)}
|
|
92
184
|
api.data = {query: query.replace('{__saveData}', __saveData)};
|
|
93
185
|
return api;
|
|
94
186
|
`
|
|
@@ -79,6 +79,97 @@ function getConvertDataScriptStr(fields){
|
|
|
79
79
|
return scriptStr;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/*
|
|
83
|
+
img字段值添加URL前缀使其在amis中正常显示图片。
|
|
84
|
+
*/
|
|
85
|
+
function getScriptForAddUrlPrefixForImgFields(fields){
|
|
86
|
+
let imgFieldsKeys = [];
|
|
87
|
+
let imgFields = {};
|
|
88
|
+
let rootUrl = Meteor.absoluteUrl('/api/files/images/');
|
|
89
|
+
fields.forEach((item)=>{
|
|
90
|
+
if(item.type === 'image'){
|
|
91
|
+
imgFieldsKeys.push(item.name);
|
|
92
|
+
imgFields[item.name] = {
|
|
93
|
+
name: item.name,
|
|
94
|
+
multiple: item.multiple
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
if(!imgFieldsKeys.length){
|
|
99
|
+
return '';
|
|
100
|
+
}
|
|
101
|
+
return `
|
|
102
|
+
// image字段值添加URL前缀
|
|
103
|
+
let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};
|
|
104
|
+
let imgFields = ${JSON.stringify(imgFields)};
|
|
105
|
+
let rootUrl = ${JSON.stringify(rootUrl)};
|
|
106
|
+
imgFieldsKeys.forEach((item)=>{
|
|
107
|
+
let imgFieldValue = data[item];
|
|
108
|
+
if(imgFieldValue && imgFieldValue.length){
|
|
109
|
+
if(imgFields[item].multiple){
|
|
110
|
+
if(imgFieldValue instanceof Array){
|
|
111
|
+
data[item] = imgFieldValue.map((value)=>{ return rootUrl + value});
|
|
112
|
+
}
|
|
113
|
+
}else{
|
|
114
|
+
data[item] = rootUrl + imgFieldValue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
`
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
file字段值重写使其在amis中正常显示附件名、点击附件名下载文件。
|
|
123
|
+
*/
|
|
124
|
+
function getScriptForRewriteValueForFileFields(fields){
|
|
125
|
+
let fileFieldsKeys = [];
|
|
126
|
+
let fileFields = {};
|
|
127
|
+
let fileRootUrl = Meteor.absoluteUrl('/api/files/files/');
|
|
128
|
+
fields.forEach((item)=>{
|
|
129
|
+
if(item.type === 'file'){
|
|
130
|
+
fileFieldsKeys.push(item.name);
|
|
131
|
+
fileFields[item.name] = {
|
|
132
|
+
name: item.name,
|
|
133
|
+
multiple: item.multiple
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
if(!fileFieldsKeys.length){
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
return `
|
|
141
|
+
// file字段值重写以便编辑时正常显示附件名、点击附件名正常下载附件
|
|
142
|
+
let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};
|
|
143
|
+
let fileFields = ${JSON.stringify(fileFields)};
|
|
144
|
+
let fileRootUrl = ${JSON.stringify(fileRootUrl)};
|
|
145
|
+
fileFieldsKeys.forEach((item)=>{
|
|
146
|
+
let fileFieldValue = data[item];
|
|
147
|
+
if(fileFieldValue && fileFieldValue.length){
|
|
148
|
+
const fileFieldNames = data._display[item].split(',');
|
|
149
|
+
if(fileFields[item].multiple){
|
|
150
|
+
if(fileFieldValue instanceof Array){
|
|
151
|
+
data[item] = fileFieldValue.map((value, index)=>{
|
|
152
|
+
return {
|
|
153
|
+
value: value,
|
|
154
|
+
name: fileFieldNames[index],
|
|
155
|
+
url: fileRootUrl + value + "?download=true",
|
|
156
|
+
state: "uploaded"
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}else{
|
|
161
|
+
data[item] = {
|
|
162
|
+
value: fileFieldValue,
|
|
163
|
+
name: fileFieldNames[0],
|
|
164
|
+
url: fileRootUrl + fileFieldValue + "?download=true",
|
|
165
|
+
state: "uploaded"
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
`
|
|
171
|
+
}
|
|
172
|
+
|
|
82
173
|
function getEditFormInitApi(object, recordId, fields){
|
|
83
174
|
return {
|
|
84
175
|
method: "post",
|
|
@@ -89,6 +180,14 @@ function getEditFormInitApi(object, recordId, fields){
|
|
|
89
180
|
var data = payload.data.data[0];
|
|
90
181
|
if(data){
|
|
91
182
|
${getConvertDataScriptStr(fields)}
|
|
183
|
+
${getScriptForAddUrlPrefixForImgFields(fields)}
|
|
184
|
+
${getScriptForRewriteValueForFileFields(fields)}
|
|
185
|
+
//初始化接口返回的字段移除字段值为null的字段
|
|
186
|
+
for (key in data){
|
|
187
|
+
if(data[key] === null){
|
|
188
|
+
delete data[key];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
92
191
|
};
|
|
93
192
|
payload.data = data;
|
|
94
193
|
delete payload.extensions;
|
|
@@ -103,7 +202,7 @@ function getSaveApi(object, recordId, fields, options){
|
|
|
103
202
|
method: 'post',
|
|
104
203
|
url: graphql.getApi(),
|
|
105
204
|
data: graphql.getSaveQuery(object, recordId, fields, options),
|
|
106
|
-
requestAdaptor: graphql.getSaveRequestAdaptor(),
|
|
205
|
+
requestAdaptor: graphql.getSaveRequestAdaptor(fields),
|
|
107
206
|
responseData: {
|
|
108
207
|
"recordId": "${record._id}"
|
|
109
208
|
},
|
package/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/service-plugin-amis",
|
|
3
|
-
"version": "2.2.52
|
|
3
|
+
"version": "2.2.52",
|
|
4
4
|
"main": "package.service.js",
|
|
5
|
-
"scripts": {
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "node .scripts/build.tailwind.js"
|
|
7
|
+
},
|
|
6
8
|
"license": "MIT",
|
|
7
9
|
"private": false,
|
|
8
10
|
"publishConfig": {
|
|
9
11
|
"access": "public"
|
|
10
12
|
},
|
|
11
|
-
"gitHead": "
|
|
13
|
+
"gitHead": "1447c9ca4fb57a49233704f50a7d757aff0c5027"
|
|
12
14
|
}
|