UNIVPLMDataIntegration/Admin.NET/Admin.NET.Web.Entry/wwwroot/template/web_views_index.vue.vm

462 lines
24 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
@{
// 查询表单渲染方法
void ReaderTableSearchForm(CustomTemplateEngine sender, string nameSuffix) {
@:<el-card shadow="hover" :body-style="{ padding: '5px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
@:<el-form :model="state@(nameSuffix).queryParams" ref="queryForm" :show-message="false" :inlineMessage="true" label-width="auto" style="flex: 1 1 0%">
@:<el-row :gutter="10">
if (sender.QueryFields.Any(u => u.QueryType == "like")) {
@:<el-col :xs="24" @(Model.IsHorizontal ? ":sm=\"12\" :md=\"12\" :lg=\"12\" :xl=\"12\"" : ":sm=\"12\" :md=\"8\" :lg=\"6\" :xl=\"6\"") v-if="!state@(nameSuffix).showAdvanceQueryUI">
@:<el-form-item label="关键字">
@:<el-input v-model="state@(nameSuffix).queryParams.keyword" clearable placeholder="请输入模糊查询关键字" style="width: 150px" class="w100" />
@:</el-form-item>
@:</el-col>
}
foreach (var column in sender.QueryFields) {
@:<el-col class="mb5" :xs="24" @(Model.IsHorizontal ? ":sm=\"12\" :md=\"12\" :lg=\"12\" :xl=\"12\"" : ":sm=\"12\" :md=\"8\" :lg=\"6\" :xl=\"6\"") v-if="state@(nameSuffix).showAdvanceQueryUI">
@:<el-form-item label="@(column.ColumnComment)" prop="@(column.LowerPropertyName)">
if (column.IsInputTextArea) { // 文本框
@:<el-input v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" type="textarea" placeholder="请输入@(column.ColumnComment)" @@keyup.enter.native="handleQuery(false)" class="w100" clearable />
} else if (column.IsDatePicker) { // 时间
if (column.QueryType == "~") {
@:<el-date-picker type="daterange" v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)Range" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="w100" />
} else {
@:<el-date-picker placeholder="请选择@(column.ColumnComment)" value-format="YYYY/MM/DD" v-model="state@(nameSuffix).tableQueryParams.@(column.LowerPropertyName)" class="w100" />
}
} else if (column.IsInputNumber) { // 数字
@:<el-input-number v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" placeholder="请输入@(column.ColumnComment)" @@keyup.enter.native="handleQuery(false)" class="w100" clearable />
} else if (column.IsSwitch) { // 开关
@:<el-select v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" :placeholder="'请选择@(column.ColumnComment)'" class="w100" clearable>
@:<el-option label="是" :value="1" />
@:<el-option label="否" :value="0" />
@:</el-select>
} else if (column.IsConst) { // 常量
@:<el-select v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" :placeholder="'请选择@(column.ColumnComment)'" class="w100" clearable>
@:<el-option v-for="item in userInfo.getConstDataByTypeCode('@(column.DictConfig.Code)')" :key="item.code" :label="item.name" :value="item.code" />
@:</el-select>
} else if (column.IsDict || column.IsEnum) { // 字典枚举
@:<g-sys-dict v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" code="@(column.DictConfig.Code)" render-as="select" @@keyup.enter.native="handleQuery(false)" class="w100" clearable />
} else if (column.IsTree) { // 树组件
@:<el-cascader
@::options="state@(nameSuffix).dropdownData.@(column.LowerPropertyName) ?? []"
@::props="{ value: '@(Model.GetFirstLower(column.JoinConfig.LinkPropertyName))', label: '@(Model.GetFirstLower(column.JoinConfig.DisplayPropertyNames.Split(",").First()))', checkStrictly: true, emitPath: false }"
@:v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)"
@:placeholder="请选择@(column.ColumnComment)"
@:clearable
@:filterable
@:class="w100">
@:<template #default="{ node, data }">
@:<span>@(string.Join("-", column.JoinConfig.DisplayPropertyNames.Split(",").Select(x => $"{{{{ data.{Model.GetFirstLower(x)} }}}}")))</span>
@:<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
@:</template>
@:</el-cascader>
} else if (column.IsForeignKey) { // 外键组件
var firstDisplayName = Model.GetFirstLower(column.JoinConfig.DisplayPropertyNames.Split(",").First());
var linkPropertyName = Model.GetFirstLower(column.JoinConfig.LinkPropertyName);
var leftJoinPropertyName = Model.GetFirstLower(column.LeftJoinPropertyName);
@:<pulldown-selecter
@:v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)"
@::fetch-options="handle@(column.JoinConfig.EntityName)Table"
@::query-params="{ pageSize: 10 }"
@:value-prop="@(linkPropertyName)"
@:label-prop="@(firstDisplayName)"
@:placeholder="选择@(column.ColumnComment)"
@:filterable
@:clearable
@:class="w100">
@:<template #columns>
@:<el-table-column prop="id" label="主键ID" width="150" />
@:<el-table-column prop="@(firstDisplayName)" label="@(firstDisplayName)" width="150" />
@:</template>
@:</pulldown-selecter>
@:<!--
@:<el-select v-model="state@(nameSuffix).ruleForm.@(column.LowerPropertyName)" :placeholder="'请选择@(column.ColumnComment)'" clearable@(column.Multiple ? " multiple" : "") class="w100">
@:<el-option v-for="item in state@(nameSuffix).dropdownData.@(column.LowerPropertyName) ?? []" :key="item.@(linkPropertyName)" :label="item.@(firstDisplayName)" :value="item.@(linkPropertyName)" />
@:</el-select>
@:-->
} else { // 输入框
@:<el-input v-model="state@(nameSuffix).queryParams.@(column.LowerPropertyName)" placeholder="请输入@(column.ColumnComment)" @@keyup.enter.native="handleQuery(false)" class="w100" clearable />
}
@:</el-form-item>
@:</el-col>
}
@:</el-row>
@:</el-form>
@:<el-divider style="height: calc(100% - 5px); margin: 0 10px" direction="vertical" />
@:<el-row>
@:<el-col>
@:<el-button-group>
@:<el-button type="primary" icon="ele-Search" @@click="handleQuery@(nameSuffix)(false)"> @(sender.QueryFields.Any() ? "查询" : "刷新") </el-button>
if (sender.QueryFields.Any()) {
@:<el-button icon="ele-ZoomIn" @@click="() => state@(nameSuffix).showAdvanceQueryUI = true" v-if="!state@(nameSuffix).showAdvanceQueryUI" style="margin-left:5px;"> 高级查询 </el-button>
@:<el-button icon="ele-ZoomOut" @@click="() => state@(nameSuffix).showAdvanceQueryUI = false" v-if="state@(nameSuffix).showAdvanceQueryUI" style="margin-left:5px;"> 隐藏 </el-button>
@:<el-button icon="ele-Refresh" @@click="resetQuery@(nameSuffix)"> 重置 </el-button>
}
@:</el-button-group>
@:</el-col>
@:</el-row>
@:</el-card>
}
// 表格渲染方法
void ReaderTableGrid(CustomTemplateEngine sender, string nameSuffix) {
@:<vxe-card class="full-height" style="margin-top: 5px; height: calc(100vh - 160px)">
@:<vxe-grid ref="xGrid@(nameSuffix)" class="xGrid-style" v-bind="options@(nameSuffix)" v-on="gridEvents@(nameSuffix)"@(sender.TableFields.Any(u => u.IsStatistical) ? " :footer-data=\"[{ seq: '合计' } ]\"" : "")>
@:<template #toolbar_buttons>
@:<el-button type="primary" icon="ele-Plus" @@click="handleAdd@(nameSuffix)" v-auth="'@(sender.LowerClassName)/add'"> 新增 </el-button>
@:</template>
@:<template #import_button>
@:<div style="position: absolute; right: 5px; top: 15px">
@:<el-button type="primary" @@click="handleDownload@(nameSuffix)"> 下载模板 </el-button>
@:</div>
@:</template>
@:<template #toolbar_tools></template>
@:<template #empty><el-empty :image-size="200" /></template>
@:<template #row_record="{ row }"><ModifyRecord :data="row" /></template>
@:<template #$row_sysDict="{ row, column }">
@:<g-sys-dict v-model="row[column.field]" :code="column.params?.code" :multiple="column.params?.multiple" :isConst="column.params?.isConst" />
@:</template>
@:<template #$row_switch="{ row, column }">
@:<el-tag v-if="row[column.field]" type="success">是</el-tag>
@:<el-tag v-if="!row[column.field]" type="warring">否</el-tag>
@:</template>
@:<template #$row_status="{ row, column }">
@:<el-switch v-model="row[column.field]" :active-value="1" :inactive-value="2" @@click="handleStatusChange@(nameSuffix)(row)" />
@:</template>
@:<template #$row_copy="{ row, column }">
@:{{ row[column.field] }}
@:<el-button v-if="row[column.field]" class="ml5" icon="ele-CopyDocument" text type="primary" @@click="commonFun.copyText(row[column.field]?.toString())" />
@:</template>
@:<template #$row_upload="{ row, column }">
@:<el-avatar v-if="column.params?.isImage && row[column.params?.attachmentName]?.url" :src="row[column.params?.attachmentName]?.url" />
@:<el-link v-if="column.params?.useDownload && row[column.params?.attachmentName]?.url" type="primary" :href="row[column.params?.attachmentName]?.url" target="_blank"> {{ column.params?.DownloadText }} </el-link>
@:</template>
@:<template #$row_statistical="scope">
<span class="table-footer">{{commonFun.getStatistical(scope)}}</span>
@:</template>
@:<template #row_buttons="{ row }">
@:<el-button icon="ele-Delete" size="small" text type="danger" @@click="handleDelete@(nameSuffix)(row)" v-auth="'@(sender.LowerClassName)/delete'">删除</el-button>
@:<el-button icon="ele-Edit" size="small" text type="primary" @@click="handleEdit@(nameSuffix)(row)" v-auth="'@(sender.LowerClassName)/update'">编辑</el-button>
@:<el-button icon="ele-Warning" size="small" text type="primary" @@click="handleDetail@(nameSuffix)(row)" v-auth="'@(sender.LowerClassName)/detail'">详情</el-button>
@:</template>
@:</vxe-grid>
@:</vxe-card>
}
}
<div class="sys-@(Model.LowerClassName)-container">
<splitpanes@(Model.TreeConfig == null && Model.IsHorizontal ? " horizontal" : "")>
@if (Model.TreeConfig != null) {
@:<pane size="15" style="display: flex">
@:<@(Model.TreeConfig.LowerEntityName)Tree ref="@(Model.TreeConfig.LowerEntityName)TreeRef" @@node-click="handleNodeChange" />
@:</pane>
}
<pane>
@{ ReaderTableSearchForm(Model, ""); }
@{ ReaderTableGrid(Model, ""); }
</pane>
@if (Model.SlaveTable != null) {
@:<pane>
@{ ReaderTableSearchForm(Model.SlaveTable, "Slave"); }
@{ ReaderTableGrid(Model.SlaveTable, "Slave"); }
@:</pane>
}
</splitpanes>
<Edit@(Model.ClassName)Dialog ref="edit@(Model.ClassName)DialogRef" @@handleQuery="handleQuery" />
@if (Model.SlaveTable != null) {
@:<Edit@(Model.SlaveTable.ClassName)Dialog ref="edit@(Model.SlaveTable.ClassName)DialogRef" @@handleQuery="handleQuerySlave" />
}
</div>
</template>
<!-- @(Model.BusName) -->
<script lang="ts" setup name="@(Model.LowerClassName)">
import { onMounted, reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@@/hooks/useVxeTableOptionsHook';
import commonFunction from "/@@/utils/commonFunction";
import {downloadStreamFile} from "/@@/utils/download";
@if (Model.AllFields.Concat(Model.SlaveTable?.AllFields ?? []).Any(u => u.IsConst)) {
@:import {useUserInfo} from "/@@/stores/userInfo";
}
import { Local } from '/@@/utils/storage';
import ModifyRecord from '/@@/components/table/modifyRecord.vue';
@if (Model.AllFields.Concat(Model.SlaveTable?.AllFields ?? []).Any(u => u.IsForeignKey)) {
@:import PulldownSelecter from "/@@/components/selector/pulldownSelecter.vue";
}
import Edit@(Model.ClassName)Dialog from './component/edit@(Model.ClassName)Dialog.vue';
@if (Model.SlaveTable != null) {
@:import Edit@(Model.SlaveTable.ClassName)Dialog from './component/edit@(Model.SlaveTable.ClassName)Dialog.vue';
}
@if (Model.TreeConfig != null) {
@:import @(Model.TreeConfig.EntityName)Tree from "./component/@(Model.TreeConfig.LowerEntityName)Tree.vue";
}
@if (Model.IsApiService) {
@:import { getAPI } from '/@@/utils/axios-utils';
var useApiList = new List<string>() { $"{Model.ClassName}Api" };
var useApiModelList = new List<string>() { $"Page{Model.ClassName}Input", $"Page{Model.ClassName}Output", $"Update{Model.ClassName}Input" };
if (Model.SlaveTable != null) { // 增加从表Api依赖导入
useApiList.Add($"{Model.SlaveTable.ClassName}Api");
useApiModelList.AddRange(new List<string>() { $"Page{Model.SlaveTable.ClassName}Input", $"Page{Model.SlaveTable.ClassName}Output", $"Update{Model.SlaveTable.ClassName}Input" });
}
@:import { @(string.Join(", ", useApiList)) } from '/@@/api-services/@(Model.PagePath)/api';
@:import { @(string.Join(", ", useApiModelList)) } from '/@@/api-services/@(Model.PagePath)/models';
} else {
var useApiList = new List<string>() { $"use{Model.ClassName}Api" };
if (Model.SlaveTable != null) { // 增加从表Api依赖导入
useApiList.Add($"use{Model.SlaveTable.ClassName}Api");
}
@:import { @(string.Join(", ", useApiList)) } from '/@@/api/@(Model.PagePath)/@(Model.LowerClassName)';
}
@if (Model.AllFields.Concat(Model.SlaveTable?.AllFields ?? []).Any(u => u.IsConst)) {
@:const userInfo = useUserInfo();
}
const commonFun = commonFunction();
@if(!Model.IsApiService) {
@:const @(Model.LowerClassName)Api = use@(Model.ClassName)Api();
if (Model.SlaveTable != null) {
@:const @(Model.SlaveTable.LowerClassName)Api = use@(Model.SlaveTable.ClassName)Api();
}
}
@if (Model.TreeConfig != null) {
@:const @(Model.TreeConfig.LowerEntityName)TreeRef = ref<InstanceType<typeof @(Model.TreeConfig.LowerEntityName)Tree>>();
}
// 页面初始化
onMounted(async () => {
initModule();
@if (Model.SlaveTable != null) {
@:initModuleSlave();
}
})
@{
RenderMethod(Model, "");
if (Model.SlaveTable != null) {
@:
RenderMethod(Model.SlaveTable, "Slave");
}
void RenderMethod(CustomTemplateEngine sender, string nameSuffix) {
@:// @(sender.BusName)状态参数
@:const state@(nameSuffix) = reactive({
if (!string.IsNullOrWhiteSpace(sender.LastLinkPropertyName)) {
@:@(Model.GetFirstLower(sender.LastLinkPropertyName)): undefined as any,
}
@:resetQueryParams: {} as Page@(sender.ClassName)Input,
@:queryParams: {} as Page@(sender.ClassName)Input,
if (sender.AllFields.Any(u => u.IsTree)) {
@:dropdownData: {} as any,
}
@:showAdvanceQueryUI: false,
@:localPageParam: {
@:pageSize: 20 as number,
@:defaultSort: { field: '@(sender.AllFields.Any(u => u.PropertyName == "OrderNo") ? "orderNo" : "id")', order: 'asc', descStr: 'desc' },
@:},
@:visible: false
@:})
@:
@:const xGrid@(nameSuffix) = ref<VxeGridInstance>();
@:const edit@(sender.ClassName)DialogRef = ref<InstanceType<typeof Edit@(sender.ClassName)Dialog>>();
@:const localPageParamKey@(nameSuffix) = 'localPageParam:@(sender.LowerClassName)'; // @(sender.BusName)本地存储参数
@:const options@(nameSuffix) = useVxeTable<Page@(sender.ClassName)Output>( // @(sender.BusName)表格参数配置
@:{
@:id: '@(sender.LowerClassName)',
@:name: '@(sender.BusName)',
@:columns: [
@:// { type: 'checkbox', width: 40, fixed: 'left' },
@:{ field: 'seq', type: 'seq', title: '序号', width: 60, fixed: 'left' },
foreach(var column in sender.TableFields) {
@:{ field: '@(column.LowerPropertyName)', title: '@(column.ColumnComment)', minWidth: 150,@(column.IsSortable ? " sortable: true," : "") showOverflow: 'tooltip'@(column.GetVxeColumnExtraConfig) },
}
@:{ field: 'record', title: '修改记录', width: 100, showOverflow: 'tooltip', slots: { default: 'row_record' } },
@:{ field: 'buttons', title: '操作', fixed: 'right', width: 200, showOverflow: true, slots: { default: 'row_buttons' } },
@:],
@:}, {// vxeGrid配置参数(此处可覆写任何参数)参考vxe-table官方文档
@if (sender.TableFields.Any(u => u.IsStatistical)) {
@:// 显示表格统计行
@:showFooter: true,
}
@:// 代理配置
@:proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleQueryApi@(nameSuffix)(page, sort) } },
@:// 排序配置
@:sortConfig: { defaultSort: Local.get(localPageParamKey@(nameSuffix))?.defaultSort || state@(nameSuffix).localPageParam.defaultSort },
@:// 分页配置
@:pagerConfig: { pageSize: Local.get(localPageParamKey@(nameSuffix))?.pageSize || state@(nameSuffix).localPageParam.pageSize },
@:// 导入配置
@:importConfig: @(sender.ImportFields.Any() ? ("{ remote: true, importMethod: (options: any) => handleImport" + nameSuffix + "(options), slots: { top: 'import_button' }}") : "{} as any"),
@:// 工具栏配置
@:toolbarConfig: { import: @(sender.ImportFields.Any() ? "true" : "false"), export: true },
@:}
@:)
@:
@:// @(sender.BusName)模块初始化
@:const initModule@(nameSuffix) = async () => {
@:state@(nameSuffix).resetQueryParams = Object.assign({}, state@(nameSuffix).queryParams);
@:state@(nameSuffix).localPageParam = Local.get(localPageParamKey) || state@(nameSuffix).localPageParam;
@foreach (var column in Model.AllFields.Where(u => u.IsTree).GroupBy(u => new { u.IsTree }).Select(u => u.First())) {
if (column.JoinConfig.UseTable) continue;
var methodName = column.JoinConfig.EntityName + (column.IsTree ? "Tree" : "Table");
@:// 查询@(column.JoinConfig.TableComment)数据
@:state@(nameSuffix).dropdownData.@(column.LowerPropertyName) = await handle@(methodName)({}).then(res => res.data.result ?? []);
}
@:}
@:
@:// @(sender.BusName)表格查询api
@:const handleQueryApi@(nameSuffix) = (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
@:const params = Object.assign(state@(nameSuffix).queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' }) as Page@(sender.ClassName)Input;
@:return @(Model.GetHttpApiMethodName(null, "page", sender))(params);
@:}
@:
@:// @(sender.BusName)表格查询操作
@:const handleQuery@(nameSuffix) = async (reset = false) => {
@:options@(nameSuffix).loading = true;
@:reset ? await xGrid@(nameSuffix).value?.commitProxy('reload') : await xGrid@(nameSuffix).value?.commitProxy('query');
@:options@(nameSuffix).loading = false;
@:}
@:
@:// @(sender.BusName)重置操作
@:const resetQuery@(nameSuffix) = async () => {
@:state@(nameSuffix).queryParams = Object.assign({}, state@(nameSuffix).resetQueryParams);
@:await xGrid@(nameSuffix).value?.commitProxy('reload');
@:}
@:
@:// 打开@(sender.BusName)新增页面
@:const handleAdd@(nameSuffix) = () => {
@:edit@(sender.ClassName)DialogRef.value?.openDialog(undefined, '添加@(sender.BusName)');
@:}
@:
@:// @(sender.BusName)删除操作
@:const handleDelete@(nameSuffix) = (row: any) => {
@:ElMessageBox.confirm(`确定删除记录?`, '提示', {
@:confirmButtonText: '确定',
@:cancelButtonText: '取消',
@:type: 'warning',
@:}).then(async () => {
@:await @(Model.GetHttpApiMethodName(null, "delete", sender))({ id: row.id });
@:await handleQuery@(nameSuffix)();
@:ElMessage.success('删除成功');
@:}).catch(() => {});
@:}
@:
@:// 打开@(sender.BusName)编辑页面
@:const handleEdit@(nameSuffix) = async (row: any) => {
@:edit@(sender.ClassName)DialogRef.value?.openDialog(row, '编辑@(sender.BusName)');
@:}
@:
@:// 打开@(sender.BusName)详情页面
@:const handleDetail@(nameSuffix) = async (row: any) => {
@:edit@(sender.ClassName)DialogRef.value?.openDialog(row, '@(sender.BusName)详情');
@:}
if (sender.AllFields.Any(u => u.IsStatus)) {
@:
@:// @(sender.BusName)设置状态
@:const handleStatusChange@(nameSuffix) = (row: any) => {
@:ElMessageBox.confirm(`确定${row.status === 2 ? '停用' : '启用'}该记录?`, '提示', {
@:confirmButtonText: '确定',
@:cancelButtonText: '取消',
@:type: 'warning',
@:closeOnClickModal: false, // 禁止点击遮罩层关闭
@:closeOnPressEscape: false, // 禁止按 Esc 键关闭
@:}).then(async () => {
@:@(Model.GetHttpApiMethodName(null, "setStatus", sender))({ id: row.id, status: row.status });
@:ElMessage.success('操作成功');
@:}).catch(() => {
@:// 取消操作,还原状态
@:row.status = row.status === 1 ? 2 : 1;
@:});
@:}
}
if (sender.ImportFields.Any()) {
@:
@:// 下载@(sender.BusName)模板
@:const handleDownload@(nameSuffix) = async () => {
@:await @(Model.GetHttpApiMethodName(null, "downloadTemplate", sender))({ responseType: 'arraybuffer' }).then(downloadStreamFile);
@:}
@:
@:// @(sender.BusName)数据导入
@:const handleImport@(nameSuffix) = async (options: any) => {
@:const res = @(Model.GetHttpApiMethodName(null, "importData", sender))(options.file, { responseType: 'arraybuffer' });
@:res.then(downloadStreamFile);
@:return res;
@:}
}
@:
@:// @(sender.BusName)表格事件
@:const gridEvents@(nameSuffix): VxeGridListeners<Page@(sender.ClassName)Output> = {
@:// 只对 pager-config 配置时有效,分页发生改变时会触发该事件
@:async pageChange({ pageSize }) {
@:state@(nameSuffix).localPageParam.pageSize = pageSize;
@:Local.set(localPageParamKey@(nameSuffix), state@(nameSuffix).localPageParam);
@:},
@:// 当排序条件发生变化时会触发该事件
@:async sortChange({ field, order }) {
@:const config = state@(nameSuffix).localPageParam.defaultSort;
@:state@(nameSuffix).localPageParam.defaultSort = { field: field ?? config?.field, order: order ?? config?.order, descStr: 'desc' };
@:Local.set(localPageParamKey@(nameSuffix), state@(nameSuffix).localPageParam);
@:},
if (sender.SlaveTable != null && !string.IsNullOrWhiteSpace(sender.NextLinkPropertyName)) {
@:// 单元格点击事件
@:async cellClick({ row }) {
@:if (stateSlave.queryParams.@(Model.GetFirstLower(sender.SlaveTable.LastLinkPropertyName)) == row.@(Model.GetFirstLower(sender.NextLinkPropertyName))) return;
@:stateSlave.queryParams.@(Model.GetFirstLower(sender.SlaveTable.LastLinkPropertyName)) = row.@(Model.GetFirstLower(sender.NextLinkPropertyName)) as any;
@:handleQuerySlave();
@:},
}
@:}
}
}
@if(Model.TreeConfig != null) {
@:// 树组件点击
@:const handleNodeChange = async (node: any) => {
@:state.queryParams.@(Model.GetFirstLower(Model.LastLinkPropertyName)) = node.@(Model.GetFirstLower(Model.TreeConfig.LinkPropertyName));
@:@(Model.TreeConfig.LowerEntityName)TreeRef?.value?.setCurrentKey();
@:await handleQuery();
@:};
}
@{
var methodNameList = new List<string>();
foreach (var column in Model.ApiFields.Concat(Model.SlaveTable?.ApiFields ?? [])) {
var methodName = column.JoinConfig.EntityName + (column.IsTree ? "Tree" : "Table");
if (methodNameList.Contains(methodName)) continue;
methodNameList.Add(methodName);
@:// 查询@(column.JoinConfig.TableComment)@(column.IsTree ? "树结构" : "")数据
@:const handle@(methodName) = async (data: any) => {
@:return await @(Model.GetHttpApiMethodName(column, column.IsTree ? "fkTree" : "fkTable"))(data);
@:}
@:
}
}
</script>
<style scoped>
:deep(.el-card) {
overflow: visible !important;
}
.full-height {
display: flex;
flex-direction: column;
height: calc(100% - 40px);
}
.table-footer {
color: red;
}
</style>