filters and table columns

dev
RekHoto 3 years ago
parent b879f87445
commit c6ca36e1c2

@ -14,7 +14,36 @@ const statusExpression = ["==", ["get", "status"], STATUSES.pending];
const useFilterExpression = () => { const useFilterExpression = () => {
const { filters } = usePendingPointsFilters(); const { filters } = usePendingPointsFilters();
const { prediction, categories, region } = filters; 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 { selection } = usePointSelection(); const { selection } = usePointSelection();
const includedArr = [...selection.included]; const includedArr = [...selection.included];
const excludedArr = [...selection.excluded]; const excludedArr = [...selection.excluded];
@ -28,6 +57,78 @@ const useFilterExpression = () => {
["<=", ["get", "prediction_current"], prediction[1]], ["<=", ["get", "prediction_current"], prediction[1]],
]; ];
const doorsExpression = [
[">=", ["get", "doors"], doors__gt],
["<=", ["get", "doors"], doors__lt],
];
const flatExpression = [
[">=", ["get", "flat_cnt"], flat_cnt__gt],
["<=", ["get", "flat_cnt"], flat_cnt__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 filterExpressions = [
...doorsExpression,
...flatExpression,
...rivalPostExpression,
...rivalPvzExpression,
...targetPostExpression,
// ...flatsExpression,
...tcExpression,
...cultureExpression,
...mfcExpression,
...publicStopExpression,
...supermarketExpression,
...targetDistExpression,
// ...metroDistExpression
]
const categoryExpression = const categoryExpression =
categories.length > 0 categories.length > 0
? ["in", ["get", "category"], ["literal", categories]] ? ["in", ["get", "category"], ["literal", categories]]
@ -40,8 +141,8 @@ const useFilterExpression = () => {
[ [
"any", "any",
regionExpression regionExpression
? ["all", ...predictionExpression, categoryExpression, regionExpression] ? ["all", ...predictionExpression, ...filterExpressions, categoryExpression, regionExpression]
: ["all", ...predictionExpression, categoryExpression], : ["all", ...predictionExpression, ...filterExpressions, categoryExpression],
includedExpression, includedExpression,
], ],
]; ];

@ -0,0 +1,131 @@
import { usePendingPointsFilters } from "../../../../stores/usePendingPointsFilters";
import {FilterSlider} from "./Slider.jsx";
export const AdvancedFilters = () => {
const {
filters,
setDoors,
setFlatCnt,
setRivalPostCnt,
setRivalPvzCnt,
setTargetPostCnt,
setFlatsCnt,
setTcCnt,
setCultureCnt,
setMfcCnt,
setPublicStopCnt,
setSupermarketCnt,
setTargetDist,
setMetroDist
} = usePendingPointsFilters();
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={[-1, 50]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.flat_cnt__gt, filters.flat_cnt__lt]}
setFilterRange={setFlatCnt}
title={"Кол-во квартир в подъезде жилого дома"}
fullRange={[-1, 5000]}
/>
</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={[-1, 5000]}
/>
</div>
{/*<div>*/}
{/* <FilterSlider*/}
{/* filterRange={[filters.flats_cnt__gt, filters.flats_cnt__lt]}*/}
{/* setFilterRange={setFlatsCnt}*/}
{/* title={"Кол-во квартир в окрестности"}*/}
{/* fullRange={[-1, 500]}*/}
{/* />*/}
{/*</div>*/}
<div>
<FilterSlider
filterRange={[filters.tc_cnt__gt, filters.tc_cnt__lt]}
setFilterRange={setTcCnt}
title={"Кол-во торговых центров"}
fullRange={[-1, 500]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.culture_cnt__gt, filters.culture_cnt__lt]}
setFilterRange={setCultureCnt}
title={"Кол-во объектов культуры (театры, музей и тд)"}
fullRange={[-1, 500]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.mfc_cnt__gt, filters.mfc_cnt__lt]}
setFilterRange={setMfcCnt}
title={"Кол-во МФЦ"}
fullRange={[-1, 500]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.public_stop_cnt__gt, filters.public_stop_cnt__lt]}
setFilterRange={setPublicStopCnt}
title={"Кол-во остановок ОТ"}
fullRange={[-1, 500]}
/>
</div>
<div>
<FilterSlider
filterRange={[filters.supermarket_cnt__gt, filters.supermarket_cnt__lt]}
setFilterRange={setSupermarketCnt}
title={"Кол-во супермаркетов"}
fullRange={[-1, 500]}
/>
</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, 50000]}*/}
{/* />*/}
{/*</div>*/}
</div>
);
};

