@@ -22,13 +22,17 @@ import { isFocusable } from "tabbable";
22
22
import { BtrixElement } from "@/classes/BtrixElement" ;
23
23
import type { BtrixChangeEvent } from "@/events/btrix-change" ;
24
24
import { type WorkflowTag , type WorkflowTags } from "@/types/workflow" ;
25
+ import { stopProp } from "@/utils/events" ;
25
26
import { tw } from "@/utils/tailwind" ;
26
27
27
28
const MAX_TAGS_IN_LABEL = 5 ;
28
29
29
- export type BtrixChangeWorkflowTagFilterEvent = BtrixChangeEvent <
30
- string [ ] | undefined
31
- > ;
30
+ type ChangeWorkflowTagEventDetails =
31
+ | { tags : string [ ] ; type : "and" | "or" }
32
+ | undefined ;
33
+
34
+ export type BtrixChangeWorkflowTagFilterEvent =
35
+ BtrixChangeEvent < ChangeWorkflowTagEventDetails > ;
32
36
33
37
/**
34
38
* @fires btrix-change
@@ -52,8 +56,18 @@ export class WorkflowTagFilter extends BtrixElement {
52
56
keys : [ "tag" ] ,
53
57
} ) ;
54
58
59
+ @state ( )
60
+ private get selectedTags ( ) {
61
+ return Array . from ( this . selected . entries ( ) )
62
+ . filter ( ( [ _tag , selected ] ) => selected )
63
+ . map ( ( [ tag ] ) => tag ) ;
64
+ }
65
+
55
66
private selected = new Map < string , boolean > ( ) ;
56
67
68
+ @state ( )
69
+ private type : "and" | "or" = "or" ;
70
+
57
71
protected willUpdate ( changedProperties : PropertyValues < this> ) : void {
58
72
if ( changedProperties . has ( "tags" ) ) {
59
73
if ( this . tags ) {
@@ -92,17 +106,17 @@ export class WorkflowTagFilter extends BtrixElement {
92
106
@sl-after-hide =${ ( ) => {
93
107
this . searchString = "" ;
94
108
95
- const selectedTags = [ ] ;
96
-
97
- for ( const [ tag , value ] of this . selected ) {
98
- if ( value ) {
99
- selectedTags . push ( tag ) ;
100
- }
101
- }
109
+ console . log ( "after hide" ) ;
102
110
103
111
this . dispatchEvent (
104
- new CustomEvent < BtrixChangeEvent [ "detail" ] > ( "btrix-change" , {
105
- detail : { value : selectedTags . length ? selectedTags : undefined } ,
112
+ new CustomEvent <
113
+ BtrixChangeEvent < ChangeWorkflowTagEventDetails > [ "detail" ]
114
+ > ( "btrix-change" , {
115
+ detail : {
116
+ value : this . selectedTags . length
117
+ ? { tags : this . selectedTags , type : this . type }
118
+ : undefined ,
119
+ } ,
106
120
} ) ,
107
121
) ;
108
122
} }
@@ -141,23 +155,49 @@ export class WorkflowTagFilter extends BtrixElement {
141
155
checkbox . checked = false ;
142
156
} ) ;
143
157
158
+ this . type = "or" ;
159
+
144
160
this . dispatchEvent (
145
- new CustomEvent < BtrixChangeEvent [ "detail" ] > (
146
- "btrix-change" ,
147
- {
148
- detail : {
149
- value : undefined ,
150
- } ,
161
+ new CustomEvent <
162
+ BtrixChangeEvent < ChangeWorkflowTagEventDetails > [ "detail" ]
163
+ > ( "btrix-change" , {
164
+ detail : {
165
+ value : undefined ,
151
166
} ,
152
- ) ,
167
+ } ) ,
153
168
) ;
154
169
} }
155
170
> ${ msg ( "Clear" ) } </ sl-button
156
171
> `
157
172
: nothing }
158
173
</ sl-menu-label >
159
174
160
- < div class ="px-3 "> ${ this . renderSearch ( ) } </ div >
175
+ < div class ="flex gap-2 px-3 ">
176
+ ${ this . renderSearch ( ) }
177
+ < sl-radio-group
178
+ size ="small "
179
+ value =${ this . type }
180
+ @sl-change =${ ( event : SlChangeEvent ) => {
181
+ this . type = ( event . target as HTMLInputElement ) . value as
182
+ | "or"
183
+ | "and" ;
184
+ } }
185
+ @sl-after-hide=${ stopProp }
186
+ >
187
+ < sl-tooltip hoist content =${ msg ( "Any of the selected tags" ) } >
188
+ < sl-radio-button value ="or " checked >
189
+ < sl-icon name ="union " slot ="prefix "> </ sl-icon >
190
+ ${ msg ( "Any" ) }
191
+ </ sl-radio-button >
192
+ </ sl-tooltip >
193
+ < sl-tooltip hoist content =${ msg ( "All of the selected tags" ) } >
194
+ < sl-radio-button value ="and ">
195
+ < sl-icon name ="intersect " slot ="prefix "> </ sl-icon >
196
+ ${ msg ( "All" ) }
197
+ </ sl-radio-button >
198
+ </ sl-tooltip >
199
+ </ sl-radio-group >
200
+ </ div >
161
201
</ header >
162
202
163
203
${ this . orgTagsTask . render ( {
@@ -194,6 +234,7 @@ export class WorkflowTagFilter extends BtrixElement {
194
234
) ,
195
235
]
196
236
: tags ,
237
+ { type : this . type === "and" ? "conjunction" : "disjunction" } ,
197
238
) ;
198
239
199
240
return formatter2 . map ( ( part , index , array ) =>
@@ -266,6 +307,7 @@ export class WorkflowTagFilter extends BtrixElement {
266
307
const { checked, value } = e . target as SlCheckbox ;
267
308
268
309
this . selected . set ( value , checked ) ;
310
+ this . requestUpdate ( "selectedTags" ) ;
269
311
} }
270
312
>
271
313
${ repeat (
0 commit comments