@lcap/nasl
Version:
NetEase Application Specific Language
436 lines (430 loc) • 20.4 kB
JavaScript
;
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.genTableColumnTemplateTableDesigner = exports.genTableTemplateTableDesigner = exports.genTableColumnBlock = exports.genTableBlock = exports.genTableRemoveLogic = exports.genTableLoadLogic = exports.genTableTemplate = exports.genTableColumnTemplate = exports.genTableColumnTemplateMeta = void 0;
const utils = __importStar(require("../utils"));
const _1 = require(".");
const utils_1 = require("./utils");
function genTableColumnTemplateMeta(property, currentName = 'current') {
const { entity } = property;
const dataSource = entity.parentNode;
const lowerEntityName = utils.firstLowerCase(entity.name);
let valueExpression = `${currentName}.item.${lowerEntityName}.${property.name}`;
const title = (property.label || property.name).replace(/"/g, '"');
if (property.relationEntity) {
const relationLowerEntityName = utils.firstLowerCase(property.relationEntity);
const relationEntity = dataSource?.findEntityByName(property.relationEntity);
const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity);
valueExpression = `${currentName}.item.${relationLowerEntityName}.${displayedProperty?.name || property.relationProperty}`;
}
return { lowerEntityName, valueExpression, title };
}
exports.genTableColumnTemplateMeta = genTableColumnTemplateMeta;
/**
* 根据实体属性生成表格列模板
* @param property 实体属性
*/
function genTableColumnTemplate(property, currentName = 'current') {
const { lowerEntityName, valueExpression, title } = genTableColumnTemplateMeta(property, currentName);
const getText = (property) => {
if (property.typeAnnotation.typeName === 'Boolean') {
return `
<u-text v-if="${valueExpression}" text="是"></u-text>
<u-text v-if="!${valueExpression}" text="否"></u-text>
`;
}
return `<u-text :text="${valueExpression}"></u-text>`;
};
return `<u-table-view-column field="${lowerEntityName}.${property.name}">
<template #title><u-text text="${title}"></u-text></template>
<template #cell="current">
<u-linear-layout gap="small">
${getText(property)}
</u-linear-layout>
</template>
<template #expander="current">
<u-table-view-expander
@toggle="current.toggle">
</u-table-view-expander>
</template>
</u-table-view-column>`;
}
exports.genTableColumnTemplate = genTableColumnTemplate;
/**
* 生成表格模板
* @param entity 实体
* @param nameGroup 命名组
*/
function genTableTemplate(entity, nameGroup, newLogic, modifyable, entryFromCall) {
const currentName = nameGroup.currentName || 'current';
const properties = entity.properties.filter((0, _1.filterProperty)('inTable'));
let dataSourceValue = `(params) => ${newLogic.name}(elements.$ce.page, elements.$ce.size,elements.$ce.sort,elements.$ce.order)`;
if (['genCurdMultipleKeyBlock'].includes(entryFromCall)) {
dataSourceValue = `(params) => ${newLogic.name}(elements.$ce.page, elements.$ce.size,elements.$ce.sort,elements.$ce.order,${nameGroup.viewVariableFilter})`;
}
return `<u-table-view ref="${nameGroup.viewElementMainView}" :dataSource="${dataSourceValue}" dataSchema="${nameGroup.structure}"
valueField="${utils.firstLowerCase(entity.name)}.${entity.properties.find((p) => p.primaryKey)?.name || 'id'}"
:pagination="true" :showSizer="true" :pageSize="20" :pageNumber="1">
<u-table-view-column type="index" width="60">
<template #title><u-text text="序号"></u-text></template>
<template #cell="current"></template>
<template #expander="current">
<u-table-view-expander
@toggle="current.toggle">
</u-table-view-expander>
</template>
</u-table-view-column>
${properties.map((property) => `${genTableColumnTemplate(property, currentName)}\n`).join('')}
<u-table-view-column>
<template #title><u-text text="操作"></u-text></template>
<template #cell="current">
<u-linear-layout gap="small">
<u-link ${modifyable ? `@click="${nameGroup.viewLogicModify || 'modify'}"` : ''}>修改</u-link>
<u-link @click="${nameGroup.viewLogicRemove}">删除</u-link>
</u-linear-layout>
</template>
<template #expander="current">
<u-table-view-expander
@toggle="current.toggle">
</u-table-view-expander>
</template>
</u-table-view-column>
</u-table-view>
`;
}
exports.genTableTemplate = genTableTemplate;
/**
* 生成表格 load 逻辑
* @param entity 实体
*/
function genTableLoadLogic(entity, nameGroup, newLogic, supportFilter) {
const moduleNode = entity.app;
const moduleNamespace = moduleNode?.getNamespace();
const params = [
(0, _1.genLogicParam)(`${newLogic.params[0].name}`, 'params.page'),
(0, _1.genLogicParam)(`${newLogic.params[1].name}`, 'params.size'),
(0, _1.genLogicParam)(`${newLogic.params[2].name}`, 'params.sort'),
(0, _1.genLogicParam)(`${newLogic.params[3].name}`, 'params.order'),
];
if (supportFilter)
params.push((0, _1.genLogicParam)(`${newLogic.params[4].name}`, nameGroup.viewVariableFilter));
return utils_1.NaslNode.Logic({
name: nameGroup.viewLogicLoad,
params: [
utils_1.NaslNode.Param({
name: 'params',
typeAnnotation: utils_1.NaslUITypeAnnotation.DataSourceParams,
}),
],
returns: [
utils_1.NaslNode.Return({
name: 'result',
typeAnnotation: null,
}),
],
variables: [],
body: [
utils_1.NaslLogicItem.Start,
utils_1.NaslLogicItem.Assignment({
left: utils_1.NaslLogicItem.Identifier({
name: 'result',
}),
right: utils_1.NaslLogicItem.CallLogic({
calleeNamespace: `${moduleNamespace}.logics`,
calleeName: newLogic.name,
arguments: params,
}),
}),
utils_1.NaslLogicItem.End,
],
});
}
exports.genTableLoadLogic = genTableLoadLogic;
/**
* 生成表格 remove 逻辑
* @param entity 实体
*/
function genTableRemoveLogic(entity, nameGroup) {
const lowerEntityName = utils.firstLowerCase(entity.name);
const currentName = nameGroup.currentName || 'current';
const { ns } = entity;
const deleteLogic = ns?.logics?.find((logic) => logic.name === 'delete');
const idPropertys = entity.properties.filter((property) => property.primaryKey);
return utils_1.NaslNode.Logic({
name: nameGroup.viewLogicRemove,
params: [],
returns: [],
variables: [],
body: [
utils_1.NaslLogicItem.Start,
utils_1.NaslLogicItem.CallLogic({
calleeNamespace: deleteLogic.getNamespace(),
calleeName: deleteLogic.name,
arguments: idPropertys.map((idProperty) => {
let paramFromLogic = (0, _1.getParamFromLogic)(deleteLogic, idProperty.name);
// 如果旧逻辑,但是新导入表中,id的name 不是id 的话,就直接使用名称叫id的
if (!paramFromLogic) {
paramFromLogic = (0, _1.getParamFromLogic)(deleteLogic, 'id');
}
return (0, _1.genLogicParam)(paramFromLogic.name, `${currentName}.item.${lowerEntityName}.${paramFromLogic.name}`);
}),
}),
(0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'),
utils_1.NaslLogicItem.End,
],
});
}
exports.genTableRemoveLogic = genTableRemoveLogic;
/**
* 生成表格区块
* @param entity 实体
* @param view 所插入的页面,用于生成逻辑名字,去重等
* @notice 目前 logic 名去重做成前置处理了,与 mergeBlock 的后置处理不冲突
* (页面 load 名) -产生-> (logic 名) -产生-> (structure 名)
* load -> load_someView_tableView
* load_select_student -> load_someView_select_student
*/
function genTableBlock(entity, oldNode, genTable) {
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.viewVariableEntity = likeComponent.getVariableUniqueName(utils.firstLowerCase(entity.name));
nameGroup.viewLogicRemove = likeComponent.getLogicUniqueName('remove');
// 当前节点的currentName
nameGroup.currentName = oldNode.getCurrentName();
// 收集所有和本实体关联的实体
const entitySet = new Set();
entitySet.add(entity);
const newLogics = [];
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 allEntities = [...entitySet];
const entityLogic = (0, _1.genQueryLogic)(allEntities, nameGroup, false, true, module);
newLogics.push(entityLogic);
return `
<template>
${genTable ? genTable(entity, nameGroup, entityLogic) : genTableTemplate(entity, nameGroup, entityLogic)}
</template>
<definition>
{
"viewLogics": [
${JSON.stringify(genTableLoadLogic(entity, nameGroup, entityLogic, false))},
${JSON.stringify(genTableRemoveLogic(entity, nameGroup))}
],
"logics": ${JSON.stringify(newLogics)}
}
</definition>
`;
}
exports.genTableBlock = genTableBlock;
function genTableColumnBlock(property, oldNode, genTableColumnTemplate) {
const likeComponent = oldNode?.likeComponent;
const { entity } = property;
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.viewVariableEntity = likeComponent.getVariableUniqueName(utils.firstLowerCase(entity.name));
nameGroup.viewLogicRemove = likeComponent.getLogicUniqueName('remove');
// 收集所有和本实体关联的实体
const entitySet = new Set();
entitySet.add(entity);
const newLogics = [];
const properties = [property];
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 allEntities = [...entitySet];
const entityLogic = (0, _1.genQueryLogic)(allEntities, nameGroup, false, true, module);
newLogics.push(entityLogic);
let dataSourceValue = `(params) => ${entityLogic.name}(elements.$ce.page, elements.$ce.size,elements.$ce.sort,elements.$ce.order)`;
return `
<template>
${genTableColumnTemplate
? genTableColumnTemplate(nameGroup)
: `<u-table-view ref="${nameGroup.viewElementMainView}" :dataSource="${dataSourceValue}" :pagination="true" :pageSize="20" :pageNumber="1" :showSizer="true" dataSchema="${nameGroup.structure}">
${properties.map((property) => `${genTableColumnTemplate(property)}\n`).join('')}
</u-table-view>`}
</template>
<definition>
{
"viewLogics": [
${JSON.stringify(genTableLoadLogic(entity, nameGroup, entityLogic, false))}
],
"logics": ${JSON.stringify(newLogics)}
}
</definition>
`;
}
exports.genTableColumnBlock = genTableColumnBlock;
exports.default = genTableBlock;
function genTableTemplateTableDesigner(entity, nameGroup, newLogic, modifyable, entryFromCall, optionsMap, dataSourcesMap) {
const currentName = nameGroup.currentName || 'current';
const _properties = entity.properties.filter((0, _1.filterProperty)('inTable'));
// properties 中name 是createdTime和updatedTime移到最后面
const lastProperties = _properties.filter((property) => ['createdTime', 'updatedTime'].includes(property.name));
const otherProperties = _properties.filter((property) => !['createdTime', 'updatedTime'].includes(property.name));
const properties = [...otherProperties, ...lastProperties];
function getName(name) {
const _name = name.replace(/[A-Z]/g, (item) => '-' + item.toLowerCase());
return _name[0] === '-' ? _name.slice(1) : _name;
}
let dataSourceValue = `(params) => ${newLogic.name}(elements.$ce.page, elements.$ce.size,elements.$ce.sort,elements.$ce.order)`;
if (['genCurdMultipleKeyBlock'].includes(entryFromCall)) {
dataSourceValue = `(params) => ${newLogic.name}(elements.$ce.page, elements.$ce.size,elements.$ce.sort,elements.$ce.order,${nameGroup.viewVariableFilter})`;
}
return `
<u-linear-layout style="background: #fff; padding: 15px" >
<u-button color="primary" @click="${nameGroup.viewLogicCreate}" style="margin-right: 5px" icon="add">新 增</u-button>
<u-uploader
style="--custom-start: auto;margin-right: 5px"
display="inline"
url="/api/${getName(entity.name)}/import"
url-field="filePath"
:limit="999"
max-size="50MB"
converter="json"
:file-icon-switcher="false"
:download-icon-switcher="false"
:file-size="false"
:show-file-list="false"
name="file"
accept=""
@success="${nameGroup.viewLogicReload}"
>
<template #file-list>
<i-ico
style="margin: 0px 8px 0px 0px"
flag="file-icon"
name="file-default"
icotype="only"
></i-ico>
<u-text
style="
margin: 0px 8px 0px 0px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: inherit;
"
flag="file-name"
text="文件名称"
></u-text>
<u-text style="margin: 0px 8px 0px 0px" flag="file-size" text="文件大小"></u-text>
<i-ico
style="margin: 0px 8px 0px 0px"
flag="download-icon"
name="download"
icotype="only"
></i-ico>
</template>
<u-button color="default" icon="upload" text="上传"></u-button
></u-uploader>
<u-button style="margin-right: 5px" icon="download" @click="${nameGroup.viewLogicExportData}">导 出</u-button>
<u-table-view ref="${nameGroup.viewElementMainView}" :dataSource="${dataSourceValue}" dataSchema="${nameGroup.structure}"
valueField="${utils.firstLowerCase(entity.name)}.${entity.properties.find((p) => p.primaryKey)?.name || 'id'}"
:pagination="true" :showSizer="true" :pageSize="20" :pageNumber="1" style="margin-top: 12px">
<u-table-view-column type="index" width="60"><template #title><u-text text="序号"></u-text></template><template #cell="current"></template></u-table-view-column>
${properties.map((property) => `${(0, exports.genTableColumnTemplateTableDesigner)(property, currentName, optionsMap, dataSourcesMap)}\n`).join('')}
<u-table-view-column>
<template #title><u-text text="操作"></u-text></template>
<template #cell="current">
<u-link style="margin-right:5px;" @click="${nameGroup.viewLogicPreview}">详情</u-link>
<u-link ${modifyable ? `@click="${nameGroup.viewLogicModify || 'modify'}"` : ''} style="margin-right:5px;">编辑</u-link>
<u-link style="margin-right:5px;" @click="${nameGroup.viewLogicOpenDelModal}">删除</u-link>
</template>
</u-table-view-column>
</u-table-view>
</u-linear-layout>
`;
}
exports.genTableTemplateTableDesigner = genTableTemplateTableDesigner;
const genTableColumnTemplateTableDesigner = (property, currentName = 'current', optionsMap, dataSourcesMap) => {
const { entity } = property;
const hasOptions = optionsMap?.[property.name];
const hasDataSource = dataSourcesMap?.[property.name];
const dataSource = entity.parentNode;
const lowerEntityName = utils.firstLowerCase(entity.name);
let valueExpression = `${currentName}.item.${lowerEntityName}.${property.name}`;
const title = (property.label || property.name).replace(/"/g, '"');
const multiple = property?.typeAnnotation?.typeName === 'List';
if (property.relationEntity) {
const relationLowerEntityName = utils.firstLowerCase(property.relationEntity);
const relationEntity = dataSource?.findEntityByName(property.relationEntity);
const displayedProperty = (0, _1.getFirstDisplayedProperty)(relationEntity);
valueExpression = `${currentName}.item.${relationLowerEntityName}.${displayedProperty?.name || property.relationProperty}`;
}
const getText = (property) => {
if (hasOptions) {
const options = optionsMap[property.name];
return `
<u-select style="height: auto;" :preview="true" :value="${valueExpression}" placeholder="--" ${multiple ? ':multiple="true" tags-overflow="visible" ' : ''}>
${options.map((option) => `<u-select-item value="${option.value}"><u-text text="${option.label}"></u-text></u-select-item>`)}
</u-select>
`;
}
else if (property.typeAnnotation.typeName === 'Boolean') {
return `
<u-text v-if="${valueExpression}" text="是"></u-text>
<u-text v-if="!${valueExpression}" text="否"></u-text>
`;
}
else if (hasDataSource) {
const { dataSource, multiple, textField, valueField } = dataSourcesMap[property.name];
return `
<u-select :preview="true" :value.sync="${valueExpression}" placeholder="--" ${multiple ? ':multiple="true" tags-overflow="visible" ' : ''} :dataSource="(params)=>${dataSource?.calleeName}(params)" :textField="${textField}" :valueField="${valueField}"></u-select>`;
}
return `<u-text :text="${valueExpression}"></u-text>`;
};
return `<u-table-view-column field="${lowerEntityName}.${property.name}">
<template #title><u-text text="${title}"></u-text></template>
<template #cell="current">
${getText(property)}
</template>
</u-table-view-column>`;
};
exports.genTableColumnTemplateTableDesigner = genTableColumnTemplateTableDesigner;
//# sourceMappingURL=genTableBlock.js.map