@steedos-widgets/amis-lib 3.6.0-beta.4 → 3.6.0-beta.6

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/dist/index.cjs.js CHANGED
@@ -572,7 +572,7 @@ function getNameTpl(field, ctx){
572
572
  if(ctx && ctx.isLookup){
573
573
  linkTarget = "target='_blank'";
574
574
  }
575
- return `<a href="${href}" ${linkTarget}>\${${field.name}}</a>`
575
+ return `<a href="${href}" ${linkTarget}>\${${field.name} | raw}</a>`
576
576
  }
577
577
 
578
578
  function getRelatedFieldTpl(field, ctx){
@@ -1129,7 +1129,7 @@ function getAmisStaticFieldType(type, readonly, options){
1129
1129
  * @Author: baozhoutao@steedos.com
1130
1130
  * @Date: 2022-10-28 14:15:09
1131
1131
  * @LastEditors: liaodaxue
1132
- * @LastEditTime: 2023-10-30 17:51:54
1132
+ * @LastEditTime: 2023-12-29 10:46:50
1133
1133
  * @Description:
1134
1134
  */
1135
1135
 
@@ -1183,7 +1183,8 @@ const getAmisFileEditSchema = (steedosField)=>{
1183
1183
  dataType: "form-data",
1184
1184
  url: `\${context.rootUrl}/s3/${tableName}`,
1185
1185
  requestAdaptor: `
1186
- const { _master, global,context } = api.body;
1186
+ const superData = (typeof context != 'undefined') ? context : api.body;
1187
+ const { _master, global } = superData;
1187
1188
  // const { recordId, objectName } = _master;
1188
1189
  const { spaceId, userId, user } = global;
1189
1190
  /*
@@ -1201,8 +1202,9 @@ const getAmisFileEditSchema = (steedosField)=>{
1201
1202
  return api;
1202
1203
  `,
1203
1204
  adaptor: `
1204
- const { context } = api.body;
1205
- var rootUrl = context.rootUrl + "/api/files/${tableName}/";
1205
+ const superData = (typeof context != 'undefined') ? context : api.body;
1206
+ const { context:pageContext } = superData;
1207
+ var rootUrl = pageContext.rootUrl + "/api/files/${tableName}/";
1206
1208
  payload = {
1207
1209
  status: response.status == 200 ? 0 : response.status,
1208
1210
  msg: response.statusText,
@@ -1806,8 +1808,9 @@ async function getQuickEditSchema(field, options){
1806
1808
  case "avatar":
1807
1809
  case "image":
1808
1810
  quickEditSchema.body[0].receiver.adaptor = `
1809
- const { context } = api.body;
1810
- var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
1811
+ const superData = (typeof context != 'undefined') ? context : api.body;
1812
+ const { context:pageContext } = superData;
1813
+ var rootUrl = pageContext.rootUrl + "/api/files/${field.type}s/";
1811
1814
  payload = {
1812
1815
  status: response.status == 200 ? 0 : response.status,
1813
1816
  msg: response.statusText,
@@ -2470,7 +2473,7 @@ async function getTableOperation(ctx){
2470
2473
  type: 'steedos-object-button',
2471
2474
  name: button.name,
2472
2475
  objectName: button.objectName,
2473
- visibleOn: getButtonVisibleOn$1(button),
2476
+ visibleOnAlias: getButtonVisibleOn$1(button),
2474
2477
  className: 'antd-Button--default'
2475
2478
  });
2476
2479
  });
@@ -2595,7 +2598,8 @@ async function getTableSchema$1(fields, options){
2595
2598
  }
2596
2599
 
2597
2600
  if(!isLookup && !hiddenColumnOperation){
2598
- columns.push(await getTableOperation(options));
2601
+ const toolbarOperation = await getTableOperation(options);
2602
+ columns.push(toolbarOperation);
2599
2603
  }
2600
2604
 
2601
2605
  }
@@ -5807,6 +5811,8 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5807
5811
  `;
5808
5812
  const onCancelScript = `
5809
5813
  // console.log("===onCancelScript=form==");
5814
+ let isLookup = event.data.isLookup;
5815
+ let __lookupField = event.data.__lookupField;
5810
5816
  const scope = event.context.scoped;
5811
5817
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5812
5818
  return n.props.type === "form";
@@ -5854,7 +5860,20 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5854
5860
  // });
5855
5861
 
5856
5862
  // 清除__changedFilterFormValues中的值
