@steedos-widgets/amis-lib 1.3.18 → 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.cjs.js CHANGED
@@ -2034,6 +2034,9 @@ async function getTableColumns(fields, options){
2034
2034
  const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
2035
2035
 
2036
2036
  for (const field of fields) {
2037
+ if(field.hidden || field.extra){
2038
+ continue;
2039
+ }
2037
2040
  //增加quickEdit属性,实现快速编辑
2038
2041
  const quickEditSchema = allowEdit ? await getQuickEditSchema(field, options) : allowEdit;
2039
2042
  let className = "";
@@ -6198,12 +6201,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
6198
6201
  */
6199
6202
  function getObjectListHeaderFirstLine(objectSchema, listViewName, ctx) {
6200
6203
  const { icon, label } = objectSchema;
6204
+ const disabled_list_views = objectSchema.permissions.disabled_list_views;
6201
6205
  const listViewButtonOptions = [];
6202
6206
  _$1.each(
6203
6207
  objectSchema.list_views,
6204
6208
  (listView, name) => {
6205
- if(name === "lookup"){
6206
- // 内置lookup为弹出选择专用视图,不显示在列表切换区域
6209
+ if(name === "lookup" || (disabled_list_views && disabled_list_views.indexOf(listView._id)>-1)){
6210
+ // 内置lookup为弹出选择专用视图,根据用户权限被禁用的视图,不显示在列表切换区域
6207
6211
  return;
6208
6212
  }
6209
6213
  listViewButtonOptions.push({
@@ -8292,7 +8296,10 @@ async function getObjectCRUD(objectSchema, fields, options){
8292
8296
  // [`flex-auto ${crudClassName || ""}`]: "true",
8293
8297
  // "is-steedos-crud-data-empty": "${!items || COUNT(items) == 0}"
8294
8298
  // },
8295
- bodyClassName: "bg-white",//上面className写成动态的class变量对象的话,bodyClassName不会生效,会被上面的className值覆盖
8299
+ bodyClassName: {
8300
+ "bg-white": "true",
8301
+ "is-steedos-crud-data-empty": "${!items || COUNT(items) == 0}"
8302
+ },
8296
8303
  crudClassName: crudClassName,
8297
8304
  quickSaveApi: {
8298
8305
  url: `\${context.rootUrl}/graphql`,
@@ -12389,7 +12396,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12389
12396
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12390
12397
  * @Date: 2023-11-15 09:50:22
12391
12398
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12392
- * @LastEditTime: 2023-12-04 17:36:50
12399
+ * @LastEditTime: 2023-12-12 17:13:37
12393
12400
  */
12394
12401
 
12395
12402
  /**
@@ -12403,52 +12410,71 @@ function getFormFields(props, mode = "edit") {
12403
12410
  "name": item.name,
12404
12411
  "config": item
12405
12412
  };
12406
- if(mode === "readonly"){
12413
+ if (mode === "readonly") {
12407
12414
  formItem.static = true;
12408
12415
  }
12409
12416
  return formItem;
12410
12417
  }) || [];
12411
12418
  }
12412
12419
 
12420
+ function getInputTableCell(field, showAsInlineEditMode) {
12421
+ if (showAsInlineEditMode) {
12422
+ return {
12423
+ label: field.label,
12424
+ name: field.name,
12425
+ quickEdit: {
12426
+ "type": "steedos-field",
12427
+ "config": field,
12428
+ hideLabel: true
12429
+ }
12430
+ }
12431
+ }
12432
+ else {
12433
+ return {
12434
+ "type": "steedos-field",
12435
+ "config": field,
12436
+ "static": true,
12437
+ "readonly": true,
12438
+ label: field.label,
12439
+ name: field.name,
12440
+ hideLabel: true
12441
+ }
12442
+ }
12443
+ }
12444
+
12413
12445
  /**
12414
12446
  * @param {*} props
12415
12447
  * @param {*} mode edit/new/readonly
12416
12448
  */
12417
12449
  async function getInputTableColumns(props) {
12418
12450
  let columns = props.columns || [];
12451
+ let inlineEditMode = props.inlineEditMode;
12452
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12419
12453
  // 实测过,直接不生成对应的隐藏column并不会对input-table值造成丢失问题,隐藏的列字段值能正常维护
12420
12454
  let fields = props.fields;
12421
- if(columns && columns.length){
12422
- return columns.map(function(column){
12455
+ if (columns && columns.length) {
12456
+ return columns.map(function (column) {
12423
12457
  let field, extendColumnProps = {};
12424
- if(typeof column === "string"){
12458
+ if (typeof column === "string") {
12425
12459
  // 如果字符串,则取出要显示的列配置
12426
- field = fields.find(function(fieldItem){
12460
+ field = fields.find(function (fieldItem) {
12427
12461
  return fieldItem.name === column;
12428
12462
  });
12429
12463
  }
12430
12464
  else {
12431
12465
  // 如果是对象,则合并到steedos-field的config.amis属性中,steedos组件会把config.amis属性混合到最终生成的input-table column
12432
- field = fields.find(function(fieldItem){
12466
+ field = fields.find(function (fieldItem) {
12433
12467
  return fieldItem.name === column.name;
12434
12468
  });
12435
- if(field){
12469
+ if (field) {
12436
12470
  // field.amis = Object.assign({}, field.amis, column);
12437
12471
  // 如果把column合并到field.amis,column的label/width等属性不会生效,只能放外层合并
12438
12472
  extendColumnProps = column;
12439
12473
  }
12440
12474
  }
12441
- if(field){
12442
- return {
12443
- "type": "steedos-field",
12444
- "config": field,
12445
- "static": true,
12446
- "readonly": true,
12447
- label: field.label,
12448
- name: field.name,
12449
- hideLabel: true,
12450
- ...extendColumnProps
12451
- }
12475
+ if (field) {
12476
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12477
+ return Object.assign({}, tableCell, extendColumnProps);
12452
12478
  }
12453
12479
  else {
12454
12480
  return column;
@@ -12456,20 +12482,212 @@ async function getInputTableColumns(props) {
12456
12482
  });
12457
12483
  }
12458
12484
  else {
12459
- return fields.map(function(field){
12460
- return {
12461
- "type": "steedos-field",
12462
- "config": field,
12463
- "static": true,
12464
- "readonly": true,
12465
- label: field.label,
12466
- name: field.name,
12467
- hideLabel: true
12468
- }
12485
+ return fields.map(function (field) {
12486
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12487
+ return tableCell;
12469
12488
  }) || [];
12470
12489
  }
12471
12490
  }
12472
12491
 
12492
+ function getFormPagination(props) {
12493
+ let onPageChangeScript = `
12494
+ let scope = event.context.scoped;
12495
+ let paginationServiceId = event.data.paginationServiceId;
12496
+ let wrapperServiceId = event.data.wrapperServiceId;
12497
+ let formId = event.data.formId;
12498
+ let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12499
+ let pageChangeDirection = context.props.pageChangeDirection;
12500
+ let currentPage = event.data.page;
12501
+ let currentIndex = event.data.index;
12502
+
12503
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems中
12504
+ let currentFormValues = scope.getComponentById(formId).getValues();
12505
+ fieldValue[currentIndex] = currentFormValues;
12506
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12507
+ // doAction({
12508
+ // "componentId": wrapperServiceId,
12509
+ // "actionType": "setValue",
12510
+ // "args": {
12511
+ // "value": {
12512
+ // "changedItems": fieldValue
12513
+ // }
12514
+ // }
12515
+ // });
12516
+ // 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
12517
+ // 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
12518
+ // doAction({
12519
+ // "componentId": "${props.id}",
12520
+ // "actionType": "setValue",
12521
+ // "args": {
12522
+ // "value": fieldValue
12523
+ // }
12524
+ // });
12525
+
12526
+ // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
12527
+ let targetPage;
12528
+ if(pageChangeDirection === "next"){
12529
+ targetPage = currentPage + 1;
12530
+ }
12531
+ else{
12532
+ targetPage = currentPage - 1;
12533
+ }
12534
+ let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
12535
+ // let targetFormData = changedItems[targetIndex];
12536
+ doAction({
12537
+ "actionType": "setValue",
12538
+ "componentId": paginationServiceId,
12539
+ "args": {
12540
+ "value": {
12541
+ "page": targetPage,
12542
+ "index": targetIndex
12543
+ }
12544
+ }
12545
+ });
12546
+ // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
12547
+ // doAction({
12548
+ // "actionType": "setValue",
12549
+ // "componentId": formId,
12550
+ // "args": {
12551
+ // "value": targetFormData
12552
+ // },
12553
+ // "dataMergeMode": "override"// amis 3.2不支持override模式,高版本才支持
12554
+ // });
12555
+ `;
12556
+ return {
12557
+ "type": "wrapper",
12558
+ "className": "py-2",
12559
+ "body": [
12560
+ {
12561
+ "type": "button",
12562
+ "label": "",
12563
+ "icon": `fa fa-angle-left`,
12564
+ "level": "link",
12565
+ "pageChangeDirection": "prev",
12566
+ "disabledOn": "${page <= 1}",
12567
+ "size": "sm",
12568
+ "onEvent": {
12569
+ "click": {
12570
+ "actions": [
12571
+ {
12572
+ "actionType": "custom",
12573
+ "script": onPageChangeScript
12574
+ }
12575
+ ]
12576
+ }
12577
+ }
12578
+ },
12579
+ {
12580
+ "type": "tpl",
12581
+ "tpl": "${page}/${total}"
12582
+ },
12583
+ {
12584
+ "type": "button",
12585
+ "label": "",
12586
+ "icon": `fa fa-angle-right`,
12587
+ "level": "link",
12588
+ "pageChangeDirection": "next",
12589
+ "disabledOn": "${page >= total}",
12590
+ "size": "sm",
12591
+ "onEvent": {
12592
+ "click": {
12593
+ "actions": [
12594
+ {
12595
+ "actionType": "custom",
12596
+ "script": onPageChangeScript
12597
+ }
12598
+ ]
12599
+ }
12600
+ }
12601
+ }
12602
+ ]
12603
+ }
12604
+ }
12605
+
12606
+ /**
12607
+ * 传入formSchema输出带翻页容器的wrapper
12608
+ * @param {*} props input-table组件props
12609
+ * @param {*} form formSchema
12610
+ * @returns 带翻页容器的wrapper
12611
+ */
12612
+ function getFormPaginationWrapper(props, form) {
12613
+ let serviceId = `service_popup_pagination_wrapper__${props.id}`;
12614
+ let formBody = [
12615
+ {
12616
+ "type": "wrapper",
12617
+ "size": "none",
12618
+ "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",
12619
+ "body": [
12620
+ getFormPagination(props)
12621
+ ]
12622
+ },
12623
+ // form
12624
+ Object.assign({}, form, {
12625
+ "canAccessSuperData": false,
12626
+ "data": {
12627
+ // "&": `\${${props.name}[index]}`,
12628
+ "&": "${changedItems[index]}"
12629
+ }
12630
+ })
12631
+ ];
12632
+ let onServiceInitedScript = `
12633
+ // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
12634
+ // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12635
+ // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12636
+ // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
12637
+ let inlineEditMode = ${props.inlineEditMode};
12638
+ if(!inlineEditMode){
12639
+ return;
12640
+ }
12641
+ let scope = event.context.scoped;
12642
+ let wrapperServiceId = event.data.wrapperServiceId;
12643
+ let wrapperService = scope.getComponentById(wrapperServiceId);
12644
+ let wrapperServiceData = wrapperService.getData();
12645
+ let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12646
+ //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
12647
+ event.data.changedItems.forEach(function(n,i){
12648
+ event.data.changedItems[i] = lastestFieldValue[i];
12649
+ });
12650
+ `;
12651
+ let schema = {
12652
+ "type": "service",
12653
+ "id": serviceId,
12654
+ "schemaApi": {
12655
+ "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
12656
+ // "url": "${context.rootUrl}/graphql",
12657
+ "method": "post",
12658
+ "headers": {
12659
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
12660
+ },
12661
+ "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
12662
+ "adaptor": `
12663
+ const formBody = ${JSON.stringify(formBody)};
12664
+ return {
12665
+ "body": formBody
12666
+ }
12667
+ `
12668
+ },
12669
+ // "body": formBody,
12670
+ "data": {
12671
+ "page": "${index + 1}",
12672
+ // "total": `\${${props.name}.length}`,
12673
+ "total": "${changedItems.length}",
12674
+ "paginationServiceId": serviceId,
12675
+ "formId": form.id
12676
+ },
12677
+ "onEvent": {
12678
+ "init": {
12679
+ "actions": [
12680
+ {
12681
+ "actionType": "custom",
12682
+ "script": onServiceInitedScript
12683
+ }
12684
+ ]
12685
+ }
12686
+ }
12687
+ };
12688
+ return schema;
12689
+ }
12690
+
12473
12691
  /**
12474
12692
  * @param {*} props
12475
12693
  * @param {*} mode edit/new/readonly
@@ -12477,29 +12695,58 @@ async function getInputTableColumns(props) {
12477
12695
  async function getForm(props, mode = "edit") {
12478
12696
  let formFields = getFormFields(props, mode);
12479
12697
  let body = await getFormBody(null, formFields);
12698
+ let forId = `form_popup__${props.id}`;
12480
12699
  let schema = {
12481
12700
  "type": "form",
12701
+ "id": forId,
12482
12702
  "title": "表单",
12483
12703
  "debug": false,
12484
12704
  "mode": "normal",
12485
12705
  "body": body,
12706
+ "wrapWithPanel": false,
12486
12707
  "className": "steedos-object-form steedos-amis-form"
12487
12708
  };
12488
12709
  if (mode === "edit") {
12710
+ let onEditItemSubmitScript = `
12711
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12712
+ let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12713
+ fieldValue[event.data.index] = JSON.parse(JSON.stringify(event.data));
12714
+ doAction({
12715
+ "componentId": "${props.id}",
12716
+ "actionType": "setValue",
12717
+ "args": {
12718
+ "value": fieldValue
12719
+ }
12720
+ });
12721
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12722
+ // doAction({
12723
+ // "componentId": event.data.wrapperServiceId,
12724
+ // "actionType": "setValue",
12725
+ // "args": {
12726
+ // "value": {
12727
+ // "changedItems": fieldValue
12728
+ // }
12729
+ // }
12730
+ // });
12731
+ `;
12489
12732
  Object.assign(schema, {
12490
12733
  "onEvent": {
12491
12734
  "submit": {
12492
12735
  "weight": 0,
12493
12736
  "actions": [
12737
+ // {
12738
+ // "actionType": "setValue",
12739
+ // "args": {
12740
+ // "index": "${index}",
12741
+ // "value": {
12742
+ // "&": "$$"
12743
+ // }
12744
+ // },
12745
+ // "componentId": props.id
12746
+ // }
12494
12747
  {
12495
- "actionType": "setValue",
12496
- "args": {
12497
- "index": "${index}",
12498
- "value": {
12499
- "&": "$$"
12500
- }
12501
- },
12502
- "componentId": props.id
12748
+ "actionType": "custom",
12749
+ "script": onEditItemSubmitScript
12503
12750
  }
12504
12751
  ]
12505
12752
  }
@@ -12508,10 +12755,11 @@ async function getForm(props, mode = "edit") {
12508
12755
  }
12509
12756
  else if (mode === "new") {
12510
12757
  let onNewItemSubmitScript = `
12511
- let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12512
- if(!fieldValue){
12513
- fieldValue = [];
12758
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12759
+ if(!event.data.changedItems){
12760
+ event.data.changedItems = [];
12514
12761
  }
12762
+ let fieldValue = event.data.changedItems;
12515
12763
  fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12516
12764
  doAction({
12517
12765
  "componentId": "${props.id}",
@@ -12520,6 +12768,16 @@ async function getForm(props, mode = "edit") {
12520
12768
  "value": fieldValue
12521
12769
  }
12522
12770
  });
12771
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12772
+ // doAction({
12773
+ // "componentId": event.data.wrapperServiceId,
12774
+ // "actionType": "setValue",
12775
+ // "args": {
12776
+ // "value": {
12777
+ // "changedItems": fieldValue
12778
+ // }
12779
+ // }
12780
+ // });
12523
12781
  `;
12524
12782
  Object.assign(schema, {
12525
12783
  "onEvent": {
@@ -12545,6 +12803,9 @@ async function getForm(props, mode = "edit") {
12545
12803
  }
12546
12804
  });
12547
12805
  }
12806
+ if (mode === "edit" || mode === "readonly") {
12807
+ schema = getFormPaginationWrapper(props, schema);
12808
+ }
12548
12809
  return schema;
12549
12810
  }
12550
12811
 
@@ -12579,11 +12840,32 @@ async function getButtonNew(props) {
12579
12840
  };
12580
12841
  }
12581
12842
 
12582
- async function getButtonEdit(props) {
12843
+ async function getButtonEdit(props, showAsInlineEditMode) {
12844
+ let onCancelScript = `
12845
+ let scope = event.context.scoped;
12846
+ let wrapperServiceId = event.data.wrapperServiceId;
12847
+ let wrapperService = scope.getComponentById(wrapperServiceId);
12848
+ let wrapperServiceData = wrapperService.getData();
12849
+ let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12850
+ //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
12851
+ event.data.changedItems.forEach(function(n,i){
12852
+ event.data.changedItems[i] = originalFieldValue[i];
12853
+ });
12854
+ // 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
12855
+ // doAction({
12856
+ // "componentId": wrapperServiceId,
12857
+ // "actionType": "setValue",
12858
+ // "args": {
12859
+ // "value": {
12860
+ // "changedItems": originalFieldValue
12861
+ // }
12862
+ // }
12863
+ // });
12864
+ `;
12583
12865
  return {
12584
12866
  "type": "button",
12585
12867
  "label": "",
12586
- "icon": "fa fa-pencil",
12868
+ "icon": `fa fa-${showAsInlineEditMode ? "expand" : "pencil"}`,//inline edit模式时显示为放开按钮,只读时显示为笔按钮
12587
12869
  "level": "link",
12588
12870
  "onEvent": {
12589
12871
  "click": {
@@ -12601,7 +12883,29 @@ async function getButtonEdit(props) {
12601
12883
  "showErrorMsg": true,
12602
12884
  "showLoading": true,
12603
12885
  "className": "app-popover",
12604
- "closeOnEsc": false
12886
+ "closeOnEsc": false,
12887
+ "data": {
12888
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12889
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12890
+ // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
12891
+ "&": "${record || {}}",
12892
+ "global": "${global}",
12893
+ "uiSchema": "${uiSchema}",
12894
+ "grid": "${grid}",
12895
+ "index": "${index}",
12896
+ "changedItems": "${changedItems}",
12897
+ "wrapperServiceId": "${wrapperServiceId}"
12898
+ },
12899
+ "onEvent": {
12900
+ "cancel": {
12901
+ "actions": [
12902
+ {
12903
+ "actionType": "custom",
12904
+ "script": onCancelScript
12905
+ }
12906
+ ]
12907
+ }
12908
+ }
12605
12909
  }
12606
12910
  }
12607
12911
  ]
@@ -12614,7 +12918,7 @@ async function getButtonView(props) {
12614
12918
  return {
12615
12919
  "type": "button",
12616
12920
  "label": "",
12617
- "icon": "fa fa-external-link",
12921
+ "icon": "fa fa-expand",//fa-external-link
12618
12922
  "level": "link",
12619
12923
  "onEvent": {
12620
12924
  "click": {
@@ -12632,7 +12936,18 @@ async function getButtonView(props) {
12632
12936
  "showErrorMsg": true,
12633
12937
  "showLoading": true,
12634
12938
  "className": "app-popover",
12635
- "closeOnEsc": false
12939
+ "closeOnEsc": false,
12940
+ "actions": [],
12941
+ "data": {
12942
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12943
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12944
+ // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
12945
+ "&": "${formData || {}}",
12946
+ "grid": "${grid}",
12947
+ "index": "${index}",
12948
+ "changedItems": "${changedItems}",
12949
+ "wrapperServiceId": "${wrapperServiceId}"
12950
+ }
12636
12951
  }
12637
12952
  }
12638
12953
  ]
@@ -12642,6 +12957,32 @@ async function getButtonView(props) {
12642
12957
  }
12643
12958
 
12644
12959
  function getButtonDelete(props) {
12960
+ let onDeleteItemScript = `
12961
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12962
+ if(!event.data.changedItems){
12963
+ event.data.changedItems = [];
12964
+ }
12965
+ let fieldValue = event.data.changedItems;
12966
+ // fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12967
+ fieldValue.splice(event.data.index, 1)
12968
+ doAction({
12969
+ "componentId": "${props.id}",
12970
+ "actionType": "setValue",
12971
+ "args": {
12972
+ "value": fieldValue
12973
+ }
12974
+ });
12975
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12976
+ // doAction({
12977
+ // "componentId": event.data.wrapperServiceId,
12978
+ // "actionType": "setValue",
12979
+ // "args": {
12980
+ // "value": {
12981
+ // "changedItems": fieldValue
12982
+ // }
12983
+ // }
12984
+ // });
12985
+ `;
12645
12986
  return {
12646
12987
  "type": "button",
12647
12988
  "label": "",
@@ -12650,12 +12991,16 @@ function getButtonDelete(props) {
12650
12991
  "onEvent": {
12651
12992
  "click": {
12652
12993
  "actions": [
12994
+ // {
12995
+ // "actionType": "deleteItem",
12996
+ // "args": {
12997
+ // "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12998
+ // },
12999
+ // "componentId": props.id
13000
+ // },
12653
13001
  {
12654
- "actionType": "deleteItem",
12655
- "args": {
12656
- "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12657
- },
12658
- "componentId": props.id
13002
+ "actionType": "custom",
13003
+ "script": onDeleteItemScript
12659
13004
  }
12660
13005
  ]
12661
13006
  }
@@ -12663,18 +13008,34 @@ function getButtonDelete(props) {
12663
13008
  };
12664
13009
  }
12665
13010
 
12666
- const getAmisInputTableSchema = async (props, readonly) => {
13011
+ const getAmisInputTableSchema = async (props) => {
12667
13012
  if (!props.id) {
12668
13013
  props.id = "steedos_input_table_" + props.name + "_" + Math.random().toString(36).substr(2, 9);
12669
13014
  }
13015
+ let serviceId = `service_wrapper__${props.id}`;
12670
13016
  let buttonsForColumnOperations = [];
13017
+ let inlineEditMode = props.inlineEditMode;
13018
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12671
13019
  if (props.editable) {
12672
- let buttonEditSchema = await getButtonEdit(props);
12673
- buttonsForColumnOperations.push(buttonEditSchema);
13020
+ let showEditButton = true;
13021
+ if (showAsInlineEditMode) {
13022
+ // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
13023
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
13024
+ showEditButton = true;
13025
+ }
13026
+ else {
13027
+ showEditButton = false;
13028
+ }
13029
+ }
13030
+ // 编辑时显示编辑按钮
13031
+ if (showEditButton) {
13032
+ let buttonEditSchema = await getButtonEdit(props, showAsInlineEditMode);
13033
+ buttonsForColumnOperations.push(buttonEditSchema);
13034
+ }
12674
13035
  }
12675
13036
  else {
12676
13037
  // 只读时显示查看按钮
12677
- if(props.columns && props.columns.length > 0 && props.columns.length < props.fields.length){
13038
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
12678
13039
  // 只在有列被隐藏时才需要显示查看按钮
12679
13040
  let buttonViewSchema = await getButtonView(props);
12680
13041
  buttonsForColumnOperations.push(buttonViewSchema);
@@ -12711,13 +13072,26 @@ const getAmisInputTableSchema = async (props, readonly) => {
12711
13072
  "width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
12712
13073
  });
12713
13074
  }
13075
+ if (showAsInlineEditMode) {
13076
+ inputTableSchema.needConfirm = false;
13077
+ }
13078
+ let dataProviderInited = `
13079
+ // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
13080
+ setData({ changedItems: _.cloneDeep(data["${props.name}"]) || []});
13081
+ `;
12714
13082
  let schema = {
12715
- "type": "wrapper",
12716
- "size": "none",
13083
+ "type": "service",
12717
13084
  "body": [
12718
13085
  inputTableSchema
12719
13086
  ],
12720
- "className": props.className
13087
+ "className": props.className,
13088
+ "id": serviceId,
13089
+ "data": {
13090
+ "wrapperServiceId": serviceId
13091
+ },
13092
+ "dataProvider": {
13093
+ "inited": dataProviderInited
13094
+ }
12721
13095
  };
12722
13096
  let footerToolbar = _$1.clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
12723
13097
  if (props.addable) {
@@ -12735,6 +13109,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12735
13109
  delete props.amis.id;
12736
13110
  Object.assign(schema.body[0], props.amis);
12737
13111
  }
13112
+ // console.log("===schema===", schema);
12738
13113
  return schema;
12739
13114
  };
12740
13115