mirror of
https://github.com/didi/KnowStreaming.git
synced 2025-12-24 20:22:12 +08:00
204 lines
6.2 KiB
TypeScript
204 lines
6.2 KiB
TypeScript
import React, { useState, useEffect } from 'react';
|
||
import { Radio, Input, Popover, Space, Checkbox, Row, Col, Button } from 'knowdesign';
|
||
import { IconFont } from '@knowdesign/icons';
|
||
import { InodeScopeModule } from './index';
|
||
import './style/node-scope.less';
|
||
|
||
interface propsType {
|
||
change: Function;
|
||
nodeScopeModule: InodeScopeModule;
|
||
}
|
||
|
||
const OptionsDefault = [
|
||
{
|
||
label: 'Top 5',
|
||
value: 5,
|
||
},
|
||
{
|
||
label: 'Top 10',
|
||
value: 10,
|
||
},
|
||
{
|
||
label: 'Top 15',
|
||
value: 15,
|
||
},
|
||
];
|
||
|
||
const NodeScope = ({ nodeScopeModule, change }: propsType) => {
|
||
const {
|
||
customScopeList: customList,
|
||
scopeName = '',
|
||
scopeLabel = '自定义范围',
|
||
searchPlaceholder = '输入内容进行搜索',
|
||
} = nodeScopeModule;
|
||
const [topNum, setTopNum] = useState<number>(5);
|
||
const [isTop, setIsTop] = useState(true);
|
||
const [audioOptions, setAudioOptions] = useState(OptionsDefault);
|
||
const [scopeSearchValue, setScopeSearchValue] = useState('');
|
||
const [inputValue, setInputValue] = useState<string>(null);
|
||
const [indeterminate, setIndeterminate] = useState(false);
|
||
const [popVisible, setPopVisible] = useState(false);
|
||
const [checkAll, setCheckAll] = useState(false);
|
||
const [checkedListTemp, setCheckedListTemp] = useState([]);
|
||
const [checkedList, setCheckedList] = useState([]);
|
||
const [allCheckedList, setAllCheckedList] = useState([]);
|
||
|
||
useEffect(() => {
|
||
const all = customList?.map((item) => item.value) || [];
|
||
setAllCheckedList(all);
|
||
}, [customList]);
|
||
|
||
useEffect(() => {
|
||
if (topNum) {
|
||
const timeOption = audioOptions.find((item) => item.value === topNum);
|
||
|
||
setInputValue(timeOption?.label);
|
||
setCheckedListTemp([]);
|
||
setCheckedList([]);
|
||
|
||
setPopVisible(false);
|
||
}
|
||
}, [topNum]);
|
||
|
||
useEffect(() => {
|
||
setIndeterminate(!!checkedListTemp.length && checkedListTemp.length < allCheckedList.length);
|
||
setCheckAll(checkedListTemp?.length === allCheckedList.length);
|
||
}, [checkedListTemp]);
|
||
|
||
const customSure = () => {
|
||
if (checkedListTemp?.length > 0) {
|
||
setCheckedList(checkedListTemp);
|
||
change(checkedListTemp, false);
|
||
setIsTop(false);
|
||
setTopNum(null);
|
||
setInputValue(`${checkedListTemp?.length}项`);
|
||
setPopVisible(false);
|
||
}
|
||
};
|
||
|
||
const customCancel = () => {
|
||
setCheckedListTemp(checkedList);
|
||
setPopVisible(false);
|
||
};
|
||
|
||
const visibleChange = (visible: any) => {
|
||
setCheckedListTemp(checkedList);
|
||
setPopVisible(visible);
|
||
};
|
||
|
||
const periodtimeChange = (e: any) => {
|
||
const topNum = e.target.value;
|
||
setTopNum(topNum);
|
||
change(topNum, true);
|
||
setIsTop(true);
|
||
};
|
||
|
||
const onCheckAllChange = (e: any) => {
|
||
setCheckedListTemp(e.target.checked ? allCheckedList : []);
|
||
setIndeterminate(false);
|
||
setCheckAll(e.target.checked);
|
||
};
|
||
|
||
const checkChange = (val: any) => {
|
||
setCheckedListTemp(val);
|
||
// setIndeterminate(!!val.length && val.length < allCheckedList.length);
|
||
// setCheckAll(val?.length === allCheckedList.length);
|
||
};
|
||
|
||
const clickContent = (
|
||
<div className="dd-node-scope-module">
|
||
{/* <span>时间:</span> */}
|
||
<div className="flx_con">
|
||
<div className="flx_l">
|
||
<h6 className="time_title">选择 top 范围</h6>
|
||
<Radio.Group
|
||
optionType="button"
|
||
buttonStyle="solid"
|
||
className="topNum-radio-group"
|
||
// options={audioOptions}
|
||
onChange={periodtimeChange}
|
||
value={topNum}
|
||
>
|
||
<Space direction="vertical" size={16}>
|
||
{audioOptions.map((item, index) => (
|
||
<Radio value={item.value} key={index}>
|
||
{item.label}
|
||
</Radio>
|
||
))}
|
||
</Space>
|
||
</Radio.Group>
|
||
</div>
|
||
<div className="flx_r">
|
||
<h6 className="time_title">{scopeLabel}</h6>
|
||
<div className="custom-scope">
|
||
<div className="check-row">
|
||
<Checkbox className="check-all" indeterminate={indeterminate} onChange={onCheckAllChange} checked={checkAll}>
|
||
全选
|
||
</Checkbox>
|
||
<Input
|
||
className="search-input"
|
||
suffix={<IconFont type="icon-fangdajing" style={{ fontSize: '16px' }} />}
|
||
size="small"
|
||
placeholder={searchPlaceholder}
|
||
onChange={(e) => setScopeSearchValue(e.target.value)}
|
||
/>
|
||
</div>
|
||
<div className="fixed-height">
|
||
<Checkbox.Group style={{ width: '100%' }} onChange={checkChange} value={checkedListTemp}>
|
||
<Row gutter={[10, 12]}>
|
||
{customList
|
||
.filter((item) => item.label.includes(scopeSearchValue))
|
||
.map((item) => (
|
||
<Col span={12} key={item.value}>
|
||
<Checkbox value={item.value}>{item.label}</Checkbox>
|
||
</Col>
|
||
))}
|
||
</Row>
|
||
</Checkbox.Group>
|
||
</div>
|
||
|
||
<div className="btn-con">
|
||
<Button
|
||
type="primary"
|
||
size="small"
|
||
className="btn-sure"
|
||
onClick={customSure}
|
||
disabled={checkedListTemp?.length > 0 ? false : true}
|
||
>
|
||
确定
|
||
</Button>
|
||
<Button size="small" onClick={customCancel}>
|
||
取消
|
||
</Button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
);
|
||
return (
|
||
<div id="d-node-scope">
|
||
<div className="scope-title">{scopeName}筛选:</div>
|
||
<Popover
|
||
trigger={['click']}
|
||
visible={popVisible}
|
||
content={clickContent}
|
||
placement="bottomRight"
|
||
overlayClassName="d-node-scope-popover large-size"
|
||
onVisibleChange={visibleChange}
|
||
>
|
||
<span className="input-span">
|
||
<Input
|
||
className={isTop ? 'relativeTime d-node-scope-input' : 'absoluteTime d-node-scope-input'}
|
||
value={inputValue}
|
||
readOnly={true}
|
||
suffix={<IconFont type="icon-jiantou1" rotate={90} style={{ color: '#74788D' }}></IconFont>}
|
||
/>
|
||
</span>
|
||
</Popover>
|
||
</div>
|
||
);
|
||
};
|
||
|
||
export default NodeScope;
|