Skip to content

Commit 5f5dbb9

Browse files
committed
Feat: Range input - between selector
1 parent c49dcfa commit 5f5dbb9

File tree

11 files changed

+155
-39
lines changed

11 files changed

+155
-39
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {
2424
HdsFilterBarGenericFilterData,
2525
HdsFilterBarRangeFilterData,
2626
HdsFilterBarRangeFilterSelector,
27+
HdsFilterBarRangeFilterValue,
2728
} from './types.ts';
2829

2930
export interface HdsFilterBarFilterGroupSignature {
@@ -154,7 +155,7 @@ export default class HdsFilterBarFilterGroup extends Component<HdsFilterBarFilte
154155
@action
155156
onRangeChange(
156157
selector?: HdsFilterBarRangeFilterSelector,
157-
value?: number
158+
value?: HdsFilterBarRangeFilterValue
158159
): void {
159160
const addFilter = (): HdsFilterBarData => {
160161
const newFilter = {

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import Component from '@glimmer/component';
77
import { action } from '@ember/object';
88
import { tracked } from '@glimmer/tracking';
9+
import { service } from '@ember/service';
910

1011
import type { WithBoundArgs } from '@glint/template';
1112

13+
import type HdsIntlService from '../../../services/hds-intl';
1214
import type {
1315
HdsFilterBarFilters,
1416
HdsFilterBarFilter,
@@ -42,6 +44,8 @@ export interface HdsFilterBarSignature {
4244
}
4345

4446
export default class HdsFilterBar extends Component<HdsFilterBarSignature> {
47+
@service hdsIntl!: HdsIntlService;
48+
4549
@tracked _isExpanded: boolean = true;
4650

4751
get searchValue(): string {
@@ -169,7 +173,22 @@ export default class HdsFilterBar extends Component<HdsFilterBarSignature> {
169173

170174
private _rangeFilterText = (data: HdsFilterBarData): string => {
171175
if ('selector' in data && 'value' in data) {
172-
return `${SELECTORS_DISPLAY_SYMBOL[data.selector]} ${data.value}`;
176+
if (
177+
data.selector === 'between' &&
178+
typeof data.value === 'object' &&
179+
data.value !== null
180+
) {
181+
const separatorText = this.hdsIntl.t(
182+
'hds.components.filter-bar.filter-text.range-filter.separator',
183+
{
184+
default: 'and',
185+
}
186+
);
187+
return `${SELECTORS_DISPLAY_SYMBOL[data.selector]} ${data.value.start} ${separatorText} ${data.value.end}`;
188+
} else if (typeof data.value !== 'object') {
189+
return `${SELECTORS_DISPLAY_SYMBOL[data.selector]} ${data.value}`;
190+
}
191+
return '';
173192
} else {
174193
return '';
175194
}

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

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
SPDX-License-Identifier: MPL-2.0
44
}}
55
<div class="hds-filter-bar__filters-dropdown__filter-range">
6-
<Hds::Form::Label>
7-
{{hds-t "hds.components.filter-bar.range.label" default="Number is"}}
8-
</Hds::Form::Label>
96
<Hds::Layout::Flex @direction="column" @gap="16">
10-
<Hds::Form::Select::Base @id={{this._selectorInputId}} {{on "change" this.onSelectorChange}} as |F|>
7+
<Hds::Form::Select::Field @id={{this._selectorInputId}} {{on "change" this.onSelectorChange}} as |F|>
8+
<F.Label>
9+
{{hds-t "hds.components.filter-bar.range.label" default="Number is"}}
10+
</F.Label>
1111
<F.Options>
1212
<option value="">{{hds-t
1313
"hds.components.filter-bar.range.selector-input.default-value"
@@ -19,13 +19,32 @@
1919
}}</option>
2020
{{/each}}
2121
</F.Options>
22-
</Hds::Form::Select::Base>
23-
<Hds::Form::TextInput::Base
24-
@id={{this._valueInputId}}
25-
@type="text"
26-
@value={{this.stringValue}}
27-
placeholder={{hds-t "hds.components.filter-bar.range.value-input.placeholder" default="Enter a value"}}
28-
{{on "change" this.onValueChange}}
29-
/>
22+
</Hds::Form::Select::Field>
23+
{{#if (eq this._selector "between")}}
24+
<Hds::Layout::Flex @gap="8">
25+
<Hds::Form::TextInput::Base
26+
@id={{this._betweenValueStartInputId}}
27+
@type="text"
28+
@value={{this.stringBetweenValueStart}}
29+
placeholder={{hds-t "hds.components.filter-bar.between-value-inputs.start-placeholder" default="Start"}}
30+
{{on "change" this.onBetweenValueStartChange}}
31+
/>
32+
<Hds::Form::TextInput::Base
33+
@id={{this._betweenValueEndInputId}}
34+
@type="text"
35+
@value={{this.stringBetweenValueEnd}}
36+
placeholder={{hds-t "hds.components.filter-bar.between-value-inputs.end-placeholder" default="End"}}
37+
{{on "change" this.onBetweenValueEndChange}}
38+
/>
39+
</Hds::Layout::Flex>
40+
{{else}}
41+
<Hds::Form::TextInput::Base
42+
@id={{this._valueInputId}}
43+
@type="text"
44+
@value={{this.stringValue}}
45+
placeholder={{hds-t "hds.components.filter-bar.range.value-input.placeholder" default="Enter a value"}}
46+
{{on "change" this.onValueChange}}
47+
/>
48+
{{/if}}
3049
</Hds::Layout::Flex>
3150
</div>

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

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type HdsIntlService from '../../../services/hds-intl';
1414
import type {
1515
HdsFilterBarData,
1616
HdsFilterBarRangeFilterSelector,
17+
HdsFilterBarRangeFilterValue,
1718
} from './types.ts';
1819
import { HdsFilterBarRangeFilterSelectorValues } from './types.ts';
1920

@@ -32,6 +33,7 @@ export const SELECTORS_DISPLAY_TEXT: Record<
3233
[HdsFilterBarRangeFilterSelectorValues.greaterThanOrEqualTo]:
3334
'Greater than or equal to (≥)',
3435
[HdsFilterBarRangeFilterSelectorValues.greaterThan]: 'Greater than (>)',
36+
[HdsFilterBarRangeFilterSelectorValues.between]: 'Between',
3537
};
3638

3739
export const SELECTORS_DISPLAY_SYMBOL: Record<
@@ -43,14 +45,15 @@ export const SELECTORS_DISPLAY_SYMBOL: Record<
4345
[HdsFilterBarRangeFilterSelectorValues.equalTo]: '=',
4446
[HdsFilterBarRangeFilterSelectorValues.greaterThanOrEqualTo]: '≥',
4547
[HdsFilterBarRangeFilterSelectorValues.greaterThan]: '>',
48+
[HdsFilterBarRangeFilterSelectorValues.between]: 'between',
4649
};
4750

4851
export interface HdsFilterBarRangeSignature {
4952
Args: {
5053
keyFilter: HdsFilterBarData | undefined;
5154
onChange?: (
5255
selector?: HdsFilterBarRangeFilterSelector,
53-
value?: number
56+
value?: HdsFilterBarRangeFilterValue
5457
) => void;
5558
};
5659
Blocks: {
@@ -64,40 +67,59 @@ export default class HdsFilterBarRange extends Component<HdsFilterBarRangeSignat
6467

6568
@tracked private _selector: HdsFilterBarRangeFilterSelector | undefined;
6669
@tracked private _value: number | undefined;
70+
@tracked private _betweenValueStart: number | undefined;
71+
@tracked private _betweenValueEnd: number | undefined;
6772

6873
private _selectorValues = SELECTORS;
6974
private _selectorInputId = 'selector-input-' + guidFor(this);
7075
private _valueInputId = 'value-input-' + guidFor(this);
76+
private _betweenValueStartInputId =
77+
'between-value-start-input-' + guidFor(this);
78+
private _betweenValueEndInputId = 'between-value-end-input-' + guidFor(this);
7179

7280
constructor(owner: Owner, args: HdsFilterBarRangeSignature['Args']) {
7381
super(owner, args);
7482

7583
const { keyFilter } = this.args;
7684
if (keyFilter && 'selector' in keyFilter) {
7785
this._selector = keyFilter.selector;
78-
this._value = keyFilter.value;
86+
if (keyFilter.selector === 'between') {
87+
if (keyFilter.value && typeof keyFilter.value === 'object') {
88+
this._betweenValueStart = Number(keyFilter.value.start);
89+
this._betweenValueEnd = Number(keyFilter.value.end);
90+
}
91+
} else {
92+
this._value = Number(keyFilter.value);
93+
}
7994
}
8095
}
8196

8297
get stringValue(): string | undefined {
8398
return this._value !== undefined ? this._value.toString() : undefined;
8499
}
85100

86-
private _selectorText = (
87-
selector: HdsFilterBarRangeFilterSelector
88-
): string => {
89-
return this.hdsIntl.t(
90-
`hds.components.filter-bar.range.selector-input.${selector}`,
91-
{
92-
default: 'test',
93-
}
94-
);
95-
};
101+
get stringBetweenValueStart(): string | undefined {
102+
return this._betweenValueStart !== undefined
103+
? this._betweenValueStart.toString()
104+
: undefined;
105+
}
106+
107+
get stringBetweenValueEnd(): string | undefined {
108+
return this._betweenValueEnd !== undefined
109+
? this._betweenValueEnd.toString()
110+
: undefined;
111+
}
96112

97113
@action
98114
onSelectorChange(event: Event): void {
99115
const select = event.target as HTMLSelectElement;
100116
this._selector = select.value as HdsFilterBarRangeFilterSelector;
117+
if (this._selector === 'between') {
118+
this._value = undefined;
119+
} else {
120+
this._betweenValueStart = undefined;
121+
this._betweenValueEnd = undefined;
122+
}
101123
this._onChange();
102124
}
103125

@@ -108,10 +130,46 @@ export default class HdsFilterBarRange extends Component<HdsFilterBarRangeSignat
108130
this._onChange();
109131
}
110132

133+
@action
134+
onBetweenValueStartChange(event: Event): void {
135+
const input = event.target as HTMLInputElement;
136+
this._betweenValueStart = parseFloat(input.value);
137+
this._onChange();
138+
}
139+
140+
@action
141+
onBetweenValueEndChange(event: Event): void {
142+
const input = event.target as HTMLInputElement;
143+
this._betweenValueEnd = parseFloat(input.value);
144+
this._onChange();
145+
}
146+
111147
private _onChange(): void {
112148
const { onChange } = this.args;
113149
if (onChange && typeof onChange === 'function') {
114-
onChange(this._selector, this._value);
150+
if (
151+
this._selector === 'between' &&
152+
this._betweenValueStart !== undefined &&
153+
this._betweenValueEnd !== undefined
154+
) {
155+
onChange(this._selector, {
156+
start: this._betweenValueStart,
157+
end: this._betweenValueEnd,
158+
});
159+
} else {
160+
onChange(this._selector, this._value);
161+
}
115162
}
116163
}
164+
165+
private _selectorText = (
166+
selector: HdsFilterBarRangeFilterSelector
167+
): string => {
168+
return this.hdsIntl.t(
169+
`hds.components.filter-bar.range.selector-input.${selector}`,
170+
{
171+
default: 'test',
172+
}
173+
);
174+
};
117175
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ export default class HdsFilterBarTabs extends Component<HdsFilterBarTabsSignatur
114114

115115
@action
116116
onClick(event: MouseEvent, tabIndex: number): void {
117-
console.log('onClick event in Tabs:', event, tabIndex);
118117
this._selectedTabIndex = tabIndex;
119118

120119
// invoke the callback function if it's provided as argument

packages/components/src/components/hds/filter-bar/tabs/tab.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,6 @@ export default class HdsFilterBarTabsTab extends Component<HdsFilterBarTabsTabSi
8787
onClick(event: MouseEvent): false | undefined {
8888
const { onClick } = this.args;
8989

90-
console.log('onClick event in Tab:', event);
91-
9290
if (this.nodeIndex !== undefined && typeof onClick === 'function') {
9391
onClick(event, this.nodeIndex);
9492
} else {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export interface HdsFilterBarGenericFilterData {
1919

2020
export interface HdsFilterBarRangeFilterData {
2121
selector: HdsFilterBarRangeFilterSelector;
22-
value: number;
22+
value: HdsFilterBarRangeFilterValue;
2323
}
2424

2525
export type HdsFilterBarData =
@@ -67,7 +67,12 @@ export enum HdsFilterBarRangeFilterSelectorValues {
6767
equalTo = 'equal-to',
6868
greaterThanOrEqualTo = 'greater-than-or-equal-to',
6969
greaterThan = 'greater-than',
70+
between = 'between',
7071
}
7172

7273
export type HdsFilterBarRangeFilterSelector =
7374
`${HdsFilterBarRangeFilterSelectorValues}`;
75+
76+
export type HdsFilterBarRangeFilterValue =
77+
| number
78+
| { start?: number; end?: number };

packages/components/src/styles/components/filter-bar.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@
5959
padding: 0;
6060
}
6161

62-
.hds-filter-bar__filters-dropdown .hds-layout-flex {
62+
.hds-filter-bar__filters-dropdown .hds-dropdown__footer .hds-layout-flex {
6363
margin: 8px 0;
6464
}
6565

66-
.hds-filter-bar__filters-dropdown .hds-button-set {
66+
.hds-filter-bar__filters-dropdown .hds-dropdown__footer .hds-button-set {
6767
gap: 8px;
6868
}
6969

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
search:
22
aria-label: Search filters
33
placeholder: Search
4+
filter-text:
5+
range-filter:
6+
separator: and

packages/components/translations/hds/components/filter-bar/range/en-us.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ selector-input:
66
equal-to: Equal to (=)
77
greater-than-or-equal-to: Greater than or equal to (≥)
88
greater-than: Greater than (>)
9+
between: Between
910
value-input:
1011
placeholder: Enter a value
12+
between-value-inputs:
13+
start-placeholder: Start
14+
end-placeholder: End

0 commit comments

Comments
 (0)