Skip to content

Commit 6d4a8a4

Browse files
committed
Feat: Custom generic filter type
1 parent ec4a7f7 commit 6d4a8a4

File tree

13 files changed

+162
-10
lines changed

13 files changed

+162
-10
lines changed

packages/components/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@
239239
"./components/hds/filter-bar/date.js": "./dist/_app_/components/hds/filter-bar/date.js",
240240
"./components/hds/filter-bar/filter-group.js": "./dist/_app_/components/hds/filter-bar/filter-group.js",
241241
"./components/hds/filter-bar/filters-dropdown.js": "./dist/_app_/components/hds/filter-bar/filters-dropdown.js",
242+
"./components/hds/filter-bar/generic.js": "./dist/_app_/components/hds/filter-bar/generic.js",
242243
"./components/hds/filter-bar.js": "./dist/_app_/components/hds/filter-bar.js",
243244
"./components/hds/filter-bar/radio.js": "./dist/_app_/components/hds/filter-bar/radio.js",
244245
"./components/hds/filter-bar/range.js": "./dist/_app_/components/hds/filter-bar/range.js",

packages/components/src/components.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export { default as HdsFilterBarCheckbox } from './components/hds/filter-bar/che
136136
export { default as HdsFilterBarDate } from './components/hds/filter-bar/date.ts';
137137
export { default as HdsFilterBarFiltersDropdown } from './components/hds/filter-bar/filters-dropdown.ts';
138138
export { default as HdsFilterBarFilterGroup } from './components/hds/filter-bar/filter-group.ts';
139+
export { default as HdsFilterBarGeneric } from './components/hds/filter-bar/generic.ts';
139140
export { default as HdsFilterBarRadio } from './components/hds/filter-bar/radio.ts';
140141
export { default as HdsFilterBarRange } from './components/hds/filter-bar/range.ts';
141142
export { default as HdsFilterBarTabs } from './components/hds/filter-bar/tabs/index.ts';

packages/components/src/components/hds/filter-bar/filter-group.hbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
<Hds::FilterBar::Date @keyFilter={{this.keyFilter}} @onChange={{this.onDateChange}} @type="datetime" />
2727
{{else if (eq @type "time")}}
2828
<Hds::FilterBar::Date @keyFilter={{this.keyFilter}} @onChange={{this.onDateChange}} @type="time" />
29+
{{else if (eq @type "generic")}}
30+
{{yield
31+
(hash Generic=(component "hds/filter-bar/generic" keyFilter=this.keyFilter onChange=this.onGenericChange))
32+
}}
2933
{{else}}
3034
<div class="hds-filter-bar__filters-dropdown__filter-group__values-list">
3135
<div class="hds-filter-bar__filters-dropdown__clear">

packages/components/src/components/hds/filter-bar/filter-group.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import HdsFilterBarTabsTab from './tabs/tab.ts';
1313
import HdsFilterBarTabsPanel from './tabs/panel.ts';
1414
import type { HdsTabsPanelSignature } from '../tabs/panel.ts';
1515

16+
import HdsFilterBarGeneric from './generic.ts';
1617
import HdsFilterBarCheckbox from './checkbox.ts';
1718
import HdsFilterBarRadio from './radio.ts';
1819

