14
14
15
15
import { filterInput , dynamicSelector } from './filter.js' ;
16
16
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' ;
18
20
import { h , iconChevronBottom , iconChevronTop } from '/js/src/index.js' ;
19
21
20
22
/**
@@ -27,16 +29,16 @@ import { h, iconChevronBottom, iconChevronTop } from '/js/src/index.js';
27
29
* @returns {undefined }
28
30
*/
29
31
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 ;
31
33
const commonConfig = {
32
34
queryLabel,
33
35
placeholder,
34
36
id,
35
37
filterMap,
36
38
onInputCallback,
37
39
onEnterCallback,
40
+ width,
38
41
} ;
39
-
40
42
switch ( type ) {
41
43
case FilterType . INPUT : return filterInput ( { ...commonConfig , type : inputType } ) ;
42
44
case FilterType . DROPDOWN : return dynamicSelector ( { ...commonConfig , options, onChangeCallback } ) ;
@@ -51,24 +53,41 @@ const createFilterElement = (config, filterMap, onInputCallback, onEnterCallback
51
53
* @returns {vnode } - virtual node element
52
54
*/
53
55
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 ;
55
66
const onInputCallback = setFilterValue . bind ( filterModel ) ;
56
67
const onChangeCallback = setFilterValue . bind ( filterModel ) ;
57
68
const onEnterCallback = ( ) => filterModel . triggerFilter ( viewModel ) ;
58
69
const clearFilterCallback = clearFilter . bind ( filterModel , viewModel ) ;
59
- const filtersList = filtersConfig ( filterService ) ;
60
-
61
- if ( ! isVisible || filterModel . inRunMode ) {
70
+ if ( ! isVisible ) {
62
71
return null ;
63
72
}
73
+ const filtersList = isRunModeActivated
74
+ ? runModeFilterConfig ( )
75
+ : filtersConfig ( filterService ) ;
64
76
65
77
return h (
66
- '.w-100.flex-row .p2.g2.justify-center#filterElement' ,
78
+ '.w-100.flex-column .p2.g2.justify-center#filterElement' ,
67
79
[
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
+ ) ,
72
91
] ,
73
92
) ;
74
93
} ;
@@ -78,95 +97,31 @@ export function filtersPanel(filterModel, viewModel) {
78
97
* @param {object } viewModel - Model that manages the state of the page
79
98
* @returns {boolean } - whether runs mode is allowed
80
99
*/
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
- } ;
96
100
97
101
/**
98
102
* Button which will allow the user to update filter parameters after the input
99
103
* @param {Function } onClickCallback - Function to trigger the filter mechanism
100
104
* @param {FilterModel } filterModel - Model that manages filter state
101
- * @param {object } viewModel - Model that manages the state of the page
102
105
* @returns {vnode } - virtual node element
103
106
*/
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' ;
109
112
110
113
return h (
111
114
'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
+ } ,
113
121
'Update' ,
114
122
) ;
115
123
} ;
116
124
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
-
170
125
/**
171
126
* Button which will allow the user to clear the filter element
172
127
* @param {Function } clearFilterCallback - Function that clears the filter state.
0 commit comments