From 2452cd3e2c0ce31a23761cab35ca44528aed7524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=82=E4=BD=B3=E4=BF=8A?= Date: Sun, 24 Dec 2023 11:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E9=A1=B5=E9=9D=A2=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E8=A1=A8=E5=8D=95=E7=9A=84input-table#5876?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/object_layouts_form.page.amis.json | 517 ++++++++++++++++-- .../default/objects/object_layouts.object.yml | 30 +- 2 files changed, 514 insertions(+), 33 deletions(-) diff --git a/services/service-plugin-amis/main/default/pages/object_layouts_form.page.amis.json b/services/service-plugin-amis/main/default/pages/object_layouts_form.page.amis.json index 79b4253910..6a5f49dba5 100644 --- a/services/service-plugin-amis/main/default/pages/object_layouts_form.page.amis.json +++ b/services/service-plugin-amis/main/default/pages/object_layouts_form.page.amis.json @@ -10,44 +10,497 @@ "initFetch": true, "className": "bg-white", "id": "u:bb8612f5bbef", - "onEvent": { - "inited": { - "actions": [ - { - "actionType": "custom", - "script": "// 新建页面布局时初始化buttons默认值,字段值是CRUD表格控件渲染,新建页面布局时,不会自动填充到form中,需要手动填充\nconst initDefaultButtons = function (input) {\n const superValues = input.__super.__super || {};\n if (superValues.recordId) {\n // 编辑记录本来就会初始化相关字段值,不需要再初始化\n return;\n }\n return {\n buttons: input.buttons,\n }\n}\n\nconst eventData = event.data;\ndoAction({\n actionType: 'setValue',\n componentId: \"object-layout-form\",\n args: {\n value: initDefaultButtons(eventData)\n }\n});\n" - }, - { - "actionType": "custom", - "script": "// 新建页面布局时初始化fields默认值,字段值是CRUD表格控件渲染,新建页面布局时,不会自动填充到form中,需要手动填充\nconst initDefaultFields = function (input) {\n const superValues = input.__super.__super || {};\n if (superValues.recordId) {\n // 编辑记录本来就会初始化相关字段值,不需要再初始化\n return;\n }\n return {\n fields: input.fields,\n }\n}\n\nconst eventData = event.data;\ndoAction({\n actionType: 'setValue',\n componentId: \"object-layout-form\",\n args: {\n value: initDefaultFields(eventData)\n }\n});\n" + "label": "对象表单", + "objectApiName": "object_layouts", + "recordId": "${recordId}", + "enableTabs": true, + "debug": false, + "fieldsExtend": { + "profiles": { + "amis": { + "type": "select", + "name": "profiles", + "required": true, + "joinValues": false, + "extractValue": true, + "labelField": "label", + "multiple": true, + "labelClassName": "text-left", + "checkAll": true, + "source": { + "method": "post", + "url": "${context.rootUrl}/graphql", + "data": { + "query": "{options:permission_set(filters: [\"type\", \"=\", \"profile\"]){name,label}}" + }, + "requestAdaptor": "", + "adaptor": "", + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + } }, - { - "actionType": "custom", - "script": "// 新建页面布局时初始化related_lists默认值,字段值是CRUD表格控件渲染,新建页面布局时,不会自动填充到form中,需要手动填充\nconst initDefaultRelatedLists = function (input, rowValue, prop_name) {\n const superValues = input.__super.__super || {};\n if (superValues.recordId) {\n // 编辑记录本来就会初始化相关字段值,不需要再初始化\n return;\n }\n return {\n related_lists: input.related_lists,\n }\n}\n\nconst eventData = event.data;\ndoAction({\n actionType: 'setValue',\n componentId: \"object-layout-form\",\n args: {\n value: initDefaultRelatedLists(eventData)\n }\n});\n" - } - ] + "valueField": "name", + "searchable": true, + "id": "u:3c65447a8a6e", + "defaultCheckAll": false, + "checkAllLabel": "全选", + "autoComplete": "", + "menuTpl": "" + } }, - "submitSucc": { - "weight": 0, - "actions": [ - { - "actionType": "broadcast", - "args": { - "eventName": "@data.changed.object_layouts" - }, - "data": { - "objectName": "object_layouts" + "buttons": { + "label": "", + "amis": { + "headerToolbar": [ + { + "type": "button", + "actionType": "dialog", + "dialog": { + "title": "${'object_layouts.object_layouts_form.button_set' | t}", + "body": [ + { + "type": "transfer", + "name": "picked_buttons", + "sortable": true, + "source": { + "method": "get", + "url": "${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/actions/options", + "sendOn": "!!this.object_name", + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + }, + "cache": 120000 + }, + "value": "${buttons|pick:button_name|split}", + "searchable": true, + "id": "u:d6e067c40e83", + "joinValues": false, + "extractValue": true + } + ], + "onEvent": { + "confirm": { + "actions": [ + { + "actionType": "custom", + "script": "const buttons = [];\nconst picked_buttons = _.cloneDeep(event.data.picked_buttons);\n_.forEach(picked_buttons, function (button) {\n const table_button = _.find(event.data.buttons, { button_name: button });\n if (table_button) {\n buttons.push(table_button)\n } else {\n buttons.push({\n button_name: button\n })\n }\n})\ndoAction({\n \"componentId\": \"object-layout-form\",\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n buttons\n }\n }\n});" + } + ] + } + }, + "type": "dialog", + "id": "u:a0027ac6f8c1", + "closeOnEsc": false, + "closeOnOutside": false, + "showCloseButton": true, + "size": "md" + }, + "label": "${'object_layouts.object_layouts_form.button_set' | t}", + "className": "mb-2", + "id": "u:1ac8afc8a9bb" } + ], + "addable": false, + "draggable": false, + "id": "u:1120663b07c6", + "dialog": { + "title": "按钮明细" } - ] + } + }, + "fields": { + "amis": { + "type": "service", + "body": [ + { + "name": "fields", + "required": true, + "type": "steedos-input-table", + "fields": [ + { + "name": "field_name", + "label": "${'object_layouts.object_layouts_form.fields' | t}", + "type": "select", + "amis": { + "source": "${fields_options}", + "menuTpl": "", + "id": "u:beecbd5b6b69" + }, + "id": "u:b95c69a1cd84" + }, + { + "name": "is_readonly", + "label": "${'object_layouts.object_layouts_form.readonly' | t}", + "id": "u:5081e6e1af55", + "type": "boolean", + "placeholder": "-" + }, + { + "name": "is_required", + "label": "${'object_layouts.object_layouts_form.required' | t}", + "id": "u:e54afb5cc05c", + "type": "boolean", + "placeholder": "-" + }, + { + "name": "group", + "label": "${'object_layouts.object_layouts_form.grouping' | t}", + "type": "select", + "amis": { + "className": "m-0", + "source": "${field_groups|pick:group_name}", + "checkAll": false, + "selectFirst": false, + "searchable": true, + "clearable": true, + "id": "u:f75ddc45d296", + "multiple": false, + "mode": "popOver" + }, + "id": "u:e532b1949676", + "placeholder": "-" + }, + { + "name": "visible_on", + "label": "${'object_layouts.object_layouts_form.visibile_on' | t}", + "breakpoint": "*", + "id": "u:e3618b8b4c52", + "type": "textarea", + "placeholder": "-" + } + ], + "headerToolbar": [ + { + "type": "button", + "actionType": "dialog", + "dialog": { + "title": "${'object_layouts.object_layouts_form.field_set' | t}", + "body": [ + { + "type": "transfer", + "name": "picked_fields", + "sortable": true, + "source": "${fields_options}", + "value": "${fields|pick:field_name|split}", + "joinValues": false, + "extractValue": true, + "searchable": true, + "id": "u:502c4ecd81b6" + } + ], + "onEvent": { + "confirm": { + "actions": [ + { + "actionType": "custom", + "script": "var fields = [];\nvar picked_fields = _.cloneDeep(event.data.picked_fields);\n\n_.forEach(picked_fields, function (field) {\n var table_field = _.find(event.data.fields, { field_name: field });\n if (table_field) {\n fields.push(table_field);\n } else {\n fields.push({\n field_name: field\n });\n }\n});\n\n// 将 fields 分为 group 为空和非空的两部分\nvar groupsPartition = _.partition(fields, function(item) {\n return !item.group;\n});\nvar emptyGroups = groupsPartition[0];\nvar nonEmptyGroups = groupsPartition[1];\n\n// 创建排序映射\nvar sortOrderMap = _.fromPairs(_.map(event.data.field_groups, function(item, index) {\n return [item.group_name, index];\n}));\n\n// 对非空 group 的部分进行排序\nvar sortedNonEmptyGroups = _.sortBy(nonEmptyGroups, function(item) {\n return sortOrderMap[item.group];\n});\n\n// 合并两个数组,空 group 的部分在前\nfields = emptyGroups.concat(sortedNonEmptyGroups);\n\ndoAction({\n \"componentId\": \"object-layout-form\",\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n fields: fields\n }\n }\n});\n" + } + ] + } + }, + "type": "dialog", + "size": "md", + "id": "u:c405734543e0", + "closeOnEsc": false, + "closeOnOutside": false, + "showCloseButton": true + }, + "label": "${'object_layouts.object_layouts_form.field_set' | t}", + "id": "u:853b890ab524", + "className": "mb-2" + }, + { + "type": "button", + "actionType": "dialog", + "dialog": { + "title": "${'object_layouts.object_layouts_form.grouping_set' | t}", + "size": "lg", + "body": [ + { + "type": "form", + "mode": "normal", + "body": [ + { + "type": "steedos-input-table", + "name": "field_groups", + "addable": true, + "draggable": true, + "editable": true, + "fields": [ + { + "name": "group_name", + "type": "text", + "label": "${'object_layouts.object_layouts_form.group_name' | t}", + "id": "u:ee2fb813a3e7" + }, + { + "type": "text", + "name": "visible_on", + "label": "${'object_layouts.object_layouts_form.visible_on' | t}" + } + ], + "id": "u:e9f43ef94d08" + } + ] + } + ], + "onEvent": { + "confirm": { + "actions": [ + { + "actionType": "custom", + "args": {}, + "componentId": "", + "script": "var field_groups = _.cloneDeep(event.data.field_groups);\nvar fields = _.cloneDeep(event.data.fields);\n\n// 将数组分为 group 为空和非空的两部分\nvar groupsPartition = _.partition(fields, function(item) {\n return !item.group;\n});\nvar emptyGroups = groupsPartition[0];\nvar nonEmptyGroups = groupsPartition[1];\n\n// 创建排序映射\nvar sortOrderMap = _.fromPairs(_.map(field_groups, function(item, index) {\n return [item.group_name, index];\n}));\n\n// 对非空 group 的部分进行排序\nvar sortedNonEmptyGroups = _.sortBy(nonEmptyGroups, function(item) {\n return sortOrderMap[item.group];\n});\n\n// 合并两个数组,空 group 的部分在前\nfields = emptyGroups.concat(sortedNonEmptyGroups);\n\ndoAction({\n \"componentId\": \"object-layout-form\",\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n field_groups: field_groups,\n fields: fields\n }\n }\n});\n" + } + ] + } + }, + "type": "dialog", + "id": "u:e02c8f59216e", + "closeOnEsc": false, + "closeOnOutside": false, + "showCloseButton": true + }, + "label": "${'object_layouts.object_layouts_form.grouping_set' | t}", + "id": "u:ec9931ea883c", + "className": "mb-2" + } + ], + "editable": true, + "removable": true, + "showIndex": true, + "id": "u:22121edc42b1", + "amis": { + "columnsTogglable": false + }, + "dialog": { + "title": "字段明细", + "onEvent": { + "confirm": { + "actions": [ + { + "actionType": "custom", + "script": "var eventForm = event.context.scoped.getComponentById('object-layout-form');\nsetTimeout(function() {\n var form = eventForm;\n var data = form && _.clone(form.getData());\n var fields = data.fields;\n var field_groups = data.field_groups;\n\n // 将fields分为 group 为空和非空的两部分\n var groupsPartition = _.partition(fields, function(item) {\n return !item.group;\n });\n var emptyGroups = groupsPartition[0];\n var nonEmptyGroups = groupsPartition[1];\n\n // 创建排序映射\n var sortOrderMap = _.fromPairs(_.map(field_groups, function(item, index) {\n return [item.group_name, index];\n }));\n\n // 对非空 group 的部分进行排序\n var sortedNonEmptyGroups = _.sortBy(nonEmptyGroups, function(item) {\n return sortOrderMap[item.group];\n });\n\n // 合并两个数组,空 group 的部分在前\n fields = emptyGroups.concat(sortedNonEmptyGroups);\n form.setValues({ fields: fields });\n}, 500);" + } + ] + }, + "cancel": { + "actions": [ + { + "actionType": "custom", + "script": "var form = event.context.scoped.getComponentById('object-layout-form');\nvar data = form && _.clone(form.getData());\nvar fields = data.fields;\nvar field_groups = data.field_groups;\n\n// 将 fields 分为 group 为空和非空的两部分\nvar groupsPartition = _.partition(fields, function(item) {\n return !item.group;\n});\nvar emptyGroups = groupsPartition[0];\nvar nonEmptyGroups = groupsPartition[1];\n\n// 创建排序映射\nvar sortOrderMap = _.fromPairs(_.map(field_groups, function(item, index) {\n return [item.group_name, index];\n}));\n\n// 对非空 group 的部分进行排序\nvar sortedNonEmptyGroups = _.sortBy(nonEmptyGroups, function(item) {\n return sortOrderMap[item.group];\n});\n\n// 合并两个数组,空 group 的部分在前\nfields = emptyGroups.concat(sortedNonEmptyGroups);\nform.setValues({fields: fields});" + } + ] + } + } + } + } + ], + "id": "u:ac5b7818b88f", + "affixFooter": false, + "api": { + "method": "get", + "url": "${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/fields/layout_options", + "adaptor": "let data = payload.data;data.fields_options = data.options;data.field_groups_options = lodash.uniq(lodash.compact(lodash.map(data.options, \"group\"))) || [];delete data.options;payload.data = data; return payload;", + "sendOn": "!!this.object_name", + "data": null, + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + } + }, + "className": "col-span-2 m-0", + "placeholder": "-", + "onEvent": { + "fetchInited": { + "actions": [ + { + "actionType": "custom", + "script": "const mixingGroupsFromFields = function (input, formData) { const groupsOptions = input.field_groups_options; const groups = formData.field_groups || []; const object_field_groups = formData.object_field_groups || []; const groupsForMixing = groupsOptions.map(function (item) { return { group_name: item } }); const mixedGroups = lodash.unionBy(groups, groupsForMixing, object_field_groups, \"group_name\"); return { field_groups: mixedGroups }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \"object-layout-form\", args: { value: mixingGroupsFromFields(eventData, context.props.data) }});" + } + ] + } + }, + "messages": {} + } + }, + "related_lists": { + "amis": { + "type": "service", + "id": "u:dbadaff47153", + "api": { + "method": "get", + "url": "${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/relatedLists/options", + "sendOn": "!!this.object_name", + "adaptor": "let data = payload.data;data.related_lists_options = data.options;delete data.options;payload.data = data;return payload;", + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + } + }, + "className": "col-span-2 m-0", + "affixFooter": false, + "body": [ + { + "name": "related_lists", + "type": "steedos-input-table", + "editable": true, + "removable": true, + "draggable": false, + "showIndex": true, + "columns": [ + "related_field_fullname", + "label", + "field_names", + "visible_on" + ], + "fields": [ + { + "name": "related_field_fullname", + "label": "${'object_layouts.object_layouts_form.related_list_name' | t}", + "type": "select", + "amis": { + "source": "${related_lists_options}", + "menuTpl": "", + "id": "u:beecbd5b6b69" + }, + "id": "u:5204fc0fbe1c" + }, + { + "name": "label", + "label": "${'object_layouts.object_layouts_form.related_list_label' | t}", + "type": "text", + "id": "u:1267e4351d66", + "placeholder": "-" + }, + { + "name": "field_names", + "label": "${'object_layouts.object_layouts_form.field_names' | t}", + "type": "select", + "amis": { + "source": { + "method": "get", + "url": "/service/api/amis-metadata-objects/objects/${related_field_fullname|split:.|first}/fields/options", + "cache": 60000, + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + } + }, + "id": "u:e2ece172d739" + }, + "id": "u:ce65d4020107", + "placeholder": "-" + }, + { + "name": "sort_field_name", + "label": "${'object_layouts.object_layouts_form.sort_field_name' | t}", + "type": "select", + "amis": { + "source": { + "method": "get", + "url": "/service/api/amis-metadata-objects/objects/${related_field_fullname|split:.|first}/fields/options", + "cache": 60000, + "headers": { + "Authorization": "Bearer ${context.tenantId},${context.authToken}" + } + } + }, + "id": "u:3dbee6a855c4", + "multiple": true + }, + { + "name": "sort_order", + "label": "${'object_layouts.object_layouts_form.sort_order' | t}", + "type": "select", + "amis": { + "source": "${sort_order_options}" + }, + "id": "u:13cb3d304615" + }, + { + "name": "filters", + "label": "${'object_layouts.object_layouts_form.filters_rule' | t}", + "type": "code", + "amis": { + "language": "javascript", + "description": "${'object_layouts.object_layouts_form.filters_rule_description' | t}", + "minRows": 3, + "maxRows": 20 + }, + "breakpoint": "*", + "id": "u:e4c367804b67" + }, + { + "name": "visible_on", + "label": "${'object_layouts.object_layouts_form.visibile_on' | t}", + "type": "text", + "breakpoint": "*", + "id": "u:1e1dc52d7c33" + }, + { + "name": "page_size", + "label": "${'object_layouts.object_layouts_form.page_size' | t}", + "type": "number", + "breakpoint": "*", + "id": "u:f9bbd9567bbd" + } + ], + "headerToolbar": [ + { + "type": "button", + "actionType": "dialog", + "dialog": { + "title": "${'object_layouts.object_layouts_form.set_related_list' | t}", + "body": [ + { + "type": "transfer", + "name": "picked_related_lists", + "sortable": true, + "source": "${related_lists_options}", + "value": "${related_lists|pick:related_field_fullname | split}", + "searchable": true, + "id": "u:ab6a6c9c8677", + "joinValues": false, + "extractValue": true + } + ], + "onEvent": { + "confirm": { + "actions": [ + { + "actionType": "custom", + "script": "const related_lists = [];\nconst picked_related_lists = _.cloneDeep(event.data.picked_related_lists);\n_.forEach(picked_related_lists, function (related_list) {\n const table_related_list = _.find(event.data.related_lists, { related_field_fullname: related_list });\n if (table_related_list) {\n related_lists.push(table_related_list)\n } else {\n related_lists.push({\n related_field_fullname: related_list,sort_order: \"asc\"\n })\n }\n})\ndoAction({\n \"componentId\": \"object-layout-form\",\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n related_lists\n }\n }\n});" + } + ] + } + }, + "type": "dialog", + "size": "md", + "id": "u:3663990f226a", + "closeOnEsc": false, + "closeOnOutside": false, + "showCloseButton": true + }, + "label": "${'object_layouts.object_layouts_form.set_related_list' | t}", + "id": "u:b9a5d3b611d7", + "className": "mb-2" + } + ], + "id": "u:95aea10231d3", + "amis": { + "columnsTogglable": false + }, + "dialog": { + "title": "子表明细" + } + } + ], + "messages": {} + } + }, + "field_groups": { + "hidden": true } }, - "label": "对象表单", - "objectApiName": "object_layouts", - "recordId": "${recordId}", - "enableTabs": true, - "debug": false, - "fieldsExtend": "{\n \"profiles\":{\n \"amis\":{\n \"type\": \"select\",\n \"name\": \"profiles\",\n \"required\": true,\n \"joinValues\": false,\n \"extractValue\": true,\n \"labelField\": \"label\",\n \"multiple\": true,\n \"labelClassName\": \"text-left\",\n \"checkAll\": true,\n \"source\": {\n \"method\": \"post\",\n \"url\": \"\\${context.rootUrl}/graphql\",\n \"data\": {\n \"query\": \"{options:permission_set(filters: [\\\"type\\\", \\\"=\\\", \\\"profile\\\"]){name,label}}\"\n },\n \"requestAdaptor\": \"\",\n \"adaptor\": \"\",\n \"headers\": {\n \"Authorization\": \"Bearer \\${context.tenantId},\\${context.authToken}\"\n }\n },\n \"valueField\": \"name\",\n \"searchable\": true,\n \"id\": \"u:3c65447a8a6e\",\n \"defaultCheckAll\": false,\n \"checkAllLabel\": \"全选\",\n \"autoComplete\":\"\",\n \"menuTpl\":\"\"\n }\n },\n \"buttons\": {\n \"amis\": {\n \"type\":\"service\",\n \"body\":[\n {\n \"type\": \"crud\",\n \"name\": \"buttons\",\n \"label\": \"按钮\",\n \"strictMode\": true,\n \"affixHeader\": false,\n \"editable\": true,\n \"addable\": false,\n \"removable\": true,\n \"draggable\": false,\n \"columns\": [\n {\n \"name\": \"button_name_label\",\n \"label\": \"\\${'object_layouts.object_layouts_form.button_name_label' | t}\",\n \"type\": \"tpl\",\n \"tpl\": \"\\${buttons_options|filter:value:equals:button_name|pick:label}\",\n \"id\": \"u:302f8fadccd3\"\n },\n {\n \"name\": \"visible_on\",\n \"label\": \"\\${'object_layouts.object_layouts_form.visibile_on' | t}\",\n \"className\": \"w-6/12\",\n \"quickEdit\": {\n \"type\": \"input-text\",\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForButton = function (input, prop_name) { let currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const button_name = rowValue.button_name; if (currentPropValue.startsWith(\\\"\\\\$\\\\{\\\")) { currentPropValue = \\\"\\\\\\\\\\\" + currentPropValue }; rowValue[prop_name] = currentPropValue; let newButtons = formValue.buttons.map(function (item) { if (item.button_name == button_name) { return Object.assign({}, item, rowValue); } else { return item; } }); return { buttons: newButtons }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForButton(eventData, \\\"visible_on\\\") }});\"\n }\n ]\n }\n },\n \"tpl\": \"<%=data.visible_on%>\",\n \"name\": \"visible_on\",\n \"id\": \"u:daa771bd34b9\",\n \"mode\": \"popOver\"\n },\n \"id\": \"u:3c35211aa1a0\",\n \"placeholder\": \"-\"\n }\n ],\n \"className\": \"col-span-2 m-0\",\n \"labelClassName\": \"text-left\",\n \"footable\": false,\n \"headerToolbar\": [\n {\n \"type\": \"button\",\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"title\": \"\\${'object_layouts.object_layouts_form.button_set' | t}\",\n \"body\": [\n {\n \"type\": \"transfer\",\n \"name\": \"picked_buttons\",\n \"sortable\": true,\n \"source\": \"\\${buttons_options}\",\n \"value\": \"\\${buttons|pick:button_name}\",\n \"searchable\": true,\n \"id\": \"u:d6e067c40e83\"\n }\n ],\n \"onEvent\": {\n \"confirm\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const clearButtons = function (input) { return { buttons: [] }};const convertDataForButtons = function (input) { let pickedButtons = input.picked_buttons || []; const superButtons = _.keyBy(input.__super.buttons, 'button_name'); if (typeof pickedButtons === \\\"string\\\") { pickedButtons = pickedButtons.split(\\\",\\\"); }; const convertedButtons = pickedButtons.map(function (key) { return superButtons[key] || { button_name: key } }); return { buttons: convertedButtons }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: clearButtons() }});setTimeout(function () { doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: convertDataForButtons(eventData) } });}, 300);\"\n }\n ]\n }\n },\n \"type\": \"dialog\",\n \"id\": \"u:a0027ac6f8c1\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"md\"\n },\n \"label\": \"\\${'object_layouts.object_layouts_form.button_set' | t}\",\n \"id\": \"u:1ac8afc8a9bb\"\n }\n ],\n \"headerToolbarClassName\": \"px-1 pb-3\",\n \"source\": \"\\${buttons}\",\n \"id\": \"u:a5d43b752494\",\n \"perPageAvailable\": [\n 10\n ],\n \"messages\": {},\n \"onEvent\": {\n \"rowClick\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForButton = function (input, prop_name) { const currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const button_name = rowValue.button_name;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForButton(eventData, \\\"visible_on\\\") }});\"\n }\n ]\n }\n }\n }\n ],\n \"api\": {\n \"method\": \"get\",\n \"url\": \"\\${context.rootUrl}/service/api/amis-metadata-objects/objects/\\${object_name}/actions/options\",\n \"adaptor\": \"let data = payload.data;data.buttons_options = data.options;delete data.options;payload.data = data;return payload;\",\n \"sendOn\": \"!!this.object_name\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n \n }\n },\n \"fields\":{\n \"amis\":{\n \"type\": \"service\",\n \"body\": [\n {\n \"name\": \"fields\",\n \"required\": true,\n \"type\": \"crud\",\n \"strictMode\": true,\n \"affixHeader\": false,\n \"editable\": true,\n \"addable\": false,\n \"removable\": true,\n \"draggable\": false,\n \"columns\": [\n {\n \"name\": \"field_name_label\",\n \"label\": \"\\${'object_layouts.object_layouts_form.fields' | t}\",\n \"type\": \"tpl\",\n \"tpl\": \"\\${fields_options|filter:value:equals:field_name|pick:label}\",\n \"id\": \"u:b95c69a1cd84\"\n },\n {\n \"name\": \"is_readonly\",\n \"label\": \"\\${'object_layouts.object_layouts_form.readonly' | t}\",\n \"quickEdit\": {\n \"type\": \"checkbox\",\n \"tpl\": null,\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"mode\": \"inline\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const fieldGroupKey = \\\"group\\\";const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; } return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); };};const quickEidtSaveForField = function (input, prop_name) { const currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const field_name = rowValue.field_name; rowValue[prop_name] = currentPropValue; let newFields = formValue.fields.map(function (item) { if (item.field_name == field_name) { return Object.assign({}, item, rowValue); } else { return item; } }); const fieldGroups = input.__super.__super.field_groups; const groupNames = lodash.compact(lodash.map(fieldGroups, \\\"group_name\\\")); newFields.sort(getFieldsSortFun(groupNames)); return { fields: newFields }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForField(eventData, \\\"is_readonly\\\") }});\"\n }\n ]\n }\n },\n \"id\": \"u:8cb44f3db16c\",\n \"name\": \"is_readonly\"\n },\n \"id\": \"u:5081e6e1af55\",\n \"placeholder\": \"-\"\n },\n {\n \"name\": \"is_required\",\n \"label\": \"\\${'object_layouts.object_layouts_form.required' | t}\",\n \"quickEdit\": {\n \"mode\": \"inline\",\n \"type\": \"checkbox\",\n \"className\": \"m-0\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const fieldGroupKey = \\\"group\\\";const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; } return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); };};const quickEidtSaveForField = function (input, prop_name) { const currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const field_name = rowValue.field_name; rowValue[prop_name] = currentPropValue; let newFields = formValue.fields.map(function (item) { if (item.field_name == field_name) { return Object.assign({}, item, rowValue); } else { return item; } }); const fieldGroups = input.__super.__super.field_groups; const groupNames = lodash.compact(lodash.map(fieldGroups, \\\"group_name\\\")); newFields.sort(getFieldsSortFun(groupNames)); return { fields: newFields }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForField(eventData, \\\"is_required\\\") }});\"\n }\n ]\n }\n },\n \"tpl\": null,\n \"labelClassName\": \"text-left\",\n \"id\": \"u:bbd1c15b6504\",\n \"name\": \"is_required\"\n },\n \"id\": \"u:e54afb5cc05c\",\n \"placeholder\": \"-\"\n },\n {\n \"name\": \"group\",\n \"label\": \"\\${'object_layouts.object_layouts_form.grouping' | t}\",\n \"quickEdit\": {\n \"type\": \"select\",\n \"className\": \"m-0\",\n \"source\": \"\\${field_groups|pick:group_name}\",\n \"checkAll\": false,\n \"selectFirst\": false,\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const fieldGroupKey = \\\"group\\\"; const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; } return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); }; }; const quickEidtSaveForField = function (input, prop_name) { const currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const field_name = rowValue.field_name; rowValue[prop_name] = currentPropValue; let newFields = formValue.fields.map(function (item) { if (item.field_name == field_name) { return Object.assign({}, item, rowValue); } else { return item; } }); const fieldGroups = input.__super.__super.field_groups; const groupNames = lodash.compact(lodash.map(fieldGroups, \\\"group_name\\\")); newFields.sort(getFieldsSortFun(groupNames)); return { fields: newFields } }; const eventData = event.data; const clearFields = function (input) { return { fields: [] } };doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: clearFields() }});setTimeout(function () { doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForField(eventData, \\\"group\\\") } });}, 300);\"\n }\n ]\n }\n },\n \"searchable\": true,\n \"clearable\": true,\n \"name\": \"group\",\n \"id\": \"u:f75ddc45d296\",\n \"multiple\": false,\n \"mode\": \"popOver\"\n },\n \"id\": \"u:e532b1949676\",\n \"placeholder\": \"-\"\n },\n {\n \"name\": \"visible_on\",\n \"label\": \"\\${'object_layouts.object_layouts_form.visibile_on' | t}\",\n \"quickEdit\": {\n \"type\": \"input-text\",\n \"tpl\": \"<%=data.visible_on%>\",\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const fieldGroupKey = \\\"group\\\";const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; } return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); };};const quickEidtSaveForField = function (input, prop_name) { let currentPropValue = input.value; const rowValue = input.__super; const formValue = input.__super.__super.__super; const field_name = rowValue.field_name; if (currentPropValue.startsWith(\\\"\\\\$\\\\{\\\")) { currentPropValue = \\\"\\\\\\\\\\\" + currentPropValue }; rowValue[prop_name] = currentPropValue; let newFields = formValue.fields.map(function (item) { if (item.field_name == field_name) { return Object.assign({}, item, rowValue); } else { return item; } }); const fieldGroups = input.__super.__super.field_groups; const groupNames = lodash.compact(lodash.map(fieldGroups, \\\"group_name\\\")); newFields.sort(getFieldsSortFun(groupNames)); return { fields: newFields }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForField(eventData, \\\"visible_on\\\") }});\"\n }\n ]\n }\n },\n \"name\": \"visible_on\",\n \"id\": \"u:624913811ecc\",\n \"minRows\": 3,\n \"maxRows\": 20,\n \"mode\": \"popOver\"\n },\n \"breakpoint\": \"*\",\n \"id\": \"u:e3618b8b4c52\",\n \"placeholder\": \"-\"\n }\n ],\n \"className\": \"col-span-2 m-0\",\n \"labelClassName\": \"text-left\",\n \"source\": \"\\${fields}\",\n \"footable\": false,\n \"headerToolbar\": [\n {\n \"type\": \"button\",\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"title\": \"\\${'object_layouts.object_layouts_form.field_set' | t}\",\n \"body\": [\n {\n \"type\": \"transfer\",\n \"name\": \"picked_fields\",\n \"sortable\": true,\n \"source\": \"\\${fields_options}\",\n \"value\": \"\\${fields|pick:field_name}\",\n \"searchable\": true,\n \"id\": \"u:502c4ecd81b6\"\n }\n ],\n \"onEvent\": {\n \"confirm\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const fieldGroupKey = \\\"group\\\";const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; }; return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); };};const clearFields = function (input) { return { fields: [] }};const convertDataForFields = function (input) { let pickedFields = input.picked_fields || []; const superFields = _.keyBy(input.__super.fields, 'field_name'); if (typeof pickedFields === \\\"string\\\") { pickedFields = pickedFields.split(\\\",\\\"); }; const fieldOptions = lodash.keyBy(input.__super.__super.__super.__super.__super.fields_options, \\\"value\\\"); const convertedFields = pickedFields.map(function (field_name) { const superField = superFields[field_name]; if (superField) { return superField; } else { const fieldOption = fieldOptions[field_name]; return { field_name: field_name, is_readonly: fieldOption.readonly, is_required: fieldOption.required, group: fieldOption.group } } }); const fieldGroups = input.__super.__super.__super.__super.__super.field_groups; const groupNames = lodash.compact(lodash.map(fieldGroups, \\\"group_name\\\")); convertedFields.sort(getFieldsSortFun(groupNames)); return { fields: convertedFields }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: clearFields() }});setTimeout(function () { doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: convertDataForFields(eventData) } });}, 300);\"\n }\n ]\n }\n },\n \"type\": \"dialog\",\n \"size\": \"md\",\n \"id\": \"u:c405734543e0\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true\n },\n \"label\": \"\\${'object_layouts.object_layouts_form.field_set' | t}\",\n \"id\": \"u:853b890ab524\"\n },\n {\n \"type\": \"button\",\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"title\": \"\\${'object_layouts.object_layouts_form.grouping_set' | t}\",\n \"size\": \"lg\",\n \"body\": [\n {\n \"type\": \"input-table\",\n \"name\": \"setting_groups\",\n \"addable\": true,\n \"draggable\": true,\n \"editable\": true,\n \"columns\": [\n {\n \"name\": \"group_name\",\n \"label\": \"\\${'object_layouts.object_layouts_form.group_name' | t}\",\n \"id\": \"u:ee2fb813a3e7\"\n },\n {\n \"name\": \"visible_on\",\n \"label\": \"\\${'object_layouts.object_layouts_form.visible_on' | t}\"\n }\n ],\n \"value\": \"\\${field_groups}\",\n \"removable\": true,\n \"id\": \"u:e9f43ef94d08\"\n }\n ],\n \"onEvent\": {\n \"confirm\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"args\": {},\n \"componentId\": \"\",\n \"script\": \"const fieldGroupKey = \\\"group\\\";const getFieldsSortFun = function (groupNames) { return function (m, n) { var tempM = !!m[fieldGroupKey] ? 1 : 0; var tempN = !!n[fieldGroupKey] ? 1 : 0; if (!m[fieldGroupKey] || !n[fieldGroupKey]) { return tempM - tempN; }; return groupNames.indexOf(m[fieldGroupKey]) - groupNames.indexOf(n[fieldGroupKey]); };};const clearFields = function (input) { return { fields: [] }};const convertDataForGroups = function (input) { const settingGroups = input.setting_groups || []; const convertedGroups = lodash.uniqBy(settingGroups.map(function (item) { return { group_name: item.group_name, visible_on: item.visible_on } }), \\\"group_name\\\"); const groupNames = lodash.compact(lodash.map(convertedGroups, \\\"group_name\\\")); const fields = input.__super.__super.items; fields.sort(getFieldsSortFun(groupNames)); return { field_groups: convertedGroups, fields: fields }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: clearFields() }});doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: convertDataForGroups(eventData) }});\"\n }\n ]\n }\n },\n \"type\": \"dialog\",\n \"id\": \"u:e02c8f59216e\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true\n },\n \"label\": \"\\${'object_layouts.object_layouts_form.grouping_set' | t}\",\n \"id\": \"u:ec9931ea883c\"\n }\n ],\n \"headerToolbarClassName\": \"px-1 pb-3\",\n \"id\": \"u:22121edc42b1\"\n }\n ],\n \"id\": \"u:ac5b7818b88f\",\n \"affixFooter\": false,\n \"api\": {\n \"method\": \"get\",\n \"url\": \"\\${context.rootUrl}/service/api/amis-metadata-objects/objects/\\${object_name}/fields/layout_options\",\n \"adaptor\": \"let data = payload.data;data.fields_options = data.options;data.field_groups_options = lodash.uniq(lodash.compact(lodash.map(data.options, \\\"group\\\"))) || [];delete data.options;payload.data = data; return payload;\",\n \"sendOn\": \"!!this.object_name\",\n \"data\": null,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n },\n \"className\": \"col-span-2 m-0\",\n \"placeholder\": \"-\",\n \"onEvent\": {\n \"fetchInited\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const mixingGroupsFromFields = function (input, formData) { const groupsOptions = input.field_groups_options; const groups = formData.field_groups || []; const object_field_groups = formData.object_field_groups || []; const groupsForMixing = groupsOptions.map(function (item) { return { group_name: item } }); const mixedGroups = lodash.unionBy(groups, groupsForMixing, object_field_groups, \\\"group_name\\\"); return { field_groups: mixedGroups }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: mixingGroupsFromFields(eventData, context.props.data) }});\"\n }\n ]\n }\n },\n \"messages\": {}\n }\n },\n \"related_lists\":{\n \"amis\":{\n \"type\": \"service\",\n \"id\": \"u:dbadaff47153\",\n \"api\": {\n \"method\": \"get\",\n \"url\": \"\\${context.rootUrl}/service/api/amis-metadata-objects/objects/\\${object_name}/relatedLists/options\",\n \"sendOn\": \"!!this.object_name\",\n \"adaptor\": \"let data = payload.data;data.related_lists_options = data.options;delete data.options;payload.data = data;return payload;\",\n \"headers\": {\n \"Authorization\": \"Bearer \\${context.tenantId},\\${context.authToken}\"\n }\n },\n \"className\": \"col-span-2 m-0\",\n \"affixFooter\": false,\n \"body\": [\n {\n \"name\": \"related_lists\",\n \"type\": \"crud\",\n \"strictMode\": true,\n \"affixHeader\": false,\n \"editable\": true,\n \"addable\": true,\n \"removable\": true,\n \"draggable\": false,\n \"columns\": [\n {\n \"name\": \"related_field_fullname_label\",\n \"label\": \"\\${'object_layouts.object_layouts_form.related_list_name' | t}\",\n \"type\": \"tpl\",\n \"tpl\": \"\\${related_lists_options|filter:value:equals:related_field_fullname|pick:label}\",\n \"id\": \"u:5204fc0fbe1c\"\n },\n {\n \"name\": \"label\",\n \"label\": \"\\${'object_layouts.object_layouts_form.related_list_label' | t}\",\n \"quickEdit\": {\n \"type\": \"input-text\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, prop_name) { const currentPropValue = input.value; const rowValue = input; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); }; return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, \\\"label\\\") }});\"\n }\n ]\n }\n },\n \"labelRemark\": \"\\${'object_layouts.object_layouts_form.related_list_label_remark' | t}\",\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"id\": \"u:5b30f2a71830\",\n \"name\": \"label\",\n \"mode\":\"popOver\"\n },\n \"id\": \"u:1267e4351d66\",\n \"placeholder\": \"-\"\n },\n {\n \"name\": \"field_names\",\n \"label\": \"\\${'object_layouts.object_layouts_form.field_names' | t}\",\n \"quickEdit\": {\n \"type\": \"transfer-picker\",\n \"source\": {\n \"method\": \"get\",\n \"url\": \"/service/api/amis-metadata-objects/objects/\\${related_field_fullname|split:.|first}/fields/options\",\n \"cache\": 60000,\n \"headers\": {\n \"Authorization\": \"Bearer \\${context.tenantId},\\${context.authToken}\"\n }\n },\n \"searchable\": true,\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { const currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"field_names\\\") }});\"\n }\n ]\n }\n },\n \"joinValues\": false,\n \"extractValue\": true,\n \"mode\": \"inline\",\n \"id\": \"u:a85f62af394f\",\n \"name\": \"field_names\"\n },\n \"type\": \"tpl\",\n \"tpl\": \"<%= data.related_object_fields_options && data.related_object_fields_options[data.related_field_fullname] ? data.related_object_fields_options[data.related_field_fullname].filter(function(item){ return data.field_names && data.field_names.indexOf(item.value) > -1;}).map(function(item){return item.label}) : data.field_names%>\",\n \"id\": \"u:ce65d4020107\",\n \"placeholder\": \"-\"\n },\n {\n \"name\": \"sort_field_name\",\n \"label\": \"\\${'object_layouts.object_layouts_form.sort_field_name' | t}\",\n \"quickEdit\": {\n \"type\": \"transfer-picker\",\n \"joinValues\": false,\n \"extractValue\": true,\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { const currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"sort_field_name\\\") }});\"\n }\n ]\n }\n },\n \"source\": {\n \"method\": \"get\",\n \"url\": \"/service/api/amis-metadata-objects/objects/\\${related_field_fullname|split:.|first}/fields/options\",\n \"cache\": 60000,\n \"headers\": {\n \"Authorization\": \"Bearer \\${context.tenantId},\\${context.authToken}\"\n }\n },\n \"searchable\": true,\n \"name\": \"sort_field_name\",\n \"id\": \"u:c1e3daddf92c\",\n \"mode\": \"inline\"\n },\n \"tpl\": \"<%= data.related_object_fields_options && data.related_object_fields_options[data.related_field_fullname] ? data.related_object_fields_options[data.related_field_fullname].filter(function(item){ return data.sort_field_name && data.sort_field_name.indexOf(item.value) > -1;}).map(function(item){return item.label}) : data.sort_field_name%>\",\n \"id\": \"u:3dbee6a855c4\"\n },\n {\n \"name\": \"sort_order\",\n \"label\": \"\\${'object_layouts.object_layouts_form.sort_order' | t}\",\n \"quickEdit\": {\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { const currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"sort_order\\\") }});\"\n }\n ]\n }\n },\n \"joinValues\": false,\n \"extractValue\": true,\n \"clearable\": true,\n \"labelField\": \"label\",\n \"valueField\": \"value\",\n \"mode\": \"popOver\",\n \"source\": \"\\${sort_order_options}\",\n \"type\": \"select\",\n \"name\": \"sort_order\",\n \"id\": \"u:951e05ace916\",\n \"multiple\": false\n },\n \"breakpoint\": \"*\",\n \"type\": \"tpl\",\n \"tpl\": \"\\${sort_order_options|filter:value:equals:sort_order|pick:label}\",\n \"id\": \"u:13cb3d304615\"\n },\n {\n \"name\": \"filters\",\n \"label\": \"\\${'object_layouts.object_layouts_form.filters_rule' | t}\",\n \"quickEdit\": {\n \"type\": \"editor\",\n \"language\": \"javascript\",\n \"description\": \"\\${'object_layouts.object_layouts_form.filters_rule_description' | t}\",\n \"tpl\": \"<%=data.filters%>\",\n \"className\": \"col-span-2 m-0\",\n \"labelClassName\": \"text-left\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { const currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"filters\\\") }});\"\n }\n ]\n }\n },\n \"name\": \"filters\",\n \"id\": \"u:0436e626f06a\",\n \"minRows\": 3,\n \"maxRows\": 20\n },\n \"breakpoint\": \"*\",\n \"id\": \"u:e4c367804b67\"\n },\n {\n \"name\": \"visible_on\",\n \"label\": \"\\${'object_layouts.object_layouts_form.visibile_on' | t}\",\n \"quickEdit\": {\n \"type\": \"input-text\",\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { let currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; if (currentPropValue.startsWith(\\\"\\\\$\\\\{\\\")) { currentPropValue = \\\"\\\\\\\\\\\" + currentPropValue }; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"visible_on\\\") }});\"\n }\n ]\n }\n },\n \"tpl\": \"<%=data.visible_on%>\",\n \"name\": \"visible_on\",\n \"id\": \"u:3106cc0f9cc7\",\n \"minRows\": 3,\n \"maxRows\": 20,\n \"mode\": \"popOver\"\n },\n \"breakpoint\": \"*\",\n \"id\": \"u:1e1dc52d7c33\"\n },\n {\n \"name\": \"page_size\",\n \"label\": \"\\${'object_layouts.object_layouts_form.page_size' | t}\",\n \"quickEdit\": {\n \"type\": \"input-number\",\n \"precision\": 0,\n \"className\": \"m-0\",\n \"labelClassName\": \"text-number\",\n \"onEvent\": {\n \"change\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const quickEidtSaveForRelatedList = function (input, rowValue, prop_name) { const currentPropValue = input.value; delete rowValue.event; const formValue = rowValue.__super.__super; const related_field_fullname = rowValue.related_field_fullname; rowValue[prop_name] = currentPropValue; let newRelatedLists = formValue.related_lists.map(function (item) { if (item.related_field_fullname == related_field_fullname) { if (prop_name === \\\"related_field_fullname\\\") { return { related_field_fullname: currentPropValue, sort_order: \\\"asc\\\" } } else { return Object.assign({}, item, rowValue); } } else { return item; } }); const newFormDoc = { related_lists: newRelatedLists }; if (prop_name === \\\"field_names\\\" || prop_name === \\\"sort_field_name\\\") { const currentOptions = {}; currentOptions[related_field_fullname] = input.options; newFormDoc.related_object_fields_options = Object.assign({}, formValue.related_object_fields_options, currentOptions); } return newFormDoc;};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: quickEidtSaveForRelatedList(eventData, context.props.data, \\\"page_size\\\") }});\"\n }\n ]\n }\n },\n \"name\": \"page_size\",\n \"mode\": \"popOver\",\n \"id\": \"u:0e261f265511\"\n },\n \"breakpoint\": \"*\",\n \"id\": \"u:f9bbd9567bbd\"\n }\n ],\n \"className\": \"col-span-2 m-0\",\n \"labelClassName\": \"text-left\",\n \"headerToolbar\": [\n {\n \"type\": \"button\",\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"title\": \"\\${'object_layouts.object_layouts_form.set_related_list' | t}\",\n \"body\": [\n {\n \"type\": \"transfer\",\n \"name\": \"picked_related_lists\",\n \"sortable\": true,\n \"source\": \"\\${related_lists_options}\",\n \"value\": \"\\${related_lists|pick:related_field_fullname}\",\n \"searchable\": true,\n \"id\": \"u:ab6a6c9c8677\"\n }\n ],\n \"onEvent\": {\n \"confirm\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"const clearRelatedLists = function (input) { return { related_lists: [] }};const convertDataForRelatedLists = function (input) { let pickedRelateds = input.picked_related_lists || []; const superRelateds = _.keyBy(input.__super.related_lists, 'related_field_fullname'); if (typeof pickedRelateds === \\\"string\\\") { pickedRelateds = pickedRelateds.split(\\\",\\\"); } const convertedRelateds = pickedRelateds.map(function (key) { return superRelateds[key] || { related_field_fullname: key, sort_order: \\\"asc\\\" } }); return { related_lists: convertedRelateds }};const eventData = event.data;doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: clearRelatedLists() }});setTimeout(function () { doAction({ actionType: 'setValue', componentId: \\\"object-layout-form\\\", args: { value: convertDataForRelatedLists(eventData) } });}, 300);\"\n }\n ]\n }\n },\n \"type\": \"dialog\",\n \"size\": \"md\",\n \"id\": \"u:3663990f226a\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true\n },\n \"label\": \"\\${'object_layouts.object_layouts_form.set_related_list' | t}\",\n \"id\": \"u:b9a5d3b611d7\"\n }\n ],\n \"headerToolbarClassName\": \"px-1 pb-3\",\n \"source\": \"\\${related_lists}\",\n \"footable\": false,\n \"columnsTogglable\": false,\n \"messages\": {},\n \"tableClassName\": \"min-w-max\",\n \"id\": \"u:95aea10231d3\"\n }\n ],\n \"messages\": {}\n }\n },\n \"field_groups\":{\n \"hidden\": true\n }\n}", "form": { "id": "object-layout-form", "data": { diff --git a/services/standard-object-database/main/default/objects/object_layouts.object.yml b/services/standard-object-database/main/default/objects/object_layouts.object.yml index ba51360dc9..8a53aaa952 100644 --- a/services/standard-object-database/main/default/objects/object_layouts.object.yml +++ b/services/standard-object-database/main/default/objects/object_layouts.object.yml @@ -64,7 +64,7 @@ fields: } group: general_information buttons: - type: grid + type: table blackbox: true is_wide: true depend_on: @@ -76,6 +76,31 @@ fields: reference_to_field: name depend_on: - object_name + amis: + { + "autoComplete": + { + "method": "get", + "url": "${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/actions/options", + "sendOn": "!!this.object_name", + "headers": + { + "Authorization": "Bearer ${context.tenantId},${context.authToken}", + }, + "cache": 120000, + }, + "source": + { + "method": "get", + "url": "${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/actions/options", + "sendOn": "!!this.object_name", + "headers": + { + "Authorization": "Bearer ${context.tenantId},${context.authToken}", + }, + "cache": 120000, + }, + } buttons.$.visible_on: label: Visible on type: textarea @@ -85,10 +110,13 @@ fields: blackbox: true is_wide: true hidden: false + label: 字段分组 field_groups.$.group_name: type: text + label: 名称 field_groups.$.visible_on: type: text + label: 显示条件 fields: type: grid is_wide: true