UNPKG

@lcap/nasl

Version:

NetEase Application Specific Language

436 lines (430 loc) 20.4 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.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, '&quot;'); 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, '&quot;'); 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