git commit -m "feat: UI-Optimierung für analoge Eingänge & Diagramm

- Layout verbessert: Tabelle und Diagramm jetzt nebeneinander (grid-responsive)
- Responsivität optimiert: Kein unnötiges horizontales Scrollen mehr
- Diagramm verbessert:
  - Höhere Lesbarkeit mit stärkeren Linien und Abstand für Achsenbeschriftungen
  - Anpassung der Höhe und Breite für mobile & große Bildschirme
- Tabelle optimiert:
  - Bessere Lesbarkeit mit größeren Abständen
  - Hover-Effekte für Zeilen
  - Dynamisches Spaltenlayout für kleine & große Bildschirme
- Code aufgeräumt und verbessert

Test auf verschiedenen Bildschirmgrößen erfolgreich!"
This commit is contained in:
Ismail Ali
2025-02-25 19:46:52 +01:00
parent 327a101386
commit 8c01dd3fc3
12 changed files with 591 additions and 175 deletions

View File

@@ -0,0 +1,110 @@
// redux/slices/analogeEingaengeSlice.ts
import { createSlice, PayloadAction, createAsyncThunk } from "@reduxjs/toolkit";
// Typ für einen einzelnen analogen Eingang
export interface AnalogerEingang {
id: number | null;
value: number | null;
name: string;
uW: boolean;
uG: boolean;
oW: boolean;
oG: boolean;
}
// Typ für den Gesamt-State
export interface AnalogeEingaengeState {
win_analogeEingaenge1: AnalogerEingang;
win_analogeEingaenge2: AnalogerEingang;
win_analogeEingaenge3: AnalogerEingang;
win_analogeEingaenge4: AnalogerEingang;
win_analogeEingaenge5: AnalogerEingang;
win_analogeEingaenge6: AnalogerEingang;
win_analogeEingaenge7: AnalogerEingang;
win_analogeEingaenge8: AnalogerEingang;
}
// Standardwert für einen Eingang
const defaultAnalogerEingang: AnalogerEingang = {
id: null,
value: null,
name: "",
uW: false,
uG: false,
oW: false,
oG: false,
};
// Initialer Zustand mit leeren Werten
const initialState: AnalogeEingaengeState = {
win_analogeEingaenge1: { ...defaultAnalogerEingang },
win_analogeEingaenge2: { ...defaultAnalogerEingang },
win_analogeEingaenge3: { ...defaultAnalogerEingang },
win_analogeEingaenge4: { ...defaultAnalogerEingang },
win_analogeEingaenge5: { ...defaultAnalogerEingang },
win_analogeEingaenge6: { ...defaultAnalogerEingang },
win_analogeEingaenge7: { ...defaultAnalogerEingang },
win_analogeEingaenge8: { ...defaultAnalogerEingang },
};
// Mock-Daten aus `window` laden
export const loadFromWindow = createAsyncThunk(
"analogeEingaenge/loadFromWindow",
async () => {
const entries = Object.entries(window).filter(([key]) =>
key.startsWith("win_analogeEingaenge")
);
const data: Partial<AnalogeEingaengeState> = {};
entries.forEach(([key, value]) => {
if (Array.isArray(value) && value.length === 7) {
data[key as keyof AnalogeEingaengeState] = {
id: value[0],
value: value[1],
name: value[2],
uW: value[3] === 1,
uG: value[4] === 1,
oW: value[5] === 1,
oG: value[6] === 1,
};
}
});
return data;
}
);
// Redux Slice
const analogeEingaengeSlice = createSlice({
name: "analogeEingaenge",
initialState,
reducers: {
setAnalogerEingang(
state,
action: PayloadAction<{
key: keyof AnalogeEingaengeState;
value: AnalogerEingang;
}>
) {
state[action.payload.key] = action.payload.value;
},
resetAnalogeEingaenge(state) {
Object.keys(state).forEach((key) => {
state[key as keyof AnalogeEingaengeState] = {
...defaultAnalogerEingang,
};
});
},
},
extraReducers: (builder) => {
builder.addCase(loadFromWindow.fulfilled, (state, action) => {
Object.assign(state, action.payload);
});
},
});
export const { setAnalogerEingang, resetAnalogeEingaenge } =
analogeEingaengeSlice.actions;
export default analogeEingaengeSlice.reducer;

View File

@@ -1,12 +1,8 @@
// redux/slices/variablesSlice.ts
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { DataTDR } from "../types/chartDataTypesTDR";
// Typ für den State
export interface VariablesState {
selectedChartData: DataTDR[] | null;
selectedFileName: string | null;
//------------
kueBezeichnungen: string[];
isolationsgrenzwerte: number[];
verzoegerung: number[];
@@ -40,20 +36,10 @@ export interface VariablesState {
kueOverflow: number[] | null;
tdrLast: string | null;
appVersion: string | null;
win_analogeEingaenge1: string | null;
win_analogeEingaenge2: string | null;
win_analogeEingaenge3: string | null;
win_analogeEingaenge4: string | null;
win_analogeEingaenge5: string | null;
win_analogeEingaenge6: string | null;
win_analogeEingaenge7: string | null;
win_analogeEingaenge8: string | null;
}
// Initialer Zustand
const initialState: VariablesState = {
selectedFileName: null,
selectedChartData: null,
kueBezeichnungen: [],
isolationsgrenzwerte: [],
verzoegerung: [],
@@ -86,14 +72,6 @@ const initialState: VariablesState = {
kueOverflow: null,
tdrLast: null,
appVersion: null,
win_analogeEingaenge1: null,
win_analogeEingaenge2: null,
win_analogeEingaenge3: null,
win_analogeEingaenge4: null,
win_analogeEingaenge5: null,
win_analogeEingaenge6: null,
win_analogeEingaenge7: null,
win_analogeEingaenge8: null,
};
// Slice erstellen
@@ -118,20 +96,9 @@ const variablesSlice = createSlice({
] as VariablesState[keyof VariablesState]) = value!;
});
},
setSelectedChartData(state, action: PayloadAction<DataTDR[] | null>) {
state.selectedChartData = action.payload;
},
setSelectedFileName(state, action: PayloadAction<string | null>) {
state.selectedFileName = action.payload;
},
},
});
export const {
setVariable,
setVariables,
setSelectedChartData,
setSelectedFileName,
} = variablesSlice.actions;
export const { setVariable, setVariables } = variablesSlice.actions;
export default variablesSlice.reducer;

View File

@@ -10,6 +10,7 @@ import dashboardReducer from "./slices/dashboardSlice";
import systemSettingsReducer from "./slices/systemSettingsSlice";
import opcuaSettingsReducer from "./slices/opcuaSettingsSlice";
import digitalOutputsReducer from "./slices/digitalOutputsSlice";
import analogeEingaengeReducer from "./slices/analogeEingaengeSlice";
const store = configureStore({
reducer: {
@@ -23,6 +24,7 @@ const store = configureStore({
systemSettings: systemSettingsReducer,
opcuaSettings: opcuaSettingsReducer,
digitalOutputs: digitalOutputsReducer,
analogeEingaenge: analogeEingaengeReducer,
},
});