import { Tag } from "antd" import { SpaceSize } from "antd/lib/space" import React from "react" import { CSSProperties } from "react" import './index.less' export interface TagParam { color?: string //标签字体颜色 backgroundColor?: string //标签背景颜色 name: string //标签名字 tag: number //标签识别码 } interface MultiTagSelectProps { tags?: number[] | number, //当前选中的标签的识别码 params?: TagParam[], //所有标签 paramGroups?: TagParam[][], showChecked?: boolean //只展示选中的 spaceSize?: SpaceSize //选项间隙 single?: boolean // 设置单选模式 themeColor?: string //主题颜色 lock?: boolean //是否锁定 onChange?: (value: number[] | number) => void // 单选模式下返回单个值 style?: CSSProperties } const MultiTagSelect = (props: MultiTagSelectProps) => { const onTagChange = (checked: boolean, tag: number) => { if (props.lock) return; if (props.single) { if (props.onChange) props.onChange(tag); return; } let tags = props.tags as number[]; let data = tags.filter(t => t !== tag) || []; if (checked) data.push(tag); if (props.onChange) props.onChange(data); } //用于在标签过长的时候可使用鼠标滑轮滑动 const onMouseOver = () => { let tags = document.querySelector('.tn-multi-tag-select-container'); tags.addEventListener('wheel', (event:WheelEvent) => { event.preventDefault(); tags.scrollLeft += event.deltaY; }) } return (
{props.params && (
{props.params.map((param, idx) => { let tagChecked; if (typeof props.tags === 'number') { tagChecked = props.tags as number === param.tag; } else { tagChecked = props.tags?.indexOf(param.tag) > -1; } if (props.showChecked && !tagChecked) return null; let color = param.color ? param.color : (param.backgroundColor?.indexOf('#') > -1 ? 'white' : null); if (tagChecked) return ( onTagChange(false, param.tag)} style={{ 'color': color }} color={param.backgroundColor ? param.backgroundColor : (props.themeColor || '#108ee9')} >{param.name} ) return ( onTagChange(true, param.tag)}>{param.name} ) })}
)} {props.paramGroups && (
{props.paramGroups.map((params, idx) => (
{params.map((param, idx) => { let tagChecked; if (typeof props.tags === 'number') { tagChecked = props.tags as number === param.tag; } else { tagChecked = props.tags?.indexOf(param.tag) > -1; } if (props.showChecked && !tagChecked) return null; let color = param.color ? param.color : (param.backgroundColor?.indexOf('#') > -1 ? 'white' : null); if (tagChecked) return ( onTagChange(false, param.tag)} style={{ 'color': color }} color={param.backgroundColor ? param.backgroundColor : (props.themeColor || '#108ee9')} >{param.name} ) return ( onTagChange(true, param.tag)}>{param.name} ) })}
))}
)}
) } MultiTagSelect.defaultProps = { tags: [], params: [], single: false, } export default MultiTagSelect;