@ -0,0 +1,25 @@
import {Button, Dropdown} from "antd";
import {AdvancedFilters} from "./AdvancedFilters.jsx";
export const AdvancedFiltersWrapper = () => {
const filtersRender = () => {
return (
<AdvancedFilters />
)
};
return (
<Dropdown
trigger="click"
dropdownRender={() => filtersRender()}
placement='right'
>
<Button
onClick={(e) => e.stopPropagation()}
className="w-full"
>
Расширенные фильтры
</Button>
</Dropdown>
);
};

@ -0,0 +1,36 @@
import { SliderComponent as Slider } from "../../../../components/SliderComponent";
import { useEffect } from "react";
import {
INITIAL,
} from "../../../../stores/usePendingPointsFilters";
export const FilterSlider = ({ filterRange, setFilterRange, disabled, fullRange, title }) => {
const handleAfterChange = (range) => setFilterRange(range);
useEffect(() => {
if (!fullRange) return;
const min = fullRange[0];
const max = fullRange[1];
const shouldSetFullRange =
filterRange[0] === INITIAL.prediction[0] &&
filterRange[1] === INITIAL.prediction[1];
if (shouldSetFullRange) {
setFilterRange([min, max]);
}
}, [fullRange]);
return (
<Slider
title={title}
value={filterRange}
onAfterChange={handleAfterChange}
min={fullRange[0]}
max={fullRange[1]}
range
disabled={disabled}
/>
);
};

