You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

915 lines
29 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="p-4" style="height:100%">
<Spin :spinning="loading" style="background-color: white;margin:0px;height:100%">
<div v-if="errorObj.hasError" class="ant-tag-red">
{{ errorObj.tips }}
</div>
<div v-else>
<Card style="border-radius: 10px; margin-bottom: 12px">
<div class="flex">
<Form layout="inline" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
<FormItem label="关键字">
<Input v-model:value="searchKey" placeholder="请输入关键字" @change="Search" allow-clear/>
</FormItem>
<template v-if="showRDT">
<FormItem :label="dtFieldOfSearchLab">
<RangePicker v-model:value="searchDt" format="YYYY-MM-DD" @change="Search"/>
</FormItem>
</template>
<FormItem>
<Button type="primary" @click="Search"> 查询</Button>
</FormItem>
<template v-for="btn in toolBars">
<FormItem>
<Button type="primary" @click="toolBarOper(btn)">{{ btn }}</Button>
</FormItem>
</template>
</Form>
</div>
</Card>
<BasicTable v-if="showModel === 0" @register="registerTable" :pagination="defalutPageSize!==0?pagination:false" ref="tableRef">
<template #action="{ record, column }">
<TableAction :actions='createActions(record, column)'/>
</template>
</BasicTable>
<div v-else-if="showModel === 1">
<template v-if="defaultGroupField!=''">
<div v-for="item in tableData" style="background-color: white;padding:10px">
<div class="group_title">{{ item[columns[0].key] }}</div>
<Row :gutter="[8,8]">
<Col :span="8" v-for="child in item.children">
<Card>
<div v-for="column in columns">
<span>{{ column.title }}:</span>
<span>
<template v-if="column.key ===linkField">
<Button type="link" @click="LinkFieldClick(child)">{{ child[column.key] }}</Button>
</template>
<template v-else-if="labFields.includes(column.key)&&child[column.key]">
<template v-for="tag in GetTextTags(child[column.key])">
<Tag :color="tag.color" style="margin-right:0.5em"> {{ tag.name }}</Tag>
</template>
</template>
<template v-else>
<span v-html="child[column.key]"></span>
</template>
</span>
</div>
<template #actions>
<template v-for="action in createActions(child, columns)">
<Button style="border-right:1px solid #ccc" type="link" @click="BtnsOfRowOper(child,columns,action.label)">{{ action.label }}</Button>
</template>
</template>
</Card>
</Col>
</Row>
</div>
</template>
<template v-else>
<Row :gutter="[8,8]">
<Col :span="8" v-for="child in item.children">
<Card>
<div v-for="column in columns">
<span>{{ column.title }}:</span>
<span>
<template v-if="column.key ===linkField">
<Button type="link" @click="LinkFieldClick(child)">{{ child[column.key] }}</Button>
</template>
<template v-else-if="labFields.includes(column.key)&&child[column.key]">
<template v-for="tag in GetTextTags(child[column.key])">
<Tag :color="tag.color" style="margin-right:0.5em"> {{ tag.name }}</Tag>
</template>
</template>
<template v-else-if="column.format!=undefined && column.format!=''">
<span v-html="glEn.BindFieldFunction(column.format, child)"></span>
</template>
<template v-else>
<span v-html="child[column.key]" style="display:inline"></span>
</template>
</span>
</div>
</Card>
</Col>
</Row>
</template>
</div>
<div v-else-if="showModel === GenerListPageShowModel.Windows" style="height:calc(100vh - 150px);overflow-y:auto">
<template v-if="defaultGroupField!=''">
<div v-if="tableData.length==0">
<Empty :image="simpleImage" style="max-width:100%;padding-top:26px"></Empty>
</div>
<Row v-else :gutter="[8,8]">
<Col :span="8" v-for="item in tableData">
<Collapse expandIconPosition="right" v-model:activeKey="item[columns[0].key]">
<CollapsePanel :key="item[columns[0].key]" :header="item[columns[0].key]" collapsible="disabled">
<Row type="flex" justify="space-between" v-for="child in item.children" style="padding-top:5px">
<Col :span="21" style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;">
<Button type="link" @click="LinkFieldClick(child)" style="color:#096dd9">{{ child[linkField] }}</Button>
</Col>
<Col :span="2">
<Popover placement="bottomRight" arrow-point-at-center trigger="click" :visible="child.visible"
@visibleChange="(visible)=>child.visible =visible ">
<template #content>
<template v-for="action in createActions(child, columns[0])">
<Button type="link" @click="child.visible = false;BtnsOfRowOper(child,columns[0],action.label)">{{ action.label }}</Button>
<br/>
</template>
</template>
<Button shape="circle" size="small" @click="child.visible = true">
<ToolOutlined style="color:#d3c4c4cc"/>
</Button>
</Popover>
</Col>
</Row>
</CollapsePanel>
</Collapse>
</Col>
</Row>
</template>
<template v-else></template>
</div>
<div v-else-if="showModel === GenerListPageShowModel.BigIcon">
<List>
<Row :gutter="16">
<Col :span="6" v-for="item in tableData">
<ListItem>
<Card :hoverable="true" class="list-card__card" @click="LinkFieldClick(item)">
<div class="list-card__card-title">
<i :class="item.Icon"/>
<br/>
{{ item[linkField] }}
</div>
</Card>
</ListItem>
</Col>
</Row>
</List>
</div>
<Modal
v-model:visible="modal.visible"
centered
:title="modal.title"
width="70%"
:body-style="{ height: '600px' }"
:footer="null"
>
<template v-if="modal.visible">
<iframe v-if="modal.iframeURL" :src="modal.iframeURL" class="modal-iframe">
</iframe>
<Component v-else :is="modal.component" :params="modal.params" @close-self="modalClose"/>
</template>
</Modal>
<!--右侧滑出-->
<Drawer :visible="drawer.visible" :title="drawer.title" width="70%" :body-style="{ padding: 0 }" @close="drawerClose">
<template v-if="drawer.visible">
<iframe v-if="drawer.iframeURL" :src="drawer.iframeURL" class="modal-iframe">
</iframe>
<Component v-else :is="drawer.component" :params="drawer.params"/>
</template>
</Drawer>
</div>
</Spin>
</div>
</template>
<script lang="tsx" setup>
import {reactive, ref, nextTick, shallowRef, h, UnwrapRef, markRaw, onMounted, onUnmounted} from 'vue';
import {ClassFactoryOfGenerList} from '../GenerList/ClassFactoryOfGenerList';
import {
Form,
FormItem,
Input,
RangePicker,
Button,
Spin,
message,
Tag,
Modal,
Drawer,
Row,
Col,
Card,
Collapse,
CollapsePanel,
Popover,
List,
ListItem,
Empty
} from 'ant-design-vue';
import {useRoute, useRouter} from 'vue-router';
import {ActionItem, BasicColumn, BasicTable, EditRecordRow, TableAction, TableActionType, useTable} from '/@/components/Table';
import type {Dayjs} from 'dayjs';
import {GPNReturnType} from "/@/bp/UIEntity/PageBaseGroupNew";
import useComponentLoader from "/@/hooks/ens/useComponentLoader";
import {GenerListPageShowModel} from '/@/bp/UIEntity/PageBaseGenerList';
import {ToolOutlined} from '@ant-design/icons-vue';
import {useTabs} from '/@/hooks/web/useTabs';
import {useRedo} from "/@/hooks/web/usePage";
import {usePostMessage} from "/@/hooks/message/usePostMessage";
import {ccbpm} from "/#/ccbpm";
import {MessageTypeEnum} from "/@/enums/messageTypeEnum";
import {splitAtString} from "/@/bp/tools/ParamUtils";
type RangeValue = [Dayjs, Dayjs];
const route = useRoute();
const searchKey = ref("");
const searchDt = ref<RangeValue>();
const props = defineProps({
params: {
type: Object,
default: () => {
return {}
}
}
})
//错误提示
const errorObj = reactive({
hasError: false,
tips: '',
});
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
const loading = ref(false);
const router = useRouter();
//实体类
const glEn = ref(); // Proxy => .value 才是实际的对象,不加.value 是Proxy是代理对象
//实体类对应的EnName
const enName = ref<UnwrapRef<string>>("");
const innerColumns = ref<any[]>([]);
const innerData = ref<Recordable[]>([]); //查询的结果数据集合
const parseData = ref<Recordable[]>([]); //处理后的数据结果集合
//table集合的定义
let columns: BasicColumn[] = []; //对应的列名
const tableData = ref([]);//数据集合
const labFields = ref("");//标签显示
const defalutPageSize = ref(0);
const tableHeight=ref(document.body.clientHeight-267);
//查询条件
const showRDT = ref(false);// 是否显示时间字段的查询条件
const dtFieldOfSearchLab = ref("");//时间查询lab
const dtFieldOfSearch = ref("");//时间查询字段名
//分组
const groupFields = ref<string[]>([]);//分组集合
const defaultGroupField = ref("");//默认的分组字段
//操作
const linkField = ref("")//点击超链接处理的字段
const btnsOfRow = ref<string[]>([]);
const hovered = ref(false);
let showModel = ref(0);
//工具栏操作
const toolBars = ref();
const {loadComponent, getComponentParamsByUrl} = useComponentLoader();
//弹窗信息定义
const modal = reactive({
visible: false,
component: {},
params: {},
title: '',
iframeURL: '',
});
const drawer = reactive({
visible: false,
component: {},
params: {},
title: '',
iframeURL: '',
});
const modalClose = async (type = false) => {
if (type) {
await InitPage();
}
modal.visible = false;
}
const tableRef = ref<Nullable<TableActionType>>();
//分页信息
let pagination = reactive({
current: 1,
pageSize: 10,
total: 0,
defalutPageSize: 10,
pageSizeOptions: ['10', '15', '20', '50'],
showSizeChanger: true,
showQuickJumper: true,
onChange: (current, size) => {
pagination.current = current;
pagination.pageSize = size;
tableData.value = [];
tableParseData();
tableRef?.value?.setTableData(tableData.value);
if (groupFields.value.length > 0)
onExpandAll();
},
onShowSizeChange: (current, pageSize) => {
pagination.current = 1;
pagination.pageSize = pageSize;
tableData.value = [];
tableParseData();
tableRef?.value?.setTableData(tableData.value);
if (groupFields.value.length > 0)
onExpandAll();
},
});
const {setTitle} = useTabs();
const InitPage = async () => {
try {
loading.value = true;
enName.value = props.params?.EnName || route.query.EnName as string || "";
//获得实体.
const entity = await ClassFactoryOfGenerList.GetEn(enName.value);
entity.setParams(props.params || {})
await entity.Init(); //获得数据.
innerColumns.value = entity.Columns;
// xxx
// entity.Data;
// entity.Columns;
glEn.value = entity;
document.title = glEn.value.PageTitle;
showModel.value = entity.HisGLShowModel;
//初始化值
dtFieldOfSearchLab.value = glEn.value.DTFieldOfLabel;
dtFieldOfSearch.value = glEn.value.DTFieldOfSearch;
//分组字段集合
const gfs = glEn.value.GroupFields || "";
groupFields.value = gfs == "" ? [] : gfs.split(",");
//默认分组字段
defaultGroupField.value = glEn.value.GroupFieldDefault || "";
if (defaultGroupField.value == "" && groupFields.value.length > 0)
defaultGroupField.value = groupFields.value[0];
linkField.value = glEn.value.LinkField;
let opers = glEn.value.BtnsOfRow || "";
opers = opers.replace(//g,',');
btnsOfRow.value = opers == "" ? [] : opers.split(",")
labFields.value = glEn.value.LabFields || "";
toolBars.value = glEn.value.BtnOfToolbar == '' ? [] : glEn.value.BtnOfToolbar.split(",")
innerData.value = glEn.value.Data;
parseData.value = innerData.value;
defalutPageSize.value = glEn.value.PageSize;
pagination.pageSize = defalutPageSize.value;
tableParseColumns()
tableParseData()
if (glEn.value.HisGLShowModel == GenerListPageShowModel.Table){
tableRef.value?.setPagination(pagination);
}
await setTitle(entity.PageTitle || '');
} catch (e) {
errorObj.hasError = true;
errorObj.tips = e as string;
} finally {
loading.value = false;
}
}
function covertItemWidthToPercent() {
const data = columns;
for (const item of data) {
if (typeof item.width === 'string' && item.width.includes('%')) {
return
}
if (typeof item.width !== 'number') {
item.width = 150;
}
}
const totalWidth = data.reduce((prev: any, curr: any) => prev.width + curr.width, 0)
for (const item of data) {
item.width = (item.width || 0 / totalWidth) + '%';
}
columns = data
}
//处理显示的列
function tableParseColumns() {
let index = 0;
let firstKey = "";
innerColumns.value.forEach(item => {
//存在时间查询条件,且字段在查询列中
if (dtFieldOfSearch.value != "" && item.Key === dtFieldOfSearch.value)
showRDT.value = true;
const isShow = item.IsShow == undefined ? true : item.IsShow;
if (isShow) {
if (index == 0)
firstKey = item.Key;
if (item.Key != defaultGroupField.value) {
//判断是否属于分组的
const isBoolean = groupFields.value.some((gf) => gf == item.Key);
if (isBoolean) {
columns.push({
title: item.Name,
dataIndex: item.Key,
key: item.Key,
align: index == 0 && groupFields.value.length != 0 ? "left" : "center",
width: item.width == undefined ? 100 : item.width,
format: item.RefFunc || "",
customHeaderCell: (column) => {
return {
style: {
color: '#0960bd',
cursor: 'pointer',
},
onClick: () => {
ChageGroupField(column);
},
};
},
})
index++;
} else {
columns.push({
title: item.Name,
dataIndex: item.Key,
key: item.Key,
//ellipsis:true,
align: index == 0 && groupFields.value.length != 0 ? "left" : "center",
width: item.width == undefined ? 100 : item.width,
customCell: (record, rowIndex, column) => {
if (record.children == undefined)
return {colSpan: 1};
if (record.children != undefined) {
if (column && column.key === columns[0].key)
return {colSpan: columns.length};
else
return {colSpan: 0};
}
},
customRender: ({text, record, index, column}) => {
//标题增加已读未读,超链接
if (column.key == "Title" && record.children == undefined && text != undefined && text != "") {
if (column.key == linkField.value) {
if (record.IsRead == 1)
return <a onClick={LinkFieldClick.bind(null, record)}><i class="icon-envelope-open"></i>{record[linkField.value]}</a>;
if (record.IsRead == undefined || record.IsRead == 0)
return <a onClick={LinkFieldClick.bind(null, record)}><i class="icon-envelope"></i>{record[linkField.value]}</a>;
}
if (record.IsRead == 1)
return <span><i class="icon-envelope-open"></i>{record[linkField.value]}</span>;
if (record.IsRead == undefined || record.IsRead == 0)
return <span><i class="icon-envelope"></i>{record[linkField.value]}</span>;
}
//超链接
else if (column.key == linkField.value && record.children == undefined) {
return <a onClick={LinkFieldClick.bind(this, record)}>{record[linkField.value]}</a>;
}
//获取标签的值对应的数组集合
else if (text != undefined && labFields.value.includes(column.key) == true && record.children == undefined) {
const tags: TagExt[] = GetTextTags(text);
if (tags.length == 0)
return text;
if (tags.length == 1)
return h(Tag, {color: tags[0].color}, () => tags[0].name)
if (tags.length == 2)
return (
<span>
<Tag color={tags[0].color} style="margin-right:0.5em"> {tags[0].name}</Tag>
<Tag color={tags[1].color}> {tags[1].name}</Tag>
</span>
)
} else if (typeof text == "string") {
return (<span v-html={text}></span>)
} else
return text
},
});
index++;
}
}
}
})
covertItemWidthToPercent();
}
//处理数据Data
const tableParseData = () => {
const startIdx = ref(0);
const endIdx = ref(0);
const curretPageData = ref();
if (defalutPageSize.value != 0) {
pagination.total = parseData.value.length;
//处理前台逻辑分页问题
startIdx.value = (pagination.current - 1) * pagination.pageSize;
endIdx.value = pagination.current * pagination.pageSize;
if (parseData.value.length < endIdx.value)
endIdx.value = parseData.value.length;
curretPageData.value = parseData.value.slice(startIdx.value, endIdx.value);
} else {
curretPageData.value = parseData.value
}
curretPageData.value.forEach(item => item.visible = false);
//不存在分组直接显示数据
if (groupFields.value.length == 0) {
tableData.value = curretPageData.value;
if (glEn.value.HisGLShowModel == GenerListPageShowModel.Table)
tableRef.value?.setTableData(tableData.value);
} else {
//获取分组的集合
const map = new Map()
curretPageData.value.forEach((item, index, arr) => {
if (!map.has(item[defaultGroupField.value])) {
map.set(
item[defaultGroupField.value],
arr.filter(a => a[defaultGroupField.value] == item[defaultGroupField.value])
)
}
})
const data = Array.from(map).map(item => [...item[1]])
let dataItem: Record<string, any> = {};
const treeKey = columns[0]?.key || 'Title';
data.forEach((item, index) => {
dataItem = {};
dataItem[treeKey] = item[0][defaultGroupField.value];
dataItem['children'] = item;
tableData.value.push(dataItem as never);
});
if (groupFields.value.length > 0)
onExpandAll();
}
}
InitPage();
const [registerTable] = useTable({
title: '',
isTreeTable: true,
columns: columns,
dataSource: tableData,
showIndexColumn: false,
showTableSetting: false,
canResize:true,
tableSetting: {fullScreen: false},
defaultExpandAllRows: true,
expandRowByClick: true,
scroll:{y: tableHeight.value},
actionColumn: {
width: 150,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
ifShow: () => {
// debugger
if(innerColumns.value.filter(item=>item.Key==='Btns').length>0)
return true; // 根据业务控制是否显示
return false;
},
},
});
function onExpandAll() {
// 演示默认展开所有表项
nextTick(tableRef.value?.expandAll);
}
function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
debugger
const items:Record<string, any>[]=[];
let opers = record['Btns'];
if(typeof opers === 'undefined' || opers==='')
return [];
opers = opers.replace(//g,',');
const btns = opers.split(',');
btns.forEach(item => {
if(item!=''){
items.push({
label: item,
ifShow: (_action) => {
return record.children == undefined;
},
onClick: BtnsOfRowOper.bind(null, record, column, item),
})
}
})
return items;
if (btnsOfRow.value.length == 0)
return [];
else {
btnsOfRow.value.forEach(item => {
items.value.push({
label: item,
ifShow: (_action) => {
return record.children == undefined;
},
onClick: BtnsOfRowOper.bind(null, record, column, item),
})
})
return items.value;
}
}
/**
* 行按钮操作
* @param record
* @param column
* @param name
* @constructor
*/
function BtnsOfRowOper(record, column, name) {
const result = glEn.value.BtnClick(name, record);
if (!!result)
afterOper(name, result);
}
/**
* 工具栏操作
* @param name
*/
async function toolBarOper(name) {
const result = await glEn.value.BtnClick(name, null);
if (!!result)
afterOper(name, result);
}
/**
* 执行点击超链接事件
* @param record
* @constructor
*/
const LinkFieldClick = async (record) => {
const result = await glEn.value.LinkFieldClick(record);
if (!!result)
await afterOper(record[linkField.value], result);
}
//执行完的操作
async function afterOper(btnName, result) {
if (result.data == undefined || result.data == '')
return;
switch (result.ReturnType) {
case GPNReturnType.Message:
message.info(result.data);
break;
case GPNReturnType.Error:
message.error(result.data);
break;
case GPNReturnType.GoToUrl://转到url.
if(result.data && result.data.includes('Middle')){
//在Tab页打开
}
window.location.replace(result.data)
break;
case GPNReturnType.Close://关闭.
break;
case GPNReturnType.CloseAndReload://关闭并重载
break;
case GPNReturnType.Reload://刷新
await InitPage();
break;
case GPNReturnType.ReBind://重新绑定
innerData.value = result.data;
parseData.value = result.data;
Search();
break;
case GPNReturnType.OpenUrlByDrawer: //重新绑定
if (result.data.startsWith('/#/')) {
modal.iframeURL = result.data;
modal.title = btnName;
modal.visible = true;
return;
}
const param = result.data.split('?');
if (param.length > 1) {
const compName = param[0].endsWith('.vue') ? param[0] : param[0] + '.vue';
modal.component = markRaw(loadComponent(compName));
modal.params = getComponentParamsByUrl(result.data.substring(5));
modal.title = btnName;
modal.visible = true;
}
break;
case GPNReturnType.OpenUrlByDrawer75: //抽屉的模式打开.
case GPNReturnType.OpenUrlByDrawer90: //抽屉的模式打开.
case GPNReturnType.OpenUrlByDrawer30: //抽屉的模式打开.
if (result.data.startsWith('/#/')) {
drawer.iframeURL = result.data;
drawer.title = btnName;
drawer.visible = true;
return;
}
const params = result.data.split('?');
if (params.length > 1) {
const compName = params[0].endsWith('.vue') ? params[0] : params[0] + '.vue';
drawer.component = markRaw(loadComponent(compName));
drawer.params = getComponentParamsByUrl(result.data);
drawer.title = btnName;
drawer.visible = true;
}
break;
case GPNReturnType.OpenUrlByNewWindow://重新绑定
window.open(result.data);
break;
case GPNReturnType.DoNothing: //重新绑定
break;
default:
message.warning('类型:' + result.ReturnType + '还未解析');
break;
}
}
const drawerClose = () => {
drawer.visible = false;
}
/**
* 改变分组
* @param field 分组字段
* @constructor
*/
const ChageGroupField = (column) => {
defaultGroupField.value = column.key;
columns = [];
tableData.value = [];
tableParseColumns();
tableParseData();
tableRef.value?.setColumns(columns);
tableRef.value?.setTableData(tableData.value);
if (groupFields.value.length > 0)
onExpandAll();
}
//执行查询
const Search = () => {
tableData.value = [];
parseData.value = [];
//匹配关键字段值
const list = ref<Recordable[]>([])
if (searchKey.value) {
const ar = JSON.parse(JSON.stringify(innerData.value));
const str = new RegExp(searchKey.value, 'i');
ar.forEach((item, index) => {
for (const key in item) {
if (str.test(item[key])) {
list.value.push(item);
break;
}
}
});
} else {
list.value = innerData.value;
}
const dtFrom = searchDt.value?.[0] || "";
const dtTo = searchDt.value?.[1] || "";
if (showRDT.value == true) {
//开始时间和结束时间同时有值时
if (dtFrom != "" && dtTo != "") {//+new Date()目的是将数据类型转换为Number类型
list.value.forEach((item, index) => {
if (+new Date(item[dtFieldOfSearch.value]) >= +dtFrom.toDate()
&& +new Date(item[dtFieldOfSearch.value]) <= +dtTo.toDate()) {
parseData.value.push(item);
}
});
} else if (dtFrom != "") {
list.value.forEach((item, index) => {
if (+new Date(item[dtFieldOfSearch.value]) >= +dtFrom.toDate()) {
parseData.value.push(item);
}
});
} else if (dtTo != "") {
list.value.forEach((item, index) => {
if (+new Date(item[dtFieldOfSearch.value]) <= +dtTo.toDate()) {
parseData.value.push(item);
}
});
} else {
parseData.value = list.value
}
} else {
parseData.value = list.value
}
pagination.current = 1;
tableParseData();
if (glEn.value.HisGLShowModel == GenerListPageShowModel.Table)
tableRef.value?.setTableData(tableData.value);
if (groupFields.value.length > 0)
onExpandAll();
}
/**
* 获取标签表示的内容
* @param text
* @constructor
*/
interface TagExt {
name: string,
color: string
}
function GetTextTags(text) {
const tags = ref<TagExt[]>([]);
splitAtString(text).forEach(item => {
tags.value.push({
name: item.split("=")[0],
color: item.split("=")[1]
})
})
return tags.value;
}
const {refreshPage} = useTabs();
const messageHandler = (evt) => {
const data = evt.data as ccbpm.PostMessageInfo;
console.log(data)
if (data.type === MessageTypeEnum.ReloadPage) {
if (window.location.hash.includes("/Middle/GenerList")) {
drawer.visible = false;
modal.visible = false;
tableData.value = [];
parseData.value = [];
columns = [];
InitPage();
} else {
loading.value = true;
refreshPage();
}
}
}
usePostMessage(messageHandler)
</script>
<style lang="less" scoped>
:deep(tr.unIsread td:first-child) {
font-weight: 600;
}
:deep(.ant-table-thead > tr > th) {
text-align: center !important;
}
.modal-iframe {
width: 100%;
height: 100%;
}
.group_title {
line-height: 38px;
height: 38px;
font-size: 15px;
font-weight: bold;
}
:deep(.ant-card-body) {
padding: 16px !important;
}
.list-card {
&__card {
width: 100%;
height: 200px;
.ant-card-body {
padding: 16px;
}
&-title {
text-align: center;
padding-top: 30px;
font-weight: 500;
i {
margin-top: -5px;
margin-right: 10px;
font-size: 38px !important;
}
}
}
}
:deep(.ant-card-body) {
height: 100%
}
:deep(.ant-table-row-indent) {
display: none;
}
</style>