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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4207,7 +4207,7 @@ var config = {
4207
4207
  * @Author: baozhoutao@steedos.com
4208
4208
  * @Date: 2022-10-28 14:52:55
4209
4209
  * @LastEditors: liaodaxue
4210
- * @LastEditTime: 2023-07-28 16:16:29
4210
+ * @LastEditTime: 2023-12-14 12:01:22
4211
4211
  * @Description:
4212
4212
  */
4213
4213
 
@@ -4224,6 +4224,7 @@ const AmisFormInputs$1 = [
4224
4224
  'percent',
4225
4225
  'password',
4226
4226
  'url',
4227
+ "color",
4227
4228
  'email'
4228
4229
  ];
4229
4230
 
@@ -4236,7 +4237,7 @@ function getAmisStaticFieldType$1(type, readonly, options){
4236
4237
  }
4237
4238
  return type;
4238
4239
  }
4239
- if(_$1__namespace.includes(['text','image'], type)){
4240
+ if(_$1__namespace.includes(['text','image','color'], type)){
4240
4241
  if('text' === type && options && options.amis && options.amis.tpl){
4241
4242
  return 'static';
4242
4243
  }
@@ -4370,6 +4371,7 @@ var frontend_form_please_select$1 = "Please select";
4370
4371
  var frontend_form_confirm$1 = "Confirm";
4371
4372
  var frontend_form_delete$1 = "Delete";
4372
4373
  var frontend_form_view$1 = "view";
4374
+ var frontend_form_details$1 = "details";
4373
4375
  var frontend_delete_confirm_text$1 = "Are you sure you want to delete this item?";
4374
4376
  var frontend_delete_many_selected_required$1 = "Please select the item to be deleted";
4375
4377
  var frontend_delete_many_confirm_text$1 = "Are you sure you want to delete?";
@@ -4456,6 +4458,7 @@ var en_us = {
4456
4458
  frontend_form_confirm: frontend_form_confirm$1,
4457
4459
  frontend_form_delete: frontend_form_delete$1,
4458
4460
  frontend_form_view: frontend_form_view$1,
4461
+ frontend_form_details: frontend_form_details$1,
4459
4462
  frontend_delete_confirm_text: frontend_delete_confirm_text$1,
4460
4463
  frontend_delete_many_selected_required: frontend_delete_many_selected_required$1,
4461
4464
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text$1,
@@ -4543,6 +4546,7 @@ var frontend_form_please_select = "请选择";
4543
4546
  var frontend_form_confirm = "确认";
4544
4547
  var frontend_form_delete = "删除";
4545
4548
  var frontend_form_view = "查看";
4549
+ var frontend_form_details = "详情";
4546
4550
  var frontend_delete_confirm_text = "确定要删除此项目?";
4547
4551
  var frontend_delete_many_selected_required = "请选择要删除的项";
4548
4552
  var frontend_delete_many_confirm_text = "确定要删除吗?";
@@ -4630,6 +4634,7 @@ var zh_cn = {
4630
4634
  frontend_form_confirm: frontend_form_confirm,
4631
4635
  frontend_form_delete: frontend_form_delete,
4632
4636
  frontend_form_view: frontend_form_view,
4637
+ frontend_form_details: frontend_form_details,
4633
4638
  frontend_delete_confirm_text: frontend_delete_confirm_text,
4634
4639
  frontend_delete_many_selected_required: frontend_delete_many_selected_required,
4635
4640
  frontend_delete_many_confirm_text: frontend_delete_many_confirm_text,
@@ -4926,21 +4931,21 @@ async function getQuickEditSchema(field, options){
4926
4931
  break;
4927
4932
  case "avatar":
4928
4933
  case "image":
4929
- quickEditSchema.body[0].receiver.adaptor = `
4930
- const { context } = api.body;
4931
- var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
4932
- payload = {
4933
- status: response.status == 200 ? 0 : response.status,
4934
- msg: response.statusText,
4935
- data: {
4936
- value: rootUrl + payload._id,//为了实现图片crud的回显,需要将value从id改为url,当保存数据数据时,再在发送适配器内重新将id提取出来
4937
- name: payload.original.name,
4938
- url: rootUrl + payload._id,
4934
+ quickEditSchema.body[0].receiver.adaptor = `
4935
+ const { context } = api.body;
4936
+ var rootUrl = context.rootUrl + "/api/files/${field.type}s/";
4937
+ payload = {
4938
+ status: response.status == 200 ? 0 : response.status,
4939
+ msg: response.statusText,
4940
+ data: {
4941
+ value: rootUrl + payload._id,//为了实现图片crud的回显,需要将value从id改为url,当保存数据数据时,再在发送适配器内重新将id提取出来
4942
+ name: payload.original.name,
4943
+ url: rootUrl + payload._id,
4944
+ }
4939
4945
  }
4940
- }
4941
- return payload;
4942
- `;
4943
- break;
4946
+ return payload;
4947
+ `;
4948
+ break;
4944
4949
  }
4945
4950
  quickEditSchema.body[0].visibleOn = "${quickedit_record_permissions.allowEdit && quickedit_record_permissions_loading == false}";
4946
4951
  quickEditSchema.body.push({
@@ -5147,6 +5152,11 @@ async function getQuickEditSchema(field, options){
5147
5152
  if(field.type == "location"){
5148
5153
  quickEditSchema = false;
5149
5154
  }
5155
+ if(field.type == "color"){
5156
+ quickEditSchema = {
5157
+ type: "input-color"
5158
+ };
5159
+ }
5150
5160
  }
5151
5161
  return quickEditSchema;
5152
5162
  }
@@ -5304,6 +5314,11 @@ async function getTableColumns$1(fields, options){
5304
5314
  options: field.type === 'html' ? {html: true} : null
5305
5315
  // toggled: true
5306
5316
  }, field.amis, {name: field.name});
5317
+
5318
+ if(field.type === 'color'){
5319
+ columnItem.type = 'color';
5320
+ columnItem.defaultColor = null;
5321
+ }
5307
5322
  }
5308
5323
  }
5309
5324
  if(columnItem){
@@ -7991,8 +8006,8 @@ const getSchema$2 = (uiSchema) => {
7991
8006
  /*
7992
8007
  * @Author: baozhoutao@steedos.com
7993
8008
  * @Date: 2022-11-07 17:00:38
7994
- * @LastEditors: baozhoutao@steedos.com
7995
- * @LastEditTime: 2023-08-24 16:44:42
8009
+ * @LastEditors: liaodaxue
8010
+ * @LastEditTime: 2023-12-13 10:09:05
7996
8011
  * @Description:
7997
8012
  */
7998
8013
 
@@ -8003,7 +8018,7 @@ const getSchema$1 = (uiSchema)=>{
8003
8018
  "body": [
8004
8019
  {
8005
8020
  "type": "button",
8006
- "label": instance.t('frontend_form_view'),
8021
+ "label": instance.t('frontend_form_details'),
8007
8022
  "className": "border-none",
8008
8023
  "onEvent": {
8009
8024
  "click": {
@@ -14684,6 +14699,23 @@ async function convertSFieldToAmisField(field, readonly, ctx) {
14684
14699
  }
14685
14700
  }
14686
14701
 
14702
+ break;
14703
+ case 'color':
14704
+ convertData = {
14705
+ type: getAmisStaticFieldType$1('color', readonly),
14706
+ name: field.name,
14707
+ label: field.label
14708
+ };
14709
+ if(readonly){
14710
+ convertData.defaultColor = null;
14711
+ }else {
14712
+ convertData.pipeIn = (value, data) => {
14713
+ if(value && value.indexOf('#')<0){
14714
+ return '#'+value;
14715
+ }
14716
+ return value;
14717
+ };
14718
+ }
14687
14719
  break;
14688
14720
  case 'boolean':
14689
14721
  convertData = {
@@ -15538,7 +15570,7 @@ async function getFormBody(permissionFields, formFields, ctx){
15538
15570
  * @Author: 殷亮辉 yinlianghui@hotoa.com
15539
15571
  * @Date: 2023-11-15 09:50:22
15540
15572
  * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
15541
- * @LastEditTime: 2023-12-12 17:13:37
15573
+ * @LastEditTime: 2023-12-19 15:53:32
15542
15574
  */
15543
15575
 
15544
15576
  /**
@@ -15634,36 +15666,25 @@ async function getInputTableColumns(props) {
15634
15666
  function getFormPagination(props) {
15635
15667
  let onPageChangeScript = `
15636
15668
  let scope = event.context.scoped;
15637
- let paginationServiceId = event.data.paginationServiceId;
15638
- let wrapperServiceId = event.data.wrapperServiceId;
15639
- let formId = event.data.formId;
15640
- let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
15669
+ let __paginationServiceId = event.data.__paginationServiceId;
15670
+ let __wrapperServiceId = event.data.__wrapperServiceId;
15671
+ let __formId = event.data.__formId;
15672
+ let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
15641
15673
  let pageChangeDirection = context.props.pageChangeDirection;
15642
- let currentPage = event.data.page;
15674
+ let currentPage = event.data.__page;
15643
15675
  let currentIndex = event.data.index;
15644
15676
 
15645
- // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems
15646
- let currentFormValues = scope.getComponentById(formId).getValues();
15677
+ // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量__tableItems
15678
+ let currentFormValues = scope.getComponentById(__formId).getValues();
15647
15679
  fieldValue[currentIndex] = currentFormValues;
15648
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
15649
- // doAction({
15650
- // "componentId": wrapperServiceId,
15651
- // "actionType": "setValue",
15652
- // "args": {
15653
- // "value": {
15654
- // "changedItems": fieldValue
15655
- // }
15656
- // }
15657
- // });
15658
- // 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
15659
- // 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
15660
- // doAction({
15661
- // "componentId": "${props.id}",
15662
- // "actionType": "setValue",
15663
- // "args": {
15664
- // "value": fieldValue
15665
- // }
15666
- // });
15680
+ // 翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,所以额外给正式表单字段执行一次setValue
15681
+ doAction({
15682
+ "componentId": "${props.id}",
15683
+ "actionType": "setValue",
15684
+ "args": {
15685
+ "value": fieldValue
15686
+ }
15687
+ });
15667
15688
 
15668
15689
  // 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
15669
15690
  let targetPage;
@@ -15674,13 +15695,13 @@ function getFormPagination(props) {
15674
15695
  targetPage = currentPage - 1;
15675
15696
  }
15676
15697
  let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
15677
- // let targetFormData = changedItems[targetIndex];
15698
+ // let targetFormData = __tableItems[targetIndex];
15678
15699
  doAction({
15679
15700
  "actionType": "setValue",
15680
- "componentId": paginationServiceId,
15701
+ "componentId": __paginationServiceId,
15681
15702
  "args": {
15682
15703
  "value": {
15683
- "page": targetPage,
15704
+ "__page": targetPage,
15684
15705
  "index": targetIndex
15685
15706
  }
15686
15707
  }
@@ -15688,7 +15709,7 @@ function getFormPagination(props) {
15688
15709
  // 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
15689
15710
  // doAction({
15690
15711
  // "actionType": "setValue",
15691
- // "componentId": formId,
15712
+ // "componentId": __formId,
15692
15713
  // "args": {
15693
15714
  // "value": targetFormData
15694
15715
  // },
@@ -15705,7 +15726,7 @@ function getFormPagination(props) {
15705
15726
  "icon": `fa fa-angle-left`,
15706
15727
  "level": "link",
15707
15728
  "pageChangeDirection": "prev",
15708
- "disabledOn": "${page <= 1}",
15729
+ "disabledOn": "${__page <= 1}",
15709
15730
  "size": "sm",
15710
15731
  "onEvent": {
15711
15732
  "click": {
@@ -15720,7 +15741,7 @@ function getFormPagination(props) {
15720
15741
  },
15721
15742
  {
15722
15743
  "type": "tpl",
15723
- "tpl": "${page}/${total}"
15744
+ "tpl": "${__page}/${__total}"
15724
15745
  },
15725
15746
  {
15726
15747
  "type": "button",
@@ -15728,7 +15749,7 @@ function getFormPagination(props) {
15728
15749
  "icon": `fa fa-angle-right`,
15729
15750
  "level": "link",
15730
15751
  "pageChangeDirection": "next",
15731
- "disabledOn": "${page >= total}",
15752
+ "disabledOn": "${__page >= __total}",
15732
15753
  "size": "sm",
15733
15754
  "onEvent": {
15734
15755
  "click": {
@@ -15749,10 +15770,18 @@ function getFormPagination(props) {
15749
15770
  * 传入formSchema输出带翻页容器的wrapper
15750
15771
  * @param {*} props input-table组件props
15751
15772
  * @param {*} form formSchema
15773
+ * @param {*} mode edit/readonly
15752
15774
  * @returns 带翻页容器的wrapper
15753
15775
  */
15754
- function getFormPaginationWrapper(props, form) {
15776
+ function getFormPaginationWrapper(props, form, mode) {
15755
15777
  let serviceId = `service_popup_pagination_wrapper__${props.id}`;
15778
+ let innerForm = Object.assign({}, form, {
15779
+ "data": {
15780
+ // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
15781
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
15782
+ "&": "${__tableItems[__super.index]}"
15783
+ }
15784
+ });
15756
15785
  let formBody = [
15757
15786
  {
15758
15787
  "type": "wrapper",
@@ -15762,59 +15791,56 @@ function getFormPaginationWrapper(props, form) {
15762
15791
  getFormPagination(props)
15763
15792
  ]
15764
15793
  },
15765
- // form
15766
- Object.assign({}, form, {
15767
- "canAccessSuperData": false,
15794
+ {
15795
+ "type": "service",
15796
+ "body": [
15797
+ innerForm
15798
+ ],
15768
15799
  "data": {
15769
- // "&": `\${${props.name}[index]}`,
15770
- "&": "${changedItems[index]}"
15800
+ "&": "${__parentForm}"
15771
15801
  }
15772
- })
15802
+ }
15773
15803
  ];
15774
15804
  let onServiceInitedScript = `
15775
- // 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
15776
- // inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
15777
- // 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
15805
+ // 以下脚本是为了解决有时弹出编辑表单时,表单中的值比最后一次编辑保存的值会延迟一拍。
15806
+ // 比如:inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
15807
+ // 另外有的地方在非inlineEditMode模式时也会有这种延迟一拍问题,比如对象字段中下拉框类型字段的”选择项“属性
15808
+ // 再比如工作流规则详细页面修改了子表字段”时间触发器“值后,在只读界面点击查看按钮弹出的表单中__tableItems值是修改前的值
15809
+ // 处理思路是每次弹出form之前先把其__tableItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
15778
15810
  // 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
15779
- let inlineEditMode = ${props.inlineEditMode};
15780
- if(!inlineEditMode){
15781
- return;
15782
- }
15783
15811
  let scope = event.context.scoped;
15784
- let wrapperServiceId = event.data.wrapperServiceId;
15785
- let wrapperService = scope.getComponentById(wrapperServiceId);
15812
+ let __wrapperServiceId = event.data.__wrapperServiceId;
15813
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
15786
15814
  let wrapperServiceData = wrapperService.getData();
15787
15815
  let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
15788
- //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
15789
- event.data.changedItems.forEach(function(n,i){
15790
- event.data.changedItems[i] = lastestFieldValue[i];
15816
+ //不可以直接像event.data.__tableItems = lastestFieldValue; 这样整个赋值,否则作用域会断
15817
+ event.data.__tableItems.forEach(function(n,i){
15818
+ event.data.__tableItems[i] = lastestFieldValue[i];
15791
15819
  });
15792
15820
  `;
15793
15821
  let schema = {
15794
15822
  "type": "service",
15795
15823
  "id": serviceId,
15796
15824
  "schemaApi": {
15797
- "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
15798
- // "url": "${context.rootUrl}/graphql",
15799
- "method": "post",
15800
- "headers": {
15801
- "Authorization": "Bearer ${context.tenantId},${context.authToken}"
15802
- },
15803
- "requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
15825
+ // "url": "${context.rootUrl}/graphql?rebuildOn=${index}",
15826
+ "url": "${context.rootUrl}/api/v1/spaces/none",
15827
+ "trackExpression": "${index}",
15828
+ "method": "get",
15804
15829
  "adaptor": `
15805
15830
  const formBody = ${JSON.stringify(formBody)};
15806
15831
  return {
15807
15832
  "body": formBody
15808
15833
  }
15809
- `
15834
+ `,
15835
+ "cache": 600000
15810
15836
  },
15811
15837
  // "body": formBody,
15812
15838
  "data": {
15813
- "page": "${index + 1}",
15814
- // "total": `\${${props.name}.length}`,
15815
- "total": "${changedItems.length}",
15816
- "paginationServiceId": serviceId,
15817
- "formId": form.id
15839
+ "__page": "${index + 1}",
15840
+ // "__total": `\${${props.name}.length}`,
15841
+ "__total": "${__tableItems.length}",
15842
+ "__paginationServiceId": serviceId,
15843
+ "__formId": form.id
15818
15844
  },
15819
15845
  "onEvent": {
15820
15846
  "init": {
@@ -15834,25 +15860,30 @@ function getFormPaginationWrapper(props, form) {
15834
15860
  * @param {*} props
15835
15861
  * @param {*} mode edit/new/readonly
15836
15862
  */
15837
- async function getForm(props, mode = "edit") {
15863
+ async function getForm(props, mode = "edit", formId) {
15838
15864
  let formFields = getFormFields(props, mode);
15839
15865
  let body = await getFormBody(null, formFields);
15840
- let forId = `form_popup__${props.id}`;
15866
+ if(!formId){
15867
+ formId = `form_popup__${props.id}`;
15868
+ }
15841
15869
  let schema = {
15842
15870
  "type": "form",
15843
- "id": forId,
15871
+ "id": formId,
15844
15872
  "title": "表单",
15845
15873
  "debug": false,
15846
15874
  "mode": "normal",
15847
15875
  "body": body,
15848
15876
  "wrapWithPanel": false,
15877
+ "canAccessSuperData": false,
15849
15878
  "className": "steedos-object-form steedos-amis-form"
15850
15879
  };
15851
15880
  if (mode === "edit") {
15852
15881
  let onEditItemSubmitScript = `
15853
15882
  // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
15854
- let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
15855
- fieldValue[event.data.index] = JSON.parse(JSON.stringify(event.data));
15883
+ let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
15884
+ //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
15885
+ // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
15886
+ fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
15856
15887
  doAction({
15857
15888
  "componentId": "${props.id}",
15858
15889
  "actionType": "setValue",
@@ -15860,16 +15891,6 @@ async function getForm(props, mode = "edit") {
15860
15891
  "value": fieldValue
15861
15892
  }
15862
15893
  });
15863
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
15864
- // doAction({
15865
- // "componentId": event.data.wrapperServiceId,
15866
- // "actionType": "setValue",
15867
- // "args": {
15868
- // "value": {
15869
- // "changedItems": fieldValue
15870
- // }
15871
- // }
15872
- // });
15873
15894
  `;
15874
15895
  Object.assign(schema, {
15875
15896
  "onEvent": {
@@ -15897,29 +15918,30 @@ async function getForm(props, mode = "edit") {
15897
15918
  }
15898
15919
  else if (mode === "new") {
15899
15920
  let onNewItemSubmitScript = `
15900
- // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
15901
- if(!event.data.changedItems){
15902
- event.data.changedItems = [];
15921
+ let newItem = JSON.parse(JSON.stringify(event.data));
15922
+ if(event.data["${props.name}"]){
15923
+ // let fieldValue = event.data.__tableItems;
15924
+ // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
15925
+ let fieldValue = event.data["${props.name}"];
15926
+ fieldValue.push(newItem);
15927
+ doAction({
15928
+ "componentId": "${props.id}",
15929
+ "actionType": "setValue",
15930
+ "args": {
15931
+ "value": fieldValue
15932
+ }
15933
+ });
15934
+ }
15935
+ else{
15936
+ // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
15937
+ doAction({
15938
+ "componentId": "${props.id}",
15939
+ "actionType": "setValue",
15940
+ "args": {
15941
+ "value": [newItem]
15942
+ }
15943
+ });
15903
15944
  }
15904
- let fieldValue = event.data.changedItems;
15905
- fieldValue.push(JSON.parse(JSON.stringify(event.data)));
15906
- doAction({
15907
- "componentId": "${props.id}",
15908
- "actionType": "setValue",
15909
- "args": {
15910
- "value": fieldValue
15911
- }
15912
- });
15913
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
15914
- // doAction({
15915
- // "componentId": event.data.wrapperServiceId,
15916
- // "actionType": "setValue",
15917
- // "args": {
15918
- // "value": {
15919
- // "changedItems": fieldValue
15920
- // }
15921
- // }
15922
- // });
15923
15945
  `;
15924
15946
  Object.assign(schema, {
15925
15947
  "onEvent": {
@@ -15952,6 +15974,7 @@ async function getForm(props, mode = "edit") {
15952
15974
  }
15953
15975
 
15954
15976
  async function getButtonNew(props) {
15977
+ let formId = `form_popup__${props.id}`;
15955
15978
  return {
15956
15979
  "label": "新增",
15957
15980
  "type": "button",
@@ -15965,14 +15988,28 @@ async function getButtonNew(props) {
15965
15988
  "type": "dialog",
15966
15989
  "title": "新增行",
15967
15990
  "body": [
15968
- await getForm(props, "new")
15991
+ await getForm(props, "new", formId)
15969
15992
  ],
15970
15993
  "size": "lg",
15971
15994
  "showCloseButton": true,
15972
15995
  "showErrorMsg": true,
15973
15996
  "showLoading": true,
15974
15997
  "className": "app-popover",
15975
- "closeOnEsc": false
15998
+ "closeOnEsc": false,
15999
+ "onEvent": {
16000
+ "confirm": {
16001
+ "actions": [
16002
+ {
16003
+ "actionType": "validate",
16004
+ "componentId": formId
16005
+ },
16006
+ {
16007
+ "preventDefault": true,
16008
+ "expression": "${event.data.validateResult.error}" //触发表单校验结果会存入validateResult,amis 3.2不支持,高版本比如 3.5.3支持
16009
+ }
16010
+ ]
16011
+ }
16012
+ }
15976
16013
  }
15977
16014
  }
15978
16015
  ]
@@ -15983,27 +16020,7 @@ async function getButtonNew(props) {
15983
16020
  }
15984
16021
 
15985
16022
  async function getButtonEdit(props, showAsInlineEditMode) {
15986
- let onCancelScript = `
15987
- let scope = event.context.scoped;
15988
- let wrapperServiceId = event.data.wrapperServiceId;
15989
- let wrapperService = scope.getComponentById(wrapperServiceId);
15990
- let wrapperServiceData = wrapperService.getData();
15991
- let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
15992
- //不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
15993
- event.data.changedItems.forEach(function(n,i){
15994
- event.data.changedItems[i] = originalFieldValue[i];
15995
- });
15996
- // 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
15997
- // doAction({
15998
- // "componentId": wrapperServiceId,
15999
- // "actionType": "setValue",
16000
- // "args": {
16001
- // "value": {
16002
- // "changedItems": originalFieldValue
16003
- // }
16004
- // }
16005
- // });
16006
- `;
16023
+ let formId = `form_popup__${props.id}`;
16007
16024
  return {
16008
16025
  "type": "button",
16009
16026
  "label": "",
@@ -16018,7 +16035,7 @@ async function getButtonEdit(props, showAsInlineEditMode) {
16018
16035
  "type": "dialog",
16019
16036
  "title": "编辑行",
16020
16037
  "body": [
16021
- await getForm(props, "edit")
16038
+ await getForm(props, "edit", formId)
16022
16039
  ],
16023
16040
  "size": "lg",
16024
16041
  "showCloseButton": true,
@@ -16027,25 +16044,31 @@ async function getButtonEdit(props, showAsInlineEditMode) {
16027
16044
  "className": "app-popover",
16028
16045
  "closeOnEsc": false,
16029
16046
  "data": {
16030
- // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
16047
+ // 这里必须加data数据映射,否则翻页功能中取__tableItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
16031
16048
  // 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
16032
16049
  // 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
16033
- "&": "${record || {}}",
16050
+ // "&": "${record || {}}",
16051
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有record变量
16052
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
16053
+ "__parentForm": "${__super.__super || {}}",
16034
16054
  "global": "${global}",
16035
16055
  "uiSchema": "${uiSchema}",
16036
- "grid": "${grid}",
16037
16056
  "index": "${index}",
16038
- "changedItems": "${changedItems}",
16039
- "wrapperServiceId": "${wrapperServiceId}"
16057
+ "__tableItems": `\${${props.name}}`,
16058
+ "__wrapperServiceId": "${__wrapperServiceId}"
16040
16059
  },
16041
16060
  "onEvent": {
16042
- "cancel": {
16043
- "actions": [
16044
- {
16045
- "actionType": "custom",
16046
- "script": onCancelScript
16047
- }
16048
- ]
16061
+ "confirm": {
16062
+ "actions": [
16063
+ {
16064
+ "actionType": "validate",
16065
+ "componentId": formId
16066
+ },
16067
+ {
16068
+ "preventDefault": true,
16069
+ "expression": "${event.data.validateResult.error}" //触发表单校验结果会存入validateResult,amis 3.2不支持,高版本比如 3.5.3支持
16070
+ }
16071
+ ]
16049
16072
  }
16050
16073
  }
16051
16074
  }
@@ -16081,14 +16104,16 @@ async function getButtonView(props) {
16081
16104
  "closeOnEsc": false,
16082
16105
  "actions": [],
16083
16106
  "data": {
16084
- // 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
16107
+ // 这里必须加data数据映射,否则翻页功能中取__tableItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
16085
16108
  // 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
16086
16109
  // global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
16087
- "&": "${formData || {}}",
16088
- "grid": "${grid}",
16110
+ // "&": "${formData || {}}",
16111
+ // 换成从__super来映射上级表单数据是因为对象列表视图界面中每行下拉菜单中的编辑按钮弹出的表单中的子表所在作用域中没有formData变量
16112
+ // 映射到中间变量__parentForm而不是直接用&展开映射是为了避免表单中字段名与作用域中变量重名
16113
+ "__parentForm": "${__super.__super || {}}",
16089
16114
  "index": "${index}",
16090
- "changedItems": "${changedItems}",
16091
- "wrapperServiceId": "${wrapperServiceId}"
16115
+ "__tableItems": `\${${props.name}}`,
16116
+ "__wrapperServiceId": "${__wrapperServiceId}"
16092
16117
  }
16093
16118
  }
16094
16119
  }
@@ -16100,30 +16125,20 @@ async function getButtonView(props) {
16100
16125
 
16101
16126
  function getButtonDelete(props) {
16102
16127
  let onDeleteItemScript = `
16103
- // let fieldValue = _.cloneDeep(event.data["${props.name}"]);
16104
- if(!event.data.changedItems){
16105
- event.data.changedItems = [];
16106
- }
16107
- let fieldValue = event.data.changedItems;
16108
- // fieldValue.push(JSON.parse(JSON.stringify(event.data)));
16109
- fieldValue.splice(event.data.index, 1)
16128
+ // let fieldValue = event.data["${props.name}"];
16129
+ let scope = event.context.scoped;
16130
+ let __wrapperServiceId = event.data.__wrapperServiceId;
16131
+ let wrapperService = scope.getComponentById(__wrapperServiceId);
16132
+ let wrapperServiceData = wrapperService.getData();
16133
+ let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
16134
+ lastestFieldValue.splice(event.data.index, 1);
16110
16135
  doAction({
16111
16136
  "componentId": "${props.id}",
16112
16137
  "actionType": "setValue",
16113
16138
  "args": {
16114
- "value": fieldValue
16139
+ "value": lastestFieldValue
16115
16140
  }
16116
16141
  });
16117
- // // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
16118
- // doAction({
16119
- // "componentId": event.data.wrapperServiceId,
16120
- // "actionType": "setValue",
16121
- // "args": {
16122
- // "value": {
16123
- // "changedItems": fieldValue
16124
- // }
16125
- // }
16126
- // });
16127
16142
  `;
16128
16143
  return {
16129
16144
  "type": "button",
@@ -16161,13 +16176,15 @@ const getAmisInputTableSchema = async (props) => {
16161
16176
  if (props.editable) {
16162
16177
  let showEditButton = true;
16163
16178
  if (showAsInlineEditMode) {
16164
- // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
16165
- if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
16166
- showEditButton = true;
16167
- }
16168
- else {
16169
- showEditButton = false;
16170
- }
16179
+ // 始终显示弹出子表表单按钮,如果需要判断只在有列被隐藏时才需要显示弹出表单按钮放开下面的if逻辑就好
16180
+ showEditButton = true;
16181
+ // // inline edit模式下只在有列被隐藏时才需要显示编辑按钮
16182
+ // if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
16183
+ // showEditButton = true;
16184
+ // }
16185
+ // else {
16186
+ // showEditButton = false;
16187
+ // }
16171
16188
  }
16172
16189
  // 编辑时显示编辑按钮
16173
16190
  if (showEditButton) {
@@ -16177,11 +16194,9 @@ const getAmisInputTableSchema = async (props) => {
16177
16194
  }
16178
16195
  else {
16179
16196
  // 只读时显示查看按钮
16180
- if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
16181
- // 只在有列被隐藏时才需要显示查看按钮
16182
- let buttonViewSchema = await getButtonView(props);
16183
- buttonsForColumnOperations.push(buttonViewSchema);
16184
- }
16197
+ // 如果想只在有列被隐藏时才需要显示查看按钮可以加上判断:if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length)
16198
+ let buttonViewSchema = await getButtonView(props);
16199
+ buttonsForColumnOperations.push(buttonViewSchema);
16185
16200
  }
16186
16201
  if (props.removable) {
16187
16202
  let buttonDeleteSchema = getButtonDelete(props);
@@ -16201,7 +16216,7 @@ const getAmisInputTableSchema = async (props) => {
16201
16216
  "id": props.id,
16202
16217
  "columns": await getInputTableColumns(props),
16203
16218
  // "needConfirm": false, //不可以配置为false,否则,单元格都是可编辑状态,且很多static类型无法正常显示,比如static-mapping
16204
- "strictMode": true,
16219
+ "strictMode": props.strictMode,
16205
16220
  "showTableAddBtn": false,
16206
16221
  "showFooterAddBtn": false,
16207
16222
  "className": props.tableClassName
@@ -16217,40 +16232,53 @@ const getAmisInputTableSchema = async (props) => {
16217
16232
  if (showAsInlineEditMode) {
16218
16233
  inputTableSchema.needConfirm = false;
16219
16234
  }
16220
- let dataProviderInited = `
16221
- // 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
16222
- setData({ changedItems: _.cloneDeep(data["${props.name}"]) || []});
16223
- `;
16224
- let schema = {
16225
- "type": "service",
16226
- "body": [
16227
- inputTableSchema
16228
- ],
16229
- "className": props.className,
16230
- "id": serviceId,
16231
- "data": {
16232
- "wrapperServiceId": serviceId
16233
- },
16234
- "dataProvider": {
16235
- "inited": dataProviderInited
16236
- }
16237
- };
16235
+ let amis = props["input-table"] || props.amis;//额外支持"input-table"代替amis属性,是因为在字段yml文件中用amis作为key不好理解
16236
+ if (amis) {
16237
+ // 支持配置amis属性重写或添加最终生成的input-table中任何属性。
16238
+ delete amis.id;//如果steedos-input-table组件配置了amis.id属性,会造成新建编辑行功能不生效
16239
+ Object.assign(inputTableSchema, amis);
16240
+ }
16241
+ const isAnyFieldHasDependOn = (props.fields || []).find(function (item) {
16242
+ return item.depend_on;
16243
+ });
16244
+ if (isAnyFieldHasDependOn) {
16245
+ // 有任意一个子字段有depend_on属性时,强制设置禁用静态模式
16246
+ Object.assign(inputTableSchema, {
16247
+ strictMode: false
16248
+ });
16249
+ }
16250
+ let schemaBody = [inputTableSchema];
16238
16251
  let footerToolbar = _$1.clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
16239
16252
  if (props.addable) {
16240
16253
  let buttonNewSchema = await getButtonNew(props);
16241
16254
  footerToolbar.unshift(buttonNewSchema);
16242
16255
  }
16243
16256
  if (footerToolbar.length) {
16244
- schema.body.push({
16257
+ schemaBody.push({
16245
16258
  "type": "wrapper",
16246
16259
  "size": "none",
16247
16260
  "body": footerToolbar
16248
16261
  });
16249
16262
  }
16250
- if (props.amis) {
16251
- delete props.amis.id;
16252
- Object.assign(schema.body[0], props.amis);
16253
- }
16263
+ // 不可以直接把headerToolbar unshift进schemaBody,因为它没有显示在label下面,而是显示在上面了,这没有意义
16264
+ // 看起来amis官方后续会支持给input-table组件配置headerToolbar,见:https://github.com/baidu/amis/issues/7246
16265
+ // let headerToolbar = clone(props.headerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
16266
+ // if (headerToolbar.length) {
16267
+ // schemaBody.unshift({
16268
+ // "type": "wrapper",
16269
+ // "size": "none",
16270
+ // "body": headerToolbar
16271
+ // });
16272
+ // }
16273
+ let schema = {
16274
+ "type": "service",
16275
+ "body": schemaBody,
16276
+ "className": props.className,
16277
+ "id": serviceId,
16278
+ "data": {
16279
+ "__wrapperServiceId": serviceId
16280
+ }
16281
+ };
16254
16282
  // console.log("===schema===", schema);
16255
16283
  return schema;
16256
16284
  };
@@ -20514,7 +20542,7 @@ var AmisAppMenu = function (props) { return __awaiter(void 0, void 0, void 0, fu
20514
20542
  schemaApi: {
20515
20543
  "method": "get",
20516
20544
  "url": "${context.rootUrl}/service/api/apps/".concat(appId, "/menus"),
20517
- "adaptor": "\n try {\n // console.log('payload====>', payload)\n if(payload.nav_schema){\n payload.data = payload.nav_schema;\n return payload\n }\n\n const data = { nav: [] };\n const stacked = ".concat(stacked, ";\n const showIcon = ").concat(showIcon, ";\n const selectedId = '").concat(selectedId, "';\n const tab_groups = payload.tab_groups;\n const locationPathname = window.location.pathname;\n var customTabId = \"\";\n var objectTabId = \"").concat(data.tabId, "\";\n if(stacked){\n _.each(_.groupBy(payload.children, 'group'), (tabs, groupName) => {\n if (groupName === 'undefined' || groupName === '') {\n _.each(tabs, (tab) => {\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n data.nav.push({\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n })\n })\n } else {\n var tabGroup = _.find(tab_groups, {\"group_name\": groupName});\n data.nav.push({\n \"label\": groupName,\n \"unfolded\": tabGroup && tabGroup.default_open != false,\n \"isGroup\": true,\n \"children\": _.sortBy(_.map(tabs, (tab) => {\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n return {\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n }\n }),(tab) => {return tab.index})\n }) \n }\n });\n \n }else{\n _.each(payload.children, (tab)=>{\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n data.nav.push({\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n });\n })\n }\n //\u4EE5\u4E0B\u4E3Anav\u7B2C\u4E00\u5C42\u6392\u5E8F\uFF0C\u5305\u62EC\u5206\u7EC4\u4E0E\u9009\u9879\u5361\n // let groupLength = ((payload.tab_groups && payload.tab_groups.length) || 0) + 1000;\n data.nav = _.sortBy(data.nav, function(tab){\n if(tab.isGroup){\n return _.findIndex(payload.tab_groups, function(group){\n return group.group_name === tab.label;\n });\n }else{\n // \u6CA1\u6709\u5206\u7EC4\u7684\u9009\u9879\u5361\u6309index\u6392\u5217\u5728\u6709\u5206\u7EC4\u7684\u9009\u9879\u5361\u524D\u65B9\n return (tab.index || 0) - 1000;\n }\n })\n payload.data = {\n \"type\":\"service\",\n \"data\":{\n \"tabId\": customTabId || objectTabId,\n \"items\": data.nav\n },\n \"id\": \"appMenuService\",\n \"body\":{\n \"type\": \"nav\",\n className: \"").concat(className, " text-black\",\n \"stacked\": ").concat(stacked, ",\n \"overflow\": ").concat(JSON.stringify(overflow), ",\n \"indentSize\": ").concat(indentSize, ",\n \"source\": \"${items}\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"setValue\",\n \"componentId\": \"appMenuService\",\n \"args\": {\n \"value\": {\n \"tabId\": \"${event.data.item.id}\",\n \"items\": data.nav\n }\n },\n \"expression\":\"${event.data.item.id}\"\n },\n {\n \"actionType\": \"custom\",\n \"script\" : \"window.postMessage(Object.assign({type: 'nav.click', data: event.data.item}), '*');\"\n }\n ]\n },\n \"@tabId.changed\":{\n \"actions\":[\n {\n \"actionType\": \"setValue\",\n \"componentId\": \"appMenuService\",\n \"args\": {\n \"value\": {\n \"tabId\": \"${event.data.tabId}\",\n \"items\": data.nav\n }\n },\n \"expression\":\"${event.data.tabId}\"\n },\n {\n \"actionType\": \"custom\",\n \"script\" : \"window.postMessage(Object.assign({type: 'nav.click', data: event.data.item}), '*');\"\n }\n ]\n }\n }\n }\n };\n } catch (error) {\n console.log(`error`, error)\n }\n // console.log('payload===2==>', payload)\n return payload;\n "),
20545
+ "adaptor": "\n try {\n // console.log('payload====>', payload)\n if(payload.nav_schema){\n payload.data = payload.nav_schema;\n return payload\n }\n\n const data = { nav: [] };\n const stacked = ".concat(stacked, ";\n const showIcon = ").concat(showIcon, ";\n const selectedId = '").concat(selectedId, "';\n const tab_groups = payload.tab_groups;\n const locationPathname = window.location.pathname;\n var customTabId = \"\";\n var objectTabId = \"").concat(data.tabId, "\";\n if(stacked){\n _.each(_.groupBy(payload.children, 'group'), (tabs, groupName) => {\n if (groupName === 'undefined' || groupName === '') {\n _.each(tabs, (tab) => {\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n data.nav.push({\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n })\n })\n } else {\n var tabGroup = _.find(tab_groups, {\"group_name\": groupName});\n data.nav.push({\n \"label\": groupName,\n \"unfolded\": tabGroup && tabGroup.default_open != false,\n \"isGroup\": true,\n \"children\": _.sortBy(_.map(tabs, (tab) => {\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n return {\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n }\n }),(tab) => {return tab.index})\n }) \n }\n });\n \n }else{\n _.each(payload.children, (tab)=>{\n if(locationPathname == tab.path){\n customTabId = tab.id;\n }else if(locationPathname.startsWith(tab.path + \"/\")){\n objectTabId = tab.id;\n }\n data.nav.push({\n \"label\": showIcon ? {\n type: 'tpl',\n tpl: `<span class='fill-slate-500 whitespace-normal leading-6 block -ml-px no-underline group flex items-center text-[14px] rounded-md'><svg class=\"mr-1 flex-shrink-0 h-6 w-6\"><use xlink:href=\"/assets/icons/standard-sprite/svg/symbols.svg#${tab.icon || 'account'}\"></use></svg>${tab.name}</span>`\n } : tab.name,\n \"to\": tab.path,\n \"target\":tab.target,\n \"id\": tab.id,\n \"activeOn\": \"\\\\${tabId == '\"+ tab.id +\"'}\",\n \"index\": tab.index\n // active: selectedId === tab.id,\n });\n })\n }\n //\u4EE5\u4E0B\u4E3Anav\u7B2C\u4E00\u5C42\u6392\u5E8F\uFF0C\u5305\u62EC\u5206\u7EC4\u4E0E\u9009\u9879\u5361\n // let groupLength = ((payload.tab_groups && payload.tab_groups.length) || 0) + 1000;\n data.nav = _.sortBy(data.nav, function(tab){\n if(tab.isGroup){\n return _.findIndex(payload.tab_groups, function(group){\n return group.group_name === tab.label;\n });\n }else{\n // \u6CA1\u6709\u5206\u7EC4\u7684\u9009\u9879\u5361\u6309index\u6392\u5217\u5728\u6709\u5206\u7EC4\u7684\u9009\u9879\u5361\u524D\u65B9\n return (tab.index || 0) - 1000;\n }\n })\n const badgeText = \"${IF(").concat(appId, " == 'approve_workflow',${ss:keyvalues.badge.value|pick:'workflow'},${ss:keyvalues.badge.value|pick:").concat(appId, "}) | toInt}\";\n payload.data = {\n \"type\":\"service\",\n \"data\":{\n \"tabId\": customTabId || objectTabId,\n \"items\": data.nav\n },\n \"id\": \"appMenuService\",\n \"body\":{\n \"type\": \"nav\",\n className: \"").concat(className, " text-black\",\n \"stacked\": ").concat(stacked, ",\n \"overflow\": ").concat(JSON.stringify(overflow), ",\n \"indentSize\": ").concat(indentSize, ",\n \"source\": \"${items}\",\n //\u5DE6\u5C42\u663E\u793A\u65F6\u5BA1\u6279\u5355\u663E\u793Abadge\u6570\u91CF\n \"itemBadge\": stacked?{\n \"mode\": \"text\",\n \"text\": badgeText,\n \"visibleOn\": \"${id == 'instances'}\",\n \"overflowCount\": 99,\n \"style\": {\n \"right\": \"20%\",\n \"margin-right\": \"-23px\",\n \"height\": \"20px\",\n \"border-radius\": \"10px\",\n \"font-size\": \"16px\",\n \"line-height\": \"18px\",\n \"top\": \"50%\"\n }\n }:\"\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"setValue\",\n \"componentId\": \"appMenuService\",\n \"args\": {\n \"value\": {\n \"tabId\": \"${event.data.item.id}\",\n \"items\": data.nav\n }\n },\n \"expression\":\"${event.data.item.id}\"\n },\n {\n \"actionType\": \"custom\",\n \"script\" : \"window.postMessage(Object.assign({type: 'nav.click', data: event.data.item}), '*');\"\n }\n ]\n },\n \"@tabId.changed\":{\n \"actions\":[\n {\n \"actionType\": \"setValue\",\n \"componentId\": \"appMenuService\",\n \"args\": {\n \"value\": {\n \"tabId\": \"${event.data.tabId}\",\n \"items\": data.nav\n }\n },\n \"expression\":\"${event.data.tabId}\"\n },\n {\n \"actionType\": \"custom\",\n \"script\" : \"window.postMessage(Object.assign({type: 'nav.click', data: event.data.item}), '*');\"\n }\n ]\n }\n }\n }\n };\n } catch (error) {\n console.log(`error`, error)\n }\n // console.log('payload===2==>', payload)\n return payload;\n "),
20518
20546
  "headers": {
20519
20547
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
20520
20548
  }
@@ -21233,14 +21261,14 @@ function getAmisStaticFieldType(type, data_type, options) {
21233
21261
  return type;
21234
21262
  }
21235
21263
  var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void 0, function () {
21236
- var steedosField, field, _a, readonly, _b, ctx, config, fStatic, hideLabel, schema, schema, fieldAmis, schema, error_1;
21237
- var _c;
21238
- return __generator(this, function (_d) {
21239
- switch (_d.label) {
21264
+ var steedosField, field, _a, readonly, _b, ctx, config, fStatic, hideLabel, defaultSource, source, schema, schema, fieldAmis, schema, error_1;
21265
+ var _c, _d, _e;
21266
+ return __generator(this, function (_f) {
21267
+ switch (_f.label) {
21240
21268
  case 0:
21241
21269
  steedosField = null;
21242
21270
  field = props.field, _a = props.readonly, readonly = _a === void 0 ? false : _a, _b = props.ctx, ctx = _b === void 0 ? {} : _b, config = props.config, props.$schema, fStatic = props.static, hideLabel = props.hideLabel;
21243
- console.log("AmisSteedosField", props);
21271
+ // console.log(`AmisSteedosField`, props)
21244
21272
  // if($schema.config && isString($schema.config)){
21245
21273
  // $schema.config = JSON.parse($schema.config)
21246
21274
  // props.config = $schema.config
@@ -21260,24 +21288,39 @@ var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void
21260
21288
  // 字段配置为只读,强制走fStatic模式,加上_display判断是为了不影响历史代码,比如直接在ObjectForm中调用steedos-field组件
21261
21289
  fStatic = true;
21262
21290
  }
21263
- _d.label = 1;
21291
+ _f.label = 1;
21264
21292
  case 1:
21265
- _d.trys.push([1, 15, , 16]);
21293
+ _f.trys.push([1, 16, , 17]);
21266
21294
  if (!(fStatic && (steedosField.type === 'lookup' || steedosField.type === 'master_detail'))) return [3 /*break*/, 2];
21295
+ defaultSource = {
21296
+ "method": "post",
21297
+ "url": "${context.rootUrl}/graphql",
21298
+ "requestAdaptor": "\n var steedosField = ".concat(JSON.stringify(steedosField), ";\n var objectName, filters, valueFieldKey, labelFieldKey;\n if(_.isString(steedosField.reference_to)){\n // reference_to\u4E3A\u5355\u9009\n const referenceTo = getReferenceToSync(steedosField);\n const referenceToField = steedosField.reference_to_field || '_id';\n\n objectName = referenceTo.objectName\n valueFieldKey = referenceTo && referenceTo.valueField?.name || '_id' ;\n labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';\n let value = api.data[steedosField.name];\n if(_.isString(value)){\n value = [value]\n }\n filters = [referenceToField, \"in\", value || []];\n if(objectName == \"object_fields\"){\n //\u5BF9\u8C61\u4E3Aobject_fields\u65F6\uFF0C\u5FC5\u987B\u52A0\u4E0Aobject\u7684\u8FC7\u6EE4\u6761\u4EF6\n const filtersFunction = ").concat(steedosField.filtersFunction || steedosField._filtersFunction, ";\n if(filtersFunction){\n const _filters = filtersFunction(filters, api.data);\n if(_filters && _filters.length > 0){\n filters = [filters,_filters]\n }\n }\n }\n }else{\n // reference_to\u4E3A\u591A\u9009\n const _steedosField = {\n ...steedosField,\n reference_to: api.data[steedosField.name].o\n }\n const referenceTo = getReferenceToSync(_steedosField);\n const referenceToField = _steedosField.reference_to_field || '_id';\n\n objectName = referenceTo.objectName\n valueFieldKey = referenceTo && referenceTo.valueField?.name || '_id' ;\n labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';\n let value = api.data[_steedosField.name] && api.data[_steedosField.name].ids;\n filters = [referenceToField, \"in\", value || []];\n }\n api.data = {\n query: '{options:' + objectName + '(filters: ' + JSON.stringify(filters) + '){label: ' + labelFieldKey + ',value: ' + valueFieldKey + '}}'\n }\n return api;\n "),
21299
+ "trackExpression": "${" + steedosField.name + "}",
21300
+ "cache": 3000
21301
+ };
21302
+ if (!steedosField.reference_to) {
21303
+ // 兼容lookup字段未配置reference_to属性的情况,当普通下拉框字段用
21304
+ defaultSource = {
21305
+ "url": "${context.rootUrl}/api/v1/spaces/none",
21306
+ data: { $: "$$" },
21307
+ };
21308
+ if (steedosField.optionsFunction || steedosField._optionsFunction) {
21309
+ defaultSource.adaptor = "\n var options = eval(".concat(steedosField.optionsFunction || steedosField._optionsFunction, ")(api.body.$);\n if(api.body.$term){\n options = _.filter(options, function(o) {\n var label = o.label;\n return label.toLowerCase().indexOf(api.body.$term.toLowerCase()) > -1;\n });\n }\n if(!payload.data){\n payload.data = {};\n }\n payload.data.options = options;\n return payload;\n ");
21310
+ }
21311
+ else if (steedosField.options) {
21312
+ defaultSource.adaptor = "\n var options = ".concat(JSON.stringify(steedosField.options), "\n if(api.body.$term){\n options = _.filter(options, function(o) {\n var label = o.label;\n return label.toLowerCase().indexOf(api.body.$term.toLowerCase()) > -1;\n });\n }\n if(!payload.data){\n payload.data = {};\n }\n payload.data.options = options;\n return payload;\n ");
21313
+ }
21314
+ }
21315
+ source = ((_c = steedosField.amis) === null || _c === void 0 ? void 0 : _c.source) || ((_d = steedosField.amis) === null || _d === void 0 ? void 0 : _d.autoComplete) || defaultSource;
21267
21316
  schema = Object.assign({}, {
21268
21317
  type: 'select',
21269
21318
  multiple: steedosField.multiple,
21270
21319
  name: steedosField.name,
21271
21320
  label: steedosField.label,
21272
21321
  static: true,
21273
- className: (_c = steedosField.amis) === null || _c === void 0 ? void 0 : _c.className,
21274
- source: {
21275
- "method": "post",
21276
- "url": "${context.rootUrl}/graphql",
21277
- "requestAdaptor": "\n var steedosField = ".concat(JSON.stringify(steedosField), ";\n var objectName, filters, valueFieldKey, labelFieldKey;\n if(_.isString(steedosField.reference_to)){\n const referenceTo = getReferenceToSync(steedosField);\n const referenceToField = steedosField.reference_to_field || '_id';\n\n objectName = referenceTo.objectName\n valueFieldKey = referenceTo && referenceTo.valueField?.name || '_id' ;\n labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';\n let value = api.data[steedosField.name];\n if(_.isString(value)){\n value = [value]\n }\n filters = [referenceToField, \"in\", value || []];\n if(objectName == \"object_fields\"){\n //\u5BF9\u8C61\u4E3Aobject_fields\u65F6\uFF0C\u5FC5\u987B\u52A0\u4E0Aobject\u7684\u8FC7\u6EE4\u6761\u4EF6\n const filtersFunction = ").concat(steedosField.filtersFunction || steedosField._filtersFunction, ";\n if(filtersFunction){\n const _filters = filtersFunction(filters, api.data);\n if(_filters && _filters.length > 0){\n filters = [filters,_filters]\n }\n }\n }\n }else{\n const _steedosField = {\n ...steedosField,\n reference_to: api.data[steedosField.name].o\n }\n const referenceTo = getReferenceToSync(_steedosField);\n const referenceToField = _steedosField.reference_to_field || '_id';\n\n objectName = referenceTo.objectName\n valueFieldKey = referenceTo && referenceTo.valueField?.name || '_id' ;\n labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';\n let value = api.data[_steedosField.name] && api.data[_steedosField.name].ids;\n filters = [referenceToField, \"in\", value || []];\n }\n api.data = {\n query: '{options:' + objectName + '(filters: ' + JSON.stringify(filters) + '){label: ' + labelFieldKey + ',value: ' + valueFieldKey + '}}'\n }\n return api;\n "),
21278
- "trackExpression": "${" + steedosField.name + "}",
21279
- "cache": 3000
21280
- },
21322
+ className: (_e = steedosField.amis) === null || _e === void 0 ? void 0 : _e.className,
21323
+ source: source,
21281
21324
  }, _$1.pick(steedosField.amis || {}, ['className', 'inline', 'label', 'labelAlign', 'name', 'labelRemark', 'description', 'placeholder', 'staticClassName', 'staticLabelClassName', 'staticInputClassName', 'staticSchema']));
21282
21325
  schema.placeholder = "";
21283
21326
  if (hideLabel) {
@@ -21285,12 +21328,12 @@ var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void
21285
21328
  }
21286
21329
  return [2 /*return*/, schema];
21287
21330
  case 2:
21288
- if (!fStatic) return [3 /*break*/, 12];
21331
+ if (!fStatic) return [3 /*break*/, 13];
21289
21332
  if (!props.data.hasOwnProperty("_display")) return [3 /*break*/, 4];
21290
21333
  return [4 /*yield*/, index.convertSFieldToAmisField(steedosField, readonly, ctx)];
21291
21334
  case 3:
21292
21335
  // 有_display时保持原来的逻辑不变,不走以下新的逻辑,审批王中会特意传入_display以跳过后面新加的代码
21293
- return [2 /*return*/, _d.sent()];
21336
+ return [2 /*return*/, _f.sent()];
21294
21337
  case 4:
21295
21338
  schema = Object.assign({}, steedosField, {
21296
21339
  type: getAmisStaticFieldType(steedosField.type, steedosField.data_type, steedosField),
@@ -21303,27 +21346,33 @@ var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void
21303
21346
  timeFormat: 'HH:mm',
21304
21347
  format: '1970-01-01THH:mm:00.000[Z]',
21305
21348
  });
21306
- return [3 /*break*/, 11];
21349
+ return [3 /*break*/, 12];
21307
21350
  case 5:
21308
21351
  if (!(steedosField.type === "percent")) return [3 /*break*/, 6];
21309
21352
  Object.assign(schema, {
21310
21353
  "percent": steedosField.scale ? steedosField.scale : true
21311
21354
  });
21312
- return [3 /*break*/, 11];
21355
+ return [3 /*break*/, 12];
21313
21356
  case 6:
21314
21357
  if (!(steedosField.type === "password")) return [3 /*break*/, 7];
21315
21358
  Object.assign(schema, {
21316
21359
  "revealPassword": false //没生效,需要用样式隐藏
21317
21360
  });
21318
- return [3 /*break*/, 11];
21361
+ return [3 /*break*/, 12];
21319
21362
  case 7:
21320
21363
  if (!(steedosField.type === "select")) return [3 /*break*/, 8];
21321
21364
  Object.assign(schema, {
21322
21365
  "placeholder": ""
21323
21366
  });
21324
- return [3 /*break*/, 11];
21367
+ return [3 /*break*/, 12];
21325
21368
  case 8:
21326
- if (!(steedosField.type === "image")) return [3 /*break*/, 9];
21369
+ if (!(steedosField.type === "color")) return [3 /*break*/, 9];
21370
+ Object.assign(schema, {
21371
+ "defaultColor": null
21372
+ });
21373
+ return [3 /*break*/, 12];
21374
+ case 9:
21375
+ if (!(steedosField.type === "image")) return [3 /*break*/, 10];
21327
21376
  Object.assign(schema, {
21328
21377
  enlargeAble: true,
21329
21378
  showToolbar: true,
@@ -21354,21 +21403,21 @@ var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void
21354
21403
  return value;
21355
21404
  }
21356
21405
  });
21357
- return [3 /*break*/, 11];
21358
- case 9:
21359
- if (!(steedosField.type === "file")) return [3 /*break*/, 11];
21406
+ return [3 /*break*/, 12];
21407
+ case 10:
21408
+ if (!(steedosField.type === "file")) return [3 /*break*/, 12];
21360
21409
  return [4 /*yield*/, index.convertSFieldToAmisField(steedosField, readonly, ctx)];
21361
- case 10:
21410
+ case 11:
21362
21411
  // 附件static模式先保持原来的逻辑,依赖_display,审批王中相关功能在creator中
21363
21412
  // convertSFieldToAmisField中会合并steedosField.amis,所以也不需要再次合并steedosField.amis,直接return就好
21364
- return [2 /*return*/, _d.sent()];
21365
- case 11:
21413
+ return [2 /*return*/, _f.sent()];
21414
+ case 12:
21366
21415
  Object.assign(schema, steedosField.amis || {});
21367
21416
  if (hideLabel) {
21368
21417
  delete schema.label;
21369
21418
  }
21370
21419
  return [2 /*return*/, schema];
21371
- case 12:
21420
+ case 13:
21372
21421
  fieldAmis = steedosField.amis || {};
21373
21422
  if (!props.data.hasOwnProperty("_display")) {
21374
21423
  // 有_display时保持原来的逻辑不变,不走以下新的逻辑,审批王中会特意传入_display以跳过后面新加的代码
@@ -21426,19 +21475,19 @@ var AmisSteedosField = function (props) { return __awaiter(void 0, void 0, void
21426
21475
  }
21427
21476
  }
21428
21477
  return [4 /*yield*/, index.convertSFieldToAmisField(steedosField, readonly, ctx)];
21429
- case 13:
21430
- schema = _d.sent();
21478
+ case 14:
21479
+ schema = _f.sent();
21431
21480
  if (hideLabel) {
21432
21481
  delete schema.label;
21433
21482
  }
21434
21483
  // console.log(`AmisSteedosField return schema`, schema)
21435
21484
  return [2 /*return*/, schema];
21436
- case 14: return [3 /*break*/, 16];
21437
- case 15:
21438
- error_1 = _d.sent();
21485
+ case 15: return [3 /*break*/, 17];
21486
+ case 16:
21487
+ error_1 = _f.sent();
21439
21488
  console.log("error", error_1);
21440
- return [3 /*break*/, 16];
21441
- case 16: return [2 /*return*/, null];
21489
+ return [3 /*break*/, 17];
21490
+ case 17: return [2 /*return*/, null];
21442
21491
  }
21443
21492
  });
21444
21493
  }); };
@@ -21681,7 +21730,7 @@ var AmisInputTable = function (props) { return __awaiter(void 0, void 0, void 0,
21681
21730
  return __generator(this, function (_a) {
21682
21731
  switch (_a.label) {
21683
21732
  case 0:
21684
- props.$schema, props.fields, props.name, props.id, props.data, props.columns, props.amis, props.className, props.tableClassName, props.footerToolbar, props.inlineEditMode;
21733
+ props.$schema, props.fields, props.name, props.id, props.data, props.columns, props.amis, props.className, props.tableClassName, props.headerToolbar, props.footerToolbar, props.inlineEditMode, props.strictMode;
21685
21734
  return [4 /*yield*/, getAmisInputTableSchema(props)];
21686
21735
  case 1:
21687
21736
  amisSchema = _a.sent();