points with dist filters,

grouping filters,
last ml run styling
dev
RekHoto 3 years ago
parent dc91b53c8e
commit 05489d6c72

@ -23,7 +23,7 @@ if (import.meta.env.MODE === "development") {
mountStoreDevtool("PointSelection", usePointSelection); mountStoreDevtool("PointSelection", usePointSelection);
} }
const version = '0.0.3'; const version = '0.0.4';
function App() { function App() {

@ -1,11 +1,30 @@
import { useLastMLRun } from "../api.js"; import { useLastMLRun } from "../api.js";
import {Button, Popover, Tooltip} from "antd";
import {InfoCircleOutlined} from "@ant-design/icons";
export function LastMLRun() { export function LastMLRun() {
const {data: time} = useLastMLRun(); const {data: time} = useLastMLRun();
const lastMLRunRender = () => {
return (
<div className="text-xs text-grey z-10 bg-white-background rounded-xl p-2 space-y-3">
Последний запуск: {time}
</div>
);
};
return ( return (
<div className="absolute bottom-[20px] left-[254px] text-xs text-grey z-10 bg-white-background rounded-xl p-2 space-y-3"> <Popover
Последний запуск: {time} content={lastMLRunRender}
</div> trigger="click"
placement={"leftBottom"}
>
<Tooltip title="Слои">
<Button className="absolute bottom-[64px] right-[20px] flex items-center justify-center p-3">
<InfoCircleOutlined className="w-4 h-4" />
</Button>
</Tooltip>
</Popover>
); );
} }

@ -34,7 +34,7 @@ export const CancelledPoints = () => {
{...cancelledPointLayer} {...cancelledPointLayer}
id={LAYER_IDS.cancelled} id={LAYER_IDS.cancelled}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
visibility: isVisible[LAYER_IDS.cancelled] ? "visible" : "none", visibility: isVisible[LAYER_IDS.cancelled] ? "visible" : "none",
}} }}

