Merge remote-tracking branch 'origin/main'

This commit is contained in:
atef 2024-01-29 13:24:48 +01:00
commit 3b12425838
8 changed files with 262 additions and 223 deletions

View File

@ -24,8 +24,6 @@ public static partial class Db
.Last().Name;
Console.WriteLine("latestdb is "+latestDb);
//This is the file connection from the DbBackups folder
var fileConnection = new SQLiteConnection("DbBackups/" + latestDb);
@ -41,7 +39,8 @@ public static partial class Db
fileConnection.CreateTable<Error>();
fileConnection.CreateTable<Warning>();
return CopyDbToMemory(fileConnection);
return fileConnection;
//return CopyDbToMemory(fileConnection);
}
private static SQLiteConnection CopyDbToMemory(SQLiteConnection fileConnection)

View File

@ -83,7 +83,7 @@ public static class Program
private static Byte[] PackTar(String certificate, String certificateName, AsymmetricCipherKeyPair keys, String ip)
{
Console.WriteLine("packing tar");
Console.WriteLine("packing tar");
var publicKey = keys.Public .Apply(Pem.Encode);
var privateKey = keys.Private.Apply(Pem.Encode);

View File

@ -197,7 +197,7 @@ function Installation(props: singleInstallationProps) {
{openModalDeleteInstallation && (
<Modal
open={openModalDeleteInstallation}
onClose={() => setOpenModalDeleteInstallation(false)}
onClose={deleteInstallationModalHandleCancel}
aria-labelledby="error-modal"
aria-describedby="error-modal-description"
>

View File

@ -82,7 +82,7 @@ export const getChartOptions = (
}
},
{
seriesName: 'Pv Production',
seriesName: 'Grid Power',
show: false,
min:
chartInfo.min >= 0

View File

@ -1,6 +1,6 @@
import { Box, Card, Container, Grid, Modal, Typography } from '@mui/material';
import ReactApexChart from 'react-apexcharts';
import React, { useEffect, useState } from 'react';
import React, { useContext, useEffect, useState } from 'react';
import { I_S3Credentials } from 'src/interfaces/S3Types';
import { getChartOptions } from './chartOptions';
import {
@ -17,6 +17,7 @@ import { TimeSpan, UnixTime } from '../../../dataCache/time';
import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import dayjs from 'dayjs';
import { UserContext } from '../../../contexts/userContext';
interface OverviewProps {
s3Credentials: I_S3Credentials;
@ -39,6 +40,9 @@ const computeLast7Days = (): string[] => {
};
function Overview(props: OverviewProps) {
const context = useContext(UserContext);
const { currentUser, setUser } = context;
const [dailyData, setDailyData] = useState(true);
const [weeklyData, setWeeklyData] = useState(false);
const [weeklybalance, setWeeklyBalance] = useState([]);
@ -676,7 +680,7 @@ function Overview(props: OverviewProps) {
color: '#ff9900'
},
{
name: 'Balance',
name: 'Net Energy',
color: '#666666',
type: 'line',
data: weeklybalance
@ -713,7 +717,7 @@ function Overview(props: OverviewProps) {
type: 'bar'
},
{
name: 'Balance',
name: 'Net Energy',
type: 'line',
data: monthlybalance,
color: '#666666'
@ -727,6 +731,7 @@ function Overview(props: OverviewProps) {
</Grid>
</Grid>
)}
<Grid
container
direction="row"
@ -942,217 +947,220 @@ function Overview(props: OverviewProps) {
</Grid>
</Grid>
<Grid
container
direction="row"
justifyContent="center"
alignItems="stretch"
spacing={3}
>
<Grid item md={6} xs={12}>
<Card
sx={{
overflow: 'visible',
marginTop: '30px',
marginBottom: '30px'
}}
>
<Box
{currentUser.hasWriteAccess && (
<Grid
container
direction="row"
justifyContent="center"
alignItems="stretch"
spacing={3}
>
<Grid item md={6} xs={12}>
<Card
sx={{
marginLeft: '20px'
overflow: 'visible',
marginTop: '30px',
marginBottom: '30px'
}}
>
<Box display="flex" alignItems="center">
<Box>
<Typography variant="subtitle1" noWrap>
<FormattedMessage
id="pv_production"
defaultMessage="PV Production"
/>
</Typography>
</Box>
</Box>
<Box
sx={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start',
pt: 3
marginLeft: '20px'
}}
></Box>
</Box>
>
<Box display="flex" alignItems="center">
<Box>
<Typography variant="subtitle1" noWrap>
<FormattedMessage
id="pv_production"
defaultMessage="PV Production"
/>
</Typography>
</Box>
</Box>
<Box
sx={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start',
pt: 3
}}
></Box>
</Box>
{dailyData && (
<ReactApexChart
options={{
...getChartOptions(
dailyDataArray[chartState].chartOverview
.pvProduction,
'daily',
[]
),
chart: {
events: {
beforeZoom: handleBeforeZoom
}
}
}}
series={[
dailyDataArray[chartState].chartData.pvProduction
]}
type="area"
height={400}
/>
)}
{weeklyData && (
<ReactApexChart
options={{
...getChartOptions(
weeklyDataArray.chartOverview.pvProduction,
'weekly',
weeklyDateList
)
}}
series={[
{
...weeklyDataArray.chartData.pvProduction,
color: '#ff9900'
}
]}
type="bar"
height={400}
/>
)}
{monthlyData && (
<ReactApexChart
options={{
...getChartOptions(
monthlyDataArray.chartOverview.pvProduction,
'monthly',
monthlyDateList
)
}}
series={[
{
...monthlyDataArray.chartData.pvProduction,
color: '#ff9900'
}
]}
type="bar"
height={400}
/>
)}
</Card>
</Grid>
<Grid item md={6} xs={12}>
<Card
sx={{
overflow: 'visible',
marginTop: '30px',
marginBottom: '30px'
}}
>
<Box
sx={{
marginLeft: '20px'
}}
>
<Box display="flex" alignItems="center">
<Box>
<Typography variant="subtitle1" noWrap>
<FormattedMessage
id="grid_power"
defaultMessage={
dailyData ? 'Grid Power' : 'Grid Energy'
{dailyData && (
<ReactApexChart
options={{
...getChartOptions(
dailyDataArray[chartState].chartOverview
.pvProduction,
'daily',
[]
),
chart: {
events: {
beforeZoom: handleBeforeZoom
}
/>
</Typography>
</Box>
</Box>
}
}}
series={[
dailyDataArray[chartState].chartData.pvProduction
]}
type="area"
height={400}
/>
)}
{weeklyData && (
<ReactApexChart
options={{
...getChartOptions(
weeklyDataArray.chartOverview.pvProduction,
'weekly',
weeklyDateList
)
}}
series={[
{
...weeklyDataArray.chartData.pvProduction,
color: '#ff9900'
}
]}
type="bar"
height={400}
/>
)}
{monthlyData && (
<ReactApexChart
options={{
...getChartOptions(
monthlyDataArray.chartOverview.pvProduction,
'monthly',
monthlyDateList
)
}}
series={[
{
...monthlyDataArray.chartData.pvProduction,
color: '#ff9900'
}
]}
type="bar"
height={400}
/>
)}
</Card>
</Grid>
<Grid item md={6} xs={12}>
<Card
sx={{
overflow: 'visible',
marginTop: '30px',
marginBottom: '30px'
}}
>
<Box
sx={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start',
pt: 3
marginLeft: '20px'
}}
></Box>
</Box>
{dailyData && (
<ReactApexChart
options={{
...getChartOptions(
dailyDataArray[chartState].chartOverview.gridPower,
'daily',
[]
),
chart: {
events: {
beforeZoom: handleBeforeZoom
>
<Box display="flex" alignItems="center">
<Box>
<Typography variant="subtitle1" noWrap>
<FormattedMessage
id="grid_power"
defaultMessage={
dailyData ? 'Grid Power' : 'Grid Energy'
}
/>
</Typography>
</Box>
</Box>
<Box
sx={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-start',
pt: 3
}}
></Box>
</Box>
{dailyData && (
<ReactApexChart
options={{
...getChartOptions(
dailyDataArray[chartState].chartOverview
.gridPower,
'daily',
[]
),
chart: {
events: {
beforeZoom: handleBeforeZoom
}
}
}
}}
series={[
dailyDataArray[chartState].chartData.gridPower
]}
type="area"
height={400}
/>
)}
{weeklyData && (
<ReactApexChart
options={{
...getChartOptions(
weeklyDataArray.chartOverview.gridPower,
'weekly',
weeklyDateList
)
}}
series={[
{
...weeklyDataArray.chartData.gridImportPower,
color: '#b30000'
},
{
...weeklyDataArray.chartData.gridExportPower,
color: '#ff3333'
}
]}
type="bar"
height={400}
/>
)}
}}
series={[
dailyDataArray[chartState].chartData.gridPower
]}
type="area"
height={400}
/>
)}
{weeklyData && (
<ReactApexChart
options={{
...getChartOptions(
weeklyDataArray.chartOverview.gridPower,
'weekly',
weeklyDateList
)
}}
series={[
{
...weeklyDataArray.chartData.gridImportPower,
color: '#b30000'
},
{
...weeklyDataArray.chartData.gridExportPower,
color: '#ff3333'
}
]}
type="bar"
height={400}
/>
)}
{monthlyData && (
<ReactApexChart
options={{
...getChartOptions(
monthlyDataArray.chartOverview.gridPower,
'monthly',
monthlyDateList
)
}}
series={[
{
...monthlyDataArray.chartData.gridImportPower,
color: '#b30000'
},
{
...monthlyDataArray.chartData.gridExportPower,
color: '#ff3333'
}
]}
type="bar"
height={400}
/>
)}
</Card>
{monthlyData && (
<ReactApexChart
options={{
...getChartOptions(
monthlyDataArray.chartOverview.gridPower,
'monthly',
monthlyDateList
)
}}
series={[
{
...monthlyDataArray.chartData.gridImportPower,
color: '#b30000'
},
{
...monthlyDataArray.chartData.gridExportPower,
color: '#ff3333'
}
]}
type="bar"
height={400}
/>
)}
</Card>
</Grid>
</Grid>
</Grid>
)}
{dailyData && (
{dailyData && currentUser.hasWriteAccess && (
<Grid
container
direction="row"

View File

@ -38,12 +38,32 @@ function User(props: singleUserProps) {
const tokencontext = useContext(TokenContext);
const { removeToken } = tokencontext;
const tabs = [{ value: 'user', label: 'User' }];
const [openModalDeleteFolder, setOpenModalDeleteFolder] = useState(false);
const [openModalDeleteUser, setOpenModalDeleteUser] = useState(false);
useEffect(() => {
setFormValues(props.current_user);
}, [props.current_user]);
useEffect(() => {
// Use a timer to automatically close the Alert after 2 seconds
const timerId = setTimeout(() => {
setUpdated(false);
}, 2000);
// Clean up the timer when the component unmounts or when updated changes
return () => clearTimeout(timerId);
}, [updated]);
useEffect(() => {
// Use a timer to automatically close the Alert after 2 seconds
const timerId = setTimeout(() => {
setError(false);
}, 2000);
// Clean up the timer when the component unmounts or when updated changes
return () => clearTimeout(timerId);
}, [error]);
if (formValues == undefined) {
return null;
}
@ -60,21 +80,35 @@ function User(props: singleUserProps) {
[name]: value
});
};
const handleSubmit = (e) => {
const handleSubmit = async (e) => {
setLoading(true);
setError(false);
const res = await axiosConfig
.put(`/UpdateUser`, formValues)
.catch((err) => {
if (err.response) {
setError(true);
setLoading(false);
}
});
if (res) {
setUpdated(true);
setLoading(false);
}
};
const handleDelete = (e) => {
setLoading(true);
setError(false);
setOpenModalDeleteFolder(true);
setOpenModalDeleteUser(true);
};
const deleteUserModalHandleCancel = (e) => {
setLoading(false);
setError(false);
setOpenModalDeleteFolder(false);
setOpenModalDeleteUser(false);
};
const deleteUserModalHandle = (e) => {
@ -94,7 +128,7 @@ function User(props: singleUserProps) {
.catch((error) => {
setLoading(false);
setError(true);
setOpenModalDeleteFolder(false);
setOpenModalDeleteUser(false);
if (error.response && error.response.status == 401) {
removeToken();
}
@ -105,10 +139,10 @@ function User(props: singleUserProps) {
return (
<>
{openModalDeleteFolder && (
{openModalDeleteUser && (
<Modal
open={openModalDeleteFolder}
onClose={() => setOpenModalDeleteFolder(false)}
open={openModalDeleteUser}
onClose={deleteUserModalHandleCancel}
aria-labelledby="error-modal"
aria-describedby="error-modal-description"
>

View File

@ -5,8 +5,7 @@ import {
Grid,
IconButton,
InputAdornment,
TextField,
useTheme
TextField
} from '@mui/material';
import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone';
import FlatUsersView from './FlatUsersView';
@ -18,7 +17,6 @@ import { FormattedMessage } from 'react-intl';
import { Close as CloseIcon } from '@mui/icons-material';
function UsersSearch() {
const theme = useTheme();
const [searchTerm, setSearchTerm] = useState('');
const { availableUsers, fetchAvailableUsers } = useContext(AccessContext);
const [filteredData, setFilteredData] = useState(availableUsers);
@ -26,7 +24,7 @@ function UsersSearch() {
const context = useContext(UserContext);
const [userCreated, setUserCreated] = useState(false);
const [errorOccured, setErrorOccured] = useState(false);
const { currentUser, setUser } = context;
const { currentUser } = context;
useEffect(() => {
fetchAvailableUsers();
@ -54,7 +52,7 @@ function UsersSearch() {
setTimeout(() => {
setUserCreated(false);
}, 8000);
}, 2000);
};
const handleUserFormCancel = () => {
@ -66,7 +64,7 @@ function UsersSearch() {
setErrorOccured(true);
setTimeout(() => {
setErrorOccured(false);
}, 3000);
}, 2000);
};
const isMobile = window.innerWidth <= 1490;

View File

@ -312,13 +312,13 @@ export const transformInputToAggregatedData = async (
'temp6'
];
//while (currentDay.isBefore(currentDate)) {
for (let i = 0; i < 7; i++) {
while (currentDay.isBefore(currentDate)) {
//for (let i = 0; i < 7; i++) {
// console.log('Current day:', currentDay.format('YYYY-MM-DD'));
let result = await Promise.resolve(
//fetchDailyData(currentDay.format('YYYY-MM-DD'), s3Credentials)
fetchDailyData(fake_data[i], s3Credentials)
fetchDailyData(currentDay.format('YYYY-MM-DD'), s3Credentials)
//fetchDailyData(fake_data[i], s3Credentials)
);
if (
result === FetchResult.notAvailable ||