Skip to content

Commit 6047b68

Browse files
committed
Add the filter components
1 parent 137d5d7 commit 6047b68

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import React, { useState } from 'react';
2+
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
3+
import {faAngleDown, faAngleUp} from "@fortawesome/free-solid-svg-icons";
4+
import {useDispatch, useSelector} from "react-redux";
5+
import {setFilterValue} from "../store/slices/filterSlice";
6+
import {RootState} from "../store/store";
7+
8+
interface FilterProps {
9+
label: string;
10+
}
11+
12+
const Filter: React.FC<FilterProps> = ({ label }) => {
13+
const [isOpen, setIsOpen] = useState(false);
14+
15+
const dispatch = useDispatch();
16+
const filter = useSelector((state: RootState) => state.filter["filters"])[label];
17+
const {values, options} = filter;
18+
19+
const toggleDropdown = () => {
20+
setIsOpen(!isOpen);
21+
};
22+
23+
const handleCheckboxChange = (option: string) => {
24+
const values = filter.values
25+
const newValues = values.includes(option)
26+
? values.filter(v => v !== option)
27+
: [...values, option];
28+
dispatch(setFilterValue({ label, values: newValues }));
29+
};
30+
31+
return (
32+
<div className="relative">
33+
<button
34+
onClick={toggleDropdown}
35+
className="flex items-center space-x-2 p-2 bg-white rounded border border-gray-300 focus:outline-none focus:border-blue-500"
36+
>
37+
<span className="font-semibold">{label}:</span>
38+
<span>{values.length}</span>
39+
{isOpen ? (
40+
<FontAwesomeIcon icon={faAngleUp} />
41+
) : (
42+
<FontAwesomeIcon icon={faAngleDown} />
43+
)}
44+
</button>
45+
{isOpen && (
46+
<div className="absolute z-10 mt-2 w-64 border rounded-md shadow-lg bg-white">
47+
{options.map((option, index) => (
48+
<label key={index} className="block text-left p-2 hover:bg-gray-100 cursor-pointer">
49+
<input
50+
type="checkbox"
51+
className="mr-2"
52+
value={option}
53+
checked={values.includes(option)}
54+
onChange={() => handleCheckboxChange(option)}
55+
/>
56+
{option}
57+
</label>
58+
))}
59+
</div>
60+
)}
61+
</div>
62+
);
63+
}
64+
65+
export default Filter;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from 'react';
2+
import Filter from './Filter';
3+
import {useSelector} from "react-redux";
4+
import {RootState} from "../store/store";
5+
6+
const FilterBar: React.FC = () => {
7+
const filters = useSelector((state:RootState) => state.filter)["filters"]
8+
9+
return (
10+
<div className="bg-gray-100 p-4 rounded border border-gray-300 my-4 flex space-x-4">
11+
{Object.keys(filters).map((filter) =>
12+
<Filter
13+
key={filter}
14+
label={filter}
15+
/>
16+
)}
17+
</div>
18+
);
19+
}
20+
21+
export default FilterBar;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface FilterModel {
2+
options: string[];
3+
values: string[];
4+
}

0 commit comments

Comments
 (0)