@steedos-widgets/amis-lib 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.
package/dist/index.cjs.js CHANGED
@@ -2192,6 +2192,18 @@ async function getTableColumns(fields, options){
2192
2192
  if(field.type === 'datetime'){
2193
2193
  className += 'datetime-min-w';
2194
2194
  }
2195
+
2196
+ //field上的amis属性里的clssname需要单独判断类型合并
2197
+ if (typeof field.amis?.className == "object") {
2198
+ className = {
2199
+ [className]: "true",
2200
+ ...field.amis.className
2201
+ };
2202
+ } else if (typeof field.amis?.className == "string") {
2203
+ className = `${className} ${field.amis.className} `;
2204
+ }
2205
+ delete field.amis?.className;
2206
+
2195
2207
  if(!field.hidden && !field.extra){
2196
2208
  columnItem = Object.assign({}, {
2197
2209
  name: field.name,
@@ -2288,12 +2300,24 @@ function getMobileLines(tpls){
2288
2300
  // 右侧半行,这里加样式类 flex flex-shrink-0,是为了省略号只显示在左半行,右半行文字一般比较短,如果也加省略号效果的话,左侧文字多的话,右侧没几个字就显示省略号了
2289
2301
  lineChildrenClassName = "steedos-listview-item-right truncate ml-2 flex flex-shrink-0";
2290
2302
  }
2303
+ //支持字段amis属性配置classname,识别classname的类型,与原样式合并
2304
+ var className;
2305
+ if (typeof item.field.amis?.className == "object") {
2306
+ className = {
2307
+ [lineChildrenClassName]: "true",
2308
+ ...item.field.amis.className
2309
+ };
2310
+ } else if (typeof item.field.amis?.className == "string") {
2311
+ className = `${lineChildrenClassName} ${item.field.amis.className} `;
2312
+ } else {
2313
+ className = lineChildrenClassName;
2314
+ }
2291
2315
  lineChildren.push({
2292
2316
  "type": "tpl",
2293
2317
  "tpl": item.tpl,
2294
- "className": lineChildrenClassName
2318
+ className
2295
2319
  });
2296
-
2320
+
2297
2321
  if(item.field.is_wide){
2298
2322
  // 宽字段占整行
2299
2323
  isLeft = true;
@@ -2343,8 +2367,7 @@ async function getMobileTableColumns(fields, options){
2343
2367
  tpl = await getFieldTpl(field, options);
2344
2368
  }
2345
2369
  if(!tpl){
2346
- //qhd需求简易处理,加上raw以支持审批王名称字段通过颜色区分缓急,若之后手机端列表支持配置amis,则可以去掉
2347
- tpl = `\${${field.name} | raw}`;
2370
+ tpl = `\${${field.name}}`;
2348
2371
  }
2349
2372
  if(!field.hidden && !field.extra){
2350
2373
  tpls.push({ field, tpl });
@@ -2357,7 +2380,7 @@ async function getMobileTableColumns(fields, options){
2357
2380
 
2358
2381
  let column = {
2359
2382
  name: nameField.name,
2360
- label: nameField.label,
2383
+ label: options.displayAs == 'split' ? '' : nameField.label,
2361
2384
  sortable: nameField.sortable,
2362
2385
  type: "button",
2363
2386
  level: "link",
@@ -3017,6 +3040,13 @@ async function getTableApi(mainObject, fields, options){
3017
3040
  }
3018
3041
  // SteedosUI.getRef(api.body.$self.$scopeId)?.parent?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})
3019
3042
  };
3043
+ const listviewComponent = $(".steedos-object-listview .antd-Table-table");
3044
+ const firstListviewComponent = listviewComponent && listviewComponent[0];
3045
+ if(firstListviewComponent){
3046
+ setTimeout(()=>{
3047
+ firstListviewComponent.scrollIntoView();
3048
+ }, 600);
3049
+ }
3020
3050
  ${options.adaptor || ''}
3021
3051
  return payload;
3022
3052
  `;
@@ -3396,6 +3426,18 @@ function getBatchDelete(objectName){
3396
3426
  return {
3397
3427
  method: 'post',
3398
3428
  url: getApi$2(),
3429
+ adaptor: `
3430
+ if(payload.errors){
3431
+ payload.data.deleteErrorMessage = [];
3432
+ payload.errors.forEach(function(error){
3433
+ let errorRecord = error.path.map(function (item) {
3434
+ return item.split('delete__')[1].to_float() + 1;
3435
+ }).toString();
3436
+ payload.data.deleteErrorMessage.push("第" + errorRecord + "条记录删除出现异常,报错信息为(" + (window.t ? window.t(error.message) : error.message) + ")");
3437
+ })
3438
+ }
3439
+ return payload;
3440
+ `,
3399
3441
  requestAdaptor: `
3400
3442
  var ids = api.data.ids.split(",");
3401
3443
  var deleteArray = [];
@@ -8114,7 +8156,6 @@ function getObjectFooterToolbar(mainObject, formFactor, options) {
8114
8156
  else {
8115
8157
  if(options && options.isRelated){
8116
8158
  return [
8117
- "statistics",
8118
8159
  {
8119
8160
  "type": "pagination",
8120
8161
  "maxButtons": 10,
@@ -8127,7 +8168,6 @@ function getObjectFooterToolbar(mainObject, formFactor, options) {
8127
8168
  const no_pagination = mainObject.paging && (mainObject.paging.enabled === false);
8128
8169
  const is_lookup = options.isLookup;
8129
8170
  const commonConfig = [
8130
- "statistics",
8131
8171
  {
8132
8172
  "type": "pagination",
8133
8173
  "maxButtons": 10,
@@ -8246,6 +8286,29 @@ function getBulkActions(objectSchema){
8246
8286
  "className": "hidden",
8247
8287
  "id": "batchDelete",
8248
8288
  "api": getBatchDelete(objectSchema.name),
8289
+ "feedback": {
8290
+ "title": "删除警告",
8291
+ "visibleOn": "${deleteErrorMessage}",
8292
+ "body": [
8293
+ {
8294
+ "type": "each",
8295
+ "name": "deleteErrorMessage",
8296
+ "items": {
8297
+ "type": "alert",
8298
+ "body": "${item}",
8299
+ "level": "danger",
8300
+ "className": "mb-3"
8301
+ }
8302
+ }
8303
+ ],
8304
+ "actions": [
8305
+ {
8306
+ "type": "button",
8307
+ "actionType": "close",
8308
+ "label": "关闭"
8309
+ }
8310
+ ]
8311
+ }
8249
8312
  }
8250
8313
  // {
8251
8314
  // "label": "批量修改",
@@ -8392,6 +8455,10 @@ async function getObjectCRUD(objectSchema, fields, options){
8392
8455
  const rowsDiff = _.cloneDeep(api.data.rowsDiff);
8393
8456
  rowsDiff.forEach(function (item, index) {
8394
8457
  for(key in item){
8458
+ // image、select等字段清空值后保存的空字符串转换为null。
8459
+ if(item[key] === ''){
8460
+ item[key] = null;
8461
+ }
8395
8462
  if(_.includes(imageNames, key)){
8396
8463
  if(typeof item[key] == "string"){
8397
8464
  const match = item[key].match(/\\/([^\\/]+)$/);
@@ -10784,9 +10851,11 @@ async function lookupToAmisPicker(field, readonly, ctx){
10784
10851
  */
10785
10852
  if(enable_tree){
10786
10853
  const rows = _.map(payload.data.rows, (item)=>{
10787
- delete item.children;
10788
- delete item.parent;
10789
- return item;
10854
+ if (!item.children) {
10855
+ return { ...item, children: [] };
10856
+ } else {
10857
+ return item;
10858
+ }
10790
10859
  })
10791
10860
  payload.data.rows = rows;
10792
10861
  }
@@ -12692,8 +12761,8 @@ async function getFormBody(permissionFields, formFields, ctx){
12692
12761
  /*
12693
12762
  * @Author: 殷亮辉 yinlianghui@hotoa.com
12694
12763
  * @Date: 2023-11-15 09:50:22
12695
- * @LastEditors: liaodaxue
12696
- * @LastEditTime: 2024-01-09 18:12:28
12764
+ * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
12765
+ * @LastEditTime: 2024-01-12 14:51:00
12697
12766
  */
12698
12767
 
12699
12768
  /**
@@ -12842,7 +12911,12 @@ function getFormPagination(props, mode) {
12842
12911
  let currentIndex = event.data.index;
12843
12912
  // 翻页到下一页之前需要先把当前页改动的内容保存到中间变量__tableItems中
12844
12913
  let currentFormValues = scope.getComponentById(__formId).getValues();
12845
- fieldValue[currentIndex] = currentFormValues;
12914
+ if(event.data.parent){
12915
+ fieldValue[event.data.__parentIndex].children[currentIndex] = currentFormValues;
12916
+ }
12917
+ else{
12918
+ fieldValue[currentIndex] = currentFormValues;
12919
+ }
12846
12920
  // 翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,所以额外给正式表单字段执行一次setValue
12847
12921
  doAction({
12848
12922
  "componentId": "${props.id}",
@@ -12909,7 +12983,8 @@ function getFormPagination(props, mode) {
12909
12983
  },
12910
12984
  {
12911
12985
  "type": "tpl",
12912
- "tpl": "${__page}/${__tableItems.length}"
12986
+ // 这里用__super.parent,加__super是为了防止当前记录有字段名为parent的重名变量
12987
+ "tpl": "${__page}/${__super.parent ? __tableItems[__parentIndex]['children'].length : __tableItems.length}"
12913
12988
  },
12914
12989
  {
12915
12990
  "type": "button",
@@ -12917,7 +12992,9 @@ function getFormPagination(props, mode) {
12917
12992
  "icon": `fa fa-angle-right`,
12918
12993
  "level": "link",
12919
12994
  "pageChangeDirection": "next",
12920
- "disabledOn": showPagination ? "${__page >= __tableItems.length}" : "true",
12995
+ // "disabledOn": showPagination ? "${__page >= __tableItems.length}" : "true",
12996
+ // 这里用__super.parent,加__super是为了防止当前记录有字段名为parent的重名变量
12997
+ "disabledOn": showPagination ? "${__page >= (__super.parent ? __tableItems[__parentIndex]['children'].length : __tableItems.length)}" : "true",
12921
12998
  "size": "sm",
12922
12999
  "id": buttonNextId,
12923
13000
  "onEvent": {
@@ -12950,7 +13027,7 @@ function getFormPaginationWrapper(props, form, mode) {
12950
13027
  "data": {
12951
13028
  // 这里加__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
12952
13029
  // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
12953
- "&": "${__tableItems[__super.index]}"
13030
+ "&": "${__super.parent ? __tableItems[__parentIndex]['children'][__super.index] : __tableItems[__super.index]}"
12954
13031
  }
12955
13032
  });
12956
13033
  let formBody = [
@@ -12973,6 +13050,10 @@ function getFormPaginationWrapper(props, form, mode) {
12973
13050
  }
12974
13051
  ];
12975
13052
  let onServiceInitedScript = `
13053
+ if(event.data.parent){
13054
+ // 如果是子行,即在节点嵌套情况下,当前节点如果是children属性下的子节点时,则算出其所属父行的索引值
13055
+ event.data.__parentIndex = _.findIndex(event.data.__tableItems, {_id: event.data.parent._id});
13056
+ }
12976
13057
  // 以下脚本是为了解决有时弹出编辑表单时,表单中的值比最后一次编辑保存的值会延迟一拍。
12977
13058
  // 比如:inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
12978
13059
  // 另外有的地方在非inlineEditMode模式时也会有这种延迟一拍问题,比如对象字段中下拉框类型字段的”选择项“属性
@@ -13028,6 +13109,7 @@ function getFormPaginationWrapper(props, form, mode) {
13028
13109
  // "body": formBody,
13029
13110
  "data": {
13030
13111
  "__page": "${index + 1}",
13112
+ "__parentIndex": null,//兼容节点嵌套情况,即节点中有children属性时,这里记录当前节点所属上层节点index,只支持向上找一层,不支持多层
13031
13113
  // "__total": `\${${props.name}.length}`,
13032
13114
  // "__total": "${__tableItems.length}",
13033
13115
  // "__paginationServiceId": serviceId,
@@ -13075,7 +13157,17 @@ async function getForm(props, mode = "edit", formId) {
13075
13157
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
13076
13158
  //这里加__super.__super前缀是因为__parentForm变量(即主表单)中可能会正好有名为index的字段
13077
13159
  // 比如“对象字段”对象options字段是一个子表字段,但是主表(即“对象字段”对象)中正好有一个名为index的字段
13078
- fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
13160
+ // fieldValue[event.data.__super.__super.index] = JSON.parse(JSON.stringify(event.data));
13161
+ var currentIndex = event.data.__super.__super.index;
13162
+ var currentFormValues = JSON.parse(JSON.stringify(event.data));
13163
+ var parent = event.data.__super.__super.parent;
13164
+ var __parentIndex = event.data.__super.__super.__parentIndex;
13165
+ if(parent){
13166
+ fieldValue[__parentIndex].children[currentIndex] = currentFormValues;
13167
+ }
13168
+ else{
13169
+ fieldValue[currentIndex] = currentFormValues;
13170
+ }
13079
13171
  doAction({
13080
13172
  "componentId": "${props.id}",
13081
13173
  "actionType": "setValue",
@@ -13215,7 +13307,14 @@ async function getButtonActions(props, mode) {
13215
13307
  let scope = event.context.scoped;
13216
13308
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
13217
13309
  // 新建一条空白行并保存到子表组件
13218
- fieldValue.push({});
13310
+ var parent = event.data.__super.parent;
13311
+ var __parentIndex = parent && _.findIndex(fieldValue, {_id: parent._id});
13312
+ if(parent){
13313
+ fieldValue[__parentIndex].children.push({});
13314
+ }
13315
+ else{
13316
+ fieldValue.push({});
13317
+ }
13219
13318
  doAction({
13220
13319
  "componentId": "${props.id}",
13221
13320
  "actionType": "setValue",
@@ -13227,7 +13326,13 @@ async function getButtonActions(props, mode) {
13227
13326
  let __paginationServiceId = "${formPaginationId}";
13228
13327
  let __paginationData = scope.getComponentById(__paginationServiceId).getData();
13229
13328
  event.data.index = __paginationData.index;
13230
- event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13329
+ if(parent){
13330
+ event.data.__page = fieldValue[__parentIndex].children.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13331
+ event.data.__parentIndex = __parentIndex; //执行下面的翻页按钮事件中依赖了__parentIndex值
13332
+ }
13333
+ else{
13334
+ event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13335
+ }
13231
13336
  // 触发翻页按钮事件,实现保存当前页数据并跳转到最后一行
13232
13337
  scope.getComponentById(buttonNextId).props.dispatchEvent("click", event.data);
13233
13338
  `;
@@ -13238,7 +13343,15 @@ async function getButtonActions(props, mode) {
13238
13343
  let newItem = scope.getComponentById(__formId).getValues();//这里不可以用event.data,因为其拿到的是弹出表单时的初始值,不是用户实时填写的数据
13239
13344
  let fieldValue = event.data.__tableItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.__tableItems,直接变更其值即可改变表单中的值
13240
13345
  // 复制当前页数据到新建行并保存到子表组件
13241
- fieldValue.push(newItem);
13346
+ // fieldValue.push(newItem);
13347
+ var parent = event.data.__super.parent;
13348
+ var __parentIndex = parent && _.findIndex(fieldValue, {_id: parent._id});
13349
+ if(parent){
13350
+ fieldValue[__parentIndex].children.push(newItem);
13351
+ }
13352
+ else{
13353
+ fieldValue.push(newItem);
13354
+ }
13242
13355
  doAction({
13243
13356
  "componentId": "${props.id}",
13244
13357
  "actionType": "setValue",
@@ -13250,7 +13363,14 @@ async function getButtonActions(props, mode) {
13250
13363
  let __paginationServiceId = "${formPaginationId}";
13251
13364
  let __paginationData = scope.getComponentById(__paginationServiceId).getData();
13252
13365
  event.data.index = __paginationData.index;
13253
- event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13366
+ // event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13367
+ if(parent){
13368
+ event.data.__page = fieldValue[__parentIndex].children.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13369
+ event.data.__parentIndex = __parentIndex; //执行下面的翻页按钮事件中依赖了__parentIndex值
13370
+ }
13371
+ else{
13372
+ event.data.__page = fieldValue.length - 1;//这里不可以用Object.assign否则,event.data中上层作用域数据会丢失
13373
+ }
13254
13374
  // 触发翻页按钮事件,实现保存当前页数据并跳转到最后一行
13255
13375
  scope.getComponentById(buttonNextId).props.dispatchEvent("click", event.data);
13256
13376
  `;
@@ -13326,7 +13446,8 @@ async function getButtonActions(props, mode) {
13326
13446
  "_master": "${_master}",
13327
13447
  "global": "${global}",
13328
13448
  "uiSchema": "${uiSchema}",
13329
- "index": "${index}",
13449
+ "index": "${index}",//amis组件自带行索引,在节点嵌套情况下,当前节点如果是children属性下的子节点时,这里的index是当前节点在children中的索引,而不是外层父节点的index
13450
+ "parent": "${parent}",//amis组件自带父节点数据域数据,即节点嵌套情况下,当前节点为某个节点(比如A节点)的children属性下的子节点时,当前节点的父节点(即A节点)的数据域数据
13330
13451
  // "__tableItems": `\${${props.name}}`
13331
13452
  // 为了解决"弹出的dialog窗口中子表组件会影响页面布局界面中父作用域字段值",比如设计字段布局微页面中的设置分组功能,弹出的就是子表dialog
13332
13453
  // 所以这里使用json|toJson转一次,断掉event.data.__tableItems与上层任用域中props.name的联系
@@ -13354,35 +13475,39 @@ async function getButtonActions(props, mode) {
13354
13475
  Object.assign(actionShowEditDialog.dialog, props.dialog);
13355
13476
  }
13356
13477
  if (mode == "new") {
13357
- `
13358
- let newItem = {};
13359
- if(event.data["${props.name}"]){
13360
- // let fieldValue = event.data.__tableItems;
13361
- // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
13362
- // let fieldValue = _.clone(event.data["${props.name}"]);
13363
- let fieldValue = event.data["${props.name}"];
13364
- fieldValue.push(newItem);
13365
- doAction({
13366
- "componentId": "${props.id}",
13367
- "actionType": "setValue",
13368
- "args": {
13369
- "value": fieldValue
13370
- }
13371
- });
13372
- event.data.index = fieldValue.length - 1;
13373
- }
13374
- else{
13375
- // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
13376
- doAction({
13377
- "componentId": "${props.id}",
13378
- "actionType": "setValue",
13379
- "args": {
13380
- "value": [newItem]
13381
- }
13382
- });
13383
- event.data.index = 1;
13384
- }
13385
- `;
13478
+ // let onNewLineScript = `
13479
+ // let newItem = {};
13480
+ // if(event.data["${props.name}"]){
13481
+ // // let fieldValue = event.data.__tableItems;
13482
+ // // 这里不用__tableItems是因为新建的时候没有翻页,里面没有也不需要走__tableItems变量
13483
+ // // let fieldValue = _.clone(event.data["${props.name}"]);
13484
+ // let fieldValue = event.data["${props.name}"];
13485
+ // fieldValue.push(newItem);
13486
+ // doAction({
13487
+ // "componentId": "${props.id}",
13488
+ // "actionType": "setValue",
13489
+ // "args": {
13490
+ // "value": fieldValue
13491
+ // }
13492
+ // });
13493
+ // event.data.index = fieldValue.length - 1;
13494
+ // }
13495
+ // else{
13496
+ // // 这里不可以执行event.data["${props.name}"]=[newItem],数据域会断掉
13497
+ // doAction({
13498
+ // "componentId": "${props.id}",
13499
+ // "actionType": "setValue",
13500
+ // "args": {
13501
+ // "value": [newItem]
13502
+ // }
13503
+ // });
13504
+ // event.data.index = 1;
13505
+ // }
13506
+ // `;
13507
+ // let actionNewLine = {
13508
+ // "actionType": "custom",
13509
+ // "script": onNewLineScript
13510
+ // };
13386
13511
  // 新增行时不需要在弹出编辑表单前先加一行,因为会在编辑表单所在service初始化时判断到是新增就自动增加一行,因为这里拿不到event.data.__tableItems,也无法变更其值
13387
13512
  // actions = [actionNewLine, actionShowEditDialog];
13388
13513
  actions = [actionShowEditDialog];
@@ -13441,7 +13566,15 @@ async function getButtonActions(props, mode) {
13441
13566
  // 这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
13442
13567
  // 这里_.clone是因为字段设计布局设置分组这种弹出窗口中的子表组件,直接删除后,点取消无法还原
13443
13568
  let lastestFieldValue = _.clone(wrapperServiceData["${props.name}"]);
13444
- lastestFieldValue.splice(event.data.index, 1);
13569
+ var currentIndex = event.data.index;
13570
+ var parent = event.data.__super.parent;
13571
+ var __parentIndex = parent && _.findIndex(lastestFieldValue, {_id: parent._id});
13572
+ if(parent){
13573
+ lastestFieldValue[__parentIndex].children.splice(currentIndex, 1);
13574
+ }
13575
+ else{
13576
+ lastestFieldValue.splice(currentIndex, 1);
13577
+ }
13445
13578
  doAction({
13446
13579
  "componentId": "${props.id}",
13447
13580
  "actionType": "setValue",