Fix popup after address search

dev
Platon Yasev 3 years ago
parent acd67f8d3a
commit 266eceba70

@ -69,7 +69,7 @@ export const AddressSearch = ({ autoFocus = false }) => {
}; };
setPopup({ features: [feature], coordinates: geometry.coordinates }); setPopup({ features: [feature], coordinates: geometry.coordinates });
setClickedPointConfig(feature.properties.id, false); setClickedPointConfig(feature.properties.id);
}; };
useEffect(() => { useEffect(() => {

@ -1,6 +1,6 @@
import { Button } from "antd"; import { Button } from "antd";
import { useState } from "react"; import { useState } from "react";
import { MODES } from "../../config"; import { MODES, STATUSES } from "../../config";
import { useMode } from "../../stores/useMode"; import { useMode } from "../../stores/useMode";
import { LAYER_IDS } from "../Layers/constants"; import { LAYER_IDS } from "../Layers/constants";
import { PopupWrapper } from "./PopupWrapper"; import { PopupWrapper } from "./PopupWrapper";
@ -14,23 +14,22 @@ const SingleFeaturePopup = ({ feature }) => {
const isRivals = const isRivals =
feature.layer?.id === LAYER_IDS.pvz || feature.layer?.id === LAYER_IDS.pvz ||
feature.layer?.id === LAYER_IDS.other; feature.layer?.id === LAYER_IDS.other;
const isInitialLayer = const isPendingPoint = feature.properties.status === STATUSES.pending;
feature.layer?.id === LAYER_IDS["initial-match"] || const isWorkingPoint = feature.properties.status === STATUSES.working;
feature.layer?.id === LAYER_IDS["initial-unmatch"];
if (isRivals) { if (isRivals) {
return <FeatureProperties feature={feature} />; return <FeatureProperties feature={feature} />;
} }
if (mode === MODES.ON_APPROVAL) { if (mode === MODES.ON_APPROVAL && !isPendingPoint) {
return <OnApprovalPointPopup feature={feature} />; return <OnApprovalPointPopup feature={feature} />;
} }
if (mode === MODES.WORKING) { if (mode === MODES.WORKING && isWorkingPoint) {
return <WorkingPointPopup feature={feature} />; return <WorkingPointPopup feature={feature} />;
} }
if (mode === MODES.PENDING && isInitialLayer) if (mode === MODES.PENDING && isPendingPoint)
return <PendingPointPopup feature={feature} />; return <PendingPointPopup feature={feature} />;
return <FeatureProperties feature={feature} />; return <FeatureProperties feature={feature} />;

@ -25,7 +25,7 @@ export const OnApprovalPointPopup = ({ feature }) => {
const [error, setError] = useState(""); const [error, setError] = useState("");
useEffect(() => setClickedPointConfig(featureId, false), [feature]); useEffect(() => setClickedPointConfig(featureId), [featureId]);
const queryClient = useQueryClient(); const queryClient = useQueryClient();

@ -1,19 +1,54 @@
import { usePointSelection } from "../../../stores/usePointSelection"; import { usePointSelection } from "../../../stores/usePointSelection";
import { useClickedPointConfig } from "../../../stores/useClickedPointConfig"; import { useClickedPointConfig } from "../../../stores/useClickedPointConfig";
import { LAYER_IDS } from "../../Layers/constants";
import { useEffect } from "react"; import { useEffect } from "react";
import { FeatureProperties } from "./FeatureProperties"; import { FeatureProperties } from "./FeatureProperties";
import { Button } from "antd"; import { Button } from "antd";
import { useCanEdit } from "../../../api"; import { useCanEdit } from "../../../api";
import { usePendingPointsFilters } from "../../../stores/usePendingPointsFilters";
export const PendingPointPopup = ({ feature }) => { export const PendingPointPopup = ({ feature }) => {
const { include, selection, exclude } = usePointSelection(); const { include, selection, exclude } = usePointSelection();
const { setClickedPointConfig } = useClickedPointConfig(); const { setClickedPointConfig } = useClickedPointConfig();
const doesMatchFilter = feature.layer.id === LAYER_IDS["initial-match"]; const { filters } = usePendingPointsFilters();
const doesMatchFilter = () => {
const { prediction, categories, region } = filters;
const {
prediction_current,
category,
area,
district,
area_id,
district_id,
} = feature.properties;
const doesMatchPredictionFilter =
prediction_current >= prediction[0] &&
prediction_current <= prediction[1];
const doesMatchCategoriesFilter =
categories.length > 0 ? categories.includes(category) : true;
const doesMatchRegionFilter = () => {
if (!region) return true;
if (region.type === "ao") {
return (district ?? district_id) === region.id;
} else {
return (area ?? area_id) === region.id;
}
};
return (
doesMatchPredictionFilter &&
doesMatchCategoriesFilter &&
doesMatchRegionFilter()
);
};
const featureId = feature.properties.id; const featureId = feature.properties.id;
const isSelected = const isSelected =
(doesMatchFilter && !selection.excluded.has(featureId)) || (doesMatchFilter() && !selection.excluded.has(featureId)) ||
selection.included.has(featureId); selection.included.has(featureId);
useEffect( useEffect(

@ -6,7 +6,7 @@ export const WorkingPointPopup = ({ feature }) => {
const featureId = feature.properties.id; const featureId = feature.properties.id;
const { setClickedPointConfig } = useClickedPointConfig(); const { setClickedPointConfig } = useClickedPointConfig();
useEffect(() => setClickedPointConfig(featureId, false), [feature]); useEffect(() => setClickedPointConfig(featureId), [feature]);
return <FeatureProperties feature={feature} />; return <FeatureProperties feature={feature} />;
}; };

@ -7,15 +7,25 @@ import { HeaderWrapper } from "../HeaderWrapper";
import { useExportPendingData } from "./useExportPendingData"; import { useExportPendingData } from "./useExportPendingData";
import { useCanEdit } from "../../../api"; import { useCanEdit } from "../../../api";
import { useColumns } from "../useColumns.jsx"; import { useColumns } from "../useColumns.jsx";
import { PAGE_SIZE } from "../constants.js";
import { usePopup } from "../../../stores/usePopup.js";
export const PendingTable = ({ fullWidth }) => { export const PendingTable = ({ fullWidth }) => {
const { selection, include, exclude } = usePointSelection(); const { selection, include, exclude } = usePointSelection();
const { clickedPointConfig } = useClickedPointConfig(); const { clickedPointConfig, setClickedPointConfig } = useClickedPointConfig();
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(PAGE_SIZE);
const columns = useColumns(); const columns = useColumns();
const { setPopup } = usePopup();
const { data, pageSize, isClickedPointLoading, isDataLoading } = const { data, isClickedPointLoading, isDataLoading } = usePendingTableData(
usePendingTableData(page, () => setPage(1)); page,
() => setPage(1),
pageSize,
setPageSize
);
const resetPageSize = () => setPageSize(PAGE_SIZE);
const getSelectedRowKeys = useCallback(() => { const getSelectedRowKeys = useCallback(() => {
const ids = data?.results.map((item) => item.id) ?? []; const ids = data?.results.map((item) => item.id) ?? [];
@ -50,7 +60,12 @@ export const PendingTable = ({ fullWidth }) => {
hideSelectAll: true, hideSelectAll: true,
}; };
const handlePageChange = useCallback((page) => setPage(page), []); const handlePageChange = useCallback((page) => {
resetPageSize();
setClickedPointConfig(null);
setPopup(null);
setPage(page);
}, []);
const canEdit = useCanEdit(); const canEdit = useCanEdit();

@ -1,24 +1,15 @@
import { useState } from "react";
import { PAGE_SIZE } from "../constants";
import { usePointSelection } from "../../../stores/usePointSelection";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { getPoints } from "../../../api"; import { getPoints } from "../../../api";
import { useMergeTableData } from "../useMergeTableData"; import { useMergeTableData } from "../useMergeTableData";
import { STATUSES } from "../../../config"; import { STATUSES } from "../../../config";
import { usePendingPointsFilters } from "../../../stores/usePendingPointsFilters"; import { usePendingPointsFilters } from "../../../stores/usePendingPointsFilters";
export const usePendingTableData = (page, resetPage) => { export const usePendingTableData = (page, resetPage, pageSize, setPageSize) => {
const [pageSize, setPageSize] = useState(PAGE_SIZE);
const { filters } = usePendingPointsFilters(); const { filters } = usePendingPointsFilters();
const { prediction, categories, region } = filters; const { prediction, categories, region } = filters;
const {
selection: { included },
} = usePointSelection();
const includedIds = [...included];
const { data, isInitialLoading } = useQuery( const { data, isInitialLoading } = useQuery(
["table", page, filters, includedIds], ["table", page, filters],
async () => { async () => {
const params = new URLSearchParams({ const params = new URLSearchParams({
page, page,
@ -26,7 +17,6 @@ export const usePendingTableData = (page, resetPage) => {
"prediction_current[]": prediction, "prediction_current[]": prediction,
"status[]": [STATUSES.pending], "status[]": [STATUSES.pending],
"categories[]": categories, "categories[]": categories,
"included[]": includedIds,
}); });
return await getPoints(params, region); return await getPoints(params, region);

@ -89,6 +89,11 @@ export const Table = React.memo(
features: [feature], features: [feature],
coordinates: geometry.coordinates, coordinates: geometry.coordinates,
}); });
setClickedPointConfig(
record.id,
rowSelection?.selectedRowKeys.includes(record.id)
);
}, },
}; };
}} }}

@ -4,7 +4,7 @@ import { immer } from "zustand/middleware/immer";
const store = (set) => ({ const store = (set) => ({
clickedPointConfig: null, clickedPointConfig: null,
setClickedPointConfig: (id, shouldSelect = true) => { setClickedPointConfig: (id, shouldSelect = false) => {
set((state) => { set((state) => {
if (id === null) { if (id === null) {
state.clickedPointConfig = null; state.clickedPointConfig = null;

Loading…
Cancel
Save