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:
110
redux/slices/analogeEingaengeSlice.ts
Normal file
110
redux/slices/analogeEingaengeSlice.ts
Normal 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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user