From a4f34d94d67b8d4a7de102d6d3d1ce4744fb5270 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 12:58:41 +0000 Subject: [PATCH 01/20] Bump http-cache-semantics from 4.1.0 to 4.1.1 Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1b6edb9..30076afb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3482,9 +3482,9 @@ "dev": true }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { "version": "5.0.0", @@ -9393,9 +9393,9 @@ "dev": true }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-proxy-agent": { "version": "5.0.0", From 2795af1e431f08feb258df70ae136e996c5c36ff Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Wed, 31 May 2023 14:35:19 +0300 Subject: [PATCH 02/20] Add runtime duration display for scenarios --- package.json | 3 ++ .../HelmetProject/HelmetProject.jsx | 10 ++++++ .../Runtime/RunStatus/RunStatus.jsx | 33 +++++++++++-------- .../HelmetProject/Runtime/Runtime.jsx | 4 ++- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 9a5cba3a..1d104990 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "dependencies": { "@electron/remote": "^2.0.8", "babel-standalone": "^6.26.0", + "chart.js": "^4.3.0", + "dayjs": "^1.11.7", "decompress": "^4.2.1", "del": "^6.1.0", "electron-dl": "^3.3.1", @@ -29,6 +31,7 @@ "nugget": "^2.0.2", "python-shell": "^3.0.1", "react": "^18.1.0", + "react-chartjs-2": "^5.2.0", "react-dom": "^18.1.0", "uuid": "^9.0.0", "vex-js": "^4.1.0" diff --git a/src/renderer/components/HelmetProject/HelmetProject.jsx b/src/renderer/components/HelmetProject/HelmetProject.jsx index f85ad2ad..e68fe57b 100644 --- a/src/renderer/components/HelmetProject/HelmetProject.jsx +++ b/src/renderer/components/HelmetProject/HelmetProject.jsx @@ -31,6 +31,8 @@ const HelmetProject = ({ const [statusState, setStatusState] = useState(null); const [statusLogfilePath, setStatusLogfilePath] = useState(null); const [statusReadyScenariosLogfiles, setStatusReadyScenariosLogfiles] = useState([]); // [{name: .., logfile: ..}] + const [statusRunStartTime, setStatusRunStartTime] = useState(null); //Updated when receiving "starting" message + const [statusRunFinishTime, setStatusRunFinishTime] = useState(null); //Updated when receiving "finished" message // Cost-Benefit Analysis (CBA) controls const [cbaOptions, setCbaOptions] = useState({}); @@ -287,6 +289,7 @@ const HelmetProject = ({ const onLoggableEvent = (event, args) => { setLogContents(previousLog => [...previousLog, args]); if (args.status) { + console.log(args); setStatusIterationsTotal(args.status['total']); setStatusIterationsCurrent(args.status['current']); setStatusIterationsCompleted(args.status['completed']); @@ -299,6 +302,11 @@ const HelmetProject = ({ name: args.status.name, logfile: args.status.log })) + setStatusRunFinishTime(args.time); + } + + if (args.status.state === 'starting') { + setStatusRunStartTime(args.time); } } }; @@ -349,6 +357,8 @@ const HelmetProject = ({ statusIterationsTotal={statusIterationsTotal} statusIterationsCompleted={statusIterationsCompleted} statusReadyScenariosLogfiles={statusReadyScenariosLogfiles} + statusRunStartTime={statusRunStartTime} + statusRunFinishTime={statusRunFinishTime} /> { +const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime}) => { + + const scatterPlotData = { + datasets: [{ + data: { + x: Array.from({ length: statusIterationsCompleted }), + + } + } + ] + } return (
{isScenarioRunning ? statusIterationsTotal ?
-
+
Valmiina   {statusIterationsCompleted} @@ -45,6 +50,8 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo > lokit +   + Ajoaika: { dayjs.duration(dayjs(statusRunFinishTime).diff(dayjs(statusRunStartTime))).format('HH[h]:mm[m]:ss[s]') }

})}
diff --git a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx index e6c933fa..182f2354 100644 --- a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx +++ b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx @@ -6,7 +6,7 @@ const Runtime = ({ reloadScenarios, handleClickScenarioToActive, handleClickNewScenario, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, - handleClickStartStop, + handleClickStartStop, statusRunStartTime, statusRunFinishTime, }) => { return (
@@ -88,6 +88,8 @@ const Runtime = ({ statusIterationsTotal={statusIterationsTotal} statusIterationsCompleted={statusIterationsCompleted} statusReadyScenariosLogfiles={statusReadyScenariosLogfiles} + statusRunStartTime={statusRunStartTime} + statusRunFinishTime={statusRunFinishTime} />
: @@ -41,18 +47,22 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo "" } {statusReadyScenariosLogfiles.map((readyScenario) => { - return

- {readyScenario.name} valmis -   - - lokit - -   - Ajoaika: { dayjs.duration(dayjs(statusRunFinishTime).diff(dayjs(statusRunStartTime))).format('HH[h]:mm[m]:ss[s]') } -

+ return ( +
+

+ {readyScenario.name} valmis +   + + lokit + +   + Ajoaika: { dayjs.duration(dayjs(statusRunFinishTime).diff(dayjs(statusRunStartTime))).format('HH[h]:mm[m]:ss[s]') } +

+ +
) })}
); diff --git a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx index 182f2354..56ba4f61 100644 --- a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx +++ b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx @@ -6,7 +6,7 @@ const Runtime = ({ reloadScenarios, handleClickScenarioToActive, handleClickNewScenario, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, - handleClickStartStop, statusRunStartTime, statusRunFinishTime, + handleClickStartStop, statusRunStartTime, statusRunFinishTime, demandConvergenceArray, }) => { return (
@@ -90,6 +90,7 @@ const Runtime = ({ statusReadyScenariosLogfiles={statusReadyScenariosLogfiles} statusRunStartTime={statusRunStartTime} statusRunFinishTime={statusRunFinishTime} + demandConvergenceArray={demandConvergenceArray} />
From ae7889682266dddaf6c0967d54b5c2c1dafdd1ed Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Mon, 5 Jun 2023 16:56:14 +0300 Subject: [PATCH 05/20] Tweak chart dataset to display correctly, clean up code to prevent magic words and numbers --- src/enums.js | 6 +++++ .../HelmetProject/HelmetProject.jsx | 8 +++--- .../Runtime/RunStatus/RunStatus.jsx | 26 +++++++++---------- .../HelmetProject/Runtime/Runtime.jsx | 3 ++- src/renderer/index.html | 1 + 5 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 src/enums.js diff --git a/src/enums.js b/src/enums.js new file mode 100644 index 00000000..07d632c9 --- /dev/null +++ b/src/enums.js @@ -0,0 +1,6 @@ +const SCENARIO_STATUS_STATE = { + STARTING: 'starting', + PREPARING: 'preparing', + RUNNING: 'running', + FINISHED: 'finished' +} \ No newline at end of file diff --git a/src/renderer/components/HelmetProject/HelmetProject.jsx b/src/renderer/components/HelmetProject/HelmetProject.jsx index d4b49a7a..65f1bbd2 100644 --- a/src/renderer/components/HelmetProject/HelmetProject.jsx +++ b/src/renderer/components/HelmetProject/HelmetProject.jsx @@ -302,7 +302,7 @@ const HelmetProject = ({ setStatusState(args.status['state']); setStatusLogfilePath(args.status['log']); - if (args.status.state === 'finished') { + if (args.status.state === SCENARIO_STATUS_STATE.FINISHED) { setStatusReadyScenariosLogfiles(statusReadyScenariosLogfiles.concat({ name: args.status.name, logfile: args.status.log @@ -310,10 +310,11 @@ const HelmetProject = ({ setStatusRunFinishTime(args.time); } - if (args.status.state === 'starting') { + if (args.status.state === SCENARIO_STATUS_STATE.STARTING) { setStatusRunStartTime(args.time); setStatusRunFinishTime(args.time); setDemandConvergenceArray([]); + setStatusIterationsTotal(0); } } if(args.level === 'INFO') { @@ -372,6 +373,7 @@ const HelmetProject = ({ statusReadyScenariosLogfiles={statusReadyScenariosLogfiles} statusRunStartTime={statusRunStartTime} statusRunFinishTime={statusRunFinishTime} + statusState={statusState} demandConvergenceArray={demandConvergenceArray} />
) -}; +}; \ No newline at end of file diff --git a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx index f27e0664..2c0f5d0f 100644 --- a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx +++ b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx @@ -9,13 +9,13 @@ dayjs.extend(relativeTime); ChartJS.register(LinearScale, LineElement, CategoryScale, PointElement, Tooltip); -const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime, demandConvergenceArray}) => { +const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime, statusState, demandConvergenceArray}) => { const graphData = { labels: demandConvergenceArray.map(listing => listing.iteration), datasets: [{ - label: 'Konvergenssi', - data: demandConvergenceArray.map(listing => listing.value), + label: 'Rel_Gap (%)', + data: demandConvergenceArray.map(listing => (listing.value * 100).toFixed(4)), backgroundColor: '#007AC9', borderColor: '#007AC9' } @@ -25,29 +25,27 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo legend: { display: true } - }, - tooltips: { - callbacks: { - label: (tooltipItem, data) => { - return "testi" - } - } - } + } } } return (
{ - statusIterationsTotal ? + (statusState === SCENARIO_STATUS_STATE.RUNNING || statusState === SCENARIO_STATUS_STATE.FINISHED) &&
 
- : - "" + } + { (statusState === SCENARIO_STATUS_STATE.PREPARING || statusState === SCENARIO_STATUS_STATE.STARTING) && + ( +
+

Starting python shell...

+
+ ) } {statusReadyScenariosLogfiles.map((readyScenario) => { return ( diff --git a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx index 56ba4f61..99a8b599 100644 --- a/src/renderer/components/HelmetProject/Runtime/Runtime.jsx +++ b/src/renderer/components/HelmetProject/Runtime/Runtime.jsx @@ -6,7 +6,7 @@ const Runtime = ({ reloadScenarios, handleClickScenarioToActive, handleClickNewScenario, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, - handleClickStartStop, statusRunStartTime, statusRunFinishTime, demandConvergenceArray, + handleClickStartStop, statusRunStartTime, statusRunFinishTime, statusState, demandConvergenceArray, }) => { return (
@@ -90,6 +90,7 @@ const Runtime = ({ statusReadyScenariosLogfiles={statusReadyScenariosLogfiles} statusRunStartTime={statusRunStartTime} statusRunFinishTime={statusRunFinishTime} + statusState={statusState} demandConvergenceArray={demandConvergenceArray} />
+ + {/* Choice whether to delete strategy files at the end of a model run */} +
+ +
+ { + scenario.overrideProjectSettingsForScenario && +
+ +
+ }
) From 8114c6ca5f350dc32d7666c97c2dcac02497b5dd Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Tue, 6 Jun 2023 17:06:55 +0300 Subject: [PATCH 07/20] Tweak styling --- .../HelmetProject/HelmetScenario/HelmetScenario.css | 12 ++++++++++++ .../HelmetProject/HelmetScenario/HelmetScenario.jsx | 9 +++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css index c4546f55..4c85eb19 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css @@ -137,4 +137,16 @@ span.Scenario__inline { .Scenario__radio-input { margin-right: 2em; +} + +#override-emme-python-path { + visibility: hidden; +} + +.override-setting { + margin-left: 5rem; +} + +.override-file-select-input { + width: 95%; } \ No newline at end of file diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx index 64c65c16..b717d190 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx @@ -242,13 +242,15 @@ const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, e { scenario.overrideProjectSettingsForScenario &&
-
} From 0418145dea1a4fd2fa450d27ef58b255c337a5bb Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Wed, 7 Jun 2023 17:20:37 +0300 Subject: [PATCH 08/20] Add rest of the override inputs, tweak error checking and dialog opening, tweak style --- .../HelmetProject/HelmetProject.jsx | 12 ++ .../HelmetScenario/HelmetScenario.css | 4 +- .../HelmetScenario/HelmetScenario.jsx | 148 +++++++++++++++--- 3 files changed, 139 insertions(+), 25 deletions(-) diff --git a/src/renderer/components/HelmetProject/HelmetProject.jsx b/src/renderer/components/HelmetProject/HelmetProject.jsx index 22d1b909..78b4502c 100644 --- a/src/renderer/components/HelmetProject/HelmetProject.jsx +++ b/src/renderer/components/HelmetProject/HelmetProject.jsx @@ -232,6 +232,18 @@ const HelmetProject = ({ 'message-from-ui-to-run-scenarios', scenariosToRun.map((s) => { // Run parameters per each run (enrich with global settings' paths to EMME python & HELMET model system) + + if (s.overrideProjectSettingsForScenario) { //If settings are overrided then check for them in the scenario object. Reverts to default settings if the override is not set + return { + ...s, + emme_python_path: s.overriddenProjectSettings.emmePythonPath ? s.overriddenProjectSettings.emmePythonPath : emmePythonPath, + helmet_scripts_path: s.overriddenProjectSettings.helmetScriptsPath ? s.overriddenProjectSettings.helmetScriptsPath : helmetScriptsPath, + base_data_folder_path: s.overriddenProjectSettings.basedataPath ? s.overriddenProjectSettings.basedataPath : basedataPath, + results_data_folder_path: s.overriddenProjectSettings.resultsPath ? s.overriddenProjectSettings.resultsPath : resultsPath, + log_level: 'DEBUG', + } + } + return { ...s, emme_python_path: emmePythonPath, diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css index 4c85eb19..8be4f6b8 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css @@ -139,7 +139,7 @@ span.Scenario__inline { margin-right: 2em; } -#override-emme-python-path { +.override-input { visibility: hidden; } @@ -148,5 +148,5 @@ span.Scenario__inline { } .override-file-select-input { - width: 95%; + width: 500px; } \ No newline at end of file diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx index b717d190..46e4733a 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx @@ -1,6 +1,5 @@ import React, {useState} from 'react'; import path from 'path'; -import { isNull } from 'util'; const {dialog} = require('@electron/remote'); const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, existingOtherNames, inheritedGlobalProjectSettings}) => { @@ -241,28 +240,131 @@ const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, e { scenario.overrideProjectSettingsForScenario && -
- +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
}
From 3be43e33d133cc1c4780c3608c926a131fc91c9b Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Thu, 8 Jun 2023 17:02:30 +0300 Subject: [PATCH 09/20] Add reset button for overrides, add button icon --- package.json | 1 + .../HelmetScenario/HelmetScenario.css | 18 +++++++ .../HelmetScenario/HelmetScenario.jsx | 53 ++++++++++++++++--- src/renderer/icons/ResetIcon.jsx | 7 +++ src/renderer/index.html | 3 +- 5 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 src/renderer/icons/ResetIcon.jsx diff --git a/package.json b/package.json index 9a5cba3a..2fd5fb52 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "dependencies": { "@electron/remote": "^2.0.8", "babel-standalone": "^6.26.0", + "classnames": "^2.3.2", "decompress": "^4.2.1", "del": "^6.1.0", "electron-dl": "^3.3.1", diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css index 8be4f6b8..aa97f9f7 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css @@ -149,4 +149,22 @@ span.Scenario__inline { .override-file-select-input { width: 500px; +} + +.override-is-default { + background-color: #767373; +} + +.inline-element { + display: inline !important; +} + +.override-reset-button { + width: fit-content; + height: fit-content; + border: none; +} + +.override-reset-icon { + margin-bottom: -10px; } \ No newline at end of file diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx index 46e4733a..188b0408 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx @@ -1,6 +1,7 @@ import React, {useState} from 'react'; import path from 'path'; const {dialog} = require('@electron/remote'); +const classNames = require('classnames'); const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, existingOtherNames, inheritedGlobalProjectSettings}) => { @@ -244,7 +245,15 @@ const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, e
) From 98999b8b71888b3b2223d3b9727397c9113d3345 Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Tue, 13 Jun 2023 16:19:31 +0300 Subject: [PATCH 14/20] Tweak styling and placement of documentation link --- src/renderer/components/App.css | 3 +-- src/renderer/icons/DocumentationIcon.jsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/App.css b/src/renderer/components/App.css index 721b560b..b6bfad09 100644 --- a/src/renderer/components/App.css +++ b/src/renderer/components/App.css @@ -113,8 +113,7 @@ hr { } .header-documentation-link { - margin-left: auto; - margin-right: 15%; + margin-left: 2rem; } .header-documentation-link:hover { diff --git a/src/renderer/icons/DocumentationIcon.jsx b/src/renderer/icons/DocumentationIcon.jsx index 5a13a070..b918bd3e 100644 --- a/src/renderer/icons/DocumentationIcon.jsx +++ b/src/renderer/icons/DocumentationIcon.jsx @@ -2,6 +2,6 @@ import React from 'react'; const DocumentationIcon = () => { return ( - + ) } \ No newline at end of file From 1fb5b9cf4e45f64fcb9d455c314b93fc3a7220fd Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Wed, 14 Jun 2023 13:23:24 +0300 Subject: [PATCH 15/20] Tweak chart configs, add axis titles --- .../Runtime/RunStatus/RunStatus.jsx | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx index 2c0f5d0f..556d0c9c 100644 --- a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx +++ b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx @@ -1,16 +1,51 @@ import React from 'react'; -import { Chart as ChartJS, LinearScale, LineElement, PointElement, CategoryScale, Tooltip } from "chart.js"; +import { Chart as ChartJS, LinearScale, LineElement, PointElement, CategoryScale, Tooltip, Legend, Title } from "chart.js"; import { Line } from 'react-chartjs-2'; import dayjs from 'dayjs'; var duration = require('dayjs/plugin/duration'); var relativeTime = require('dayjs/plugin/relativeTime'); dayjs.extend(duration); dayjs.extend(relativeTime); -ChartJS.register(LinearScale, LineElement, CategoryScale, PointElement, Tooltip); +ChartJS.register(LinearScale, LineElement, CategoryScale, PointElement, Tooltip, Legend, Title); const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime, statusState, demandConvergenceArray}) => { + const graphConfig = { + options: { + plugins: { + title: { + display: true, + text: 'Convergence', + align: 'Center' + }, + legend: { + display: false + } + }, + scales: { + y: { + title: { + display: true, + text: 'Rel_Gap [ % ]', + font: { + size: 16 + } + } + }, + x: { + title: { + display: true, + text: 'Iteration [ # ]', + font: { + size: 16 + } + } + } + } + }, + } + const graphData = { labels: demandConvergenceArray.map(listing => listing.iteration), datasets: [{ @@ -20,13 +55,6 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo borderColor: '#007AC9' } ], - options: { - plugins: { - legend: { - display: true - } - } - } } return ( @@ -35,7 +63,7 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo (statusState === SCENARIO_STATUS_STATE.RUNNING || statusState === SCENARIO_STATUS_STATE.FINISHED) &&
- +  
From fe2baddcf4f70f623a7bb785146d6a173ab34ac4 Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Wed, 14 Jun 2023 17:10:25 +0300 Subject: [PATCH 16/20] Center header doc link icon vertically --- src/renderer/components/App.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/App.css b/src/renderer/components/App.css index b6bfad09..55b9ba43 100644 --- a/src/renderer/components/App.css +++ b/src/renderer/components/App.css @@ -113,6 +113,7 @@ hr { } .header-documentation-link { + margin-top: .4rem; margin-left: 2rem; } From 44bfd2fb4fef4345038dac4663d45e3d9f7d1c76 Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Thu, 15 Jun 2023 10:21:40 +0300 Subject: [PATCH 17/20] Tweak styling of override settings --- .../HelmetProject/HelmetScenario/HelmetScenario.css | 2 +- .../HelmetProject/HelmetScenario/HelmetScenario.jsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css index 3e69a454..efb01774 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.css @@ -144,7 +144,7 @@ span.Scenario__inline { } .override-setting { - margin-left: 5rem; + padding-left: 0px !important; } .override-file-select-input { diff --git a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx index 197dbe90..7e921fbe 100644 --- a/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx +++ b/src/renderer/components/HelmetProject/HelmetScenario/HelmetScenario.jsx @@ -230,7 +230,7 @@ const HelmetScenario = ({projectPath, scenario, updateScenario, closeScenario, e

Skenaariokohtaiset yliajot

-
: ""; + + case "WARN": + return showWARN ? +
+ {`[${entry.level}] ${entry.message}`} +
+ : + ""; default: return
From b19735ee3db65b2191537fd38322ae0b8254cfc4 Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Mon, 19 Jun 2023 17:12:21 +0300 Subject: [PATCH 19/20] Add WARN log message filter, tweak styling --- .../components/HelmetProject/RunLog/RunLog.css | 8 +++++--- .../components/HelmetProject/RunLog/RunLog.jsx | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/HelmetProject/RunLog/RunLog.css b/src/renderer/components/HelmetProject/RunLog/RunLog.css index 43177980..55cee8a1 100644 --- a/src/renderer/components/HelmetProject/RunLog/RunLog.css +++ b/src/renderer/components/HelmetProject/RunLog/RunLog.css @@ -39,12 +39,14 @@ .Log__header-controls { display: flex; - justify-content: space-between; + justify-content: space-around; + align-content: center; + width: 100%; } .Log__header-control { - margin-right: 10px; - width: 100%; + max-width: 25%; + margin: .25rem; } .Log__header-control--on { background-color: #007AC9; diff --git a/src/renderer/components/HelmetProject/RunLog/RunLog.jsx b/src/renderer/components/HelmetProject/RunLog/RunLog.jsx index 62bc80b7..e85e13d6 100644 --- a/src/renderer/components/HelmetProject/RunLog/RunLog.jsx +++ b/src/renderer/components/HelmetProject/RunLog/RunLog.jsx @@ -4,6 +4,7 @@ const RunLog = ({isScenarioRunning, entries, closeRunLog}) => { const [showUIEVENT, setShowUIEVENT] = useState(true); const [showINFO, setShowINFO] = useState(true); + const [showWARN, setShowWARN] = useState(true); const [showERROR, setShowERROR] = useState(true); const [showDEBUG, setShowDEBUG] = useState(false); @@ -33,6 +34,11 @@ const RunLog = ({isScenarioRunning, entries, closeRunLog}) => { > ERROR +
: ""; + + case "WARN": + return showWARN ? +
+ {`[${entry.level}] ${entry.message}`} +
+ : + ""; default: return
From bf751417936171721f48af1bc802608f87837cf8 Mon Sep 17 00:00:00 2001 From: Erkki Halinen Date: Wed, 21 Jun 2023 12:41:31 +0300 Subject: [PATCH 20/20] #172: Add link to results folder when scenario run is finished --- .../components/HelmetProject/HelmetProject.jsx | 3 ++- .../Runtime/RunStatus/RunStatus.css | 9 +++++++++ .../Runtime/RunStatus/RunStatus.jsx | 18 ++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/HelmetProject/HelmetProject.jsx b/src/renderer/components/HelmetProject/HelmetProject.jsx index 40093de2..db24ebfd 100644 --- a/src/renderer/components/HelmetProject/HelmetProject.jsx +++ b/src/renderer/components/HelmetProject/HelmetProject.jsx @@ -313,7 +313,8 @@ const HelmetProject = ({ if (args.status.state === SCENARIO_STATUS_STATE.FINISHED) { setStatusReadyScenariosLogfiles(statusReadyScenariosLogfiles.concat({ name: args.status.name, - logfile: args.status.log + logfile: args.status.log, + resultsPath: args.status.log.match(new RegExp('((?:[^/]*/)*)(.*)')) })) setStatusRunFinishTime(args.time); } diff --git a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.css b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.css index 2de689e2..7c7bd6f9 100644 --- a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.css +++ b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.css @@ -26,4 +26,13 @@ } .Status__finished-scenario-logfile-link { + background-color: #007AC9; + display: inline; + color: white; + width: 8rem; +} + +.Status__finished-scenario-logfile-link:hover { + background-color: #0068ab !important; + color: white !important; } diff --git a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx index 556d0c9c..6f484a53 100644 --- a/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx +++ b/src/renderer/components/HelmetProject/Runtime/RunStatus/RunStatus.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { Chart as ChartJS, LinearScale, LineElement, PointElement, CategoryScale, Tooltip, Legend, Title } from "chart.js"; import { Line } from 'react-chartjs-2'; import dayjs from 'dayjs'; +const { shell } = require('electron'); var duration = require('dayjs/plugin/duration'); var relativeTime = require('dayjs/plugin/relativeTime'); dayjs.extend(duration); @@ -9,7 +10,7 @@ dayjs.extend(relativeTime); ChartJS.register(LinearScale, LineElement, CategoryScale, PointElement, Tooltip, Legend, Title); -const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime, statusState, demandConvergenceArray}) => { +const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCompleted, statusReadyScenariosLogfiles, statusRunStartTime, statusRunFinishTime, statusState, demandConvergenceArray }) => { const graphConfig = { options: { @@ -81,12 +82,17 @@ const RunStatus = ({isScenarioRunning, statusIterationsTotal, statusIterationsCo

{readyScenario.name} valmis   - shell.openPath(readyScenario.logfile)} > - lokit - + Lokit + +   +   Ajoaika: { dayjs.duration(dayjs(statusRunFinishTime).diff(dayjs(statusRunStartTime))).format('HH[h]:mm[m]:ss[s]') }