@steedos-widgets/amis-object 3.6.2-beta.1 → 3.6.2-beta.3

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.
@@ -5346,6 +5346,18 @@ async function getTableColumns$1(fields, options){
5346
5346
  if(field.type === 'datetime'){
5347
5347
  className += 'datetime-min-w';
5348
5348
  }
5349
+
5350
+ //field上的amis属性里的clssname需要单独判断类型合并
5351
+ if (typeof field.amis?.className == "object") {
5352
+ className = {
5353
+ [className]: "true",
5354
+ ...field.amis.className
5355
+ };
5356
+ } else if (typeof field.amis?.className == "string") {
5357
+ className = `${className} ${field.amis.className} `;
5358
+ }
5359
+ delete field.amis?.className;
5360
+
5349
5361
  if(!field.hidden && !field.extra){
5350
5362
  columnItem = Object.assign({}, {
5351
5363
  name: field.name,
@@ -5442,12 +5454,24 @@ function getMobileLines(tpls){
5442
5454
  // 右侧半行,这里加样式类 flex flex-shrink-0,是为了省略号只显示在左半行,右半行文字一般比较短,如果也加省略号效果的话,左侧文字多的话,右侧没几个字就显示省略号了
5443
5455
  lineChildrenClassName = "steedos-listview-item-right truncate ml-2 flex flex-shrink-0";
5444
5456
  }
5457
+ //支持字段amis属性配置classname,识别classname的类型,与原样式合并
5458
+ var className;
5459
+ if (typeof item.field.amis?.className == "object") {
5460
+ className = {
5461
+ [lineChildrenClassName]: "true",
5462
+ ...item.field.amis.className
5463
+ };
5464
+ } else if (typeof item.field.amis?.className == "string") {
5465
+ className = `${lineChildrenClassName} ${item.field.amis.className} `;
5466
+ } else {
5467
+ className = lineChildrenClassName;
5468
+ }
5445
5469
  lineChildren.push({
5446
5470
  "type": "tpl",
5447
5471
  "tpl": item.tpl,
5448
- "className": lineChildrenClassName
5472
+ className
5449
5473
  });
5450
-
5474
+
5451
5475
  if(item.field.is_wide){
5452
5476
  // 宽字段占整行
5453
5477
  isLeft = true;
@@ -5497,8 +5521,7 @@ async function getMobileTableColumns(fields, options){
5497
5521
  tpl = await getFieldTpl(field, options);
5498
5522
  }
5499
5523
  if(!tpl){
5500
- //qhd需求简易处理,加上raw以支持审批王名称字段通过颜色区分缓急,若之后手机端列表支持配置amis,则可以去掉
5501
- tpl = `\${${field.name} | raw}`;
5524
+ tpl = `\${${field.name}}`;
5502
5525
  }
5503
5526
  if(!field.hidden && !field.extra){
5504
5527
  tpls.push({ field, tpl });
@@ -5511,7 +5534,7 @@ async function getMobileTableColumns(fields, options){
5511
5534
 
5512
5535
  let column = {
5513
5536
  name: nameField.name,
5514
- label: nameField.label,
5537
+ label: options.displayAs == 'split' ? '' : nameField.label,
5515
5538
  sortable: nameField.sortable,
5516
5539
  type: "button",
5517
5540
  level: "link",
@@ -6171,6 +6194,13 @@ async function getTableApi(mainObject, fields, options){
6171
6194
  }
6172
6195
  // SteedosUI.getRef(api.body.$self.$scopeId)?.parent?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})
6173
6196
  };
6197
+ const listviewComponent = $(".steedos-object-listview .antd-Table-table");
6198
+ const firstListviewComponent = listviewComponent && listviewComponent[0];
6199
+ if(firstListviewComponent){
6200
+ setTimeout(()=>{
6201
+ firstListviewComponent.scrollIntoView();
6202
+ }, 600);
6203
+ }
6174
6204
  ${options.adaptor || ''}
6175
6205
  return payload;
6176
6206
  `;
@@ -6550,6 +6580,18 @@ function getBatchDelete(objectName){
6550
6580
  return {
6551
6581
  method: 'post',
6552
6582
  url: getApi$2(),
6583
+ adaptor: `
6584
+ if(payload.errors){
6585
+ payload.data.deleteErrorMessage = [];
6586
+ payload.errors.forEach(function(error){
6587
+ let errorRecord = error.path.map(function (item) {
6588
+ return item.split('delete__')[1].to_float() + 1;
6589
+ }).toString();
6590
+ payload.data.deleteErrorMessage.push("第" + errorRecord + "条记录删除出现异常,报错信息为(" + (window.t ? window.t(error.message) : error.message) + ")");
6591
+ })
6592
+ }
6593
+ return payload;
6594
+ `,
6553
6595
  requestAdaptor: `
6554
6596
  var ids = api.data.ids.split(",");
6555
6597
  var deleteArray = [];
@@ -11268,7 +11310,6 @@ function getObjectFooterToolbar(mainObject, formFactor, options) {
11268
11310
  else {
11269
11311
  if(options && options.isRelated){
11270
11312
  return [
11271
- "statistics",
11272
11313
  {
11273
11314
  "type": "pagination",
11274
11315
  "maxButtons": 10,
@@ -11281,7 +11322,6 @@ function getObjectFooterToolbar(mainObject, formFactor, options) {
11281
11322
  const no_pagination = mainObject.paging && (mainObject.paging.enabled === false);
11282
11323
  const is_lookup = options.isLookup;
11283
11324
  const commonConfig = [
11284
- "statistics",
11285
11325
  {
11286
11326
  "type": "pagination",
11287
11327
  "maxButtons": 10,
@@ -11400,6 +11440,29 @@ function getBulkActions(objectSchema){
11400
11440
  "className": "hidden",
11401
11441
  "id": "batchDelete",
11402
11442
  "api": getBatchDelete(objectSchema.name),
11443
+ "feedback": {
11444
+ "title": "删除警告",
11445
+ "visibleOn": "${deleteErrorMessage}",
11446
+ "body": [
11447
+ {
11448
+ "type": "each",
11449
+ "name": "deleteErrorMessage",
11450
+ "items": {
11451
+ "type": "alert",
11452
+ "body": "${item}",
11453
+ "level": "danger",
11454
+ "className": "mb-3"
11455
+ }
11456
+ }
11457
+ ],
11458
+ "actions": [
11459
+ {
11460
+ "type": "button",
11461
+ "actionType": "close",
11462
+ "label": "关闭"
11463
+ }
11464
+ ]
11465
+ }
11403
11466
  }
11404
11467
  // {
11405
11468
  // "label": "批量修改",
@@ -11546,6 +11609,10 @@ async function getObjectCRUD(objectSchema, fields, options){
11546
11609
  const rowsDiff = _.cloneDeep(api.data.rowsDiff);
11547
11610
  rowsDiff.forEach(function (item, index) {
11548
11611
  for(key in item){
11612
+ // image、select等字段清空值后保存的空字符串转换为null。
11613
+ if(item[key] === ''){
11614
+ item[key] = null;
11615
+ }
11549
11616
  if(_.includes(imageNames, key)){
11550
11617
  if(typeof item[key] == "string"){
11551
11618
  const match = item[key].match(/\\/([^\\/]+)$/);
@@ -13938,9 +14005,11 @@ async function lookupToAmisPicker(field, readonly, ctx){
13938
14005
  */
13939
14006
  if(enable_tree){
13940
14007
  const rows = _.map(payload.data.rows, (item)=>{
13941
- delete item.children;
13942
- delete item.parent;
13943
- return item;
14008
+ if (!item.children) {
14009
+ return { ...item, children: [] };
14010
+ } else {
14011
+ return item;
14012
+ }
13944
14013
  })
13945
14014
  payload.data.rows = rows;
13946
14015
  }
@@ -15846,8 +15915,8 @@ async function getFormBody(permissionFields, formFields, ctx){
15846
15915
  /*
15847
15916
  * @Author: 殷亮辉 yinlianghui@hotoa.com
15848
15917
  * @Date: 2023-11-15 09:50:22
15849
- * @LastEditors: liaodaxue
15850
- * @LastEditTime: 2024-01-09 18:12:28
15918
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
15919
+ * @LastEditTime: 2024-01-12 14:51:00
15851
15920
  */
15852
15921
 
15853
15922
  /**
@@ -15996,7 +16065,12 @@ function getFormPagination(props, mode) {
15996
16065
  let currentIndex = event.data.index;
15997
16066
  // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量__tableItems中
15998
16067
  let currentFormValues = scope.getComponentById(__formId).getValues();
15999
- fieldValue[currentIndex] = currentFormValues;
16068
+ if(event.data.parent){
16069
+ fieldValue[event.data.__parentIndex].children[currentIndex] = currentFormValues;
16070
+ }
16071
+ else{
16072
+ fieldValue[currentIndex] = currentFormValues;
16073
+ }
16000
16074
  // 翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,所以额外给正式表单字段执行一次setValue
16001
16075
  doAction({
16002
16076
  "componentId": "${props.id}",
@@ -16063,7 +16137,8 @@ function getFormPagination(props, mode) {
16063
16137
  },
16064
16138
  {
16065
16139
  "type": "tpl",
16066
- "tpl": "${__page}/${__tableItems.length}"
16140
+ // 这里用__super.parent,加__super是为了防止当前记录有字段名为parent的重名变量
16141
+ "tpl": "${__page}/${__super.parent ? __tableItems[__parentIndex]['children'].length : __tableItems.length}"
16067
16142
  },
16068
16143
  {
16069
16144
  "type": "button",
@@ -16071,7 +16146,9 @@ function getFormPagination(props, mode) {
16071
16146
  "icon": `fa fa-angle-right`,
16072
16147
  "level": "link",
16073
16148
  "pageChangeDirection": "next",
16074
- "disabledOn": showPagination ? "${__page >= __tableItems.length}" : "true",
16149
+ // "disabledOn": showPagination ? "${__page >= __tableItems.length}" : "true",
16150
+ // 这里用__super.parent,加__super是为了防止当前记录有字段名为parent的重名变量
16151
+ "disabledOn": showPagination ? "${__page >= (__super.parent ? __tableItems[__parentIndex]['children'].length : __tableItems.length)}" : "true",
16075
16152
  "size": "sm",
16076
16153
  "id": buttonNextId,
16077
16154
  "onEvent": {
@@ -16104,7 +16181,7 @@ function getFormPaginationWrapper(props, form, mode) {
16104
16181
  "data": {
16105
16182
  // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
16106
16183
  // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
16107
- "&": "${__tableItems[__super.index]}"
16184
+ "&": "${__super.parent ? __tableItems[__parentIndex]['children'][__super.index] : __tableItems[__super.index]}"
16108
16185
  }
16109
16186
  });
16110
16187
  let formBody = [
@@ -16127,6 +16204,10 @@ function getFormPaginationWrapper(props, form, mode) {
16127
16204
  }
16128
16205
  ];
16129
16206
  let onServiceInitedScript = `
16207
+ if(event.data.parent){
16208
+ // 如果是子行,即在节点嵌套情况下,当前节点如果是children属性下的子节点时,则算出其所属父行的索引值
16209
+ event.data.__parentIndex = _.findIndex(event.data.__tableItems, {_id: event.data.parent._id});
16210
+ }
16130
16211
  // 以下脚本是为了解决有时弹出编辑表单时,表单中的值比最后一次编辑保存的值会延迟一拍。
16131
16212
  // 比如:inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
16132
16213
  // 另外有的地方在非inlineEditMode模式时也会有这种延迟一拍问题,比如对象字段中下拉框类型字段的”选择项“属性
@@ -16182,6 +16263,7 @@ function getFormPaginationWrapper(props, form, mode) {
16182
16263
  // "body": formBody,
16183
16264
  "data": {
16184
16265
  "__page": "${index + 1}",
16266
+ "__parentIndex": null,//兼容节点嵌套情况,即节点中有children属性时,这里记录当前节点所属上层节点index,只支持向上找一层,不支持多层
16185
16267
  // "__total": `\${${props.name}.length}`,
16186
16268
  // "__total": "${__tableItems.length}",
16187
16269
  // "__paginationServiceId": serviceId,
@@ -16229,7 +16311,17 @@ async function getForm(props, mode = "edit", formId) {
16229
16311
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
16230
16312
  //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
16231
16313
  // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
16232
- fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
16314
+ // fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
16315
+ var currentIndex = event.data.__super.__super.index;
16316
+ var currentFormValues = JSON.parse(JSON.stringify(event.data));
16317
+ var parent = event.data.__super.__super.parent;
16318
+ var __parentIndex = event.data.__super.__super.__parentIndex;
16319
+ if(parent){
16320
+ fieldValue[__parentIndex].children[currentIndex] = currentFormValues;
16321
+ }
16322
+ else{
16323
+ fieldValue[currentIndex] = currentFormValues;
16324
+ }
16233
16325
  doAction({
16234
16326
  "componentId": "${props.id}",
16235
16327
  "actionType": "setValue",
@@ -16369,7 +16461,14 @@ async function getButtonActions(props, mode) {
16369
16461
  let scope = event.context.scoped;
16370
16462
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
16371
16463
  // 新建一条空白行并保存到子表组件
16372
- fieldValue.push({});
16464
+ var parent = event.data.__super.parent;
16465
+ var __parentIndex = parent && _.findIndex(fieldValue, {_id: parent._id});
16466
+ if(parent){
16467
+ fieldValue[__parentIndex].children.push({});
16468
+ }
16469
+ else{
16470
+ fieldValue.push({});
16471
+ }
16373
16472
  doAction({
16374
16473
  "componentId": "${props.id}",
16375
16474
  "actionType": "setValue",
@@ -16381,7 +16480,13 @@ async function getButtonActions(props, mode) {
16381
16480
  let __paginationServiceId = "${formPaginationId}";
16382
16481
  let __paginationData = scope.getComponentById(__paginationServiceId).getData();
16383
16482
  event.data.index = __paginationData.index;
16384
- event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16483
+ if(parent){
16484
+ event.data.__page = fieldValue[__parentIndex].children.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16485
+ event.data.__parentIndex = __parentIndex; //执行下面的翻页按钮事件中依赖了__parentIndex值
16486
+ }
16487
+ else{
16488
+ event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16489
+ }
16385
16490
  // 触发翻页按钮事件,实现保存当前页数据并跳转到最后一行
16386
16491
  scope.getComponentById(buttonNextId).props.dispatchEvent("click", event.data);
16387
16492
  `;
@@ -16392,7 +16497,15 @@ async function getButtonActions(props, mode) {
16392
16497
  let newItem = scope.getComponentById(__formId).getValues();//这里不可以用event.data,因为其拿到的是弹出表单时的初始值,不是用户实时填写的数据
16393
16498
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
16394
16499
  // 复制当前页数据到新建行并保存到子表组件
16395
- fieldValue.push(newItem);
16500
+ // fieldValue.push(newItem);
16501
+ var parent = event.data.__super.parent;
16502
+ var __parentIndex = parent && _.findIndex(fieldValue, {_id: parent._id});
16503
+ if(parent){
16504
+ fieldValue[__parentIndex].children.push(newItem);
16505
+ }
16506
+ else{
16507
+ fieldValue.push(newItem);
16508
+ }
16396
16509
  doAction({
16397
16510
  "componentId": "${props.id}",
16398
16511
  "actionType": "setValue",
@@ -16404,7 +16517,14 @@ async function getButtonActions(props, mode) {
16404
16517
  let __paginationServiceId = "${formPaginationId}";
16405
16518
  let __paginationData = scope.getComponentById(__paginationServiceId).getData();
16406
16519
  event.data.index = __paginationData.index;
16407
- event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16520
+ // event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16521
+ if(parent){
16522
+ event.data.__page = fieldValue[__parentIndex].children.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16523
+ event.data.__parentIndex = __parentIndex; //执行下面的翻页按钮事件中依赖了__parentIndex值
16524
+ }
16525
+ else{
16526
+ event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
16527
+ }
16408
16528
  // 触发翻页按钮事件,实现保存当前页数据并跳转到最后一行
16409
16529
  scope.getComponentById(buttonNextId).props.dispatchEvent("click", event.data);
16410
16530
  `;
@@ -16480,7 +16600,8 @@ async function getButtonActions(props, mode) {
16480
16600
  "_master": "${_master}",
16481
16601
  "global": "${global}",
16482
16602
  "uiSchema": "${uiSchema}",
16483
- "index": "${index}",
16603
+ "index": "${index}",//amis组件自带行索引,在节点嵌套情况下,当前节点如果是children属性下的子节点时,这里的index是当前节点在children中的索引,而不是外层父节点的index
16604
+ "parent": "${parent}",//amis组件自带父节点数据域数据,即节点嵌套情况下,当前节点为某个节点(比如A节点)的children属性下的子节点时,当前节点的父节点(即A节点)的数据域数据
16484
16605
  // "__tableItems": `\${${props.name}}`
16485
16606
  // 为了解决"弹出的dialog窗口中子表组件会影响页面布局界面中父作用域字段值",比如设计字段布局微页面中的设置分组功能,弹出的就是子表dialog
16486
16607
  // 所以这里使用json|toJson转一次,断掉event.data.__tableItems与上层任用域中props.name的联系
@@ -16508,35 +16629,39 @@ async function getButtonActions(props, mode) {
16508
16629
  Object.assign(actionShowEditDialog.dialog, props.dialog);
16509
16630
  }
16510
16631
  if (mode == "new") {
16511
- `
16512
- let newItem = {};
16513
- if(event.data["${props.name}"]){
16514
- // let fieldValue = event.data.__tableItems;
16515
- // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
16516
- // let fieldValue = _.clone(event.data["${props.name}"]);
16517
- let fieldValue = event.data["${props.name}"];
16518
- fieldValue.push(newItem);
16519
- doAction({
16520
- "componentId": "${props.id}",
16521
- "actionType": "setValue",
16522
- "args": {
16523
- "value": fieldValue
16524
- }
16525
- });
16526
- event.data.index = fieldValue.length - 1;
16527
- }
16528
- else{
16529
- // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
16530
- doAction({
16531
- "componentId": "${props.id}",
16532
- "actionType": "setValue",
16533
- "args": {
16534
- "value": [newItem]
16535
- }
16536
- });
16537
- event.data.index = 1;
16538
- }
16539
- `;
16632
+ // let onNewLineScript = `
16633
+ // let newItem = {};
16634
+ // if(event.data["${props.name}"]){
16635
+ // // let fieldValue = event.data.__tableItems;
16636
+ // // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
16637
+ // // let fieldValue = _.clone(event.data["${props.name}"]);
16638
+ // let fieldValue = event.data["${props.name}"];
16639
+ // fieldValue.push(newItem);
16640
+ // doAction({
16641
+ // "componentId": "${props.id}",
16642
+ // "actionType": "setValue",
16643
+ // "args": {
16644
+ // "value": fieldValue
16645
+ // }
16646
+ // });
16647
+ // event.data.index = fieldValue.length - 1;
16648
+ // }
16649
+ // else{
16650
+ // // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
16651
+ // doAction({
16652
+ // "componentId": "${props.id}",
16653
+ // "actionType": "setValue",
16654
+ // "args": {
16655
+ // "value": [newItem]
16656
+ // }
16657
+ // });
16658
+ // event.data.index = 1;
16659
+ // }
16660
+ // `;
16661
+ // let actionNewLine = {
16662
+ // "actionType": "custom",
16663
+ // "script": onNewLineScript
16664
+ // };
16540
16665
  // 新增行时不需要在弹出编辑表单前先加一行,因为会在编辑表单所在service初始化时判断到是新增就自动增加一行,因为这里拿不到event.data.__tableItems,也无法变更其值
16541
16666
  // actions = [actionNewLine, actionShowEditDialog];
16542
16667
  actions = [actionShowEditDialog];
@@ -16595,7 +16720,15 @@ async function getButtonActions(props, mode) {
16595
16720
  // 这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
16596
16721
  // 这里_.clone是因为字段设计布局设置分组这种弹出窗口中的子表组件,直接删除后,点取消无法还原
16597
16722
  let lastestFieldValue = _.clone(wrapperServiceData["${props.name}"]);
16598
- lastestFieldValue.splice(event.data.index, 1);
16723
+ var currentIndex = event.data.index;
16724
+ var parent = event.data.__super.parent;
16725
+ var __parentIndex = parent && _.findIndex(lastestFieldValue, {_id: parent._id});
16726
+ if(parent){
16727
+ lastestFieldValue[__parentIndex].children.splice(currentIndex, 1);
16728
+ }
16729
+ else{
16730
+ lastestFieldValue.splice(currentIndex, 1);
16731
+ }
16599
16732
  doAction({
16600
16733
  "componentId": "${props.id}",
16601
16734
  "actionType": "setValue",