@lcap/nasl
Version:
NetEase Application Specific Language
1,038 lines (1,033 loc) • 68.6 kB
JavaScript
"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, '"');
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, '"');
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, '"');
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