feat: TDR-Umschalter mit Admin-Login-Schutz versehen
- Der Schalter zum Aktivieren/Deaktivieren der TDR-Funktion ist nun nur für Admins sichtbar. - Umsetzung über `useAdminAuth` analog zum Firmware-Update-Button. - CHANGELOG.md und README.md entsprechend aktualisiert.
This commit is contained in:
10
CHANGELOG.md
10
CHANGELOG.md
@@ -4,6 +4,16 @@ Alle Änderungen und Versionen des CPLv4.0 Frontends chronologisch dokumentiert.
|
||||
|
||||
---
|
||||
|
||||
## [1.6.403] – 2025-05-13
|
||||
|
||||
### Sicherheit & UI
|
||||
|
||||
- Der Umschalter für die TDR-Aktivierung in `TdrEinstellung.tsx` wird jetzt nur noch angezeigt, wenn ein Admin eingeloggt ist.
|
||||
- Damit wird verhindert, dass Standardnutzer oder Gäste versehentlich TDR-Funktionen aktivieren oder deaktivieren.
|
||||
- Gleiche Logik wie beim „Firmware Update“-Button in `KueEinstellung.tsx` (`useAdminAuth`).
|
||||
|
||||
---
|
||||
|
||||
## [1.6.402] – 2025-05-13
|
||||
|
||||
### Fix
|
||||
|
||||
@@ -69,6 +69,8 @@ Die Benutzeroberfläche ist modular aufgebaut und ermöglicht Zugriff auf digita
|
||||
|
||||
- Beim Umschalten der TDR-Funktion (Ein/Aus) wird eine Bestätigung angezeigt.
|
||||
- Nach Klick auf „OK“ wird die Seite automatisch neu geladen, da der neue TDR-Status aktuell **nicht sofort im UI aktualisiert wird**.
|
||||
- Nur eingeloggte Admins können die TDR-Funktion aktivieren oder deaktivieren.
|
||||
- Der Schalter wird im UI ausgeblendet, wenn kein Admin-Login erfolgt ist.
|
||||
|
||||
> Hinweis: Diese Lösung wurde aus Zeitgründen gewählt (Deadline), um eine stabile Anzeige sicherzustellen. Eine spätere Optimierung über Redux- und React-State-Handling ist vorgesehen.
|
||||
|
||||
|
||||
@@ -9,12 +9,15 @@ import React, { useState, useEffect } from "react";
|
||||
import { useSelector } from "react-redux";
|
||||
import { RootState } from "../../../../../redux/store";
|
||||
|
||||
import { useAdminAuth } from "../../../settingsPageComponents/hooks/useAdminAuth";
|
||||
|
||||
interface Props {
|
||||
slot: number;
|
||||
onClose?: () => void; // ← NEU
|
||||
}
|
||||
|
||||
export default function TdrEinstellung({ slot, onClose }: Props) {
|
||||
const { isAdminLoggedIn } = useAdminAuth(true);
|
||||
const tdrSlice = useSelector((state: RootState) => state.kueDataSlice);
|
||||
|
||||
const cacheKey = `slot_${slot}`;
|
||||
@@ -162,29 +165,31 @@ export default function TdrEinstellung({ slot, onClose }: Props) {
|
||||
return (
|
||||
<div className="p-4 text-sm">
|
||||
{/* TDR-Funktion */}
|
||||
<div className="mb-4 mt-4 grid grid-cols-3 items-center gap-2 w-full">
|
||||
<span className="text-sm font-medium">TDR-Funktion:</span>
|
||||
<div className="col-span-2 flex items-center gap-4">
|
||||
<button
|
||||
type="button"
|
||||
role="switch"
|
||||
aria-checked={tdrActive}
|
||||
onClick={handleTdrToggle}
|
||||
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-200 ${
|
||||
tdrActive ? "bg-littwin-blue" : "bg-gray-300"
|
||||
}`}
|
||||
>
|
||||
<span
|
||||
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform duration-200 ${
|
||||
tdrActive ? "translate-x-6" : "translate-x-1"
|
||||
{isAdminLoggedIn && (
|
||||
<div className="mb-4 mt-4 grid grid-cols-3 items-center gap-2 w-full">
|
||||
<span className="text-sm font-medium">TDR-Funktion:</span>
|
||||
<div className="col-span-2 flex items-center gap-4">
|
||||
<button
|
||||
type="button"
|
||||
role="switch"
|
||||
aria-checked={tdrActive}
|
||||
onClick={handleTdrToggle}
|
||||
className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-200 ${
|
||||
tdrActive ? "bg-littwin-blue" : "bg-gray-300"
|
||||
}`}
|
||||
/>
|
||||
</button>
|
||||
<span className="text-sm text-gray-600">
|
||||
{tdrActive ? "aktiviert" : "deaktiviert"}
|
||||
</span>
|
||||
>
|
||||
<span
|
||||
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform duration-200 ${
|
||||
tdrActive ? "translate-x-6" : "translate-x-1"
|
||||
}`}
|
||||
/>
|
||||
</button>
|
||||
<span className="text-sm text-gray-600">
|
||||
{tdrActive ? "aktiviert" : "deaktiviert"}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="mt-6 mb-4">
|
||||
<div className="mb-4 grid grid-cols-3 items-center gap-2 w-full">
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
2: Patch oder Hotfix (Bugfixes oder kleine Änderungen).
|
||||
|
||||
*/
|
||||
const webVersion = "1.6.402";
|
||||
const webVersion = "1.6.403";
|
||||
export default webVersion;
|
||||
|
||||
@@ -31,7 +31,7 @@ export const goTDR = async (
|
||||
// 🚀 ECHTER Backend-Aufruf über CGI
|
||||
try {
|
||||
const response = await fetch(
|
||||
`${window.location.origin}/CPL?Service/Kabelueberwachung.html&KTT${slotIndex}=1`,
|
||||
`${window.location.origin}/CPL?kabelueberwachung.html&KTT${slotIndex}=1`,
|
||||
{
|
||||
method: "GET",
|
||||
}
|
||||
@@ -39,7 +39,7 @@ export const goTDR = async (
|
||||
|
||||
if (response.ok) {
|
||||
alert(
|
||||
`TDR Messung der KÜ705-FO Strecke ${slotIndex + 1} wurde durchgeführt`
|
||||
`Die TDR-Messung wird durchgeführt. Das Messergebnis ist in wenigen Minuten verfügbar.`
|
||||
);
|
||||
console.log("TDR erfolgreich gestartet für Slot", slotIndex + 1);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user