Skip to content

Commit 0c06de8

Browse files
feat: add minor multiselect improvements
1 parent 221f617 commit 0c06de8

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

projects/components/src/multi-select/multi-select.component.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
height: 34px;
3131
border-radius: 6px;
3232

33+
&.disabled {
34+
cursor: not-allowed;
35+
}
36+
3337
&.extra-small {
3438
height: 30px;
3539
}

projects/components/src/multi-select/multi-select.component.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,23 @@ import { MultiSelectJustify } from './multi-select-justify';
5353
<div
5454
class="trigger-content"
5555
[style.justify-content]="this.justify"
56-
[ngClass]="[this.triggerLabelDisplayMode, this.popoverOpen ? 'open' : '', this.size]"
56+
[ngClass]="[
57+
this.triggerLabelDisplayMode,
58+
this.popoverOpen ? 'open' : '',
59+
this.size,
60+
this.disabled ? 'disabled' : ''
61+
]"
5762
#triggerContainer
5863
>
5964
<ht-icon *ngIf="this.icon" [icon]="this.icon" [size]="this.iconSize"></ht-icon>
6065
<ng-container *ngIf="!this.isIconOnlyMode()">
6166
<div class="trigger-label-container" *ngIf="this.triggerValues$ | async as triggerValues">
6267
<ht-label class="trigger-label" [label]="triggerValues.label"></ht-label>
63-
<span *ngIf="triggerValues.selectedItemsCount > 1" class="trigger-more-items"
64-
>+{{ triggerValues.selectedItemsCount - 1 }}</span
68+
<span
69+
*ngIf="triggerValues.overflowItemsCount"
70+
class="trigger-more-items"
71+
[htTooltip]="triggerValues.overflowLabel"
72+
>+{{ triggerValues.overflowItemsCount }}</span
6573
>
6674
<ht-icon class="trigger-icon" icon="${IconType.ChevronDown}" [size]="this.iconSize"></ht-icon>
6775
</div>
@@ -262,6 +270,10 @@ export class MultiSelectComponent<V> implements ControlValueAccessor, AfterConte
262270
this.propagateControlValueChangeOnTouch = onTouch;
263271
}
264272

273+
public setDisabledState(isDisabled?: boolean): void {
274+
this.disabled = isDisabled ?? false;
275+
}
276+
265277
private setSelection(selected: V[]): void {
266278
this.selected = selected;
267279
this.setTriggerLabel();
@@ -273,7 +285,7 @@ export class MultiSelectComponent<V> implements ControlValueAccessor, AfterConte
273285
if (this.triggerLabelDisplayMode === TriggerLabelDisplayMode.Placeholder) {
274286
this.triggerValues$ = of({
275287
label: this.placeholder,
276-
selectedItemsCount: 0
288+
overflowItemsCount: 0
277289
});
278290

279291
return;
@@ -282,10 +294,17 @@ export class MultiSelectComponent<V> implements ControlValueAccessor, AfterConte
282294
this.triggerValues$ = this.allOptions$?.pipe(
283295
map(options => {
284296
const selectedItems: SelectOptionComponent<V>[] = options.filter(item => this.isSelectedItem(item));
297+
const isMultiSelection = selectedItems.length > 1;
285298

286299
return {
287300
label: this.getLabel(selectedItems),
288-
selectedItemsCount: selectedItems.length
301+
overflowItemsCount: isMultiSelection ? selectedItems.length - 1 : 0,
302+
overflowLabel: isMultiSelection
303+
? selectedItems
304+
.slice(1)
305+
.map(item => item.label)
306+
.join(', ')
307+
: undefined
289308
};
290309
})
291310
);
@@ -307,7 +326,8 @@ export class MultiSelectComponent<V> implements ControlValueAccessor, AfterConte
307326

308327
interface TriggerValues {
309328
label: string | undefined;
310-
selectedItemsCount: number;
329+
overflowItemsCount: number;
330+
overflowLabel?: string;
311331
}
312332

313333
export const enum TriggerLabelDisplayMode {

projects/components/src/multi-select/multi-select.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { LabelModule } from '../label/label.module';
88
import { LoadAsyncModule } from '../load-async/load-async.module';
99
import { PopoverModule } from '../popover/popover.module';
1010
import { TraceSearchBoxModule } from '../search-box/search-box.module';
11+
import { TooltipModule } from '../tooltip/tooltip.module';
1112
import { MultiSelectComponent } from './multi-select.component';
1213

1314
@NgModule({
@@ -20,7 +21,8 @@ import { MultiSelectComponent } from './multi-select.component';
2021
TraceSearchBoxModule,
2122
ButtonModule,
2223
LoadAsyncModule,
23-
TraceCheckboxModule
24+
TraceCheckboxModule,
25+
TooltipModule
2426
],
2527
declarations: [MultiSelectComponent],
2628
exports: [MultiSelectComponent]

0 commit comments

Comments
 (0)