diff --git a/.env.development b/.env.development index 045fad8..a6f058e 100644 --- a/.env.development +++ b/.env.development @@ -6,5 +6,5 @@ NEXT_PUBLIC_USE_MOCK_BACKEND_LOOP_START=false NEXT_PUBLIC_EXPORT_STATIC=false NEXT_PUBLIC_USE_CGI=false # App-Versionsnummer -NEXT_PUBLIC_APP_VERSION=1.6.444 +NEXT_PUBLIC_APP_VERSION=1.6.445 NEXT_PUBLIC_CPL_MODE=jsSimulatedProd # json (Entwicklungsumgebung) oder jsSimulatedProd (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter) \ No newline at end of file diff --git a/.env.production b/.env.production index 3fd4022..b4880bf 100644 --- a/.env.production +++ b/.env.production @@ -5,5 +5,5 @@ NEXT_PUBLIC_CPL_API_PATH=/CPL NEXT_PUBLIC_EXPORT_STATIC=true NEXT_PUBLIC_USE_CGI=true # App-Versionsnummer -NEXT_PUBLIC_APP_VERSION=1.6.444 +NEXT_PUBLIC_APP_VERSION=1.6.445 NEXT_PUBLIC_CPL_MODE=production \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd558f..a0b3ff4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [1.6.445] – 2025-06-25 + +- docs: README + +--- ## [1.6.444] – 2025-06-23 - feat: digitalOutputs separate jsSimulatedProd mode diff --git a/components/header/settingsModal/SettingsModal.tsx b/components/header/settingsModal/SettingsModal.tsx index b98720e..1708e9a 100644 --- a/components/header/settingsModal/SettingsModal.tsx +++ b/components/header/settingsModal/SettingsModal.tsx @@ -18,7 +18,13 @@ import handleAdminLogin from "./handlers/handleAdminLogin"; ReactModal.setAppElement("#__next"); -function SettingModal({ showModal, onClose }) { +function SettingModal({ + showModal, + onClose, +}: { + showModal: boolean; + onClose: () => void; +}) { const { isAdminLoggedIn, logoutAdmin } = useAdminAuth(showModal); const { formValues, setFormValues } = useSystemSettings(showModal); @@ -72,9 +78,21 @@ function SettingModal({ showModal, onClose }) { const [ntp2, setNtp2] = useState(ntp2_Redux || ""); const [ntp3, setNtp3] = useState(ntp3_Redux || ""); const [ntpTimezone, setNtpTimezone] = useState(ntpTimezone_Redux || ""); - const [active, setActive] = useState(active_Redux || ""); + const [active, setActive] = useState( + typeof active_Redux === "boolean" ? active_Redux : active_Redux === "true" + ); - const [originalValues, setOriginalValues] = useState({}); + const [originalValues, setOriginalValues] = useState({ + name: name, + ip: ip, + subnet: subnet, + gateway: gateway, + ntp1: ntp1, + ntp2: ntp2, + ntp3: ntp3, + ntpTimezone: ntpTimezone, + active: active, + }); const currentValues = { name, ip, @@ -228,12 +246,14 @@ function SettingModal({ showModal, onClose }) {
- setActive(e.target.value)} - /> + value={active ? "true" : "false"} + onChange={(e) => setActive(e.target.value === "true")} + > + + +
@@ -241,13 +261,13 @@ function SettingModal({ showModal, onClose }) {
))}
-
- {racks[`rack${activeRack}`].map((slot, index) => { - const slotIndex = index + (activeRack - 1) * 8; - return ( -
- -
- ); - })} -
+ {racks[`rack${activeRack}` as RackKey].map((slot, index) => { + const slotIndex = index + (activeRack - 1) * 8; + return ( +
+ +
+ ); + })} ); } diff --git a/public/CPL/SERVICE/analogInputs.json b/public/CPL/SERVICE/analogInputs.json new file mode 100644 index 0000000..5adcbd4 --- /dev/null +++ b/public/CPL/SERVICE/analogInputs.json @@ -0,0 +1,72 @@ +{ + "win_analogInputsValues": [ + "<%=AAV01%>", + "<%=AAV02%>", + "<%=AAV03%>", + "<%=AAV04%>", + "<%=AAV05%>", + "<%=AAV06%>", + "<%=AAV07%>", + "<%=AAV08%>" + ], + "win_analogInputsLabels": [ + "<%=ACN01%>", + "<%=ACN02%>", + "<%=ACN03%>", + "<%=ACN04%>", + "<%=ACN05%>", + "<%=ACN06%>", + "<%=ACN07%>", + "<%=ACN08%>" + ], + "win_analogInputsUnits": [ + "<%=ACU01%>", + "<%=ACU02%>", + "<%=ACU03%>", + "<%=ACU04%>", + "<%=ACU05%>", + "<%=ACU06%>", + "<%=ACU07%>", + "<%=ACU08%>" + ], + "win_analogInputsFactor": [ + "<%=ACF01%>", + "<%=ACF02%>", + "<%=ACF03%>", + "<%=ACF04%>", + "<%=ACF05%>", + "<%=ACF06%>", + "<%=ACF07%>", + "<%=ACF08%>" + ], + "win_analogInputsOffset": [ + "<%=ACO01%>", + "<%=ACO02%>", + "<%=ACO03%>", + "<%=ACO04%>", + "<%=ACO05%>", + "<%=ACO06%>", + "<%=ACO07%>", + "<%=ACO08%>" + ], + "win_analogInputsWeighting": [ + "<%=ACS01%>", + "<%=ACS02%>", + "<%=ACS03%>", + "<%=ACS04%>", + "<%=ACS05%>", + "<%=ACS06%>", + "<%=ACS07%>", + "<%=ACS08%>" + ], + "win_analogInputsLoggerIntervall": [ + "<%=ACL01%>", + "<%=ACL02%>", + "<%=ACL03%>", + "<%=ACL04%>", + "<%=ACL05%>", + "<%=ACL06%>", + "<%=ACL07%>", + "<%=ACL08%>" + ] +} diff --git a/services/fetchAnalogInputsService.ts b/services/fetchAnalogInputsService.ts index 625429d..e42e5cc 100644 --- a/services/fetchAnalogInputsService.ts +++ b/services/fetchAnalogInputsService.ts @@ -2,61 +2,56 @@ export const fetchAnalogInputsService = async () => { const mode = process.env.NEXT_PUBLIC_CPL_MODE; - // ✅ PRODUKTIV: lädt JavaScript vom Gerät über CGI + // ✅ PRODUKTIV: lädt JSON-Datei vom Gerät über CGI if (mode === "production") { - console.log("🔄 Lade analoge Eingänge im Produktionsmodus..."); - const scriptUrl = "/CPL?/CPL/SERVICE/analogInputs.js"; + console.log( + "🔄 Lade analoge Eingänge im Produktionsmodus (JSON über CPL?)..." + ); - await new Promise((resolve, reject) => { - const script = document.createElement("script"); - script.src = scriptUrl; - script.async = true; - script.onload = () => resolve(); - script.onerror = () => reject("❌ Fehler beim Laden der analogInputs.js"); - document.body.appendChild(script); + const res = await fetch("/CPL?/CPL/SERVICE/analogInputs.json", { + headers: { Accept: "application/json" }, }); - const win = window as any; + if (!res.ok) { + throw new Error("❌ Fehler beim Laden der analogInputs.json"); + } - return Array.from({ length: 8 }, (_, i) => ({ + const data = await res.json(); + + return data.win_analogInputsValues.map((value: string, i: number) => ({ id: i + 1, - value: parseFloat(win.win_analogInputsValues[i]), - label: win.win_analogInputsLabels[i], - unit: win.win_analogInputsUnits[i], - offset: parseFloat(win.win_analogInputsOffset[i]), - factor: parseFloat(win.win_analogInputsFactor[i]), - loggerInterval: parseInt(win.win_analogInputsLoggerIntervall[i]), - weighting: parseInt(win.win_analogInputsWeighting[i]), + value: parseFloat(value), + label: data.win_analogInputsLabels[i].replace(/'/g, ""), + unit: data.win_analogInputsUnits[i].replace(/'/g, ""), + offset: parseFloat(data.win_analogInputsOffset[i]), + factor: parseFloat(data.win_analogInputsFactor[i]), + loggerInterval: parseInt(data.win_analogInputsLoggerIntervall[i]), + weighting: parseInt(data.win_analogInputsWeighting[i]), })); } + // ✅ jsSimulatedProd-MODUS (Script einbinden und aus window lesen) else if (mode === "jsSimulatedProd") { - console.log("🔄 Lade simulierte analoge Eingänge im Produktionsmodus..."); - const scriptUrl = "/api/cpl/getAnalogInputsHandler"; // gibt JavaScript zurück + console.log("🧪 Lade analoge Eingänge im Simulationsmodus (JSON)"); - await new Promise((resolve, reject) => { - const script = document.createElement("script"); - script.src = scriptUrl; - script.async = true; - script.onload = () => resolve(); - script.onerror = () => - reject("❌ Fehler beim Laden des simulierten Scripts"); - document.body.appendChild(script); - }); + const res = await fetch("/api/cpl/getAnalogInputsHandler"); + if (!res.ok) + throw new Error("❌ Fehler beim Laden der analogen Eingänge (Mock)"); - const win = window as any; + const data = await res.json(); - return Array.from({ length: 8 }, (_, i) => ({ + return data.win_analogInputsValues.map((value: string, i: number) => ({ id: i + 1, - value: parseFloat(win.win_analogInputsValues[i]), - label: win.win_analogInputsLabels[i], - unit: win.win_analogInputsUnits[i], - offset: parseFloat(win.win_analogInputsOffset[i]), - factor: parseFloat(win.win_analogInputsFactor[i]), - loggerInterval: parseInt(win.win_analogInputsLoggerIntervall[i]), - weighting: parseInt(win.win_analogInputsWeighting[i]), + value: parseFloat(value), + label: data.win_analogInputsLabels[i].replace(/'/g, ""), + unit: data.win_analogInputsUnits[i].replace(/'/g, ""), + offset: parseFloat(data.win_analogInputsOffset[i]), + factor: parseFloat(data.win_analogInputsFactor[i]), + loggerInterval: parseInt(data.win_analogInputsLoggerIntervall[i]), + weighting: parseInt(data.win_analogInputsWeighting[i]), })); } + // ✅ JSON-MODUS (API gibt JSON-Daten zurück) else if (mode === "json") { console.log("🔄 Lade analoge Eingänge im JSON-Modus..."); diff --git a/utils/checkSession.ts b/utils/checkSession.ts index 4e5b23c..63c8b63 100644 --- a/utils/checkSession.ts +++ b/utils/checkSession.ts @@ -7,7 +7,10 @@ export async function checkSession(): Promise { if (typeof window === "undefined") return false; - return window[expectedGlobalVar] !== undefined; + return ( + (window as unknown as Record)[expectedGlobalVar] !== + undefined + ); } catch (error) { return false; } diff --git a/utils/loadWindowVariables.ts b/utils/loadWindowVariables.ts index 66ab81c..319b801 100644 --- a/utils/loadWindowVariables.ts +++ b/utils/loadWindowVariables.ts @@ -54,13 +54,13 @@ export async function loadWindowVariables(): Promise<{ const win = window as unknown as CustomWindow; const variablesObj: Record = requiredVars.reduce( - (acc, variable) => { + (acc: Record, variable: string) => { if (win[variable] !== undefined) { acc[variable.replace("win_", "")] = win[variable]; } return acc; }, - {} + {} as Record ); const kueData =