stage two update

dev
RekHoto 3 years ago
parent 8954747822
commit 21ede7a00e

@ -6,9 +6,14 @@ import { OnApprovalPoints } from "./OnApprovalPoints";
import { WorkingPoints } from "./WorkingPoints"; import { WorkingPoints } from "./WorkingPoints";
import { FilteredWorkingPoints } from "./FilteredWorkingPoints"; import { FilteredWorkingPoints } from "./FilteredWorkingPoints";
import { CancelledPoints } from "./CancelledPoints"; import { CancelledPoints } from "./CancelledPoints";
import {useEffect} from "react";
export const Points = () => { export const Points = () => {
const { updateCounter } = useUpdateLayerCounter(); const { updateCounter, toggleUpdateCounter } = useUpdateLayerCounter();
const layer = getSourceLayerName();
useEffect(() => {
toggleUpdateCounter();
}, [layer]);
return ( return (
<> <>
@ -17,7 +22,7 @@ export const Points = () => {
type="vector" type="vector"
key={`points-${updateCounter}`} key={`points-${updateCounter}`}
tiles={[ tiles={[
`${BASE_URL}/martin/${getSourceLayerName()}/{z}/{x}/{y}.pbf`, `${BASE_URL}/martin/${layer}/{z}/{x}/{y}.pbf`,
]} ]}
> >
<PendingPoints /> <PendingPoints />

@ -22,13 +22,12 @@ import { LAYER_IDS } from "./Layers/constants";
import { Header } from "./Header"; import { Header } from "./Header";
import { icons } from "../icons/icons-config"; import { icons } from "../icons/icons-config";
import { LastMLRun } from "./LastMLRun"; import { LastMLRun } from "./LastMLRun";
import { useGetPendingPointsRange, useOtherGroups, usePostamatesAndPvzGroups } from "../api.js"; import { useOtherGroups, usePostamatesAndPvzGroups } from "../api.js";
import { getFilteredGroups, transliterate } from "../utils.js"; import { getFilteredGroups, transliterate } from "../utils.js";
import { import {
CATEGORIES_MAP, CATEGORIES_MAP,
RANGE_FILTERS_KEYS, RANGE_FILTERS_KEYS,
RANGE_FILTERS_MAP, RANGE_FILTERS_MAP
usePendingPointsFilters
} from "../stores/usePendingPointsFilters.js"; } from "../stores/usePendingPointsFilters.js";
export const MapComponent = () => { export const MapComponent = () => {
@ -41,13 +40,6 @@ export const MapComponent = () => {
const { mode } = useMode(); const { mode } = useMode();
const { tableState, openTable } = useTable(); const { tableState, openTable } = useTable();
const { ranges, setRanges } = usePendingPointsFilters();
const { data: fullRange } = useGetPendingPointsRange();
useEffect(() => {
if (fullRange) setRanges({...ranges, ...fullRange});
}, [fullRange]);
const { data: postamatesAndPvzGroups } = usePostamatesAndPvzGroups(); const { data: postamatesAndPvzGroups } = usePostamatesAndPvzGroups();
const { data: otherGroups } = useOtherGroups(); const { data: otherGroups } = useOtherGroups();

@ -53,7 +53,6 @@ const MultipleFeaturesPopup = ({ features, points }) => {
const point = points.find(p => p.id = featureId); const point = points.find(p => p.id = featureId);
const isSelected = (doesMatchFilter(filters, ranges, feature) && !selection.excluded.has(featureId)) || const isSelected = (doesMatchFilter(filters, ranges, feature) && !selection.excluded.has(featureId)) ||
selection.included.has(featureId); selection.included.has(featureId);
console.log(isSelected, doesMatchFilter(filters, ranges, feature));
const handleSelect = () => { const handleSelect = () => {
if (isSelected) { if (isSelected) {
exclude(featureId); exclude(featureId);

@ -243,20 +243,17 @@ export const useLastMLRun = () => {
); );
} }
export const useGetPendingPointsRange = () => { export const useGetPendingPointsRange = (link) => {
const link = getApiName();
return useQuery( return useQuery(
["prediction-max-min", link], ["prediction-max-min", link],
async () => { async () => {
const { data } = await api.get( const { data, isInitialLoading, isFetching } = await api.get(
`/api/${link}/filters?status[]=${STATUSES.pending}` `/api/${link}/filters?status[]=${STATUSES.pending}`
); );
return {data, isLoading: isInitialLoading || isFetching};
return data;
}, },
{ {
select: (data) => { select: ({data, isLoading}) => {
const distToGroupsArr = data.dist_to_groups.map((groupRange) => { const distToGroupsArr = data.dist_to_groups.map((groupRange) => {
return { return {
[`d${groupRange.group_id}`]: [Math.floor(groupRange.dist[0]), Math.min(Math.ceil(groupRange.dist[1]), 4000)], [`d${groupRange.group_id}`]: [Math.floor(groupRange.dist[0]), Math.min(Math.ceil(groupRange.dist[1]), 4000)],
@ -271,9 +268,12 @@ export const useGetPendingPointsRange = () => {
}).filter(item => !!item); }).filter(item => !!item);
const ranges = Object.assign({}, ...rangesArr); const ranges = Object.assign({}, ...rangesArr);
return { return {
prediction: data.prediction_current, fullRange: {
prediction: data.prediction_current,
...ranges, ...ranges,
...distToGroups ...distToGroups
},
isLoading: isLoading
}; };
}, },
} }

@ -17,8 +17,8 @@ export const LoadingStage = ({setFileId}) => {
}; };
try { try {
const {id} = await uploadPointsFile(file, config); const {id} = await uploadPointsFile(file, config);
setFileId(id);
onSuccess("Ok"); onSuccess("Ok");
setFileId(id);
} catch (e) { } catch (e) {
// //
} }

@ -6,7 +6,7 @@ import { ReportStage } from "./ReportStage.jsx";
import { CheckCircleOutlined, LoadingOutlined } from "@ant-design/icons"; import { CheckCircleOutlined, LoadingOutlined } from "@ant-design/icons";
export const OnLoadModal = ({onClose, isOpened}) => { export const OnLoadModal = ({onClose, isOpened}) => {
const [fileId, setFileId] = useState(31); const [fileId, setFileId] = useState();
const [report, setReport] = useState(); const [report, setReport] = useState();
const [isImporting, setIsImporting] = useState(false); const [isImporting, setIsImporting] = useState(false);
const [isReportStage, setIsReportStage] = useState(false); const [isReportStage, setIsReportStage] = useState(false);

@ -4,9 +4,10 @@ import { ImportOutlined } from "@ant-design/icons";
import { OnLoadModal } from "./OnLoadModal.jsx"; import { OnLoadModal } from "./OnLoadModal.jsx";
import { useState } from "react"; import { useState } from "react";
import { AddPointsModal } from "./AddPointsModal.jsx"; import { AddPointsModal } from "./AddPointsModal.jsx";
import { MODES } from "../../config.js";
export const ImportModeSidebarButtons = () => { export const ImportModeSidebarButtons = () => {
const {isImportMode, setImportMode} = useMode(); const { mode, isImportMode, setImportMode } = useMode();
const [loadModalOpen, setLoadModalOpen] = useState(false); const [loadModalOpen, setLoadModalOpen] = useState(false);
const [addPointsModalOpen, setAddPointsModalOpen] = useState(false); const [addPointsModalOpen, setAddPointsModalOpen] = useState(false);
@ -45,7 +46,7 @@ export const ImportModeSidebarButtons = () => {
); );
} }
return ( return mode === MODES.PENDING && (
<div className="flex flex-col flex-0 border-t-[1px] border-b-[1px]"> <div className="flex flex-col flex-0 border-t-[1px] border-b-[1px]">
<Button type="default" onClick={onImport}> <Button type="default" onClick={onImport}>
<ImportOutlined /> <ImportOutlined />

@ -1,5 +1,5 @@
import { DISABLED_FILTER_TEXT } from "../../../config"; import { DISABLED_FILTER_TEXT } from "../../../config";
import { Button, Tooltip } from "antd"; import {Button, Spin, Tooltip} from "antd";
import { SelectedLocations } from "./SelectedLocations"; import { SelectedLocations } from "./SelectedLocations";
import { TakeToWorkButton } from "./TakeToWorkButton"; import { TakeToWorkButton } from "./TakeToWorkButton";
import { RegionSelect } from "../../../components/RegionSelect"; import { RegionSelect } from "../../../components/RegionSelect";
@ -13,13 +13,30 @@ import {
import {RANGE_FILTERS_KEYS, usePendingPointsFilters} from "../../../stores/usePendingPointsFilters"; import {RANGE_FILTERS_KEYS, usePendingPointsFilters} from "../../../stores/usePendingPointsFilters";
import { ClearFiltersButton } from "../../../components/ClearFiltersButton"; import { ClearFiltersButton } from "../../../components/ClearFiltersButton";
import { getDynamicActiveFilters } from "../utils"; import { getDynamicActiveFilters } from "../utils";
import { useCanEdit } from "../../../api"; import { getApiName, useCanEdit, useGetPendingPointsRange } from "../../../api";
import { AdvancedFiltersWrapper } from "./AdvancedFilters/AdvancedFiltersWrapper.jsx"; import { AdvancedFiltersWrapper } from "./AdvancedFilters/AdvancedFiltersWrapper.jsx";
export const PendingPointsFilters = () => { export const PendingPointsFilters = () => {
const hasManualEdits = useHasManualEdits(); const hasManualEdits = useHasManualEdits();
const { reset: resetPointSelection } = usePointSelection(); const { reset: resetPointSelection } = usePointSelection();
const { ranges, filters, setRegion, setFilterWithKey, setPrediction, setCategories } = usePendingPointsFilters(); const { ranges, filters, setRegion, setFilterWithKey, setPrediction, setCategories, setRanges } = usePendingPointsFilters();
const link = getApiName();
const { data } = useGetPendingPointsRange(link);
useEffect(() => {
const newRanges = data?.fullRange;
if (!newRanges) return;
RANGE_FILTERS_KEYS.map((key) => {
const gtChanged = ranges[key][0] !== newRanges[key][0];
const ltChanged = ranges[key][1] !== newRanges[key][1];
if (gtChanged || ltChanged) setFilterWithKey(newRanges[key], key);
});
const gtChanged = ranges.prediction[0] !== newRanges.prediction[0];
const ltChanged = ranges.prediction[1] !== newRanges.prediction[1];
if (gtChanged || ltChanged) setPrediction(newRanges.prediction);
setRanges({...ranges, ...newRanges});
}, [data]);
const [isSelectionEmpty, setIsSelectionEmpty] = useState(false); const [isSelectionEmpty, setIsSelectionEmpty] = useState(false);
@ -84,12 +101,16 @@ export const PendingPointsFilters = () => {
onChange={setRegion} onChange={setRegion}
/> />
<CategoriesSelect disabled={hasManualEdits} /> <CategoriesSelect disabled={hasManualEdits} />
<PredictionSlider {data?.isLoading ? <Spin /> :
disabled={hasManualEdits} <>
fullRange={ranges} <PredictionSlider
isLoading={false} disabled={hasManualEdits}
/> fullRange={ranges}
<AdvancedFiltersWrapper /> isLoading={false}
/>
<AdvancedFiltersWrapper />
</>
}
</div> </div>
{hasActiveFilters && ( {hasActiveFilters && (

@ -1,4 +1,4 @@
import React, { useCallback, useState } from "react"; import React, {useCallback, useMemo, useState} from "react";
import { Table } from "../Table"; import { Table } from "../Table";
import { usePointSelection } from "../../../stores/usePointSelection"; import { usePointSelection } from "../../../stores/usePointSelection";
import { useClickedPointConfig } from "../../../stores/useClickedPointConfig"; import { useClickedPointConfig } from "../../../stores/useClickedPointConfig";
@ -9,6 +9,23 @@ import { useCanEdit } from "../../../api";
import { useColumns } from "../useColumns.jsx"; import { useColumns } from "../useColumns.jsx";
import { PAGE_SIZE } from "../constants.js"; import { PAGE_SIZE } from "../constants.js";
import { usePopup } from "../../../stores/usePopup.js"; import { usePopup } from "../../../stores/usePopup.js";
import { useMode } from "../../../stores/useMode.js";
const MATCHING_STATUS = {
Unmatched: {
name: 'Новая',
color: '#52c41a'
},
Error: {
name: 'Ошибка',
color: '#f5222d'
},
Matched: {
name: 'Совпадение',
color: '#2f54eb'
},
}
const tableKey = 'pendingTable'; const tableKey = 'pendingTable';
export const PendingTable = ({ fullWidth }) => { export const PendingTable = ({ fullWidth }) => {
@ -16,7 +33,29 @@ export const PendingTable = ({ fullWidth }) => {
const { clickedPointConfig, setClickedPointConfig } = useClickedPointConfig(); const { clickedPointConfig, setClickedPointConfig } = useClickedPointConfig();
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(PAGE_SIZE); const [pageSize, setPageSize] = useState(PAGE_SIZE);
const {columns, orderColumns, sort, setSort} = useColumns([], tableKey); const { isImportMode } = useMode();
const fields = useMemo(() => {
return isImportMode ? [{
title: "Результат геокодирования",
dataIndex: "matching_status",
key: "matching_status",
width: "120px",
ellipsis: true,
sorter: true,
showSorterTooltip: false,
render: (_, record) => {
if (!record.matching_status) return;
const name = MATCHING_STATUS[record.matching_status].name;
const color = MATCHING_STATUS[record.matching_status].color;
return (
<div className={`bg-[${color}] bg-opacity-25 text-[${color}] rounded-md px-2 py-1 text-center border-solid border-[2px] border-[${color}]`}>
{name}
</div>
);
},
}] : [];
}, [isImportMode])
const {columns, orderColumns, sort, setSort} = useColumns(fields, tableKey);
const { setPopup } = usePopup(); const { setPopup } = usePopup();
const onSort = (sortDirection, key) => { const onSort = (sortDirection, key) => {

@ -38,6 +38,7 @@ export const TableSettings = ({orderColumns}) => {
<div className="flex flex-col" {...provided.droppableProps} ref={provided.innerRef}> <div className="flex flex-col" {...provided.droppableProps} ref={provided.innerRef}>
{columnsList.map((item, index) => { {columnsList.map((item, index) => {
const num = item.position; const num = item.position;
if (!orderColumns.defaultColumns[num]) return;
return ( return (
<Draggable key={`list-${num}`} draggableId={`list-${num}`} index={index}> <Draggable key={`list-${num}`} draggableId={`list-${num}`} index={index}>
{(provided) => ( {(provided) => (

@ -7,21 +7,12 @@ import { AddressSearch } from "../../Map/AddressSearch.jsx";
import { SearchOutlined } from "@ant-design/icons"; 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 = 39;
export const useColumns = (fields = [], key) => { export const useColumns = (fields = [], key) => {
const { data: regions } = useGetRegions(); const { data: regions } = useGetRegions();
const { const {
tableState: { fullScreen }, tableState: { fullScreen },
} = useTable(); } = useTable();
const [order, setOrder] = useLocalStorage(`${key}Order`, [...Array(DEFAULT_LENGTH).keys()].map((position) => {
return {
position,
show: true,
}
}));
const [sort, setSort] = useLocalStorage(`${key}Sort`, null); const [sort, setSort] = useLocalStorage(`${key}Sort`, null);
const defaultColumns = useMemo(() => { const defaultColumns = useMemo(() => {
@ -402,9 +393,17 @@ export const useColumns = (fields = [], key) => {
showSorterTooltip: false, showSorterTooltip: false,
}, },
...fields, ...fields,
]; ].filter(c => !!c);
}, [regions?.normalized, fields, fullScreen]); }, [regions?.normalized, fields, fullScreen]);
const [order, setOrder] = useLocalStorage(`${key}Order`, defaultColumns.map((column, index) => {
return {
key: column.key,
position: index,
show: true,
}
}));
const columns = useMemo(() => { const columns = useMemo(() => {
return order.flatMap((item) => !item.show ? [] : defaultColumns[item.position]) return order.flatMap((item) => !item.show ? [] : defaultColumns[item.position])
.map((column) => { .map((column) => {
@ -413,7 +412,7 @@ export const useColumns = (fields = [], key) => {
defaultSortOrder: sort.includes('-') ? 'descend' : 'ascend', defaultSortOrder: sort.includes('-') ? 'descend' : 'ascend',
}; };
return column; return column;
}); }).filter(c => !!c);
}, [defaultColumns, order, fullScreen]); }, [defaultColumns, order, fullScreen]);
return { return {

Loading…
Cancel
Save