@steedos-widgets/amis-lib 1.3.18 → 1.3.20
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/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/index.cjs.js +435 -60
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +435 -60
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +54 -19
- package/dist/index.umd.js.map +1 -1
- package/dist/types/lib/input_table.d.ts +8 -2
- package/package.json +2 -2
package/dist/index.esm.js
CHANGED
|
@@ -2007,6 +2007,9 @@ async function getTableColumns(fields, options){
|
|
|
2007
2007
|
const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
|
|
2008
2008
|
|
|
2009
2009
|
for (const field of fields) {
|
|
2010
|
+
if(field.hidden || field.extra){
|
|
2011
|
+
continue;
|
|
2012
|
+
}
|
|
2010
2013
|
//增加quickEdit属性,实现快速编辑
|
|
2011
2014
|
const quickEditSchema = allowEdit ? await getQuickEditSchema(field, options) : allowEdit;
|
|
2012
2015
|
let className = "";
|
|
@@ -6171,12 +6174,13 @@ async function getObjectFieldsFilterBarSchema(objectSchema, ctx) {
|
|
|
6171
6174
|
*/
|
|
6172
6175
|
function getObjectListHeaderFirstLine(objectSchema, listViewName, ctx) {
|
|
6173
6176
|
const { icon, label } = objectSchema;
|
|
6177
|
+
const disabled_list_views = objectSchema.permissions.disabled_list_views;
|
|
6174
6178
|
const listViewButtonOptions = [];
|
|
6175
6179
|
each(
|
|
6176
6180
|
objectSchema.list_views,
|
|
6177
6181
|
(listView, name) => {
|
|
6178
|
-
if(name === "lookup"){
|
|
6179
|
-
// 内置lookup
|
|
6182
|
+
if(name === "lookup" || (disabled_list_views && disabled_list_views.indexOf(listView._id)>-1)){
|
|
6183
|
+
// 内置lookup为弹出选择专用视图,根据用户权限被禁用的视图,不显示在列表切换区域
|
|
6180
6184
|
return;
|
|
6181
6185
|
}
|
|
6182
6186
|
listViewButtonOptions.push({
|
|
@@ -8265,7 +8269,10 @@ async function getObjectCRUD(objectSchema, fields, options){
|
|
|
8265
8269
|
// [`flex-auto ${crudClassName || ""}`]: "true",
|
|
8266
8270
|
// "is-steedos-crud-data-empty": "${!items || COUNT(items) == 0}"
|
|
8267
8271
|
// },
|
|
8268
|
-
bodyClassName:
|
|
8272
|
+
bodyClassName: {
|
|
8273
|
+
"bg-white": "true",
|
|
8274
|
+
"is-steedos-crud-data-empty": "${!items || COUNT(items) == 0}"
|
|
8275
|
+
},
|
|
8269
8276
|
crudClassName: crudClassName,
|
|
8270
8277
|
quickSaveApi: {
|
|
8271
8278
|
url: `\${context.rootUrl}/graphql`,
|
|
@@ -12362,7 +12369,7 @@ async function getFormBody(permissionFields, formFields, ctx){
|
|
|
12362
12369
|
* @Author: 殷亮辉 yinlianghui@hotoa.com
|
|
12363
12370
|
* @Date: 2023-11-15 09:50:22
|
|
12364
12371
|
* @LastEditors: 殷亮辉 yinlianghui@hotoa.com
|
|
12365
|
-
* @LastEditTime: 2023-12-
|
|
12372
|
+
* @LastEditTime: 2023-12-12 17:13:37
|
|
12366
12373
|
*/
|
|
12367
12374
|
|
|
12368
12375
|
/**
|
|
@@ -12376,52 +12383,71 @@ function getFormFields(props, mode = "edit") {
|
|
|
12376
12383
|
"name": item.name,
|
|
12377
12384
|
"config": item
|
|
12378
12385
|
};
|
|
12379
|
-
if(mode === "readonly"){
|
|
12386
|
+
if (mode === "readonly") {
|
|
12380
12387
|
formItem.static = true;
|
|
12381
12388
|
}
|
|
12382
12389
|
return formItem;
|
|
12383
12390
|
}) || [];
|
|
12384
12391
|
}
|
|
12385
12392
|
|
|
12393
|
+
function getInputTableCell(field, showAsInlineEditMode) {
|
|
12394
|
+
if (showAsInlineEditMode) {
|
|
12395
|
+
return {
|
|
12396
|
+
label: field.label,
|
|
12397
|
+
name: field.name,
|
|
12398
|
+
quickEdit: {
|
|
12399
|
+
"type": "steedos-field",
|
|
12400
|
+
"config": field,
|
|
12401
|
+
hideLabel: true
|
|
12402
|
+
}
|
|
12403
|
+
}
|
|
12404
|
+
}
|
|
12405
|
+
else {
|
|
12406
|
+
return {
|
|
12407
|
+
"type": "steedos-field",
|
|
12408
|
+
"config": field,
|
|
12409
|
+
"static": true,
|
|
12410
|
+
"readonly": true,
|
|
12411
|
+
label: field.label,
|
|
12412
|
+
name: field.name,
|
|
12413
|
+
hideLabel: true
|
|
12414
|
+
}
|
|
12415
|
+
}
|
|
12416
|
+
}
|
|
12417
|
+
|
|
12386
12418
|
/**
|
|
12387
12419
|
* @param {*} props
|
|
12388
12420
|
* @param {*} mode edit/new/readonly
|
|
12389
12421
|
*/
|
|
12390
12422
|
async function getInputTableColumns(props) {
|
|
12391
12423
|
let columns = props.columns || [];
|
|
12424
|
+
let inlineEditMode = props.inlineEditMode;
|
|
12425
|
+
let showAsInlineEditMode = inlineEditMode && props.editable;
|
|
12392
12426
|
// 实测过,直接不生成对应的隐藏column并不会对input-table值造成丢失问题,隐藏的列字段值能正常维护
|
|
12393
12427
|
let fields = props.fields;
|
|
12394
|
-
if(columns && columns.length){
|
|
12395
|
-
return columns.map(function(column){
|
|
12428
|
+
if (columns && columns.length) {
|
|
12429
|
+
return columns.map(function (column) {
|
|
12396
12430
|
let field, extendColumnProps = {};
|
|
12397
|
-
if(typeof column === "string"){
|
|
12431
|
+
if (typeof column === "string") {
|
|
12398
12432
|
// 如果字符串,则取出要显示的列配置
|
|
12399
|
-
field = fields.find(function(fieldItem){
|
|
12433
|
+
field = fields.find(function (fieldItem) {
|
|
12400
12434
|
return fieldItem.name === column;
|
|
12401
12435
|
});
|
|
12402
12436
|
}
|
|
12403
12437
|
else {
|
|
12404
12438
|
// 如果是对象,则合并到steedos-field的config.amis属性中,steedos组件会把config.amis属性混合到最终生成的input-table column
|
|
12405
|
-
field = fields.find(function(fieldItem){
|
|
12439
|
+
field = fields.find(function (fieldItem) {
|
|
12406
12440
|
return fieldItem.name === column.name;
|
|
12407
12441
|
});
|
|
12408
|
-
if(field){
|
|
12442
|
+
if (field) {
|
|
12409
12443
|
// field.amis = Object.assign({}, field.amis, column);
|
|
12410
12444
|
// 如果把column合并到field.amis,column的label/width等属性不会生效,只能放外层合并
|
|
12411
12445
|
extendColumnProps = column;
|
|
12412
12446
|
}
|
|
12413
12447
|
}
|
|
12414
|
-
if(field){
|
|
12415
|
-
|
|
12416
|
-
|
|
12417
|
-
"config": field,
|
|
12418
|
-
"static": true,
|
|
12419
|
-
"readonly": true,
|
|
12420
|
-
label: field.label,
|
|
12421
|
-
name: field.name,
|
|
12422
|
-
hideLabel: true,
|
|
12423
|
-
...extendColumnProps
|
|
12424
|
-
}
|
|
12448
|
+
if (field) {
|
|
12449
|
+
let tableCell = getInputTableCell(field, showAsInlineEditMode);
|
|
12450
|
+
return Object.assign({}, tableCell, extendColumnProps);
|
|
12425
12451
|
}
|
|
12426
12452
|
else {
|
|
12427
12453
|
return column;
|
|
@@ -12429,20 +12455,212 @@ async function getInputTableColumns(props) {
|
|
|
12429
12455
|
});
|
|
12430
12456
|
}
|
|
12431
12457
|
else {
|
|
12432
|
-
return fields.map(function(field){
|
|
12433
|
-
|
|
12434
|
-
|
|
12435
|
-
"config": field,
|
|
12436
|
-
"static": true,
|
|
12437
|
-
"readonly": true,
|
|
12438
|
-
label: field.label,
|
|
12439
|
-
name: field.name,
|
|
12440
|
-
hideLabel: true
|
|
12441
|
-
}
|
|
12458
|
+
return fields.map(function (field) {
|
|
12459
|
+
let tableCell = getInputTableCell(field, showAsInlineEditMode);
|
|
12460
|
+
return tableCell;
|
|
12442
12461
|
}) || [];
|
|
12443
12462
|
}
|
|
12444
12463
|
}
|
|
12445
12464
|
|
|
12465
|
+
function getFormPagination(props) {
|
|
12466
|
+
let onPageChangeScript = `
|
|
12467
|
+
let scope = event.context.scoped;
|
|
12468
|
+
let paginationServiceId = event.data.paginationServiceId;
|
|
12469
|
+
let wrapperServiceId = event.data.wrapperServiceId;
|
|
12470
|
+
let formId = event.data.formId;
|
|
12471
|
+
let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
|
|
12472
|
+
let pageChangeDirection = context.props.pageChangeDirection;
|
|
12473
|
+
let currentPage = event.data.page;
|
|
12474
|
+
let currentIndex = event.data.index;
|
|
12475
|
+
|
|
12476
|
+
// 翻页到下一页之前需要先把当前页改动的内容保存到中间变量changedItems中
|
|
12477
|
+
let currentFormValues = scope.getComponentById(formId).getValues();
|
|
12478
|
+
fieldValue[currentIndex] = currentFormValues;
|
|
12479
|
+
// // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
|
|
12480
|
+
// doAction({
|
|
12481
|
+
// "componentId": wrapperServiceId,
|
|
12482
|
+
// "actionType": "setValue",
|
|
12483
|
+
// "args": {
|
|
12484
|
+
// "value": {
|
|
12485
|
+
// "changedItems": fieldValue
|
|
12486
|
+
// }
|
|
12487
|
+
// }
|
|
12488
|
+
// });
|
|
12489
|
+
// 如果翻页到下一页前需要同时把改动的内容保存到最终正式的表单字段中,需要额外给正式表单字段执行一次setValue
|
|
12490
|
+
// 但是同时保存到正式表单字段中会造成翻页后点击取消无法取消翻页之前的改动内容
|
|
12491
|
+
// doAction({
|
|
12492
|
+
// "componentId": "${props.id}",
|
|
12493
|
+
// "actionType": "setValue",
|
|
12494
|
+
// "args": {
|
|
12495
|
+
// "value": fieldValue
|
|
12496
|
+
// }
|
|
12497
|
+
// });
|
|
12498
|
+
|
|
12499
|
+
// 以下是翻页逻辑,翻到下一页并把下一页内容显示到表单上
|
|
12500
|
+
let targetPage;
|
|
12501
|
+
if(pageChangeDirection === "next"){
|
|
12502
|
+
targetPage = currentPage + 1;
|
|
12503
|
+
}
|
|
12504
|
+
else{
|
|
12505
|
+
targetPage = currentPage - 1;
|
|
12506
|
+
}
|
|
12507
|
+
let targetIndex = targetPage - 1;//input-table组件行索引,从0开始的索引
|
|
12508
|
+
// let targetFormData = changedItems[targetIndex];
|
|
12509
|
+
doAction({
|
|
12510
|
+
"actionType": "setValue",
|
|
12511
|
+
"componentId": paginationServiceId,
|
|
12512
|
+
"args": {
|
|
12513
|
+
"value": {
|
|
12514
|
+
"page": targetPage,
|
|
12515
|
+
"index": targetIndex
|
|
12516
|
+
}
|
|
12517
|
+
}
|
|
12518
|
+
});
|
|
12519
|
+
// 这里不用进一步把表单内容setValue到form中,是因为编辑表单中schemaApi监听了行索引index的变化,其值变化时会重新build整个form
|
|
12520
|
+
// doAction({
|
|
12521
|
+
// "actionType": "setValue",
|
|
12522
|
+
// "componentId": formId,
|
|
12523
|
+
// "args": {
|
|
12524
|
+
// "value": targetFormData
|
|
12525
|
+
// },
|
|
12526
|
+
// "dataMergeMode": "override"// amis 3.2不支持override模式,高版本才支持
|
|
12527
|
+
// });
|
|
12528
|
+
`;
|
|
12529
|
+
return {
|
|
12530
|
+
"type": "wrapper",
|
|
12531
|
+
"className": "py-2",
|
|
12532
|
+
"body": [
|
|
12533
|
+
{
|
|
12534
|
+
"type": "button",
|
|
12535
|
+
"label": "",
|
|
12536
|
+
"icon": `fa fa-angle-left`,
|
|
12537
|
+
"level": "link",
|
|
12538
|
+
"pageChangeDirection": "prev",
|
|
12539
|
+
"disabledOn": "${page <= 1}",
|
|
12540
|
+
"size": "sm",
|
|
12541
|
+
"onEvent": {
|
|
12542
|
+
"click": {
|
|
12543
|
+
"actions": [
|
|
12544
|
+
{
|
|
12545
|
+
"actionType": "custom",
|
|
12546
|
+
"script": onPageChangeScript
|
|
12547
|
+
}
|
|
12548
|
+
]
|
|
12549
|
+
}
|
|
12550
|
+
}
|
|
12551
|
+
},
|
|
12552
|
+
{
|
|
12553
|
+
"type": "tpl",
|
|
12554
|
+
"tpl": "${page}/${total}"
|
|
12555
|
+
},
|
|
12556
|
+
{
|
|
12557
|
+
"type": "button",
|
|
12558
|
+
"label": "",
|
|
12559
|
+
"icon": `fa fa-angle-right`,
|
|
12560
|
+
"level": "link",
|
|
12561
|
+
"pageChangeDirection": "next",
|
|
12562
|
+
"disabledOn": "${page >= total}",
|
|
12563
|
+
"size": "sm",
|
|
12564
|
+
"onEvent": {
|
|
12565
|
+
"click": {
|
|
12566
|
+
"actions": [
|
|
12567
|
+
{
|
|
12568
|
+
"actionType": "custom",
|
|
12569
|
+
"script": onPageChangeScript
|
|
12570
|
+
}
|
|
12571
|
+
]
|
|
12572
|
+
}
|
|
12573
|
+
}
|
|
12574
|
+
}
|
|
12575
|
+
]
|
|
12576
|
+
}
|
|
12577
|
+
}
|
|
12578
|
+
|
|
12579
|
+
/**
|
|
12580
|
+
* 传入formSchema输出带翻页容器的wrapper
|
|
12581
|
+
* @param {*} props input-table组件props
|
|
12582
|
+
* @param {*} form formSchema
|
|
12583
|
+
* @returns 带翻页容器的wrapper
|
|
12584
|
+
*/
|
|
12585
|
+
function getFormPaginationWrapper(props, form) {
|
|
12586
|
+
let serviceId = `service_popup_pagination_wrapper__${props.id}`;
|
|
12587
|
+
let formBody = [
|
|
12588
|
+
{
|
|
12589
|
+
"type": "wrapper",
|
|
12590
|
+
"size": "none",
|
|
12591
|
+
"className": "flex justify-end border-y border-gray-200 -mx-6 shadow-inner sticky top-0 right-0 left-0 z-20 bg-white mb-4",
|
|
12592
|
+
"body": [
|
|
12593
|
+
getFormPagination(props)
|
|
12594
|
+
]
|
|
12595
|
+
},
|
|
12596
|
+
// form
|
|
12597
|
+
Object.assign({}, form, {
|
|
12598
|
+
"canAccessSuperData": false,
|
|
12599
|
+
"data": {
|
|
12600
|
+
// "&": `\${${props.name}[index]}`,
|
|
12601
|
+
"&": "${changedItems[index]}"
|
|
12602
|
+
}
|
|
12603
|
+
})
|
|
12604
|
+
];
|
|
12605
|
+
let onServiceInitedScript = `
|
|
12606
|
+
// 以下脚本在inlineEditMode模式时才有必要执行(不过执行了也没有坏处,纯粹是没必要),是为了解决:
|
|
12607
|
+
// inlineEditMode模式时,用户在表格单元格中直接修改数据,然后弹出的表单form中并没有包含单元格中修改的内容
|
|
12608
|
+
// 思路是每次弹出form之前先把其changedItems同步更新为最新值,这样就能在弹出form中包含单元格中做的修改
|
|
12609
|
+
// 注意:service init事件只会在每次弹出窗口时才执行,在触发翻页时并不会触发service init事件
|
|
12610
|
+
let inlineEditMode = ${props.inlineEditMode};
|
|
12611
|
+
if(!inlineEditMode){
|
|
12612
|
+
return;
|
|
12613
|
+
}
|
|
12614
|
+
let scope = event.context.scoped;
|
|
12615
|
+
let wrapperServiceId = event.data.wrapperServiceId;
|
|
12616
|
+
let wrapperService = scope.getComponentById(wrapperServiceId);
|
|
12617
|
+
let wrapperServiceData = wrapperService.getData();
|
|
12618
|
+
let lastestFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
|
|
12619
|
+
//不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断
|
|
12620
|
+
event.data.changedItems.forEach(function(n,i){
|
|
12621
|
+
event.data.changedItems[i] = lastestFieldValue[i];
|
|
12622
|
+
});
|
|
12623
|
+
`;
|
|
12624
|
+
let schema = {
|
|
12625
|
+
"type": "service",
|
|
12626
|
+
"id": serviceId,
|
|
12627
|
+
"schemaApi": {
|
|
12628
|
+
"url": "${context.rootUrl}/graphql?rebuildOn=${index}",
|
|
12629
|
+
// "url": "${context.rootUrl}/graphql",
|
|
12630
|
+
"method": "post",
|
|
12631
|
+
"headers": {
|
|
12632
|
+
"Authorization": "Bearer ${context.tenantId},${context.authToken}"
|
|
12633
|
+
},
|
|
12634
|
+
"requestAdaptor": "api.data={query: '{spaces__findOne(id: \"none\"){_id,name}}'};return api;",
|
|
12635
|
+
"adaptor": `
|
|
12636
|
+
const formBody = ${JSON.stringify(formBody)};
|
|
12637
|
+
return {
|
|
12638
|
+
"body": formBody
|
|
12639
|
+
}
|
|
12640
|
+
`
|
|
12641
|
+
},
|
|
12642
|
+
// "body": formBody,
|
|
12643
|
+
"data": {
|
|
12644
|
+
"page": "${index + 1}",
|
|
12645
|
+
// "total": `\${${props.name}.length}`,
|
|
12646
|
+
"total": "${changedItems.length}",
|
|
12647
|
+
"paginationServiceId": serviceId,
|
|
12648
|
+
"formId": form.id
|
|
12649
|
+
},
|
|
12650
|
+
"onEvent": {
|
|
12651
|
+
"init": {
|
|
12652
|
+
"actions": [
|
|
12653
|
+
{
|
|
12654
|
+
"actionType": "custom",
|
|
12655
|
+
"script": onServiceInitedScript
|
|
12656
|
+
}
|
|
12657
|
+
]
|
|
12658
|
+
}
|
|
12659
|
+
}
|
|
12660
|
+
};
|
|
12661
|
+
return schema;
|
|
12662
|
+
}
|
|
12663
|
+
|
|
12446
12664
|
/**
|
|
12447
12665
|
* @param {*} props
|
|
12448
12666
|
* @param {*} mode edit/new/readonly
|
|
@@ -12450,29 +12668,58 @@ async function getInputTableColumns(props) {
|
|
|
12450
12668
|
async function getForm(props, mode = "edit") {
|
|
12451
12669
|
let formFields = getFormFields(props, mode);
|
|
12452
12670
|
let body = await getFormBody(null, formFields);
|
|
12671
|
+
let forId = `form_popup__${props.id}`;
|
|
12453
12672
|
let schema = {
|
|
12454
12673
|
"type": "form",
|
|
12674
|
+
"id": forId,
|
|
12455
12675
|
"title": "表单",
|
|
12456
12676
|
"debug": false,
|
|
12457
12677
|
"mode": "normal",
|
|
12458
12678
|
"body": body,
|
|
12679
|
+
"wrapWithPanel": false,
|
|
12459
12680
|
"className": "steedos-object-form steedos-amis-form"
|
|
12460
12681
|
};
|
|
12461
12682
|
if (mode === "edit") {
|
|
12683
|
+
let onEditItemSubmitScript = `
|
|
12684
|
+
// let fieldValue = _.cloneDeep(event.data["${props.name}"]);
|
|
12685
|
+
let fieldValue = event.data.changedItems;//这里不可以_.cloneDeep,因为翻页form中用的是event.data.changedItems,直接变更其值即可改变表单中的值
|
|
12686
|
+
fieldValue[event.data.index] = JSON.parse(JSON.stringify(event.data));
|
|
12687
|
+
doAction({
|
|
12688
|
+
"componentId": "${props.id}",
|
|
12689
|
+
"actionType": "setValue",
|
|
12690
|
+
"args": {
|
|
12691
|
+
"value": fieldValue
|
|
12692
|
+
}
|
|
12693
|
+
});
|
|
12694
|
+
// // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
|
|
12695
|
+
// doAction({
|
|
12696
|
+
// "componentId": event.data.wrapperServiceId,
|
|
12697
|
+
// "actionType": "setValue",
|
|
12698
|
+
// "args": {
|
|
12699
|
+
// "value": {
|
|
12700
|
+
// "changedItems": fieldValue
|
|
12701
|
+
// }
|
|
12702
|
+
// }
|
|
12703
|
+
// });
|
|
12704
|
+
`;
|
|
12462
12705
|
Object.assign(schema, {
|
|
12463
12706
|
"onEvent": {
|
|
12464
12707
|
"submit": {
|
|
12465
12708
|
"weight": 0,
|
|
12466
12709
|
"actions": [
|
|
12710
|
+
// {
|
|
12711
|
+
// "actionType": "setValue",
|
|
12712
|
+
// "args": {
|
|
12713
|
+
// "index": "${index}",
|
|
12714
|
+
// "value": {
|
|
12715
|
+
// "&": "$$"
|
|
12716
|
+
// }
|
|
12717
|
+
// },
|
|
12718
|
+
// "componentId": props.id
|
|
12719
|
+
// }
|
|
12467
12720
|
{
|
|
12468
|
-
"actionType": "
|
|
12469
|
-
"
|
|
12470
|
-
"index": "${index}",
|
|
12471
|
-
"value": {
|
|
12472
|
-
"&": "$$"
|
|
12473
|
-
}
|
|
12474
|
-
},
|
|
12475
|
-
"componentId": props.id
|
|
12721
|
+
"actionType": "custom",
|
|
12722
|
+
"script": onEditItemSubmitScript
|
|
12476
12723
|
}
|
|
12477
12724
|
]
|
|
12478
12725
|
}
|
|
@@ -12481,10 +12728,11 @@ async function getForm(props, mode = "edit") {
|
|
|
12481
12728
|
}
|
|
12482
12729
|
else if (mode === "new") {
|
|
12483
12730
|
let onNewItemSubmitScript = `
|
|
12484
|
-
let fieldValue = _.cloneDeep(event.data["${props.name}"]);
|
|
12485
|
-
if(!
|
|
12486
|
-
|
|
12731
|
+
// let fieldValue = _.cloneDeep(event.data["${props.name}"]);
|
|
12732
|
+
if(!event.data.changedItems){
|
|
12733
|
+
event.data.changedItems = [];
|
|
12487
12734
|
}
|
|
12735
|
+
let fieldValue = event.data.changedItems;
|
|
12488
12736
|
fieldValue.push(JSON.parse(JSON.stringify(event.data)));
|
|
12489
12737
|
doAction({
|
|
12490
12738
|
"componentId": "${props.id}",
|
|
@@ -12493,6 +12741,16 @@ async function getForm(props, mode = "edit") {
|
|
|
12493
12741
|
"value": fieldValue
|
|
12494
12742
|
}
|
|
12495
12743
|
});
|
|
12744
|
+
// // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
|
|
12745
|
+
// doAction({
|
|
12746
|
+
// "componentId": event.data.wrapperServiceId,
|
|
12747
|
+
// "actionType": "setValue",
|
|
12748
|
+
// "args": {
|
|
12749
|
+
// "value": {
|
|
12750
|
+
// "changedItems": fieldValue
|
|
12751
|
+
// }
|
|
12752
|
+
// }
|
|
12753
|
+
// });
|
|
12496
12754
|
`;
|
|
12497
12755
|
Object.assign(schema, {
|
|
12498
12756
|
"onEvent": {
|
|
@@ -12518,6 +12776,9 @@ async function getForm(props, mode = "edit") {
|
|
|
12518
12776
|
}
|
|
12519
12777
|
});
|
|
12520
12778
|
}
|
|
12779
|
+
if (mode === "edit" || mode === "readonly") {
|
|
12780
|
+
schema = getFormPaginationWrapper(props, schema);
|
|
12781
|
+
}
|
|
12521
12782
|
return schema;
|
|
12522
12783
|
}
|
|
12523
12784
|
|
|
@@ -12552,11 +12813,32 @@ async function getButtonNew(props) {
|
|
|
12552
12813
|
};
|
|
12553
12814
|
}
|
|
12554
12815
|
|
|
12555
|
-
async function getButtonEdit(props) {
|
|
12816
|
+
async function getButtonEdit(props, showAsInlineEditMode) {
|
|
12817
|
+
let onCancelScript = `
|
|
12818
|
+
let scope = event.context.scoped;
|
|
12819
|
+
let wrapperServiceId = event.data.wrapperServiceId;
|
|
12820
|
+
let wrapperService = scope.getComponentById(wrapperServiceId);
|
|
12821
|
+
let wrapperServiceData = wrapperService.getData();
|
|
12822
|
+
let originalFieldValue = wrapperServiceData["${props.name}"];//这里不可以用event.data["${props.name}"]因为amis input talbe有一层单独的作用域,其值会延迟一拍
|
|
12823
|
+
//不可以直接像event.data.changedItems = originalFieldValue; 这样整个赋值,否则作用域会断,造成无法还原
|
|
12824
|
+
event.data.changedItems.forEach(function(n,i){
|
|
12825
|
+
event.data.changedItems[i] = originalFieldValue[i];
|
|
12826
|
+
});
|
|
12827
|
+
// 因为翻页form中用的是event.data.changedItems中的数据,所以像下面这样doAction setValue无法实现还原
|
|
12828
|
+
// doAction({
|
|
12829
|
+
// "componentId": wrapperServiceId,
|
|
12830
|
+
// "actionType": "setValue",
|
|
12831
|
+
// "args": {
|
|
12832
|
+
// "value": {
|
|
12833
|
+
// "changedItems": originalFieldValue
|
|
12834
|
+
// }
|
|
12835
|
+
// }
|
|
12836
|
+
// });
|
|
12837
|
+
`;
|
|
12556
12838
|
return {
|
|
12557
12839
|
"type": "button",
|
|
12558
12840
|
"label": "",
|
|
12559
|
-
"icon":
|
|
12841
|
+
"icon": `fa fa-${showAsInlineEditMode ? "expand" : "pencil"}`,//inline edit模式时显示为放开按钮,只读时显示为笔按钮
|
|
12560
12842
|
"level": "link",
|
|
12561
12843
|
"onEvent": {
|
|
12562
12844
|
"click": {
|
|
@@ -12574,7 +12856,29 @@ async function getButtonEdit(props) {
|
|
|
12574
12856
|
"showErrorMsg": true,
|
|
12575
12857
|
"showLoading": true,
|
|
12576
12858
|
"className": "app-popover",
|
|
12577
|
-
"closeOnEsc": false
|
|
12859
|
+
"closeOnEsc": false,
|
|
12860
|
+
"data": {
|
|
12861
|
+
// 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
|
|
12862
|
+
// 额外把华炎魔方主表记录ObjectForm中的字段值从record变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
|
|
12863
|
+
// 额外把global、uiSchema也映射过去,有可能要用,后续需要用到其他变更可以这里加映射
|
|
12864
|
+
"&": "${record || {}}",
|
|
12865
|
+
"global": "${global}",
|
|
12866
|
+
"uiSchema": "${uiSchema}",
|
|
12867
|
+
"grid": "${grid}",
|
|
12868
|
+
"index": "${index}",
|
|
12869
|
+
"changedItems": "${changedItems}",
|
|
12870
|
+
"wrapperServiceId": "${wrapperServiceId}"
|
|
12871
|
+
},
|
|
12872
|
+
"onEvent": {
|
|
12873
|
+
"cancel": {
|
|
12874
|
+
"actions": [
|
|
12875
|
+
{
|
|
12876
|
+
"actionType": "custom",
|
|
12877
|
+
"script": onCancelScript
|
|
12878
|
+
}
|
|
12879
|
+
]
|
|
12880
|
+
}
|
|
12881
|
+
}
|
|
12578
12882
|
}
|
|
12579
12883
|
}
|
|
12580
12884
|
]
|
|
@@ -12587,7 +12891,7 @@ async function getButtonView(props) {
|
|
|
12587
12891
|
return {
|
|
12588
12892
|
"type": "button",
|
|
12589
12893
|
"label": "",
|
|
12590
|
-
"icon": "fa fa-external-link
|
|
12894
|
+
"icon": "fa fa-expand",//fa-external-link
|
|
12591
12895
|
"level": "link",
|
|
12592
12896
|
"onEvent": {
|
|
12593
12897
|
"click": {
|
|
@@ -12605,7 +12909,18 @@ async function getButtonView(props) {
|
|
|
12605
12909
|
"showErrorMsg": true,
|
|
12606
12910
|
"showLoading": true,
|
|
12607
12911
|
"className": "app-popover",
|
|
12608
|
-
"closeOnEsc": false
|
|
12912
|
+
"closeOnEsc": false,
|
|
12913
|
+
"actions": [],
|
|
12914
|
+
"data": {
|
|
12915
|
+
// 这里必须加data数据映射,否则翻页功能中取changedItems值时会乱,比如翻页编辑后会把上一页中没改过的字段值带过去
|
|
12916
|
+
// 额外把华炎魔方主表记录ObjectForm中的字段值从formData变量中映射到子表form中,因为子表lookup字段filtersFunction中可能依赖了主表记录中的字段值,比如“工作流规则”对象“时间触发器”字段中的“日期字段”字段
|
|
12917
|
+
// global、uiSchema等常用变量本来就在formData变量已经存在了,无需另外映射
|
|
12918
|
+
"&": "${formData || {}}",
|
|
12919
|
+
"grid": "${grid}",
|
|
12920
|
+
"index": "${index}",
|
|
12921
|
+
"changedItems": "${changedItems}",
|
|
12922
|
+
"wrapperServiceId": "${wrapperServiceId}"
|
|
12923
|
+
}
|
|
12609
12924
|
}
|
|
12610
12925
|
}
|
|
12611
12926
|
]
|
|
@@ -12615,6 +12930,32 @@ async function getButtonView(props) {
|
|
|
12615
12930
|
}
|
|
12616
12931
|
|
|
12617
12932
|
function getButtonDelete(props) {
|
|
12933
|
+
let onDeleteItemScript = `
|
|
12934
|
+
// let fieldValue = _.cloneDeep(event.data["${props.name}"]);
|
|
12935
|
+
if(!event.data.changedItems){
|
|
12936
|
+
event.data.changedItems = [];
|
|
12937
|
+
}
|
|
12938
|
+
let fieldValue = event.data.changedItems;
|
|
12939
|
+
// fieldValue.push(JSON.parse(JSON.stringify(event.data)));
|
|
12940
|
+
fieldValue.splice(event.data.index, 1)
|
|
12941
|
+
doAction({
|
|
12942
|
+
"componentId": "${props.id}",
|
|
12943
|
+
"actionType": "setValue",
|
|
12944
|
+
"args": {
|
|
12945
|
+
"value": fieldValue
|
|
12946
|
+
}
|
|
12947
|
+
});
|
|
12948
|
+
// // 因为翻页form中用的是event.data.changedItems中的数据,所以不需要像下面这样doAction setValue变更中间变量changedItems值
|
|
12949
|
+
// doAction({
|
|
12950
|
+
// "componentId": event.data.wrapperServiceId,
|
|
12951
|
+
// "actionType": "setValue",
|
|
12952
|
+
// "args": {
|
|
12953
|
+
// "value": {
|
|
12954
|
+
// "changedItems": fieldValue
|
|
12955
|
+
// }
|
|
12956
|
+
// }
|
|
12957
|
+
// });
|
|
12958
|
+
`;
|
|
12618
12959
|
return {
|
|
12619
12960
|
"type": "button",
|
|
12620
12961
|
"label": "",
|
|
@@ -12623,12 +12964,16 @@ function getButtonDelete(props) {
|
|
|
12623
12964
|
"onEvent": {
|
|
12624
12965
|
"click": {
|
|
12625
12966
|
"actions": [
|
|
12967
|
+
// {
|
|
12968
|
+
// "actionType": "deleteItem",
|
|
12969
|
+
// "args": {
|
|
12970
|
+
// "index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
|
|
12971
|
+
// },
|
|
12972
|
+
// "componentId": props.id
|
|
12973
|
+
// },
|
|
12626
12974
|
{
|
|
12627
|
-
"actionType": "
|
|
12628
|
-
"
|
|
12629
|
-
"index": "${index+','}" //这里不加逗号后续会报错,语法是逗号分隔可以删除多行
|
|
12630
|
-
},
|
|
12631
|
-
"componentId": props.id
|
|
12975
|
+
"actionType": "custom",
|
|
12976
|
+
"script": onDeleteItemScript
|
|
12632
12977
|
}
|
|
12633
12978
|
]
|
|
12634
12979
|
}
|
|
@@ -12636,18 +12981,34 @@ function getButtonDelete(props) {
|
|
|
12636
12981
|
};
|
|
12637
12982
|
}
|
|
12638
12983
|
|
|
12639
|
-
const getAmisInputTableSchema = async (props
|
|
12984
|
+
const getAmisInputTableSchema = async (props) => {
|
|
12640
12985
|
if (!props.id) {
|
|
12641
12986
|
props.id = "steedos_input_table_" + props.name + "_" + Math.random().toString(36).substr(2, 9);
|
|
12642
12987
|
}
|
|
12988
|
+
let serviceId = `service_wrapper__${props.id}`;
|
|
12643
12989
|
let buttonsForColumnOperations = [];
|
|
12990
|
+
let inlineEditMode = props.inlineEditMode;
|
|
12991
|
+
let showAsInlineEditMode = inlineEditMode && props.editable;
|
|
12644
12992
|
if (props.editable) {
|
|
12645
|
-
let
|
|
12646
|
-
|
|
12993
|
+
let showEditButton = true;
|
|
12994
|
+
if (showAsInlineEditMode) {
|
|
12995
|
+
// inline edit模式下只在有列被隐藏时才需要显示编辑按钮
|
|
12996
|
+
if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
|
|
12997
|
+
showEditButton = true;
|
|
12998
|
+
}
|
|
12999
|
+
else {
|
|
13000
|
+
showEditButton = false;
|
|
13001
|
+
}
|
|
13002
|
+
}
|
|
13003
|
+
// 编辑时显示编辑按钮
|
|
13004
|
+
if (showEditButton) {
|
|
13005
|
+
let buttonEditSchema = await getButtonEdit(props, showAsInlineEditMode);
|
|
13006
|
+
buttonsForColumnOperations.push(buttonEditSchema);
|
|
13007
|
+
}
|
|
12647
13008
|
}
|
|
12648
13009
|
else {
|
|
12649
13010
|
// 只读时显示查看按钮
|
|
12650
|
-
if(props.columns && props.columns.length > 0 && props.columns.length < props.fields.length){
|
|
13011
|
+
if (props.columns && props.columns.length > 0 && props.columns.length < props.fields.length) {
|
|
12651
13012
|
// 只在有列被隐藏时才需要显示查看按钮
|
|
12652
13013
|
let buttonViewSchema = await getButtonView(props);
|
|
12653
13014
|
buttonsForColumnOperations.push(buttonViewSchema);
|
|
@@ -12684,13 +13045,26 @@ const getAmisInputTableSchema = async (props, readonly) => {
|
|
|
12684
13045
|
"width": buttonsForColumnOperations.length > 1 ? "46px" : "20px"
|
|
12685
13046
|
});
|
|
12686
13047
|
}
|
|
13048
|
+
if (showAsInlineEditMode) {
|
|
13049
|
+
inputTableSchema.needConfirm = false;
|
|
13050
|
+
}
|
|
13051
|
+
let dataProviderInited = `
|
|
13052
|
+
// 单独维护一份中间变量changedItems,因为原变量在input-table组件有单独的作用域,翻页功能中无法维护此作用域中的行记录值
|
|
13053
|
+
setData({ changedItems: _.cloneDeep(data["${props.name}"]) || []});
|
|
13054
|
+
`;
|
|
12687
13055
|
let schema = {
|
|
12688
|
-
"type": "
|
|
12689
|
-
"size": "none",
|
|
13056
|
+
"type": "service",
|
|
12690
13057
|
"body": [
|
|
12691
13058
|
inputTableSchema
|
|
12692
13059
|
],
|
|
12693
|
-
"className": props.className
|
|
13060
|
+
"className": props.className,
|
|
13061
|
+
"id": serviceId,
|
|
13062
|
+
"data": {
|
|
13063
|
+
"wrapperServiceId": serviceId
|
|
13064
|
+
},
|
|
13065
|
+
"dataProvider": {
|
|
13066
|
+
"inited": dataProviderInited
|
|
13067
|
+
}
|
|
12694
13068
|
};
|
|
12695
13069
|
let footerToolbar = clone(props.footerToolbar || []); //这里不clone的话,会造成死循环,应该是因为props属性变更会让组件重新渲染
|
|
12696
13070
|
if (props.addable) {
|
|
@@ -12708,6 +13082,7 @@ const getAmisInputTableSchema = async (props, readonly) => {
|
|
|
12708
13082
|
delete props.amis.id;
|
|
12709
13083
|
Object.assign(schema.body[0], props.amis);
|
|
12710
13084
|
}
|
|
13085
|
+
// console.log("===schema===", schema);
|
|
12711
13086
|
return schema;
|
|
12712
13087
|
};
|
|
12713
13088
|
|