@steedos/service-plugin-amis 2.2.52-beta.19 → 2.2.52-beta.22

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.
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-plugin-amis",
3
- "version": "2.2.52-beta.19",
3
+ "version": "2.2.52-beta.22",
4
4
  "main": "package.service.js",
5
5
  "scripts": {},
6
6
  "license": "MIT",
@@ -8,5 +8,5 @@
8
8
  "publishConfig": {
9
9
  "access": "public"
10
10
  },
11
- "gitHead": "a6b165c62a862feadeb94a8f19e2c6fef62f0efc"
11
+ "gitHead": "52619e601e001d519b3690c0d9dc36737bc20ae0"
12
12
  }