@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.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,
@@ -2007,6 +2012,9 @@ async function getTableColumns(fields, options){
2007
2012
  const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
2008
2013
 
2009
2014
  for (const field of fields) {
2015
+ if(field.hidden || field.extra){
2016
+ continue;
2017
+ }
2010
2018
  //增加quickEdit属性,实现快速编辑
2011
2019
  const quickEditSchema = allowEdit ? await getQuickEditSchema(field, options) : allowEdit;
2012
2020
  let className = "";
@@ -2132,6 +2140,11 @@ async function getTableColumns(fields, options){
2132
2140
  options: field.type === 'html' ? {html: true} : null
2133
2141
  // toggled: true
2134
2142
  }, field.amis, {name: field.name});
2143
+
2144
+ if(field.type === 'color'){
2145
+ columnItem.type = 'color';
2146
+ columnItem.defaultColor = null;
2147
+ }
2135
2148
  }
2136
2149
  }
2137
2150
  if(columnItem){
@@ -4819,8 +4832,8 @@ const getSchema$2 = (uiSchema) => {
4819
4832
  /*
4820
4833
  * @Author: baozhoutao@steedos.com
4821
4834
  * @Date: 2022-11-07 17:00:38
4822
- * @LastEditors: baozhoutao@steedos.com
4823
- * @LastEditTime: 2023-08-24 16:44:42
4835
+ * @LastEditors: liaodaxue
4836
+ * @LastEditTime: 2023-12-13 10:09:05
4824
4837
  * @Description:
4825
4838
  */
4826
4839
 
@@ -4831,7 +4844,7 @@ const getSchema$1 = (uiSchema)=>{
4831
4844
  "body": [
4832
4845
  {
4833
4846
  "type": "button",
4834
- "label": i18next.t('frontend_form_view'),
4847
+ "label": i18next.t('frontend_form_details'),
4835
4848
  "className": "border-none",
4836
4849
  "onEvent": {
4837
4850
  "click": {
@@ -11512,6 +11525,16 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
11512
11525
  }
11513
11526
  }
11514
11527
 
11528
+ break;
11529
+ case 'color':
11530
+ convertData = {
11531
+ type: getAmisStaticFieldType('color', readonly),
11532
+ name: field.name,
11533
+ label: field.label
11534
+ };
11535
+ if(readonly){
11536
+ convertData.defaultColor = null;
11537
+ }
11515
11538
  break;
11516
11539
  case 'boolean':
11517
11540
  convertData = {
@@ -12366,7 +12389,7 @@ async function getFormBody(permissionFields, formFields, ctx){
12366
12389
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12367
12390
  * @Date: 2023-11-15 09:50:22
12368
12391
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12369
- * @LastEditTime: 2023-12-04 17:36:50
12392
+ * @LastEditTime: 2023-12-16 16:39:49
12370
12393
  */
12371
12394
 
12372
12395
  /**
@@ -12380,52 +12403,71 @@ function getFormFields(props, mode = "edit") {
12380
12403
  "name": item.name,
12381
12404
  "config": item
12382
12405
  };
12383
- if(mode === "readonly"){
12406
+ if (mode === "readonly") {
12384
12407
  formItem.static = true;
12385
12408
  }
12386
12409
  return formItem;
12387
12410
  }) || [];
12388
12411
  }
12389
12412
 
12413
+ function getInputTableCell(field, showAsInlineEditMode) {
12414
+ if (showAsInlineEditMode) {
12415
+ return {
12416
+ label: field.label,
12417
+ name: field.name,
12418
+ quickEdit: {
12419
+ "type": "steedos-field",
12420
+ "config": field,
12421
+ hideLabel: true
12422
+ }
12423
+ }
12424
+ }
12425
+ else {
12426
+ return {
12427
+ "type": "steedos-field",
12428
+ "config": field,
12429
+ "static": true,
12430
+ "readonly": true,
12431
+ label: field.label,
12432
+ name: field.name,
12433
+ hideLabel: true
12434
+ }
12435
+ }
12436
+ }
12437
+
12390
12438
  /**
12391
12439
  * @param {*} props
12392
12440
  * @param {*} mode edit/new/readonly
12393
12441
  */
12394
12442
  async function getInputTableColumns(props) {
12395
12443
  let columns = props.columns || [];
12444
+ let inlineEditMode = props.inlineEditMode;
12445
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12396
12446
  // 实测过,直接不生成对应的隐藏column并不会对input-table值造成丢失问题,隐藏的列字段值能正常维护
12397
12447
  let fields = props.fields;
12398
- if(columns && columns.length){
12399
- return columns.map(function(column){
12448
+ if (columns && columns.length) {
12449
+ return columns.map(function (column) {
12400
12450
  let field, extendColumnProps = {};
12401
- if(typeof column === "string"){
12451
+ if (typeof column === "string") {
12402
12452
  // 如果字符串,则取出要显示的列配置
12403
- field = fields.find(function(fieldItem){
12453
+ field = fields.find(function (fieldItem) {
12404
12454
  return fieldItem.name === column;
12405
12455
  });
12406
12456
  }
12407
12457
  else {
12408
12458
  // 如果是对象,则合并到steedos-field的config.amis属性中,steedos组件会把config.amis属性混合到最终生成的input-table column
12409
- field = fields.find(function(fieldItem){
12459
+ field = fields.find(function (fieldItem) {
12410
12460
  return fieldItem.name === column.name;
12411
12461
  });
12412
- if(field){
12462
+ if (field) {
12413
12463
  // field.amis = Object.assign({}, field.amis, column);
12414
12464
  // 如果把column合并到field.amis,column的label/width等属性不会生效,只能放外层合并
12415
12465
  extendColumnProps = column;
12416
12466
  }
12417
12467
  }
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
- }
12468
+ if (field) {
12469
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12470
+ return Object.assign({}, tableCell, extendColumnProps);
12429
12471
  }
12430
12472
  else {
12431
12473
  return column;
@@ -12433,20 +12475,226 @@ async function getInputTableColumns(props) {
12433
12475
  });
12434
12476
  }
12435
12477
  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
- }
12478
+ return fields.map(function (field) {
12479
+ let tableCell = getInputTableCell(field, showAsInlineEditMode);
12480
+ return tableCell;
12446
12481
  }) || [];
12447
12482
  }
12448
12483
  }
12449
12484
 
12485
+ function getFormPagination(props) {
12486
+ let onPageChangeScript = `
12487
+ let scope = event.context.scoped;
12488
+ let __paginationServiceId = event.data.__paginationServiceId;
12489
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12490
+ let __formId = event.data.__formId;
12491
+ let fieldValue = event.data.__changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12492
+ let pageChangeDirection = context.props.pageChangeDirection;
12493
+ let currentPage = event.data.__page;
12494
+ let currentIndex = event.data.index;
12495
+
12496
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems中
12497
+ let currentFormValues = scope.getComponentById(__formId).getValues();
12498
+ fieldValue[currentIndex] = currentFormValues;
12499
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12500
+ // doAction({
12501
+ // "componentId": __wrapperServiceId,
12502
+ // "actionType": "setValue",
12503
+ // "args": {
12504
+ // "value": {
12505
+ // "__changedItems": fieldValue
12506
+ // }
12507
+ // }
12508
+ // });
12509
+ // 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
12510
+ // 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
12511
+ // doAction({
12512
+ // "componentId": "${props.id}",
12513
+ // "actionType": "setValue",
12514
+ // "args": {
12515
+ // "value": fieldValue
12516
+ // }
12517
+ // });
12518
+
12519
+ // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
12520
+ let targetPage;
12521
+ if(pageChangeDirection === "next"){
12522
+ targetPage = currentPage + 1;
12523
+ }
12524
+ else{
12525
+ targetPage = currentPage - 1;
12526
+ }
12527
+ let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
12528
+ // let targetFormData = __changedItems[targetIndex];
12529
+ doAction({
12530
+ "actionType": "setValue",
12531
+ "componentId": __paginationServiceId,
12532
+ "args": {
12533
+ "value": {
12534
+ "__page": targetPage,
12535
+ "index": targetIndex
12536
+ }
12537
+ }
12538
+ });
12539
+ // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
12540
+ // doAction({
12541
+ // "actionType": "setValue",
12542
+ // "componentId": __formId,
12543
+ // "args": {
12544
+ // "value": targetFormData
12545
+ // },
12546
+ // "dataMergeMode": "override"// amis 3.2不支持override模式,高版本才支持
12547
+ // });
12548
+ `;
12549
+ return {
12550
+ "type": "wrapper",
12551
+ "className": "py-2",
12552
+ "body": [
12553
+ {
12554
+ "type": "button",
12555
+ "label": "",
12556
+ "icon": `fa fa-angle-left`,
12557
+ "level": "link",
12558
+ "pageChangeDirection": "prev",
12559
+ "disabledOn": "${__page <= 1}",
12560
+ "size": "sm",
12561
+ "onEvent": {
12562
+ "click": {
12563
+ "actions": [
12564
+ {
12565
+ "actionType": "custom",
12566
+ "script": onPageChangeScript
12567
+ }
12568
+ ]
12569
+ }
12570
+ }
12571
+ },
12572
+ {
12573
+ "type": "tpl",
12574
+ "tpl": "${__page}/${__total}"
12575
+ },
12576
+ {
12577
+ "type": "button",
12578
+ "label": "",
12579
+ "icon": `fa fa-angle-right`,
12580
+ "level": "link",
12581
+ "pageChangeDirection": "next",
12582
+ "disabledOn": "${__page >= __total}",
12583
+ "size": "sm",
12584
+ "onEvent": {
12585
+ "click": {
12586
+ "actions": [
12587
+ {
12588
+ "actionType": "custom",
12589
+ "script": onPageChangeScript
12590
+ }
12591
+ ]
12592
+ }
12593
+ }
12594
+ }
12595
+ ]
12596
+ }
12597
+ }
12598
+
12599
+ /**
12600
+ * 传入formSchema输出带翻页容器的wrapper
12601
+ * @param {*} props input-table组件props
12602
+ * @param {*} form formSchema
12603
+ * @param {*} mode edit/readonly
12604
+ * @returns 带翻页容器的wrapper
12605
+ */
12606
+ function getFormPaginationWrapper(props, form, mode) {
12607
+ let serviceId = `service_popup_pagination_wrapper__${props.id}`;
12608
+ // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12609
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12610
+ // 只读的时候不可以走中间变量__changedItems,比如工作流规则详细页面修改了子表字段”时间触发器“值后,在只读界面点击查看按钮弹出的表单中__changedItems值是修改前的值
12611
+ let formValues = mode === "readonly" ? `\${${props.name}[__super.index]}` : "${__changedItems[__super.index]}";
12612
+ // 这时用__readonlyItemsLength是因为`\${${props.name}.length}`拿不到值
12613
+ let totalValue = mode === "readonly" ? "${__readonlyItemsLength}" : "${__changedItems.length}";
12614
+ let innerForm = Object.assign({}, form, {
12615
+ "data": {
12616
+ // "&": "${__changedItems[__super.index]}"
12617
+ "&": formValues,
12618
+ }
12619
+ });
12620
+ let formBody = [
12621
+ {
12622
+ "type": "wrapper",
12623
+ "size": "none",
12624
+ "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",
12625
+ "body": [
12626
+ getFormPagination(props)
12627
+ ]
12628
+ },
12629
+ {
12630
+ "type": "service",
12631
+ "body": [
12632
+ innerForm
12633
+ ],
12634
+ "data": {
12635
+ "&": "${__parentForm}"
12636
+ }
12637
+ }
12638
+ ];
12639
+ let onServiceInitedScript = `
12640
+ // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
12641
+ // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12642
+ // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
12643
+ // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
12644
+ let inlineEditMode = ${props.inlineEditMode};
12645
+ if(!inlineEditMode){
12646
+ return;
12647
+ }
12648
+ let scope = event.context.scoped;
12649
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12650
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12651
+ let wrapperServiceData = wrapperService.getData();
12652
+ let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12653
+ //不可以直接像event.data.__changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
12654
+ event.data.__changedItems.forEach(function(n,i){
12655
+ event.data.__changedItems[i] = lastestFieldValue[i];
12656
+ });
12657
+ `;
12658
+ let schema = {
12659
+ "type": "service",
12660
+ "id": serviceId,
12661
+ "schemaApi": {
12662
+ "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
12663
+ // "url": "${context.rootUrl}/graphql",
12664
+ "method": "post",
12665
+ "headers": {
12666
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
12667
+ },
12668
+ "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
12669
+ "adaptor": `
12670
+ const formBody = ${JSON.stringify(formBody)};
12671
+ return {
12672
+ "body": formBody
12673
+ }
12674
+ `
12675
+ },
12676
+ // "body": formBody,
12677
+ "data": {
12678
+ "__page": "${index + 1}",
12679
+ // "__total": `\${${props.name}.length}`,
12680
+ "__total": totalValue,
12681
+ "__paginationServiceId": serviceId,
12682
+ "__formId": form.id
12683
+ },
12684
+ "onEvent": {
12685
+ "init": {
12686
+ "actions": [
12687
+ {
12688
+ "actionType": "custom",
12689
+ "script": onServiceInitedScript
12690
+ }
12691
+ ]
12692
+ }
12693
+ }
12694
+ };
12695
+ return schema;
12696
+ }
12697
+
12450
12698
  /**
12451
12699
  * @param {*} props
12452
12700
  * @param {*} mode edit/new/readonly
@@ -12454,29 +12702,62 @@ async function getInputTableColumns(props) {
12454
12702
  async function getForm(props, mode = "edit") {
12455
12703
  let formFields = getFormFields(props, mode);
12456
12704
  let body = await getFormBody(null, formFields);
12705
+ let forId = `form_popup__${props.id}`;
12457
12706
  let schema = {
12458
12707
  "type": "form",
12708
+ "id": forId,
12459
12709
  "title": "表单",
12460
12710
  "debug": false,
12461
12711
  "mode": "normal",
12462
12712
  "body": body,
12713
+ "wrapWithPanel": false,
12714
+ "canAccessSuperData": false,
12463
12715
  "className": "steedos-object-form steedos-amis-form"
12464
12716
  };
12465
12717
  if (mode === "edit") {
12718
+ let onEditItemSubmitScript = `
12719
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12720
+ let fieldValue = event.data.__changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
12721
+
12722
+ //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12723
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12724
+ fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
12725
+ doAction({
12726
+ "componentId": "${props.id}",
12727
+ "actionType": "setValue",
12728
+ "args": {
12729
+ "value": fieldValue
12730
+ }
12731
+ });
12732
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12733
+ // doAction({
12734
+ // "componentId": event.data.__wrapperServiceId,
12735
+ // "actionType": "setValue",
12736
+ // "args": {
12737
+ // "value": {
12738
+ // "__changedItems": fieldValue
12739
+ // }
12740
+ // }
12741
+ // });
12742
+ `;
12466
12743
  Object.assign(schema, {
12467
12744
  "onEvent": {
12468
12745
  "submit": {
12469
12746
  "weight": 0,
12470
12747
  "actions": [
12748
+ // {
12749
+ // "actionType": "setValue",
12750
+ // "args": {
12751
+ // "index": "${index}",
12752
+ // "value": {
12753
+ // "&": "$$"
12754
+ // }
12755
+ // },
12756
+ // "componentId": props.id
12757
+ // }
12471
12758
  {
12472
- "actionType": "setValue",
12473
- "args": {
12474
- "index": "${index}",
12475
- "value": {
12476
- "&": "$$"
12477
- }
12478
- },
12479
- "componentId": props.id
12759
+ "actionType": "custom",
12760
+ "script": onEditItemSubmitScript
12480
12761
  }
12481
12762
  ]
12482
12763
  }
@@ -12485,10 +12766,11 @@ async function getForm(props, mode = "edit") {
12485
12766
  }
12486
12767
  else if (mode === "new") {
12487
12768
  let onNewItemSubmitScript = `
12488
- let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12489
- if(!fieldValue){
12490
- fieldValue = [];
12769
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12770
+ if(!event.data.__changedItems){
12771
+ event.data.__changedItems = [];
12491
12772
  }
12773
+ let fieldValue = event.data.__changedItems;
12492
12774
  fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12493
12775
  doAction({
12494
12776
  "componentId": "${props.id}",
@@ -12497,6 +12779,16 @@ async function getForm(props, mode = "edit") {
12497
12779
  "value": fieldValue
12498
12780
  }
12499
12781
  });
12782
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12783
+ // doAction({
12784
+ // "componentId": event.data.__wrapperServiceId,
12785
+ // "actionType": "setValue",
12786
+ // "args": {
12787
+ // "value": {
12788
+ // "__changedItems": fieldValue
12789
+ // }
12790
+ // }
12791
+ // });
12500
12792
  `;
12501
12793
  Object.assign(schema, {
12502
12794
  "onEvent": {
@@ -12522,6 +12814,9 @@ async function getForm(props, mode = "edit") {
12522
12814
  }
12523
12815
  });
12524
12816
  }
12817
+ if (mode === "edit" || mode === "readonly") {
12818
+ schema = getFormPaginationWrapper(props, schema, mode);
12819
+ }
12525
12820
  return schema;
12526
12821
  }
12527
12822
 
@@ -12556,11 +12851,32 @@ async function getButtonNew(props) {
12556
12851
  };
12557
12852
  }
12558
12853
 
12559
- async function getButtonEdit(props) {
12854
+ async function getButtonEdit(props, showAsInlineEditMode) {
12855
+ let onCancelScript = `
12856
+ let scope = event.context.scoped;
12857
+ let __wrapperServiceId = event.data.__wrapperServiceId;
12858
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
12859
+ let wrapperServiceData = wrapperService.getData();
12860
+ let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
12861
+ //不可以直接像event.data.__changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
12862
+ event.data.__changedItems.forEach(function(n,i){
12863
+ event.data.__changedItems[i] = originalFieldValue[i];
12864
+ });
12865
+ // 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
12866
+ // doAction({
12867
+ // "componentId": __wrapperServiceId,
12868
+ // "actionType": "setValue",
12869
+ // "args": {
12870
+ // "value": {
12871
+ // "__changedItems": originalFieldValue
12872
+ // }
12873
+ // }
12874
+ // });
12875
+ `;
12560
12876
  return {
12561
12877
  "type": "button",
12562
12878
  "label": "",
12563
- "icon": "fa fa-pencil",
12879
+ "icon": `fa fa-${showAsInlineEditMode ? "expand" : "pencil"}`,//inline edit模式时显示为放开按钮,只读时显示为笔按钮
12564
12880
  "level": "link",
12565
12881
  "onEvent": {
12566
12882
  "click": {
@@ -12578,7 +12894,31 @@ async function getButtonEdit(props) {
12578
12894
  "showErrorMsg": true,
12579
12895
  "showLoading": true,
12580
12896
  "className": "app-popover",
12581
- "closeOnEsc": false
12897
+ "closeOnEsc": false,
12898
+ "data": {
12899
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12900
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12901
+ // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
12902
+ // "&": "${record || {}}",
12903
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
12904
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12905
+ "__parentForm": "${__super.__super || {}}",
12906
+ "global": "${global}",
12907
+ "uiSchema": "${uiSchema}",
12908
+ "index": "${index}",
12909
+ "__changedItems": "${__changedItems}",
12910
+ "__wrapperServiceId": "${__wrapperServiceId}"
12911
+ },
12912
+ "onEvent": {
12913
+ "cancel": {
12914
+ "actions": [
12915
+ {
12916
+ "actionType": "custom",
12917
+ "script": onCancelScript
12918
+ }
12919
+ ]
12920
+ }
12921
+ }
12582
12922
  }
12583
12923
  }
12584
12924
  ]
@@ -12591,7 +12931,7 @@ async function getButtonView(props) {
12591
12931
  return {
12592
12932
  "type": "button",
12593
12933
  "label": "",
12594
- "icon": "fa fa-external-link",
12934
+ "icon": "fa fa-expand",//fa-external-link
12595
12935
  "level": "link",
12596
12936
  "onEvent": {
12597
12937
  "click": {
@@ -12609,7 +12949,21 @@ async function getButtonView(props) {
12609
12949
  "showErrorMsg": true,
12610
12950
  "showLoading": true,
12611
12951
  "className": "app-popover",
12612
- "closeOnEsc": false
12952
+ "closeOnEsc": false,
12953
+ "actions": [],
12954
+ "data": {
12955
+ // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
12956
+ // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
12957
+ // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
12958
+ // "&": "${formData || {}}",
12959
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有formData变量
12960
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
12961
+ "__parentForm": "${__super.__super || {}}",
12962
+ "index": "${index}",
12963
+ "__changedItems": "${__changedItems}",
12964
+ "__wrapperServiceId": "${__wrapperServiceId}",
12965
+ "__readonlyItemsLength": `\${${props.name}.length}`
12966
+ }
12613
12967
  }
12614
12968
  }
12615
12969
  ]
@@ -12619,6 +12973,32 @@ async function getButtonView(props) {
12619
12973
  }
12620
12974
 
12621
12975
  function getButtonDelete(props) {
12976
+ let onDeleteItemScript = `
12977
+ // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
12978
+ if(!event.data.__changedItems){
12979
+ event.data.__changedItems = [];
12980
+ }
12981
+ let fieldValue = event.data.__changedItems;
12982
+ // fieldValue.push(JSON.parse(JSON.stringify(event.data)));
12983
+ fieldValue.splice(event.data.index, 1)
12984
+ doAction({
12985
+ "componentId": "${props.id}",
12986
+ "actionType": "setValue",
12987
+ "args": {
12988
+ "value": fieldValue
12989
+ }
12990
+ });
12991
+ // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
12992
+ // doAction({
12993
+ // "componentId": event.data.__wrapperServiceId,
12994
+ // "actionType": "setValue",
12995
+ // "args": {
12996
+ // "value": {
12997
+ // "__changedItems": fieldValue
12998
+ // }
12999
+ // }
13000
+ // });
13001
+ `;
12622
13002
  return {
12623
13003
  "type": "button",
12624
13004
  "label": "",
@@ -12627,12 +13007,16 @@ function getButtonDelete(props) {
12627
13007
  "onEvent": {
12628
13008
  "click": {
12629
13009
  "actions": [
13010
+ // {
13011
+ // "actionType": "deleteItem",
13012
+ // "args": {
13013
+ // "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
13014
+ // },
13015
+ // "componentId": props.id
13016
+ // },
12630
13017
  {
12631
- "actionType": "deleteItem",
12632
- "args": {
12633
- "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
12634
- },
12635
- "componentId": props.id
13018
+ "actionType": "custom",
13019
+ "script": onDeleteItemScript
12636
13020
  }
12637
13021
  ]
12638
13022
  }
@@ -12640,18 +13024,34 @@ function getButtonDelete(props) {
12640
13024
  };
12641
13025
  }
12642
13026
 
12643
- const getAmisInputTableSchema = async (props, readonly) => {
13027
+ const getAmisInputTableSchema = async (props) => {
12644
13028
  if (!props.id) {
12645
13029
  props.id = "steedos_input_table_" + props.name + "_" + Math.random().toString(36).substr(2, 9);
12646
13030
  }
13031
+ let serviceId = `service_wrapper__${props.id}`;
12647
13032
  let buttonsForColumnOperations = [];
13033
+ let inlineEditMode = props.inlineEditMode;
13034
+ let showAsInlineEditMode = inlineEditMode && props.editable;
12648
13035
  if (props.editable) {
12649
- let buttonEditSchema = await getButtonEdit(props);
12650
- buttonsForColumnOperations.push(buttonEditSchema);
13036
+ let showEditButton = true;
13037
+ if (showAsInlineEditMode) {
13038
+ // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
13039
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
13040
+ showEditButton = true;
13041
+ }
13042
+ else {
13043
+ showEditButton = false;
13044
+ }
13045
+ }
13046
+ // 编辑时显示编辑按钮
13047
+ if (showEditButton) {
13048
+ let buttonEditSchema = await getButtonEdit(props, showAsInlineEditMode);
13049
+ buttonsForColumnOperations.push(buttonEditSchema);
13050
+ }
12651
13051
  }
12652
13052
  else {
12653
13053
  // 只读时显示查看按钮
12654
- if(props.columns && props.columns.length > 0 && props.columns.length < props.fields.length){
13054
+ if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
12655
13055
  // 只在有列被隐藏时才需要显示查看按钮
12656
13056
  let buttonViewSchema = await getButtonView(props);
12657
13057
  buttonsForColumnOperations.push(buttonViewSchema);
@@ -12675,7 +13075,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
12675
13075
  "id": props.id,
12676
13076
  "columns": await getInputTableColumns(props),
12677
13077
  // "needConfirm": false, //不可以配置为false,否则,单元格都是可编辑状态,且很多static类型无法正常显示,比如static-mapping
12678
- "strictMode": true,
13078
+ "strictMode": props.strictMode,
12679
13079
  "showTableAddBtn": false,
12680
13080
  "showFooterAddBtn": false,
12681
13081
  "className": props.tableClassName
@@ -12688,13 +13088,60 @@ const getAmisInputTableSchema = async (props, readonly) => {
12688
13088
  "width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
12689
13089
  });
12690
13090
  }
13091
+ if (showAsInlineEditMode) {
13092
+ inputTableSchema.needConfirm = false;
13093
+ }
13094
+ let dataProviderInited = `
13095
+ // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
13096
+ setData({ __changedItems: _.cloneDeep(data["${props.name}"]) || []});
13097
+ `;
13098
+ let onInitScript = `
13099
+ // 上面dataProviderInited中setData有时不生效,没有成功给service组件设置__changedItems变量值
13100
+ // 比如设计字段布局界面中的设置分组功能就因为__changedItems变量值不存在而报错,应该是因为把steedos-input-table组件单独放到弹出窗口中会有这个问题
13101
+ // 所以额外在service init事件中手动设置一次__changedItems值
13102
+ let __wrapperServiceId = event.data.__wrapperServiceId;
13103
+ let fieldValue = _.cloneDeep(event.data["${props.name}"]) || [];
13104
+ doAction({
13105
+ "componentId": __wrapperServiceId,
13106
+ "actionType": "setValue",
13107
+ "args": {
13108
+ "value": {
13109
+ "__changedItems": fieldValue
13110
+ }
13111
+ }
13112
+ });
13113
+ // 下面的doAction好像不是必须的
13114
+ // doAction({
13115
+ // "componentId": "${props.id}",
13116
+ // "actionType": "setValue",
13117
+ // "args": {
13118
+ // "value": fieldValue
13119
+ // }
13120
+ // });
13121
+ `;
12691
13122
  let schema = {
12692
- "type": "wrapper",
12693
- "size": "none",
13123
+ "type": "service",
12694
13124
  "body": [
12695
13125
  inputTableSchema
12696
13126
  ],
12697
- "className": props.className
13127
+ "className": props.className,
13128
+ "id": serviceId,
13129
+ "data": {
13130
+ "__wrapperServiceId": serviceId
13131
+ },
13132
+ "dataProvider": {
13133
+ "inited": dataProviderInited
13134
+ },
13135
+ "onEvent": {
13136
+ "init": {
13137
+ "actions": [
13138
+ {
13139
+ "actionType": "custom",
13140
+ "script": onInitScript
13141
+ }
13142
+ ]
13143
+ }
13144
+ }
12698
13145
  };
12699
13146
  let footerToolbar = clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
12700
13147
  if (props.addable) {
@@ -12708,10 +13155,22 @@ const getAmisInputTableSchema = async (props, readonly) => {
12708
13155
  "body": footerToolbar
12709
13156
  });
12710
13157
  }
12711
- if (props.amis) {
12712
- delete props.amis.id;
12713
- Object.assign(schema.body[0], props.amis);
13158
+ let amis = props["input-table"] || props.amis;//额外支持"input-table"代替amis属性,是因为在字段yml文件中用amis作为key不好理解
13159
+ if (amis) {
13160
+ // 支持配置amis属性重写或添加最终生成的input-table中任何属性。
13161
+ delete amis.id;//如果steedos-input-table组件配置了amis.id属性,会造成新建编辑行功能不生效
13162
+ Object.assign(schema.body[0], amis);
13163
+ }
13164
+ const isAnyFieldHasDependOn = (props.fields || []).find(function (item) {
13165
+ return item.depend_on;
13166
+ });
13167
+ if(isAnyFieldHasDependOn){
13168
+ // 有任意一个子字段有depend_on属性时,强制设置禁用静态模式
13169
+ Object.assign(schema.body[0], {
13170
+ strictMode: false
13171
+ });
12714
13172
  }
13173
+ // console.log("===schema===", schema);
12715
13174
  return schema;
12716
13175
  };
12717
13176