-
+
+
+
{onClose ? (
diff --git a/src/components/orders/DriverAssignmentPanel.jsx b/src/components/orders/DriverAssignmentPanel.jsx
index af511cb..069f585 100644
--- a/src/components/orders/DriverAssignmentPanel.jsx
+++ b/src/components/orders/DriverAssignmentPanel.jsx
@@ -8,7 +8,7 @@ const DriverAssignmentPanel = ({
order,
userRole,
canManageDelivery,
- isSavingDeliveryChoice,
+ isSavingDriverAssignment,
selectedDriverId,
onDriverSelect,
onConfirmDriver,
@@ -63,7 +63,7 @@ const DriverAssignmentPanel = ({
onChange={(e) => {
onDriverSelect(e.target.value);
}}
- disabled={isSavingDeliveryChoice}
+ disabled={isSavingDriverAssignment}
>
{drivers.map((driver) => (
@@ -73,9 +73,9 @@ const DriverAssignmentPanel = ({
) : null}
diff --git a/src/components/orders/OrderDetailPanel.jsx b/src/components/orders/OrderDetailPanel.jsx
index ebc0580..102a72d 100644
--- a/src/components/orders/OrderDetailPanel.jsx
+++ b/src/components/orders/OrderDetailPanel.jsx
@@ -47,7 +47,7 @@ import { DriverShipmentPanel } from "../driver/DriverShipmentPanel";
import { CalendarWidget } from "./CalendarWidget";
import { StatusActionPanel } from "./StatusActionPanel";
import { DriverAssignmentPanel } from "./DriverAssignmentPanel";
-import { supabase } from "../../supabaseClient";
+import { matchesStopWord, useStopWords } from "../../hooks/useStopWords";
import {
getOrderGroupDeliveryStatusLabel,
getOrderGroupDisplayStatusLabel,
@@ -326,27 +326,7 @@ const normalizeDateForInput = (value) => {
return "";
};
-const matchesStopWord = (name, stopWords) => {
- if (!stopWords || !stopWords.length) return false;
- const lower = name.toLowerCase();
- return stopWords.some((sw) => lower.includes(sw.toLowerCase()));
-};
-
-const useStopWords = () => {
- const [stopWords, setStopWords] = React.useState([]);
- const [active, setActive] = React.useState(true);
- React.useEffect(() => {
- if (!supabase) return;
- Promise.all([
- supabase.from("stop_words").select("word").then(r => r.data || []),
- supabase.from("stop_words_scope").select("scope").eq("id", 1).single().then(r => r.data),
- ]).then(([words, scopeRow]) => {
- setStopWords(words.map((d) => d.word));
- setActive(scopeRow?.scope !== "client_only");
- });
- }, []);
- return { stopWords, active };
-};
+const renderValue = (value) => value || "Нет данных";
const CollapsibleOrderComposition = ({ order }) => {
const [isExpanded, setIsExpanded] = React.useState(false);
@@ -431,7 +411,7 @@ const CollapsibleOrderComposition = ({ order }) => {
);
};
-const PaidStoragePanel = ({ order, onChangeDeliveryStatus, isSavingDeliveryChoice, setFormMessage }) => {
+const PaidStoragePanel = ({ order, onChangeDeliveryStatus, isSavingStatusChange, setFormMessage }) => {
const [showConfirm, setShowConfirm] = React.useState(false);
const isPaidStorage = (order.deliveryStatus || order.delivery_status) === "paid_storage";
@@ -461,7 +441,7 @@ const PaidStoragePanel = ({ order, onChangeDeliveryStatus, isSavingDeliveryChoic
}
});
}}
- disabled={isSavingDeliveryChoice}
+ disabled={isSavingStatusChange}
>
Отменить платное хранение
@@ -497,14 +477,14 @@ const PaidStoragePanel = ({ order, onChangeDeliveryStatus, isSavingDeliveryChoic
}
});
}}
- disabled={isSavingDeliveryChoice}
+ disabled={isSavingStatusChange}
>
Да, перевести
@@ -514,7 +494,7 @@ const PaidStoragePanel = ({ order, onChangeDeliveryStatus, isSavingDeliveryChoic
@@ -561,6 +541,8 @@ export const OrderDetailPanel = ({
canManageDelivery = false,
onSaveManualDeliveryChoice,
isSavingDeliveryChoice = false,
+ isSavingDriverAssignment = false,
+ isSavingStatusChange = false,
drivers = [],
onAssignDriver,
onChangeDeliveryStatus,
@@ -1004,7 +986,7 @@ export const OrderDetailPanel = ({
order={order}
userRole={userRole}
canManageDelivery={canManageDelivery}
- isSavingDeliveryChoice={isSavingDeliveryChoice}
+ isSavingDriverAssignment={isSavingDriverAssignment}
selectedDriverId={selectedDriverId}
onDriverSelect={(id) => { setSelectedDriverId(id); setDriverMessage(""); }}
onConfirmDriver={() => setConfirmAction({ type: 'driver' })}
@@ -1017,7 +999,7 @@ export const OrderDetailPanel = ({
order={order}
userRole={userRole}
canManageDelivery={canManageDelivery}
- isSavingDeliveryChoice={isSavingDeliveryChoice}
+ isSavingStatusChange={isSavingStatusChange}
onConfirmStatus={(action) => {
if (action.type === "hint") {
setFormMessage(action.hint);
@@ -1035,7 +1017,7 @@ export const OrderDetailPanel = ({
) : null}
@@ -1112,7 +1094,7 @@ export const OrderDetailPanel = ({
diff --git a/src/hooks/useOrderGroups.js b/src/hooks/useOrderGroups.js
index 451523a..0a63e33 100644
--- a/src/hooks/useOrderGroups.js
+++ b/src/hooks/useOrderGroups.js
@@ -19,6 +19,8 @@ export const useOrderGroups = () => {
const [isLoading, setIsLoading] = React.useState(true);
const [loadError, setLoadError] = React.useState("");
const [isSavingDeliveryChoice, setIsSavingDeliveryChoice] = React.useState(false);
+ const [isSavingDriverAssignment, setIsSavingDriverAssignment] = React.useState(false);
+ const [isSavingStatusChange, setIsSavingStatusChange] = React.useState(false);
React.useEffect(() => {
let cancelled = false;
@@ -142,7 +144,7 @@ export const useOrderGroups = () => {
}, []);
const assignDriver = React.useCallback(async ({ orderGroupId, driverId }) => {
- setIsSavingDeliveryChoice(true);
+ setIsSavingDriverAssignment(true);
try {
const result = await assignDriverToOrderGroup({ orderGroupId, driverId });
@@ -165,12 +167,12 @@ export const useOrderGroups = () => {
error: getErrorMessage(error, "Не удалось назначить водителя"),
};
} finally {
- setIsSavingDeliveryChoice(false);
+ setIsSavingDriverAssignment(false);
}
}, []);
const changeDeliveryStatus = React.useCallback(async ({ orderGroupId, status, details }) => {
- setIsSavingDeliveryChoice(true);
+ setIsSavingStatusChange(true);
try {
const result = await updateDeliveryStatus({ orderGroupId, status, details });
if (result.error) {
@@ -189,7 +191,7 @@ export const useOrderGroups = () => {
error: getErrorMessage(error, "Не удалось обновить статус"),
};
} finally {
- setIsSavingDeliveryChoice(false);
+ setIsSavingStatusChange(false);
}
}, []);
@@ -210,6 +212,8 @@ export const useOrderGroups = () => {
assignDriver,
changeDeliveryStatus,
isSavingDeliveryChoice,
+ isSavingDriverAssignment,
+ isSavingStatusChange,
isLoading,
loadError,
};
diff --git a/src/hooks/useStopWords.js b/src/hooks/useStopWords.js
new file mode 100644
index 0000000..12146af
--- /dev/null
+++ b/src/hooks/useStopWords.js
@@ -0,0 +1,33 @@
+import React from "react";
+import { supabase } from "../supabaseClient";
+
+const matchesStopWord = (name, stopWords) => {
+ if (!stopWords || !stopWords.length) return false;
+ const lower = name.toLowerCase();
+ return stopWords.some((sw) => lower.includes(sw.toLowerCase()));
+};
+
+const useStopWords = () => {
+ const [stopWords, setStopWords] = React.useState([]);
+ const [active, setActive] = React.useState(true);
+
+ React.useEffect(() => {
+ if (!supabase) return;
+ Promise.all([
+ supabase.from("stop_words").select("word").then((r) => r.data || []),
+ supabase
+ .from("stop_words_scope")
+ .select("scope")
+ .eq("id", 1)
+ .single()
+ .then((r) => r.data),
+ ]).then(([words, scopeRow]) => {
+ setStopWords(words.map((d) => d.word));
+ setActive(scopeRow?.scope !== "client_only");
+ });
+ }, []);
+
+ return { stopWords, active };
+};
+
+export { matchesStopWord, useStopWords };
\ No newline at end of file
diff --git a/src/pages/GroupDetailPage.jsx b/src/pages/GroupDetailPage.jsx
index b033e55..dd2be64 100644
--- a/src/pages/GroupDetailPage.jsx
+++ b/src/pages/GroupDetailPage.jsx
@@ -6,6 +6,7 @@
import React from "react";
import { Navigate, useNavigate, useParams, useLocation } from "react-router-dom";
import { OrderDetailPanel } from "../components/orders/OrderDetailPanel";
+import ErrorBoundary from "../components/ErrorBoundary";
import { Button } from "../components/UI/Button";
import { Panel } from "../components/UI/Panel";
import { SkeletonPanel } from "../components/UI/Loading";
@@ -30,6 +31,8 @@ export const GroupDetailPage = () => {
setSelectedOrderGroupId,
saveManualDeliveryChoice,
isSavingDeliveryChoice,
+ isSavingDriverAssignment,
+ isSavingStatusChange,
assignDriver,
changeDeliveryStatus,
isLoading,
@@ -97,16 +100,20 @@ export const GroupDetailPage = () => {
{isLoading ? (
) : order ? (
-
+
+ />
+
) : (
Группа не найдена.