scribe data from Information tab for configuration tab

This commit is contained in:
Yinyin Liu 2026-03-24 12:12:34 +01:00
parent 8578b42503
commit f1cd5c0736
6 changed files with 101 additions and 89 deletions

View File

@ -702,6 +702,7 @@ export type ConfigurationValues = {
batteriesCountPerInverter: number[];
clusterNumber: number;
PvNumber: number;
pvCountPerInverter: number[];
controlPermission:boolean;
// For sodistoreHome-Sinexcel: TimeChargeDischarge mode

View File

@ -5,6 +5,7 @@ import {
CardContent,
CircularProgress,
Container,
Divider,
FormControl,
Grid,
IconButton,
@ -25,6 +26,7 @@ import axiosConfig from '../../../Resources/axiosConfig';
import { UserContext } from '../../../contexts/userContext';
import { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
import { I_Installation } from 'src/interfaces/InstallationTypes';
import { INSTALLATION_PRESETS } from '../Information/installationSetupUtils';
import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import {DateTimePicker } from '@mui/x-date-pickers';
@ -106,6 +108,8 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
batteriesCount: props.values.Config.BatteriesCount,
clusterNumber: props.values.Config.ClusterNumber ?? 1,
PvNumber: props.values.Config.PvNumber ?? 0,
pvCountPerInverter: (props.values.Config as any).PvCountPerInverter
?? Array(inverterNum).fill(props.values.Config.PvNumber ?? 0),
timeChargeandDischargePower: props.values.Config?.TimeChargeandDischargePower ?? 0,
startTimeChargeandDischargeDayandTime: (() => {
const raw = props.values.Config?.StartTimeChargeandDischargeDayandTime;
@ -251,6 +255,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
batteriesCount: formValues.batteriesCountPerInverter?.[0] ?? formValues.batteriesCount,
clusterNumber:formValues.clusterNumber,
PvNumber:formValues.PvNumber,
pvCountPerInverter: formValues.pvCountPerInverter,
timeChargeandDischargePower: formValues.timeChargeandDischargePower,
startTimeChargeandDischargeDayandTime: formValues.startTimeChargeandDischargeDayandTime
? new Date(formValues.startTimeChargeandDischargeDayandTime.getTime() - formValues.startTimeChargeandDischargeDayandTime.getTimezoneOffset() * 60000)
@ -416,7 +421,7 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
sx={{ transform: "scale(1.4)", marginLeft: "15px" }}
/>
}
sx={{ ml: 0 }}
label={
<FormattedMessage
id="controlPermission"
@ -426,99 +431,76 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
/>
</div>
<div style={{ marginBottom: '5px' }}>
<TextField
label={intl.formatMessage({ id: 'inverterNumber' })}
name="inverterNumber"
value={formValues.inverterNumber ?? ''}
onChange={(e) => {
setFormDirty(true);
const raw = e.target.value;
if (raw === '') {
setFormValues((prev) => ({ ...prev, inverterNumber: '' as any }));
return;
}
const parsed = parseInt(raw);
if (isNaN(parsed) || parsed < 1) return;
const currentArr = formValues.batteriesCountPerInverter || [1];
const newArr = Array.from({ length: parsed }, (_, i) => currentArr[i] ?? 1);
setFormValues((prev) => ({
...prev,
inverterNumber: parsed,
batteriesCountPerInverter: newArr,
}));
}}
fullWidth
/>
</div>
{Array.from({ length: formValues.inverterNumber ?? 1 }, (_, i) => (
<div key={`battCount_${i}`} style={{ marginBottom: '5px' }}>
<TextField
label={intl.formatMessage(
{ id: 'batteriesCountInInverter' },
{ number: i + 1 }
)}
name={`batteriesCountPerInverter_${i}`}
value={formValues.batteriesCountPerInverter?.[i] ?? ''}
onChange={(e) => {
setFormDirty(true);
const raw = e.target.value;
if (raw === '') {
setFormValues((prev) => {
const arr = [...(prev.batteriesCountPerInverter || [1])];
arr[i] = '' as any;
return { ...prev, batteriesCountPerInverter: arr };
});
return;
}
const parsed = parseInt(raw);
if (isNaN(parsed) || parsed < 1) return;
setFormValues((prev) => {
const arr = [...(prev.batteriesCountPerInverter || [1])];
arr[i] = parsed;
return { ...prev, batteriesCountPerInverter: arr };
});
}}
fullWidth
/>
</div>
))}
{device === 4 && (
<>
<div style={{ marginBottom: '5px' }}>
<TextField
label={
<FormattedMessage
id="clusterNumber"
defaultMessage="Cluster Number"
/>
}
name="clusterNumber"
value={formValues.clusterNumber}
onChange={handleChange}
fullWidth
/>
</div>
<div style={{ marginBottom: '5px' }}>
<TextField
label={
<FormattedMessage
id="PvNumber"
defaultMessage="PV Number"
/>
}
name="PvNumber"
value={formValues.PvNumber}
onChange={handleChange}
fullWidth
/>
</div>
<Typography variant="h6" sx={{ mt: 3, mb: 1 }}>
<FormattedMessage id="installationSetup" defaultMessage="Installation Setup" />
</Typography>
<Divider sx={{ mb: 2 }} />
</>
)}
{device === 4 && (() => {
const preset = INSTALLATION_PRESETS[props.installation.installationModel];
const inverterCount = preset ? preset.length : 1;
const pvStrings = (props.installation.pvStringsPerInverter || '')
.split(',')
.map((s) => s.trim())
.filter((s) => s !== '');
return (
<>
<div style={{ marginBottom: '5px' }}>
<TextField
label={intl.formatMessage({ id: 'inverterNumber' })}
value={inverterCount}
InputProps={{ readOnly: true }}
fullWidth
/>
</div>
{preset && preset.map((clusters, i) => {
const batteriesInInverter = clusters.reduce((a, b) => a + b, 0);
return (
<div key={`battCount_${i}`} style={{ marginBottom: '5px' }}>
<TextField
label={intl.formatMessage(
{ id: 'batteriesCountInInverter' },
{ number: i + 1 }
)}
value={batteriesInInverter}
InputProps={{ readOnly: true }}
fullWidth
/>
</div>
);
})}
{Array.from({ length: inverterCount }, (_, i) => (
<div key={`pvCount_${i}`} style={{ marginBottom: '5px' }}>
<TextField
label={intl.formatMessage(
{ id: 'pvInInverter' },
{ number: i + 1 }
)}
value={pvStrings[i] ?? 0}
InputProps={{ readOnly: true }}
fullWidth
/>
</div>
))}
</>
);
})()}
{device === 4 && (
<>
<Typography variant="h6" sx={{ mt: 3, mb: 1 }}>
<FormattedMessage id="batteryLimits" defaultMessage="Battery Limits" />
</Typography>
<Divider sx={{ mb: 2 }} />
</>
)}
<div style={{ marginBottom: '5px' }}>
{/*<TextField*/}
@ -574,6 +556,15 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
/>
</div>
{device === 4 && (
<>
<Typography variant="h6" sx={{ mt: 3, mb: 1 }}>
<FormattedMessage id="systemSettings" defaultMessage="System Settings" />
</Typography>
<Divider sx={{ mb: 2 }} />
</>
)}
<div style={{ marginBottom: '5px', marginTop: '10px' }}>
<FormControl fullWidth sx={{ marginLeft: 1, width: 390 }}>
<InputLabel

View File

@ -512,6 +512,11 @@
"powerPerInverterKW": "Leistung pro Wechselrichter (kW)",
"startDateTime": "Startdatum und -zeit (Startzeit < Stoppzeit)",
"stopDateTime": "Stoppdatum und -zeit (Startzeit < Stoppzeit)",
"installationSetup": "Installationseinrichtung",
"batteryLimits": "Batteriegrenzwerte",
"systemSettings": "Systemeinstellungen",
"pvPerInverter": "PV pro Wechselrichter",
"pvInInverter": "PV in Wechselrichter {number}",
"tourLanguageTitle": "Sprache",
"tourLanguageContent": "Wählen Sie Ihre bevorzugte Sprache. Die Oberfläche unterstützt Englisch, Deutsch, Französisch und Italienisch.",
"tourExploreTitle": "Installation erkunden",

View File

@ -260,6 +260,11 @@
"powerPerInverterKW": "Power per Inverter (kW)",
"startDateTime": "Start Date and Time (Start Time < Stop Time)",
"stopDateTime": "Stop Date and Time (Start Time < Stop Time)",
"installationSetup": "Installation Setup",
"batteryLimits": "Battery Limits",
"systemSettings": "System Settings",
"pvPerInverter": "PV per Inverter",
"pvInInverter": "PV in Inverter {number}",
"tourLanguageTitle": "Language",
"tourLanguageContent": "Choose your preferred language. The interface supports English, German, French, and Italian.",
"tourExploreTitle": "Explore an Installation",

View File

@ -512,6 +512,11 @@
"powerPerInverterKW": "Puissance par onduleur (kW)",
"startDateTime": "Date et heure de début (Début < Fin)",
"stopDateTime": "Date et heure de fin (Début < Fin)",
"installationSetup": "Configuration de l'installation",
"batteryLimits": "Limites de la batterie",
"systemSettings": "Paramètres système",
"pvPerInverter": "PV par onduleur",
"pvInInverter": "PV dans l'onduleur {number}",
"tourLanguageTitle": "Langue",
"tourLanguageContent": "Choisissez votre langue préférée. L'interface est disponible en anglais, allemand, français et italien.",
"tourExploreTitle": "Explorer une installation",

View File

@ -512,6 +512,11 @@
"powerPerInverterKW": "Potenza per inverter (kW)",
"startDateTime": "Data e ora di inizio (Inizio < Fine)",
"stopDateTime": "Data e ora di fine (Inizio < Fine)",
"installationSetup": "Configurazione dell'installazione",
"batteryLimits": "Limiti della batteria",
"systemSettings": "Impostazioni di sistema",
"pvPerInverter": "PV per inverter",
"pvInInverter": "PV nell'inverter {number}",
"tourLanguageTitle": "Lingua",
"tourLanguageContent": "Scegli la tua lingua preferita. L'interfaccia supporta inglese, tedesco, francese e italiano.",
"tourExploreTitle": "Esplora un'installazione",