@steedos-widgets/amis-lib 1.3.20 → 1.3.22-beta.1

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
@@ -1038,7 +1038,7 @@ var config = {
1038
1038
  * @Author: baozhoutao@steedos.com
1039
1039
  * @Date: 2022-10-28 14:52:55
1040
1040
  * @LastEditors: liaodaxue
1041
- * @LastEditTime: 2023-07-28 16:16:29
1041
+ * @LastEditTime: 2023-12-14 12:01:22
1042
1042
  * @Description:
1043
1043
  */
1044
1044
 
@@ -1055,6 +1055,7 @@ const AmisFormInputs = [
1055
1055
  'percent',
1056
1056
  'password',
1057
1057
  'url',
1058
+ "color",
1058
1059
  'email'
1059
1060
  ];
1060
1061
 
@@ -1067,7 +1068,7 @@ function getAmisStaticFieldType(type, readonly, options){
1067
1068
  }
1068
1069
  return type;
1069
1070
  }
1070
- if(_$1.includes(['text','image'], type)){
1071
+ if(_$1.includes(['text','image','color'], type)){
1071
1072
  if('text' === type && options && options.amis && options.amis.tpl){
1072
1073
  return 'static';
1073
1074
  }
@@ -1201,6 +1202,7 @@ var frontend_form_please_select$1 = "Please select";
1201
1202
  var frontend_form_confirm$1 = "Confirm";
1202
1203
  var frontend_form_delete$1 = "Delete";
1203
1204
  var frontend_form_view$1 = "view";
1205
+ var frontend_form_details$1 = "details";
1204
1206
  var frontend_delete_confirm_text$1 = "Are you sure you want to delete this item?";
1205
1207
  var frontend_delete_many_selected_required$1 = "Please select the item to be deleted";
1206
1208
  var frontend_delete_many_confirm_text$1 = "Are you sure you want to delete?";
@@ -1287,6 +1289,7 @@ var en_us = {
1287
1289
  frontend_form_confirm: frontend_form_confirm$1,
1288
1290
  frontend_form_delete: frontend_form_delete$1,
1289
1291
  frontend_form_view: frontend_form_view$1,
1292
+ frontend_form_details: frontend_form_details$1,
1290
1293
  frontend_delete_confirm_text: frontend_delete_confirm_text$1,
1291
1294
  frontend_delete_many_selected_required: frontend_delete_many_selected_required$1,
1292
1295
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text$1,
@@ -1374,6 +1377,7 @@ var frontend_form_please_select = "请选择";
1374
1377
  var frontend_form_confirm = "确认";
1375
1378
  var frontend_form_delete = "删除";
1376
1379
  var frontend_form_view = "查看";
1380
+ var frontend_form_details = "详情";
1377
1381
  var frontend_delete_confirm_text = "确定要删除此项目?";
1378
1382
  var frontend_delete_many_selected_required = "请选择要删除的项";
1379
1383
  var frontend_delete_many_confirm_text = "确定要删除吗?";
@@ -1461,6 +1465,7 @@ var zh_cn = {
1461
1465
  frontend_form_confirm: frontend_form_confirm,
1462
1466
  frontend_form_delete: frontend_form_delete,
1463
1467
  frontend_form_view: frontend_form_view,
1468
+ frontend_form_details: frontend_form_details,
1464
1469
  frontend_delete_confirm_text: frontend_delete_confirm_text,
1465
1470
  frontend_delete_many_selected_required: frontend_delete_many_selected_required,
1466
1471
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text,
@@ -1757,21 +1762,21 @@ async function getQuickEditSchema(field, options){
1757
1762
  break;
1758
1763
  case "avatar":
1759
1764
  case "image":
1760
- quickEditSchema.body[0].receiver.adaptor = `
1761
- const { context } = api.body;
1762
- var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
1763
- payload = {
1764
- status: response.status == 200 ? 0 : response.status,
1765
- msg: response.statusText,
1766
- data: {
1767
- value: rootUrl + payload._id,//为了实现图片crud的回显,需要将value从id改为url,当保存数据数据时,再在发送适配器内重新将id提取出来
1768
- name: payload.original.name,
1769
- url: rootUrl + payload._id,
1765
+ quickEditSchema.body[0].receiver.adaptor = `
1766
+ const { context } = api.body;
1767
+ var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
1768
+ payload = {
1769
+ status: response.status == 200 ? 0 : response.status,
1770
+ msg: response.statusText,
1771
+ data: {
1772
+ value: rootUrl + payload._id,//为了实现图片crud的回显,需要将value从id改为url,当保存数据数据时,再在发送适配器内重新将id提取出来
1773
+ name: payload.original.name,
1774
+ url: rootUrl + payload._id,
1775
+ }
1770
1776
  }
1771
- }
1772
- return payload;
1773
- `;
1774
- break;
1777
+ return payload;
1778
+ `;
1779
+ break;
1775
1780
  }
1776
1781
  quickEditSchema.body[0].visibleOn = "${quickedit_record_permissions.allowEdit && quickedit_record_permissions_loading == false}";
1777
1782
  quickEditSchema.body.push({
@@ -1978,6 +1983,11 @@ async function getQuickEditSchema(field, options){
1978
1983
  if(field.type == "location"){
1979
1984
  quickEditSchema = false;
1980
1985
  }
1986
+ if(field.type == "color"){
1987
+ quickEditSchema = {
1988
+ type: "input-color"
1989
+ };
1990
+ }
1981
1991
  }
1982
1992
  return quickEditSchema;
1983
1993
  }
@@ -2135,6 +2145,11 @@ async function getTableColumns(fields, options){
2135
2145
  options: field.type === 'html' ? {html: true} : null
2136
2146
  // toggled: true
2137
2147
  }, field.amis, {name: field.name});
2148
+
2149
+ if(field.type === 'color'){
2150
+ columnItem.type = 'color';
2151
+ columnItem.defaultColor = null;
2152
+ }
2138
2153
  }
2139
2154
  }
2140
2155
  if(columnItem){
@@ -4822,8 +4837,8 @@ const getSchema$2 = (uiSchema) => {
4822
4837
  /*
4823
4838
  * @Author: baozhoutao@steedos.com
4824
4839
  * @Date: 2022-11-07 17:00:38
4825
- * @LastEditors: baozhoutao@steedos.com
4826
- * @LastEditTime: 2023-08-24 16:44:42
4840
+ * @LastEditors: liaodaxue
4841
+ * @LastEditTime: 2023-12-13 10:09:05
4827
4842
  * @Description:
4828
4843
  */
4829
4844
 
@@ -4834,7 +4849,7 @@ const getSchema$1 = (uiSchema)=>{
4834
4849
  "body": [
4835
4850
  {
4836
4851
  "type": "button",
4837
- "label": i18next.t('frontend_form_view'),
4852
+ "label": i18next.t('frontend_form_details'),
4838
4853
  "className": "border-none",
4839
4854
  "onEvent": {
4840
4855
  "click": {
@@ -11515,6 +11530,23 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
11515
11530
  }
11516
11531
  }
11517
11532
 
11533
+ break;
11534
+ case 'color':
11535
+ convertData = {
11536
+ type: getAmisStaticFieldType('color', readonly),
11537
+ name: field.name,
11538
+ label: field.label
11539
+ };
11540
+ if(readonly){
11541
+ convertData.defaultColor = null;
11542
+ }else {
11543
+ convertData.pipeIn = (value, data) => {
11544
+ if(value && value.indexOf('#')<0){
11545
+ return '#'+value;
11546
+ }
11547
+ return value;
11548
+ };
11549
+ }
11518
11550
  break;
11519
11551
  case 'boolean':
11520
11552
  convertData = {
@@ -12369,7 +12401,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12369
12401
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12370
12402
  * @Date: 2023-11-15 09:50:22
12371
12403
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12372
- * @LastEditTime: 2023-12-12 17:13:37
12404
+ * @LastEditTime: 2023-12-19 15:53:32
12373
12405
  */
12374
12406
 
12375
12407
  /**
@@ -12465,36 +12497,25 @@ async function getInputTableColumns(props) {
12465
12497
  function getFormPagination(props) {
12466
12498
  let onPageChangeScript = `
12467
12499
  let scope = event.context.scoped;
12468
- let paginationServiceId = event.data.paginationServiceId;
12469
- let wrapperServiceId = event.data.wrapperServiceId;
12470
- let formId = event.data.formId;
12471
- let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12500
+ let __paginationServiceId = event.data.__paginationServiceId;
12501
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12502
+ let __formId = event.data.__formId;
12503
+ let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
12472
12504
  let pageChangeDirection = context.props.pageChangeDirection;
12473
- let currentPage = event.data.page;
12505
+ let currentPage = event.data.__page;
12474
12506
  let currentIndex = event.data.index;
12475
12507
 
12476
- // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems
12477
- let currentFormValues = scope.getComponentById(formId).getValues();
12508
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量__tableItems
12509
+ let currentFormValues = scope.getComponentById(__formId).getValues();
12478
12510
  fieldValue[currentIndex] = currentFormValues;
12479
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12480
- // doAction({
12481
- // "componentId": wrapperServiceId,
12482
- // "actionType": "setValue",
12483
- // "args": {
12484
- // "value": {
12485
- // "changedItems": fieldValue
12486
- // }
12487
- // }
12488
- // });
12489
- // 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
12490
- // 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
12491
- // doAction({
12492
- // "componentId": "${props.id}",
12493
- // "actionType": "setValue",
12494
- // "args": {
12495
- // "value": fieldValue
12496
- // }
12497
- // });
12511
+ // 翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,所以额外给正式表单字段执行一次setValue
12512
+ doAction({
12513
+ "componentId": "${props.id}",
12514
+ "actionType": "setValue",
12515
+ "args": {
12516
+ "value": fieldValue
12517
+ }
12518
+ });
12498
12519
 
12499
12520
  // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
12500
12521
  let targetPage;
@@ -12505,13 +12526,13 @@ function getFormPagination(props) {
12505
12526
  targetPage = currentPage - 1;
12506
12527
  }
12507
12528
  let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
12508
- // let targetFormData = changedItems[targetIndex];
12529
+ // let targetFormData = __tableItems[targetIndex];
12509
12530
  doAction({
12510
12531
  "actionType": "setValue",
12511
- "componentId": paginationServiceId,
12532
+ "componentId": __paginationServiceId,
12512
12533
  "args": {
12513
12534
  "value": {
12514
- "page": targetPage,
12535
+ "__page": targetPage,
12515
12536
  "index": targetIndex
12516
12537
  }
12517
12538
  }
@@ -12519,7 +12540,7 @@ function getFormPagination(props) {
12519
12540
  // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
12520
12541
  // doAction({
12521
12542
  // "actionType": "setValue",
12522
- // "componentId": formId,
12543
+ // "componentId": __formId,
12523
12544
  // "args": {
12524
12545
  // "value": targetFormData
12525
12546
  // },
@@ -12536,7 +12557,7 @@ function getFormPagination(props) {
12536
12557
  "icon": `fa fa-angle-left`,
12537
12558
  "level": "link",
12538
12559
  "pageChangeDirection": "prev",
12539
- "disabledOn": "${page <= 1}",
12560
+ "disabledOn": "${__page <= 1}",
12540
12561
  "size": "sm",
12541
12562
  "onEvent": {
12542
12563
  "click": {
@@ -12551,7 +12572,7 @@ function getFormPagination(props) {
12551
12572
  },
12552
12573
  {
12553
12574
  "type": "tpl",
12554
- "tpl": "${page}/${total}"
12575
+ "tpl": "${__page}/${__total}"
12555
12576
  },
12556
12577
  {
12557
12578
  "type": "button",
@@ -12559,7 +12580,7 @@ function getFormPagination(props) {
12559
12580
  "icon": `fa fa-angle-right`,
12560
12581
  "level": "link",
12561
12582
  "pageChangeDirection": "next",
12562
- "disabledOn": "${page >= total}",
12583
+ "disabledOn": "${__page >= __total}",
12563
12584
  "size": "sm",
12564
12585
  "onEvent": {
12565
12586
  "click": {
@@ -12580,10 +12601,18 @@ function getFormPagination(props) {
12580
12601
  * 传入formSchema输出带翻页容器的wrapper
12581
12602
  * @param {*} props input-table组件props
12582
12603
  * @param {*} form formSchema
12604
+ * @param {*} mode edit/readonly
12583
12605
  * @returns 带翻页容器的wrapper
12584
12606
  */
12585
- function getFormPaginationWrapper(props, form) {
12607
+ function getFormPaginationWrapper(props, form, mode) {
12586
12608
  let serviceId = `service_popup_pagination_wrapper__${props.id}`;
12609
+ let innerForm = Object.assign({}, form, {
12610
+ "data": {
12611
+ // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12612
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12613
+ "&": "${__tableItems[__super.index]}"
12614
+ }
12615
+ });
12587
12616
  let formBody = [
12588
12617
  {
12589
12618
  "type": "wrapper",
@@ -12593,59 +12622,56 @@ function getFormPaginationWrapper(props, form) {
12593
12622
  getFormPagination(props)
12594
12623
  ]
12595
12624
  },
12596
- // form
12597
- Object.assign({}, form, {
12598
- "canAccessSuperData": false,
12625
+ {
12626
+ "type": "service",
12627
+ "body": [
12628
+ innerForm
12629
+ ],
12599
12630
  "data": {
12600
- // "&": `\${${props.name}[index]}`,
12601
- "&": "${changedItems[index]}"
12631
+ "&": "${__parentForm}"
12602
12632
  }
12603
- })
12633
+ }
12604
12634
  ];
12605
12635
  let onServiceInitedScript = `
12606
- // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
12607
- // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12608
- // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12636
+ // 以下脚本是为了解决有时弹出编辑表单时,表单中的值比最后一次编辑保存的值会延迟一拍。
12637
+ // 比如:inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12638
+ // 另外有的地方在非inlineEditMode模式时也会有这种延迟一拍问题,比如对象字段中下拉框类型字段的”选择项“属性
12639
+ // 再比如工作流规则详细页面修改了子表字段”时间触发器“值后,在只读界面点击查看按钮弹出的表单中__tableItems值是修改前的值
12640
+ // 处理思路是每次弹出form之前先把其__tableItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12609
12641
  // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
12610
- let inlineEditMode = ${props.inlineEditMode};
12611
- if(!inlineEditMode){
12612
- return;
12613
- }
12614
12642
  let scope = event.context.scoped;
12615
- let wrapperServiceId = event.data.wrapperServiceId;
12616
- let wrapperService = scope.getComponentById(wrapperServiceId);
12643
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12644
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12617
12645
  let wrapperServiceData = wrapperService.getData();
12618
12646
  let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12619
- //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
12620
- event.data.changedItems.forEach(function(n,i){
12621
- event.data.changedItems[i] = lastestFieldValue[i];
12647
+ //不可以直接像event.data.__tableItems = lastestFieldValue; 这样整个赋值,否则作用域会断
12648
+ event.data.__tableItems.forEach(function(n,i){
12649
+ event.data.__tableItems[i] = lastestFieldValue[i];
12622
12650
  });
12623
12651
  `;
12624
12652
  let schema = {
12625
12653
  "type": "service",
12626
12654
  "id": serviceId,
12627
12655
  "schemaApi": {
12628
- "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
12629
- // "url": "${context.rootUrl}/graphql",
12630
- "method": "post",
12631
- "headers": {
12632
- "Authorization": "Bearer ${context.tenantId},${context.authToken}"
12633
- },
12634
- "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
12656
+ // "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
12657
+ "url": "${context.rootUrl}/api/v1/spaces/none",
12658
+ "trackExpression": "${index}",
12659
+ "method": "get",
12635
12660
  "adaptor": `
12636
12661
  const formBody = ${JSON.stringify(formBody)};
12637
12662
  return {
12638
12663
  "body": formBody
12639
12664
  }
12640
- `
12665
+ `,
12666
+ "cache": 600000
12641
12667
  },
12642
12668
  // "body": formBody,
12643
12669
  "data": {
12644
- "page": "${index + 1}",
12645
- // "total": `\${${props.name}.length}`,
12646
- "total": "${changedItems.length}",
12647
- "paginationServiceId": serviceId,
12648
- "formId": form.id
12670
+ "__page": "${index + 1}",
12671
+ // "__total": `\${${props.name}.length}`,
12672
+ "__total": "${__tableItems.length}",
12673
+ "__paginationServiceId": serviceId,
12674
+ "__formId": form.id
12649
12675
  },
12650
12676
  "onEvent": {
12651
12677
  "init": {
@@ -12665,25 +12691,30 @@ function getFormPaginationWrapper(props, form) {
12665
12691
  * @param {*} props
12666
12692
  * @param {*} mode edit/new/readonly
12667
12693
  */
12668
- async function getForm(props, mode = "edit") {
12694
+ async function getForm(props, mode = "edit", formId) {
12669
12695
  let formFields = getFormFields(props, mode);
12670
12696
  let body = await getFormBody(null, formFields);
12671
- let forId = `form_popup__${props.id}`;
12697
+ if(!formId){
12698
+ formId = `form_popup__${props.id}`;
12699
+ }
12672
12700
  let schema = {
12673
12701
  "type": "form",
12674
- "id": forId,
12702
+ "id": formId,
12675
12703
  "title": "表单",
12676
12704
  "debug": false,
12677
12705
  "mode": "normal",
12678
12706
  "body": body,
12679
12707
  "wrapWithPanel": false,
12708
+ "canAccessSuperData": false,
12680
12709
  "className": "steedos-object-form steedos-amis-form"
12681
12710
  };
12682
12711
  if (mode === "edit") {
12683
12712
  let onEditItemSubmitScript = `
12684
12713
  // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12685
- let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12686
- fieldValue[event.data.index] = JSON.parse(JSON.stringify(event.data));
12714
+ let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
12715
+ //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12716
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12717
+ fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
12687
12718
  doAction({
12688
12719
  "componentId": "${props.id}",
12689
12720
  "actionType": "setValue",
@@ -12691,16 +12722,6 @@ async function getForm(props, mode = "edit") {
12691
12722
  "value": fieldValue
12692
12723
  }
12693
12724
  });
12694
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12695
- // doAction({
12696
- // "componentId": event.data.wrapperServiceId,
12697
- // "actionType": "setValue",
12698
- // "args": {
12699
- // "value": {
12700
- // "changedItems": fieldValue
12701
- // }
12702
- // }
12703
- // });
12704
12725
  `;
12705
12726
  Object.assign(schema, {
12706
12727
  "onEvent": {
@@ -12728,29 +12749,30 @@ async function getForm(props, mode = "edit") {
12728
12749
  }
12729
12750
  else if (mode === "new") {
12730
12751
  let onNewItemSubmitScript = `
12731
- // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12732
- if(!event.data.changedItems){
12733
- event.data.changedItems = [];
12752
+ let newItem = JSON.parse(JSON.stringify(event.data));
12753
+ if(event.data["${props.name}"]){
12754
+ // let fieldValue = event.data.__tableItems;
12755
+ // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
12756
+ let fieldValue = event.data["${props.name}"];
12757
+ fieldValue.push(newItem);
12758
+ doAction({
12759
+ "componentId": "${props.id}",
12760
+ "actionType": "setValue",
12761
+ "args": {
12762
+ "value": fieldValue
12763
+ }
12764
+ });
12765
+ }
12766
+ else{
12767
+ // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
12768
+ doAction({
12769
+ "componentId": "${props.id}",
12770
+ "actionType": "setValue",
12771
+ "args": {
12772
+ "value": [newItem]
12773
+ }
12774
+ });
12734
12775
  }
12735
- let fieldValue = event.data.changedItems;
12736
- fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12737
- doAction({
12738
- "componentId": "${props.id}",
12739
- "actionType": "setValue",
12740
- "args": {
12741
- "value": fieldValue
12742
- }
12743
- });
12744
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12745
- // doAction({
12746
- // "componentId": event.data.wrapperServiceId,
12747
- // "actionType": "setValue",
12748
- // "args": {
12749
- // "value": {
12750
- // "changedItems": fieldValue
12751
- // }
12752
- // }
12753
- // });
12754
12776
  `;
12755
12777
  Object.assign(schema, {
12756
12778
  "onEvent": {
@@ -12783,6 +12805,7 @@ async function getForm(props, mode = "edit") {
12783
12805
  }
12784
12806
 
12785
12807
  async function getButtonNew(props) {
12808
+ let formId = `form_popup__${props.id}`;
12786
12809
  return {
12787
12810
  "label": "新增",
12788
12811
  "type": "button",
@@ -12796,14 +12819,28 @@ async function getButtonNew(props) {
12796
12819
  "type": "dialog",
12797
12820
  "title": "新增行",
12798
12821
  "body": [
12799
- await getForm(props, "new")
12822
+ await getForm(props, "new", formId)
12800
12823
  ],
12801
12824
  "size": "lg",
12802
12825
  "showCloseButton": true,
12803
12826
  "showErrorMsg": true,
12804
12827
  "showLoading": true,
12805
12828
  "className": "app-popover",
12806
- "closeOnEsc": false
12829
+ "closeOnEsc": false,
12830
+ "onEvent": {
12831
+ "confirm": {
12832
+ "actions": [
12833
+ {
12834
+ "actionType": "validate",
12835
+ "componentId": formId
12836
+ },
12837
+ {
12838
+ "preventDefault": true,
12839
+ "expression": "${event.data.validateResult.error}" //触发表单校验结果会存入validateResult,amis 3.2不支持,高版本比如 3.5.3支持
12840
+ }
12841
+ ]
12842
+ }
12843
+ }
12807
12844
  }
12808
12845
  }
12809
12846
  ]
@@ -12814,27 +12851,7 @@ async function getButtonNew(props) {
12814
12851
  }
12815
12852
 
12816
12853
  async function getButtonEdit(props, showAsInlineEditMode) {
12817
- let onCancelScript = `
12818
- let scope = event.context.scoped;
12819
- let wrapperServiceId = event.data.wrapperServiceId;
12820
- let wrapperService = scope.getComponentById(wrapperServiceId);
12821
- let wrapperServiceData = wrapperService.getData();
12822
- let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12823
- //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
12824
- event.data.changedItems.forEach(function(n,i){
12825
- event.data.changedItems[i] = originalFieldValue[i];
12826
- });
12827
- // 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
12828
- // doAction({
12829
- // "componentId": wrapperServiceId,
12830
- // "actionType": "setValue",
12831
- // "args": {
12832
- // "value": {
12833
- // "changedItems": originalFieldValue
12834
- // }
12835
- // }
12836
- // });
12837
- `;
12854
+ let formId = `form_popup__${props.id}`;
12838
12855
  return {
12839
12856
  "type": "button",
12840
12857
  "label": "",
@@ -12849,7 +12866,7 @@ async function getButtonEdit(props, showAsInlineEditMode) {
12849
12866
  "type": "dialog",
12850
12867
  "title": "编辑行",
12851
12868
  "body": [
12852
- await getForm(props, "edit")
12869
+ await getForm(props, "edit", formId)
12853
12870
  ],
12854
12871
  "size": "lg",
12855
12872
  "showCloseButton": true,
@@ -12858,25 +12875,31 @@ async function getButtonEdit(props, showAsInlineEditMode) {
12858
12875
  "className": "app-popover",
12859
12876
  "closeOnEsc": false,
12860
12877
  "data": {
12861
- // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12878
+ // 这里必须加data数据映射,否则翻页功能中取__tableItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12862
12879
  // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12863
12880
  // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
12864
- "&": "${record || {}}",
12881
+ // "&": "${record || {}}",
12882
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
12883
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12884
+ "__parentForm": "${__super.__super || {}}",
12865
12885
  "global": "${global}",
12866
12886
  "uiSchema": "${uiSchema}",
12867
- "grid": "${grid}",
12868
12887
  "index": "${index}",
12869
- "changedItems": "${changedItems}",
12870
- "wrapperServiceId": "${wrapperServiceId}"
12888
+ "__tableItems": `\${${props.name}}`,
12889
+ "__wrapperServiceId": "${__wrapperServiceId}"
12871
12890
  },
12872
12891
  "onEvent": {
12873
- "cancel": {
12874
- "actions": [
12875
- {
12876
- "actionType": "custom",
12877
- "script": onCancelScript
12878
- }
12879
- ]
12892
+ "confirm": {
12893
+ "actions": [
12894
+ {
12895
+ "actionType": "validate",
12896
+ "componentId": formId
12897
+ },
12898
+ {
12899
+ "preventDefault": true,
12900
+ "expression": "${event.data.validateResult.error}" //触发表单校验结果会存入validateResult,amis 3.2不支持,高版本比如 3.5.3支持
12901
+ }
12902
+ ]
12880
12903
  }
12881
12904
  }
12882
12905
  }
@@ -12912,14 +12935,16 @@ async function getButtonView(props) {
12912
12935
  "closeOnEsc": false,
12913
12936
  "actions": [],
12914
12937
  "data": {
12915
- // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12938
+ // 这里必须加data数据映射,否则翻页功能中取__tableItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12916
12939
  // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12917
12940
  // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
12918
- "&": "${formData || {}}",
12919
- "grid": "${grid}",
12941
+ // "&": "${formData || {}}",
12942
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有formData变量
12943
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12944
+ "__parentForm": "${__super.__super || {}}",
12920
12945
  "index": "${index}",
12921
- "changedItems": "${changedItems}",
12922
- "wrapperServiceId": "${wrapperServiceId}"
12946
+ "__tableItems": `\${${props.name}}`,
12947
+ "__wrapperServiceId": "${__wrapperServiceId}"
12923
12948
  }
12924
12949
  }
12925
12950
  }
@@ -12931,30 +12956,20 @@ async function getButtonView(props) {
12931
12956
 
12932
12957
  function getButtonDelete(props) {
12933
12958
  let onDeleteItemScript = `
12934
- // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12935
- if(!event.data.changedItems){
12936
- event.data.changedItems = [];
12937
- }
12938
- let fieldValue = event.data.changedItems;
12939
- // fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12940
- fieldValue.splice(event.data.index, 1)
12959
+ // let fieldValue = event.data["${props.name}"];
12960
+ let scope = event.context.scoped;
12961
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12962
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12963
+ let wrapperServiceData = wrapperService.getData();
12964
+ let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12965
+ lastestFieldValue.splice(event.data.index, 1);
12941
12966
  doAction({
12942
12967
  "componentId": "${props.id}",
12943
12968
  "actionType": "setValue",
12944
12969
  "args": {
12945
- "value": fieldValue
12970
+ "value": lastestFieldValue
12946
12971
  }
12947
12972
  });
12948
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12949
- // doAction({
12950
- // "componentId": event.data.wrapperServiceId,
12951
- // "actionType": "setValue",
12952
- // "args": {
12953
- // "value": {
12954
- // "changedItems": fieldValue
12955
- // }
12956
- // }
12957
- // });
12958
12973
  `;
12959
12974
  return {
12960
12975
  "type": "button",
@@ -12992,13 +13007,15 @@ const getAmisInputTableSchema = async (props) => {
12992
13007
  if (props.editable) {
12993
13008
  let showEditButton = true;
12994
13009
  if (showAsInlineEditMode) {
12995
- // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
12996
- if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
12997
- showEditButton = true;
12998
- }
12999
- else {
13000
- showEditButton = false;
13001
- }
13010
+ // 始终显示弹出子表表单按钮,如果需要判断只在有列被隐藏时才需要显示弹出表单按钮放开下面的if逻辑就好
13011
+ showEditButton = true;
13012
+ // // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
13013
+ // if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
13014
+ // showEditButton = true;
13015
+ // }
13016
+ // else {
13017
+ // showEditButton = false;
13018
+ // }
13002
13019
  }
13003
13020
  // 编辑时显示编辑按钮
13004
13021
  if (showEditButton) {
@@ -13008,11 +13025,9 @@ const getAmisInputTableSchema = async (props) => {
13008
13025
  }
13009
13026
  else {
13010
13027
  // 只读时显示查看按钮
13011
- if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
13012
- // 只在有列被隐藏时才需要显示查看按钮
13013
- let buttonViewSchema = await getButtonView(props);
13014
- buttonsForColumnOperations.push(buttonViewSchema);
13015
- }
13028
+ // 如果想只在有列被隐藏时才需要显示查看按钮可以加上判断:if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length)
13029
+ let buttonViewSchema = await getButtonView(props);
13030
+ buttonsForColumnOperations.push(buttonViewSchema);
13016
13031
  }
13017
13032
  if (props.removable) {
13018
13033
  let buttonDeleteSchema = getButtonDelete(props);
@@ -13032,7 +13047,7 @@ const getAmisInputTableSchema = async (props) => {
13032
13047
  "id": props.id,
13033
13048
  "columns": await getInputTableColumns(props),
13034
13049
  // "needConfirm": false, //不可以配置为false,否则,单元格都是可编辑状态,且很多static类型无法正常显示,比如static-mapping
13035
- "strictMode": true,
13050
+ "strictMode": props.strictMode,
13036
13051
  "showTableAddBtn": false,
13037
13052
  "showFooterAddBtn": false,
13038
13053
  "className": props.tableClassName
@@ -13048,40 +13063,53 @@ const getAmisInputTableSchema = async (props) => {
13048
13063
  if (showAsInlineEditMode) {
13049
13064
  inputTableSchema.needConfirm = false;
13050
13065
  }
13051
- let dataProviderInited = `
13052
- // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
13053
- setData({ changedItems: _.cloneDeep(data["${props.name}"]) || []});
13054
- `;
13055
- let schema = {
13056
- "type": "service",
13057
- "body": [
13058
- inputTableSchema
13059
- ],
13060
- "className": props.className,
13061
- "id": serviceId,
13062
- "data": {
13063
- "wrapperServiceId": serviceId
13064
- },
13065
- "dataProvider": {
13066
- "inited": dataProviderInited
13067
- }
13068
- };
13066
+ let amis = props["input-table"] || props.amis;//额外支持"input-table"代替amis属性,是因为在字段yml文件中用amis作为key不好理解
13067
+ if (amis) {
13068
+ // 支持配置amis属性重写或添加最终生成的input-table中任何属性。
13069
+ delete amis.id;//如果steedos-input-table组件配置了amis.id属性,会造成新建编辑行功能不生效
13070
+ Object.assign(inputTableSchema, amis);
13071
+ }
13072
+ const isAnyFieldHasDependOn = (props.fields || []).find(function (item) {
13073
+ return item.depend_on;
13074
+ });
13075
+ if (isAnyFieldHasDependOn) {
13076
+ // 有任意一个子字段有depend_on属性时,强制设置禁用静态模式
13077
+ Object.assign(inputTableSchema, {
13078
+ strictMode: false
13079
+ });
13080
+ }
13081
+ let schemaBody = [inputTableSchema];
13069
13082
  let footerToolbar = clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
13070
13083
  if (props.addable) {
13071
13084
  let buttonNewSchema = await getButtonNew(props);
13072
13085
  footerToolbar.unshift(buttonNewSchema);
13073
13086
  }
13074
13087
  if (footerToolbar.length) {
13075
- schema.body.push({
13088
+ schemaBody.push({
13076
13089
  "type": "wrapper",
13077
13090
  "size": "none",
13078
13091
  "body": footerToolbar
13079
13092
  });
13080
13093
  }
13081
- if (props.amis) {
13082
- delete props.amis.id;
13083
- Object.assign(schema.body[0], props.amis);
13084
- }
13094
+ // 不可以直接把headerToolbar unshift进schemaBody,因为它没有显示在label下面,而是显示在上面了,这没有意义
13095
+ // 看起来amis官方后续会支持给input-table组件配置headerToolbar,见:https://github.com/baidu/amis/issues/7246
13096
+ // let headerToolbar = clone(props.headerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
13097
+ // if (headerToolbar.length) {
13098
+ // schemaBody.unshift({
13099
+ // "type": "wrapper",
13100
+ // "size": "none",
13101
+ // "body": headerToolbar
13102
+ // });
13103
+ // }
13104
+ let schema = {
13105
+ "type": "service",
13106
+ "body": schemaBody,
13107
+ "className": props.className,
13108
+ "id": serviceId,
13109
+ "data": {
13110
+ "__wrapperServiceId": serviceId
13111
+ }
13112
+ };
13085
13113
  // console.log("===schema===", schema);
13086
13114
  return schema;
13087
13115
  };