import React, { Component, Fragment, useState, useEffect } from 'react';
import {
RightOutlined,
UpOutlined,
DownOutlined,
CaretDownOutlined,
CaretUpOutlined,
} from '@ant-design/icons';
import req from '@utils/request';
import { Divider, Spin } from 'antd';
import _ from 'lodash';
import './index.less';
import { apiName, imgObject } from './constant';
/**
* 大分类中的背景图
*/
export const categoryBackImg = {
0: imgObject.backAllImg,
1: imgObject.dataImg,
2: imgObject.javaImg,
3: imgObject.npmImg,
4: imgObject.parallelComputingImg,
5: imgObject.springbootImg,
6: imgObject.sqlImg,
7: imgObject.systemDesignImg,
8: imgObject.algorithmImg,
};
const categoryShowCount = 4;
const cacheMap = {}
const CategoryList = ({ primaryCategoryId, categoryList, ...props }) => {
const [secondCategoryList, setSecondCategoryList] = useState([])
const [currentActive, setCurrentActive] = useState(categoryList[0])
const [isPutAway, setIsPutAway] = useState(true)
const [loading, setLoading] = useState(false)
const getLabels = (id) => {
return new Promise(resolve => {
req({
method: 'post',
url: apiName.queryLabelByCategoryId,
data: { categoryId: id }
}).then(res => {
if (cacheMap[id]) {
resolve(cacheMap[id])
} else {
cacheMap[id] = res.data
resolve(res.data)
}
})
})
}
// 获取大类下分类
const getCategoryByPrimary = () => {
req({
method: 'post',
url: apiName.queryCategoryByPrimary,
data: { categoryType: 2, parentId: currentActive.id }
}).then(async res => {
let list = res.data
for (let i = 0; i < list.length; i++) {
list[i].children = await getLabels(list[i].id)
}
setSecondCategoryList(_.cloneDeep(list))
})
}
useEffect(() => {
if (primaryCategoryId) {
getCategoryByPrimary()
}
}, [primaryCategoryId])
/**
* 切换一级分类
* @param {*} item
* @returns
*/
const onChangeCategory = (item) => () => {
if (currentActive.id === item.id) {
return;
}
setCurrentActive(item)
props.onChangeCategory(item);
};
/**
* 一级分类模块
* @returns
*/
const renderFirstContainer = () => {
return (
{categoryList.slice(0, 7).map((categoryModuleItem, categoryModuleIndex) => {
return (
{categoryModuleItem.categoryName}
{categoryModuleItem.count || 50}道题
);
})}
{categoryList.length > 7 && (
更多
)}
);
};
/**
* 选择标签-支持单选(多选)
* @param {*} categoryId 一级分类id
* @param {*} secondCategoryIndex 二级分类对象index
* @param {*} thirdCategoryIndex 三级标签index
* @param {*} active 三级标签当前的选中状态
* @returns
*/
const onChangeLabel = (secondCategoryIndex, thirdCategoryIndex, active) => () => {
const { isMultipleChoice } = props;
const list = _.cloneDeep(secondCategoryList)
if (isMultipleChoice) {
// 三级标签支持多选
_.set(list, [secondCategoryIndex, 'children', thirdCategoryIndex, 'active'], !active)
setSecondCategoryList(list)
} else {
// 三级标签支持单选
let formatLabelList = list[secondCategoryIndex].children.map((item, index) => {
let flag = false;
if (index === thirdCategoryIndex) {
flag = !active; // 将三级标签设置选中/未选中
}
return {
...item,
active: flag,
};
});
_.set(list, [secondCategoryIndex, 'children'], formatLabelList);
setSecondCategoryList(list)
}
// console.log(currentActive, _.get(list, [secondCategoryIndex, 'children', thirdCategoryIndex, 'id']))
props.onChangeLabel(_.get(list, [secondCategoryIndex, 'id']), _.get(list, [secondCategoryIndex, 'children', thirdCategoryIndex, 'id']))
};
/**
* 展开/收起
* @param {*} secondCategoryIndex
* @returns
*/
const onChangeOpenStatus = (secondCategoryIndex, isOpen) => () => {
_.set(secondCategoryList, [secondCategoryIndex, 'isOpen'], !isOpen);
setSecondCategoryList(secondCategoryList)
};
/**
* 展开/收起
*/
const onChangePutAway = () => {
setIsPutAway(!isPutAway)
};
/**
* 二级分类模块
* @returns
*/
const renderSecondContainer = () => {
return (
{secondCategoryList.map((secondCategoryItem, secondCategoryIndex) => {
return (
= categoryShowCount && isPutAway
? 'none'
: 'flex',
}}
className="second-category-item"
key={`second_category_${secondCategoryItem.id}`}>
{secondCategoryItem.categoryName}:
{secondCategoryItem?.children?.length > 0 && (
{secondCategoryItem.children.map(
(thirdCategoryItem, thirdCategoryIndex) => {
return (
{thirdCategoryItem.labelName}
);
}
)}
{
secondCategoryItem.children.length > 5 ?
{secondCategoryItem.isOpen ? '收起' : '展开'}
{secondCategoryItem.isOpen ? (
) : (
)}
: null
}
)}
);
})}
{secondCategoryList?.length >= categoryShowCount && (
{isPutAway ? '展开' : '收起'}
{isPutAway ? (
) : (
)}
)}
);
};
return (
{categoryList?.length && renderFirstContainer()}
{secondCategoryList?.length > 0 && renderSecondContainer()}
{/* {!this.props.isHideSec && (
{secondCategoryList?.length > 0 && this.renderSecondContainer()}
)} */}
)
}
export default CategoryList
class CategoryList1 extends Component {
constructor(props) {
super(props);
this.state = {
secondCategoryList: [],
currentActive: null,
isPutAway: true, // 是否收起 默认收起状态
};
}
componentDidMount() {
// this.initCategoryList();
}
/**
* 初始化数据,默认选择第一个
*/
initCategoryList() {
const { categoryList, primaryCategoryId } = this.props;
let currentActive = primaryCategoryId ?? categoryList[0];
this.props.onChangeCategory(currentActive);
this.getSecondCategoryList(currentActive);
}
/**
* 获得二级三级分类数据
*/
getSecondCategoryList(currentActive) {
const { categoryListMap } = this.props;
// 调用接口返回二级三级数据
let params = {
parentId: currentActive.id,
categoryType: 2,
};
req({
method: 'post',
data: params,
url: apiName.getCategoryLabelInfo,
})
.then((res) => {
if (res.data && res.data.length > 0) {
let secondCategoryList = res.data;
let listLen =
categoryListMap &&
categoryListMap[currentActive] &&
categoryListMap[currentActive].length;
let objActive = {};
listLen > 0 &&
categoryListMap &&
categoryListMap[currentActive] &&
categoryListMap[currentActive].forEach((item) => {
objActive[item] = item;
});
secondCategoryList.forEach((categoryItem) => {
categoryItem.labelInfoList.forEach((item) => {
if (listLen > 0 && objActive[item.assembleId]) {
item.active = true;
} else {
item.active = false;
}
});
categoryItem.isOpen = false;
});
this.setState(
{
secondCategoryList,
currentActive,
},
() => {
let activeList = [];
secondCategoryList.forEach((categoryItem) => {
categoryItem.labelInfoList.forEach((item) => {
if (item.active) {
activeList.push(item.assembleId);
}
});
});
secondCategoryList.forEach((item, index) => {
let height = document.getElementById('id_' + index)?.scrollHeight;
let displayHeight = height > 43 ? 'flex' : 'none';
!this.props.isHideSec &&
(document.getElementById('second_id_' + index).style.display =
displayHeight);
});
}
);
}
})
.catch((err) => console.log(err));
}
/**
* 切换一级分类
* @param {*} item
* @returns
*/
onChangeCategory = (primaryCategoryId) => () => {
let { currentActive } = this.state;
if (currentActive === primaryCategoryId) {
return;
}
this.props.isHideSec &&
this.setState({
currentActive: primaryCategoryId,
});
this.props.onChangeCategory(primaryCategoryId);
!this.props.isHideSec && this.getSecondCategoryList(primaryCategoryId);
};
/**
* 选择标签-支持单选(多选)
* @param {*} categoryId 一级分类id
* @param {*} childrenLevelList 二级分类对象的标签列表
* @param {*} secondCategoryIndex 二级分类对象index
* @param {*} thirdCategoryIndex 三级标签index
* @param {*} active 三级标签当前的选中状态
* @returns
*/
onChangeLabel = (childrenLevelList, secondCategoryIndex, thirdCategoryIndex, active) => () => {
let { secondCategoryList, currentActive } = this.state;
const { isMultipleChoice } = this.props;
if (isMultipleChoice) {
// 三级标签支持多选
_.set(childrenLevelList, [thirdCategoryIndex, 'active'], !active);
_.set(secondCategoryList, [secondCategoryIndex, 'children'], childrenLevelList);
} else {
// 三级标签支持单选
let formatLabelList = childrenLevelList.map((item, index) => {
let flag = false;
if (index === thirdCategoryIndex) {
flag = !active; // 将三级标签设置选中/未选中
}
return {
...item,
active: flag,
};
});
_.set(secondCategoryList, [secondCategoryIndex, 'children'], formatLabelList);
}
this.setState(
{
secondCategoryList,
},
() => {
let activeList = [];
secondCategoryList.forEach((categoryItem) => {
categoryItem.children.forEach((item) => {
if (item.active) {
activeList.push(item.assembleId);
}
});
});
this.props.onChangeLabel(currentActive, activeList);
}
);
};
/**
* 展开/收起
* @param {*} secondCategoryIndex
* @returns
*/
onChangeOpenStatus = (secondCategoryIndex, isOpen) => () => {
let { secondCategoryList } = this.state;
_.set(secondCategoryList, [secondCategoryIndex, 'isOpen'], !isOpen);
this.setState({
secondCategoryList,
});
};
/**
* 展开/收起
*/
onChangePutAway = () => {
let { isPutAway } = this.state;
this.setState({
isPutAway: !isPutAway,
});
};
/**
* 一级分类模块
* @returns
*/
renderFirstContainer = () => {
return (
{categoryList.slice(0, 7).map((categoryModuleItem, categoryModuleIndex) => {
return (
{categoryModuleItem.categoryName}
{categoryModuleItem.count || 50}道题
);
})}
{categoryList.length > 7 && (
更多
)}
);
};
/**
* 二级分类模块
* @returns
*/
renderSecondContainer = () => {
const { secondCategoryList, isPutAway } = this.state;
return (
{secondCategoryList.map((secondCategoryItem, secondCategoryIndex) => {
return (
= categoryShowCount && isPutAway
? 'none'
: 'flex',
}}
className="second-category-item"
key={`second_category_${secondCategoryItem.categoryId}`}>
{secondCategoryItem.categoryName}:
{secondCategoryItem?.labelInfoList?.length > 0 && (
{secondCategoryItem.labelInfoList.map(
(thirdCategoryItem, thirdCategoryIndex) => {
return (
{thirdCategoryItem.labelName}
);
}
)}
{secondCategoryItem.isOpen ? '收起' : '展开'}
{secondCategoryItem.isOpen ? (
) : (
)}
)}
);
})}
{secondCategoryList?.length >= categoryShowCount && (
{isPutAway ? '展开' : '收起'}
{isPutAway ? (
) : (
)}
)}
);
};
render() {
const { categoryList } = this.props;
const { secondCategoryList } = this.state;
return (
{categoryList?.length > 0 && this.renderFirstContainer()}
{!this.props.isHideSec && (
{secondCategoryList?.length > 0 && this.renderSecondContainer()}
)}
);
}
}