5857
- crud && crud.setData({__changedFilterFormValues: {}});
5863
+ // crud && crud.setData({__changedFilterFormValues: {}});
5864
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
5865
+ if(isLookup && __lookupField){
5866
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
5867
+ if(__lookupField.reference_to_field){
5868
+ lookupTag += "__" + __lookupField.reference_to_field;
5869
+ }
5870
+ __changedFilterFormValuesKey += lookupTag;
5871
+ }
5872
+ if(crud){
5873
+ let crudData = crud.getData();
5874
+ crudData[__changedFilterFormValuesKey] = {};
5875
+ crud.setData(crudData);
5876
+ }
5858
5877
  filterForm.handleFormSubmit(event);
5859
5878
  // crud.handleFilterSubmit(removedValues);
5860
5879
 
@@ -7782,7 +7801,12 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7782
7801
  __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
7783
7802
  // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7784
7803
  // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7785
- crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7804
+ // crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7805
+ if(crud){
7806
+ let crudData = crud.getData();
7807
+ crudData.__changedSearchBoxValues = __changedSearchBoxValues;
7808
+ crud.setData(crudData);
7809
+ }
7786
7810
  `;
7787
7811
 
7788
7812
  // onSearchScript中加上了onChangeScript中的脚本,是因为amis 3.2不能用change事件执行onChangeScript
@@ -7795,9 +7819,19 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7795
7819
  // const scope = event.context.scoped;
7796
7820
  // 如果点击过顶部搜索栏表单的取消按钮,会把此处event.data.__super.__super.__super中的搜索表单项的所有字段设置为null
7797
7821
  // 点击取消按钮后继续在表单项中输入过滤条件且最后没有点击回车按键或点击表单项搜索按钮的话,在快速搜索中点击回车按钮提交搜索会所顶部搜索表单中的字段值清空
7822
+ let isLookup = event.data.isLookup;
7823
+ let __lookupField = event.data.__lookupField;
7824
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
7825
+ if(isLookup && __lookupField){
7826
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
7827
+ if(__lookupField.reference_to_field){
7828
+ lookupTag += "__" + __lookupField.reference_to_field;
7829
+ }
7830
+ __changedFilterFormValuesKey += lookupTag;
7831
+ }
7798
7832
  let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7799
7833
  setTimeout(function(){
7800
- filterForm.setValues(event.data.__changedFilterFormValues);
7834
+ filterForm.setValues(event.data[__changedFilterFormValuesKey]);
7801
7835
  }, 500);
7802
7836
  `;
7803
7837
 
@@ -7818,8 +7852,8 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7818
7852
  "name": keywordsSearchBoxName,
7819
7853
  "placeholder": "搜索此列表",
7820
7854
  "value": crudKeywords,
7821
- "clearable": true,
7822
- // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7855
+ // "clearable": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7856
+ "clearAndSubmit": true,
7823
7857
  "searchImediately": false,
