@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.
@@ -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
- //TODO
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
- function getSaveDataTpl(){
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-beta.7",
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": "ecf8b1cc86813d63697cca572cde7a4d996643d6"
13
+ "gitHead": "1447c9ca4fb57a49233704f50a7d757aff0c5027"
12
14
  }