You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.1 KiB

import { RegionSelect } from "./RegionSelect";
import { Button } from "antd";
import { ObjectTypesSelect } from "./ObjectTypesSelect";
import { PredictionSlider } from "./PredictionSlider";
import { LayersVisibility } from "./LayersVisibility";
import { useState } from "react";
import { api } from "../../api";
import { useFilters } from "../../stores/useFilters";
import {
useHasManualEdits,
usePointSelection,
} from "../../stores/usePointSelection";
function download(filename, data) {
const downloadLink = window.document.createElement("a");
downloadLink.href = window.URL.createObjectURL(
new Blob([data], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
})
);
downloadLink.download = filename;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
const getRegionParam = (regionId) => {
if (!regionId) return null;
const [type, id] = regionId.split("-");
if (type === "ao") {
return { msk_ao: Number(id) };
}
return { msk_rayon: Number(id) - 1 };
};
export const Sidebar = () => {
const {
filters: { prediction, region, categories },
} = useFilters();
const [isExporting, setIsExporting] = useState(false);
const hasManualEdits = useHasManualEdits();
const { reset: resetSelection } = usePointSelection();
const handleExport = async () => {
setIsExporting(true);
try {
const params = {
filters: {
rate_from: prediction[0],
rate_to: prediction[1],
},
};
if (region) {
params.filters = {
...params.filters,
...getRegionParam(region),
};
}
if (categories.length) {
params.filters = {
...params.filters,
category: categories,
};
}
const resp = await api.post("/api/raschet/", params, {
responseType: "arraybuffer",
});
const blob = resp.data;
download("postamates.xlsx", blob);
} catch (err) {
console.log("Произошла ошибка");
} finally {
setIsExporting(false);
}
};
return (
<div className="absolute top-[20px] left-[20px] bg-white-background w-[300px] rounded-xl p-3 max-h-[calc(100%-40px)] overflow-y-auto z-10">
<div className="space-y-5">
<LayersVisibility />
<RegionSelect />
<ObjectTypesSelect />
<PredictionSlider />
<div>
<Button
type="primary"
block
className={"mt-2"}
onClick={handleExport}
loading={isExporting}
disabled={true}
>
Экспорт данных
</Button>
<Button type="primary" block className={"mt-2"} disabled={true}>
Взять в работу
</Button>
{hasManualEdits ? (
<Button
type="text"
block
className={"mt-2"}
onClick={resetSelection}
>
Отменить ручное редактирование
</Button>
) : null}
</div>
</div>
</div>
);
};