Skip to content

Commit 253d66f

Browse files
[OGUI-1766] Run mode checkout (#3054)
This PR updates the runs mode functionality by replacing the previous activation method with a checkbox, making it more intuitive for users to enter runs mode.
1 parent 51a6211 commit 253d66f

27 files changed

+545
-694
lines changed

QualityControl/public/common/filters/filterViews.js

Lines changed: 42 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
import { filterInput, dynamicSelector } from './filter.js';
1616
import { FilterType } from './filterTypes.js';
17-
import { filtersConfig } from './filtersConfig.js';
17+
import { filtersConfig, runModeFilterConfig } from './filtersConfig.js';
18+
import { runModeCheckbox } from './runMode/runModeCheckbox.js';
19+
import { runStatusPanel } from './runMode/runStatusPanel.js';
1820
import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js';
1921

2022
/**
@@ -27,16 +29,16 @@ import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js';
2729
* @returns {undefined}
2830
*/
2931
const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback, onChangeCallback) => {
30-
const { type, queryLabel, placeholder, id, inputType = 'text', options } = config;
32+
const { type, queryLabel, placeholder, id, inputType = 'text', options, width } = config;
3133
const commonConfig = {
3234
queryLabel,
3335
placeholder,
3436
id,
3537
filterMap,
3638
onInputCallback,
3739
onEnterCallback,
40+
width,
3841
};
39-
4042
switch (type) {
4143
case FilterType.INPUT: return filterInput({ ...commonConfig, type: inputType });
4244
case FilterType.DROPDOWN: return dynamicSelector({ ...commonConfig, options, onChangeCallback });
@@ -51,24 +53,41 @@ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback
5153
* @returns {vnode} - virtual node element
5254
*/
5355
export function filtersPanel(filterModel, viewModel) {
54-
const { filterMap, setFilterValue, filterService, isVisible, clearFilter } = filterModel;
56+
const {
57+
filterMap,
58+
setFilterValue,
59+
filterService,
60+
clearFilter,
61+
isRunModeActivated,
62+
runNumber,
63+
runStatus,
64+
isVisible,
65+
} = filterModel;
5566
const onInputCallback = setFilterValue.bind(filterModel);
5667
const onChangeCallback = setFilterValue.bind(filterModel);
5768
const onEnterCallback = () => filterModel.triggerFilter(viewModel);
5869
const clearFilterCallback = clearFilter.bind(filterModel, viewModel);
59-
const filtersList = filtersConfig(filterService);
60-
61-
if (!isVisible || filterModel.inRunMode) {
70+
if (!isVisible) {
6271
return null;
6372
}
73+
const filtersList = isRunModeActivated
74+
? runModeFilterConfig()
75+
: filtersConfig(filterService);
6476

6577
return h(
66-
'.w-100.flex-row.p2.g2.justify-center#filterElement',
78+
'.w-100.flex-column.p2.g2.justify-center#filterElement',
6779
[
68-
triggerFiltersButton(onEnterCallback, filterModel, viewModel),
69-
clearFiltersButton(clearFilterCallback),
70-
...filtersList.map((filter) =>
71-
createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)),
80+
h('.flex-row.g2.justify-center', [
81+
runModeCheckbox(filterModel, viewModel),
82+
triggerFiltersButton(onEnterCallback, filterModel),
83+
!isRunModeActivated && clearFiltersButton(clearFilterCallback),
84+
...filtersList.map((filter) =>
85+
createFilterElement(filter, filterMap, onInputCallback, onEnterCallback, onChangeCallback)),
86+
]),
87+
isRunModeActivated && runStatusPanel(
88+
runNumber,
89+
runStatus,
90+
),
7291
],
7392
);
7493
};
@@ -78,95 +97,31 @@ export function filtersPanel(filterModel, viewModel) {
7897
* @param {object} viewModel - Model that manages the state of the page
7998
* @returns {boolean} - whether runs mode is allowed
8099
*/
81-
const isRunsModeAllowed = (viewModel) => {
82-
const { model } = viewModel;
83-
84-
const allowedPages = ['objectTree', 'layoutShow', 'objectView'];
85-
if (!model || !allowedPages.includes(model.page)) {
86-
return false;
87-
}
88-
89-
// not allow runs mode if in edit mode
90-
if (model.page === 'layoutShow' && viewModel.editEnabled) {
91-
return false;
92-
}
93-
94-
return true;
95-
};
96100

97101
/**
98102
* Button which will allow the user to update filter parameters after the input
99103
* @param {Function} onClickCallback - Function to trigger the filter mechanism
100104
* @param {FilterModel} filterModel - Model that manages filter state
101-
* @param {object} viewModel - Model that manages the state of the page
102105
* @returns {vnode} - virtual node element
103106
*/
104-
const triggerFiltersButton = (onClickCallback, filterModel, viewModel) => {
105-
const runNumber = filterModel.filterMap.RunNumber;
106-
if (filterModel.isValidRunNumber(runNumber) && isRunsModeAllowed(viewModel)) {
107-
return updateDropdownButton(onClickCallback, filterModel, viewModel);
108-
}
107+
const triggerFiltersButton = (onClickCallback, filterModel) => {
108+
const isRunModeActivated = filterModel?.isRunModeActivated;
109+
const { isValid, title } = filterModel.validateRunNumber();
110+
111+
const buttonId = isRunModeActivated ? 'updateAndRunModeButton' : 'triggerFilterButton';
109112

110113
return h(
111114
'button.btn.btn-primary',
112-
{ id: 'triggerFilterButton', onclick: onClickCallback, title: 'Update filters' },
115+
{
116+
id: buttonId,
117+
onclick: isValid ? onClickCallback : null,
118+
disabled: !isValid,
119+
title,
120+
},
113121
'Update',
114122
);
115123
};
116124

117-
/**
118-
* Dropdown button for update options when run number is present
119-
* @param {Function} onClickCallback - Function to trigger the filter mechanism
120-
* @param {FilterModel} filterModel - Model that manages filter state
121-
* @param {object} viewModel - Model that manages the state of the page
122-
* @returns {vnode} - virtual node element
123-
*/
124-
const updateDropdownButton = (onClickCallback, filterModel, viewModel) => {
125-
// Use a simple property on the filterModel to track dropdown state
126-
const isDropdownOpen = filterModel.dropdownOpen || false;
127-
128-
return h('.dropdown', {
129-
class: isDropdownOpen ? 'dropdown-open' : '',
130-
}, [
131-
h('button.btn.btn-primary', {
132-
id: 'triggerFilterButton',
133-
onclick: (e) => {
134-
e.stopPropagation();
135-
filterModel.dropdownOpen = !isDropdownOpen;
136-
filterModel.notify();
137-
},
138-
title: 'Update options',
139-
}, [
140-
'Update ',
141-
isDropdownOpen ? iconChevronTop() : iconChevronBottom(),
142-
]),
143-
isDropdownOpen && h('.dropdown-menu', [
144-
h('.p2', [
145-
h('div.menu-item', {
146-
id: 'updateOnlyButton',
147-
onclick: (e) => {
148-
e.stopPropagation();
149-
filterModel.dropdownOpen = false;
150-
filterModel.notify();
151-
onClickCallback();
152-
},
153-
style: 'white-space: nowrap;',
154-
}, 'Update only'),
155-
h('div.menu-item', {
156-
id: 'updateAndRunModeButton',
157-
onclick: async (e) => {
158-
e.stopPropagation();
159-
filterModel.dropdownOpen = false;
160-
filterModel.notify();
161-
await filterModel.activateRunsMode(viewModel);
162-
},
163-
style: 'white-space: nowrap;',
164-
}, 'Update & Run Mode'),
165-
]),
166-
]),
167-
]);
168-
};
169-
170125
/**
171126
* Button which will allow the user to clear the filter element
172127
* @param {Function} clearFilterCallback - Function that clears the filter state.

QualityControl/public/common/filters/filtersConfig.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,18 @@ export const filtersConfig = ({ runTypes }) => [
4848
id: 'passNameFilter',
4949
},
5050
];
51+
52+
/**
53+
* Returns a filter configuration object used to render dynamic filter in run mode.
54+
* @returns {object} Filter configuration object
55+
*/
56+
export const runModeFilterConfig = () => [
57+
{
58+
type: FilterType.INPUT,
59+
queryLabel: 'RunNumber',
60+
placeholder: 'RunNumber (e.g. 546783)',
61+
id: 'runNumberFilter',
62+
inputType: 'number',
63+
width: 'w-10',
64+
},
65+
];

0 commit comments

Comments
 (0)