diff --git a/README.md b/README.md index 7161bcb10..7e7fa6b7f 100644 --- a/README.md +++ b/README.md @@ -128,10 +128,8 @@ The build includes a docker image build which may be easier to deploy. See [wodi ### Quickly test drive a feature branch -Use the `./scripts/run-version.sh` script +Use the `./scripts/run-version.sh` script setting the branch references for the app and api (defaults to main for both): ``` ./scripts/run-version.sh --app mrc-1234 --api mrc-2345 ``` - -setting the branch references for the app and api (defaults to main for both). diff --git a/app/static/package-lock.json b/app/static/package-lock.json index 97ca57d67..54aeea1aa 100644 --- a/app/static/package-lock.json +++ b/app/static/package-lock.json @@ -13,6 +13,7 @@ "@types/d3-format": "^3.0.1", "axios": "^0.26.0", "bootstrap": "^5.1.3", + "color": "^4.2.3", "csv-parse": "^5.2.1", "d3-format": "^3.1.0", "i18next": "^22.4.11", @@ -32,6 +33,7 @@ "devDependencies": { "@playwright/test": "1.37.0", "@types/bootstrap": "^5.2.6", + "@types/color": "^3.0.6", "@types/jest": "^27.4.0", "@types/markdown-it": "^12.2.3", "@types/plotly.js-basic-dist-min": "^2.12.1", @@ -3388,6 +3390,30 @@ "@popperjs/core": "^2.9.2" } }, + "node_modules/@types/color": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz", + "integrity": "sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==", + "dev": true, + "dependencies": { + "@types/color-convert": "*" + } + }, + "node_modules/@types/color-convert": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.3.tgz", + "integrity": "sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==", + "dev": true, + "dependencies": { + "@types/color-name": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==", + "dev": true + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -10102,20 +10128,21 @@ } }, "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10126,34 +10153,17 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -21904,6 +21914,31 @@ "node": ">=6.9.0" } }, + "node_modules/postcss-colormin/node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/postcss-colormin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-colormin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/postcss-colormin/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -25110,7 +25145,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -25118,8 +25152,7 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -32080,6 +32113,30 @@ "@popperjs/core": "^2.9.2" } }, + "@types/color": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz", + "integrity": "sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==", + "dev": true, + "requires": { + "@types/color-convert": "*" + } + }, + "@types/color-convert": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.3.tgz", + "integrity": "sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==", + "dev": true, + "requires": { + "@types/color-name": "*" + } + }, + "@types/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==", + "dev": true + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -37398,37 +37455,18 @@ } }, "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - } + "color-convert": "^2.0.1", + "color-string": "^1.9.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -37436,14 +37474,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -46863,6 +46899,31 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -49425,7 +49486,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -49433,8 +49493,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, diff --git a/app/static/package.json b/app/static/package.json index b68b3811a..b3b57a9e4 100644 --- a/app/static/package.json +++ b/app/static/package.json @@ -31,6 +31,7 @@ "@types/d3-format": "^3.0.1", "axios": "^0.26.0", "bootstrap": "^5.1.3", + "color": "^4.2.3", "csv-parse": "^5.2.1", "d3-format": "^3.1.0", "i18next": "^22.4.11", @@ -50,6 +51,7 @@ "devDependencies": { "@playwright/test": "1.37.0", "@types/bootstrap": "^5.2.6", + "@types/color": "^3.0.6", "@types/jest": "^27.4.0", "@types/markdown-it": "^12.2.3", "@types/plotly.js-basic-dist-min": "^2.12.1", diff --git a/app/static/src/app/components/GraphSettings.vue b/app/static/src/app/components/GraphSettings.vue new file mode 100644 index 000000000..29fe9aa45 --- /dev/null +++ b/app/static/src/app/components/GraphSettings.vue @@ -0,0 +1,76 @@ + + + diff --git a/app/static/src/app/components/WodinPlot.vue b/app/static/src/app/components/WodinPlot.vue index 025f98757..65917d6ed 100644 --- a/app/static/src/app/components/WodinPlot.vue +++ b/app/static/src/app/components/WodinPlot.vue @@ -10,14 +10,24 @@ - - diff --git a/app/static/src/app/components/fit/FitPlot.vue b/app/static/src/app/components/fit/FitPlot.vue index cef3f5d8d..a636ae3c1 100644 --- a/app/static/src/app/components/fit/FitPlot.vue +++ b/app/static/src/app/components/fit/FitPlot.vue @@ -5,6 +5,8 @@ :end-time="endTime" :plot-data="allPlotData" :redrawWatches="solution ? [solution] : []" + :fit-plot="true" + :graph-config="null" > diff --git a/app/static/src/app/components/graphConfig/GraphConfig.vue b/app/static/src/app/components/graphConfig/GraphConfig.vue new file mode 100644 index 000000000..ab3cf87ed --- /dev/null +++ b/app/static/src/app/components/graphConfig/GraphConfig.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/app/static/src/app/components/graphConfig/GraphConfigs.vue b/app/static/src/app/components/graphConfig/GraphConfigs.vue new file mode 100644 index 000000000..b4978216b --- /dev/null +++ b/app/static/src/app/components/graphConfig/GraphConfigs.vue @@ -0,0 +1,52 @@ + + + diff --git a/app/static/src/app/components/graphConfig/GraphConfigsCollapsible.vue b/app/static/src/app/components/graphConfig/GraphConfigsCollapsible.vue new file mode 100644 index 000000000..b70e17d81 --- /dev/null +++ b/app/static/src/app/components/graphConfig/GraphConfigsCollapsible.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/static/src/app/components/graphConfig/HiddenVariables.vue b/app/static/src/app/components/graphConfig/HiddenVariables.vue new file mode 100644 index 000000000..12282a6e6 --- /dev/null +++ b/app/static/src/app/components/graphConfig/HiddenVariables.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/app/static/src/app/components/graphConfig/utils.ts b/app/static/src/app/components/graphConfig/utils.ts new file mode 100644 index 000000000..dd407b790 --- /dev/null +++ b/app/static/src/app/components/graphConfig/utils.ts @@ -0,0 +1,5 @@ +import * as Color from "color"; + +export const fadeColor = (color: string): string => { + return Color(color).desaturate(0.6).fade(0.4).rgb().string(); +}; diff --git a/app/static/src/app/components/mixins/selectVariables.ts b/app/static/src/app/components/mixins/selectVariables.ts new file mode 100644 index 000000000..b3364c59a --- /dev/null +++ b/app/static/src/app/components/mixins/selectVariables.ts @@ -0,0 +1,88 @@ +import { Store } from "vuex"; +import { computed } from "vue"; +import { AppState } from "../../store/appState/state"; +import { GraphsAction } from "../../store/graphs/actions"; + +export interface SelectVariablesMixin { + startDrag: (evt: DragEvent, variable: string) => void; + endDrag: () => void; + onDrop: (evt: DragEvent) => void; + removeVariable: (srcGraphIdx: number, variable: string) => void; +} + +export default ( + store: Store, + emit: (event: string, ...args: unknown[]) => void, + hasHiddenVariables: boolean, + graphIndex?: number +): SelectVariablesMixin => { + const thisSrcGraphConfig = hasHiddenVariables ? "hidden" : graphIndex!.toString(); + + const startDrag = (event: DragEvent, variable: string) => { + const { dataTransfer, ctrlKey, metaKey } = event; + const copy = !hasHiddenVariables && (ctrlKey || metaKey); + dataTransfer!.dropEffect = "move"; + dataTransfer!.effectAllowed = "move"; + dataTransfer!.setData("variable", variable); + dataTransfer!.setData("srcGraphConfig", thisSrcGraphConfig); + dataTransfer!.setData("copyVar", copy.toString()); + + emit("setDragging", true); + }; + + const endDrag = () => { + emit("setDragging", false); + }; + + const updateSelectedVariables = (graphIdx: number, newVariables: string[]) => { + store.dispatch(`graphs/${GraphsAction.UpdateSelectedVariables}`, { + graphIndex: graphIdx, + selectedVariables: newVariables + }); + }; + + const removeVariable = (srcGraphIdx: number, variable: string) => { + const srcVariables = store.state.graphs.config[srcGraphIdx].selectedVariables.filter((v) => v !== variable); + updateSelectedVariables(srcGraphIdx, srcVariables); + }; + + const selectedVariables = computed(() => + hasHiddenVariables ? [] : store.state.graphs.config[graphIndex!].selectedVariables + ); + + const onDrop = (evt: DragEvent) => { + const { dataTransfer } = evt; + const variable = dataTransfer!.getData("variable"); + const srcGraphConfig = dataTransfer!.getData("srcGraphConfig"); + if (srcGraphConfig !== thisSrcGraphConfig) { + const copy = !hasHiddenVariables && dataTransfer!.getData("copyVar") === "true"; + + // add to this graph if necessary - do this before remove so, if a linked variable, it is not unlinked + if (!hasHiddenVariables && !selectedVariables.value.includes(variable)) { + const newVars = [...selectedVariables.value, variable]; + updateSelectedVariables(graphIndex!, newVars); + } + + if (srcGraphConfig !== "hidden" && !copy) { + // Remove variable from all graphs where it occurs if this is HiddenVariables, otherwise from source + // graph only + if (hasHiddenVariables) { + store.state.graphs.config.forEach((config, index) => { + if (config.selectedVariables.includes(variable)) { + removeVariable(index, variable); + } + }); + } else { + removeVariable(parseInt(srcGraphConfig, 10), variable); + } + } + } + }; + + return { + removeVariable, + startDrag, + endDrag, + onDrop + }; +}; diff --git a/app/static/src/app/components/options/GraphSettings.vue b/app/static/src/app/components/options/GraphSettings.vue deleted file mode 100644 index 7974c9e40..000000000 --- a/app/static/src/app/components/options/GraphSettings.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/app/static/src/app/components/options/OptionsTab.vue b/app/static/src/app/components/options/OptionsTab.vue index f271e5193..256ead221 100644 --- a/app/static/src/app/components/options/OptionsTab.vue +++ b/app/static/src/app/components/options/OptionsTab.vue @@ -16,9 +16,6 @@ - - - + + + + diff --git a/app/static/src/app/components/run/RunStochasticPlot.vue b/app/static/src/app/components/run/RunStochasticPlot.vue index a655090ef..5429f81d9 100644 --- a/app/static/src/app/components/run/RunStochasticPlot.vue +++ b/app/static/src/app/components/run/RunStochasticPlot.vue @@ -4,32 +4,52 @@ :placeholder-message="placeholderMessage" :end-time="endTime" :plot-data="allPlotData" - :redrawWatches="solution ? [solution] : []" + :redrawWatches="solution ? [solution, graphCount] : []" + :linked-x-axis="linkedXAxis" + :fit-plot="false" + :graph-index="graphIndex" + :graph-config="graphConfig" + @updateXAxis="updateXAxis" >