Skip to content

Commit a179d5a

Browse files
committed
fix(ibm-dropdown-list): ensure ListItem.disabled is treated as a boolean by styling logic
The disabled styling was treating ListItem.disabled input as a disabled attribute (i.e. present or not) even though the doc for ListItem says that it is a boolean. Now, we treat ListItem.disabled input as a boolean. Add tests for disabling a list-item Add disabled item examples to dropdown and combobox storybooks Fix linting error in grid Signed-off-by: anemonetea <[email protected]>
1 parent e2b39cd commit a179d5a

File tree

5 files changed

+61
-38
lines changed

5 files changed

+61
-38
lines changed

src/combobox/combobox.stories.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { storiesOf, moduleMetadata } from "@storybook/angular";
22
import { action } from "@storybook/addon-actions";
3-
import { withKnobs, text, boolean, number, select } from "@storybook/addon-knobs/angular";
3+
import { withKnobs, text, boolean, object, number, select } from "@storybook/addon-knobs/angular";
44

55
import { ComboBoxModule } from "./combobox.module";
66
import { ButtonModule } from "../button/button.module";
@@ -30,20 +30,12 @@ const getOptions = (override = {}) => {
3030
warnText: text("Text for the warning", "This is a warning"),
3131
label: text("Label", "ComboBox label"),
3232
helperText: text("Helper text", "Optional helper text."),
33-
items: [
34-
{
35-
content: "one"
36-
},
37-
{
38-
content: "two"
39-
},
40-
{
41-
content: "three"
42-
},
43-
{
44-
content: "four"
45-
}
46-
],
33+
items: object("items", [
34+
{ content: "one" },
35+
{ content: "two", selected: true },
36+
{ content: "three", disabled: true },
37+
{ content: "four", disabled: false }
38+
]),
4739
selected: action("selection changed"),
4840
submit: action("submit"),
4941
size: select("size", ["sm", "md", "xl"], "md"),
@@ -170,7 +162,7 @@ class ReactiveFormsCombobox implements OnInit {
170162
@Input() helperText = "";
171163
@Input() size = "md";
172164
@Input() theme = "dark";
173-
@Input() set items(newItems = []) {
165+
@Input() set items(newItems) {
174166
if (!isEqual(this._items, newItems)) {
175167
this._items = newItems;
176168
}

src/dropdown/dropdown.stories.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ const getProps = (overrides = {}) => Object.assign({}, {
6262
items: object("items", [
6363
{ content: "one" },
6464
{ content: "two", selected: true },
65-
{ content: "three" },
66-
{ content: "four" }
65+
{ content: "three", disabled: true },
66+
{ content: "four", disabled: false }
6767
]),
6868
selected: action("Selected fired for dropdown"),
6969
onClose: action("Dropdown closed"),
@@ -307,7 +307,7 @@ storiesOf("Components|Dropdown", module)
307307
</app-reactive-forms>
308308
`,
309309
props: getProps({
310-
items: [
310+
items: object("items", [
311311
{
312312
content: "numerical value item 1",
313313
oid: 1,
@@ -318,7 +318,7 @@ storiesOf("Components|Dropdown", module)
318318
oid: 2,
319319
selected: false
320320
}
321-
],
321+
]),
322322
selectionFeedback: select("Selection feedback", ["top", "fixed", "top-after-reopen"], "top-after-reopen"),
323323
selected: action("Selected fired for multi-select dropdown"),
324324
onClose: action("Multi-select dropdown closed")
@@ -343,12 +343,7 @@ storiesOf("Components|Dropdown", module)
343343
</div>
344344
`,
345345
props: getProps({
346-
items: of([
347-
{ content: "one" },
348-
{ content: "two", selected: true },
349-
{ content: "three" },
350-
{ content: "four" }
351-
])
346+
items: of({...getProps()}.items)
352347
})
353348
}))
354349
.add("With Template", () => ({

src/dropdown/list/dropdown-list.component.spec.ts

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component } from "@angular/core";
2-
import { TestBed } from "@angular/core/testing";
2+
import { ComponentFixture, TestBed } from "@angular/core/testing";
33
import { By } from "@angular/platform-browser";
44

55
import { DropdownList } from "./dropdown-list.component";
@@ -11,7 +11,10 @@ import { I18nModule } from "../../i18n/index";
1111
template: `<ibm-dropdown-list [items]="items" (select)="onSelect($event)"></ibm-dropdown-list>`
1212
})
1313
class DropdownListTest {
14-
items = [{content: "one", selected: false}, {content: "two", selected: false}];
14+
items = [
15+
<ListItem>{content: "one", selected: false},
16+
<ListItem>{content: "two", selected: false}
17+
];
1518
selected: ListItem;
1619
onSelect(ev) {
1720
this.selected = ev.item;
@@ -22,15 +25,18 @@ class DropdownListTest {
2225
template: `<ibm-dropdown-list [items]="items" (select)="onSelect($event)" type="multi"></ibm-dropdown-list>`
2326
})
2427
class MultiTest {
25-
items = [{content: "one", selected: false}, {content: "two", selected: false}];
28+
items = [
29+
<ListItem>{content: "one", selected: false},
30+
<ListItem>{content: "two", selected: false}
31+
];
2632
selected: ListItem[];
2733
onSelect(ev) {
2834
this.selected = ev;
2935
}
3036
}
3137

3238
describe("Dropdown list", () => {
33-
let fixture, wrapper;
39+
let fixture: ComponentFixture<DropdownListTest>, wrapper: DropdownListTest;
3440
beforeEach(() => {
3541
TestBed.configureTestingModule({
3642
declarations: [
@@ -51,8 +57,8 @@ describe("Dropdown list", () => {
5157
});
5258

5359
it("should work", () => {
54-
fixture = TestBed.createComponent(DropdownList);
55-
expect(fixture.componentInstance instanceof DropdownList).toBe(true);
60+
let fixture2 = TestBed.createComponent(DropdownList);
61+
expect(fixture2.componentInstance instanceof DropdownList).toBe(true);
5662
});
5763

5864
it("should select an item", () => {
@@ -62,10 +68,23 @@ describe("Dropdown list", () => {
6268
});
6369
expect(wrapper.selected.content).toBe("one");
6470
});
71+
72+
it("should disable a list-item", () => {
73+
wrapper.items = [
74+
<ListItem>{content: "one", selected: false},
75+
<ListItem>{content: "two", selected: false, disabled: false},
76+
<ListItem>{content: "three", selected: false, disabled: true}
77+
];
78+
fixture.detectChanges();
79+
const disabledEls = fixture.debugElement.queryAll(By.css(".bx--list-box__menu-item[disabled]"));
80+
expect(disabledEls.length).toEqual(1);
81+
const enabledEls = fixture.debugElement.queryAll(By.css(".bx--list-box__menu-item:not([disabled])"));
82+
expect(enabledEls.length).toEqual(2);
83+
});
6584
});
6685

6786
describe("Dropdown multi list", () => {
68-
let fixture, wrapper;
87+
let fixture: ComponentFixture<MultiTest>, wrapper: MultiTest;
6988
beforeEach(() => {
7089
TestBed.configureTestingModule({
7190
declarations: [
@@ -86,9 +105,9 @@ describe("Dropdown multi list", () => {
86105
});
87106

88107
it("should work", () => {
89-
fixture = TestBed.createComponent(DropdownList);
90-
fixture.type = "multi";
91-
expect(fixture.componentInstance instanceof DropdownList).toBe(true);
108+
let fixture2 = TestBed.createComponent(DropdownList);
109+
fixture2.componentInstance.type = "multi";
110+
expect(fixture2.componentInstance instanceof DropdownList).toBe(true);
92111
});
93112

94113
it("should multi select", () => {
@@ -104,4 +123,21 @@ describe("Dropdown multi list", () => {
104123
expect(wrapper.selected[0].content).toBe("one");
105124
expect(wrapper.selected[1].content).toBe("two");
106125
});
126+
127+
it("should disable a list-item and its checkbox", () => {
128+
wrapper.items = [
129+
<ListItem>{content: "one", selected: false},
130+
<ListItem>{content: "two", selected: false, disabled: false},
131+
<ListItem>{content: "three", selected: false, disabled: true}
132+
];
133+
fixture.detectChanges();
134+
const disabledEls = fixture.debugElement.queryAll(By.css(".bx--list-box__menu-item[disabled]"));
135+
const disabledInputEls = fixture.debugElement.queryAll(By.css(".bx--checkbox[disabled]"));
136+
expect(disabledEls.length).toEqual(1);
137+
expect(disabledInputEls.length).toEqual(1);
138+
const enabledEls = fixture.debugElement.queryAll(By.css(".bx--list-box__menu-item:not([disabled])"));
139+
const enabledInputEls = fixture.debugElement.queryAll(By.css(".bx--checkbox:not([disabled])"));
140+
expect(enabledEls.length).toEqual(2);
141+
expect(enabledInputEls.length).toEqual(2);
142+
});
107143
});

src/dropdown/list/dropdown-list.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import { ScrollCustomEvent } from "./scroll-custom-event.interface";
6767
[attr.aria-selected]="item.selected"
6868
[id]="getItemId(i)"
6969
[attr.title]=" showTitles ? item.content : null"
70-
[attr.disabled]="item.disabled"
70+
[attr.disabled]="item.disabled ? true : null"
7171
[ngClass]="{
7272
'bx--list-box__menu-item--active': item.selected,
7373
'bx--list-box__menu-item--highlighted': highlightedItem === getItemId(i)

src/grid/grid.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {
1+
import {
22
Directive,
33
HostBinding,
44
Input,

0 commit comments

Comments
 (0)