mirror of
https://github.com/nasa/openmct.git
synced 2025-06-15 21:58:13 +00:00
* fix: update broken locator * update eslint package * first pass of lint fixes * update package * change ruleset * update component tests to match linting rules * driveby * start to factor out bad locators * update gauge component * update notebook snapshot drop area * Update plot aria * add draggable true to tree items * update package * driveby to remove dead code * unneeded * unneeded * tells a screenreader that this is a row and a cell * adds an id for dragondrops * this should be a button * first pass at fixing tooltip selectors * review comments * Updating more tests * update to remove expect expect given our use of check functions * add expand component * move role around * update more locators * force * new local storage * remove choochoo steps * test: do `lint:fix` and also add back accidentally removed code * test: add back more removed code * test: remove `unstable` annotation from tests which are not unstable * test: remove invalid test-- the "new" time conductor doesn't allow for millisecond changes in fixed time * test: fix unstable gauge test * test: remove useless asserts-- this was secretly non-functional. now that we've fixed it, it makes no sense and just fails * test: add back accidentally removed changes * test: revert changes that break test * test: more fixes * Remove all notion of the unstable/stable e2e tests * test: eviscerate the flake with FACTS and LOGIC * test: fix anotha one * lint fixes * test: no need to wait for save dialog * test: fix more tests * lint: fix more warnings * test: fix anotha one * test: use `toHaveLength` instead of `.length).toBe()` * test: stabilize tabs view example imagery test * fix: more tests be fixed * test: more `toHaveCount()`s please * test: revert more accidentally removed fixes * test: fix selector * test: fix anotha one * update lint rules to clean up bad locators in shared fixtures * update and remove bad appActions * test: fix some restricted notebook tests * test: mass find/replace to enforce `toHaveCount()` instead of `.count()).toBe()` * Remove some bad appActions and update text * test: fix da tree tests * test: await not await await * test: fix upload plan appAction and add a11y * Updating externalFixtures with best practice locators and add missing appAction framework tests * test: fix test * test: fix appAction test for plans * test: yum yum fix'em up and get rid of some dragon drops * fix: alas, a `.only()` got my hopes up that i was done fixing tests * test: add `setTimeConductorMode` test "suite" which covers most TC related appActions * test: fix arg * test(couchdb): fix some network tests via expect polling * Stabalize visual test * getCanasPixels * test: stabilize tooltip telemetry table test, better a11y for tooltips * chore: update to use `docker compose` instead of `docker-compose` * New rules, new tests, new me * fix sort order * test: add `waitForPlotsToRender` framework test, passthru timeout override * test: remove `clockOptions` test as we have `page.clock` now * test: refactor out `overrideClock` * test: use `clock.install` instead * test: use `clock.install` instead * time clock fix * test: fix timer tests * remove ever reference to old base fixture * test: stabilize restricted notebook test * lint fixes * test: use clock.install * update timelist * test: update visual tests to use `page.clock()`, update snapshots * test: stabilize tree renaming/reordering test * a11y: add aria-label and role=region to object view * refactor: use `dragTo` * refactor: use `dragTo`, other small fixes * test: use `page.clock()` to stabilize tooltip telemetry table test * test: use web-first assertion to stabilize staleness test * test: knock out a few more `page.click`s * test: destroy all `page.click()`s * refactor: consistently use `'Ok'` instead of `'OK'` and `'Ok'` mixed * test: remove gauge aria label * test: more test fixes * test: more fixes and refactors * docs: add comment * test: refactor all instances of `dragAndDrop` * test: remove redundant test (covered in previous test steps) * test: stabilize imagery operations tests for display layout * chore: remove bad unicorn rule * chore(lint): remove unused disable directives --------- Co-authored-by: Jesse Mazzella <jesse.d.mazzella@nasa.gov>
257 lines
8.6 KiB
Vue
257 lines
8.6 KiB
Vue
<!--
|
|
Open MCT, Copyright (c) 2014-2024, United States Government
|
|
as represented by the Administrator of the National Aeronautics and Space
|
|
Administration. All rights reserved.
|
|
|
|
Open MCT is licensed under the Apache License, Version 2.0 (the
|
|
"License"); you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
http://www.apache.org/licenses/LICENSE-2.0.
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
License for the specific language governing permissions and limitations
|
|
under the License.
|
|
|
|
Open MCT includes source code licensed under additional open source
|
|
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
this source code distribution or the Licensing information page available
|
|
at runtime from the About dialog for additional information.
|
|
-->
|
|
<template>
|
|
<div
|
|
class="c-plot-legend gl-plot-legend"
|
|
:class="{
|
|
'hover-on-plot': !!highlights.length,
|
|
'is-legend-hidden': isLegendHidden
|
|
}"
|
|
>
|
|
<button
|
|
class="c-plot-legend__view-control gl-plot-legend__view-control c-disclosure-triangle is-enabled"
|
|
:class="{ 'c-disclosure-triangle--expanded': isLegendExpanded }"
|
|
:aria-label="ariaLabelValue"
|
|
tabindex="0"
|
|
@click="toggleLegend"
|
|
></button>
|
|
|
|
<div class="c-plot-legend__wrapper" :class="{ 'is-cursor-locked': cursorLocked }">
|
|
<!-- COLLAPSED PLOT LEGEND -->
|
|
<div
|
|
v-if="!isLegendExpanded"
|
|
class="plot-wrapper-collapsed-legend"
|
|
aria-label="Plot Legend Collapsed"
|
|
:class="{ 'is-cursor-locked': cursorLocked }"
|
|
>
|
|
<div
|
|
class="c-state-indicator__alert-cursor-lock icon-cursor-lock"
|
|
title="Cursor is point locked. Click anywhere in the plot to unlock."
|
|
></div>
|
|
<PlotLegendItemCollapsed
|
|
v-for="(seriesObject, seriesIndex) in seriesModels"
|
|
:key="`${seriesObject.keyString}-${seriesIndex}-collapsed`"
|
|
:highlights="highlights"
|
|
:value-to-show-when-collapsed="valueToShowWhenCollapsed"
|
|
:series-key-string="seriesObject.keyString"
|
|
@legend-hover-changed="legendHoverChanged"
|
|
/>
|
|
</div>
|
|
<!-- EXPANDED PLOT LEGEND -->
|
|
<div
|
|
v-else
|
|
class="plot-wrapper-expanded-legend"
|
|
aria-label="Plot Legend Expanded"
|
|
:class="{ 'is-cursor-locked': cursorLocked }"
|
|
>
|
|
<div
|
|
class="c-state-indicator__alert-cursor-lock--verbose icon-cursor-lock"
|
|
title="Click anywhere in the plot to unlock."
|
|
>
|
|
Cursor locked to point
|
|
</div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th v-if="showTimestampWhenExpanded">Timestamp</th>
|
|
<th v-if="showValueWhenExpanded">Value</th>
|
|
<th v-if="showUnitsWhenExpanded">Unit</th>
|
|
<th v-if="showMinimumWhenExpanded" class="mobile-hide">Min</th>
|
|
<th v-if="showMaximumWhenExpanded" class="mobile-hide">Max</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<PlotLegendItemExpanded
|
|
v-for="(seriesObject, seriesIndex) in seriesModels"
|
|
:key="`${seriesObject.keyString}-${seriesIndex}-expanded`"
|
|
:series-key-string="seriesObject.keyString"
|
|
:highlights="highlights"
|
|
@legend-hover-changed="legendHoverChanged"
|
|
/>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import configStore from '../configuration/ConfigStore.js';
|
|
import eventHelpers from '../lib/eventHelpers.js';
|
|
import PlotLegendItemCollapsed from './PlotLegendItemCollapsed.vue';
|
|
import PlotLegendItemExpanded from './PlotLegendItemExpanded.vue';
|
|
|
|
export default {
|
|
components: {
|
|
PlotLegendItemExpanded,
|
|
PlotLegendItemCollapsed
|
|
},
|
|
inject: ['openmct', 'domainObject'],
|
|
props: {
|
|
cursorLocked: {
|
|
type: Boolean,
|
|
default() {
|
|
return false;
|
|
}
|
|
},
|
|
highlights: {
|
|
type: Array,
|
|
default() {
|
|
return [];
|
|
}
|
|
}
|
|
},
|
|
emits: ['legend-hover-changed', 'position', 'expanded'],
|
|
data() {
|
|
return {
|
|
isLegendExpanded: false,
|
|
seriesModels: [],
|
|
loaded: false
|
|
};
|
|
},
|
|
computed: {
|
|
ariaLabelValue() {
|
|
const name = this.domainObject.name ? ` ${this.domainObject.name}` : '';
|
|
|
|
return `${this.isLegendExpanded ? 'Collapse' : 'Expand'}${name} Legend`;
|
|
},
|
|
showUnitsWhenExpanded() {
|
|
return this.loaded && this.legend.get('showUnitsWhenExpanded') === true;
|
|
},
|
|
showMinimumWhenExpanded() {
|
|
return this.loaded && this.legend.get('showMinimumWhenExpanded') === true;
|
|
},
|
|
showMaximumWhenExpanded() {
|
|
return this.loaded && this.legend.get('showMaximumWhenExpanded') === true;
|
|
},
|
|
showValueWhenExpanded() {
|
|
return this.loaded && this.legend.get('showValueWhenExpanded') === true;
|
|
},
|
|
showTimestampWhenExpanded() {
|
|
return this.loaded && this.legend.get('showTimestampWhenExpanded') === true;
|
|
},
|
|
isLegendHidden() {
|
|
return this.loaded && this.legend.get('hideLegendWhenSmall') === true;
|
|
},
|
|
valueToShowWhenCollapsed() {
|
|
return this.loaded && this.legend.get('valueToShowWhenCollapsed');
|
|
}
|
|
},
|
|
created() {
|
|
eventHelpers.extend(this);
|
|
this.config = this.getConfig();
|
|
this.legend = this.config.legend;
|
|
this.seriesModels = [];
|
|
this.listenTo(this.config.legend, 'change:position', this.updatePosition, this);
|
|
|
|
if (this.domainObject.type === 'telemetry.plot.stacked') {
|
|
this.objectComposition = this.openmct.composition.get(this.domainObject);
|
|
this.objectComposition.on('add', this.addTelemetryObject);
|
|
this.objectComposition.on('remove', this.removeTelemetryObject);
|
|
this.objectComposition.load();
|
|
} else {
|
|
this.registerListeners(this.config);
|
|
}
|
|
this.listenTo(this.config.legend, 'change:expandByDefault', this.changeExpandDefault, this);
|
|
},
|
|
mounted() {
|
|
this.loaded = true;
|
|
this.isLegendExpanded = this.legend.get('expanded') === true;
|
|
this.$emit('expanded', this.isLegendExpanded);
|
|
this.updatePosition();
|
|
},
|
|
beforeUnmount() {
|
|
if (this.objectComposition) {
|
|
this.objectComposition.off('add', this.addTelemetryObject);
|
|
this.objectComposition.off('remove', this.removeTelemetryObject);
|
|
}
|
|
|
|
this.stopListening();
|
|
},
|
|
methods: {
|
|
changeExpandDefault() {
|
|
this.isLegendExpanded = this.config.legend.model.expandByDefault;
|
|
this.legend.set('expanded', this.isLegendExpanded);
|
|
this.$emit('expanded', this.isLegendExpanded);
|
|
},
|
|
getConfig() {
|
|
const configId = this.openmct.objects.makeKeyString(this.domainObject.identifier);
|
|
|
|
return configStore.get(configId);
|
|
},
|
|
addTelemetryObject(object) {
|
|
//get the config for each child
|
|
const configId = this.openmct.objects.makeKeyString(object.identifier);
|
|
const config = configStore.get(configId);
|
|
if (config) {
|
|
this.registerListeners(config);
|
|
}
|
|
},
|
|
removeTelemetryObject(identifier) {
|
|
const configId = this.openmct.objects.makeKeyString(identifier);
|
|
const config = configStore.get(configId);
|
|
if (config) {
|
|
config.series.forEach(this.removeSeries, this);
|
|
}
|
|
},
|
|
registerListeners(config) {
|
|
//listen to any changes to the telemetry endpoints that are associated with the child
|
|
this.listenTo(config.series, 'add', this.addSeries, this);
|
|
this.listenTo(config.series, 'remove', this.removeSeries, this);
|
|
config.series.forEach(this.addSeries, this);
|
|
},
|
|
addSeries(series) {
|
|
const existingSeries = this.getSeries(series.keyString);
|
|
if (existingSeries) {
|
|
return;
|
|
}
|
|
this.seriesModels.push(series);
|
|
},
|
|
removeSeries(plotSeries) {
|
|
this.stopListening(plotSeries);
|
|
|
|
const seriesIndex = this.seriesModels.findIndex(
|
|
(series) => series.keyString === plotSeries.keyString
|
|
);
|
|
this.seriesModels.splice(seriesIndex, 1);
|
|
},
|
|
getSeries(keyStringToFind) {
|
|
const foundSeries = this.seriesModels.find((series) => {
|
|
return series.keyString === keyStringToFind;
|
|
});
|
|
return foundSeries;
|
|
},
|
|
toggleLegend() {
|
|
this.isLegendExpanded = !this.isLegendExpanded;
|
|
this.legend.set('expanded', this.isLegendExpanded);
|
|
this.$emit('expanded', this.isLegendExpanded);
|
|
},
|
|
legendHoverChanged(data) {
|
|
this.$emit('legend-hover-changed', data);
|
|
},
|
|
updatePosition() {
|
|
this.$emit('position', this.legend.get('position'));
|
|
}
|
|
}
|
|
};
|
|
</script>
|