From c43ef64733cc96c5522f89b217a4534fdc36a7b8 Mon Sep 17 00:00:00 2001 From: "Jamie V." Date: Thu, 10 Oct 2024 14:24:31 -0700 Subject: [PATCH] [Telemetry Tables] Fix sort issues (#7875) * Issue where immutable objects sort order was not being set correctly in telemetry tables. * Configuration couldn't be saved and the sort order was not being saved in memory. * Telemetry was not being re-requested when the sort order of a table was changed and the table was in performance (limited) mode. * We've moved sort order to both configuration and in-memory and we will re-request telemetry if changing sort order in performance mode. --------- Co-authored-by: Andrew Henry --- src/plugins/telemetryTable/TelemetryTable.js | 26 +++++++------------ .../TelemetryTableConfiguration.js | 24 +++++++++++++++++ .../collections/TableRowCollection.js | 6 ++++- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/plugins/telemetryTable/TelemetryTable.js b/src/plugins/telemetryTable/TelemetryTable.js index dceaa9e605..028c706fc6 100644 --- a/src/plugins/telemetryTable/TelemetryTable.js +++ b/src/plugins/telemetryTable/TelemetryTable.js @@ -25,7 +25,7 @@ import _ from 'lodash'; import StalenessUtils from '../../utils/staleness.js'; import TableRowCollection from './collections/TableRowCollection.js'; -import { MODE, ORDER } from './constants.js'; +import { MODE } from './constants.js'; import TelemetryTableColumn from './TelemetryTableColumn.js'; import TelemetryTableConfiguration from './TelemetryTableConfiguration.js'; import TelemetryTableNameColumn from './TelemetryTableNameColumn.js'; @@ -130,14 +130,7 @@ export default class TelemetryTable extends EventEmitter { createTableRowCollections() { this.tableRows = new TableRowCollection(); - //Fetch any persisted default sort - let sortOptions = this.configuration.getConfiguration().sortOptions; - - //If no persisted sort order, default to sorting by time system, descending. - sortOptions = sortOptions || { - key: this.openmct.time.getTimeSystem().key, - direction: ORDER.DESCENDING - }; + const sortOptions = this.configuration.getSortOptions(); this.updateRowLimit(); @@ -172,8 +165,8 @@ export default class TelemetryTable extends EventEmitter { this.removeTelemetryCollection(keyString); - let sortOptions = this.configuration.getConfiguration().sortOptions; - requestOptions.order = sortOptions?.direction ?? ORDER.DESCENDING; // default to descending + let sortOptions = this.configuration.getSortOptions(); + requestOptions.order = sortOptions.direction; if (this.telemetryMode === MODE.PERFORMANCE) { requestOptions.size = this.rowLimit; @@ -442,12 +435,13 @@ export default class TelemetryTable extends EventEmitter { } sortBy(sortOptions) { - this.tableRows.sortBy(sortOptions); + this.configuration.setSortOptions(sortOptions); - if (this.openmct.editor.isEditing()) { - let configuration = this.configuration.getConfiguration(); - configuration.sortOptions = sortOptions; - this.configuration.updateConfiguration(configuration); + if (this.telemetryMode === MODE.PERFORMANCE) { + this.tableRows.setSortOptions(sortOptions); + this.clearAndResubscribe(); + } else { + this.tableRows.sortBy(sortOptions); } } diff --git a/src/plugins/telemetryTable/TelemetryTableConfiguration.js b/src/plugins/telemetryTable/TelemetryTableConfiguration.js index 6b9af55f14..1a94c96d23 100644 --- a/src/plugins/telemetryTable/TelemetryTableConfiguration.js +++ b/src/plugins/telemetryTable/TelemetryTableConfiguration.js @@ -23,7 +23,11 @@ import { EventEmitter } from 'eventemitter3'; import _ from 'lodash'; +import { ORDER } from './constants'; + export default class TelemetryTableConfiguration extends EventEmitter { + #sortOptions; + constructor(domainObject, openmct, options) { super(); @@ -44,6 +48,26 @@ export default class TelemetryTableConfiguration extends EventEmitter { this.notPersistable = !this.openmct.objects.isPersistable(this.domainObject.identifier); } + getSortOptions() { + return ( + this.#sortOptions || + this.getConfiguration().sortOptions || { + key: this.openmct.time.getTimeSystem().key, + direction: ORDER.DESCENDING + } + ); + } + + setSortOptions(sortOptions) { + this.#sortOptions = sortOptions; + + if (this.openmct.editor.isEditing()) { + let configuration = this.getConfiguration(); + configuration.sortOptions = sortOptions; + this.updateConfiguration(configuration); + } + } + getConfiguration() { let configuration = this.domainObject.configuration || {}; configuration.hiddenColumns = configuration.hiddenColumns || {}; diff --git a/src/plugins/telemetryTable/collections/TableRowCollection.js b/src/plugins/telemetryTable/collections/TableRowCollection.js index 20f294d3d7..1e9fcc2f2b 100644 --- a/src/plugins/telemetryTable/collections/TableRowCollection.js +++ b/src/plugins/telemetryTable/collections/TableRowCollection.js @@ -273,7 +273,7 @@ export default class TableRowCollection extends EventEmitter { */ sortBy(sortOptions) { if (arguments.length > 0) { - this.sortOptions = sortOptions; + this.setSortOptions(sortOptions); this.rows = _.orderBy( this.rows, (row) => row.getParsedValue(sortOptions.key), @@ -286,6 +286,10 @@ export default class TableRowCollection extends EventEmitter { return Object.assign({}, this.sortOptions); } + setSortOptions(sortOptions) { + this.sortOptions = sortOptions; + } + setColumnFilter(columnKey, filter) { filter = filter.trim().toLowerCase(); let wasBlank = this.columnFilters[columnKey] === undefined;