@steedos-widgets/amis-lib 1.3.19 → 1.3.20

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
@@ -2007,6 +2007,9 @@ async function getTableColumns(fields, options){
2007
2007
  const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
2008
2008
 
2009
2009
  for (const field of fields) {
2010
+ if(field.hidden || field.extra){
2011
+ continue;
2012
+ }
2010
2013
  //增加quickEdit属性,实现快速编辑
2011
2014
  const quickEditSchema = allowEdit ? await getQuickEditSchema(field, options) : allowEdit;
2012
2015
  let className = "";
@@ -12366,7 +12369,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12366
12369
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12367
12370
  * @Date: 2023-11-15 09:50:22
12368
12371
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12369
- * @LastEditTime: 2023-12-04 17:36:50
12372
+ * @LastEditTime: 2023-12-12 17:13:37
12370
12373
  */
12371
12374
 
12372
12375
  /**
@@ -12380,52 +12383,71 @@ function getFormFields(props, mode = "edit") {
12380
12383
  "name": item.name,
12381
12384
  "config": item
12382
12385
  };
12383
- if(mode === "readonly"){
12386
+ if (mode === "readonly") {
12384
12387
  formItem.static = true;
12385
12388
  }
12386
12389
  return formItem;
12387
12390
  }) || [];
12388
12391
  }
12389
12392
 
12393
+ function getInputTableCell(field, showAsInlineEditMode) {
12394
+ if (showAsInlineEditMode) {
12395
+ return {
12396
+ label: field.label,
12397
+ name: field.name,
12398
+ quickEdit: {
12399
+ "type": "steedos-field",
12400
+ "config": field,
12401
+ hideLabel: true
12402
+ }
12403
+ }
12404
+ }
12405
+ else {
12406
+ return {
12407
+ "type": "steedos-field",
12408
+ "config": field,
12409
+ "static": true,
12410
+ "readonly": true,
12411
+ label: field.label,
12412
+ name: field.name,
12413
+ hideLabel: true
12414
+ }
12415
+ }
12416
+ }
12417
+
12390
12418
  /**
12391
12419
  * @param {*} props
12392
12420
  * @param {*} mode edit/new/readonly
12393
12421
  */
12394
12422
  async function getInputTableColumns(props) {
12395
12423
  let columns = props.columns || [];
12424
+ let inlineEditMode = props.inlineEditMode;
12425
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12396
12426
  // 实测过,直接不生成对应的隐藏column并不会对input-table值造成丢失问题,隐藏的列字段值能正常维护
12397
12427
  let fields = props.fields;
12398
- if(columns && columns.length){
12399
- return columns.map(function(column){
12428
+ if (columns && columns.length) {
12429
+ return columns.map(function (column) {
12400
12430
  let field, extendColumnProps = {};
12401
- if(typeof column === "string"){
12431
+ if (typeof column === "string") {
12402
12432
  // 如果字符串,则取出要显示的列配置
12403
- field = fields.find(function(fieldItem){
12433
+ field = fields.find(function (fieldItem) {
12404
12434
  return fieldItem.name === column;
12405
12435
  });
12406
12436
  }
12407
12437
  else {
12408
12438
  // 如果是对象,则合并到steedos-field的config.amis属性中,steedos组件会把config.amis属性混合到最终生成的input-table column
12409
- field = fields.find(function(fieldItem){
12439
+ field = fields.find(function (fieldItem) {
12410
12440
  return fieldItem.name === column.name;
12411
12441
  });
12412
- if(field){
12442
+ if (field) {
12413
12443
  // field.amis = Object.assign({}, field.amis, column);
12414
12444
  // 如果把column合并到field.amis,column的label/width等属性不会生效,只能放外层合并
12415
12445
  extendColumnProps = column;
12416
12446
  }
12417
12447
  }
12418
- if(field){
12419
- return {
12420
- "type": "steedos-field",
12421
- "config": field,
12422
- "static": true,
12423
- "readonly": true,
12424
- label: field.label,
12425
- name: field.name,
12426
- hideLabel: true,
12427
- ...extendColumnProps
12428
- }
12448
+ if (field) {
12449
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12450
+ return Object.assign({}, tableCell, extendColumnProps);
12429
12451
  }
12430
12452
  else {
12431
12453
  return column;
@@ -12433,20 +12455,212 @@ async function getInputTableColumns(props) {
12433
12455
  });
12434
12456
  }
12435
12457
  else {
12436
- return fields.map(function(field){
12437
- return {
12438
- "type": "steedos-field",
12439
- "config": field,
12440
- "static": true,
12441
- "readonly": true,
12442
- label: field.label,
12443
- name: field.name,
12444
- hideLabel: true
12445
- }
12458
+ return fields.map(function (field) {
12459
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12460
+ return tableCell;
12446
12461
  }) || [];
12447
12462
  }
12448
12463
  }
12449
12464
 
12465
+ function getFormPagination(props) {
12466
+ let onPageChangeScript = `
12467
+ 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,直接变更其值即可改变表单中的值
12472
+ let pageChangeDirection = context.props.pageChangeDirection;
12473
+ let currentPage = event.data.page;
12474
+ let currentIndex = event.data.index;
12475
+
12476
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems中
12477
+ let currentFormValues = scope.getComponentById(formId).getValues();
12478
+ 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
+ // });
12498
+
12499
+ // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
12500
+ let targetPage;
12501
+ if(pageChangeDirection === "next"){
12502
+ targetPage = currentPage + 1;
12503
+ }
12504
+ else{
12505
+ targetPage = currentPage - 1;
12506
+ }
12507
+ let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
12508
+ // let targetFormData = changedItems[targetIndex];
12509
+ doAction({
12510
+ "actionType": "setValue",
12511
+ "componentId": paginationServiceId,
12512
+ "args": {
12513
+ "value": {
12514
+ "page": targetPage,
12515
+ "index": targetIndex
12516
+ }
12517
+ }
12518
+ });
12519
+ // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
12520
+ // doAction({
12521
+ // "actionType": "setValue",
12522
+ // "componentId": formId,
12523
+ // "args": {
12524
+ // "value": targetFormData
12525
+ // },
12526
+ // "dataMergeMode": "override"// amis 3.2不支持override模式,高版本才支持
12527
+ // });
12528
+ `;
12529
+ return {
12530
+ "type": "wrapper",
12531
+ "className": "py-2",
12532
+ "body": [
12533
+ {
12534
+ "type": "button",
12535
+ "label": "",
12536
+ "icon": `fa fa-angle-left`,
12537
+ "level": "link",
12538
+ "pageChangeDirection": "prev",
12539
+ "disabledOn": "${page <= 1}",
12540
+ "size": "sm",
12541
+ "onEvent": {
12542
+ "click": {
12543
+ "actions": [
12544
+ {
12545
+ "actionType": "custom",
12546
+ "script": onPageChangeScript
12547
+ }
12548
+ ]
12549
+ }
12550
+ }
12551
+ },
12552
+ {
12553
+ "type": "tpl",
12554
+ "tpl": "${page}/${total}"
12555
+ },
12556
+ {
12557
+ "type": "button",
12558
+ "label": "",
12559
+ "icon": `fa fa-angle-right`,
12560
+ "level": "link",
12561
+ "pageChangeDirection": "next",
12562
+ "disabledOn": "${page >= total}",
12563
+ "size": "sm",
12564
+ "onEvent": {
12565
+ "click": {
12566
+ "actions": [
12567
+ {
12568
+ "actionType": "custom",
12569
+ "script": onPageChangeScript
12570
+ }
12571
+ ]
12572
+ }
12573
+ }
12574
+ }
12575
+ ]
12576
+ }
12577
+ }
12578
+
12579
+ /**
12580
+ * 传入formSchema输出带翻页容器的wrapper
12581
+ * @param {*} props input-table组件props
12582
+ * @param {*} form formSchema
12583
+ * @returns 带翻页容器的wrapper
12584
+ */
12585
+ function getFormPaginationWrapper(props, form) {
12586
+ let serviceId = `service_popup_pagination_wrapper__${props.id}`;
12587
+ let formBody = [
12588
+ {
12589
+ "type": "wrapper",
12590
+ "size": "none",
12591
+ "className": "flex justify-end border-y border-gray-200 -mx-6 shadow-inner sticky top-0 right-0 left-0 z-20 bg-white mb-4",
12592
+ "body": [
12593
+ getFormPagination(props)
12594
+ ]
12595
+ },
12596
+ // form
12597
+ Object.assign({}, form, {
12598
+ "canAccessSuperData": false,
12599
+ "data": {
12600
+ // "&": `\${${props.name}[index]}`,
12601
+ "&": "${changedItems[index]}"
12602
+ }
12603
+ })
12604
+ ];
12605
+ let onServiceInitedScript = `
12606
+ // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
12607
+ // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12608
+ // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12609
+ // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
12610
+ let inlineEditMode = ${props.inlineEditMode};
12611
+ if(!inlineEditMode){
12612
+ return;
12613
+ }
12614
+ let scope = event.context.scoped;
12615
+ let wrapperServiceId = event.data.wrapperServiceId;
12616
+ let wrapperService = scope.getComponentById(wrapperServiceId);
12617
+ let wrapperServiceData = wrapperService.getData();
12618
+ 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];
12622
+ });
12623
+ `;
12624
+ let schema = {
12625
+ "type": "service",
12626
+ "id": serviceId,
12627
+ "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;",
12635
+ "adaptor": `
12636
+ const formBody = ${JSON.stringify(formBody)};
12637
+ return {
12638
+ "body": formBody
12639
+ }
12640
+ `
12641
+ },
12642
+ // "body": formBody,
12643
+ "data": {
12644
+ "page": "${index + 1}",
12645
+ // "total": `\${${props.name}.length}`,
12646
+ "total": "${changedItems.length}",
12647
+ "paginationServiceId": serviceId,
12648
+ "formId": form.id
12649
+ },
12650
+ "onEvent": {
12651
+ "init": {
12652
+ "actions": [
12653
+ {
12654
+ "actionType": "custom",
12655
+ "script": onServiceInitedScript
12656
+ }
12657
+ ]
12658
+ }
12659
+ }
12660
+ };
12661
+ return schema;
12662
+ }
12663
+
12450
12664
  /**
12451
12665
  * @param {*} props
12452
12666
  * @param {*} mode edit/new/readonly
@@ -12454,29 +12668,58 @@ async function getInputTableColumns(props) {
12454
12668
  async function getForm(props, mode = "edit") {
12455
12669
  let formFields = getFormFields(props, mode);
12456
12670
  let body = await getFormBody(null, formFields);
12671
+ let forId = `form_popup__${props.id}`;
12457
12672
  let schema = {
12458
12673
  "type": "form",
12674
+ "id": forId,
12459
12675
  "title": "表单",
12460
12676
  "debug": false,
12461
12677
  "mode": "normal",
12462
12678
  "body": body,
12679
+ "wrapWithPanel": false,
12463
12680
  "className": "steedos-object-form steedos-amis-form"
12464
12681
  };
12465
12682
  if (mode === "edit") {
12683
+ let onEditItemSubmitScript = `
12684
+ // 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));
12687
+ doAction({
12688
+ "componentId": "${props.id}",
12689
+ "actionType": "setValue",
12690
+ "args": {
12691
+ "value": fieldValue
12692
+ }
12693
+ });
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
+ `;
12466
12705
  Object.assign(schema, {
12467
12706
  "onEvent": {
12468
12707
  "submit": {
12469
12708
  "weight": 0,
12470
12709
  "actions": [
12710
+ // {
12711
+ // "actionType": "setValue",
12712
+ // "args": {
12713
+ // "index": "${index}",
12714
+ // "value": {
12715
+ // "&": "$$"
12716
+ // }
12717
+ // },
12718
+ // "componentId": props.id
12719
+ // }
12471
12720
  {
12472
- "actionType": "setValue",
12473
- "args": {
12474
- "index": "${index}",
12475
- "value": {
12476
- "&": "$$"
12477
- }
12478
- },
12479
- "componentId": props.id
12721
+ "actionType": "custom",
12722
+ "script": onEditItemSubmitScript
12480
12723
  }
12481
12724
  ]
12482
12725
  }
@@ -12485,10 +12728,11 @@ async function getForm(props, mode = "edit") {
12485
12728
  }
12486
12729
  else if (mode === "new") {
12487
12730
  let onNewItemSubmitScript = `
12488
- let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12489
- if(!fieldValue){
12490
- fieldValue = [];
12731
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12732
+ if(!event.data.changedItems){
12733
+ event.data.changedItems = [];
12491
12734
  }
12735
+ let fieldValue = event.data.changedItems;
12492
12736
  fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12493
12737
  doAction({
12494
12738
  "componentId": "${props.id}",
@@ -12497,6 +12741,16 @@ async function getForm(props, mode = "edit") {
12497
12741
  "value": fieldValue
12498
12742
  }
12499
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
+ // });
12500
12754
  `;
12501
12755
  Object.assign(schema, {
12502
12756
  "onEvent": {
@@ -12522,6 +12776,9 @@ async function getForm(props, mode = "edit") {
12522
12776
  }
12523
12777
  });
12524
12778
  }
12779
+ if (mode === "edit" || mode === "readonly") {
12780
+ schema = getFormPaginationWrapper(props, schema);
12781
+ }
12525
12782
  return schema;
12526
12783
  }
12527
12784
 
@@ -12556,11 +12813,32 @@ async function getButtonNew(props) {
12556
12813
  };
12557
12814
  }
12558
12815
 
12559
- async function getButtonEdit(props) {
12816
+ 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
+ `;
12560
12838
  return {
12561
12839
  "type": "button",
12562
12840
  "label": "",
12563
- "icon": "fa fa-pencil",
12841
+ "icon": `fa fa-${showAsInlineEditMode ? "expand" : "pencil"}`,//inline edit模式时显示为放开按钮,只读时显示为笔按钮
12564
12842
  "level": "link",
12565
12843
  "onEvent": {
12566
12844
  "click": {
@@ -12578,7 +12856,29 @@ async function getButtonEdit(props) {
12578
12856
  "showErrorMsg": true,
12579
12857
  "showLoading": true,
12580
12858
  "className": "app-popover",
12581
- "closeOnEsc": false
12859
+ "closeOnEsc": false,
12860
+ "data": {
12861
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12862
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12863
+ // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
12864
+ "&": "${record || {}}",
12865
+ "global": "${global}",
12866
+ "uiSchema": "${uiSchema}",
12867
+ "grid": "${grid}",
12868
+ "index": "${index}",
12869
+ "changedItems": "${changedItems}",
12870
+ "wrapperServiceId": "${wrapperServiceId}"
12871
+ },
12872
+ "onEvent": {
12873
+ "cancel": {
12874
+ "actions": [
12875
+ {
12876
+ "actionType": "custom",
12877
+ "script": onCancelScript
12878
+ }
12879
+ ]
12880
+ }
12881
+ }
12582
12882
  }
12583
12883
  }
12584
12884
  ]
@@ -12591,7 +12891,7 @@ async function getButtonView(props) {
12591
12891
  return {
12592
12892
  "type": "button",
12593
12893
  "label": "",
12594
- "icon": "fa fa-external-link",
12894
+ "icon": "fa fa-expand",//fa-external-link
12595
12895
  "level": "link",
12596
12896
  "onEvent": {
12597
12897
  "click": {
@@ -12609,7 +12909,18 @@ async function getButtonView(props) {
12609
12909
  "showErrorMsg": true,
12610
12910
  "showLoading": true,
12611
12911
  "className": "app-popover",
12612
- "closeOnEsc": false
12912
+ "closeOnEsc": false,
12913
+ "actions": [],
12914
+ "data": {
12915
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12916
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12917
+ // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
12918
+ "&": "${formData || {}}",
12919
+ "grid": "${grid}",
12920
+ "index": "${index}",
12921
+ "changedItems": "${changedItems}",
12922
+ "wrapperServiceId": "${wrapperServiceId}"
12923
+ }
12613
12924
  }
12614
12925
  }
12615
12926
  ]
@@ -12619,6 +12930,32 @@ async function getButtonView(props) {
12619
12930
  }
12620
12931
 
12621
12932
  function getButtonDelete(props) {
12933
+ 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)
12941
+ doAction({
12942
+ "componentId": "${props.id}",
12943
+ "actionType": "setValue",
12944
+ "args": {
12945
+ "value": fieldValue
12946
+ }
12947
+ });
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
+ `;
12622
12959
  return {
12623
12960
  "type": "button",
12624
12961
  "label": "",
@@ -12627,12 +12964,16 @@ function getButtonDelete(props) {
12627
12964
  "onEvent": {
12628
12965
  "click": {
12629
12966
  "actions": [
12967
+ // {
12968
+ // "actionType": "deleteItem",
12969
+ // "args": {
12970
+ // "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12971
+ // },
12972
+ // "componentId": props.id
12973
+ // },
12630
12974
  {
12631
- "actionType": "deleteItem",
12632
- "args": {
12633
- "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12634
- },
12635
- "componentId": props.id
12975
+ "actionType": "custom",
12976
+ "script": onDeleteItemScript
12636
12977
  }
12637
12978
  ]
12638
12979
  }
@@ -12640,18 +12981,34 @@ function getButtonDelete(props) {
12640
12981
  };
12641
12982
  }
12642
12983
 
12643
- const getAmisInputTableSchema = async (props, readonly) => {
12984
+ const getAmisInputTableSchema = async (props) => {
12644
12985
  if (!props.id) {
12645
12986
  props.id = "steedos_input_table_" + props.name + "_" + Math.random().toString(36).substr(2, 9);
12646
12987
  }
12988
+ let serviceId = `service_wrapper__${props.id}`;
12647
12989
  let buttonsForColumnOperations = [];
12990
+ let inlineEditMode = props.inlineEditMode;
12991
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12648
12992
  if (props.editable) {
12649
- let buttonEditSchema = await getButtonEdit(props);
12650
- buttonsForColumnOperations.push(buttonEditSchema);
12993
+ let showEditButton = true;
12994
+ 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
+ }
13002
+ }
13003
+ // 编辑时显示编辑按钮
13004
+ if (showEditButton) {
13005
+ let buttonEditSchema = await getButtonEdit(props, showAsInlineEditMode);
13006
+ buttonsForColumnOperations.push(buttonEditSchema);
13007
+ }
12651
13008
  }
12652
13009
  else {
12653
13010
  // 只读时显示查看按钮
12654
- if(props.columns && props.columns.length > 0 && props.columns.length < props.fields.length){
13011
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
12655
13012
  // 只在有列被隐藏时才需要显示查看按钮
12656
13013
  let buttonViewSchema = await getButtonView(props);
12657
13014
  buttonsForColumnOperations.push(buttonViewSchema);
@@ -12688,13 +13045,26 @@ const getAmisInputTableSchema = async (props, readonly) => {
12688
13045
  "width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
12689
13046
  });
12690
13047
  }
13048
+ if (showAsInlineEditMode) {
13049
+ inputTableSchema.needConfirm = false;
13050
+ }
13051
+ let dataProviderInited = `
13052
+ // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
13053
+ setData({ changedItems: _.cloneDeep(data["${props.name}"]) || []});
13054
+ `;
12691
13055
  let schema = {
12692
- "type": "wrapper",
12693
- "size": "none",
13056
+ "type": "service",
12694
13057
  "body": [
12695
13058
  inputTableSchema
12696
13059
  ],
12697
- "className": props.className
13060
+ "className": props.className,
13061
+ "id": serviceId,
13062
+ "data": {
13063
+ "wrapperServiceId": serviceId
13064
+ },
13065
+ "dataProvider": {
13066
+ "inited": dataProviderInited
13067
+ }
12698
13068
  };
12699
13069
  let footerToolbar = clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
12700
13070
  if (props.addable) {
@@ -12712,6 +13082,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12712
13082
  delete props.amis.id;
12713
13083
  Object.assign(schema.body[0], props.amis);
12714
13084
  }
13085
+ // console.log("===schema===", schema);
12715
13086
  return schema;
12716
13087
  };
12717
13088