7824
7858
  "onEvent": {
7825
7859
  "search": {
@@ -8099,18 +8133,34 @@ async function getObjectFilter(objectSchema, fields, options) {
8099
8133
  crudService && crudService.setData({isFieldsFilterEmpty});
8100
8134
  `;
8101
8135
  let onChangeScript = `
8136
+ let isLookup = event.data.isLookup;
8137
+ let __lookupField = event.data.__lookupField;
8102
8138
  const scope = event.context.scoped;
8103
8139
  // let filterFormValues = event.data;
8104
8140
  let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
8105
8141
  let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
8106
8142
  // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
8107
8143
  let filterFormValues = filterFormService.getData();
8144
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
8108
8145
  let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
8109
8146
  const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
8110
8147
  // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
8111
8148
  // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
8112
8149
  // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
8113
- crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8150
+ // crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8151
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
8152
+ if(isLookup && __lookupField){
8153
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
8154
+ if(__lookupField.reference_to_field){
8155
+ lookupTag += "__" + __lookupField.reference_to_field;
8156
+ }
8157
+ __changedFilterFormValuesKey += lookupTag;
8158
+ }
8159
+ if(crud){
8160
+ let crudData = crud.getData();
8161
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
8162
+ crud.setData(crudData);
8163
+ }
8114
8164
  `;
8115
8165
  return {
8116
8166
  "title": "",
@@ -10296,6 +10346,58 @@ function getReferenceToSync(field) {
10296
10346
  }
10297
10347
 
10298
10348
  function getLookupSapceUserTreeSchema(isMobile){
10349
+ let apiAdaptor = `
10350
+ // console.log("===getLookupSapceUserTreeSchema===", JSON.stringify(payload));
10351
+ const records = payload.data.options;
10352
+ let isTreeOptionsComputed = false;
10353
+ if(records.length === 1 && records[0].children){
10354
+ isTreeOptionsComputed = true;
10355
+ }
10356
+ if(isTreeOptionsComputed){
10357
+ return payload;
10358
+ }
10359
+ const treeRecords = [];
10360
+ const getChildren = (records, childrenIds) => {
10361
+ if (!childrenIds) {
10362
+ return;
10363
+ }
10364
+ const children = _.filter(records, (record) => {
10365
+ return _.includes(childrenIds, record.value)
10366
+ });
10367
+ _.each(children, (item) => {
10368
+ if (item.children) {
10369
+ item.children = getChildren(records, item.children)
10370
+ }
10371
+ })
10372
+ return children;
10373
+ }
10374
+
10375
+ const getRoot = (records) => {
10376
+ for (var i = 0; i < records.length; i++) {
10377
+ records[i].noParent = 0;
10378
+ if (!!records[i].parent) {
10379
+ biaozhi = 1
10380
+ for (var j = 0; j < records.length; j++) {
10381
+ if (records[i].parent == records[j].value)
10382
+ biaozhi = 0;
10383
+ }
10384
+ if (biaozhi == 1) records[i].noParent = 1;
10385
+ } else records[i].noParent = 1;
10386
+ }
10387
+ }
10388
+ getRoot(records);
10389
+ console.log(records)
10390
+
10391
+ _.each(records, (record) => {
10392
+ if (record.noParent == 1) {
10393
+ treeRecords.push(Object.assign({}, record, { children: getChildren(records, record.children) }));
10394
+ }
10395
+ });
10396
+ console.log(treeRecords)
10397
+
10398
+ payload.data.options = treeRecords;
10399
+ return payload;
10400
+ `;
10299
10401
  const treeSchema = {
10300
10402
  "type": "input-tree",
10301
10403
  "className":"steedos-select-user-tree",
@@ -10306,8 +10408,7 @@ function getLookupSapceUserTreeSchema(isMobile){
10306
10408
  "headers": {
10307
10409
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
10308
10410
  },
10309
- "adaptor": "if (payload.data.treeCache == true) {\n return payload;\n }\n const records = payload.data.options;\n const treeRecords = [];\n const getChildren = (records, childrenIds) => {\n if (!childrenIds) {\n return;\n }\n const children = _.filter(records, (record) => {\n return _.includes(childrenIds, record.value)\n });\n _.each(children, (item) => {\n if (item.children) {\n item.children = getChildren(records, item.children)\n }\n })\n return children;\n }\n\n const getRoot = (records) => {\n for (var i = 0; i < records.length; i++){\n records[i].noParent = 0;\n if (!!records[i].parent) {\n biaozhi = 1\n for (var j = 0; j < records.length; j++){\n if (records[i].parent == records[j].value)\n biaozhi = 0;\n }\n if (biaozhi == 1) records[i].noParent = 1;\n } else records[i].noParent = 1;\n }\n }\n getRoot(records);\n console.log(records)\n\n _.each(records, (record) => {\n if (record.noParent ==1) {\n treeRecords.push(Object.assign({}, record, { children: getChildren(records, record.children) }));\n }\n });\n console.log(treeRecords)\n\n payload.data.options = treeRecords;\n payload.data.treeCache = true;\n return payload;\n ",
10310
- "requestAdaptor": "\n ",
10411
+ "adaptor": apiAdaptor,
10311
10412
  "data": {
10312
10413
  "query": "{options:organizations(filters:[\"hidden\", \"!=\", true],sort:\"sort_no desc\"){value:_id label:name,parent,children}}"
10313
10414
  },
@@ -10508,13 +10609,24 @@ async function lookupToAmisPicker(field, readonly, ctx){
10508
10609
  let keywordsSearchBoxName = `__keywords_lookup__${field.name.replace(/\./g, "_")}__to__${refObjectConfig.name}`;
10509
10610
 
10510
10611
  source.requestAdaptor = `
10511
- let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
10612
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
10613
+ let __lookupField = api.data.$self.__lookupField;
10614
+ if(__lookupField){
10615
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
10616
+ if(__lookupField.reference_to_field){
10617
+ lookupTag += "__" + __lookupField.reference_to_field;
10618
+ }
10619
+ __changedFilterFormValuesKey += lookupTag;
10620
+ }
10621
+ let __changedFilterFormValues = api.data.$self[__changedFilterFormValuesKey] || {};
10512
10622
  let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
10513
10623
  // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
10514
10624
  // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
10515
10625
  // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
10516
10626
  // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
10517
- Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10627
+ if(api.data.$self.op !== 'loadOptions'){
10628
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10629
+ }
10518
10630
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10519
10631
  var filters = [];
10520
10632
  var pageSize = api.data.pageSize || 10;
@@ -10721,7 +10833,12 @@ async function lookupToAmisPicker(field, readonly, ctx){
10721
10833
  "objectName": refObjectConfig.name,
10722
10834
  "uiSchema": refObjectConfig,
10723
10835
  "listName": listName,// 需要按视图取可搜索项
10724
- "isLookup": true
10836
+ "isLookup": true,
10837
+ "__lookupField": {
10838
+ "name": field.name,
10839
+ "reference_to": refObjectConfig.name,
10840
+ "reference_to_field": field.reference_to_field
10841
+ }
10725
10842
  });
10726
10843
 
10727
10844
  if(!pickerSchema.onEvent){
@@ -11090,6 +11207,15 @@ async function lookupToAmis(field, readonly, ctx){
11090
11207
 
11091
11208
  // 优先取字段中配置的enable_enhanced_lookup,字段上没配置时,才从对象上取enable_enhanced_lookup属性
11092
11209
  let enableEnhancedLookup = ___namespace.isBoolean(field.enable_enhanced_lookup) ? field.enable_enhanced_lookup : refObject.enable_enhanced_lookup;
11210
+ let amisVersion = getComparableAmisVersion();
11211
+ if(amisVersion >= 3.6){
11212
+ // amis 3.6.3单选和多选的树picker都有bug(https://github.com/baidu/amis/issues/9279,https://github.com/baidu/amis/issues/9295),我们改amis源码修正了
11213
+ // amis 3.6.3多选的下拉树组件有bug,多选树字段的选中值在编辑模式展开树时不会自动勾选树里面的节点,而是始终勾选显示在最外面的选中值选项(即defaultValueOptions),amis 3.2没有这个问题
11214
+ // 这里强制禁用多选下拉树,统一改为弹出树,如果以后需要下拉树功能,可以把下拉树组件改为一次性加载所有树节点数据模式来跳过这个问题
11215
+ if(!enableEnhancedLookup && refObject.enable_tree && field.multiple){
11216
+ enableEnhancedLookup = true;
11217
+ }
11218
+ }
11093
11219
  // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
11094
11220
  if(enableEnhancedLookup == true){
11095
11221
  return await lookupToAmisPicker(field, readonly, ctx);
@@ -12489,8 +12615,8 @@ async function getFormBody(permissionFields, formFields, ctx){
12489
12615
  /*
12490
12616
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12491
12617
  * @Date: 2023-11-15 09:50:22
12492
- * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12493
- * @LastEditTime: 2023-12-28 15:54:36
12618
+ * @LastEditors: baozhoutao@steedos.com
12619
+ * @LastEditTime: 2024-01-02 15:43:50
12494
12620
  */
12495
12621
 
12496
12622
  /**
@@ -13119,6 +13245,7 @@ async function getButtonActions(props, mode) {
13119
13245
  // "__parentForm": "${__super.__super || {}}",
13120
13246
  // "__parentForm": mode == "new" ? "$$" : "${__super.__super || {}}",
13121
13247
  "__parentForm": mode == "new" ? "$$" : parentFormData,
13248
+ "_master": "${_master}",
13122
13249
  "global": "${global}",
13123
13250
  "uiSchema": "${uiSchema}",
13124
13251
  "index": "${index}",
@@ -14828,8 +14955,8 @@ const getInstanceApprovalHistory = async ()=>{
14828
14955
  /*
14829
14956
  * @Author: baozhoutao@steedos.com
14830
14957
  * @Date: 2022-09-07 16:20:45
14831
- * @LastEditors: baozhoutao@steedos.com
14832
- * @LastEditTime: 2023-03-23 16:49:44
14958
+ * @LastEditors: liaodaxue
14959
+ * @LastEditTime: 2023-12-29 16:06:35
14833
14960
  * @Description:
14834
14961
  */
14835
14962
 
@@ -15655,7 +15782,6 @@ const getFlowFormSchema = async (instance, box) => {
15655
15782
  "messages": {
15656
15783
  },
15657
15784
  "requestAdaptor": `
15658
- const { context } = api.data;
15659
15785
  api.data = {
15660
15786
  query: \`
15661
15787
  {
@@ -15678,7 +15804,7 @@ const getFlowFormSchema = async (instance, box) => {
15678
15804
  `,
15679
15805
  "data": {
15680
15806
  // "&": "$$",
15681
- "context": "${context}",
15807
+ // "context": "${context}",
15682
15808
  "judge": "${new_judge}",
15683
15809
  }
15684
15810
  },