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);
}
const version = '0.0.3';
const version = '0.0.4';
function App() {

@ -1,11 +1,30 @@
import { useLastMLRun } from "../api.js";
import {Button, Popover, Tooltip} from "antd";
import {InfoCircleOutlined} from "@ant-design/icons";
export function LastMLRun() {
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 (
<div className="absolute bottom-[20px] left-[254px] text-xs text-grey z-10 bg-white-background rounded-xl p-2 space-y-3">
Последний запуск: {time}
</div>
<Popover
content={lastMLRunRender}
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}
id={LAYER_IDS.cancelled}
source={"points"}
source-layer={"public.service_placementpoint"}
source-layer={"public.points_with_dist"}
layout={{
visibility: isVisible[LAYER_IDS.cancelled] ? "visible" : "none",
}}

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

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

@ -8,42 +8,37 @@ import { usePointSelection } from "../../stores/usePointSelection";
import { STATUSES } from "../../config";
import { useRegionFilterExpression } from "./useRegionFilterExpression";
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 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 {
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 { prediction, categories, region } = filters;
const { selection } = usePointSelection();
const includedArr = [...selection.included];
const excludedArr = [...selection.excluded];
@ -52,83 +47,39 @@ const useFilterExpression = () => {
const includedExpression = ["in", ["get", "id"], ["literal", includedArr]];
const excludedExpression = ["in", ["get", "id"], ["literal", excludedArr]];
const predictionExpression = [
[">=", ["get", "prediction_current"], prediction[0]],
["<=", ["get", "prediction_current"], prediction[1]],
];
const doorsExpression = [
[">=", ["get", "doors"], doors__gt],
["<=", ["get", "doors"], doors__lt],
];
const dynamicKeyFiltersExpressions = postamatesGroups.map((group) => {
const key = `d${group.id}`
return [
[">=", ["get", key], filters[`${key}__gt`]],
["<=", ["get", key], filters[`${key}__lt`]],
];
});
const flatExpression = [
[">=", ["get", "flat_cnt"], flat_cnt__gt],
["<=", ["get", "flat_cnt"], flat_cnt__lt],
];
const staticKeyFiltersExpressions = RANGE_FILTERS_KEYS.map((key) => {
return [
[">=", ["get", key], filters[`${key}__gt`]],
["<=", ["get", key], filters[`${key}__lt`]],
];
});
const rivalPostExpression = [
[">=", ["get", "rival_post_cnt"], rival_post_cnt__gt],
["<=", ["get", "rival_post_cnt"], rival_post_cnt__lt],
];
const rivalPvzExpression = [
[">=", ["get", "rival_pvz_cnt"], rival_pvz_cnt__gt],
["<=", ["get", "rival_pvz_cnt"], rival_pvz_cnt__lt],
];
const targetPostExpression = [
[">=", ["get", "target_post_cnt"], target_post_cnt__gt],
["<=", ["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 dynamicKeyExpressions = dynamicKeyFiltersExpressions.filter((expression) => {
const filterKey = expression[0][1][1];
const range = ranges[filterKey];
const gtValue = expression[0][2] || 0;
const gtInitial = range ? range[0] : 0;
const ltValue = expression[1][2] || 0;
const ltInitial = range ? range[1] : 0;
return !(gtValue === gtInitial && ltValue === ltInitial);
}).flat();
const filterExpressions = [
doorsExpression,
flatExpression,
rivalPostExpression,
rivalPvzExpression,
targetPostExpression,
// flatsExpression,
tcExpression,
cultureExpression,
mfcExpression,
publicStopExpression,
supermarketExpression,
targetDistExpression,
// metroDistExpression
]
const activeExpressions = filterExpressions.filter((expression) => {
const staticKeyExpressions = staticKeyFiltersExpressions.filter((expression) => {
const filterKey = expression[0][1][1];
const gtValue = expression[0][2];
const gtInitial = ranges[filterKey][0];
@ -150,8 +101,8 @@ const useFilterExpression = () => {
[
"any",
regionExpression
? ["all", ...predictionExpression, ...activeExpressions, categoryExpression, regionExpression]
: ["all", ...predictionExpression, ...activeExpressions, categoryExpression],
? ["all", ...predictionExpression, ...staticKeyExpressions, ...dynamicKeyExpressions, categoryExpression, regionExpression]
: ["all", ...predictionExpression, ...staticKeyExpressions, ...dynamicKeyExpressions, categoryExpression],
includedExpression,
],
];
@ -191,7 +142,7 @@ export const PendingPoints = () => {
{...matchInitialPointLayer}
id={LAYER_IDS["initial-unmatch"]}
source={"points"}
source-layer={"public.service_placementpoint"}
source-layer={"public.points_with_dist"}
layout={{
...matchInitialPointLayer.layout,
visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none",
@ -203,7 +154,7 @@ export const PendingPoints = () => {
{...matchInitialPointLayer}
id={LAYER_IDS["initial-match"]}
source={"points"}
source-layer={"public.service_placementpoint"}
source-layer={"public.points_with_dist"}
layout={{
...matchInitialPointLayer.layout,
visibility: isVisible[LAYER_IDS.initial] ? "visible" : "none",

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

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

@ -187,12 +187,19 @@ export const useGetPendingPointsRange = () => {
},
{
select: (data) => {
const distToGroupsArr = data.dist_to_groups.map((groupRange) => {
return {
[`d${groupRange.group_id}`]: groupRange.dist,
}
})
const distToGroups = Object.assign({}, ...distToGroupsArr);
return {
prediction: data.prediction_current,
doors: data.doors,
flat_cnt: data.flat_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;
export const Title = ({ text, className, classNameText }) => {
export const Title = ({ text, className, classNameText, type = "secondary" }) => {
return (
<div className={twMerge("mb-1", className)}>
<Text
type="secondary"
type={type}
className={twMerge("uppercase text-xs", classNameText)}
>
{text}

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

@ -1,136 +1,221 @@
import { usePendingPointsFilters } from "../../../../stores/usePendingPointsFilters";
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 = () => {
const {
filters,
setDoors,
setFlatCnt,
setRivalPostCnt,
setRivalPvzCnt,
setTargetPostCnt,
setFlatsCnt,
setTcCnt,
setCultureCnt,
setMfcCnt,
setPublicStopCnt,
setSupermarketCnt,
setTargetDist,
setMetroDist,
setFilterWithKey,
ranges
} = 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 (
<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>
<FilterSlider
filterRange={[filters.doors__gt, filters.doors__lt]}
setFilterRange={setDoors}
title={"Кол-во подъездов в жилом доме"}
fullRange={ranges.doors || [0, 0]}
filterKey={"doors"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.flat_cnt__gt, filters.flat_cnt__lt]}
setFilterRange={setFlatCnt}
title={"Кол-во квартир в подъезде жилого дома"}
fullRange={ranges.flat_cnt || [0, 0]}
filterKey={"flat_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.rival_post_cnt__gt, filters.rival_post_cnt__lt]}
setFilterRange={setRivalPostCnt}
title={"Кол-во постаматов других сетей в окрестности 500м (далее аналогично)"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.rival_pvz_cnt__gt, filters.rival_pvz_cnt__lt]}
setFilterRange={setRivalPvzCnt}
title={"Кол-во ПВЗ"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.target_post_cnt__gt, filters.target_post_cnt__lt]}
setFilterRange={setTargetPostCnt}
title={"Кол-во постаматов Мой постамат"}
fullRange={ranges.target_post_cnt || [0, 0]}
filterKey={"target_post_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.flats_cnt__gt, filters.flats_cnt__lt]}
setFilterRange={setFlatsCnt}
title={"Кол-во квартир в окрестности"}
fullRange={ranges.flats_cnt || [0, 0]}
filterKey={"flats_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.tc_cnt__gt, filters.tc_cnt__lt]}
setFilterRange={setTcCnt}
title={"Кол-во торговых центров"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.culture_cnt__gt, filters.culture_cnt__lt]}
setFilterRange={setCultureCnt}
title={"Кол-во объектов культуры (театры, музей и тд)"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.mfc_cnt__gt, filters.mfc_cnt__lt]}
setFilterRange={setMfcCnt}
title={"Кол-во МФЦ"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.public_stop_cnt__gt, filters.public_stop_cnt__lt]}
setFilterRange={setPublicStopCnt}
title={"Кол-во остановок ОТ"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.supermarket_cnt__gt, filters.supermarket_cnt__lt]}
setFilterRange={setSupermarketCnt}
title={"Кол-во супермаркетов"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.target_dist__gt, filters.target_dist__lt]}
setFilterRange={setTargetDist}
title={"Расстояние до постамата Мой постамата"}
fullRange={[-1, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.metro_dist__gt, filters.metro_dist__lt]}
setFilterRange={setMetroDist}
title={"Расстояние до метро"}
fullRange={[-1, 5000]}
/>
</div>
<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'}}>
<Collapse
bordered={false}
expandIconPosition={"end"}
style={{
background: 'none',
}}
className="filter_group my-4"
>
<Collapse.Panel
key={"filter_common"}
header={<Title type={"primary"} text={"Общие"} classNameText="text-black" />}
forceRender
>
<div className="mt-4 mb-12">
<div>
<FilterSlider
filterRange={[filters.doors__gt, filters.doors__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во подъездов в жилом доме"}
fullRange={ranges.doors || [0, 0]}
filterKey={"doors"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.flat_cnt__gt, filters.flat_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во квартир в подъезде жилого дома"}
fullRange={ranges.flat_cnt || [0, 0]}
filterKey={"flat_cnt"}
/>
</div>
</div>
</Collapse.Panel>
</Collapse>
<Collapse
bordered={false}
expandIconPosition={"end"}
style={{
background: 'none',
}}
className="filter_group my-4"
>
<Collapse.Panel
key={"filter_dist"}
header={<Title type={"primary"} text={"Кол-во объектов в окрестности 500м"} classNameText="text-black" />}
forceRender
>
<div className="mt-4 mb-12">
<div>
<FilterSlider
filterRange={[filters.rival_post_cnt__gt, filters.rival_post_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во постаматов других сетей"}
fullRange={[0, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.rival_pvz_cnt__gt, filters.rival_pvz_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во ПВЗ"}
fullRange={[0, 5000]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.target_post_cnt__gt, filters.target_post_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во постаматов Мой постамат"}
fullRange={ranges.target_post_cnt || [0, 0]}
filterKey={"target_post_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.flats_cnt__gt, filters.flats_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во квартир в окрестности"}
fullRange={ranges.flats_cnt || [0, 0]}
filterKey={"flats_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.tc_cnt__gt, filters.tc_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во торговых центров"}
fullRange={ranges.tc_cnt || [0, 0]}
filterKey={"tc_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.culture_cnt__gt, filters.culture_cnt__lt]}
setFilterRange={setFilterWithKey}
title={"Кол-во объектов культуры (театры, музей и тд)"}
fullRange={ranges.tc_cnt || [0, 0]}
filterKey={"tc_cnt"}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.mfc_cnt__gt, filters.mfc_cnt__lt]}
setFilterRange={setFilterWithKey}
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>
);
};

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

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

@ -87,82 +87,10 @@ const store = (set) => ({
state.filters.region = value;
}),
setDoors: (value) =>
setFilterWithKey: (value, key) =>
set((state) => {
state.filters.doors__gt = value[0];
state.filters.doors__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];
state.filters[`${key}__gt`] = value[0];
state.filters[`${key}__lt`] = value[1];
}),
setRanges: (value) =>

Loading…
Cancel
Save