1
+ import { isArray } from 'lodash-es' ;
1
2
import isEqual from 'lodash-es/isEqual' ;
2
3
import {
3
4
BehaviorSubject ,
@@ -12,7 +13,9 @@ import { ISuggestValue } from '@uipath/angular/components/ui-suggest';
12
13
13
14
import { UiGridColumnDirective } from '../body/ui-grid-column.directive' ;
14
15
import {
16
+ FilterMultiValue ,
15
17
IDropdownOption ,
18
+ ISuggestDropdownValueData ,
16
19
UiGridDropdownFilterDirective ,
17
20
} from '../filters/ui-grid-dropdown-filter.directive' ;
18
21
import { UiGridSearchFilterDirective } from '../filters/ui-grid-search-filter.directive' ;
@@ -61,6 +64,19 @@ export class FilterManager<T> {
61
64
distinctUntilChanged ( ) ,
62
65
) ;
63
66
67
+ activeFilterValueCount$ = combineLatest ( [
68
+ this . activeCount$ ,
69
+ this . filter$ ,
70
+ ] ) . pipe (
71
+ map ( ( [ activeCount , filters ] ) => {
72
+ const activeFilterValueCount = activeCount + filters . filter ( f => isArray ( f ?. value ) )
73
+ . map ( f => ( f . value as FilterMultiValue ) . length - 1 )
74
+ . reduce ( ( acc , cur ) => acc + cur , 0 ) ;
75
+
76
+ return Math . max ( 0 , activeFilterValueCount ) ;
77
+ } ) ,
78
+ ) ;
79
+
64
80
private _initialFilters : IFilterModel < T > [ ] | null = null ;
65
81
66
82
constructor (
@@ -80,11 +96,49 @@ export class FilterManager<T> {
80
96
this . filter$ . complete ( ) ;
81
97
}
82
98
83
- searchableDropdownUpdate = ( column ?: UiGridColumnDirective < T > , value ?: ISuggestValue , selected ?: boolean ) =>
99
+ selectFilters ( column : UiGridColumnDirective < T > , selection ?: ISuggestDropdownValueData ) {
100
+ if ( selection ?. data === undefined ) { return this . dropdownUpdate ( column , undefined ) ; }
101
+
102
+ let value = selection . data ;
103
+ const currentValue = column . dropdown ?. selectedFilters$ . value ;
104
+
105
+ if ( column . dropdown ?. multi && isArray ( currentValue ) ) {
106
+ const valueAlreadySelected = currentValue . some ( v => v === value ) ;
107
+ value = ( valueAlreadySelected
108
+ ? ( currentValue as [ ] ) . filter ( v => v !== value )
109
+ : [ ...currentValue , value ] ) as FilterMultiValue ;
110
+ }
111
+
112
+ this . dropdownUpdate ( column , { value } as IDropdownOption ) ;
113
+ }
114
+
115
+ searchableDropdownUpdate = ( column ?: UiGridColumnDirective < T > , value ?: ISuggestValue | ISuggestValue [ ] , selected ?: boolean ) => {
116
+ if ( isArray ( value ) ) {
117
+ if ( column ?. searchableDropdown ) {
118
+ value . forEach ( filterValue => {
119
+ column ! . searchableDropdown ! . updateValue ( filterValue , true ) ;
120
+ } ) ;
121
+ this . _emitFilterOptions ( ) ;
122
+ }
123
+ return ;
124
+ }
125
+
84
126
this . _updateFilterValue ( column , value , selected , this . _mapSearchableDropdownItem ) ;
127
+ } ;
85
128
86
- dropdownUpdate = ( column ?: UiGridColumnDirective < T > , value ?: IDropdownOption ) =>
87
- this . _updateFilterValue ( column , value , false , this . _mapDropdownItem ) ;
129
+ dropdownUpdate = ( column ?: UiGridColumnDirective < T > , dropdownOption ?: IDropdownOption ) => {
130
+ if ( column ?. dropdown ) {
131
+ const selectedFilterValue = ( ( dropdownOption == null || isArray ( dropdownOption . value ) )
132
+ ? dropdownOption ?. value
133
+ : [ dropdownOption . value ] ) as IDropdownOption [ 'value' ] | undefined ;
134
+ column . dropdown . selectedFilters$ . next ( selectedFilterValue ) ;
135
+ }
136
+
137
+ const updateValue = ( dropdownOption == null )
138
+ ? undefined
139
+ : dropdownOption ;
140
+ return this . _updateFilterValue ( column , updateValue , false , this . _mapDropdownItem ) ;
141
+ } ;
88
142
89
143
searchChange ( term : string | undefined , header : UiGridHeaderDirective < T > , footer ?: UiGridFooterDirective ) {
90
144
if ( term === header . searchValue ) { return ; }
@@ -152,7 +206,7 @@ export class FilterManager<T> {
152
206
153
207
private _emitFilterOptions = ( ) => {
154
208
this . defaultValueDropdownFilters = this . _columns
155
- . filter ( ( { dropdown } ) => this . _hasFilterValue ( dropdown ) )
209
+ . filter ( ( { dropdown } ) => this . _hasFilterValue ( dropdown ) && this . _dropdownFilterDirectiveHasValue ( dropdown ! ) )
156
210
. map ( this . _mapDropdownItem ) ;
157
211
158
212
const emptyStateDropdownFilters = this . _columns
@@ -175,6 +229,10 @@ export class FilterManager<T> {
175
229
) ;
176
230
} ;
177
231
232
+ private _dropdownFilterDirectiveHasValue = ( dropdown : UiGridDropdownFilterDirective < T > ) =>
233
+ dropdown . value ?. value !== undefined &&
234
+ ( ! isArray ( dropdown . value . value ) || dropdown . value . value . length ) ;
235
+
178
236
private _hasFilterValue = ( dropdown ?: UiGridSearchFilterDirective < T > | UiGridDropdownFilterDirective < T > ) =>
179
237
! ! dropdown &&
180
238
dropdown . value ;
0 commit comments