@ -56,7 +56,7 @@ export const FilteredWorkingPoints = () => {
{...workingPointBackgroundLayer} {...workingPointBackgroundLayer}
id={LAYER_IDS.filteredWorkingBackground} id={LAYER_IDS.filteredWorkingBackground}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
visibility: isVisible[LAYER_IDS.filteredWorking] ? "visible" : "none", visibility: isVisible[LAYER_IDS.filteredWorking] ? "visible" : "none",
}} }}
@ -66,7 +66,7 @@ export const FilteredWorkingPoints = () => {
{...workingPointSymbolLayer} {...workingPointSymbolLayer}
id={LAYER_IDS.filteredWorking} id={LAYER_IDS.filteredWorking}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
...workingPointSymbolLayer.layout, ...workingPointSymbolLayer.layout,
visibility: isVisible[LAYER_IDS.filteredWorking] ? "visible" : "none", visibility: isVisible[LAYER_IDS.filteredWorking] ? "visible" : "none",

@ -25,7 +25,7 @@ export const OnApprovalPoints = () => {
{...approvePointLayer} {...approvePointLayer}
id={LAYER_IDS.approve} id={LAYER_IDS.approve}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.service_points_with_dist"}
layout={{ layout={{
visibility: isVisible[LAYER_IDS.approve] ? "visible" : "none", visibility: isVisible[LAYER_IDS.approve] ? "visible" : "none",
}} }}

@ -8,42 +8,37 @@ import { usePointSelection } from "../../stores/usePointSelection";
import { STATUSES } from "../../config"; import { STATUSES } from "../../config";
import { useRegionFilterExpression } from "./useRegionFilterExpression"; import { useRegionFilterExpression } from "./useRegionFilterExpression";
import { LAYER_IDS } from "./constants"; import { LAYER_IDS } from "./constants";
import { usePendingPointsFilters } from "../../stores/usePendingPointsFilters"; import { RANGE_FILTERS_KEYS, usePendingPointsFilters } from "../../stores/usePendingPointsFilters";
import { usePostamatesAndPvzGroups } from "../../api.js";
import { useMemo } from "react";
const statusExpression = ["==", ["get", "status"], STATUSES.pending]; const statusExpression = ["==", ["get", "status"], STATUSES.pending];
const useFilterExpression = () => { const useFilterExpression = () => {
const { data: postamatesAndPvzGroups } = usePostamatesAndPvzGroups();
const filteredPostamatesCategories = useMemo(() => {
if (!postamatesAndPvzGroups) return [];
return postamatesAndPvzGroups
.filter((category) => category.visible)
.map((category) => {
return {
...category,
groups: [...category.groups.filter((group) => group.visible)],
}
})
}, [postamatesAndPvzGroups]);
const postamatesGroups = useMemo(() => {
if (!filteredPostamatesCategories) return [];
return filteredPostamatesCategories
.map((category) => {
return [...category.groups.filter((group) => group.visible)]
}).flat();
}, [postamatesAndPvzGroups]);
const { filters, ranges } = usePendingPointsFilters(); const { filters, ranges } = usePendingPointsFilters();
const { const { prediction, categories, region } = filters;
prediction,
categories,
region,
doors__gt,
doors__lt,
flat_cnt__gt,
flat_cnt__lt,
rival_post_cnt__gt,
rival_post_cnt__lt,
rival_pvz_cnt__gt,
rival_pvz_cnt__lt,
target_post_cnt__gt,
target_post_cnt__lt,
flats_cnt__gt,
flats_cnt__lt,
tc_cnt__gt,
tc_cnt__lt,
culture_cnt__gt,
culture_cnt__lt,
mfc_cnt__gt,
mfc_cnt__lt,
public_stop_cnt__gt,
public_stop_cnt__lt,
supermarket_cnt__gt,
supermarket_cnt__lt,
target_dist__gt,
target_dist__lt,
metro_dist__gt,
metro_dist__lt, } = filters;
const { selection } = usePointSelection(); const { selection } = usePointSelection();
const includedArr = [...selection.included]; const includedArr = [...selection.included];
const excludedArr = [...selection.excluded]; const excludedArr = [...selection.excluded];
@ -52,83 +47,39 @@ const useFilterExpression = () => {
const includedExpression = ["in", ["get", "id"], ["literal", includedArr]]; const includedExpression = ["in", ["get", "id"], ["literal", includedArr]];
const excludedExpression = ["in", ["get", "id"], ["literal", excludedArr]]; const excludedExpression = ["in", ["get", "id"], ["literal", excludedArr]];
const predictionExpression = [ const predictionExpression = [
[">=", ["get", "prediction_current"], prediction[0]], [">=", ["get", "prediction_current"], prediction[0]],
["<=", ["get", "prediction_current"], prediction[1]], ["<=", ["get", "prediction_current"], prediction[1]],
]; ];
const doorsExpression = [ const dynamicKeyFiltersExpressions = postamatesGroups.map((group) => {
[">=", ["get", "doors"], doors__gt], const key = `d${group.id}`
["<=", ["get", "doors"], doors__lt], return [
]; [">=", ["get", key], filters[`${key}__gt`]],
["<=", ["get", key], filters[`${key}__lt`]],
];
});
const flatExpression = [ const staticKeyFiltersExpressions = RANGE_FILTERS_KEYS.map((key) => {
[">=", ["get", "flat_cnt"], flat_cnt__gt], return [
["<=", ["get", "flat_cnt"], flat_cnt__lt], [">=", ["get", key], filters[`${key}__gt`]],
]; ["<=", ["get", key], filters[`${key}__lt`]],
];
});
const rivalPostExpression = [ const dynamicKeyExpressions = dynamicKeyFiltersExpressions.filter((expression) => {
[">=", ["get", "rival_post_cnt"], rival_post_cnt__gt], const filterKey = expression[0][1][1];
["<=", ["get", "rival_post_cnt"], rival_post_cnt__lt], const range = ranges[filterKey];
]; const gtValue = expression[0][2] || 0;
const rivalPvzExpression = [ const gtInitial = range ? range[0] : 0;
[">=", ["get", "rival_pvz_cnt"], rival_pvz_cnt__gt], const ltValue = expression[1][2] || 0;
["<=", ["get", "rival_pvz_cnt"], rival_pvz_cnt__lt], const ltInitial = range ? range[1] : 0;
];
const targetPostExpression = [ return !(gtValue === gtInitial && ltValue === ltInitial);
[">=", ["get", "target_post_cnt"], target_post_cnt__gt], }).flat();
["<=", ["get", "target_post_cnt"], target_post_cnt__lt],
];
const flatsExpression = [
[">=", ["get", "flats_cnt"], flats_cnt__gt],
["<=", ["get", "flats_cnt"], flats_cnt__lt],
];
const tcExpression = [
[">=", ["get", "tc_cnt"], tc_cnt__gt],
["<=", ["get", "tc_cnt"], tc_cnt__lt],
];
const cultureExpression = [
[">=", ["get", "culture_cnt"], culture_cnt__gt],
["<=", ["get", "culture_cnt"], culture_cnt__lt],
];
const mfcExpression = [
[">=", ["get", "mfc_cnt"], mfc_cnt__gt],
["<=", ["get", "mfc_cnt"], mfc_cnt__lt],
];
const publicStopExpression = [
[">=", ["get", "public_stop_cnt"], public_stop_cnt__gt],
["<=", ["get", "public_stop_cnt"], public_stop_cnt__lt],
];
const supermarketExpression = [
[">=", ["get", "supermarket_cnt"], supermarket_cnt__gt],
["<=", ["get", "supermarket_cnt"], supermarket_cnt__lt],
];
const targetDistExpression = [
[">=", ["get", "target_dist"], target_dist__gt],
["<=", ["get", "target_dist"], target_dist__lt],
];
const metroDistExpression = [
[">=", ["get", "metro_dist"], metro_dist__gt],
["<=", ["get", "metro_dist"], metro_dist__lt],
];
const filterExpressions = [ const staticKeyExpressions = staticKeyFiltersExpressions.filter((expression) => {
doorsExpression,
flatExpression,
rivalPostExpression,
rivalPvzExpression,
targetPostExpression,
// flatsExpression,
tcExpression,
cultureExpression,
mfcExpression,
publicStopExpression,
supermarketExpression,
targetDistExpression,
// metroDistExpression
]
const activeExpressions = filterExpressions.filter((expression) => {
const filterKey = expression[0][1][1]; const filterKey = expression[0][1][1];
const gtValue = expression[0][2]; const gtValue = expression[0][2];
const gtInitial = ranges[filterKey][0]; const gtInitial = ranges[filterKey][0];
@ -150,8 +101,8 @@ const useFilterExpression = () => {
[ [
"any", "any",
regionExpression regionExpression
? ["all", ...predictionExpression, ...activeExpressions, categoryExpression, regionExpression] ? ["all", ...predictionExpression, ...staticKeyExpressions, ...dynamicKeyExpressions, categoryExpression, regionExpression]
: ["all", ...predictionExpression, ...activeExpressions, categoryExpression], : ["all", ...predictionExpression, ...staticKeyExpressions, ...dynamicKeyExpressions, categoryExpression],
includedExpression, includedExpression,
], ],
]; ];
@ -191,7 +142,7 @@ export const PendingPoints = () => {
{...matchInitialPointLayer} {...matchInitialPointLayer}
id={LAYER_IDS["initial-unmatch"]} id={LAYER_IDS["initial-unmatch"]}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
...matchInitialPointLayer.layout, ...matchInitialPointLayer.layout,
visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none", visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none",
@ -203,7 +154,7 @@ export const PendingPoints = () => {
{...matchInitialPointLayer} {...matchInitialPointLayer}
id={LAYER_IDS["initial-match"]} id={LAYER_IDS["initial-match"]}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
...matchInitialPointLayer.layout, ...matchInitialPointLayer.layout,
visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none", visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none",

@ -17,7 +17,7 @@ export const Points = () => {
type="vector" type="vector"
key={`points-${updateCounter}`} key={`points-${updateCounter}`}
tiles={[ tiles={[
`${BASE_URL}/martin/public.service_placementpoint/{z}/{x}/{y}.pbf`, `${BASE_URL}/martin/public.points_with_dist/{z}/{x}/{y}.pbf`,
]} ]}
> >
<PendingPoints /> <PendingPoints />

@ -37,7 +37,7 @@ export const WorkingPoints = () => {
{...workingPointBackgroundLayer} {...workingPointBackgroundLayer}
id={LAYER_IDS.workingBackground} id={LAYER_IDS.workingBackground}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
visibility: isVisible[LAYER_IDS.working] ? "visible" : "none", visibility: isVisible[LAYER_IDS.working] ? "visible" : "none",
}} }}
@ -47,7 +47,7 @@ export const WorkingPoints = () => {
{...workingPointSymbolLayer} {...workingPointSymbolLayer}
id={LAYER_IDS.working} id={LAYER_IDS.working}
source={"points"} source={"points"}
source-layer={"public.service_placementpoint"} source-layer={"public.points_with_dist"}
layout={{ layout={{
...workingPointSymbolLayer.layout, ...workingPointSymbolLayer.layout,
visibility: isVisible[LAYER_IDS.working] ? "visible" : "none", visibility: isVisible[LAYER_IDS.working] ? "visible" : "none",

@ -187,12 +187,19 @@ export const useGetPendingPointsRange = () => {
}, },
{ {
select: (data) => { select: (data) => {
const distToGroupsArr = data.dist_to_groups.map((groupRange) => {
return {
[`d${groupRange.group_id}`]: groupRange.dist,
}
})
const distToGroups = Object.assign({}, ...distToGroupsArr);
return { return {
prediction: data.prediction_current, prediction: data.prediction_current,
doors: data.doors, doors: data.doors,
flat_cnt: data.flat_cnt, flat_cnt: data.flat_cnt,
flats_cnt: data.flats_cnt, flats_cnt: data.flats_cnt,
target_post_cnt: data.target_post_cnt target_post_cnt: data.target_post_cnt,
...distToGroups
}; };
}, },
} }

@ -3,11 +3,11 @@ import { twMerge } from "tailwind-merge";
const { Text } = Typography; const { Text } = Typography;
export const Title = ({ text, className, classNameText }) => { export const Title = ({ text, className, classNameText, type = "secondary" }) => {
return ( return (
<div className={twMerge("mb-1", className)}> <div className={twMerge("mb-1", className)}>
<Text <Text
type="secondary" type={type}
className={twMerge("uppercase text-xs", classNameText)} className={twMerge("uppercase text-xs", classNameText)}
> >
{text} {text}

@ -99,6 +99,13 @@
padding: 0 !important; padding: 0 !important;
} }
.filter_group .ant-collapse-header {
padding: 0 !important;
}
.filter_group .ant-collapse-arrow {
right: 0 !important;
}
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 12px; width: 12px;
height: 12px; height: 12px;

@ -1,136 +1,221 @@
import { usePendingPointsFilters } from "../../../../stores/usePendingPointsFilters"; import { usePendingPointsFilters } from "../../../../stores/usePendingPointsFilters";
import { FilterSlider } from "./Slider.jsx"; import { FilterSlider } from "./Slider.jsx";
import { Collapse } from "antd";
import React, { useMemo } from "react";
import { Title } from "../../../../components/Title.jsx";
import { usePostamatesAndPvzGroups } from "../../../../api.js";
export const AdvancedFilters = () => { export const AdvancedFilters = () => {
const { const {
filters, filters,
setDoors, setFilterWithKey,
setFlatCnt,
setRivalPostCnt,
setRivalPvzCnt,
setTargetPostCnt,
setFlatsCnt,
setTcCnt,
setCultureCnt,
setMfcCnt,
setPublicStopCnt,
setSupermarketCnt,
setTargetDist,
setMetroDist,
ranges ranges
} = usePendingPointsFilters(); } = usePendingPointsFilters();
const { data: postamatesAndPvzGroups } = usePostamatesAndPvzGroups();
const filteredPostamatesGroups = useMemo(() => {
if (!postamatesAndPvzGroups) return [];
return postamatesAndPvzGroups
.filter((category) => category.visible)
.map((category) => {
return {
...category,
groups: [...category.groups.filter((group) => group.visible)],
}
})
}, [postamatesAndPvzGroups]);
return ( return (
<div className="ml-4 px-3 py-[24px] bg-white rounded-xl z-20 overflow-y-scroll mt-[5vh] shadow-2xl" style={{maxHeight: '90vh', maxWidth: '350px'}}> <div className="ml-4 px-3 py-[24px] bg-white rounded-xl z-20 overflow-y-scroll mt-[5vh] shadow-2xl" style={{maxHeight: '90vh', width: '350px', maxWidth: '450px'}}>
<div> <Collapse
<FilterSlider bordered={false}
filterRange={[filters.doors__gt, filters.doors__lt]} expandIconPosition={"end"}
setFilterRange={setDoors} style={{
title={"Кол-во подъездов в жилом доме"} background: 'none',
fullRange={ranges.doors || [0, 0]} }}
filterKey={"doors"} className="filter_group my-4"
/> >
</div> <Collapse.Panel
<div> key={"filter_common"}
<FilterSlider header={<Title type={"primary"} text={"Общие"} classNameText="text-black" />}
filterRange={[filters.flat_cnt__gt, filters.flat_cnt__lt]} forceRender
setFilterRange={setFlatCnt} >
title={"Кол-во квартир в подъезде жилого дома"} <div className="mt-4 mb-12">
fullRange={ranges.flat_cnt || [0, 0]} <div>
filterKey={"flat_cnt"} <FilterSlider
/> filterRange={[filters.doors__gt, filters.doors__lt]}
</div> setFilterRange={setFilterWithKey}
<div> title={"Кол-во подъездов в жилом доме"}
<FilterSlider fullRange={ranges.doors || [0, 0]}
filterRange={[filters.rival_post_cnt__gt, filters.rival_post_cnt__lt]} filterKey={"doors"}
setFilterRange={setRivalPostCnt} />
title={"Кол-во постаматов других сетей в окрестности 500м (далее аналогично)"} </div>
fullRange={[-1, 5000]} <div>
/> <FilterSlider
</div> filterRange={[filters.flat_cnt__gt, filters.flat_cnt__lt]}
<div> setFilterRange={setFilterWithKey}
<FilterSlider title={"Кол-во квартир в подъезде жилого дома"}
filterRange={[filters.rival_pvz_cnt__gt, filters.rival_pvz_cnt__lt]} fullRange={ranges.flat_cnt || [0, 0]}
setFilterRange={setRivalPvzCnt} filterKey={"flat_cnt"}
title={"Кол-во ПВЗ"} />
fullRange={[-1, 5000]} </div>
/> </div>
</div>
<div> </Collapse.Panel>
<FilterSlider </Collapse>
filterRange={[filters.target_post_cnt__gt, filters.target_post_cnt__lt]}
setFilterRange={setTargetPostCnt} <Collapse
title={"Кол-во постаматов Мой постамат"} bordered={false}
fullRange={ranges.target_post_cnt || [0, 0]} expandIconPosition={"end"}
filterKey={"target_post_cnt"} style={{
/> background: 'none',
</div> }}
<div> className="filter_group my-4"
<FilterSlider >
filterRange={[filters.flats_cnt__gt, filters.flats_cnt__lt]} <Collapse.Panel
setFilterRange={setFlatsCnt} key={"filter_dist"}
title={"Кол-во квартир в окрестности"} header={<Title type={"primary"} text={"Кол-во объектов в окрестности 500м"} classNameText="text-black" />}
fullRange={ranges.flats_cnt || [0, 0]} forceRender
filterKey={"flats_cnt"} >
/> <div className="mt-4 mb-12">
</div> <div>
<div> <FilterSlider
<FilterSlider filterRange={[filters.rival_post_cnt__gt, filters.rival_post_cnt__lt]}
filterRange={[filters.tc_cnt__gt, filters.tc_cnt__lt]} setFilterRange={setFilterWithKey}
setFilterRange={setTcCnt} title={"Кол-во постаматов других сетей"}
title={"Кол-во торговых центров"} fullRange={[0, 5000]}
fullRange={[-1, 5000]} />
/> </div>
</div> <div>
<div> <FilterSlider
<FilterSlider filterRange={[filters.rival_pvz_cnt__gt, filters.rival_pvz_cnt__lt]}
filterRange={[filters.culture_cnt__gt, filters.culture_cnt__lt]} setFilterRange={setFilterWithKey}
setFilterRange={setCultureCnt} title={"Кол-во ПВЗ"}
title={"Кол-во объектов культуры (театры, музей и тд)"} fullRange={[0, 5000]}
fullRange={[-1, 5000]} />
/> </div>
</div> <div>
<div> <FilterSlider
<FilterSlider filterRange={[filters.target_post_cnt__gt, filters.target_post_cnt__lt]}
filterRange={[filters.mfc_cnt__gt, filters.mfc_cnt__lt]} setFilterRange={setFilterWithKey}
setFilterRange={setMfcCnt} title={"Кол-во постаматов Мой постамат"}
title={"Кол-во МФЦ"} fullRange={ranges.target_post_cnt || [0, 0]}
fullRange={[-1, 5000]} filterKey={"target_post_cnt"}
/> />
</div> </div>
<div> <div>
<FilterSlider <FilterSlider
filterRange={[filters.public_stop_cnt__gt, filters.public_stop_cnt__lt]} filterRange={[filters.flats_cnt__gt, filters.flats_cnt__lt]}
setFilterRange={setPublicStopCnt} setFilterRange={setFilterWithKey}
title={"Кол-во остановок ОТ"} title={"Кол-во квартир в окрестности"}
fullRange={[-1, 5000]} fullRange={ranges.flats_cnt || [0, 0]}
/> filterKey={"flats_cnt"}
</div> />
<div> </div>
<FilterSlider <div>
filterRange={[filters.supermarket_cnt__gt, filters.supermarket_cnt__lt]} <FilterSlider
setFilterRange={setSupermarketCnt} filterRange={[filters.tc_cnt__gt, filters.tc_cnt__lt]}
title={"Кол-во супермаркетов"} setFilterRange={setFilterWithKey}
fullRange={[-1, 5000]} title={"Кол-во торговых центров"}
/> fullRange={ranges.tc_cnt || [0, 0]}
</div> filterKey={"tc_cnt"}
<div> />
<FilterSlider </div>
filterRange={[filters.target_dist__gt, filters.target_dist__lt]} <div>
setFilterRange={setTargetDist} <FilterSlider
title={"Расстояние до постамата Мой постамата"} filterRange={[filters.culture_cnt__gt, filters.culture_cnt__lt]}
fullRange={[-1, 5000]} setFilterRange={setFilterWithKey}
/> title={"Кол-во объектов культуры (театры, музей и тд)"}
</div> fullRange={ranges.tc_cnt || [0, 0]}
<div> filterKey={"tc_cnt"}
<FilterSlider />
filterRange={[filters.metro_dist__gt, filters.metro_dist__lt]} </div>
setFilterRange={setMetroDist} <div>
title={"Расстояние до метро"} <FilterSlider
fullRange={[-1, 5000]} filterRange={[filters.mfc_cnt__gt, filters.mfc_cnt__lt]}
/> setFilterRange={setFilterWithKey}
</div> title={"Кол-во МФЦ"}
fullRange={ranges.tc_cnt || [0, 0]}
filterKey={"tc_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.public_stop_cnt__gt, filters.public_stop_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во остановок ОТ"}
fullRange={ranges.public_stop_cnt || [0, 0]}
filterKey={"public_stop_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.supermarket_cnt__gt, filters.supermarket_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во супермаркетов"}
fullRange={ranges.supermarket_cnt || [0, 0]}
filterKey={"supermarket_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.target_dist__gt, filters.target_dist__lt]}
setFilterRange={setFilterWithKey}
title={"Расстояние до постамата Мой постамат"}
fullRange={ranges.target_dist || [0, 0]}
filterKey={"target_dist"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.metro_dist__gt, filters.metro_dist__lt]}
setFilterRange={setFilterWithKey}
title={"Расстояние до метро"}
fullRange={ranges.metro_dist || [0, 0]}
filterKey={"metro_dist"}
/>
</div>
</div>
</Collapse.Panel>
</Collapse>
{filteredPostamatesGroups.map((category) => {
return (
<Collapse
bordered={false}
expandIconPosition={"end"}
style={{
background: 'none',
}}
className="filter_group my-4"
>
<Collapse.Panel
key={`filter_${category.id}`}
header={<Title type={"primary"} text={category.name} classNameText="text-black" />}
forceRender
>
<div className="mt-4 mb-12">
{category.groups.map((group) => {
return (
<div>
<FilterSlider
filterRange={[filters[`d${group.id}__gt`], filters[`d${group.id}__lt`]]}
setFilterRange={setFilterWithKey}
title={group.name}
fullRange={ranges[`d${group.id}`] || [0, 0]}
filterKey={`d${group.id}`}
dynamicKey
/>
</div>
)
})}
</div>
</Collapse.Panel>
</Collapse>
)
})}
</div> </div>
); );
}; };

@ -4,8 +4,8 @@ import {
INITIAL, INITIAL,
} from "../../../../stores/usePendingPointsFilters"; } from "../../../../stores/usePendingPointsFilters";
export const FilterSlider = ({ filterRange, setFilterRange, disabled, fullRange, title, filterKey }) => { export const FilterSlider = ({ filterRange, setFilterRange, disabled, fullRange, title, filterKey, dynamicKey }) => {
const handleAfterChange = (range) => setFilterRange(range); const handleAfterChange = (range) => setFilterRange(range, filterKey);
useEffect(() => { useEffect(() => {
if (!fullRange) return; if (!fullRange) return;
@ -17,8 +17,14 @@ export const FilterSlider = ({ filterRange, setFilterRange, disabled, fullRange,
filterRange[0] === INITIAL[`${filterKey}__gt`] && filterRange[0] === INITIAL[`${filterKey}__gt`] &&
filterRange[1] === INITIAL[`${filterKey}__lt`]; filterRange[1] === INITIAL[`${filterKey}__lt`];
if (shouldSetFullRange) { const shouldSetDynamicKeyRange =
setFilterRange([min, max]); (filterRange[0] === undefined &&
filterRange[1] === undefined) ||
(filterRange[0] === 0 &&
filterRange[1] === 0);
if (shouldSetFullRange || (shouldSetDynamicKeyRange && dynamicKey)) {
setFilterRange([min, max], filterKey);
} }
}, [fullRange]); }, [fullRange]);

@ -31,8 +31,8 @@ export const usePendingTableData = (page, resetPage, pageSize, setPageSize, sort
if (gtValue === gtInitial && ltValue === ltInitial) return; if (gtValue === gtInitial && ltValue === ltInitial) return;
tempParams = { tempParams = {
...tempParams, ...tempParams,
[`${filterKey}__gt`]: filters[`${filterKey}__gt`], [`${filterKey}__gt`]: filters[`${filterKey}__gt`] - 1,
[`${filterKey}__lt`]: filters[`${filterKey}__lt`], [`${filterKey}__lt`]: filters[`${filterKey}__lt`] + 1,
} }
}); });

@ -87,82 +87,10 @@ const store = (set) => ({
state.filters.region = value; state.filters.region = value;
}), }),
setDoors: (value) => setFilterWithKey: (value, key) =>
set((state) => { set((state) => {
state.filters.doors__gt = value[0]; state.filters[`${key}__gt`] = value[0];
state.filters.doors__lt = value[1]; state.filters[`${key}__lt`] = value[1];
}),
setFlatCnt: (value) =>
set((state) => {
state.filters.flat_cnt__gt = value[0];
state.filters.flat_cnt__lt = value[1];
}),
setRivalPostCnt: (value) =>
set((state) => {
state.filters.rival_post_cnt__gt = value[0];
state.filters.rival_post_cnt__lt = value[1];
}),
setRivalPvzCnt: (value) =>
set((state) => {
state.filters.rival_pvz_cnt__gt = value[0];
state.filters.rival_pvz_cnt__lt = value[1];
}),
setTargetPostCnt: (value) =>
set((state) => {
state.filters.target_post_cnt__gt = value[0];
state.filters.target_post_cnt__lt = value[1];
}),
setFlatsCnt: (value) =>
set((state) => {
state.filters.flats_cnt__gt = value[0];
state.filters.flats_cnt__lt = value[1];
}),
setTcCnt: (value) =>
set((state) => {
state.filters.tc_cnt__gt = value[0];
state.filters.tc_cnt__lt = value[1];
}),
setCultureCnt: (value) =>
set((state) => {
state.filters.culture_cnt__gt = value[0];
state.filters.culture_cnt__lt = value[1];
}),
setMfcCnt: (value) =>
set((state) => {
state.filters.mfc_cnt__gt = value[0];
state.filters.mfc_cnt__lt = value[1];
}),
setPublicStopCnt: (value) =>
set((state) => {
state.filters.public_stop_cnt__gt = value[0];
state.filters.public_stop_cnt__lt = value[1];
}),
setSupermarketCnt: (value) =>
set((state) => {
state.filters.supermarket_cnt__gt = value[0];
state.filters.supermarket_cnt__lt = value[1];
}),
setTargetDist: (value) =>
set((state) => {
state.filters.target_dist__gt = value[0];
state.filters.target_dist__lt = value[1];
}),
setMetroDist: (value) =>
set((state) => {
state.filters.metro_dist__gt = value[0];
state.filters.metro_dist__lt = value[1];
}), }),
setRanges: (value) => setRanges: (value) =>

Loading…
Cancel
Save