Files
SaaS-lib/lib/component/table/table-columns.tsx
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

244 lines
6.6 KiB
TypeScript
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.

import { dateUtil } from '/nerv-lib/util/date-util';
import { NsModal } from '/nerv-lib/component/modal';
import { HttpRequestConfig, useApi } from '/nerv-lib/use/use-api';
import { useParams } from '/nerv-lib/use/use-params';
import { isFunction, isNumber, isString, toLower } from 'lodash-es';
import { Loading3QuartersOutlined, QuestionCircleOutlined } from '@ant-design/icons-vue';
import './table-columns.less';
interface RenderTransform {
api?: string | Recordable | Function;
messageField?: string | Function;
params?: string | Array<string> | Recordable;
pipe: string;
statusField?: string | Function;
textField?: string | Function;
isShowQuIcon?: Function; //是否展示错误时的 icon用法同上需要返回boolean,传了就代表你要控制icon的展示不传就代表只在错误时展示
}
type RenderTransformProps = Omit<RenderTransform, 'pipe'>;
interface ColumnData {
index: number;
record: Recordable;
text: any;
}
//格式化列数据
export function transformColumns(columns: Array<any>) {
return columns.map((item) => {
if (item.transform) {
item.customRender = getRender(item.transform);
// delete item.transform; //排序中有字段比较,对象属性影响结果
if (item.transform?.pipe === 'CNY') {
item.align = 'right';
}
}
if (item.textNumber || isNumber(item.customType)) {
const textNumber = item.textNumber || item.customType;
item.width = 12 * 2 + 16 * textNumber;
}
return item;
});
}
function formatMoney(s: string) {
const n = 2;
s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '';
const l = s.split('.')[0].split('').reverse(),
r = s.split('.')[1];
let t = '';
for (let index = 0; index < l.length; index++) {
t += l[index] + ((index + 1) % 3 == 0 && index + 1 != l.length ? ',' : '');
}
return '¥' + t.split('').reverse().join('') + '.' + r;
}
//根据transform生成customRender
function getRender(transform: RenderTransform) {
const { pipe, ...ext } = transform;
return (data: any) => {
return pipes[pipe](data, {
params: {},
...ext,
});
};
}
const { httpRequest } = useApi();
const { getParams } = useParams();
//约定处理函数
const pipes: Record<
string,
(columnData: ColumnData, { params, api, messageField, statusField }: RenderTransformProps) => any
> = {
date: ({ text }, { params }) => {
const { format = 'YYYY-MM-DD HH:mm' } = params as Recordable;
return dateUtil(text).format(format);
},
CNY: ({ text }) => {
const money = text || 0;
return <span style="color: #D07C35;"> {formatMoney(money)}</span>;
},
state: (
{ text, record },
{ params, api, messageField, statusField = 'showStatus', textField, isShowQuIcon },
) => {
let statusFieldValue = '';
if (isFunction(statusField)) {
statusFieldValue = statusField(record);
} else if (isString(statusField)) {
statusFieldValue = record[statusField];
}
// 优先使用textField 取值 没有则使用text
let textFieldValue: string = text;
if (isFunction(textField)) {
textFieldValue = textField(record);
} else if (isString(textField)) {
textFieldValue = record[textField];
}
// 点击提示框参数
const props = {
onClick: () => {
if (messageField) {
if (isFunction(messageField)) {
messageField = messageField(record);
}
NsModal.error({
title: '警告',
content: record[messageField as string],
});
} else if (api) {
const requestConfig: HttpRequestConfig = { method: 'get' };
const requestParams = getParams(record, params);
httpRequest({ api, params: requestParams, pathParams: record, requestConfig }).then(
(res: any) => {
NsModal.error({
title: '警告',
content: res.message,
});
},
);
}
},
style: {
cursor: 'pointer',
},
};
// 问号图标
const quIconNode = () => {
return (
isShowQuIcon &&
isShowQuIcon(record) && (
<QuestionCircleOutlined
{...props}
style={{
fontSize: '14px',
marginLeft: '4px',
color: '#666',
}}
/>
)
);
};
// 成功
if (
statusFieldValue.endsWith('success') ||
statusFieldValue.endsWith('available') ||
toLower(statusFieldValue).endsWith('active') ||
statusFieldValue.endsWith('enabled')
) {
return (
<div class="status-field status-success">
<span>{textFieldValue}</span>
{quIconNode()}
</div>
);
}
// 错误
if (
statusFieldValue.endsWith('fail') ||
statusFieldValue.endsWith('error') ||
statusFieldValue.endsWith('failed') ||
toLower(statusFieldValue).endsWith('disabled')
) {
if (isFunction(messageField)) {
messageField = messageField(record);
}
return (
<div class="status-field status-fail">
<span> {textFieldValue} </span>
{(!isShowQuIcon || isShowQuIcon(record)) && record[messageField as string] && (
<QuestionCircleOutlined
{...props}
style={{
fontSize: '14px',
marginLeft: '4px',
color: '#666',
}}
/>
)}
</div>
);
}
// 提醒状态
if (statusFieldValue.endsWith('warning')) {
return (
<div class="status-field status-warning">
<span>{textFieldValue}</span>
{quIconNode()}
</div>
);
}
// 执行中
if (statusFieldValue.endsWith('ing')) {
return (
<div
style={{
display: 'flex',
alignItems: 'center',
}}>
<a-spin
indicator={
<Loading3QuartersOutlined
style={{
fontSize: '11px',
margin: '6px',
}}
spin={true}></Loading3QuartersOutlined>
}
/>
<a-typography-text>{textFieldValue}</a-typography-text>
</div>
);
}
// 提醒状态
if (statusFieldValue.endsWith('unknown')) {
return (
<div class="status-field status-normal">
<span>{textFieldValue}</span>
{quIconNode()}
</div>
);
}
return (
// <div class="status-field status-normal">
<div>
<span>{textFieldValue ? textFieldValue : '-'}</span>
{quIconNode()}
</div>
);
},
};