Skip to content

Commit

Permalink
👔 Update: 테이블 필터 다중 선택 로직 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
romantech committed Nov 8, 2021
1 parent fbb33f3 commit 5ec0a28
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 32 deletions.
25 changes: 12 additions & 13 deletions src/Components/AbvFilterButton.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,21 @@ const FilterButton = ({
idx,
}) => {
const [fromAbv, toAbv] = range;
const isFirst = fromAbv + toAbv === 103; // 첫번째 인덱스는 All 전체
const isLast = fromAbv + toAbv === 110; // 마지막 인덱스는 10% 이상

const clickHandler = () => {
if (selectedRange.has(idx)) {
selectedRange.delete(idx);
} else {
selectedRange.add(idx);
}
setSelectedRange(new Set([...selectedRange]));
};

return (
<S.ButtonWrapper
selected={selectedRange === idx}
onClick={() => {
setSelectedRange(idx);
}}
>
<S.ButtonWrapper selected={selectedRange.has(idx)} onClick={clickHandler}>
<button type="button">
{isFirst || isLast ? unit : `${fromAbv}-${toAbv}${unit}`}
{isLast ? unit : `${fromAbv}-${toAbv}${unit}`}
</button>
</S.ButtonWrapper>
);
Expand All @@ -45,11 +48,7 @@ S.ButtonWrapper = styled.div`
`}
:hover {
${({ selected }) =>
selected === false &&
css`
background: #e0e0e0;
`}
background: ${({ selected }) => (selected ? '#319cff' : '#e0e0e0;')};
}
button {
Expand Down
28 changes: 22 additions & 6 deletions src/Pages/BeerList.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React, { useState } from 'react';
import MaterialTable from 'material-table';
import { useSelector, useDispatch } from 'react-redux';
import styled from 'styled-components/macro';
import { Modal } from 'antd';
import tableIcons from '../Assets/tableIcons';
import PatchedPagination from '../Components/PatchedPagination';
import { ContainerStyle, ScrollStyle } from '../Styles/commonStyles';
Expand All @@ -12,7 +13,8 @@ import filterDataByAbv from '../Utils/filterDataByAbv';

const BeerList = () => {
const dispatch = useDispatch();
const { renderData, isDataLoaded } = useSelector(state => ({
const { rawData, renderData, isDataLoaded } = useSelector(state => ({
rawData: state.beerListReducer.rawData,
renderData: state.beerListReducer.renderData,
isDataLoaded: state.beerListReducer.loading,
}));
Expand All @@ -21,8 +23,7 @@ const BeerList = () => {
isColumnLoaded: state.listColumnReducer.loading,
}));

const [selectedRow, setSelectedRow] = useState(null);
const [selectedRange, setSelectedRange] = useState(0);
const [selectedRange, setSelectedRange] = useState(new Set([]));

const columnDragHandler = (fromIdx, toIdx) => {
dispatch(setColumnsRequest(fromIdx, toIdx, columns));
Expand All @@ -34,10 +35,25 @@ const BeerList = () => {
color: '#FFF',
fontSize: '1rem',
},
pageSizeOptions: [5, 8, 15],
pageSize: 6,
pageSizeOptions: [6, 10, 15],
};

const filteredData = filterDataByAbv(selectedRange, renderData);
const rowClickHandler = (_, selected) => {
const { id } = selected.tableData;
Modal.info({
title: '맥주 상세 정보',
width: '50%',
content: <h1>모달</h1>,
onOk() {},
});
};

const filteredData = filterDataByAbv(
[...selectedRange],
renderData,
abvRange,
);

return (
<S.Container>
Expand All @@ -63,7 +79,7 @@ const BeerList = () => {
title="BEER LIST"
icons={tableIcons}
isLoading={!(isDataLoaded === false && isColumnLoaded === false)}
onRowClick={(_, selected) => setSelectedRow(selected.tableData.id)}
onRowClick={rowClickHandler}
onColumnDragged={columnDragHandler}
options={tableOptions}
/>
Expand Down
8 changes: 4 additions & 4 deletions src/Utils/abvRange.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
export default [
{
range: [3, 100],
unit: 'ALL',
range: [3, 4],
unit: '%',
},
{
range: [3, 4],
range: [4, 5],
unit: '%',
},
{
Expand All @@ -20,7 +20,7 @@ export default [
unit: '%',
},
{
range: [9, 10],
range: [8, 9],
unit: '%',
},
{
Expand Down
21 changes: 12 additions & 9 deletions src/Utils/filterDataByAbv.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import abvRange from './abvRange';

export default (selectedRange, data) => {
const { range } = abvRange[selectedRange];
const filteredData = data?.filter(({ abv }) => {
if (range[0] <= abv && range[1] >= abv) return true;
return false;
});
return filteredData;
export default (selectedRange, data, abvRange) => {
if (selectedRange.length === 0) {
return data;
}
return selectedRange.reduce((acc, cur) => {
const {
range: [fromRange, toRange],
} = abvRange[cur];
return acc.concat(
data?.filter(({ abv }) => !!(fromRange <= abv && toRange >= abv)),
);
}, []);
};

0 comments on commit 5ec0a28

Please sign in to comment.