All checks were successful
Build and Deploy Front / deploy (push) Successful in 5m47s
优化运单详情抽屉操作栏与申报表编辑观感,限制我的订单入库后不可编辑;完善接口参数全量替换/脏检查与全局 Message;修复价格表批量填价选中被清与弹窗被遮挡。 Co-authored-by: Cursor <cursoragent@cursor.com>
95 lines
2.7 KiB
TypeScript
95 lines
2.7 KiB
TypeScript
import { Message } from '@arco-design/web-vue';
|
||
|
||
export type BaseMessageType = 'success' | 'error' | 'warning' | 'info';
|
||
|
||
export type BaseMessageOptions = {
|
||
/** 显示时长 ms */
|
||
duration?: number;
|
||
/** 是否显示关闭按钮 */
|
||
closable?: boolean;
|
||
/** 悬停时重置倒计时 */
|
||
resetOnHover?: boolean;
|
||
};
|
||
|
||
type MessageConfigLike = {
|
||
content: any;
|
||
duration?: number;
|
||
closable?: boolean;
|
||
resetOnHover?: boolean;
|
||
[key: string]: any;
|
||
};
|
||
|
||
/** 全局默认:可手动关闭;错误/警告多停留约 5s(合计 8s) */
|
||
const GLOBAL_MESSAGE_DEFAULTS: Record<
|
||
'info' | 'success' | 'warning' | 'error' | 'normal',
|
||
{ duration: number; closable: boolean; resetOnHover: boolean }
|
||
> = {
|
||
info: { duration: 3000, closable: true, resetOnHover: true },
|
||
success: { duration: 3000, closable: true, resetOnHover: true },
|
||
warning: { duration: 8000, closable: true, resetOnHover: true },
|
||
error: { duration: 8000, closable: true, resetOnHover: true },
|
||
normal: { duration: 3000, closable: true, resetOnHover: true },
|
||
};
|
||
|
||
type PatchableType = keyof typeof GLOBAL_MESSAGE_DEFAULTS;
|
||
|
||
let messageDefaultsInstalled = false;
|
||
|
||
function mergeMessageConfig(
|
||
type: PatchableType,
|
||
config: string | MessageConfigLike,
|
||
): MessageConfigLike {
|
||
const defaults = GLOBAL_MESSAGE_DEFAULTS[type];
|
||
if (typeof config === 'string') {
|
||
return {
|
||
content: config,
|
||
...defaults,
|
||
};
|
||
}
|
||
return {
|
||
...defaults,
|
||
...config,
|
||
duration: config.duration ?? defaults.duration,
|
||
closable: config.closable ?? defaults.closable,
|
||
resetOnHover: config.resetOnHover ?? defaults.resetOnHover,
|
||
};
|
||
}
|
||
|
||
/** 安装全局 Message 默认行为(幂等)。覆盖 Message.* 与 $baseMessage。 */
|
||
export function installGlobalMessageDefaults() {
|
||
if (messageDefaultsInstalled) return;
|
||
messageDefaultsInstalled = true;
|
||
|
||
(Object.keys(GLOBAL_MESSAGE_DEFAULTS) as PatchableType[]).forEach((type) => {
|
||
const original = (Message[type] as any).bind(Message);
|
||
|
||
(Message as any)[type] = (config: string | MessageConfigLike, appContext?: any) => {
|
||
return original(mergeMessageConfig(type, config), appContext);
|
||
};
|
||
});
|
||
}
|
||
|
||
// 被任何路径 import 时即安装,保证 request 拦截器等直接 Message.error 也生效
|
||
installGlobalMessageDefaults();
|
||
|
||
/**
|
||
* 全局消息提示
|
||
* @param message 消息内容
|
||
* @param type 消息类型
|
||
* @param options 可覆盖全局默认(duration / closable / resetOnHover)
|
||
*/
|
||
export const baseMessage = (
|
||
message: string,
|
||
type: BaseMessageType = 'info',
|
||
options?: BaseMessageOptions,
|
||
) => {
|
||
Message[type]({
|
||
content: message,
|
||
...options,
|
||
});
|
||
};
|
||
|
||
export const $baseMessage = baseMessage;
|
||
|
||
export default baseMessage;
|