@@ -35,6 +35,7 @@ type DateComparisonOperator = {
35
35
export const DateFilter = ( {
36
36
filter,
37
37
prefix,
38
+ readonly,
38
39
openOnMount,
39
40
} : DateFilterProps ) => {
40
41
const [ open , setOpen ] = useState ( openOnMount )
@@ -118,123 +119,136 @@ export const DateFilter = ({
118
119
119
120
return (
120
121
< Popover . Root modal open = { open } onOpenChange = { handleOpenChange } >
121
- < DateDisplay label = { label } value = { displayValue } onRemove = { handleRemove } />
122
- < Popover . Portal >
123
- < Popover . Content
124
- data-name = "date_filter_content"
125
- align = "start"
126
- sideOffset = { 8 }
127
- collisionPadding = { 24 }
128
- className = { clx (
129
- "bg-ui-bg-base text-ui-fg-base shadow-elevation-flyout h-full max-h-[var(--radix-popper-available-height)] w-[300px] overflow-auto rounded-lg"
130
- ) }
131
- onInteractOutside = { ( e ) => {
132
- if ( e . target instanceof HTMLElement ) {
133
- if (
134
- e . target . attributes . getNamedItem ( "data-name" ) ?. value ===
135
- "filters_menu_content"
136
- ) {
137
- e . preventDefault ( )
122
+ < DateDisplay
123
+ label = { label }
124
+ value = { displayValue }
125
+ onRemove = { handleRemove }
126
+ readonly = { readonly }
127
+ />
128
+ { ! readonly && (
129
+ < Popover . Portal >
130
+ < Popover . Content
131
+ data-name = "date_filter_content"
132
+ align = "start"
133
+ sideOffset = { 8 }
134
+ collisionPadding = { 24 }
135
+ className = { clx (
136
+ "bg-ui-bg-base text-ui-fg-base shadow-elevation-flyout h-full max-h-[var(--radix-popper-available-height)] w-[300px] overflow-auto rounded-lg"
137
+ ) }
138
+ onInteractOutside = { ( e ) => {
139
+ if ( e . target instanceof HTMLElement ) {
140
+ if (
141
+ e . target . attributes . getNamedItem ( "data-name" ) ?. value ===
142
+ "filters_menu_content"
143
+ ) {
144
+ e . preventDefault ( )
145
+ }
138
146
}
139
- }
140
- } }
141
- >
142
- < ul className = "w-full p-1" >
143
- { presets . map ( ( preset ) => {
144
- const isSelected = selectedParams
145
- . get ( )
146
- . includes ( JSON . stringify ( preset . value ) )
147
- return (
148
- < li key = { preset . label } >
149
- < button
150
- className = "bg-ui-bg-base hover:bg-ui-bg-base-hover focus-visible:bg-ui-bg-base-pressed text-ui-fg-base data-[disabled]:text-ui-fg-disabled txt-compact-small relative flex w-full cursor-pointer select-none items-center rounded-md px-2 py-1.5 outline-none transition-colors data-[disabled]:pointer-events-none"
151
- type = "button"
152
- onClick = { ( ) => {
153
- handleSelectPreset ( preset . value )
154
- } }
155
- >
156
- < div
157
- className = { clx (
158
- "transition-fg flex h-5 w-5 items-center justify-center" ,
159
- {
160
- "[&_svg]:invisible" : ! isSelected ,
161
- }
162
- ) }
147
+ } }
148
+ >
149
+ < ul className = "w-full p-1" >
150
+ { presets . map ( ( preset ) => {
151
+ const isSelected = selectedParams
152
+ . get ( )
153
+ . includes ( JSON . stringify ( preset . value ) )
154
+ return (
155
+ < li key = { preset . label } >
156
+ < button
157
+ className = "bg-ui-bg-base hover:bg-ui-bg-base-hover focus-visible:bg-ui-bg-base-pressed text-ui-fg-base data-[disabled]:text-ui-fg-disabled txt-compact-small relative flex w-full cursor-pointer select-none items-center rounded-md px-2 py-1.5 outline-none transition-colors data-[disabled]:pointer-events-none"
158
+ type = "button"
159
+ onClick = { ( ) => {
160
+ handleSelectPreset ( preset . value )
161
+ } }
163
162
>
164
- < EllipseMiniSolid />
165
- </ div >
166
- { preset . label }
167
- </ button >
168
- </ li >
169
- )
170
- } ) }
171
- < li >
172
- < button
173
- className = "bg-ui-bg-base hover:bg-ui-bg-base-hover focus-visible:bg-ui-bg-base-pressed text-ui-fg-base data-[disabled]:text-ui-fg-disabled txt-compact-small relative flex w-full cursor-pointer select-none items-center rounded-md px-2 py-1.5 outline-none transition-colors data-[disabled]:pointer-events-none"
174
- type = "button"
175
- onClick = { handleSelectCustom }
176
- >
177
- < div
178
- className = { clx (
179
- "transition-fg flex h-5 w-5 items-center justify-center" ,
180
- {
181
- "[&_svg]:invisible" : ! showCustom ,
182
- }
183
- ) }
163
+ < div
164
+ className = { clx (
165
+ "transition-fg flex h-5 w-5 items-center justify-center" ,
166
+ {
167
+ "[&_svg]:invisible" : ! isSelected ,
168
+ }
169
+ ) }
170
+ >
171
+ < EllipseMiniSolid />
172
+ </ div >
173
+ { preset . label }
174
+ </ button >
175
+ </ li >
176
+ )
177
+ } ) }
178
+ < li >
179
+ < button
180
+ className = "bg-ui-bg-base hover:bg-ui-bg-base-hover focus-visible:bg-ui-bg-base-pressed text-ui-fg-base data-[disabled]:text-ui-fg-disabled txt-compact-small relative flex w-full cursor-pointer select-none items-center rounded-md px-2 py-1.5 outline-none transition-colors data-[disabled]:pointer-events-none"
181
+ type = "button"
182
+ onClick = { handleSelectCustom }
184
183
>
185
- < EllipseMiniSolid />
186
- </ div >
187
- { t ( "filters.date.custom" ) }
188
- </ button >
189
- </ li >
190
- </ ul >
191
- { showCustom && (
192
- < div className = "border-t px-1 pb-3 pt-1" >
193
- < div >
194
- < div className = "px-2 py-1" >
195
- < Text size = "xsmall" leading = "compact" weight = "plus" >
196
- { t ( "filters.date.from" ) }
197
- </ Text >
198
- </ div >
199
- < div className = "px-2 py-1" >
200
- < DatePicker
201
- maxValue = { customEndValue }
202
- value = { customStartValue }
203
- onChange = { ( d ) => handleCustomDateChange ( d , "start" ) }
204
- />
205
- </ div >
206
- </ div >
207
- < div >
208
- < div className = "px-2 py-1" >
209
- < Text size = "xsmall" leading = "compact" weight = "plus" >
210
- { t ( "filters.date.to" ) }
211
- </ Text >
184
+ < div
185
+ className = { clx (
186
+ "transition-fg flex h-5 w-5 items-center justify-center" ,
187
+ {
188
+ "[&_svg]:invisible" : ! showCustom ,
189
+ }
190
+ ) }
191
+ >
192
+ < EllipseMiniSolid />
193
+ </ div >
194
+ { t ( "filters.date.custom" ) }
195
+ </ button >
196
+ </ li >
197
+ </ ul >
198
+ { showCustom && (
199
+ < div className = "border-t px-1 pb-3 pt-1" >
200
+ < div >
201
+ < div className = "px-2 py-1" >
202
+ < Text size = "xsmall" leading = "compact" weight = "plus" >
203
+ { t ( "filters.date.from" ) }
204
+ </ Text >
205
+ </ div >
206
+ < div className = "px-2 py-1" >
207
+ < DatePicker
208
+ maxValue = { customEndValue }
209
+ value = { customStartValue }
210
+ onChange = { ( d ) => handleCustomDateChange ( d , "start" ) }
211
+ />
212
+ </ div >
212
213
</ div >
213
- < div className = "px-2 py-1" >
214
- < DatePicker
215
- minValue = { customStartValue }
216
- value = { customEndValue || undefined }
217
- onChange = { ( d ) => {
218
- handleCustomDateChange ( d , "end" )
219
- } }
220
- />
214
+ < div >
215
+ < div className = "px-2 py-1" >
216
+ < Text size = "xsmall" leading = "compact" weight = "plus" >
217
+ { t ( "filters.date.to" ) }
218
+ </ Text >
219
+ </ div >
220
+ < div className = "px-2 py-1" >
221
+ < DatePicker
222
+ minValue = { customStartValue }
223
+ value = { customEndValue || undefined }
224
+ onChange = { ( d ) => {
225
+ handleCustomDateChange ( d , "end" )
226
+ } }
227
+ />
228
+ </ div >
221
229
</ div >
222
230
</ div >
223
- </ div >
224
- ) }
225
- </ Popover . Content >
226
- </ Popover . Portal >
231
+ ) }
232
+ </ Popover . Content >
233
+ </ Popover . Portal >
234
+ ) }
227
235
</ Popover . Root >
228
236
)
229
237
}
230
238
231
239
type DateDisplayProps = {
232
240
label : string
233
241
value ?: string
242
+ readonly ?: boolean
234
243
onRemove : ( ) => void
235
244
}
236
245
237
- const DateDisplay = ( { label, value, onRemove } : DateDisplayProps ) => {
246
+ const DateDisplay = ( {
247
+ label,
248
+ value,
249
+ readonly,
250
+ onRemove,
251
+ } : DateDisplayProps ) => {
238
252
const handleRemove = ( e : MouseEvent < HTMLButtonElement > ) => {
239
253
e . stopPropagation ( )
240
254
onRemove ( )
@@ -245,8 +259,10 @@ const DateDisplay = ({ label, value, onRemove }: DateDisplayProps) => {
245
259
asChild
246
260
className = { clx (
247
261
"bg-ui-bg-field transition-fg shadow-borders-base text-ui-fg-subtle flex cursor-pointer select-none items-center rounded-md" ,
248
- "hover:bg-ui-bg-field-hover" ,
249
- "data-[state=open]:bg-ui-bg-field-hover"
262
+ {
263
+ "hover:bg-ui-bg-field-hover" : ! readonly ,
264
+ "data-[state=open]:bg-ui-bg-field-hover" : ! readonly ,
265
+ }
250
266
) }
251
267
>
252
268
< div >
@@ -268,7 +284,7 @@ const DateDisplay = ({ label, value, onRemove }: DateDisplayProps) => {
268
284
</ div >
269
285
</ div >
270
286
) }
271
- { value && (
287
+ { ! readonly && value && (
272
288
< div >
273
289
< button
274
290
onClick = { handleRemove }
0 commit comments