@steedos-widgets/amis-lib 1.3.22-beta.3 → 3.6.0-beta.10

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.esm.js CHANGED
@@ -382,8 +382,8 @@ const Router = {
382
382
  /*
383
383
  * @Author: baozhoutao@steedos.com
384
384
  * @Date: 2022-07-20 16:29:22
385
- * @LastEditors: liaodaxue
386
- * @LastEditTime: 2023-09-11 17:19:53
385
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
386
+ * @LastEditTime: 2023-12-28 14:59:08
387
387
  * @Description:
388
388
  */
389
389
 
@@ -440,6 +440,21 @@ function getLookupListView(refObjectConfig) {
440
440
  return listView;
441
441
  }
442
442
 
443
+
444
+ /**
445
+ * 获取可比较的amis版本号
446
+ * @returns 只返回前两位版本,第三位忽略,比如3.6.3返回3.6
447
+ */
448
+ function getComparableAmisVersion() {
449
+ let amis = (window.amisRequire && window.amisRequire('amis')) || window.Amis;
450
+ let amisVersion = amis && amis.version;
451
+ if(amisVersion){
452
+ let comparableVersions = amisVersion.split(".");
453
+ let comparableVersion = parseFloat(comparableVersions[0].toString() + "." + comparableVersions[1].toString());
454
+ return comparableVersion;
455
+ }
456
+ }
457
+
443
458
  /*
444
459
  * @Author: baozhoutao@steedos.com
445
460
  * @Date: 2022-05-23 09:53:08
@@ -530,7 +545,7 @@ function getNameTpl(field, ctx){
530
545
  if(ctx && ctx.isLookup){
531
546
  linkTarget = "target='_blank'";
532
547
  }
533
- return `<a href="${href}" ${linkTarget}>\${${field.name}}</a>`
548
+ return `<a href="${href}" ${linkTarget}>\${${field.name} | raw}</a>`
534
549
  }
535
550
 
536
551
  function getRelatedFieldTpl(field, ctx){
@@ -1087,7 +1102,7 @@ function getAmisStaticFieldType(type, readonly, options){
1087
1102
  * @Author: baozhoutao@steedos.com
1088
1103
  * @Date: 2022-10-28 14:15:09
1089
1104
  * @LastEditors: liaodaxue
1090
- * @LastEditTime: 2023-10-30 17:51:54
1105
+ * @LastEditTime: 2023-12-29 10:46:50
1091
1106
  * @Description:
1092
1107
  */
1093
1108
 
@@ -1141,7 +1156,8 @@ const getAmisFileEditSchema = (steedosField)=>{
1141
1156
  dataType: "form-data",
1142
1157
  url: `\${context.rootUrl}/s3/${tableName}`,
1143
1158
  requestAdaptor: `
1144
- const { _master, global,context } = api.body;
1159
+ const superData = (typeof context != 'undefined') ? context : api.body;
1160
+ const { _master, global } = superData;
1145
1161
  // const { recordId, objectName } = _master;
1146
1162
  const { spaceId, userId, user } = global;
1147
1163
  /*
@@ -1159,8 +1175,9 @@ const getAmisFileEditSchema = (steedosField)=>{
1159
1175
  return api;
1160
1176
  `,
1161
1177
  adaptor: `
1162
- const { context } = api.body;
1163
- var rootUrl = context.rootUrl + "/api/files/${tableName}/";
1178
+ const superData = (typeof context != 'undefined') ? context : api.body;
1179
+ const { context:pageContext } = superData;
1180
+ var rootUrl = pageContext.rootUrl + "/api/files/${tableName}/";
1164
1181
  payload = {
1165
1182
  status: response.status == 200 ? 0 : response.status,
1166
1183
  msg: response.statusText,
@@ -1626,7 +1643,6 @@ async function getQuickEditSchema(field, options){
1626
1643
  {
1627
1644
  "actionType": "custom",
1628
1645
  "script": `
1629
-
1630
1646
  var _display = _.cloneDeep(event.data._display);
1631
1647
  ${displayField}
1632
1648
  doAction({actionType: 'setValue', "args": {"value": {_display}},componentId: "${quickEditId}"});
@@ -1764,8 +1780,9 @@ async function getQuickEditSchema(field, options){
1764
1780
  case "avatar":
1765
1781
  case "image":
1766
1782
  quickEditSchema.body[0].receiver.adaptor = `
1767
- const { context } = api.body;
1768
- var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
1783
+ const superData = (typeof context != 'undefined') ? context : api.body;
1784
+ const { context:pageContext } = superData;
1785
+ var rootUrl = pageContext.rootUrl + "/api/files/${field.type}s/";
1769
1786
  payload = {
1770
1787
  status: response.status == 200 ? 0 : response.status,
1771
1788
  msg: response.statusText,
@@ -1796,9 +1813,26 @@ async function getQuickEditSchema(field, options){
1796
1813
  "onEvent":{
1797
1814
  "init":{
1798
1815
  "actions":[
1816
+ //amis3.6无法从数据域中直接拿到正确的selectitems,需要通过crud组件的getSelected()函数获取
1817
+ {
1818
+ "actionType": "custom",
1819
+ "script": `
1820
+ crudScoped = event.context.scoped.getComponentById('${options.crudId}');
1821
+ const selectedItems = crudScoped && crudScoped.control.getSelected();
1822
+ doAction({
1823
+ "componentId": "${quickEditId}",
1824
+ "actionType": "setValue",
1825
+ "args": {
1826
+ "value": {
1827
+ selectedItems
1828
+ }
1829
+ }
1830
+ });
1831
+ `
1832
+ },
1799
1833
  {
1800
1834
  "actionType": "setValue",
1801
- "componentId": `service_listview_${options.objectName}`,
1835
+ "componentId": quickEditId,
1802
1836
  "args": {
1803
1837
  "value":{
1804
1838
  "quickedit_record_permissions_loading": true
@@ -1823,7 +1857,7 @@ async function getQuickEditSchema(field, options){
1823
1857
  },
1824
1858
  {
1825
1859
  "actionType": "setValue",
1826
- "componentId": `service_listview_${options.objectName}`,
1860
+ "componentId": quickEditId,
1827
1861
  "args": {
1828
1862
  "value":{
1829
1863
  "quickedit_record_permissions_loading": false
@@ -1832,7 +1866,7 @@ async function getQuickEditSchema(field, options){
1832
1866
  },
1833
1867
  {
1834
1868
  "actionType": "setValue",
1835
- "componentId": `service_listview_${options.objectName}`,
1869
+ "componentId": quickEditId,
1836
1870
  "args": {
1837
1871
  "value":{
1838
1872
  "quickedit_record_permissions": "${event.data}"
@@ -2011,8 +2045,6 @@ function getFieldWidth(width){
2011
2045
  async function getTableColumns(fields, options){
2012
2046
  const columns = [];
2013
2047
  if(!options.isLookup && !options.isInputTable){
2014
- //将_display放入crud的columns中,可以通过setvalue修改行内数据域的_display,而不影响上层items的_display,用于批量编辑
2015
- columns.push({name: '_display',type: 'static', width: 32, placeholder: "",id: "_display_${_index}", className: "hidden"});
2016
2048
  if(!options.enable_tree){
2017
2049
  columns.push({name: '_index',type: 'text', width: 32, placeholder: ""});
2018
2050
  }
@@ -2170,8 +2202,8 @@ async function getTableColumns(fields, options){
2170
2202
  const href = Router.getObjectDetailPath({
2171
2203
  ...options, formFactor: options.formFactor, appId: "${appId}", objectName: options.objectName || "${objectName}", recordId: `\${${options.idFieldName}}`
2172
2204
  });
2173
- columns[1].type = "tpl";
2174
- columns[1].tpl = `<a href="${href}">\${${columns[1].name}}</a>`;
2205
+ columns[0].type = "tpl";
2206
+ columns[0].tpl = `<a href="${href}">\${${columns[0].name}}</a>`;
2175
2207
  }
2176
2208
  return columns;
2177
2209
  }
@@ -2430,7 +2462,7 @@ async function getTableOperation(ctx){
2430
2462
  type: 'steedos-object-button',
2431
2463
  name: button.name,
2432
2464
  objectName: button.objectName,
2433
- visibleOn: getButtonVisibleOn$1(button),
2465
+ visibleOnAlias: getButtonVisibleOn$1(button),
2434
2466
  className: 'antd-Button--default'
2435
2467
  });
2436
2468
  });
@@ -2555,8 +2587,18 @@ async function getTableSchema$1(fields, options){
2555
2587
  }
2556
2588
 
2557
2589
  if(!isLookup && !hiddenColumnOperation){
2558
- columns.push(await getTableOperation(options));
2590
+ const toolbarOperation = await getTableOperation(options);
2591
+ columns.push(toolbarOperation);
2559
2592
  }
2593
+
2594
+ }
2595
+
2596
+ const treeConfig = {};
2597
+
2598
+ if(options.enable_tree){
2599
+ treeConfig.expandConfig = {
2600
+ expand: 'first'
2601
+ };
2560
2602
  }
2561
2603
 
2562
2604
  return {
@@ -2574,6 +2616,7 @@ async function getTableSchema$1(fields, options){
2574
2616
  labelTpl: `\${${options.labelFieldName}}`,
2575
2617
  autoFillHeight: false, // 自动高度效果不理想,先关闭
2576
2618
  columnsTogglable: false,
2619
+ ...treeConfig
2577
2620
  }
2578
2621
  }
2579
2622
 
@@ -2890,17 +2933,6 @@ async function getTableApi(mainObject, fields, options){
2890
2933
  payload.data.rows = getTreeOptions(records,{"valueField":"_id"});
2891
2934
  assignIndexToTreeRecords(payload.data.rows, '');
2892
2935
  }
2893
- try{
2894
- setTimeout(() => {
2895
- let expandBtn = $('.steedos-object-listview-content .antd-Table-content .antd-Table-table thead .antd-Table-expandBtn');
2896
- if(expandBtn && expandBtn.length > 0 && !expandBtn.hasClass("is-active")){
2897
- expandBtn[0].click();
2898
- }
2899
- }, 600);
2900
- }
2901
- catch(ex){
2902
- console.error("tree数据格式展开异常:", ex);
2903
- }
2904
2936
  }
2905
2937
 
2906
2938
 
@@ -3665,6 +3697,7 @@ async function getObjectCalendar(objectSchema, calendarOptions, options) {
3665
3697
  "dialog": {
3666
3698
  "type": "dialog",
3667
3699
  "title": title,
3700
+ data,
3668
3701
  "body": [
3669
3702
  {
3670
3703
  "type": "steedos-object-form",
@@ -5727,12 +5760,16 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5727
5760
  // }
5728
5761
  // listView.handleFilterSubmit(Object.assign({}, removedValues, filterFormValues));
5729
5762
  // 点击搜索的时候自动收起搜索栏
5730
- let resizeWindow = function(){
5731
- //触发amis crud 高度重算
5732
- setTimeout(()=>{
5733
- window.dispatchEvent(new Event("resize"))
5734
- }, 500);
5735
- }
5763
+ //触发amis crud 高度重算
5764
+ doAction({
5765
+ "actionType": "broadcast",
5766
+ "args": {
5767
+ "eventName": "@height.changed.${objectSchema.name}"
5768
+ },
5769
+ "data": {
5770
+ "timeOut": 500
5771
+ }
5772
+ });
5736
5773
  const filterService = filterForm.context.getComponents().find(function(n){
5737
5774
  return n.props.type === "service";
5738
5775
  });
@@ -5765,6 +5802,8 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5765
5802
  `;
5766
5803
  const onCancelScript = `
5767
5804
  // console.log("===onCancelScript=form==");
5805
+ let isLookup = event.data.isLookup;
5806
+ let __lookupField = event.data.__lookupField;
5768
5807
  const scope = event.context.scoped;
5769
5808
  var filterForm = scope.parent.parent.getComponents().find(function(n){
5770
5809
  return n.props.type === "form";
@@ -5812,16 +5851,36 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5812
5851
  // });
5813
5852
 
5814
5853
  // 清除__changedFilterFormValues中的值
5815
- crud && crud.setData({__changedFilterFormValues: {}});
5854
+ // crud && crud.setData({__changedFilterFormValues: {}});
5855
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
5856
+ if(isLookup && __lookupField){
5857
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
5858
+ if(__lookupField.reference_to_field){
5859
+ lookupTag += "__" + __lookupField.reference_to_field;
5860
+ }
5861
+ __changedFilterFormValuesKey += lookupTag;
5862
+ }
5863
+ if(crud){
5864
+ let crudData = crud.getData();
5865
+ crudData[__changedFilterFormValuesKey] = {};
5866
+ crud.setData(crudData);
5867
+ }
5816
5868
  filterForm.handleFormSubmit(event);
5817
5869
  // crud.handleFilterSubmit(removedValues);
5818
5870
 
5819
5871
  let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
5820
5872
  filterFormService.setData({showFieldsFilter: !!!filterFormService.props.data.showFieldsFilter});
5821
5873
  //触发amis crud 高度重算
5822
- setTimeout(()=>{
5823
- window.dispatchEvent(new Event("resize"))
5824
- }, 100);
5874
+ doAction({
5875
+ "actionType": "broadcast",
5876
+ "args": {
5877
+ "eventName": "@height.changed.${objectSchema.name}"
5878
+ },
5879
+ "data": {
5880
+ "timeOut": 100
5881
+ }
5882
+ });
5883
+
5825
5884
  // 移除搜索按钮上的红点
5826
5885
  // let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
5827
5886
  let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
@@ -5978,9 +6037,15 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
5978
6037
  sessionStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));
5979
6038
  }
5980
6039
  //触发amis crud 高度重算
5981
- setTimeout(()=>{
5982
- window.dispatchEvent(new Event("resize"))
5983
- }, 100)
6040
+ doAction({
6041
+ "actionType": "broadcast",
6042
+ "args": {
6043
+ "eventName": "@height.changed.${objectSchema.name}"
6044
+ },
6045
+ "data": {
6046
+ "timeOut": 100
6047
+ }
6048
+ });
5984
6049
  // ===END===
5985
6050
  `;
5986
6051
  return {
@@ -6475,7 +6540,10 @@ async function getObjectRecordDetailHeader(objectSchema, recordId, options) {
6475
6540
  "@history_paths.changed": {
6476
6541
  "actions": [
6477
6542
  {
6478
- "actionType": "reload"
6543
+ "actionType": "reload",
6544
+ // amis 3.6需要传入data来触发下面的window:historyPaths重新计算,此问题随机偶发,加上data后正常
6545
+ "data": {
6546
+ }
6479
6547
  }
6480
6548
  ]
6481
6549
  }
@@ -7683,13 +7751,16 @@ const filterService = filterForm.context.getComponents().find(function(n){
7683
7751
  });
7684
7752
  let toShowFieldsFilter = !!!filterService.props.data.showFieldsFilter;
7685
7753
  filterService.setData({showFieldsFilter: toShowFieldsFilter});
7686
- let resizeWindow = function(){
7687
- //触发amis crud 高度重算
7688
- setTimeout(()=>{
7689
- window.dispatchEvent(new Event("resize"))
7690
- }, 1000);
7691
- }
7692
- resizeWindow();
7754
+ //触发amis crud 高度重算
7755
+ doAction({
7756
+ "actionType": "broadcast",
7757
+ "args": {
7758
+ "eventName": "@height.changed." + event.data.objectName
7759
+ },
7760
+ "data": {
7761
+ "timeOut": 1000
7762
+ }
7763
+ });
7693
7764
  // 手机端在显示搜索栏时隐藏crud上的刷新按钮,因为点击后crud高度显示有问题
7694
7765
  let crudService = scope.getComponentById("service_listview_" + event.data.objectName);
7695
7766
  crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
@@ -7740,7 +7811,12 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7740
7811
  __changedSearchBoxValues["${keywordsSearchBoxName}"] = event.data["${keywordsSearchBoxName}"];
7741
7812
  // crudService && crudService.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7742
7813
  // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
7743
- crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7814
+ // crud && crud.setData({__changedSearchBoxValues: __changedSearchBoxValues});
7815
+ if(crud){
7816
+ let crudData = crud.getData();
7817
+ crudData.__changedSearchBoxValues = __changedSearchBoxValues;
7818
+ crud.setData(crudData);
7819
+ }
7744
7820
  `;
7745
7821
 
7746
7822
  // onSearchScript中加上了onChangeScript中的脚本,是因为amis 3.2不能用change事件执行onChangeScript
@@ -7753,9 +7829,19 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7753
7829
  // const scope = event.context.scoped;
7754
7830
  // 如果点击过顶部搜索栏表单的取消按钮,会把此处event.data.__super.__super.__super中的搜索表单项的所有字段设置为null
7755
7831
  // 点击取消按钮后继续在表单项中输入过滤条件且最后没有点击回车按键或点击表单项搜索按钮的话,在快速搜索中点击回车按钮提交搜索会所顶部搜索表单中的字段值清空
7832
+ let isLookup = event.data.isLookup;
7833
+ let __lookupField = event.data.__lookupField;
7834
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
7835
+ if(isLookup && __lookupField){
7836
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
7837
+ if(__lookupField.reference_to_field){
7838
+ lookupTag += "__" + __lookupField.reference_to_field;
7839
+ }
7840
+ __changedFilterFormValuesKey += lookupTag;
7841
+ }
7756
7842
  let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
7757
7843
  setTimeout(function(){
7758
- filterForm.setValues(event.data.__changedFilterFormValues);
7844
+ filterForm.setValues(event.data[__changedFilterFormValuesKey]);
7759
7845
  }, 500);
7760
7846
  `;
7761
7847
 
@@ -7776,8 +7862,8 @@ function getObjectHeaderQuickSearchBox(mainObject, fields, formFactor, { isLooku
7776
7862
  "name": keywordsSearchBoxName,
7777
7863
  "placeholder": "搜索此列表",
7778
7864
  "value": crudKeywords,
7779
- "clearable": true,
7780
- // "clearAndSubmit": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7865
+ // "clearable": true,//因为清除并不会触发失去焦点事件,只有禁用,但是它会触发change事件,所以等升级到amis 3.4+后可以重新放开
7866
+ "clearAndSubmit": true,
7781
7867
  "searchImediately": false,
7782
7868
  "onEvent": {
7783
7869
  "search": {
@@ -8038,12 +8124,16 @@ async function getObjectFilter(objectSchema, fields, options) {
8038
8124
  return;
8039
8125
  }
8040
8126
  // 列表搜索栏字段值变更后立刻触发提交表单执行crud搜索,所以这里需要额外重算crud高度及筛选按钮红色星号图标显示隐藏
8041
- let resizeWindow = function(){
8042
- //触发amis crud 高度重算
8043
- setTimeout(()=>{
8044
- window.dispatchEvent(new Event("resize"))
8045
- }, 1000);
8046
- }
8127
+ //触发amis crud 高度重算
8128
+ doAction({
8129
+ "actionType": "broadcast",
8130
+ "args": {
8131
+ "eventName": "@height.changed.${objectSchema.name}"
8132
+ },
8133
+ "data": {
8134
+ "timeOut": 1000
8135
+ }
8136
+ });
8047
8137
  resizeWindow();
8048
8138
  const scope = event.context.scoped;
8049
8139
  // let filterFormValues = event.data;
@@ -8057,18 +8147,34 @@ async function getObjectFilter(objectSchema, fields, options) {
8057
8147
  crudService && crudService.setData({isFieldsFilterEmpty});
8058
8148
  `;
8059
8149
  let onChangeScript = `
8150
+ let isLookup = event.data.isLookup;
8151
+ let __lookupField = event.data.__lookupField;
8060
8152
  const scope = event.context.scoped;
8061
8153
  // let filterFormValues = event.data;
8062
8154
  let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
8063
8155
  let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
8064
8156
  // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
8065
8157
  let filterFormValues = filterFormService.getData();
8158
+ filterFormValues = JSON.parse(JSON.stringify(filterFormValues)); //只取当层数据域中数据,去除__super层数据
8066
8159
  let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
8067
8160
  const changedFilterFormValues = _.pickBy(filterFormValues, function(n,k){return /^__searchable__/.test(k);});;
8068
8161
  // let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
8069
8162
  // crudService && crudService.setData({__changedFilterFormValues: changedFilterFormValues});
8070
8163
  // 这里不用crudService而用crud是因为lookup字段弹出的列表中的crudService中的变量无法传入crud的发送适配器中
8071
- crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8164
+ // crud && crud.setData({__changedFilterFormValues: changedFilterFormValues});
8165
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
8166
+ if(isLookup && __lookupField){
8167
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
8168
+ if(__lookupField.reference_to_field){
8169
+ lookupTag += "__" + __lookupField.reference_to_field;
8170
+ }
8171
+ __changedFilterFormValuesKey += lookupTag;
8172
+ }
8173
+ if(crud){
8174
+ let crudData = crud.getData();
8175
+ crudData[__changedFilterFormValuesKey] = changedFilterFormValues;
8176
+ crud.setData(crudData);
8177
+ }
8072
8178
  `;
8073
8179
  return {
8074
8180
  "title": "",
@@ -8337,6 +8443,11 @@ async function getObjectCRUD(objectSchema, fields, options){
8337
8443
  crudModeClassName = `steedos-crud-mode-${body.mode}`;
8338
8444
  }
8339
8445
 
8446
+ if(body.columns && options.formFactor != 'SMALL'){
8447
+ //将_display放入crud的columns的倒数第二列中(最后一列会影响固定列),可以通过setvalue修改行内数据域的_display,而不影响上层items的_display,用于批量编辑
8448
+ body.columns.splice(body.columns.length - 1, 0, {name: '_display',type: 'static', width: 32, placeholder: "",id: "_display_${_index}", className: "hidden"});
8449
+ }
8450
+
8340
8451
  if (defaults) {
8341
8452
  const headerSchema = defaults.headerSchema;
8342
8453
  const footerSchema = defaults.footerSchema;
@@ -8361,6 +8472,7 @@ async function getObjectCRUD(objectSchema, fields, options){
8361
8472
  body = wrappedBody;
8362
8473
  }
8363
8474
  }
8475
+
8364
8476
  // console.timeEnd('getObjectCRUD');
8365
8477
  // TODO: data应该只留loaded,其他属性都改为从上层传递下来
8366
8478
  return {
@@ -8370,7 +8482,24 @@ async function getObjectCRUD(objectSchema, fields, options){
8370
8482
  id: `service_${id}`,
8371
8483
  name: `page`,
8372
8484
  data: options.amisData,
8373
- body: body
8485
+ body: body,
8486
+ //监听广播事件,重算crud高度
8487
+ onEvent: {
8488
+ [`@height.changed.${objectSchema.name}`]: {
8489
+ "actions": [
8490
+ {
8491
+ "actionType": "custom",
8492
+ "script": `
8493
+ var crudScoped = event.context.scoped.getComponentById('${body.id}');
8494
+ var timeOut = event.data.timeOut || 500;
8495
+ setTimeout(()=>{
8496
+ crudScoped && crudScoped.control.updateAutoFillHeight();
8497
+ }, timeOut);
8498
+ `
8499
+ }
8500
+ ]
8501
+ }
8502
+ }
8374
8503
  }
8375
8504
  }
8376
8505
 
@@ -10248,6 +10377,60 @@ function getReferenceToSync(field) {
10248
10377
  }
10249
10378
 
10250
10379
  function getLookupSapceUserTreeSchema(isMobile){
10380
+ let apiAdaptor = `
10381
+ // console.log("===getLookupSapceUserTreeSchema===", JSON.stringify(payload));
10382
+ const records = payload.data.options;
10383
+ let isTreeOptionsComputed = false;
10384
+ if(records.length === 1 && records[0].children){
10385
+ isTreeOptionsComputed = true;
10386
+ }
10387
+ if(isTreeOptionsComputed){
10388
+ return payload;
10389
+ }
10390
+ const treeRecords = [];
10391
+ const getChildren = (records, childrenIds) => {
10392
+ if (!childrenIds) {
10393
+ return;
10394
+ }
10395
+ const children = _.filter(records, (record) => {
10396
+ return _.includes(childrenIds, record.value)
10397
+ });
10398
+ _.each(children, (item) => {
10399
+ if (item.children) {
10400
+ item.children = getChildren(records, item.children)
10401
+ }else{
10402
+ item.children = [];
10403
+ }
10404
+ })
10405
+ return children;
10406
+ }
10407
+
10408
+ const getRoot = (records) => {
10409
+ for (var i = 0; i < records.length; i++) {
10410
+ records[i].noParent = 0;
10411
+ if (!!records[i].parent) {
10412
+ biaozhi = 1
10413
+ for (var j = 0; j < records.length; j++) {
10414
+ if (records[i].parent == records[j].value)
10415
+ biaozhi = 0;
10416
+ }
10417
+ if (biaozhi == 1) records[i].noParent = 1;
10418
+ } else records[i].noParent = 1;
10419
+ }
10420
+ }
10421
+ getRoot(records);
10422
+ console.log(records)
10423
+
10424
+ _.each(records, (record) => {
10425
+ if (record.noParent == 1) {
10426
+ treeRecords.push(Object.assign({}, record, { children: getChildren(records, record.children) }));
10427
+ }
10428
+ });
10429
+ console.log(treeRecords)
10430
+
10431
+ payload.data.options = treeRecords;
10432
+ return payload;
10433
+ `;
10251
10434
  const treeSchema = {
10252
10435
  "type": "input-tree",
10253
10436
  "className":"steedos-select-user-tree",
@@ -10258,8 +10441,7 @@ function getLookupSapceUserTreeSchema(isMobile){
10258
10441
  "headers": {
10259
10442
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
10260
10443
  },
10261
- "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 ",
10262
- "requestAdaptor": "\n ",
10444
+ "adaptor": apiAdaptor,
10263
10445
  "data": {
10264
10446
  "query": "{options:organizations(filters:[\"hidden\", \"!=\", true],sort:\"sort_no desc\"){value:_id label:name,parent,children}}"
10265
10447
  },
@@ -10460,13 +10642,24 @@ async function lookupToAmisPicker(field, readonly, ctx){
10460
10642
  let keywordsSearchBoxName = `__keywords_lookup__${field.name.replace(/\./g, "_")}__to__${refObjectConfig.name}`;
10461
10643
 
10462
10644
  source.requestAdaptor = `
10463
- let __changedFilterFormValues = api.data.$self.__changedFilterFormValues || {};
10645
+ let __changedFilterFormValuesKey = "__changedFilterFormValues";
10646
+ let __lookupField = api.data.$self.__lookupField;
10647
+ if(__lookupField){
10648
+ let lookupTag = "__lookup__" + __lookupField.name + "__" + __lookupField.reference_to;
10649
+ if(__lookupField.reference_to_field){
10650
+ lookupTag += "__" + __lookupField.reference_to_field;
10651
+ }
10652
+ __changedFilterFormValuesKey += lookupTag;
10653
+ }
10654
+ let __changedFilterFormValues = api.data.$self[__changedFilterFormValuesKey] || {};
10464
10655
  let __changedSearchBoxValues = api.data.$self.__changedSearchBoxValues || {};
10465
10656
  // 把表单搜索和快速搜索中的change事件中记录的过滤条件也拼到$self中,是为解决触发搜索请求时,两边输入的过滤条件都带上,即:
10466
10657
  // 有时在搜索表单中输入过滤条件事,忘记点击回车键或搜索按钮,而是进一步修改快速搜索框中的关键字点击其中回车键触发搜索
10467
10658
  // 这种情况下,触发的搜索请求中没有带上搜索表单中输入的过滤条件。
10468
10659
  // 反过来先在快速搜索框中输入过滤条件却不点击其中回车键触发搜索,而是到搜索表单中触发搜索请求也是一样的。
10469
- Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10660
+ if(api.data.$self.op !== 'loadOptions'){
10661
+ Object.assign(api.data.$self, __changedSearchBoxValues, __changedFilterFormValues);
10662
+ }
10470
10663
  const selfData = JSON.parse(JSON.stringify(api.data.$self));
10471
10664
  var filters = [];
10472
10665
  var pageSize = api.data.pageSize || 10;
@@ -10561,8 +10754,19 @@ async function lookupToAmisPicker(field, readonly, ctx){
10561
10754
  })
10562
10755
  payload.data.rows = rows;
10563
10756
  */
10757
+ if(enable_tree){
10758
+ const rows = _.map(payload.data.rows, (item)=>{
10759
+ delete item.children;
10760
+ delete item.parent;
10761
+ return item;
10762
+ })
10763
+ payload.data.rows = rows;
10764
+ }
10564
10765
  return payload;
10565
10766
  }
10767
+ if(!payload.data.rows){
10768
+ payload.data.rows = [];
10769
+ }
10566
10770
  if(enable_tree){
10567
10771
  const records = payload.data.rows;
10568
10772
  const treeRecords = [];
@@ -10589,6 +10793,8 @@ async function lookupToAmisPicker(field, readonly, ctx){
10589
10793
  _.each(children, (item)=>{
10590
10794
  if(item.children){
10591
10795
  item.children = getChildren(records, item.children)
10796
+ }else{
10797
+ item.children = [];
10592
10798
  }
10593
10799
  })
10594
10800
  return children;
@@ -10601,14 +10807,6 @@ async function lookupToAmisPicker(field, readonly, ctx){
10601
10807
  }
10602
10808
  });
10603
10809
  payload.data.rows = treeRecords;
10604
- try{
10605
- setTimeout(() => {
10606
- $('.amis-dialog-widget.antd-Modal .antd-Table-content .antd-Table-table thead .antd-Table-expandBtn')[0]?.click();
10607
- }, 600);
10608
- }
10609
- catch(ex){
10610
- console.error("tree数据格式展开异常:", ex);
10611
- }
10612
10810
  }
10613
10811
  return payload;
10614
10812
  `;
@@ -10635,6 +10833,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
10635
10833
  labelFieldName,
10636
10834
  top: top,
10637
10835
  isLookup: true,
10836
+ enable_tree: refObjectConfig.enable_tree,
10638
10837
  ...ctx
10639
10838
  });
10640
10839
 
@@ -10650,7 +10849,7 @@ async function lookupToAmisPicker(field, readonly, ctx){
10650
10849
  const isAllowCreate = refObjectConfig.permissions.allowCreate;
10651
10850
  const isCreate = _$1.isBoolean(field.create) ? field.create : true;
10652
10851
  // lookup字段配置过滤条件就强制不显示新建按钮
10653
- let isHasFilters = (field.filters || field._filtersFunction) ? true : false;
10852
+ let isHasFilters = (field.filters || field.filtersFunction || field._filtersFunction) ? true : false;
10654
10853
  if (isAllowCreate && isCreate && !isHasFilters) {
10655
10854
  const new_button = await getSchema$5(refObjectConfig, { appId: ctx.appId, objectName: refObjectConfig.name, formFactor: ctx.formFactor });
10656
10855
  new_button.align = "right";
@@ -10670,7 +10869,12 @@ async function lookupToAmisPicker(field, readonly, ctx){
10670
10869
  "objectName": refObjectConfig.name,
10671
10870
  "uiSchema": refObjectConfig,
10672
10871
  "listName": listName,// 需要按视图取可搜索项
10673
- "isLookup": true
10872
+ "isLookup": true,
10873
+ "__lookupField": {
10874
+ "name": field.name,
10875
+ "reference_to": refObjectConfig.name,
10876
+ "reference_to_field": field.reference_to_field
10877
+ }
10674
10878
  });
10675
10879
 
10676
10880
  if(!pickerSchema.onEvent){
@@ -10843,7 +11047,7 @@ async function lookupToAmisSelect(field, readonly, ctx){
10843
11047
  sendOn.push(`this.${fName}`);
10844
11048
  });
10845
11049
  if(depend_on.length > 0){
10846
- apiInfo.url = `${apiInfo.url}?${depend_on.join('&')}`;
11050
+ apiInfo.url = `${apiInfo.url}&${depend_on.join('&')}`;
10847
11051
  apiInfo.sendOn = `${sendOn.join(' && ')}`;
10848
11052
  }
10849
11053
  }
@@ -10951,6 +11155,13 @@ async function lookupToAmisSelect(field, readonly, ctx){
10951
11155
  autoComplete: apiInfo,
10952
11156
  searchable: true,
10953
11157
  };
11158
+ let amisVersion = getComparableAmisVersion();
11159
+ if(amisVersion >= 3.6){
11160
+ // amis 3.6中不加source会造成子表组件中弹出行编辑窗口的lookup字段有时不请求接口(概率现象,同一个地方反复操作有时请求有时不请求)
11161
+ // 但是同时配置autoComplete和source会多请求一次接口
11162
+ // TODO:应该想办法把是否字段在子表组件内,即ctx.isInputTable,如果不在子表组件内不需要加source
11163
+ data.source = apiInfo;
11164
+ }
10954
11165
  //删除xlink:href中的rootUrl前缀,解决客户端svg为空的问题
10955
11166
  const select_menuTpl = `<span class='flex items-center mt-0.5'>
10956
11167
  <span role='img' aria-label='smile' class='anticon anticon-smile'>
@@ -11032,18 +11243,37 @@ async function lookupToAmis(field, readonly, ctx){
11032
11243
 
11033
11244
  // 优先取字段中配置的enable_enhanced_lookup,字段上没配置时,才从对象上取enable_enhanced_lookup属性
11034
11245
  let enableEnhancedLookup = _$1.isBoolean(field.enable_enhanced_lookup) ? field.enable_enhanced_lookup : refObject.enable_enhanced_lookup;
11246
+ let amisVersion = getComparableAmisVersion();
11247
+ if(amisVersion >= 3.6){
11248
+ // amis 3.6.3单选和多选的树picker都有bug(https://github.com/baidu/amis/issues/9279,https://github.com/baidu/amis/issues/9295),我们改amis源码修正了
11249
+ // amis 3.6.3多选的下拉树组件有bug,多选树字段的选中值在编辑模式展开树时不会自动勾选树里面的节点,而是始终勾选显示在最外面的选中值选项(即defaultValueOptions),amis 3.2没有这个问题
11250
+ // 这里强制禁用多选下拉树,统一改为弹出树,如果以后需要下拉树功能,可以把下拉树组件改为一次性加载所有树节点数据模式来跳过这个问题
11251
+ if(!enableEnhancedLookup && refObject.enable_tree && field.multiple){
11252
+ enableEnhancedLookup = true;
11253
+ }
11254
+ }
11255
+ let amisSchema;
11035
11256
  // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
11036
11257
  if(enableEnhancedLookup == true){
11037
- return await lookupToAmisPicker(field, readonly, ctx);
11258
+ amisSchema = await lookupToAmisPicker(field, readonly, ctx);
11038
11259
  }else if(refObject.enable_tree) {
11039
- return await lookupToAmisTreeSelect(field, readonly, Object.assign({}, ctx, {
11260
+ amisSchema = await lookupToAmisTreeSelect(field, readonly, Object.assign({}, ctx, {
11040
11261
  labelField: referenceTo.labelField?.name || 'name',
11041
11262
  valueField: referenceTo.valueField?.name || '_id',
11042
11263
  objectName: referenceTo.objectName
11043
11264
  }));
11044
11265
  }else {
11045
- return await lookupToAmisSelect(field, readonly, ctx);
11266
+ amisSchema = await lookupToAmisSelect(field, readonly, ctx);
11267
+ }
11268
+ let refLookupPage = refObject.pages && refObject.pages.lookup;
11269
+ if(refLookupPage){
11270
+ if(typeof refLookupPage == 'string'){
11271
+ refLookupPage = JSON.parse(refLookupPage);
11272
+ }
11273
+ // Object.assign(amisSchema, refLookupPage);
11274
+ // amisSchema = _.defaultsDeep({}, refLookupPage, amisSchema);
11046
11275
  }
11276
+ return amisSchema;
11047
11277
  }
11048
11278
 
11049
11279
  async function lookupToAmisSelectUser(field, readonly, ctx){
@@ -11310,9 +11540,9 @@ const OMIT_FIELDS = ['created', 'created_by', 'modified', 'modified_by'];
11310
11540
  // const Lookup = require('./lookup');
11311
11541
 
11312
11542
  function getBaseFields(readonly){
11313
- let calssName = 'm-1';
11543
+ let className = 'm-0';
11314
11544
  if(readonly){
11315
- calssName = `${calssName}`;
11545
+ className = `${className}`;
11316
11546
  }
11317
11547
  return [
11318
11548
  {
@@ -11320,7 +11550,7 @@ function getBaseFields(readonly){
11320
11550
  label: "创建人",
11321
11551
  type: "static",
11322
11552
  labelClassName: 'text-left',
11323
- className: calssName,
11553
+ className: className,
11324
11554
  tpl: getCreatedInfoTpl()
11325
11555
  },
11326
11556
  {
@@ -11328,7 +11558,7 @@ function getBaseFields(readonly){
11328
11558
  label: "修改人",
11329
11559
  type: "static",
11330
11560
  labelClassName: 'text-left',
11331
- className: calssName,
11561
+ className: className,
11332
11562
  tpl: getModifiedInfoTpl()
11333
11563
  }
11334
11564
  ]
@@ -11792,7 +12022,8 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
11792
12022
  },
11793
12023
  pipeOut: (value, oldValue, data) => {
11794
12024
  if(value){
11795
- return value/100;
12025
+ const result = value/100;
12026
+ return Number(result.toFixed(field.scale+2));
11796
12027
  }
11797
12028
  return value;
11798
12029
  },
@@ -12024,7 +12255,7 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
12024
12255
  }
12025
12256
  if(!_$1.isEmpty(convertData)){
12026
12257
  if(field.is_wide || convertData.type === 'group'){
12027
- convertData.className = 'col-span-2 m-1';
12258
+ convertData.className = 'col-span-2 m-0';
12028
12259
  }else {
12029
12260
  convertData.className = 'm-1';
12030
12261
  }
@@ -12431,8 +12662,8 @@ async function getFormBody(permissionFields, formFields, ctx){
12431
12662
  /*
12432
12663
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12433
12664
  * @Date: 2023-11-15 09:50:22
12434
- * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12435
- * @LastEditTime: 2023-12-25 13:13:56
12665
+ * @LastEditors: baozhoutao@steedos.com
12666
+ * @LastEditTime: 2024-01-02 15:43:50
12436
12667
  */
12437
12668
 
12438
12669
  /**
@@ -12460,20 +12691,22 @@ function getInputTableCell(field, showAsInlineEditMode) {
12460
12691
  name: field.name,
12461
12692
  quickEdit: {
12462
12693
  "type": "steedos-field",
12463
- "config": field,
12464
- hideLabel: true
12694
+ "config": Object.assign({}, field, {
12695
+ label: false
12696
+ })
12465
12697
  }
12466
12698
  }
12467
12699
  }
12468
12700
  else {
12469
12701
  return {
12470
12702
  "type": "steedos-field",
12471
- "config": field,
12703
+ "config": Object.assign({}, field, {
12704
+ label: false
12705
+ }),
12472
12706
  "static": true,
12473
12707
  "readonly": true,
12474
12708
  label: field.label,
12475
- name: field.name,
12476
- hideLabel: true
12709
+ name: field.name
12477
12710
  }
12478
12711
  }
12479
12712
  }
@@ -12719,7 +12952,9 @@ function getFormPaginationWrapper(props, form, mode) {
12719
12952
  let __wrapperServiceId = "${tableServiceId}";
12720
12953
  let wrapperService = scope.getComponentById(__wrapperServiceId);
12721
12954
  let wrapperServiceData = wrapperService.getData();
12722
- let lastestFieldValue = wrapperServiceData["${props.name}"] || [];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12955
+ // 这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12956
+ // 这里如果不.clone的话,在弹出窗口中显示的子表组件,添加行后点窗口的取消按钮关闭窗口后无法把之前的操作还原,即把之前添加的行自动移除
12957
+ let lastestFieldValue = _.clone(wrapperServiceData["${props.name}"] || []);
12723
12958
  //不可以直接像event.data.__tableItems = lastestFieldValue; 这样整个赋值,否则作用域会断
12724
12959
  let mode = "${mode}";
12725
12960
  if(mode === "new"){
@@ -12909,6 +13144,11 @@ async function getButtonActions(props, mode) {
12909
13144
  let dialogId = getComponentId("dialog", props.id);
12910
13145
  let buttonNextId = getComponentId("button_next", props.id);
12911
13146
  let formPaginationId = getComponentId("form_pagination", props.id);
13147
+ let parentFormData = "${__super.__super.__super.__super || {}}";
13148
+ let amisVersion = getComparableAmisVersion();
13149
+ if(amisVersion < 3.6){
13150
+ parentFormData = "${__super.__super || {}}";
13151
+ }
12912
13152
  if (mode == "new" || mode == "edit") {
12913
13153
  // let actionShowNewDialog = {
12914
13154
  // "actionType": "dialog",
@@ -13050,7 +13290,9 @@ async function getButtonActions(props, mode) {
13050
13290
  // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
13051
13291
  // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
13052
13292
  // "__parentForm": "${__super.__super || {}}",
13053
- "__parentForm": mode == "new" ? "$$" : "${__super.__super || {}}",
13293
+ // "__parentForm": mode == "new" ? "$$" : "${__super.__super || {}}",
13294
+ "__parentForm": mode == "new" ? "$$" : parentFormData,
13295
+ "_master": "${_master}",
13054
13296
  "global": "${global}",
13055
13297
  "uiSchema": "${uiSchema}",
13056
13298
  "index": "${index}",
@@ -13143,7 +13385,7 @@ async function getButtonActions(props, mode) {
13143
13385
  // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
13144
13386
  // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
13145
13387
  // "__parentForm": "${__super.__super || {}}",
13146
- "__parentForm": "${__super.__super || {}}",
13388
+ "__parentForm": parentFormData,
13147
13389
  "global": "${global}",
13148
13390
  "uiSchema": "${uiSchema}",
13149
13391
  "index": "${index}",
@@ -13311,7 +13553,7 @@ const getAmisInputTableSchema = async (props) => {
13311
13553
  "name": "__op__",
13312
13554
  "type": "operation",
13313
13555
  "buttons": buttonsForColumnOperations,
13314
- "width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
13556
+ "width": buttonsForColumnOperations.length > 1 ? "60px" : "20px"
13315
13557
  });
13316
13558
  }
13317
13559
  if (showAsInlineEditMode) {
@@ -14760,8 +15002,8 @@ const getInstanceApprovalHistory = async ()=>{
14760
15002
  /*
14761
15003
  * @Author: baozhoutao@steedos.com
14762
15004
  * @Date: 2022-09-07 16:20:45
14763
- * @LastEditors: baozhoutao@steedos.com
14764
- * @LastEditTime: 2023-03-23 16:49:44
15005
+ * @LastEditors: liaodaxue
15006
+ * @LastEditTime: 2023-12-29 16:06:35
14765
15007
  * @Description:
14766
15008
  */
14767
15009
 
@@ -15587,7 +15829,6 @@ const getFlowFormSchema = async (instance, box) => {
15587
15829
  "messages": {
15588
15830
  },
15589
15831
  "requestAdaptor": `
15590
- const { context } = api.data;
15591
15832
  api.data = {
15592
15833
  query: \`
15593
15834
  {
@@ -15610,7 +15851,7 @@ const getFlowFormSchema = async (instance, box) => {
15610
15851
  `,
15611
15852
  "data": {
15612
15853
  // "&": "$$",
15613
- "context": "${context}",
15854
+ // "context": "${context}",
15614
15855
  "judge": "${new_judge}",
15615
15856
  }
15616
15857
  },