UNPKG

@lcap/nasl

Version:

NetEase Application Specific Language

1,038 lines (1,033 loc) 68.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.genCurdMultipleKeyBlockForTableDesigner = exports.genDelModalTemplate = exports.genFilterTemplateTableDesigner = exports.genExportExcelLogic = exports.genResetLogic = exports.genReloadLogic = exports.genGridViewMultipleKeyBlock = exports.genCurdMultipleKeyBlock = exports.genUpdateSubmitLogic = exports.genSubmitLogic = void 0; /** * 1. 从genCurdBlock组件复制,算是工行的定制化需求多主键(联合主键的支持) * 2. 改动了原来判断id的逻辑 * 3. 先简单做后续在看如何优化, * 4. 主键目前支持 Long String Double 类型接口所以只禁用了对应的三个类型 */ const utils = __importStar(require("../utils")); const utils_1 = require("./utils"); const _1 = require("."); function genFilterTemplate(entity, nameGroup, selectNameGroupMap) { const dataSource = entity.parentNode; const properties = entity.properties.filter((0, _1.filterProperty)('inFilter')); return ` <u-linear-layout> <u-form layout="inline"> ${properties .map((property) => { const vModel = `${nameGroup.viewVariableFilter}.${property.name}`; const label = (property.label || property.name).replace(/"/g, '&quot;'); let formItem = `<u-form-item layout="center"><template #label><u-text text="${label}"></u-text></template>`; const { typeAnnotation } = property || {}; const { typeNamespace: propertyTypeNamespace } = typeAnnotation || {}; const propertyTypeName = (0, utils_1.transEntityMetadataTypes)(typeAnnotation, dataSource.app); const propertyTypeMaxLength = Number(property.rules .find((item) => item.indexOf('max') > -1) ?.split('(')[1] .slice(0, -1)) || 0; if (property.relationEntity) { // 有外键关联 const relationEntity = dataSource?.findEntityByName(property.relationEntity); if (relationEntity) { const relationProperty = relationEntity.properties.find((prop) => prop.name === property.relationProperty); const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity); if (displayedProperty) { const lowerEntityName = utils.firstLowerCase(relationEntity.name); // 存在多个属性关联同一个实体的情况,因此加上属性名用以唯一标识 const key = [property.name, relationEntity.name].join('-'); const selectNameGroup = selectNameGroupMap.get(key); let dataSourceValue = `(params) => ${selectNameGroup.logic}(elements.$ce.page, elements.$ce.size)`; formItem += ` <u-select clearable placeholder="请选择${label}" :dataSource="${dataSourceValue}" :pageSize="50" textField="${lowerEntityName}.${displayedProperty.name}" valueField="${lowerEntityName}.${relationProperty.name}" :pagination="true" v-model="${vModel}" :emptyValueIsNull="true"> </u-select> `; } else return ''; } else return ''; } else if (propertyTypeName === 'Boolean') { formItem += ` <u-select clearable v-model="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"> <u-select-item :value="true" text="是">是</u-select-item> <u-select-item :value="false" text="否">否</u-select-item> </u-select> `; } else if (propertyTypeName === 'Integer' || propertyTypeName === 'Long') { formItem += `<u-number-input v-model="${vModel}" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'Double') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'Decimal') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'String' && propertyTypeMaxLength > 256) { formItem += `<u-textarea v-model="${vModel}" placeholder="请输入${label}" :emptyValueIsNull="true"></u-textarea>`; } else if (propertyTypeName === 'Date') { formItem += `<u-date-picker clearable :value.sync="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"></u-date-picker>`; } else if (propertyTypeName === 'Time') { formItem += `<u-time-picker :value.sync="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"></u-time-picker>`; } else if (propertyTypeName === 'DateTime') { formItem += `<u-date-time-picker clearable :value.sync="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"></u-date-time-picker>`; } else { const namespaceArr = propertyTypeNamespace?.split?.('.') || []; const type = namespaceArr.pop(); if (type === 'enums') { const Enum = dataSource.app.findNodeByCompleteName(propertyTypeNamespace + '.' + propertyTypeName); formItem += (0, _1.genEnumSelectBlock)(Enum, `${vModel}`, '', `请选择${label}`, true); } else { formItem += `<u-input v-model="${vModel}" placeholder="请输入${label}" :emptyValueIsNull="true"></u-input>`; } } formItem += `</u-form-item>`; return formItem; }) .join('')} <u-form-item layout="center" label-size="auto"> <u-button color="primary" @click="${nameGroup.viewLogicReload}">查 询</u-button> </u-form-item> </u-form> </u-linear-layout> <u-linear-layout mode="flex" alignment="start" justify="end"><u-button color="primary" @click="${nameGroup.viewLogicCreate}">创 建</u-button></u-linear-layout> `; } function genSaveModalTemplate(entity, nameGroup, selectNameGroupMap) { const dataSource = entity.parentNode; const properties = entity.properties.filter((0, _1.filterProperty)('inForm')); return ` <u-modal ref="${nameGroup.viewElementSaveModal}"> <template #title> <div v-if="${nameGroup.viewVariableIsUpdate}">修改</div> <div v-if="!${nameGroup.viewVariableIsUpdate}">创建</div> </template> <template #body> <u-form ref="${nameGroup.viewElementSaveModalForm}"> ${properties .map((property) => { const vModel = `${nameGroup.viewVariableInput}.${property.name}`; const label = (property.label || property.name).replace(/"/g, '&quot;'); const required = !!property.required; const rules = []; if (property.rules && property.rules.length) { property.rules.forEach((rule) => rules.push(rule)); } if (required) rules.push('required'); const rulesStr = rules.join(' | '); let formItem = `<u-form-item ${required ? ':required="true"' : ''} ${rulesStr.length ? `rules="${rulesStr}"` : ''} layout="center"><template #label><u-text text="${label}"></u-text></template>`; const { typeAnnotation } = property || {}; const { typeNamespace: propertyTypeNamespace } = typeAnnotation || {}; const propertyTypeName = (0, utils_1.transEntityMetadataTypes)(typeAnnotation, dataSource.app); const propertyTypeMaxLength = Number(property.rules .find((item) => item.indexOf('max') > -1) ?.split('(')[1] .slice(0, -1)) || 0; if (property.relationEntity) { // 有外键关联 const relationEntity = dataSource?.findEntityByName(property.relationEntity); if (relationEntity) { const relationProperty = relationEntity.properties.find((prop) => prop.name === property.relationProperty); const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity); if (displayedProperty) { const lowerEntityName = utils.firstLowerCase(relationEntity.name); // 存在多个属性关联同一个实体的情况,因此加上属性名用以唯一标识 const key = [property.name, relationEntity.name].join('-'); const selectNameGroup = selectNameGroupMap.get(key); let dataSourceValue = `(params) => ${selectNameGroup.logic}(elements.$ce.page, elements.$ce.size)`; formItem += ` <u-select :clearable="true" placeholder="请选择${label}" textField="${lowerEntityName}.${displayedProperty.name}" valueField="${lowerEntityName}.${relationProperty.name}" :dataSource="${dataSourceValue}" :pageSize="50" :pagination="true" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} v-model="${vModel}" :emptyValueIsNull="true"> </u-select> `; } else return ''; } else return ''; } else if (propertyTypeName === 'Boolean') { formItem += ` <u-select :clearable="true" v-model="${vModel}" placeholder="请选择${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"> <u-select-item :value="true" text="是"><u-text text="是"></u-text></u-select-item> <u-select-item :value="false" text="否"><u-text text="否"></u-text></u-select-item> </u-select>`; } else if (propertyTypeName === 'Integer' || propertyTypeName === 'Long') { formItem += `<u-number-input v-model="${vModel}" placeholder="请输入${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''}></u-number-input>`; } else if (propertyTypeName === 'Double') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''}></u-number-input>`; } else if (propertyTypeName === 'Decimal') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''}></u-number-input>`; } else if (propertyTypeName === 'String' && propertyTypeMaxLength > 256) { formItem += `<u-textarea v-model="${vModel}" placeholder="请输入${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"></u-textarea>`; } else if (propertyTypeName === 'Date') { formItem += `<u-date-picker :clearable="true" :value.sync="${vModel}" placeholder="请选择${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"></u-date-picker>`; } else if (propertyTypeName === 'Time') { formItem += `<u-time-picker :value.sync="${vModel}" placeholder="请选择${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"></u-time-picker>`; } else if (propertyTypeName === 'DateTime') { formItem += `<u-date-time-picker :clearable="true" :value.sync="${vModel}" placeholder="请选择${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"></u-date-time-picker>`; } else { const namespaceArr = propertyTypeNamespace?.split?.('.') || []; const type = namespaceArr.pop(); if (type === 'enums') { const Enum = dataSource.app.findNodeByCompleteName(`${propertyTypeNamespace}.${propertyTypeName}`); formItem += (0, _1.genEnumSelectBlock)(Enum, `${vModel}`, '', `请选择${label}`, true); } else { formItem += `<u-input v-model="${vModel}" placeholder="请输入${label}" ${property.primaryKey ? `:disabled="${nameGroup.viewVariableIsUpdate}"` : ''} :emptyValueIsNull="true"></u-input>`; } } formItem += `</u-form-item>\n`; return formItem; }) .join('')} </u-form> </template> <template #foot> <u-linear-layout> <u-button color="primary" @click="${nameGroup.viewLogicUpdateSubmit}()" v-if="${nameGroup.viewVariableIsUpdate}">提交修改</u-button> <u-button color="primary" @click="${nameGroup.viewLogicSubmit}()" v-if="!${nameGroup.viewVariableIsUpdate}">立即创建</u-button> </u-linear-layout> </template> </u-modal>`; } function genInitLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicInit, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clear', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'struct', expression: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableFilter, }), }), utils_1.NaslLogicItem.Argument({ keyword: 'mode', expression: utils_1.NaslLogicItem.StringLiteral({ value: 'deep', }), }), ], }), utils_1.NaslLogicItem.End, ], playground: [], }); } function genCreateLogic(nameGroup, entity) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicCreate, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableIsUpdate, }), right: utils_1.NaslLogicItem.BooleanLiteral({ value: 'false', }), }), utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableInput, }), right: utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clone', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'obj', expression: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableEntity, }), }), ], }), }), (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModal, 'open'), utils_1.NaslLogicItem.End, ], playground: [], }); } function genSubmitLogic(entity, nameGroup) { const { ns } = entity; const createLogic = ns?.logics?.find((logic) => logic.name === `create`); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicSubmit, params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.IfStatement({ test: utils_1.NaslLogicItem.MemberExpression({ object: (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModalForm, 'validate'), property: utils_1.NaslLogicItem.Identifier({ name: 'valid', }), }), consequent: [ utils_1.NaslLogicItem.CallLogic({ calleeNamespace: createLogic.getNamespace(), calleeName: createLogic.name, arguments: [(0, _1.genLogicParam)(`${createLogic.params[0].name}`, nameGroup.viewVariableInput)], }), (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModal, 'close'), (0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'), ], alternate: [], }), utils_1.NaslLogicItem.End, ], playground: [], }); } exports.genSubmitLogic = genSubmitLogic; function genUpdateSubmitLogic(entity, nameGroup) { const { ns } = entity; const updateLogic = ns?.logics?.find((logic) => logic.name === `update`); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicUpdateSubmit, params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.IfStatement({ test: utils_1.NaslLogicItem.MemberExpression({ object: (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModalForm, 'validate'), property: utils_1.NaslLogicItem.Identifier({ name: 'valid', }), }), consequent: [ utils_1.NaslLogicItem.CallLogic({ calleeNamespace: updateLogic.getNamespace(), calleeName: updateLogic.name, arguments: [(0, _1.genLogicParam)(`${updateLogic.params[0].name}`, nameGroup.viewVariableInput)], }), (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModal, 'close'), (0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'), ], alternate: [], }), utils_1.NaslLogicItem.End, ], playground: [], }); } exports.genUpdateSubmitLogic = genUpdateSubmitLogic; function genModifyLogic(entity, nameGroup) { const lowerEntityName = utils.firstLowerCase(entity.name); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicModify, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableIsUpdate, }), right: utils_1.NaslLogicItem.BooleanLiteral({ value: 'true', }), }), utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableInput, }), right: utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clone', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'obj', expression: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.Identifier({ name: 'current', }), property: utils_1.NaslLogicItem.Identifier({ name: 'item', }), }), property: utils_1.NaslLogicItem.Identifier({ name: lowerEntityName, }), }), }), ], }), }), (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModal, 'open'), utils_1.NaslLogicItem.End, ], playground: [], }); } function genDetailLogic(entity, nameGroup) { const lowerEntityName = utils.firstLowerCase(entity.name); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicPreview, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariablePreview, }), right: utils_1.NaslLogicItem.BooleanLiteral({ value: 'true', }), }), utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableInput, }), right: utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clone', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'obj', expression: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.Identifier({ name: 'current', }), property: utils_1.NaslLogicItem.Identifier({ name: 'item', }), }), property: utils_1.NaslLogicItem.Identifier({ name: lowerEntityName, }), }), }), ], }), }), (0, _1.genCallComponentLogic)(nameGroup.viewElementSaveModal, 'open'), utils_1.NaslLogicItem.End, ], playground: [], }); } // 列表(全) function genCurdMultipleKeyBlock(entity, oldNode, localTemplate = {}) { const likeComponent = oldNode?.likeComponent; const dataSource = entity.parentNode; const module = dataSource.app; const viewElementMainView = likeComponent.getViewElementUniqueName('tableView'); const nameGroup = (0, _1.genUniqueQueryNameGroup)(module, likeComponent, viewElementMainView); nameGroup.viewElementMainView = viewElementMainView; nameGroup.viewElementFilterForm = likeComponent.getViewElementUniqueName('filterform'); nameGroup.viewElementSaveModal = likeComponent.getViewElementUniqueName('saveModal'); nameGroup.viewElementSaveModalForm = likeComponent.getViewElementUniqueName('saveModalForm'); nameGroup.viewLogicRemove = likeComponent.getLogicUniqueName('remove'); nameGroup.viewLogicInit = likeComponent.getLogicUniqueName('init'); nameGroup.viewLogicCreate = likeComponent.getLogicUniqueName('create'); nameGroup.viewLogicModify = likeComponent.getLogicUniqueName('modify'); nameGroup.viewLogicSubmit = likeComponent.getLogicUniqueName('submit'); nameGroup.viewLogicUpdateSubmit = likeComponent.getLogicUniqueName('updateSubmit'); nameGroup.viewLogicReload = likeComponent.getLogicUniqueName('reload'); nameGroup.viewVariableEntity = likeComponent.getVariableUniqueName(utils.firstLowerCase(entity.name)); nameGroup.viewVariableInput = likeComponent.getVariableUniqueName('input'); nameGroup.viewVariableFilter = likeComponent.getVariableUniqueName('filter'); nameGroup.viewVariableIsUpdate = likeComponent.getVariableUniqueName('isUpdate'); // 收集所有和本实体关联的实体 const entitySet = new Set(); entitySet.add(entity); const selectNameGroupMap = new Map(); const newLogics = []; const newLoadSelectLogics = []; entity.properties.forEach((property) => { // 有外键关联 if (property.relationEntity) { const relationEntity = dataSource?.findEntityByName(property.relationEntity); if (relationEntity) { const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity); if (displayedProperty) { entitySet.add(relationEntity); const viewElementSelect = likeComponent.getViewElementUniqueName('select'); const selectNameGroup = (0, _1.genUniqueQueryNameGroup)(module, likeComponent, viewElementSelect, false, relationEntity.name); selectNameGroup.viewElementSelect = viewElementSelect; // 存在多个属性关联同一个实体的情况,因此加上属性名用以唯一标识 const key = [property.name, relationEntity.name].join('-'); selectNameGroupMap.set(key, selectNameGroup); const newLogic = (0, _1.genQueryLogic)([relationEntity], selectNameGroup, false, false, module); newLogics.push(newLogic); newLoadSelectLogics.push((0, _1.genLoadSelectLogic)(relationEntity, selectNameGroup, newLogic)); } } } }); const allEntities = [...entitySet]; const entityLogic = (0, _1.genQueryLogic)(allEntities, nameGroup, true, true, module); newLogics.push(entityLogic); const genFilter = localTemplate.genFilterTemplateLocal || genFilterTemplate; const genTable = localTemplate.genTableTemplateLocal || _1.genTableTemplate; const genSaveModal = localTemplate.genSaveModalTemplateLocal || genSaveModalTemplate; const wrapper = localTemplate.genWrapper || (code => `<u-linear-layout direction="vertical">${code}</u-linear-layout>`); return `<template> ${wrapper(`${genFilter(entity, nameGroup, selectNameGroupMap)} ${genTable(entity, nameGroup, entityLogic, true, 'genCurdMultipleKeyBlock')} ${genSaveModal(entity, nameGroup, selectNameGroupMap)}`)} </template> <definition> { "viewVariables": [ { "concept": "Variable", "name": "${nameGroup.viewVariableEntity}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableInput}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableFilter}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableIsUpdate}", "typeAnnotation": ${JSON.stringify(utils_1.NaslCoreTypeAnnotation.Boolean)} } ], "viewLogics": [ ${JSON.stringify((0, _1.genTableLoadLogic)(entity, nameGroup, entityLogic, true))}, ${JSON.stringify((0, _1.genTableRemoveLogic)(entity, nameGroup))}, ${JSON.stringify(genInitLogic(nameGroup))}, ${JSON.stringify((localTemplate.genCreateLogicLocal || genCreateLogic)(nameGroup, entity))}, ${JSON.stringify((localTemplate.genModifyLogicLocal || genModifyLogic)(entity, nameGroup))}, ${JSON.stringify((localTemplate.genSubmitLogicLocal || genSubmitLogic)(entity, nameGroup))}, ${JSON.stringify((localTemplate.genUpdateSubmitLogicLocal || genUpdateSubmitLogic)(entity, nameGroup))}, ${JSON.stringify((localTemplate.genReloadLogicLocal || genReloadLogic)(nameGroup))} ${newLoadSelectLogics.map((logic) => `,${JSON.stringify(logic)}`).join('\n')} ], "viewBindEvents": [ { "concept": "BindEvent", "arguments": [], "name": "created", "calleeNamespace": "", "calleeName": "${nameGroup.viewLogicInit}" } ], "logics": ${JSON.stringify(newLogics)} } </definition> `; } exports.genCurdMultipleKeyBlock = genCurdMultipleKeyBlock; // 数据网格(全) function genGridViewMultipleKeyBlock(entity, oldNode) { const likeComponent = oldNode?.likeComponent; const dataSource = entity.parentNode; const module = dataSource.app; const viewElementMainView = likeComponent.getViewElementUniqueName('gridView'); const nameGroup = (0, _1.genUniqueQueryNameGroup)(module, likeComponent, viewElementMainView); nameGroup.viewElementMainView = viewElementMainView; nameGroup.viewElementSaveModal = likeComponent.getViewElementUniqueName('saveModal'); nameGroup.viewElementSaveModalForm = likeComponent.getViewElementUniqueName('saveModalForm'); nameGroup.viewLogicRemove = likeComponent.getLogicUniqueName('remove'); nameGroup.viewLogicInit = likeComponent.getLogicUniqueName('init'); nameGroup.viewLogicCreate = likeComponent.getLogicUniqueName('create'); nameGroup.viewLogicModify = likeComponent.getLogicUniqueName('modify'); nameGroup.viewLogicSubmit = likeComponent.getLogicUniqueName('submit'); nameGroup.viewLogicUpdateSubmit = likeComponent.getLogicUniqueName('updateSubmit'); nameGroup.viewLogicReload = likeComponent.getLogicUniqueName('reload'); nameGroup.viewVariableEntity = likeComponent.getVariableUniqueName(utils.firstLowerCase(entity.name)); nameGroup.viewVariableInput = likeComponent.getVariableUniqueName('input'); nameGroup.viewVariableFilter = likeComponent.getVariableUniqueName('filter'); nameGroup.viewVariableIsUpdate = likeComponent.getVariableUniqueName('isUpdate'); // 收集所有和本实体关联的实体 const entitySet = new Set(); entitySet.add(entity); const selectNameGroupMap = new Map(); const newLogics = []; const newLoadSelectLogics = []; entity.properties.forEach((property) => { // 有外键关联 if (property.relationEntity) { const relationEntity = dataSource?.findEntityByName(property.relationEntity); if (relationEntity) { const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity); if (displayedProperty) { entitySet.add(relationEntity); const viewElementSelect = likeComponent.getViewElementUniqueName('select'); const selectNameGroup = (0, _1.genUniqueQueryNameGroup)(module, likeComponent, viewElementSelect, false, relationEntity.name); selectNameGroup.viewElementSelect = viewElementSelect; // 存在多个属性关联同一个实体的情况,因此加上属性名用以唯一标识 const key = [property.name, relationEntity.name].join('-'); selectNameGroupMap.set(key, selectNameGroup); const newLogic = (0, _1.genQueryLogic)([relationEntity], selectNameGroup, false, false, module); newLogics.push(newLogic); newLoadSelectLogics.push((0, _1.genLoadSelectLogic)(relationEntity, selectNameGroup, newLogic)); } } } }); const allEntities = [...entitySet]; const entityLogic = (0, _1.genQueryLogic)(allEntities, nameGroup, true, false, module); newLogics.push(entityLogic); return `<template> <u-linear-layout direction="vertical"> ${genFilterTemplate(entity, nameGroup, selectNameGroupMap)} ${(0, _1.genGridViewTemplate)(entity, nameGroup, entityLogic, true, 'genCurdMultipleKeyBlock')} ${genSaveModalTemplate(entity, nameGroup, selectNameGroupMap)} </u-linear-layout> </template> <definition> { "viewVariables": [ { "concept": "Variable", "name": "${nameGroup.viewVariableEntity}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableInput}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableFilter}", "typeAnnotation": ${JSON.stringify(utils_1.NaslTypeAnnotation.Reference({ typeNamespace: entity.getNamespace(), typeName: entity.name, }))} }, { "concept": "Variable", "name": "${nameGroup.viewVariableIsUpdate}", "typeAnnotation": ${JSON.stringify(utils_1.NaslCoreTypeAnnotation.Boolean)} } ], "viewLogics": [ ${JSON.stringify((0, _1.genGridViewLoadLogic)(entity, nameGroup, entityLogic, true))}, ${JSON.stringify((0, _1.genGridViewRemoveLogic)(entity, nameGroup))}, ${JSON.stringify(genInitLogic(nameGroup))}, ${JSON.stringify(genCreateLogic(nameGroup))}, ${JSON.stringify(genModifyLogic(entity, nameGroup))}, ${JSON.stringify(genSubmitLogic(entity, nameGroup))}, ${JSON.stringify(genUpdateSubmitLogic(entity, nameGroup))}, ${JSON.stringify(genReloadLogic(nameGroup))} ${newLoadSelectLogics.map((logic) => `,${JSON.stringify(logic)}`).join('\n')} ], "viewBindEvents": [ { "concept": "BindEvent", "arguments": [], "name": "created", "calleeNamespace": "", "calleeName": "${nameGroup.viewLogicInit}" } ], "logics": ${JSON.stringify(newLogics)} } </definition> `; } exports.genGridViewMultipleKeyBlock = genGridViewMultipleKeyBlock; function genReloadLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicReload, params: [], returns: [], body: [utils_1.NaslLogicItem.Start, (0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'), utils_1.NaslLogicItem.End], playground: [], }); } exports.genReloadLogic = genReloadLogic; function genResetLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicReset, params: [], returns: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clear', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'struct', expression: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableFilter, }), }), utils_1.NaslLogicItem.Argument({ keyword: 'mode', expression: utils_1.NaslLogicItem.StringLiteral({ value: 'deep', }), }), ], }), (0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'), utils_1.NaslLogicItem.End, ], playground: [], }); } exports.genResetLogic = genResetLogic; function genExportExcelLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicExportData, params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.CallLogic({ calleeNamespace: `elements.${nameGroup.viewElementMainView}.logics`, calleeName: 'exportExcel', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'page', expression: { concept: 'NumericLiteral', value: '1', typeAnnotation: { concept: 'TypeAnnotation', typeKind: 'primitive', typeNamespace: 'nasl.core', typeName: 'Long', }, }, }), utils_1.NaslLogicItem.Argument({ keyword: 'size', expression: { concept: 'NumericLiteral', value: '9999', typeAnnotation: { concept: 'TypeAnnotation', typeKind: 'primitive', typeNamespace: 'nasl.core', typeName: 'Long', }, }, }), utils_1.NaslLogicItem.Argument({ keyword: 'filename', expression: null, }), utils_1.NaslLogicItem.Argument({ keyword: 'sort', expression: null, }), utils_1.NaslLogicItem.Argument({ keyword: 'order', expression: null, }), utils_1.NaslLogicItem.Argument({ keyword: 'excludeColumns', expression: null, }), ], }), utils_1.NaslLogicItem.End, ], playground: [], }); } exports.genExportExcelLogic = genExportExcelLogic; function genCloseModalLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicCloseModal, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariablePreview, }), right: utils_1.NaslLogicItem.BooleanLiteral({ value: 'false', }), }), utils_1.NaslLogicItem.End, ], playground: [], }); } function genOpenDelModalLogic(entity, nameGroup) { const lowerEntityName = utils.firstLowerCase(entity.name); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicOpenDelModal, description: '', params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.Assignment({ left: utils_1.NaslLogicItem.Identifier({ name: nameGroup.viewVariableInput, }), right: utils_1.NaslLogicItem.CallFunction({ calleeName: 'Clone', arguments: [ utils_1.NaslLogicItem.Argument({ keyword: 'obj', expression: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.MemberExpression({ object: utils_1.NaslLogicItem.Identifier({ name: 'current', }), property: utils_1.NaslLogicItem.Identifier({ name: 'item', }), }), property: utils_1.NaslLogicItem.Identifier({ name: lowerEntityName, }), }), }), ], }), }), (0, _1.genCallComponentLogic)(nameGroup.viewElementDelModal, 'open'), utils_1.NaslLogicItem.End, ], playground: [], }); } function genCloseDelModalLogic(nameGroup) { return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicCloseDelModal, body: [utils_1.NaslLogicItem.Start, (0, _1.genCallComponentLogic)(nameGroup.viewElementDelModal, 'close'), utils_1.NaslLogicItem.End], }); } function genDelModalSubmitLogic(entity, nameGroup) { const { ns } = entity; const deleteLogic = ns?.logics?.find((logic) => logic.name === 'delete'); return utils_1.NaslNode.Logic({ name: nameGroup.viewLogicDelModalSubmit, params: [], returns: [], variables: [], body: [ utils_1.NaslLogicItem.Start, utils_1.NaslLogicItem.CallLogic({ calleeNamespace: deleteLogic.getNamespace(), calleeName: deleteLogic.name, arguments: [ { concept: 'Argument', keyword: 'id', expression: { concept: 'MemberExpression', object: { concept: 'Identifier', name: 'input', }, property: { concept: 'Identifier', name: 'id', }, }, }, ], }), (0, _1.genCallComponentLogic)(nameGroup.viewElementDelModal, 'close'), (0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'), utils_1.NaslLogicItem.End, ], }); } function genFilterTemplateTableDesigner(entity, nameGroup, selectNameGroupMap, optionsMap, dataSourcesMap) { const dataSource = entity.parentNode; const properties = entity.properties.filter((0, _1.filterProperty)('inFilter')).filter((it) => it?.typeAnnotation?.typeName !== 'List'); const getCol = (code) => `<u-grid-layout-column :span="6" style="padding: 10px 0;">${code}</u-grid-layout-column>`; return `<u-form style="margin-bottom: 6px;padding: 15px 15px 5px 15px;background: #fff;"> <u-grid-layout> <u-grid-layout-row :repeat="24"> ${properties .map((property) => { const vModel = `${nameGroup.viewVariableFilter}.${property.name}`; const label = (property.label || property.name).replace(/"/g, '&quot;'); let formItem = `<u-form-item layout="center"><template #label><u-text text="${label}"></u-text></template>`; const { typeAnnotation } = property || {}; const { typeName: propertyTypeName, typeNamespace: propertyTypeNamespace } = typeAnnotation || {}; const propertyTypeMaxLength = Number(property.rules .find((item) => item.indexOf('max') > -1) ?.split('(')[1] .slice(0, -1)) || 0; if (optionsMap?.[property.name]) { const options = optionsMap?.[property.name]; const multiple = property?.typeAnnotation?.typeName === 'List'; formItem += ` <u-select style="height: auto;" :clearable="true" v-model="${vModel}" placeholder="请选择" ${multiple ? 'multiple' : ''} :emptyValueIsNull="true"> ${options.map((option) => `<u-select-item value="${option.value}"><u-text text="${option.label}"></u-text></u-select-item>`).join('')} </u-select> `; } else if (dataSourcesMap?.[property.name]) { const { dataSource, multiple, textField, valueField } = dataSourcesMap?.[property.name]; formItem += ` <u-select v-model="${vModel}" placeholder="请选择" ${multiple ? 'multiple' : ''} :dataSource="(params)=>${dataSource?.calleeName}(params)" :textField="${textField}" :valueField="${valueField}" :emptyValueIsNull="true"></u-select>`; } else if (property.relationEntity) { // 有外键关联 const relationEntity = dataSource?.findEntityByName(property.relationEntity); if (relationEntity) { const relationProperty = relationEntity.properties.find((prop) => prop.name === property.relationProperty); const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity); if (displayedProperty) { const lowerEntityName = utils.firstLowerCase(relationEntity.name); // 存在多个属性关联同一个实体的情况,因此加上属性名用以唯一标识 const key = [property.name, relationEntity.name].join('-'); const selectNameGroup = selectNameGroupMap.get(key); let dataSourceValue = `(params) => ${selectNameGroup.logic}(elements.$ce.page, elements.$ce.size)`; formItem += ` <u-select :clearable="true" placeholder="请选择${label}" :dataSource="${dataSourceValue}" :pageSize="50" textField="${lowerEntityName}.${displayedProperty.name}" valueField="${lowerEntityName}.${relationProperty.name}" :pagination="true" v-model="${vModel}" :emptyValueIsNull="true"> </u-select> `; } else return ''; } else return ''; } else if (propertyTypeName === 'Boolean') { formItem += ` <u-select :clearable="true" v-model="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"> <u-select-item :value="true" text="是"><u-text text="是"></u-text></u-select-item> <u-select-item :value="false" text="否"><u-text text="否"></u-text></u-select-item> </u-select> `; } else if (propertyTypeName === 'Integer' || propertyTypeName === 'Long') { formItem += `<u-number-input v-model="${vModel}" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'Double') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'Decimal') { formItem += `<u-number-input v-model="${vModel}" :precision="0" :step="0" placeholder="请输入${label}"></u-number-input>`; } else if (propertyTypeName === 'String' && propertyTypeMaxLength > 256) { formItem += `<u-textarea v-model="${vModel}" placeholder="请输入${label}" :emptyValueIsNull="true"></u-textarea>`; } else if (propertyTypeName === 'Date') { formItem += `<u-date-picker :clearable="true" :value.sync="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"></u-date-picker>`; } else if (propertyTypeName === 'Time') { formItem += `<u-time-picker :value.sync="${vModel}" placeholder="请选择${label}" style="--custom-start: auto;min-width:initial;\nmax-width:min(240px,100%);" :emptyValueIsNull="true"></u-time-picker>`; } else if (propertyTypeName === 'DateTime') { formItem += `<u-date-time-picker :clearable="true" :value.sync="${vModel}" placeholder="请选择${label}" :emptyValueIsNull="true"></u-date-time-picker>`; } else { const namespaceArr = propertyTypeNamespace?.split?.('.') || []; const type = namespaceArr.pop(); if (type === 'enums') { const Enum = dataSource.app.findNodeByCompleteName(`${propertyTypeNamespace}.${propertyTypeName}`); formItem += (0, _1.genEnumSelectBlock)(Enum, `${vModel}`, '', `请选择${label}`, true, 'pc'); } else { formItem += `<u-input v-model="${vModel}" placeholder="请输入${label}" :emptyValueIsNull="true"></u-input>`; } } formItem += `</u-form-item>`; return getCol(formItem); }) .join('')} ${getCol(`<u-form-item layout="center" label-size="auto"> <u-button color="primary" style="margin-right: 5px" @click="${nameGroup.viewLogicReload}">查 询</u-button> <u-button @click="${nameGroup.viewLogicReset}">重 置</u-button> </u-form-item>`)} </u-grid-layout-row> </u-g