Merge pull request 'Release/0826' (#16) from release/0826 into master
Reviewed-on: #16
This commit was merged in pull request #16.
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
.cell {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
width: 100%;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
line-height: 1.5;
|
||||||
|
word-break: break-all;
|
||||||
|
color: rgba(0, 0, 0, 0.88);
|
||||||
|
}
|
||||||
|
|
||||||
|
.view {
|
||||||
|
flex-shrink: 0;
|
||||||
|
color: #1677ff;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.85;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,81 @@
|
|||||||
import { defineComponent } from 'vue';
|
import { defineComponent, ref, nextTick } from 'vue';
|
||||||
import { Button, Input, Table, DatePicker, Form, Space, Select, Pagination } from 'ant-design-vue';
|
import {
|
||||||
|
Button,
|
||||||
|
Input,
|
||||||
|
Table,
|
||||||
|
DatePicker,
|
||||||
|
Form,
|
||||||
|
Space,
|
||||||
|
Select,
|
||||||
|
Pagination,
|
||||||
|
Modal,
|
||||||
|
} from 'ant-design-vue';
|
||||||
import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_TYPE_MAP } from './model/useLogModel';
|
import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_TYPE_MAP } from './model/useLogModel';
|
||||||
import { useContainerSize } from '@/hooks';
|
import { useContainerSize, useState, useEffect } from '@/hooks';
|
||||||
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
||||||
|
import cellStyles from './index.module.less';
|
||||||
|
|
||||||
const { RangePicker } = DatePicker;
|
const { RangePicker } = DatePicker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作内容单元格:最多 2 行截断,溢出时显示"查看"按钮
|
||||||
|
*/
|
||||||
|
const LogContentCell = defineComponent({
|
||||||
|
name: 'LogContentCell',
|
||||||
|
props: { text: { type: String, required: true } },
|
||||||
|
setup(props) {
|
||||||
|
const textRef = ref<HTMLElement | null>(null);
|
||||||
|
const [overflow, setOverflow] = useState(false);
|
||||||
|
const [modalOpen, setModalOpen] = useState(false);
|
||||||
|
|
||||||
|
const checkOverflow = () => {
|
||||||
|
const el = textRef.value;
|
||||||
|
if (el) setOverflow(el.scrollHeight > el.clientHeight);
|
||||||
|
};
|
||||||
|
|
||||||
|
let observer: ResizeObserver | null = null;
|
||||||
|
useEffect(() => {
|
||||||
|
if (!textRef.value) return;
|
||||||
|
nextTick(checkOverflow);
|
||||||
|
observer = new ResizeObserver(checkOverflow);
|
||||||
|
observer.observe(textRef.value);
|
||||||
|
return () => {
|
||||||
|
observer?.disconnect();
|
||||||
|
observer = null;
|
||||||
|
};
|
||||||
|
}, [() => textRef.value]);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
const raw = props.text;
|
||||||
|
return (
|
||||||
|
<div class={cellStyles.cell}>
|
||||||
|
<div ref={textRef} class={cellStyles.text}>
|
||||||
|
{raw}
|
||||||
|
</div>
|
||||||
|
{overflow.value ? (
|
||||||
|
<span class={cellStyles.view} onClick={() => setModalOpen(true)}>
|
||||||
|
查看
|
||||||
|
</span>
|
||||||
|
) : null}
|
||||||
|
<Modal
|
||||||
|
visible={modalOpen.value}
|
||||||
|
title="操作内容"
|
||||||
|
footer={null}
|
||||||
|
width={600}
|
||||||
|
centered
|
||||||
|
destroyOnClose
|
||||||
|
onCancel={() => setModalOpen(false)}
|
||||||
|
>
|
||||||
|
<div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', lineHeight: 1.8 }}>
|
||||||
|
{raw}
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bodyCell 渲染
|
* bodyCell 渲染
|
||||||
*/
|
*/
|
||||||
@@ -13,6 +83,10 @@ function renderBodyCell({ column, text }: { column: any; text: any }) {
|
|||||||
if (column.key === 'type') {
|
if (column.key === 'type') {
|
||||||
return <span>{ACTION_TYPE_MAP[text as number] || text || '--'}</span>;
|
return <span>{ACTION_TYPE_MAP[text as number] || text || '--'}</span>;
|
||||||
}
|
}
|
||||||
|
if (column.dataIndex === 'content') {
|
||||||
|
const raw = text || '';
|
||||||
|
return raw ? <LogContentCell text={raw} /> : <span>--</span>;
|
||||||
|
}
|
||||||
return <span>{text || '--'}</span>;
|
return <span>{text || '--'}</span>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ export function useLogModel() {
|
|||||||
const columns = [
|
const columns = [
|
||||||
{ title: '操作类型', dataIndex: 'type', key: 'type', width: 140 },
|
{ title: '操作类型', dataIndex: 'type', key: 'type', width: 140 },
|
||||||
{ title: '操作人', dataIndex: 'nickname', key: 'nickname', width: 140 },
|
{ title: '操作人', dataIndex: 'nickname', key: 'nickname', width: 140 },
|
||||||
{ title: '操作内容', dataIndex: 'content', key: 'content', minWidth: 360 },
|
{ title: '操作内容', dataIndex: 'content', key: 'content', width: 480 },
|
||||||
{ title: '操作时间', dataIndex: 'createDate', key: 'createDate', width: 180 },
|
{ title: '操作时间', dataIndex: 'createDate', key: 'createDate', width: 180 },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -104,13 +104,13 @@ export default defineComponent({
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item label="参数值" name="paramValue" rules={paramValueRules}>
|
<Form.Item label="参数值" name="paramValue" rules={paramValueRules}>
|
||||||
<Input
|
<TextArea
|
||||||
value={formData.paramValue}
|
value={formData.paramValue}
|
||||||
onUpdate:value={(val: any) => {
|
onUpdate:value={(val: any) => {
|
||||||
formData.paramValue = val?.target?.value ?? val ?? '';
|
formData.paramValue = val?.target?.value ?? val ?? '';
|
||||||
}}
|
}}
|
||||||
placeholder="请输入参数值"
|
placeholder="请输入参数值"
|
||||||
allowClear
|
rows={2}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ export default defineComponent({
|
|||||||
placeholder="请输入备注说明(选填,最多200字)"
|
placeholder="请输入备注说明(选填,最多200字)"
|
||||||
maxlength={200}
|
maxlength={200}
|
||||||
showCount
|
showCount
|
||||||
rows={3}
|
rows={4}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Form>
|
</Form>
|
||||||
|
|||||||
@@ -8,11 +8,14 @@ import pageStyles from '@/assets/styles/pageLayout.module.less';
|
|||||||
import cellStyles from './index.module.less';
|
import cellStyles from './index.module.less';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数值单元格:最多 2 行截断,溢出时显示"查看"按钮
|
* 文本单元格:最多 2 行截断,溢出时显示"查看"按钮
|
||||||
*/
|
*/
|
||||||
const ParamValueCell = defineComponent({
|
const TruncatedTextCell = defineComponent({
|
||||||
name: 'ParamValueCell',
|
name: 'TruncatedTextCell',
|
||||||
props: { text: { type: String, required: true } },
|
props: {
|
||||||
|
text: { type: String, required: true },
|
||||||
|
modalTitle: { type: String, required: true },
|
||||||
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const textRef = ref<HTMLElement | null>(null);
|
const textRef = ref<HTMLElement | null>(null);
|
||||||
const [overflow, setOverflow] = useState(false);
|
const [overflow, setOverflow] = useState(false);
|
||||||
@@ -49,7 +52,7 @@ const ParamValueCell = defineComponent({
|
|||||||
) : null}
|
) : null}
|
||||||
<Modal
|
<Modal
|
||||||
visible={modalOpen.value}
|
visible={modalOpen.value}
|
||||||
title="参数值"
|
title={props.modalTitle}
|
||||||
footer={null}
|
footer={null}
|
||||||
width={600}
|
width={600}
|
||||||
centered
|
centered
|
||||||
@@ -90,14 +93,11 @@ function renderBodyCell({
|
|||||||
</Space>
|
</Space>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// 参数值列:两行截断 + 查看弹窗
|
// 参数值 / 备注列:两行截断 + 查看弹窗
|
||||||
if (column.dataIndex === 'paramValue') {
|
if (column.dataIndex === 'paramValue' || column.dataIndex === 'remark') {
|
||||||
const raw = text || '';
|
const raw = text || '';
|
||||||
return raw ? <ParamValueCell text={raw} /> : <span>--</span>;
|
const modalTitle = column.dataIndex === 'paramValue' ? '参数值' : '备注说明';
|
||||||
}
|
return raw ? <TruncatedTextCell text={raw} modalTitle={modalTitle} /> : <span>--</span>;
|
||||||
// 备注列:空值显示 --
|
|
||||||
if (column.dataIndex === 'remark' && !text) {
|
|
||||||
return <span>--</span>;
|
|
||||||
}
|
}
|
||||||
return <span>{text ?? '--'}</span>;
|
return <span>{text ?? '--'}</span>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export function useParamsColumns() {
|
|||||||
title: '备注说明',
|
title: '备注说明',
|
||||||
dataIndex: 'remark',
|
dataIndex: 'remark',
|
||||||
key: 'remark',
|
key: 'remark',
|
||||||
minWidth: 240,
|
width: 240,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user