@@ -21,6 +22,7 @@ import type {
2122
HdsFilterBarFilters,
2223
HdsFilterBarFilterType,
2324
HdsFilterBarData,
25+
HdsFilterBarGenericFilter,
2426
HdsFilterBarGenericFilterData,
2527
HdsFilterBarRangeFilterData,
2628
HdsFilterBarRangeFilterSelector,
@@ -44,6 +46,7 @@ export interface HdsFilterBarFilterGroupSignature {
4446
Blocks: {
4547
default: [
4648
{
49+
Generic?: WithBoundArgs<typeof HdsFilterBarGeneric, 'keyFilter'>;
4750
Checkbox?: WithBoundArgs<
4851
typeof HdsFilterBarCheckbox,
4952
'keyFilter' | 'onChange'
@@ -205,6 +208,21 @@ export default class HdsFilterBarFilterGroup extends Component<HdsFilterBarFilte
205208
}
206209
}
207210

211+
@action
212+
onGenericChange(filter?: HdsFilterBarGenericFilter): void {
213+
if (filter) {
214+
this.internalFilters = filter.data;
215+
filter.text = this.args.text;
216+
} else {
217+
this.internalFilters = undefined;
218+
}
219+
220+
const { onChange } = this.args;
221+
if (onChange && typeof onChange === 'function') {
222+
onChange(this.args.key, filter);
223+
}
224+
}
225+
208226
@action
209227
onClear(): void {
210228
this.internalFilters = undefined;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{{!
2+
Copyright (c) HashiCorp, Inc.
3+
SPDX-License-Identifier: MPL-2.0
4+
}}
5+
<div class="hds-filter-bar__filters-dropdown__filter-generic">
6+
<Hds::Layout::Flex class="hds-filter-bar__filters-dropdown__fields" @direction="column" @gap="16">
7+
{{yield (hash updateFilter=this.updateFilter)}}
8+
</Hds::Layout::Flex>
9+
<div class="hds-filter-bar__filters-dropdown__clear">
10+
<Hds::Button
11+
@text={{hds-t "hds.components.filter-bar.date.clear" default="Clear filter"}}
12+
@color="tertiary"
13+
@icon="rotate-ccw"
14+
@isInline={{true}}
15+
{{on "click" this.onClear}}
16+
/>
17+
</div>
18+
</div>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (c) HashiCorp, Inc.
3+
* SPDX-License-Identifier: MPL-2.0
4+
*/
5+
6+
import Component from '@glimmer/component';
7+
import { action } from '@ember/object';
8+
9+
import type { HdsFilterBarFilter, HdsFilterBarGenericFilter } from './types.ts';
10+
11+
export interface HdsFilterBarGenericSignature {
12+
Args: {
13+
keyFilter: HdsFilterBarFilter | undefined;
14+
onChange?: (filter?: HdsFilterBarGenericFilter) => void;
15+
};
16+
Blocks: {
17+
default: [
18+
{
19+
updateFilter: (filter: HdsFilterBarGenericFilter) => void;
20+
},
21+
];
22+
};
23+
Element: HTMLDivElement;
24+
}
25+
26+
export default class HdsFilterBarGeneric extends Component<HdsFilterBarGenericSignature> {
27+
@action
28+
updateFilter(filter: HdsFilterBarGenericFilter): void {
29+
console.log('Update filter action triggered', filter);
30+
const { onChange } = this.args;
31+
if (onChange && typeof onChange === 'function') {
32+
onChange(filter);
33+
}
34+
}
35+
36+
@action
37+
onClear(): void {
38+
console.log('Clear action triggered');
39+
const { onChange } = this.args;
40+
if (onChange && typeof onChange === 'function') {
41+
onChange();
42+
}
43+
}
44+
}

packages/components/src/components/hds/filter-bar/index.hbs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
{{#if this.hasActiveFilters}}
4646
{{#each-in @filters as |key filter|}}
4747
{{#if filter.data}}
48-
{{#if (and (eq filter.type "single-select"))}}
48+
{{#if (eq filter.type "single-select")}}
4949
<Hds::Tag
5050
@text="{{this._filterKeyText key filter}}: {{this._filterText filter}}"
5151
@onDismiss={{fn this.onFilterDismiss key}}
@@ -65,6 +65,11 @@
6565
@text="{{this._filterKeyText key filter}}: {{this._filterText filter}}"
6666
@onDismiss={{fn this.onFilterDismiss key}}
6767
/>
68+
{{else if (eq filter.type "generic")}}
69+
<Hds::Tag
70+
@text="{{this._filterKeyText key filter}} {{this._genericFilterText filter}}"
71+
@onDismiss={{fn this.onFilterDismiss key}}
72+
/>
6873
{{else if (eq filter.type "multi-select")}}
6974
{{#each (this._filterArrayData filter.data) as |item|}}
7075
<Hds::Tag

packages/components/src/components/hds/filter-bar/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,12 @@ export default class HdsFilterBar extends Component<HdsFilterBarSignature> {
276276
const newDate = new Intl.DateTimeFormat(undefined, options);
277277
return newDate.format(date);
278278
};
279+
280+
private _genericFilterText = (filter: HdsFilterBarFilter): string => {
281+
if ('dismissTagText' in filter) {
282+
return filter.dismissTagText ?? '';
283+
} else {
284+
return '';
285+
}
286+
};
279287
}

packages/components/src/components/hds/filter-bar/radio.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ export default class HdsFilterBarRadio extends Component<HdsFilterBarRadioSignat
3131

3232
get isChecked(): boolean {
3333
const { keyFilter, value } = this.args;
34-
if (keyFilter && value && 'value' in keyFilter.data) {
34+
if (
35+
keyFilter &&
36+
keyFilter.type === 'single-select' &&
37+
value &&
38+
'value' in keyFilter.data
39+
) {
3540
return keyFilter.data.value === value;
3641
}
3742
return false;

packages/components/src/components/hds/filter-bar/types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ export type HdsFilterBarData =
3636
| HdsFilterBarRangeFilterData
3737
| HdsFilterBarDateFilterData;
3838

39+
export interface HdsFilterBarGenericFilter {
40+
type: 'generic';
41+
text?: string;
42+
dismissTagText?: string;
43+
data: HdsFilterBarGenericFilterData | HdsFilterBarGenericFilterData[];
44+
}
3945
export interface HdsFilterBarSingleSelectFilter {
4046
type: 'single-select';
4147
text?: string;
@@ -71,7 +77,8 @@ export type HdsFilterBarFilter =
7177
| HdsFilterBarMultiSelectFilter
7278
| HdsFilterBarRangeFilter
7379
| HdsFilterBarDateFilter
74-
| HdsFilterBarSearchFilter;
80+
| HdsFilterBarSearchFilter
81+
| HdsFilterBarGenericFilter;
7582

7683
export interface HdsFilterBarFilters {
7784
[name: string]: HdsFilterBarFilter;

0 commit comments

Comments
 (0)