@@ -47,21 +47,63 @@ export default class BrowserFilter extends React.Component {
47
47
this . wrapRef = React . createRef ( ) ;
48
48
}
49
49
50
+ getClassNameFromURL ( ) {
51
+ const pathParts = window . location . pathname . split ( '/' ) ;
52
+ const browserIndex = pathParts . indexOf ( 'browser' ) ;
53
+ return browserIndex >= 0 && pathParts [ browserIndex + 1 ]
54
+ ? pathParts [ browserIndex + 1 ]
55
+ : this . props . className ;
56
+ }
57
+
58
+ initializeEditFilterMode ( ) {
59
+ const urlParams = new URLSearchParams ( window . location . search ) ;
60
+ const isEditFilterMode = urlParams . get ( 'editFilter' ) === 'true' ;
61
+
62
+ if ( isEditFilterMode && ! this . state . open ) {
63
+ const currentFilter = this . getCurrentFilterInfo ( ) ;
64
+ let filtersToDisplay = this . props . filters ;
65
+ if ( this . props . filters . size === 0 ) {
66
+ filtersToDisplay = this . loadFiltersFromURL ( ) ;
67
+ }
68
+
69
+ const filters = this . convertDatesForDisplay ( filtersToDisplay ) ;
70
+ this . setState ( {
71
+ open : true ,
72
+ showMore : true ,
73
+ filters : filters ,
74
+ editMode : true ,
75
+ name : currentFilter . name || '' ,
76
+ originalFilterName : currentFilter . name || '' ,
77
+ relativeDates : currentFilter . hasRelativeDates || false ,
78
+ originalRelativeDates : currentFilter . hasRelativeDates || false ,
79
+ originalFilters : filtersToDisplay ,
80
+ } ) ;
81
+ }
82
+ }
83
+
50
84
componentWillReceiveProps ( props ) {
51
85
if ( props . className !== this . props . className ) {
52
86
this . setState ( { open : false } ) ;
53
87
}
88
+
89
+ this . initializeEditFilterMode ( ) ;
90
+ }
91
+
92
+ componentDidMount ( ) {
93
+ this . initializeEditFilterMode ( ) ;
54
94
}
55
95
56
96
isCurrentFilterSaved ( ) {
57
97
// First check if there's a filterId in the URL (means we're definitely viewing a saved filter)
58
98
const urlParams = new URLSearchParams ( window . location . search ) ;
59
99
const filterId = urlParams . get ( 'filterId' ) ;
60
100
101
+ const urlClassName = this . getClassNameFromURL ( ) ;
102
+
61
103
if ( filterId ) {
62
104
const preferences = ClassPreferences . getPreferences (
63
105
this . context . applicationId ,
64
- this . props . className
106
+ urlClassName
65
107
) ;
66
108
67
109
if ( preferences . filters ) {
@@ -77,36 +119,44 @@ export default class BrowserFilter extends React.Component {
77
119
78
120
// Check for legacy filters (filters parameter without filterId)
79
121
const filtersParam = urlParams . get ( 'filters' ) ;
80
- if ( filtersParam && this . props . filters . size > 0 ) {
122
+ if ( filtersParam ) {
81
123
const preferences = ClassPreferences . getPreferences (
82
124
this . context . applicationId ,
83
- this . props . className
125
+ urlClassName
84
126
) ;
85
127
86
128
if ( preferences . filters ) {
87
- // Normalize current filters for comparison (remove class property if it matches current className)
88
- const currentFilters = this . props . filters . toJS ( ) . map ( filter => {
129
+ // Parse the URL filters parameter to get the actual filter data
130
+ let urlFilters ;
131
+ try {
132
+ urlFilters = JSON . parse ( filtersParam ) ;
133
+ } catch {
134
+ return false ;
135
+ }
136
+
137
+ // Normalize URL filters for comparison (remove class property if it matches current className)
138
+ const normalizedUrlFilters = urlFilters . map ( filter => {
89
139
const normalizedFilter = { ...filter } ;
90
- if ( normalizedFilter . class === this . props . className ) {
140
+ if ( normalizedFilter . class === urlClassName ) {
91
141
delete normalizedFilter . class ;
92
142
}
93
143
return normalizedFilter ;
94
144
} ) ;
95
- const currentFiltersString = JSON . stringify ( currentFilters ) ;
145
+ const urlFiltersString = JSON . stringify ( normalizedUrlFilters ) ;
96
146
97
147
const matchingFilter = preferences . filters . find ( savedFilter => {
98
148
try {
99
149
const savedFilters = JSON . parse ( savedFilter . filter ) ;
100
150
// Normalize saved filters for comparison (remove class property if it matches current className)
101
151
const normalizedSavedFilters = savedFilters . map ( filter => {
102
152
const normalizedFilter = { ...filter } ;
103
- if ( normalizedFilter . class === this . props . className ) {
153
+ if ( normalizedFilter . class === urlClassName ) {
104
154
delete normalizedFilter . class ;
105
155
}
106
156
return normalizedFilter ;
107
157
} ) ;
108
158
const savedFiltersString = JSON . stringify ( normalizedSavedFilters ) ;
109
- return savedFiltersString === currentFiltersString ;
159
+ return savedFiltersString === urlFiltersString ;
110
160
} catch {
111
161
return false ;
112
162
}
@@ -117,16 +167,20 @@ export default class BrowserFilter extends React.Component {
117
167
}
118
168
119
169
return false ;
120
- } getCurrentFilterInfo ( ) {
170
+ }
171
+
172
+ getCurrentFilterInfo ( ) {
121
173
// Extract filterId from URL if present
122
174
const urlParams = new URLSearchParams ( window . location . search ) ;
123
175
const filterId = urlParams . get ( 'filterId' ) ;
124
176
const filtersParam = urlParams . get ( 'filters' ) ;
125
177
178
+ const urlClassName = this . getClassNameFromURL ( ) ;
179
+
126
180
if ( filterId ) {
127
181
const preferences = ClassPreferences . getPreferences (
128
182
this . context . applicationId ,
129
- this . props . className
183
+ urlClassName
130
184
) ;
131
185
132
186
if ( preferences . filters ) {
@@ -156,36 +210,51 @@ export default class BrowserFilter extends React.Component {
156
210
}
157
211
158
212
// Check for legacy filters (filters parameter without filterId)
159
- if ( filtersParam && this . props . filters . size > 0 ) {
213
+ if ( filtersParam ) {
160
214
const preferences = ClassPreferences . getPreferences (
161
215
this . context . applicationId ,
162
- this . props . className
216
+ urlClassName
163
217
) ;
164
218
165
219
if ( preferences . filters ) {
166
- // Normalize current filters for comparison (remove class property if it matches current className)
167
- const currentFilters = this . props . filters . toJS ( ) . map ( filter => {
220
+ // Parse the URL filters parameter to get the actual filter data
221
+ let urlFilters ;
222
+ try {
223
+ urlFilters = JSON . parse ( filtersParam ) ;
224
+ } catch ( error ) {
225
+ console . warn ( 'Failed to parse URL filters:' , error ) ;
226
+ return {
227
+ id : null ,
228
+ name : '' ,
229
+ isApplied : false ,
230
+ hasRelativeDates : false ,
231
+ isLegacy : false
232
+ } ;
233
+ }
234
+
235
+ // Normalize URL filters for comparison (remove class property if it matches current className)
236
+ const normalizedUrlFilters = urlFilters . map ( filter => {
168
237
const normalizedFilter = { ...filter } ;
169
- if ( normalizedFilter . class === this . props . className ) {
238
+ if ( normalizedFilter . class === urlClassName ) {
170
239
delete normalizedFilter . class ;
171
240
}
172
241
return normalizedFilter ;
173
242
} ) ;
174
- const currentFiltersString = JSON . stringify ( currentFilters ) ;
243
+ const urlFiltersString = JSON . stringify ( normalizedUrlFilters ) ;
175
244
176
245
const matchingFilter = preferences . filters . find ( savedFilter => {
177
246
try {
178
247
const savedFilters = JSON . parse ( savedFilter . filter ) ;
179
248
// Normalize saved filters for comparison (remove class property if it matches current className)
180
249
const normalizedSavedFilters = savedFilters . map ( filter => {
181
250
const normalizedFilter = { ...filter } ;
182
- if ( normalizedFilter . class === this . props . className ) {
251
+ if ( normalizedFilter . class === urlClassName ) {
183
252
delete normalizedFilter . class ;
184
253
}
185
254
return normalizedFilter ;
186
255
} ) ;
187
256
const savedFiltersString = JSON . stringify ( normalizedSavedFilters ) ;
188
- return savedFiltersString === currentFiltersString ;
257
+ return savedFiltersString === urlFiltersString ;
189
258
} catch {
190
259
return false ;
191
260
}
@@ -224,6 +293,52 @@ export default class BrowserFilter extends React.Component {
224
293
} ;
225
294
}
226
295
296
+ loadFiltersFromURL ( ) {
297
+ const urlParams = new URLSearchParams ( window . location . search ) ;
298
+ const filtersParam = urlParams . get ( 'filters' ) ;
299
+ const filterId = urlParams . get ( 'filterId' ) ;
300
+
301
+ const urlClassName = this . getClassNameFromURL ( ) ;
302
+
303
+ // If we have a filterId, load from saved filters
304
+ if ( filterId ) {
305
+ const preferences = ClassPreferences . getPreferences (
306
+ this . context . applicationId ,
307
+ urlClassName
308
+ ) ;
309
+
310
+ if ( preferences . filters ) {
311
+ const savedFilter = preferences . filters . find ( filter => filter . id === filterId ) ;
312
+ if ( savedFilter ) {
313
+ try {
314
+ const filterData = JSON . parse ( savedFilter . filter ) ;
315
+ return new List ( filterData . map ( filter => {
316
+ const processedFilter = { ...filter , class : filter . class || urlClassName } ;
317
+ return new ImmutableMap ( processedFilter ) ;
318
+ } ) ) ;
319
+ } catch ( error ) {
320
+ console . warn ( 'Failed to parse saved filter:' , error ) ;
321
+ }
322
+ }
323
+ }
324
+ }
325
+
326
+ // If we have filters in URL but no filterId, parse them directly
327
+ if ( filtersParam ) {
328
+ try {
329
+ const queryFilters = JSON . parse ( filtersParam ) ;
330
+ return new List ( queryFilters . map ( filter => {
331
+ const processedFilter = { ...filter , class : filter . class || urlClassName } ;
332
+ return new ImmutableMap ( processedFilter ) ;
333
+ } ) ) ;
334
+ } catch ( error ) {
335
+ console . warn ( 'Failed to parse URL filters:' , error ) ;
336
+ }
337
+ }
338
+
339
+ return new List ( ) ;
340
+ }
341
+
227
342
toggleMore ( ) {
228
343
const currentFilter = this . getCurrentFilterInfo ( ) ;
229
344
@@ -261,9 +376,11 @@ export default class BrowserFilter extends React.Component {
261
376
}
262
377
263
378
isFilterNameExists ( name ) {
379
+ const urlClassName = this . getClassNameFromURL ( ) ;
380
+
264
381
const preferences = ClassPreferences . getPreferences (
265
382
this . context . applicationId ,
266
- this . props . className
383
+ urlClassName
267
384
) ;
268
385
269
386
if ( preferences . filters && name ) {
@@ -496,6 +613,17 @@ export default class BrowserFilter extends React.Component {
496
613
// Convert only Parse Date objects to JavaScript Date objects, preserve RelativeDate objects
497
614
filters = this . convertDatesForDisplay ( filters ) ;
498
615
}
616
+
617
+ // If closing the dialog and we're in edit filter mode, remove the editFilter parameter
618
+ const urlParams = new URLSearchParams ( window . location . search ) ;
619
+ const isEditFilterMode = urlParams . get ( 'editFilter' ) === 'true' ;
620
+
621
+ if ( this . state . open && isEditFilterMode ) {
622
+ urlParams . delete ( 'editFilter' ) ;
623
+ const newUrl = `${ window . location . pathname } ${ urlParams . toString ( ) ? '?' + urlParams . toString ( ) : '' } ` ;
624
+ window . history . replaceState ( { } , '' , newUrl ) ;
625
+ }
626
+
499
627
this . setState ( prevState => ( {
500
628
open : ! prevState . open ,
501
629
filters : filters ,
0 commit comments