import type { Component as ComponentType } from 'vue';
import type { DictData } from '#/api/system/dict/dict-data-model';
import { h } from 'vue';
import { JsonPreview } from '@vben/common-ui';
import {
AndroidIcon,
BaiduIcon,
ChromeIcon,
DefaultBrowserIcon,
DefaultOsIcon,
DingtalkIcon,
EdgeIcon,
FirefoxIcon,
IconifyIcon,
IPhoneIcon,
LinuxIcon,
MicromessengerIcon,
OperaIcon,
OSXIcon,
QuarkIcon,
SafariIcon,
SvgQQIcon,
UcIcon,
WindowsIcon,
} from '@vben/icons';
import { Tag } from 'ant-design-vue';
import { DictTag } from '#/components/dict';
import { getDictOptions } from './dict';
/**
* 渲染标签
* @param text 文字
* @param color 颜色
* @returns render
*/
function renderTag(text: string, color?: string) {
return {text};
}
/**
*
* @param tags 标签list
* @param wrap 是否换行显示
* @param [gap] 间隔
* @returns render
*/
export function renderTags(tags: string[], wrap = false, gap = 1) {
return (
{tags.map((tag, index) => {
return
{renderTag(tag)}
;
})}
);
}
/**
*
* @param json json对象 接受object/string类型
* @returns json预览
*/
export function renderJsonPreview(json: any) {
if (typeof json !== 'object' && typeof json !== 'string') {
return {json};
}
if (typeof json === 'object') {
return ;
}
try {
const obj = JSON.parse(json);
// 基本数据类型可以被转为json
if (typeof obj !== 'object') {
return {obj};
}
return ;
} catch {
return {json};
}
}
/**
* iconify图标
* @param icon icon名称
* @returns render
*/
export function renderIcon(icon: string) {
return ;
}
/**
* httpMethod标签
* @param type method类型
* @returns render
*/
export function renderHttpMethodTag(type: string) {
const method = type.toUpperCase();
const colors: { [key: string]: string } = {
DELETE: 'red',
GET: 'green',
POST: 'blue',
PUT: 'orange',
};
const color = colors[method] ?? 'default';
const title = `${method}请求`;
return {title};
}
export function renderDictTag(value: number | string, dicts: DictData[]) {
return ;
}
/**
* render多个dictTag
* @param value key数组 string[]类型
* @param dicts 字典数组
* @param wrap 是否需要换行显示
* @param [gap] 间隔
* @returns render
*/
export function renderDictTags(
value: string[],
dicts: DictData[],
wrap = true,
gap = 1,
) {
if (!Array.isArray(value)) {
return {value}
;
}
return (
{value.map((item, index) => {
return
{renderDictTag(item, dicts)}
;
})}
);
}
/**
* 显示字典标签 一般是table使用
* @param value 值
* @param dictName dictName
* @returns tag
*/
export function renderDict(value: number | string, dictName: string) {
const dictInfo = getDictOptions(dictName);
return renderDictTag(value, dictInfo);
}
export function renderDictValue(value: number | string, dictName: string) {
const dictInfo = getDictOptions(dictName);
const matchedItem = dictInfo.find((item) => item.value == value);
return matchedItem ? matchedItem.label : value;
}
export function renderIconSpan(
icon: ComponentType,
value: string,
center = false,
marginLeft = '2px',
) {
const justifyCenter = center ? 'justify-center' : '';
return (
{h(icon)}
{value}
);
}
const osOptions = [
{ icon: WindowsIcon, value: 'windows' },
{ icon: LinuxIcon, value: 'linux' },
{ icon: OSXIcon, value: 'osx' },
{ icon: AndroidIcon, value: 'android' },
{ icon: IPhoneIcon, value: 'iphone' },
];
/**
* 浏览器图标
* cn.hutool.http.useragent -> browers
*/
const browserOptions = [
{ icon: ChromeIcon, value: 'chrome' },
{ icon: EdgeIcon, value: 'edge' },
{ icon: FirefoxIcon, value: 'firefox' },
{ icon: OperaIcon, value: 'opera' },
{ icon: SafariIcon, value: 'safari' },
{ icon: MicromessengerIcon, value: 'micromessenger' },
{ icon: MicromessengerIcon, value: 'windowswechat' },
{ icon: QuarkIcon, value: 'quark' },
{ icon: MicromessengerIcon, value: 'wxwork' },
{ icon: SvgQQIcon, value: 'qq' },
{ icon: DingtalkIcon, value: 'dingtalk' },
{ icon: UcIcon, value: 'uc' },
{ icon: BaiduIcon, value: 'baidu' },
];
export function renderOsIcon(os: string, center = false) {
if (!os) {
return;
}
let current = osOptions.find((item) =>
os.toLocaleLowerCase().includes(item.value),
);
// windows要特殊处理
if (os.toLocaleLowerCase().includes('windows')) {
current = osOptions[0];
}
const icon = current ? current.icon : DefaultOsIcon;
return renderIconSpan(icon, os, center, '5px');
}
export function renderBrowserIcon(browser: string, center = false) {
if (!browser) {
return;
}
const current = browserOptions.find((item) =>
browser.toLocaleLowerCase().includes(item.value),
);
const icon = current ? current.icon : DefaultBrowserIcon;
return renderIconSpan(icon, browser, center, '5px');
}