@steedos-widgets/amis-lib 1.3.19 → 1.3.21

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
@@ -1065,7 +1065,7 @@ var config = {
1065
1065
  * @Author: baozhoutao@steedos.com
1066
1066
  * @Date: 2022-10-28 14:52:55
1067
1067
  * @LastEditors: liaodaxue
1068
- * @LastEditTime: 2023-07-28 16:16:29
1068
+ * @LastEditTime: 2023-12-14 12:01:22
1069
1069
  * @Description:
1070
1070
  */
1071
1071
 
@@ -1082,6 +1082,7 @@ const AmisFormInputs = [
1082
1082
  'percent',
1083
1083
  'password',
1084
1084
  'url',
1085
+ "color",
1085
1086
  'email'
1086
1087
  ];
1087
1088
 
@@ -1094,7 +1095,7 @@ function getAmisStaticFieldType(type, readonly, options){
1094
1095
  }
1095
1096
  return type;
1096
1097
  }
1097
- if(___namespace.includes(['text','image'], type)){
1098
+ if(___namespace.includes(['text','image','color'], type)){
1098
1099
  if('text' === type && options && options.amis && options.amis.tpl){
1099
1100
  return 'static';
1100
1101
  }
@@ -1228,6 +1229,7 @@ var frontend_form_please_select$1 = "Please select";
1228
1229
  var frontend_form_confirm$1 = "Confirm";
1229
1230
  var frontend_form_delete$1 = "Delete";
1230
1231
  var frontend_form_view$1 = "view";
1232
+ var frontend_form_details$1 = "details";
1231
1233
  var frontend_delete_confirm_text$1 = "Are you sure you want to delete this item?";
1232
1234
  var frontend_delete_many_selected_required$1 = "Please select the item to be deleted";
1233
1235
  var frontend_delete_many_confirm_text$1 = "Are you sure you want to delete?";
@@ -1314,6 +1316,7 @@ var en_us = {
1314
1316
  frontend_form_confirm: frontend_form_confirm$1,
1315
1317
  frontend_form_delete: frontend_form_delete$1,
1316
1318
  frontend_form_view: frontend_form_view$1,
1319
+ frontend_form_details: frontend_form_details$1,
1317
1320
  frontend_delete_confirm_text: frontend_delete_confirm_text$1,
1318
1321
  frontend_delete_many_selected_required: frontend_delete_many_selected_required$1,
1319
1322
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text$1,
@@ -1401,6 +1404,7 @@ var frontend_form_please_select = "请选择";
1401
1404
  var frontend_form_confirm = "确认";
1402
1405
  var frontend_form_delete = "删除";
1403
1406
  var frontend_form_view = "查看";
1407
+ var frontend_form_details = "详情";
1404
1408
  var frontend_delete_confirm_text = "确定要删除此项目?";
1405
1409
  var frontend_delete_many_selected_required = "请选择要删除的项";
1406
1410
  var frontend_delete_many_confirm_text = "确定要删除吗?";
@@ -1488,6 +1492,7 @@ var zh_cn = {
1488
1492
  frontend_form_confirm: frontend_form_confirm,
1489
1493
  frontend_form_delete: frontend_form_delete,
1490
1494
  frontend_form_view: frontend_form_view,
1495
+ frontend_form_details: frontend_form_details,
1491
1496
  frontend_delete_confirm_text: frontend_delete_confirm_text,
1492
1497
  frontend_delete_many_selected_required: frontend_delete_many_selected_required,
1493
1498
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text,
@@ -2034,6 +2039,9 @@ async function getTableColumns(fields, options){
2034
2039
  const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
2035
2040
 
2036
2041
  for (const field of fields) {
2042
+ if(field.hidden || field.extra){
2043
+ continue;
2044
+ }
2037
2045
  //增加quickEdit属性,实现快速编辑
2038
2046
  const quickEditSchema = allowEdit ? await getQuickEditSchema(field, options) : allowEdit;
2039
2047
  let className = "";
@@ -2159,6 +2167,11 @@ async function getTableColumns(fields, options){
2159
2167
  options: field.type === 'html' ? {html: true} : null
2160
2168
  // toggled: true
2161
2169
  }, field.amis, {name: field.name});
2170
+
2171
+ if(field.type === 'color'){
2172
+ columnItem.type = 'color';
2173
+ columnItem.defaultColor = null;
2174
+ }
2162
2175
  }
2163
2176
  }
2164
2177
  if(columnItem){
@@ -4846,8 +4859,8 @@ const getSchema$2 = (uiSchema) => {
4846
4859
  /*
4847
4860
  * @Author: baozhoutao@steedos.com
4848
4861
  * @Date: 2022-11-07 17:00:38
4849
- * @LastEditors: baozhoutao@steedos.com
4850
- * @LastEditTime: 2023-08-24 16:44:42
4862
+ * @LastEditors: liaodaxue
4863
+ * @LastEditTime: 2023-12-13 10:09:05
4851
4864
  * @Description:
4852
4865
  */
4853
4866
 
@@ -4858,7 +4871,7 @@ const getSchema$1 = (uiSchema)=>{
4858
4871
  "body": [
4859
4872
  {
4860
4873
  "type": "button",
4861
- "label": i18next__default["default"].t('frontend_form_view'),
4874
+ "label": i18next__default["default"].t('frontend_form_details'),
4862
4875
  "className": "border-none",
4863
4876
  "onEvent": {
4864
4877
  "click": {
@@ -11539,6 +11552,16 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
11539
11552
  }
11540
11553
  }
11541
11554
 
11555
+ break;
11556
+ case 'color':
11557
+ convertData = {
11558
+ type: getAmisStaticFieldType('color', readonly),
11559
+ name: field.name,
11560
+ label: field.label
11561
+ };
11562
+ if(readonly){
11563
+ convertData.defaultColor = null;
11564
+ }
11542
11565
  break;
11543
11566
  case 'boolean':
11544
11567
  convertData = {
@@ -12393,7 +12416,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12393
12416
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12394
12417
  * @Date: 2023-11-15 09:50:22
12395
12418
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12396
- * @LastEditTime: 2023-12-04 17:36:50
12419
+ * @LastEditTime: 2023-12-16 16:39:49
12397
12420
  */
12398
12421
 
12399
12422
  /**
@@ -12407,52 +12430,71 @@ function getFormFields(props, mode = "edit") {
12407
12430
  "name": item.name,
12408
12431
  "config": item
12409
12432
  };
12410
- if(mode === "readonly"){
12433
+ if (mode === "readonly") {
12411
12434
  formItem.static = true;
12412
12435
  }
12413
12436
  return formItem;
12414
12437
  }) || [];
12415
12438
  }
12416
12439
 
12440
+ function getInputTableCell(field, showAsInlineEditMode) {
12441
+ if (showAsInlineEditMode) {
12442
+ return {
12443
+ label: field.label,
12444
+ name: field.name,
12445
+ quickEdit: {
12446
+ "type": "steedos-field",
12447
+ "config": field,
12448
+ hideLabel: true
12449
+ }
12450
+ }
12451
+ }
12452
+ else {
12453
+ return {
12454
+ "type": "steedos-field",
12455
+ "config": field,
12456
+ "static": true,
12457
+ "readonly": true,
12458
+ label: field.label,
12459
+ name: field.name,
12460
+ hideLabel: true
12461
+ }
12462
+ }
12463
+ }
12464
+
12417
12465
  /**
12418
12466
  * @param {*} props
12419
12467
  * @param {*} mode edit/new/readonly
12420
12468
  */
12421
12469
  async function getInputTableColumns(props) {
12422
12470
  let columns = props.columns || [];
12471
+ let inlineEditMode = props.inlineEditMode;
12472
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12423
12473
  // 实测过,直接不生成对应的隐藏column并不会对input-table值造成丢失问题,隐藏的列字段值能正常维护
12424
12474
  let fields = props.fields;
12425
- if(columns && columns.length){
12426
- return columns.map(function(column){
12475
+ if (columns && columns.length) {
12476
+ return columns.map(function (column) {
12427
12477
  let field, extendColumnProps = {};
12428
- if(typeof column === "string"){
12478
+ if (typeof column === "string") {
12429
12479
  // 如果字符串,则取出要显示的列配置
12430
- field = fields.find(function(fieldItem){
12480
+ field = fields.find(function (fieldItem) {
12431
12481
  return fieldItem.name === column;
12432
12482
  });
12433
12483
  }
12434
12484
  else {
12435
12485
  // 如果是对象,则合并到steedos-field的config.amis属性中,steedos组件会把config.amis属性混合到最终生成的input-table column
12436
- field = fields.find(function(fieldItem){
12486
+ field = fields.find(function (fieldItem) {
12437
12487
  return fieldItem.name === column.name;
12438
12488
  });
12439
- if(field){
12489
+ if (field) {
12440
12490
  // field.amis = Object.assign({}, field.amis, column);
12441
12491
  // 如果把column合并到field.amis,column的label/width等属性不会生效,只能放外层合并
12442
12492
  extendColumnProps = column;
12443
12493
  }
12444
12494
  }
12445
- if(field){
12446
- return {
12447
- "type": "steedos-field",
12448
- "config": field,
12449
- "static": true,
12450
- "readonly": true,
12451
- label: field.label,
12452
- name: field.name,
12453
- hideLabel: true,
12454
- ...extendColumnProps
12455
- }
12495
+ if (field) {
12496
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12497
+ return Object.assign({}, tableCell, extendColumnProps);
12456
12498
  }
12457
12499
  else {
12458
12500
  return column;
@@ -12460,20 +12502,226 @@ async function getInputTableColumns(props) {
12460
12502
  });
12461
12503
  }
12462
12504
  else {
12463
- return fields.map(function(field){
12464
- return {
12465
- "type": "steedos-field",
12466
- "config": field,
12467
- "static": true,
12468
- "readonly": true,
12469
- label: field.label,
12470
- name: field.name,
12471
- hideLabel: true
12472
- }
12505
+ return fields.map(function (field) {
12506
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12507
+ return tableCell;
12473
12508
  }) || [];
12474
12509
  }
12475
12510
  }
12476
12511
 
12512
+ function getFormPagination(props) {
12513
+ let onPageChangeScript = `
12514
+ let scope = event.context.scoped;
12515
+ let __paginationServiceId = event.data.__paginationServiceId;
12516
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12517
+ let __formId = event.data.__formId;
12518
+ let fieldValue = event.data.__changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12519
+ let pageChangeDirection = context.props.pageChangeDirection;
12520
+ let currentPage = event.data.__page;
12521
+ let currentIndex = event.data.index;
12522
+
12523
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems中
12524
+ let currentFormValues = scope.getComponentById(__formId).getValues();
12525
+ fieldValue[currentIndex] = currentFormValues;
12526
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12527
+ // doAction({
12528
+ // "componentId": __wrapperServiceId,
12529
+ // "actionType": "setValue",
12530
+ // "args": {
12531
+ // "value": {
12532
+ // "__changedItems": fieldValue
12533
+ // }
12534
+ // }
12535
+ // });
12536
+ // 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
12537
+ // 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
12538
+ // doAction({
12539
+ // "componentId": "${props.id}",
12540
+ // "actionType": "setValue",
12541
+ // "args": {
12542
+ // "value": fieldValue
12543
+ // }
12544
+ // });
12545
+
12546
+ // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
12547
+ let targetPage;
12548
+ if(pageChangeDirection === "next"){
12549
+ targetPage = currentPage + 1;
12550
+ }
12551
+ else{
12552
+ targetPage = currentPage - 1;
12553
+ }
12554
+ let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
12555
+ // let targetFormData = __changedItems[targetIndex];
12556
+ doAction({
12557
+ "actionType": "setValue",
12558
+ "componentId": __paginationServiceId,
12559
+ "args": {
12560
+ "value": {
12561
+ "__page": targetPage,
12562
+ "index": targetIndex
12563
+ }
12564
+ }
12565
+ });
12566
+ // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
12567
+ // doAction({
12568
+ // "actionType": "setValue",
12569
+ // "componentId": __formId,
12570
+ // "args": {
12571
+ // "value": targetFormData
12572
+ // },
12573
+ // "dataMergeMode": "override"// amis 3.2不支持override模式,高版本才支持
12574
+ // });
12575
+ `;
12576
+ return {
12577
+ "type": "wrapper",
12578
+ "className": "py-2",
12579
+ "body": [
12580
+ {
12581
+ "type": "button",
12582
+ "label": "",
12583
+ "icon": `fa fa-angle-left`,
12584
+ "level": "link",
12585
+ "pageChangeDirection": "prev",
12586
+ "disabledOn": "${__page <= 1}",
12587
+ "size": "sm",
12588
+ "onEvent": {
12589
+ "click": {
12590
+ "actions": [
12591
+ {
12592
+ "actionType": "custom",
12593
+ "script": onPageChangeScript
12594
+ }
12595
+ ]
12596
+ }
12597
+ }
12598
+ },
12599
+ {
12600
+ "type": "tpl",
12601
+ "tpl": "${__page}/${__total}"
12602
+ },
12603
+ {
12604
+ "type": "button",
12605
+ "label": "",
12606
+ "icon": `fa fa-angle-right`,
12607
+ "level": "link",
12608
+ "pageChangeDirection": "next",
12609
+ "disabledOn": "${__page >= __total}",
12610
+ "size": "sm",
12611
+ "onEvent": {
12612
+ "click": {
12613
+ "actions": [
12614
+ {
12615
+ "actionType": "custom",
12616
+ "script": onPageChangeScript
12617
+ }
12618
+ ]
12619
+ }
12620
+ }
12621
+ }
12622
+ ]
12623
+ }
12624
+ }
12625
+
12626
+ /**
12627
+ * 传入formSchema输出带翻页容器的wrapper
12628
+ * @param {*} props input-table组件props
12629
+ * @param {*} form formSchema
12630
+ * @param {*} mode edit/readonly
12631
+ * @returns 带翻页容器的wrapper
12632
+ */
12633
+ function getFormPaginationWrapper(props, form, mode) {
12634
+ let serviceId = `service_popup_pagination_wrapper__${props.id}`;
12635
+ // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12636
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12637
+ // 只读的时候不可以走中间变量__changedItems,比如工作流规则详细页面修改了子表字段”时间触发器“值后,在只读界面点击查看按钮弹出的表单中__changedItems值是修改前的值
12638
+ let formValues = mode === "readonly" ? `\${${props.name}[__super.index]}` : "${__changedItems[__super.index]}";
12639
+ // 这时用__readonlyItemsLength是因为`\${${props.name}.length}`拿不到值
12640
+ let totalValue = mode === "readonly" ? "${__readonlyItemsLength}" : "${__changedItems.length}";
12641
+ let innerForm = Object.assign({}, form, {
12642
+ "data": {
12643
+ // "&": "${__changedItems[__super.index]}"
12644
+ "&": formValues,
12645
+ }
12646
+ });
12647
+ let formBody = [
12648
+ {
12649
+ "type": "wrapper",
12650
+ "size": "none",
12651
+ "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",
12652
+ "body": [
12653
+ getFormPagination(props)
12654
+ ]
12655
+ },
12656
+ {
12657
+ "type": "service",
12658
+ "body": [
12659
+ innerForm
12660
+ ],
12661
+ "data": {
12662
+ "&": "${__parentForm}"
12663
+ }
12664
+ }
12665
+ ];
12666
+ let onServiceInitedScript = `
12667
+ // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
12668
+ // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12669
+ // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12670
+ // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
12671
+ let inlineEditMode = ${props.inlineEditMode};
12672
+ if(!inlineEditMode){
12673
+ return;
12674
+ }
12675
+ let scope = event.context.scoped;
12676
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12677
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12678
+ let wrapperServiceData = wrapperService.getData();
12679
+ let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12680
+ //不可以直接像event.data.__changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
12681
+ event.data.__changedItems.forEach(function(n,i){
12682
+ event.data.__changedItems[i] = lastestFieldValue[i];
12683
+ });
12684
+ `;
12685
+ let schema = {
12686
+ "type": "service",
12687
+ "id": serviceId,
12688
+ "schemaApi": {
12689
+ "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
12690
+ // "url": "${context.rootUrl}/graphql",
12691
+ "method": "post",
12692
+ "headers": {
12693
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
12694
+ },
12695
+ "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
12696
+ "adaptor": `
12697
+ const formBody = ${JSON.stringify(formBody)};
12698
+ return {
12699
+ "body": formBody
12700
+ }
12701
+ `
12702
+ },
12703
+ // "body": formBody,
12704
+ "data": {
12705
+ "__page": "${index + 1}",
12706
+ // "__total": `\${${props.name}.length}`,
12707
+ "__total": totalValue,
12708
+ "__paginationServiceId": serviceId,
12709
+ "__formId": form.id
12710
+ },
12711
+ "onEvent": {
12712
+ "init": {
12713
+ "actions": [
12714
+ {
12715
+ "actionType": "custom",
12716
+ "script": onServiceInitedScript
12717
+ }
12718
+ ]
12719
+ }
12720
+ }
12721
+ };
12722
+ return schema;
12723
+ }
12724
+
12477
12725
  /**
12478
12726
  * @param {*} props
12479
12727
  * @param {*} mode edit/new/readonly
@@ -12481,29 +12729,62 @@ async function getInputTableColumns(props) {
12481
12729
  async function getForm(props, mode = "edit") {
12482
12730
  let formFields = getFormFields(props, mode);
12483
12731
  let body = await getFormBody(null, formFields);
12732
+ let forId = `form_popup__${props.id}`;
12484
12733
  let schema = {
12485
12734
  "type": "form",
12735
+ "id": forId,
12486
12736
  "title": "表单",
12487
12737
  "debug": false,
12488
12738
  "mode": "normal",
12489
12739
  "body": body,
12740
+ "wrapWithPanel": false,
12741
+ "canAccessSuperData": false,
12490
12742
  "className": "steedos-object-form steedos-amis-form"
12491
12743
  };
12492
12744
  if (mode === "edit") {
12745
+ let onEditItemSubmitScript = `
12746
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12747
+ let fieldValue = event.data.__changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12748
+
12749
+ //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12750
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12751
+ fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
12752
+ doAction({
12753
+ "componentId": "${props.id}",
12754
+ "actionType": "setValue",
12755
+ "args": {
12756
+ "value": fieldValue
12757
+ }
12758
+ });
12759
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12760
+ // doAction({
12761
+ // "componentId": event.data.__wrapperServiceId,
12762
+ // "actionType": "setValue",
12763
+ // "args": {
12764
+ // "value": {
12765
+ // "__changedItems": fieldValue
12766
+ // }
12767
+ // }
12768
+ // });
12769
+ `;
12493
12770
  Object.assign(schema, {
12494
12771
  "onEvent": {
12495
12772
  "submit": {
12496
12773
  "weight": 0,
12497
12774
  "actions": [
12775
+ // {
12776
+ // "actionType": "setValue",
12777
+ // "args": {
12778
+ // "index": "${index}",
12779
+ // "value": {
12780
+ // "&": "$$"
12781
+ // }
12782
+ // },
12783
+ // "componentId": props.id
12784
+ // }
12498
12785
  {
12499
- "actionType": "setValue",
12500
- "args": {
12501
- "index": "${index}",
12502
- "value": {
12503
- "&": "$$"
12504
- }
12505
- },
12506
- "componentId": props.id
12786
+ "actionType": "custom",
12787
+ "script": onEditItemSubmitScript
12507
12788
  }
12508
12789
  ]
12509
12790
  }
@@ -12512,10 +12793,11 @@ async function getForm(props, mode = "edit") {
12512
12793
  }
12513
12794
  else if (mode === "new") {
12514
12795
  let onNewItemSubmitScript = `
12515
- let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12516
- if(!fieldValue){
12517
- fieldValue = [];
12796
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12797
+ if(!event.data.__changedItems){
12798
+ event.data.__changedItems = [];
12518
12799
  }
12800
+ let fieldValue = event.data.__changedItems;
12519
12801
  fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12520
12802
  doAction({
12521
12803
  "componentId": "${props.id}",
@@ -12524,6 +12806,16 @@ async function getForm(props, mode = "edit") {
12524
12806
  "value": fieldValue
12525
12807
  }
12526
12808
  });
12809
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12810
+ // doAction({
12811
+ // "componentId": event.data.__wrapperServiceId,
12812
+ // "actionType": "setValue",
12813
+ // "args": {
12814
+ // "value": {
12815
+ // "__changedItems": fieldValue
12816
+ // }
12817
+ // }
12818
+ // });
12527
12819
  `;
12528
12820
  Object.assign(schema, {
12529
12821
  "onEvent": {
@@ -12549,6 +12841,9 @@ async function getForm(props, mode = "edit") {
12549
12841
  }
12550
12842
  });
12551
12843
  }
12844
+ if (mode === "edit" || mode === "readonly") {
12845
+ schema = getFormPaginationWrapper(props, schema, mode);
12846
+ }
12552
12847
  return schema;
12553
12848
  }
12554
12849
 
@@ -12583,11 +12878,32 @@ async function getButtonNew(props) {
12583
12878
  };
12584
12879
  }
12585
12880
 
12586
- async function getButtonEdit(props) {
12881
+ async function getButtonEdit(props, showAsInlineEditMode) {
12882
+ let onCancelScript = `
12883
+ let scope = event.context.scoped;
12884
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12885
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12886
+ let wrapperServiceData = wrapperService.getData();
12887
+ let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12888
+ //不可以直接像event.data.__changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
12889
+ event.data.__changedItems.forEach(function(n,i){
12890
+ event.data.__changedItems[i] = originalFieldValue[i];
12891
+ });
12892
+ // 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
12893
+ // doAction({
12894
+ // "componentId": __wrapperServiceId,
12895
+ // "actionType": "setValue",
12896
+ // "args": {
12897
+ // "value": {
12898
+ // "__changedItems": originalFieldValue
12899
+ // }
12900
+ // }
12901
+ // });
12902
+ `;
12587
12903
  return {
12588
12904
  "type": "button",
12589
12905
  "label": "",
12590
- "icon": "fa fa-pencil",
12906
+ "icon": `fa fa-${showAsInlineEditMode ? "expand" : "pencil"}`,//inline edit模式时显示为放开按钮,只读时显示为笔按钮
12591
12907
  "level": "link",
12592
12908
  "onEvent": {
12593
12909
  "click": {
@@ -12605,7 +12921,31 @@ async function getButtonEdit(props) {
12605
12921
  "showErrorMsg": true,
12606
12922
  "showLoading": true,
12607
12923
  "className": "app-popover",
12608
- "closeOnEsc": false
12924
+ "closeOnEsc": false,
12925
+ "data": {
12926
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12927
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12928
+ // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
12929
+ // "&": "${record || {}}",
12930
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
12931
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12932
+ "__parentForm": "${__super.__super || {}}",
12933
+ "global": "${global}",
12934
+ "uiSchema": "${uiSchema}",
12935
+ "index": "${index}",
12936
+ "__changedItems": "${__changedItems}",
12937
+ "__wrapperServiceId": "${__wrapperServiceId}"
12938
+ },
12939
+ "onEvent": {
12940
+ "cancel": {
12941
+ "actions": [
12942
+ {
12943
+ "actionType": "custom",
12944
+ "script": onCancelScript
12945
+ }
12946
+ ]
12947
+ }
12948
+ }
12609
12949
  }
12610
12950
  }
12611
12951
  ]
@@ -12618,7 +12958,7 @@ async function getButtonView(props) {
12618
12958
  return {
12619
12959
  "type": "button",
12620
12960
  "label": "",
12621
- "icon": "fa fa-external-link",
12961
+ "icon": "fa fa-expand",//fa-external-link
12622
12962
  "level": "link",
12623
12963
  "onEvent": {
12624
12964
  "click": {
@@ -12636,7 +12976,21 @@ async function getButtonView(props) {
12636
12976
  "showErrorMsg": true,
12637
12977
  "showLoading": true,
12638
12978
  "className": "app-popover",
12639
- "closeOnEsc": false
12979
+ "closeOnEsc": false,
12980
+ "actions": [],
12981
+ "data": {
12982
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12983
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12984
+ // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
12985
+ // "&": "${formData || {}}",
12986
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有formData变量
12987
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12988
+ "__parentForm": "${__super.__super || {}}",
12989
+ "index": "${index}",
12990
+ "__changedItems": "${__changedItems}",
12991
+ "__wrapperServiceId": "${__wrapperServiceId}",
12992
+ "__readonlyItemsLength": `\${${props.name}.length}`
12993
+ }
12640
12994
  }
12641
12995
  }
12642
12996
  ]
@@ -12646,6 +13000,32 @@ async function getButtonView(props) {
12646
13000
  }
12647
13001
 
12648
13002
  function getButtonDelete(props) {
13003
+ let onDeleteItemScript = `
13004
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
13005
+ if(!event.data.__changedItems){
13006
+ event.data.__changedItems = [];
13007
+ }
13008
+ let fieldValue = event.data.__changedItems;
13009
+ // fieldValue.push(JSON.parse(JSON.stringify(event.data)));
13010
+ fieldValue.splice(event.data.index, 1)
13011
+ doAction({
13012
+ "componentId": "${props.id}",
13013
+ "actionType": "setValue",
13014
+ "args": {
13015
+ "value": fieldValue
13016
+ }
13017
+ });
13018
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
13019
+ // doAction({
13020
+ // "componentId": event.data.__wrapperServiceId,
13021
+ // "actionType": "setValue",
13022
+ // "args": {
13023
+ // "value": {
13024
+ // "__changedItems": fieldValue
13025
+ // }
13026
+ // }
13027
+ // });
13028
+ `;
12649
13029
  return {
12650
13030
  "type": "button",
12651
13031
  "label": "",
@@ -12654,12 +13034,16 @@ function getButtonDelete(props) {
12654
13034
  "onEvent": {
12655
13035
  "click": {
12656
13036
  "actions": [
13037
+ // {
13038
+ // "actionType": "deleteItem",
13039
+ // "args": {
13040
+ // "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
13041
+ // },
13042
+ // "componentId": props.id
13043
+ // },
12657
13044
  {
12658
- "actionType": "deleteItem",
12659
- "args": {
12660
- "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12661
- },
12662
- "componentId": props.id
13045
+ "actionType": "custom",
13046
+ "script": onDeleteItemScript
12663
13047
  }
12664
13048
  ]
12665
13049
  }
@@ -12667,18 +13051,34 @@ function getButtonDelete(props) {
12667
13051
  };
12668
13052
  }
12669
13053
 
12670
- const getAmisInputTableSchema = async (props, readonly) => {
13054
+ const getAmisInputTableSchema = async (props) => {
12671
13055
  if (!props.id) {
12672
13056
  props.id = "steedos_input_table_" + props.name + "_" + Math.random().toString(36).substr(2, 9);
12673
13057
  }
13058
+ let serviceId = `service_wrapper__${props.id}`;
12674
13059
  let buttonsForColumnOperations = [];
13060
+ let inlineEditMode = props.inlineEditMode;
13061
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12675
13062
  if (props.editable) {
12676
- let buttonEditSchema = await getButtonEdit(props);
12677
- buttonsForColumnOperations.push(buttonEditSchema);
13063
+ let showEditButton = true;
13064
+ if (showAsInlineEditMode) {
13065
+ // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
13066
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
13067
+ showEditButton = true;
13068
+ }
13069
+ else {
13070
+ showEditButton = false;
13071
+ }
13072
+ }
13073
+ // 编辑时显示编辑按钮
13074
+ if (showEditButton) {
13075
+ let buttonEditSchema = await getButtonEdit(props, showAsInlineEditMode);
13076
+ buttonsForColumnOperations.push(buttonEditSchema);
13077
+ }
12678
13078
  }
12679
13079
  else {
12680
13080
  // 只读时显示查看按钮
12681
- if(props.columns && props.columns.length > 0 && props.columns.length < props.fields.length){
13081
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
12682
13082
  // 只在有列被隐藏时才需要显示查看按钮
12683
13083
  let buttonViewSchema = await getButtonView(props);
12684
13084
  buttonsForColumnOperations.push(buttonViewSchema);
@@ -12702,7 +13102,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12702
13102
  "id": props.id,
12703
13103
  "columns": await getInputTableColumns(props),
12704
13104
  // "needConfirm": false, //不可以配置为false,否则,单元格都是可编辑状态,且很多static类型无法正常显示,比如static-mapping
12705
- "strictMode": true,
13105
+ "strictMode": props.strictMode,
12706
13106
  "showTableAddBtn": false,
12707
13107
  "showFooterAddBtn": false,
12708
13108
  "className": props.tableClassName
@@ -12715,13 +13115,60 @@ const getAmisInputTableSchema = async (props, readonly) => {
12715
13115
  "width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
12716
13116
  });
12717
13117
  }
13118
+ if (showAsInlineEditMode) {
13119
+ inputTableSchema.needConfirm = false;
13120
+ }
13121
+ let dataProviderInited = `
13122
+ // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
13123
+ setData({ __changedItems: _.cloneDeep(data["${props.name}"]) || []});
13124
+ `;
13125
+ let onInitScript = `
13126
+ // 上面dataProviderInited中setData有时不生效,没有成功给service组件设置__changedItems变量值
13127
+ // 比如设计字段布局界面中的设置分组功能就因为__changedItems变量值不存在而报错,应该是因为把steedos-input-table组件单独放到弹出窗口中会有这个问题
13128
+ // 所以额外在service init事件中手动设置一次__changedItems值
13129
+ let __wrapperServiceId = event.data.__wrapperServiceId;
13130
+ let fieldValue = _.cloneDeep(event.data["${props.name}"]) || [];
13131
+ doAction({
13132
+ "componentId": __wrapperServiceId,
13133
+ "actionType": "setValue",
13134
+ "args": {
13135
+ "value": {
13136
+ "__changedItems": fieldValue
13137
+ }
13138
+ }
13139
+ });
13140
+ // 下面的doAction好像不是必须的
13141
+ // doAction({
13142
+ // "componentId": "${props.id}",
13143
+ // "actionType": "setValue",
13144
+ // "args": {
13145
+ // "value": fieldValue
13146
+ // }
13147
+ // });
13148
+ `;
12718
13149
  let schema = {
12719
- "type": "wrapper",
12720
- "size": "none",
13150
+ "type": "service",
12721
13151
  "body": [
12722
13152
  inputTableSchema
12723
13153
  ],
12724
- "className": props.className
13154
+ "className": props.className,
13155
+ "id": serviceId,
13156
+ "data": {
13157
+ "__wrapperServiceId": serviceId
13158
+ },
13159
+ "dataProvider": {
13160
+ "inited": dataProviderInited
13161
+ },
13162
+ "onEvent": {
13163
+ "init": {
13164
+ "actions": [
13165
+ {
13166
+ "actionType": "custom",
13167
+ "script": onInitScript
13168
+ }
13169
+ ]
13170
+ }
13171
+ }
12725
13172
  };
12726
13173
  let footerToolbar = _$1.clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
12727
13174
  if (props.addable) {
@@ -12735,10 +13182,22 @@ const getAmisInputTableSchema = async (props, readonly) => {
12735
13182
  "body": footerToolbar
12736
13183
  });
12737
13184
  }
12738
- if (props.amis) {
12739
- delete props.amis.id;
12740
- Object.assign(schema.body[0], props.amis);
13185
+ let amis = props["input-table"] || props.amis;//额外支持"input-table"代替amis属性,是因为在字段yml文件中用amis作为key不好理解
13186
+ if (amis) {
13187
+ // 支持配置amis属性重写或添加最终生成的input-table中任何属性。
13188
+ delete amis.id;//如果steedos-input-table组件配置了amis.id属性,会造成新建编辑行功能不生效
13189
+ Object.assign(schema.body[0], amis);
13190
+ }
13191
+ const isAnyFieldHasDependOn = (props.fields || []).find(function (item) {
13192
+ return item.depend_on;
13193
+ });
13194
+ if(isAnyFieldHasDependOn){
13195
+ // 有任意一个子字段有depend_on属性时,强制设置禁用静态模式
13196
+ Object.assign(schema.body[0], {
13197
+ strictMode: false
13198
+ });
12741
13199
  }
13200
+ // console.log("===schema===", schema);
12742
13201
  return schema;
12743
13202
  };
12744
13203