@ -15,6 +15,7 @@ import { ClearFiltersButton } from "../../../components/ClearFiltersButton";
import { getDynamicActiveFilters } from "../utils"; import { getDynamicActiveFilters } from "../utils";
import { api, useCanEdit } from "../../../api"; import { api, useCanEdit } from "../../../api";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { AdvancedFiltersWrapper } from "./AdvancedFilters/AdvancedFiltersWrapper.jsx";
const useGetPendingPointsRange = () => { const useGetPendingPointsRange = () => {
return useQuery( return useQuery(
@ -103,6 +104,7 @@ export const PendingPointsFilters = () => {
fullRange={fullRange} fullRange={fullRange}
isLoading={isInitialLoading} isLoading={isInitialLoading}
/> />
<AdvancedFiltersWrapper />
</div> </div>
{hasActiveFilters && ( {hasActiveFilters && (

@ -6,9 +6,39 @@ import { usePendingPointsFilters } from "../../../stores/usePendingPointsFilters
export const usePendingTableData = (page, resetPage, pageSize, setPageSize, sort) => { export const usePendingTableData = (page, resetPage, pageSize, setPageSize, sort) => {
const { filters } = usePendingPointsFilters(); const { filters } = usePendingPointsFilters();
const { prediction, categories, region } = filters; 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 { data, isInitialLoading, isFetching } = useQuery( const {data, isInitialLoading, isFetching} = useQuery(
["table", page, filters, sort], ["table", page, filters, sort],
async () => { async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
@ -17,6 +47,32 @@ export const usePendingTableData = (page, resetPage, pageSize, setPageSize, sort
"prediction_current[]": prediction, "prediction_current[]": prediction,
"status[]": [STATUSES.pending], "status[]": [STATUSES.pending],
"categories[]": categories, "categories[]": categories,
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,
ordering: sort, ordering: sort,
}); });
@ -32,7 +88,7 @@ export const usePendingTableData = (page, resetPage, pageSize, setPageSize, sort
} }
); );
const { data: mergedData, isClickedPointLoading } = useMergeTableData( const {data: mergedData, isClickedPointLoading} = useMergeTableData(
data, data,
setPageSize setPageSize
); );

@ -8,7 +8,7 @@ import { SearchOutlined } from "@ant-design/icons";
import { useTable } from "../../stores/useTable.js"; import { useTable } from "../../stores/useTable.js";
import useLocalStorage from "../../hooks/useLocalStorage.js"; import useLocalStorage from "../../hooks/useLocalStorage.js";
const DEFAULT_LENGTH = 7; const DEFAULT_LENGTH = 39;
export const useColumns = (fields = [], key) => { export const useColumns = (fields = [], key) => {
const { data: regions } = useGetRegions(); const { data: regions } = useGetRegions();
const { const {
@ -113,6 +113,294 @@ export const useColumns = (fields = [], key) => {
sorter: true, sorter: true,
showSorterTooltip: false, showSorterTooltip: false,
}, },
{
title: "Кол-во подъездов в жилом доме",
dataIndex: "doors",
key: "doors",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Класс энероэффективности жилого дома",
dataIndex: "enrg_cls",
key: "enrg_cls",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во квартир в подъезде жилого дома",
dataIndex: "flat_cnt",
key: "flat_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Год постройки жилого дома",
dataIndex: "year_bld",
key: "year_bld",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во этажей жилого дома",
dataIndex: "levels",
key: "levels",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Материал стен жилого дома",
dataIndex: "mat_nes",
key: "mat_nes",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во постаматов других сетей в окрестности 500м (далее аналогично)",
dataIndex: "rival_post_cnt",
key: "rival_post_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во ПВЗ",
dataIndex: "rival_pvz_cnt",
key: "rival_pvz_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во постаматов Мой постамат",
dataIndex: "target_post_cnt",
key: "target_post_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во квартир в окрестности",
dataIndex: "flats_cnt",
key: "flats_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во достопримечательностей",
dataIndex: "attraction_cnt",
key: "attraction_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во банков",
dataIndex: "bank_cnt",
key: "bank_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во торговых центров",
dataIndex: "tc_cnt",
key: "tc_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во бизнес-центров",
dataIndex: "bc_cnt",
key: "bc_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во клиник",
dataIndex: "clinic_cnt",
key: "clinic_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во объектов культуры (театры, музей и тд)",
dataIndex: "culture_cnt",
key: "culture_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во спортивных центров",
dataIndex: "sport_center_cnt",
key: "sport_center_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во лабораторий",
dataIndex: "lab_cnt",
key: "lab_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во школ",
dataIndex: "school_cnt",
key: "school_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во детских садов",
dataIndex: "kindergar_cnt",
key: "kindergar_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во МФЦ",
dataIndex: "mfc_cnt",
key: "mfc_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во аптек",
dataIndex: "pharmacy_cnt",
key: "pharmacy_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во остановок ОТ",
dataIndex: "public_stop_cnt",
key: "public_stop_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во объектов из HORECA",
dataIndex: "reca_cnt",
key: "reca_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во супермаркетов",
dataIndex: "supermarket_cnt",
key: "supermarket_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Кол-во премиальных супермаркетов",
dataIndex: "supermarket_premium_cnt",
key: "supermarket_premium_cnt",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Расстояние до постамата Мой постамата",
dataIndex: "target_dist",
key: "target_dist",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Расстояние до метро",
dataIndex: "metro_dist",
key: "metro_dist",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Стоимость жилой недвижимости ",
dataIndex: "property_price_bargains",
key: "property_price_bargains",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Бизнес-активность",
dataIndex: "business_activity",
key: "business_activity",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Эра постройки жилой недвижимости",
dataIndex: "property_era",
key: "property_era",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
{
title: "Средняя этажность застройки",
dataIndex: "property_mean_floor",
key: "property_mean_floor",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
},
...fields, ...fields,
]; ];
}, [regions?.normalized, fields, fullScreen]); }, [regions?.normalized, fields, fullScreen]);

@ -6,6 +6,32 @@ export const INITIAL = {
prediction: [0, 0], prediction: [0, 0],
categories: [], categories: [],
region: null, region: null,
doors__gt: -1,
doors__lt: 500,
flat_cnt__gt: -1,
flat_cnt__lt: 5000,
rival_post_cnt__gt: -1,
rival_post_cnt__lt: 5000,
rival_pvz_cnt__gt: -1,
rival_pvz_cnt__lt: 5000,
target_post_cnt__gt: -1,
target_post_cnt__lt: 5000,
flats_cnt__gt: -1,
flats_cnt__lt: 5000,
tc_cnt__gt: -1,
tc_cnt__lt: 500,
culture_cnt__gt: -1,
culture_cnt__lt: 500,
mfc_cnt__gt: -1,
mfc_cnt__lt: 500,
public_stop_cnt__gt: -1,
public_stop_cnt__lt: 50,
supermarket_cnt__gt: -1,
supermarket_cnt__lt: 50,
target_dist__gt: -1,
target_dist__lt: 5000,
metro_dist__gt: -1,
metro_dist__lt: 50000,
}; };
const store = (set) => ({ const store = (set) => ({
@ -26,6 +52,84 @@ const store = (set) => ({
state.filters.region = value; state.filters.region = value;
}), }),
setDoors: (value) =>
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];
}),
clear: (fullRange) => clear: (fullRange) =>
set((state) => { set((state) => {
if (!fullRange) { if (!fullRange) {

Loading…
Cancel
Save