From 30d7b39dd6e31cf425f94b8b5fc1234418dbf5cd Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 12:47:07 +0100 Subject: [PATCH 1/7] rename te bad filter to be a generic component --- .../bad.js => common/filters/radioButtonFilter.js} | 14 ++++++++------ .../ActiveColumns/qcFlagTypesActiveColumns.js | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) rename lib/public/components/Filters/{QcFlagTypesFilter/bad.js => common/filters/radioButtonFilter.js} (72%) diff --git a/lib/public/components/Filters/QcFlagTypesFilter/bad.js b/lib/public/components/Filters/common/filters/radioButtonFilter.js similarity index 72% rename from lib/public/components/Filters/QcFlagTypesFilter/bad.js rename to lib/public/components/Filters/common/filters/radioButtonFilter.js index 7378d18d0d..1b1d91d7ed 100644 --- a/lib/public/components/Filters/QcFlagTypesFilter/bad.js +++ b/lib/public/components/Filters/common/filters/radioButtonFilter.js @@ -11,16 +11,18 @@ * or submit itself to any jurisdiction. */ -import { radioButton } from '../../common/form/inputs/radioButton.js'; +import { radioButton } from '../../../common/form/inputs/radioButton.js'; import { h } from '/js/src/index.js'; /** - * Radiobutton filter for the qcFlag 'bad' filter - * @param {SelectionModel} selectionModel the a selectionmodel + * Radiobutton filter component + * + * @param {RadioSelectionModel} selectionModel the a selectionmodel + * @param {string} filterName the name of the filter * @return {vnode} A number of radiobuttons corresponding with the selection options */ -const badFilterRadioButtons = (selectionModel) => { - const name = 'badFilterRadio'; +const radioButtonFilter = (selectionModel, filterName) => { + const name = `${filterName}FilterRadio`; return h( '.form-group-header.flex-row.w-100', selectionModel.options.map((option) => { @@ -33,4 +35,4 @@ const badFilterRadioButtons = (selectionModel) => { ); }; -export default badFilterRadioButtons; +export default radioButtonFilter; diff --git a/lib/public/views/QcFlagTypes/ActiveColumns/qcFlagTypesActiveColumns.js b/lib/public/views/QcFlagTypes/ActiveColumns/qcFlagTypesActiveColumns.js index 9bed5b35a6..af1c8fe385 100644 --- a/lib/public/views/QcFlagTypes/ActiveColumns/qcFlagTypesActiveColumns.js +++ b/lib/public/views/QcFlagTypes/ActiveColumns/qcFlagTypesActiveColumns.js @@ -15,7 +15,7 @@ import { h } from '/js/src/index.js'; import { formatTimestamp } from '../../../utilities/formatting/formatTimestamp.js'; import { textFilter } from '../../../components/Filters/common/filters/textFilter.js'; import { qcFlagTypeColoredBadge } from '../../../components/qcFlags/qcFlagTypeColoredBadge.js'; -import badFilterRadioButtons from '../../../components/Filters/QcFlagTypesFilter/bad.js'; +import radioButtonFilter from '../../../components/Filters/common/filters/radioButtonFilter.js'; /** * List of active columns for a QC Flag Types table @@ -54,7 +54,7 @@ export const qcFlagTypesActiveColumns = { name: 'Bad', visible: true, sortable: true, - filter: ({ filteringModel }) => badFilterRadioButtons(filteringModel.get('bad')), + filter: ({ filteringModel }) => radioButtonFilter(filteringModel.get('bad'), 'bad'), classes: 'f6 w-5', format: (bad) => bad ? h('.danger', 'Yes') : h('.success', 'No'), }, From bdba964531c1e468135e66b6d3df55d0627ddc95 Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 13:08:03 +0100 Subject: [PATCH 2/7] feat: replace qcFlagType bad filter with radioButtonFilterModel --- .../Filters/common/RadioButtonFilterModel.js | 34 +++++++++++++++++++ .../Overview/QcFlagTypesOverviewModel.js | 9 ++--- 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 lib/public/components/Filters/common/RadioButtonFilterModel.js diff --git a/lib/public/components/Filters/common/RadioButtonFilterModel.js b/lib/public/components/Filters/common/RadioButtonFilterModel.js new file mode 100644 index 0000000000..5e93205bfc --- /dev/null +++ b/lib/public/components/Filters/common/RadioButtonFilterModel.js @@ -0,0 +1,34 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { SelectionModel } from '../../common/selection/SelectionModel.js'; + +/** + * Model for managing a radiobutton view and state + */ +export class RadioButtonFilterModel extends SelectionModel { + /** + * Constructor + * + * @param {SelectionOption[]} [availableOptions] the list of possible operators + * @param {function} [setDefault] function that selects the default from the list of available options. Selects first entry by default + */ + constructor(availableOptions, setDefault = (options) => [options[0]]) { + super({ + availableOptions, + defaultSelection: setDefault(availableOptions), + multiple: false, + allowEmpty: false, + }); + } +} diff --git a/lib/public/views/QcFlagTypes/Overview/QcFlagTypesOverviewModel.js b/lib/public/views/QcFlagTypes/Overview/QcFlagTypesOverviewModel.js index cc4ced6716..72abce90f5 100644 --- a/lib/public/views/QcFlagTypes/Overview/QcFlagTypesOverviewModel.js +++ b/lib/public/views/QcFlagTypes/Overview/QcFlagTypesOverviewModel.js @@ -13,9 +13,9 @@ import { TextTokensFilterModel } from '../../../components/Filters/common/filters/TextTokensFilterModel.js'; import { OverviewPageModel } from '../../../models/OverviewModel.js'; -import { SelectionModel } from '../../../components/common/selection/SelectionModel.js'; import { buildUrl } from '/js/src/index.js'; import { FilteringModel } from '../../../components/Filters/common/FilteringModel.js'; +import { RadioButtonFilterModel } from '../../../components/Filters/common/RadioButtonFilterModel.js'; /** * QcFlagTypesOverviewModel @@ -30,12 +30,7 @@ export class QcFlagTypesOverviewModel extends OverviewPageModel { this._filteringModel = new FilteringModel({ names: new TextTokensFilterModel(), methods: new TextTokensFilterModel(), - bad: new SelectionModel({ - availableOptions: [{ label: 'Any' }, { label: 'Bad', value: true }, { label: 'Not Bad', value: false }], - defaultSelection: [{ label: 'Any' }], - allowEmpty: false, - multiple: false, - }), + bad: new RadioButtonFilterModel([{ label: 'Any' }, { label: 'Bad', value: true }, { label: 'Not Bad', value: false }]), }); this._filteringModel.observe(() => { From 4790d309f15f501e365eb984b811bc26652acd22 Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 13:20:30 +0100 Subject: [PATCH 3/7] feat: replace ddflp's filter component with the common radiButton componnent --- .../Runs/ActiveColumns/runsActiveColumns.js | 3 +- .../views/Runs/Overview/RunsOverviewModel.js | 37 ++----------------- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js index eefe0f006f..484cb5d8b2 100644 --- a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js +++ b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js @@ -48,6 +48,7 @@ import { rawTextFilter } from '../../../components/Filters/common/filters/rawTex import { numericalComparisonFilter } from '../../../components/Filters/common/filters/numericalComparisonFilter.js'; import { checkboxes } from '../../../components/Filters/common/filters/checkboxFilter.js'; import { triggerValueFilter } from '../../../components/Filters/RunsFilter/triggerValueFilter.js'; +import radioButtonFilter from '../../../components/Filters/common/filters/radioButtonFilter.js'; /** * List of active columns for a generic runs table @@ -525,7 +526,7 @@ export const runsActiveColumns = { classes: 'w-2 f6 w-wrapped', format: (boolean) => boolean ? 'On' : 'Off', exportFormat: (boolean) => boolean ? 'On' : 'Off', - filter: ddflpFilter, + filter: ({ filteringModel }) => radioButtonFilter(filteringModel.get('ddflp'), 'ddFlp'), }, dcs: { name: 'DCS', diff --git a/lib/public/views/Runs/Overview/RunsOverviewModel.js b/lib/public/views/Runs/Overview/RunsOverviewModel.js index 0249c66085..a8855d776c 100644 --- a/lib/public/views/Runs/Overview/RunsOverviewModel.js +++ b/lib/public/views/Runs/Overview/RunsOverviewModel.js @@ -36,6 +36,7 @@ import { DataExportModel } from '../../../models/DataExportModel.js'; import { runsActiveColumns as dataExportConfiguration } from '../ActiveColumns/runsActiveColumns.js'; import { BeamModeFilterModel } from '../../../components/Filters/RunsFilter/BeamModeFilterModel.js'; import { beamModesProvider } from '../../../services/beamModes/beamModesProvider.js'; +import { RadioButtonFilterModel } from '../../../components/Filters/common/RadioButtonFilterModel.js'; /** * Model representing handlers for runs page @@ -90,6 +91,7 @@ export class RunsOverviewModel extends OverviewPageModel { inelasticInteractionRateAtStart: new NumericalComparisonFilterModel(), inelasticInteractionRateAtMid: new NumericalComparisonFilterModel(), inelasticInteractionRateAtEnd: new NumericalComparisonFilterModel(), + ddflp: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), }); this._filteringModel.observe(() => this._applyFilters(true)); @@ -147,8 +149,6 @@ export class RunsOverviewModel extends OverviewPageModel { this._triggerValuesFilters = new Set(); - this.ddflpFilter = ''; - this.dcsFilter = ''; this.epnFilter = ''; @@ -165,7 +165,6 @@ export class RunsOverviewModel extends OverviewPageModel { isAnyFilterActive() { return this._filteringModel.isAnyFilterActive() || this._triggerValuesFilters.size !== 0 - || this.ddflpFilter !== '' || this.dcsFilter !== '' || this.epnFilter !== ''; } @@ -197,34 +196,6 @@ export class RunsOverviewModel extends OverviewPageModel { this._applyFilters(); } - /** - * Returns the boolean of ddflp - * @return {Boolean} if ddflp is on - */ - getDdflpFilterOperation() { - return this.ddflpFilter; - } - - /** - * Sets the boolean of the filter if no new inputs were detected for 200 milliseconds - * @param {boolean} operation if the ddflp is on - * @return {undefined} - */ - setDdflpFilterOperation(operation) { - this.ddflpFilter = operation; - this._applyFilters(); - } - - /** - * Unchecks the ddflp checkbox and fetches all the runs. - * @return {undefined} - * - */ - removeDdflp() { - this.ddflpFilter = ''; - this._applyFilters(); - } - /** * Returns the boolean of dcs * @return {Boolean} if dcs is on @@ -291,9 +262,7 @@ export class RunsOverviewModel extends OverviewPageModel { ...this._triggerValuesFilters.size !== 0 && { 'filter[triggerValues]': Array.from(this._triggerValuesFilters).join(), }, - ...(this.ddflpFilter === true || this.ddflpFilter === false) && { - 'filter[ddflp]': this.ddflpFilter, - }, + 'filter[ddflp]': this._filteringModel.get('ddflp').normalized, ...(this.dcsFilter === true || this.dcsFilter === false) && { 'filter[dcs]': this.dcsFilter, }, From 3cf6c1b9e49eabe9a5323cbc003bba0fdbbb5c81 Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 13:38:32 +0100 Subject: [PATCH 4/7] feat: replace ddflp's filter component with the common radioButton componnent --- .../Runs/ActiveColumns/runsActiveColumns.js | 2 +- .../views/Runs/Overview/RunsOverviewModel.js | 32 +------------------ 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js index 484cb5d8b2..a6bc04119a 100644 --- a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js +++ b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js @@ -535,7 +535,7 @@ export const runsActiveColumns = { classes: 'w-2 f6 w-wrapped', format: (boolean) => boolean ? 'On' : 'Off', exportFormat: (boolean) => boolean ? 'On' : 'Off', - filter: dcsFilter, + filter: ({ filteringModel }) => radioButtonFilter(filteringModel.get('dcs'), 'dcs'), }, triggerValue: { name: 'TRG', diff --git a/lib/public/views/Runs/Overview/RunsOverviewModel.js b/lib/public/views/Runs/Overview/RunsOverviewModel.js index a8855d776c..1f520fce70 100644 --- a/lib/public/views/Runs/Overview/RunsOverviewModel.js +++ b/lib/public/views/Runs/Overview/RunsOverviewModel.js @@ -92,6 +92,7 @@ export class RunsOverviewModel extends OverviewPageModel { inelasticInteractionRateAtMid: new NumericalComparisonFilterModel(), inelasticInteractionRateAtEnd: new NumericalComparisonFilterModel(), ddflp: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), + dcs: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), }); this._filteringModel.observe(() => this._applyFilters(true)); @@ -196,33 +197,6 @@ export class RunsOverviewModel extends OverviewPageModel { this._applyFilters(); } - /** - * Returns the boolean of dcs - * @return {Boolean} if dcs is on - */ - getDcsFilterOperation() { - return this.dcsFilter; - } - - /** - * Sets the boolean of the filter if no new inputs were detected for 200 milliseconds - * @param {boolean} operation if the dcs is on - * @return {undefined} - */ - setDcsFilterOperation(operation) { - this.dcsFilter = operation; - this._applyFilters(); - } - - /** - * Unchecks the dcs checkbox and fetches all the runs. - * @return {undefined} - */ - removeDcs() { - this.dcsFilter = ''; - this._applyFilters(); - } - /** * Returns the boolean of epn * @return {Boolean} if epn is on @@ -262,10 +236,6 @@ export class RunsOverviewModel extends OverviewPageModel { ...this._triggerValuesFilters.size !== 0 && { 'filter[triggerValues]': Array.from(this._triggerValuesFilters).join(), }, - 'filter[ddflp]': this._filteringModel.get('ddflp').normalized, - ...(this.dcsFilter === true || this.dcsFilter === false) && { - 'filter[dcs]': this.dcsFilter, - }, ...(this.epnFilter === true || this.epnFilter === false) && { 'filter[epn]': this.epnFilter, }, From 17a4ce87b2f241eb1596427b115dcabcda573a0d Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 13:44:02 +0100 Subject: [PATCH 5/7] feat: replace epn's filter component with the common radioButton componnent --- .../Runs/ActiveColumns/runsActiveColumns.js | 5 +-- .../views/Runs/Overview/RunsOverviewModel.js | 40 +------------------ 2 files changed, 3 insertions(+), 42 deletions(-) diff --git a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js index a6bc04119a..aa0eced044 100644 --- a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js +++ b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js @@ -14,9 +14,6 @@ import { CopyToClipboardComponent, h } from '/js/src/index.js'; import { runNumbersFilter } from '../../../components/Filters/RunsFilter/runNumbersFilter.js'; import { displayRunEorReasonsOverview } from '../format/displayRunEorReasonOverview.js'; -import ddflpFilter from '../../../components/Filters/RunsFilter/ddflp.js'; -import dcsFilter from '../../../components/Filters/RunsFilter/dcs.js'; -import epnFilter from '../../../components/Filters/RunsFilter/epn.js'; import { formatTimestamp } from '../../../utilities/formatting/formatTimestamp.js'; import { displayRunDuration } from '../format/displayRunDuration.js'; import { frontLink } from '../../../components/common/navigation/frontLink.js'; @@ -552,7 +549,7 @@ export const runsActiveColumns = { classes: 'w-2 f6 w-wrapped', format: (boolean) => boolean ? 'On' : 'Off', exportFormat: (boolean) => boolean ? 'On' : 'Off', - filter: epnFilter, + filter: ({ filteringModel }) => radioButtonFilter(filteringModel.get('epn'), 'epn'), }, epnTopology: { name: 'EPN Topology', diff --git a/lib/public/views/Runs/Overview/RunsOverviewModel.js b/lib/public/views/Runs/Overview/RunsOverviewModel.js index 1f520fce70..2c37a3a2e4 100644 --- a/lib/public/views/Runs/Overview/RunsOverviewModel.js +++ b/lib/public/views/Runs/Overview/RunsOverviewModel.js @@ -93,6 +93,7 @@ export class RunsOverviewModel extends OverviewPageModel { inelasticInteractionRateAtEnd: new NumericalComparisonFilterModel(), ddflp: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), dcs: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), + epn: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), }); this._filteringModel.observe(() => this._applyFilters(true)); @@ -150,10 +151,6 @@ export class RunsOverviewModel extends OverviewPageModel { this._triggerValuesFilters = new Set(); - this.dcsFilter = ''; - - this.epnFilter = ''; - if (fetch) { this._applyFilters(true); } @@ -164,10 +161,7 @@ export class RunsOverviewModel extends OverviewPageModel { * @return {Boolean} If any filter is active */ isAnyFilterActive() { - return this._filteringModel.isAnyFilterActive() - || this._triggerValuesFilters.size !== 0 - || this.dcsFilter !== '' - || this.epnFilter !== ''; + return this._filteringModel.isAnyFilterActive() || this._triggerValuesFilters.size !== 0; } /** @@ -197,33 +191,6 @@ export class RunsOverviewModel extends OverviewPageModel { this._applyFilters(); } - /** - * Returns the boolean of epn - * @return {Boolean} if epn is on - */ - getEpnFilterOperation() { - return this.epnFilter; - } - - /** - * Sets the boolean of the filter if no new inputs were detected for 200 milliseconds - * @param {boolean} operation if the epn is on - * @return {undefined} - */ - setEpnFilterOperation(operation) { - this.epnFilter = operation; - this._applyFilters(); - } - - /** - * Unchecks the epn checkbox and fetches all the runs. - * @return {undefined} - */ - removeEpn() { - this.epnFilter = ''; - this._applyFilters(); - } - /** * Returns the list of URL params corresponding to the currently applied filter * @@ -236,9 +203,6 @@ export class RunsOverviewModel extends OverviewPageModel { ...this._triggerValuesFilters.size !== 0 && { 'filter[triggerValues]': Array.from(this._triggerValuesFilters).join(), }, - ...(this.epnFilter === true || this.epnFilter === false) && { - 'filter[epn]': this.epnFilter, - }, }; } From 1cd5603c8c42b54a365b0ef3d61bce74b0d4ddff Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Tue, 10 Mar 2026 17:31:11 +0100 Subject: [PATCH 6/7] feat: replace triggerValue's filter component with the standard selectionModel + checkboxes component --- .../common/selection/SelectionModel.js | 4 +- .../Runs/ActiveColumns/runsActiveColumns.js | 10 ++++- .../views/Runs/Overview/RunsOverviewModel.js | 42 +++---------------- test/public/runs/overview.test.js | 2 +- 4 files changed, 15 insertions(+), 43 deletions(-) diff --git a/lib/public/components/common/selection/SelectionModel.js b/lib/public/components/common/selection/SelectionModel.js index 18bbaf56eb..c19d6ff893 100644 --- a/lib/public/components/common/selection/SelectionModel.js +++ b/lib/public/components/common/selection/SelectionModel.js @@ -339,8 +339,6 @@ export class SelectionModel extends Observable { * @abstract */ get normalized() { - return (this._allowEmpty || this._multiple) - ? this._selectedOptions.join() - : this.current; + return (this._allowEmpty || this._multiple) ? this.selected.join() : this.current; } } diff --git a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js index aa0eced044..5bafc19895 100644 --- a/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js +++ b/lib/public/views/Runs/ActiveColumns/runsActiveColumns.js @@ -44,7 +44,6 @@ import { timeRangeFilter } from '../../../components/Filters/common/filters/time import { rawTextFilter } from '../../../components/Filters/common/filters/rawTextFilter.js'; import { numericalComparisonFilter } from '../../../components/Filters/common/filters/numericalComparisonFilter.js'; import { checkboxes } from '../../../components/Filters/common/filters/checkboxFilter.js'; -import { triggerValueFilter } from '../../../components/Filters/RunsFilter/triggerValueFilter.js'; import radioButtonFilter from '../../../components/Filters/common/filters/radioButtonFilter.js'; /** @@ -539,7 +538,14 @@ export const runsActiveColumns = { visible: true, profiles: [profiles.none, 'lhcFill', 'environment'], classes: 'w-5 f6 w-wrapped', - filter: triggerValueFilter, + + /** + * TriggerValue filter component + * + * @param {RunsOverviewModel} runsOverviewModel the runs overview model + * @return {Component} the trigger value filter component + */ + filter: ({ filteringModel }) => checkboxes(filteringModel.get('triggerValues')), format: (trgValue) => trgValue ? trgValue : '-', }, epn: { diff --git a/lib/public/views/Runs/Overview/RunsOverviewModel.js b/lib/public/views/Runs/Overview/RunsOverviewModel.js index 2c37a3a2e4..b5c400e5d2 100644 --- a/lib/public/views/Runs/Overview/RunsOverviewModel.js +++ b/lib/public/views/Runs/Overview/RunsOverviewModel.js @@ -37,6 +37,8 @@ import { runsActiveColumns as dataExportConfiguration } from '../ActiveColumns/r import { BeamModeFilterModel } from '../../../components/Filters/RunsFilter/BeamModeFilterModel.js'; import { beamModesProvider } from '../../../services/beamModes/beamModesProvider.js'; import { RadioButtonFilterModel } from '../../../components/Filters/common/RadioButtonFilterModel.js'; +import { SelectionModel } from '../../../components/common/selection/SelectionModel.js'; +import { TRIGGER_VALUES } from '../../../domain/enums/TriggerValue.js'; /** * Model representing handlers for runs page @@ -94,6 +96,7 @@ export class RunsOverviewModel extends OverviewPageModel { ddflp: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), dcs: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), epn: new RadioButtonFilterModel([{ label: 'ANY' }, { label: 'ON', value: true }, { label: 'OFF', value: false }]), + triggerValues: new SelectionModel({ availableOptions: TRIGGER_VALUES.map((value) => ({ label: value, value })) }), }); this._filteringModel.observe(() => this._applyFilters(true)); @@ -127,7 +130,7 @@ export class RunsOverviewModel extends OverviewPageModel { * @inheritdoc */ getRootEndpoint() { - return buildUrl('/api/runs', { ...this._getFilterQueryParams(), ...{ filter: this.filteringModel.normalized } }); + return buildUrl('/api/runs', { filter: this.filteringModel.normalized }); } /** @@ -149,8 +152,6 @@ export class RunsOverviewModel extends OverviewPageModel { resetFiltering(fetch = true) { this._filteringModel.reset(); - this._triggerValuesFilters = new Set(); - if (fetch) { this._applyFilters(true); } @@ -161,7 +162,7 @@ export class RunsOverviewModel extends OverviewPageModel { * @return {Boolean} If any filter is active */ isAnyFilterActive() { - return this._filteringModel.isAnyFilterActive() || this._triggerValuesFilters.size !== 0; + return this._filteringModel.isAnyFilterActive(); } /** @@ -173,39 +174,6 @@ export class RunsOverviewModel extends OverviewPageModel { return this._filteringModel; } - /** - * Getter for the trigger values filter Set - * @return {Set} set of trigger filter values - */ - get triggerValuesFilters() { - return this._triggerValuesFilters; - } - - /** - * Setter for trigger values filter, this replaces the current set - * @param {Array} newTriggerValues new Set of values - * @return {undefined} - */ - set triggerValuesFilters(newTriggerValues) { - this._triggerValuesFilters = new Set(newTriggerValues); - this._applyFilters(); - } - - /** - * Returns the list of URL params corresponding to the currently applied filter - * - * @return {Object} the URL params - * - * @private - */ - _getFilterQueryParams() { - return { - ...this._triggerValuesFilters.size !== 0 && { - 'filter[triggerValues]': Array.from(this._triggerValuesFilters).join(), - }, - }; - } - /** * Apply the current filtering and update the remote data list * diff --git a/test/public/runs/overview.test.js b/test/public/runs/overview.test.js index 807b821ffc..73f82d9ae3 100644 --- a/test/public/runs/overview.test.js +++ b/test/public/runs/overview.test.js @@ -600,7 +600,7 @@ module.exports = () => { it('Should successfully filter runs by their trigger value', async () => { await navigateToRunsOverview(page); - const filterInputSelectorPrefix = '#triggerValueCheckbox'; + const filterInputSelectorPrefix = '#checkboxes-checkbox-'; const offFilterSelector = `${filterInputSelectorPrefix}OFF`; const ltuFilterSelector = `${filterInputSelectorPrefix}LTU`; From 4cea58dfa2e94e8395dfd34dfe241a7bea7f3cb9 Mon Sep 17 00:00:00 2001 From: GuustMetz Date: Wed, 11 Mar 2026 08:29:46 +0100 Subject: [PATCH 7/7] chore: remove unused components --- .../components/Filters/RunsFilter/dcs.js | 50 ------------------- .../components/Filters/RunsFilter/ddflp.js | 50 ------------------- .../components/Filters/RunsFilter/epn.js | 50 ------------------- .../Filters/RunsFilter/triggerValueFilter.js | 21 -------- .../Filters/common/filters/checkboxFilter.js | 26 ---------- 5 files changed, 197 deletions(-) delete mode 100644 lib/public/components/Filters/RunsFilter/dcs.js delete mode 100644 lib/public/components/Filters/RunsFilter/ddflp.js delete mode 100644 lib/public/components/Filters/RunsFilter/epn.js delete mode 100644 lib/public/components/Filters/RunsFilter/triggerValueFilter.js diff --git a/lib/public/components/Filters/RunsFilter/dcs.js b/lib/public/components/Filters/RunsFilter/dcs.js deleted file mode 100644 index 590eb81b78..0000000000 --- a/lib/public/components/Filters/RunsFilter/dcs.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright CERN and copyright holders of ALICE Trg. This software is - * distributed under the terms of the GNU General Public License v3 (GPL - * Version 3), copied verbatim in the file "COPYING". - * - * See http://alice-Trg.web.cern.ch/license for full licensing information. - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { radioButton } from '../../common/form/inputs/radioButton.js'; -import { h } from '/js/src/index.js'; - -/** - * Filter panel for DCS toggle; ON/OFF/ANY - * @param {RunsOverviewModel} runModel the run model object - * @return {vnode} Three radio buttons inline - */ -const dcsOperationRadioButtons = (runModel) => { - const state = runModel.getDcsFilterOperation(); - const name = 'dcsFilterRadio'; - const labelAny = 'ANY'; - const labelOff = 'OFF'; - const labelOn = 'ON'; - return h('.form-group-header.flex-row.w-100', [ - radioButton({ - label: labelAny, - isChecked: state === '', - action: () => runModel.removeDcs(), - name, - }), - radioButton({ - label: labelOff, - isChecked: state === false, - action: () => runModel.setDcsFilterOperation(false), - name, - }), - radioButton({ - label: labelOn, - isChecked: state === true, - action: () => runModel.setDcsFilterOperation(true), - name, - }), - ]); -}; - -export default dcsOperationRadioButtons; diff --git a/lib/public/components/Filters/RunsFilter/ddflp.js b/lib/public/components/Filters/RunsFilter/ddflp.js deleted file mode 100644 index 74bf28f4ba..0000000000 --- a/lib/public/components/Filters/RunsFilter/ddflp.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright CERN and copyright holders of ALICE Trg. This software is - * distributed under the terms of the GNU General Public License v3 (GPL - * Version 3), copied verbatim in the file "COPYING". - * - * See http://alice-Trg.web.cern.ch/license for full licensing information. - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { radioButton } from '../../common/form/inputs/radioButton.js'; -import { h } from '/js/src/index.js'; - -/** - * Filter panel for Data Distribution toggle; ON/OFF/ANY - * @param {RunsOverviewModel} runModel the run model object - * @return {vnode} Three radio buttons inline - */ -const ddflpOperationRadioButtons = (runModel) => { - const state = runModel.getDdflpFilterOperation(); - const name = 'ddFlpFilterRadio'; - const labelAny = 'ANY'; - const labelOff = 'OFF'; - const labelOn = 'ON'; - return h('.form-group-header.flex-row.w-100', [ - radioButton({ - label: labelAny, - isChecked: state === '', - action: () => runModel.removeDdflp(), - name, - }), - radioButton({ - label: labelOff, - isChecked: state === false, - action: () => runModel.setDdflpFilterOperation(false), - name, - }), - radioButton({ - label: labelOn, - isChecked: state === true, - action: () => runModel.setDdflpFilterOperation(true), - name, - }), - ]); -}; - -export default ddflpOperationRadioButtons; diff --git a/lib/public/components/Filters/RunsFilter/epn.js b/lib/public/components/Filters/RunsFilter/epn.js deleted file mode 100644 index 5e639d8afb..0000000000 --- a/lib/public/components/Filters/RunsFilter/epn.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright CERN and copyright holders of ALICE Trg. This software is - * distributed under the terms of the GNU General Public License v3 (GPL - * Version 3), copied verbatim in the file "COPYING". - * - * See http://alice-Trg.web.cern.ch/license for full licensing information. - * - * In applying this license CERN does not waive the privileges and immunities - * granted to it by virtue of its status as an Intergovernmental Organization - * or submit itself to any jurisdiction. - */ - -import { radioButton } from '../../common/form/inputs/radioButton.js'; -import { h } from '/js/src/index.js'; - -/** - * Filter panel for EPN toggle; ON/OFF/ANY - * @param {RunsOverviewModel} runModel the run model object - * @return {vnode} Three radio buttons inline - */ -const epnOperationRadioButtons = (runModel) => { - const state = runModel.getEpnFilterOperation(); - const name = 'epnFilterRadio'; - const labelAny = 'ANY'; - const labelOff = 'OFF'; - const labelOn = 'ON'; - return h('.form-group-header.flex-row.w-100', [ - radioButton({ - label: labelAny, - isChecked: state === '', - action: () => runModel.removeEpn(), - name, - }), - radioButton({ - label: labelOff, - isChecked: state === false, - action: () => runModel.setEpnFilterOperation(false), - name, - }), - radioButton({ - label: labelOn, - isChecked: state === true, - action: () => runModel.setEpnFilterOperation(true), - name, - }), - ]); -}; - -export default epnOperationRadioButtons; diff --git a/lib/public/components/Filters/RunsFilter/triggerValueFilter.js b/lib/public/components/Filters/RunsFilter/triggerValueFilter.js deleted file mode 100644 index 5addab02fe..0000000000 --- a/lib/public/components/Filters/RunsFilter/triggerValueFilter.js +++ /dev/null @@ -1,21 +0,0 @@ -import { checkboxFilter } from '../common/filters/checkboxFilter.js'; -import { TRIGGER_VALUES } from '../../../domain/enums/TriggerValue.js'; - -/** - * Returns a panel to be used by user to filter runs by trigger value - * @param {RunsOverviewModel} runModel The global model object - * @return {vnode} Multiple checkboxes for a user to select the values to be filtered. - */ -export const triggerValueFilter = (runModel) => checkboxFilter( - 'triggerValue', - TRIGGER_VALUES, - (value) => runModel.triggerValuesFilters.has(value), - (e, value) => { - if (e.target.checked) { - runModel.triggerValuesFilters.add(value); - } else { - runModel.triggerValuesFilters.delete(value); - } - runModel.triggerValuesFilters = Array.from(runModel.triggerValuesFilters); - }, -); diff --git a/lib/public/components/Filters/common/filters/checkboxFilter.js b/lib/public/components/Filters/common/filters/checkboxFilter.js index dcfcb4a95b..2cf550c091 100644 --- a/lib/public/components/Filters/common/filters/checkboxFilter.js +++ b/lib/public/components/Filters/common/filters/checkboxFilter.js @@ -14,32 +14,6 @@ import { h } from '/js/src/index.js'; -/** - * A general component for generating checkboxes. - * - * @param {string} name The general name of the element. - * @param {Array} values the list of options to display - * @param {function} isChecked true if the checkbox is checked, else false - * @param {function} onChange the handler called once the checkbox state changes (change event is passed as first parameter, value as second) - * @param {Object} [additionalProperties] Additional options that can be given to the class. - * @returns {vnode} An object that has one or multiple checkboxes. - * @deprecated use checkboxes - */ -export const checkboxFilter = (name, values, isChecked, onChange, additionalProperties) => - h('.flex-row.flex-wrap', values.map((value) => h('.form-check.flex-grow', [ - h('input.form-check-input', { - id: `${name}Checkbox${value}`, - class: name, - type: 'checkbox', - checked: isChecked(value), - onchange: (e) => onChange(e, value), - ...additionalProperties || {}, - }), - h('label.form-check-label', { - for: `${name}Checkbox${value}`, - }, value.toUpperCase()), - ]))); - /** * Display a filter composed of checkbox listing pre-defined options * @param {SelectionModel} selectionModel filter model