diff --git a/frontend-admin/src/api/api_admin.ts b/frontend-admin/src/api/api_admin.ts index c5a57d3c..ba695322 100644 --- a/frontend-admin/src/api/api_admin.ts +++ b/frontend-admin/src/api/api_admin.ts @@ -1101,6 +1101,8 @@ export interface AppSettings { client_color_success: string; client_color_danger: string; client_color_warning: string; + client_title_gradient_from: string; + client_title_gradient_to: string; } export const getSettings = async (): Promise<{ diff --git a/frontend-admin/src/screens/admin/OrdersScreen.tsx b/frontend-admin/src/screens/admin/OrdersScreen.tsx index e375e310..a4dd9156 100644 --- a/frontend-admin/src/screens/admin/OrdersScreen.tsx +++ b/frontend-admin/src/screens/admin/OrdersScreen.tsx @@ -782,7 +782,7 @@ export default function OrdersScreen() { setOpenMenuId(null); handleForceValidate(item.id); }, - condition: !isDone && item.status !== "livre", + condition: !isDone, }, { label: "Supprimer", diff --git a/frontend-admin/src/screens/admin/SettingsScreen.tsx b/frontend-admin/src/screens/admin/SettingsScreen.tsx index 4d4960d7..af86d77f 100644 --- a/frontend-admin/src/screens/admin/SettingsScreen.tsx +++ b/frontend-admin/src/screens/admin/SettingsScreen.tsx @@ -1205,6 +1205,8 @@ export default function SettingsScreen() { client_color_success: "#4ade80", client_color_danger: "#ef4444", client_color_warning: "#f59e0b", + client_title_gradient_from: "#a78bfa", + client_title_gradient_to: "#22d3ee", }); const [showApiKey, setShowApiKey] = useState(false); const [showIpnSecret, setShowIpnSecret] = useState(false); @@ -1501,6 +1503,7 @@ export default function SettingsScreen() { {/* Personnalisation */} + {/* Nom du shop */} Nom du shop @@ -1517,6 +1520,67 @@ export default function SettingsScreen() { autoCorrect={false} /> + + {/* Dégradé titre boutique */} + + Dégradé du titre boutique + Couleurs du nom de la boutique dans le header du site client. + + {/* Aperçu du dégradé */} + + + + + + + + {/* Couleur de départ */} + + + + Couleur de départ + setSettings((p) => ({ ...p, client_title_gradient_from: v }))} + placeholder="#a78bfa" + placeholderTextColor={colors.textMuted} + autoCorrect={false} + autoCapitalize="none" + maxLength={7} + /> + + + + {/* Couleur de fin */} + + + + Couleur de fin + setSettings((p) => ({ ...p, client_title_gradient_to: v }))} + placeholder="#22d3ee" + placeholderTextColor={colors.textMuted} + autoCorrect={false} + autoCapitalize="none" + maxLength={7} + /> + + + {/* Amendes */} diff --git a/frontend-admin/src/screens/admin/StatsScreen.tsx b/frontend-admin/src/screens/admin/StatsScreen.tsx index 357ab9f6..062698d6 100644 --- a/frontend-admin/src/screens/admin/StatsScreen.tsx +++ b/frontend-admin/src/screens/admin/StatsScreen.tsx @@ -6,8 +6,8 @@ import { StyleSheet, RefreshControl, TouchableOpacity, - Alert, } from "react-native"; +import AlertModal from "../../components/ui/AlertModal"; import { Ionicons } from "@expo/vector-icons"; import { useFocusEffect } from "@react-navigation/native"; import { useTheme } from "../../context/ThemeContext"; @@ -197,6 +197,8 @@ export default function StatsScreen() { const [refreshing, setRefreshing] = useState(false); const [resetting, setResetting] = useState(null); const [prodSort, setProdSort] = useState("quantity"); + const [confirmModal, setConfirmModal] = useState<{ section: StatSection; label: string } | null>(null); + const [errorModal, setErrorModal] = useState(null); const loadStats = useCallback(async () => { try { @@ -215,25 +217,21 @@ export default function StatsScreen() { }; const handleReset = (section: StatSection, label: string) => { - Alert.alert( - `Réinitialiser — ${label}`, - "Les données de cette section repartiront de zéro. Les commandes restent en base.\n\nConfirmer ?", - [ - { text: "Annuler", style: "cancel" }, - { - text: "Réinitialiser", - style: "destructive", - onPress: async () => { - setResetting(section); - try { - await resetAdminStats(section); - await loadStats(); - } catch { /* ignore */ } - setResetting(null); - }, - }, - ], - ); + setConfirmModal({ section, label }); + }; + + const doReset = async () => { + if (!confirmModal) return; + const { section } = confirmModal; + setConfirmModal(null); + setResetting(section); + try { + await resetAdminStats(section); + await loadStats(); + } catch (e: any) { + setErrorModal(e?.response?.data?.error || e?.message || "Impossible de réinitialiser"); + } + setResetting(null); }; // Produits triés selon le sélecteur @@ -271,6 +269,24 @@ export default function StatsScreen() { )); return ( + <> + setConfirmModal(null)} + onConfirm={doReset} + /> + setErrorModal(null)} + /> + ); }