@lcap/nasl
Version:
NetEase Application Specific Language
322 lines (319 loc) • 16.4 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.genBlurUpdateLogic = exports.genEditTableRemoveLogic = exports.genEditTableLoadLogic = exports.genEditTableTemplate = exports.genEditTableColumnTemplate = void 0;
const utils = __importStar(require("../utils"));
const _1 = require(".");
const utils_1 = require("./utils");
/**
* 根据实体属性生成表格列模板
* @param property 实体属性
*/
function genEditTableColumnTemplate(entity, property, nameGroup, selectNameGroupMap) {
const dataSource = entity.parentNode;
const lowerEntityName = utils.firstLowerCase(entity.name);
const valueExpression = `current.item.${lowerEntityName}.${property.name}`;
const title = property.label || property.name;
const canEditable = (property) => !property.readonly;
const getText = (property) => {
const propertyTypeName = property.typeAnnotation.typeName;
if (propertyTypeName === '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>`;
};
const genEditComponent = (property) => {
if (property.readonly)
return '';
const label = property.label || property.name;
let formItem = '';
const propertyTypeNamespace = property.typeAnnotation.typeNamespace;
const propertyTypeName = (0, utils_1.transEntityMetadataTypes)(property.typeAnnotation, dataSource.app);
const propertyTypeMaxLength = Number(property.rules
.find((item) => item.indexOf('max') > -1)
?.split('(')[1]
.slice(0, -1)) || 0;
if (property.relationEntity && selectNameGroupMap) {
// 有外键关联
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"
:autofocus="true" :opened="true" appendTo="body" ="${nameGroup.viewLogicBlurUpdate}" ="${nameGroup.viewLogicBlurUpdate}"
textField="${lowerEntityName}.${displayedProperty.name}" valueField="${lowerEntityName}.${relationProperty.name}" :pagination="true" :value.sync="${valueExpression}" :emptyValueIsNull="true">
</u-select>
`;
}
else
return '';
}
else
return '';
}
else if (propertyTypeName === 'Boolean') {
formItem += `<u-select :clearable="true" :value.sync="${valueExpression}" placeholder="请选择${label}"
:autofocus="true" :opened="true" appendTo="body" ="${nameGroup.viewLogicBlurUpdate}" ="${nameGroup.viewLogicBlurUpdate}" :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 :value.sync="${valueExpression}" placeholder="请输入${label}" :autofocus="true" ="${nameGroup.viewLogicBlurUpdate}"></u-number-input>`;
}
else if (propertyTypeName === 'Double') {
formItem = `<u-number-input :value.sync="${valueExpression}" :precision="0" :step="0" placeholder="请输入${label}" :autofocus="true" ="${nameGroup.viewLogicBlurUpdate}"></u-number-input>`;
}
else if (propertyTypeName === 'Decimal') {
formItem = `<u-number-input :value.sync="${valueExpression}" :precision="0" :step="0" placeholder="请输入${label}" :autofocus="true" ="${nameGroup.viewLogicBlurUpdate}"></u-number-input>`;
}
else if (propertyTypeName === 'String' && propertyTypeMaxLength > 256) {
formItem = `<u-validator placement="bottom" display="appear" -valid="${nameGroup.viewLogicBlurUpdate}" style="width:100%">
<u-textarea :value.sync="${valueExpression}" placeholder="请输入${label}" :autofocus="true" size="full" :emptyValueIsNull="true"></u-textarea>
</u-validator>`;
}
else if (propertyTypeName === 'Date') {
formItem = `<u-date-picker :clearable="true" :value.sync="${valueExpression}" placeholder="请选择${label}" appendTo="body" :autofocus="true" :opened="true" ="${nameGroup.viewLogicBlurUpdate}" :emptyValueIsNull="true"></u-date-picker>`;
}
else if (propertyTypeName === 'Time') {
formItem = `<u-time-picker :value.sync="${valueExpression}" placeholder="请选择${label}" appendTo="body" :autofocus="true" ="${nameGroup.viewLogicBlurUpdate}" :emptyValueIsNull="true"></u-time-picker>`;
}
else if (propertyTypeName === 'DateTime') {
formItem = `<u-date-time-picker :clearable="true" :value.sync="${valueExpression}" placeholder="请选择${label}" appendTo="body" :autofocus="true" :opened="true" ="${nameGroup.viewLogicBlurUpdate}" :emptyValueIsNull="true"></u-date-time-picker>`;
}
else {
const namespaceArr = propertyTypeNamespace?.split?.('.') || [];
const type = namespaceArr.pop();
if (type === 'enums') {
const enumeration = dataSource.app.findNodeByCompleteName(`${propertyTypeNamespace}.${propertyTypeName}`);
const namespace = enumeration?.getNamespace() || '';
const name = enumeration?.name || '';
const enumTypeAnnotationStr = `__enumTypeAnnotation_${namespace}.${name}`;
formItem += `<u-select :clearable="true"
:dataSource="$utils.EnumToList('${enumTypeAnnotationStr}')" :pageSize="50"
:value.sync="${valueExpression}" placeholder="请选择${label}"
:autofocus="true" :opened="true" appendTo="body" ="${nameGroup.viewLogicBlurUpdate}" ="${nameGroup.viewLogicBlurUpdate}" :emptyValueIsNull="true">
</u-select>`;
}
else {
formItem = `<u-validator placement="bottom" display="appear" -valid="${nameGroup.viewLogicBlurUpdate}" style="width:100%" appendTo="body">
<u-input :value.sync="${valueExpression}" placeholder="请输入${label}" :autofocus="true" size="full" :emptyValueIsNull="true"></u-input>
</u-validator>`;
}
}
return `<template #editcell="current">
<u-linear-layout gap="small">
${formItem}
</u-linear-layout>
</template>`;
};
return `<u-table-view-column field="${utils.firstLowerCase(entity.name)}.${property.name}" ${canEditable(property) ? 'type="editable"' : ''}>
<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
="current.toggle">
</u-table-view-expander>
</template>
${genEditComponent(property)}
</u-table-view-column>`;
}
exports.genEditTableColumnTemplate = genEditTableColumnTemplate;
/**
* 生成表格模板
* @param entity 实体
* @param nameGroup 命名组
*/
function genEditTableTemplate(entity, nameGroup, newLogic, selectNameGroupMap, entryFromCall) {
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 (['genCurdEditMultipleKeyBlock'].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" :defaultColumnWidth="300" editable>
<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
="current.toggle">
</u-table-view-expander>
</template>
</u-table-view-column>
${properties.map((property) => `${genEditTableColumnTemplate(entity, property, nameGroup, selectNameGroupMap)}\n`).join('')}
<u-table-view-column>
<template #title><u-text text="操作"></u-text></template>
<template #cell="current">
<u-linear-layout gap="small">
<u-link ="${nameGroup.viewLogicRemove}">删除</u-link>
</u-linear-layout>
</template>
<template #expander="current">
<u-table-view-expander
="current.toggle">
</u-table-view-expander>
</template>
</u-table-view-column>
</u-table-view>
`;
}
exports.genEditTableTemplate = genEditTableTemplate;
/**
* 生成表格 load 逻辑
* @param entity 实体
*/
function genEditTableLoadLogic(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.genEditTableLoadLogic = genEditTableLoadLogic;
/**
* 生成表格 remove 逻辑
* @param entity 实体
*/
function genEditTableRemoveLogic(entity, nameGroup) {
const lowerEntityName = utils.firstLowerCase(entity.name);
const { ns } = entity;
const deleteLogic = ns?.logics?.find((logic) => logic.name === `delete`);
const idPropertys = entity.properties.filter((property) => property.primaryKey || property.name === 'id');
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, `current.item.${lowerEntityName}.${paramFromLogic.name}`);
}),
}),
(0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'reload'),
utils_1.NaslLogicItem.End,
],
});
}
exports.genEditTableRemoveLogic = genEditTableRemoveLogic;
function genBlurUpdateLogic(entity, nameGroup) {
const callLogics = [];
if (entity.concept === 'Entity') {
const lowerEntityName = utils.firstLowerCase(entity.name);
const { ns } = entity;
const updateLogic = ns?.logics?.find((logic) => logic.name === `update`);
const valuePrefixExpression = nameGroup.valuePrefixExpression ? nameGroup.valuePrefixExpression : `current.item.${lowerEntityName}`;
callLogics.push(utils_1.NaslLogicItem.CallLogic({
calleeNamespace: updateLogic.getNamespace(),
calleeName: updateLogic.name,
arguments: [(0, _1.genLogicParam)(`${updateLogic.params[0].name}`, valuePrefixExpression)],
}));
}
return utils_1.NaslNode.Logic({
name: nameGroup.viewLogicBlurUpdate,
params: [],
returns: [],
body: [
utils_1.NaslLogicItem.Start,
(0, _1.genCallComponentLogic)(nameGroup.viewElementMainView, 'resetEdit', [
utils_1.NaslLogicItem.Argument({
keyword: 'item',
expression: utils_1.NaslLogicItem.MemberExpression({
object: utils_1.NaslLogicItem.Identifier({
name: 'current',
}),
property: utils_1.NaslLogicItem.Identifier({
name: 'item',
}),
}),
}),
]),
...callLogics,
utils_1.NaslLogicItem.End,
],
playground: [],
});
}
exports.genBlurUpdateLogic = genBlurUpdateLogic;
//# sourceMappingURL=genEditTableBlock.js.map